1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package Torello.JavaDoc.Annotations;

import Torello.JDUInternal.Miscellaneous.Where.JDUAnnotations;

import Torello.JavaDoc.Messager.Messager;
import Torello.JavaDoc.Messager.MsgPrintTools;

import static Torello.Java.C.RESET;
import static Torello.Java.C.BCYAN;
import static Torello.Java.C.BGREEN;

import Torello.Java.StrCmpr;

import com.sun.source.tree.ClassTree;
import com.sun.source.tree.AnnotationTree;

/**
 * This class is intended to contain / hold a single mirror instance for each 
 * <B STYLE='color:red;'>Type-Level Annotation</B> that has been placed on a single class,
 * interface or annotation ({@link Torello.JavaDoc.CIET CIET}).  
 * 
 * <BR /><BR />This class is constructed, once, for each Java {@code '.class'} file within a 
 * user specified project.  This class uses the reflection made available by the package
 * {@code com.sun.source.tree.*}, and the relevent sub-packages.  This class begins with an
 * instance of {@code com.sun.source.tree.ClassTree}, and iterates the annotations which were
 * placed by the user on his class definition.
 * 
 * @see Torello.JavaDoc.Annotations.StaticFunctional
 * @see Torello.JavaDoc.Annotations.JDHeaderBackgroundImg
 * @see Torello.JavaDoc.Annotations.CSSLinks
 * @see Torello.JavaDoc.Annotations.JavaScriptImport
 */
public class TypeAnnotationMirrors
{
    /**
     * {@code 'StaticFunctional'} Data
     * @see Torello.JavaDoc.Annotations.StaticFunctional
     */
    public final SFMirror sfMirror;

    /**
     * {@code 'JDHeaderBackgroundImg'} Data
     * @see Torello.JavaDoc.Annotations.JDHeaderBackgroundImg
     */
    public final JDHBIMirror jdhbiMirror;

    /**
     * {@code 'CSSLinks'} Data
     * @see Torello.JavaDoc.Annotations.CSSLinks
     */
    public final CSSLMirror csslMirror;

    /**
     * {@code 'JavaScriptImport'} Data
     * @see Torello.JavaDoc.Annotations.JavaScriptImport
     */
    public final JSIMirror jsiMirror;

    /**
     * Iterates the Class-Level / Type-Level Annotations for a single class, and produces one
     * mirror instance for each JDU annotation placed on a single class, interface or annotation
     * ({@link Torello.JavaDoc.CIET CIET})
     */
    public TypeAnnotationMirrors(
            final ClassTree ct,
            final String    fileName,
            final String    fullNameNoGenerics
        )
    {
        SFMirror    sfMirror    = null;
        JDHBIMirror jdhbiMirror = null;
        CSSLMirror  csslMirror  = null;
        JSIMirror   jsiMirror   = null;


        for (final AnnotationTree at : ct.getModifiers().getAnnotations())
        {
            final String annotationName     = at.getAnnotationType().toString();
            final String annotationAsStr    = at.toString();

            if (StrCmpr.equalsXOR(
                    annotationName,
                    "StaticFunctional",
                    "Torello.JavaDoc.Annotations.StaticFunctional"
                ))
            {
                if (sfMirror != null)
                    dupError(annotationAsStr, sfMirror, fileName, fullNameNoGenerics);

                sfMirror = new SFMirror(at.getArguments(), annotationAsStr);
            }

            else if (StrCmpr.equalsXOR(
                    annotationName,
                    "JDHeaderBackgroundImg",
                    "Torello.JavaDoc.Annotations.JDHeaderBackgroundImg"
                ))
            {
                if (jdhbiMirror != null)
                    dupError(annotationAsStr, jdhbiMirror, fileName, fullNameNoGenerics);

                jdhbiMirror = new JDHBIMirror(at.getArguments(), annotationAsStr);
            }

            else if (StrCmpr.equalsXOR(
                    annotationName,
                    "CSSLinks",
                    "Torello.JavaDoc.Annotations.CSSLinks"
                ))
            {
                if (csslMirror != null)
                    dupError(annotationAsStr, csslMirror, fileName, fullNameNoGenerics);

                csslMirror = new CSSLMirror(at.getArguments(), annotationAsStr);
            }

            else if (StrCmpr.equalsXOR(
                    annotationName,
                    "JavaScriptImport",
                    "Torello.JavaDoc.Annotations.JavaScriptImport"
                ))
            {
                if (jsiMirror != null)
                    dupError(annotationAsStr, jsiMirror, fileName, fullNameNoGenerics);

                jsiMirror = new JSIMirror(at.getArguments(), annotationAsStr);
            }
        }

        this.sfMirror       = sfMirror;
        this.jdhbiMirror    = jdhbiMirror;
        this.csslMirror     = csslMirror;
        this.jsiMirror      = jsiMirror;
    }


    // This error only occurs if more than one of these annotations is found / identified on a 
    // single CIET.

    private static void dupError(
            final String            annotationAsStr,
            final AnnotationMirror  mirror,
            final String            fileName,
            final String            fullNameNoGenerics
        )
    {
        Messager.assertFail(
            "There have been multiple placements of Type-Annotation " +
            '[' + BCYAN + '@' + mirror.getAnnotationName() + RESET + "] which have been placed " +
            "on type [" + BGREEN + fullNameNoGenerics + RESET + "]:\n" +
            MsgPrintTools.annotationAsStr(annotationAsStr) +
            "and:\n" +
            MsgPrintTools.annotationAsStr(mirror.getAnnotationAsString()) +
            "Found in File:\n" +
            MsgPrintTools.fileName(fileName) + '\n' +
            MsgPrintTools.annotationProcessingError(),
            JDUAnnotations.TypeAnnotationMirrors
        );
    }
}