001package Torello.JavaDoc.Annotations;
002
003import Torello.JDUInternal.Miscellaneous.Where.JDUAnnotations;
004
005import Torello.JavaDoc.Messager.Messager;
006import Torello.JavaDoc.Messager.MsgPrintTools;
007
008import static Torello.Java.C.RESET;
009import static Torello.Java.C.BCYAN;
010import static Torello.Java.C.BGREEN;
011
012import Torello.Java.StrCmpr;
013
014import com.sun.source.tree.ClassTree;
015import com.sun.source.tree.AnnotationTree;
016
017/**
018 * This class is intended to contain / hold a single mirror instance for each 
019 * <B STYLE='color:red;'>Type-Level Annotation</B> that has been placed on a single class,
020 * interface or annotation ({@link Torello.JavaDoc.CIET CIET}).  
021 * 
022 * <BR /><BR />This class is constructed, once, for each Java {@code '.class'} file within a 
023 * user specified project.  This class uses the reflection made available by the package
024 * {@code com.sun.source.tree.*}, and the relevent sub-packages.  This class begins with an
025 * instance of {@code com.sun.source.tree.ClassTree}, and iterates the annotations which were
026 * placed by the user on his class definition.
027 * 
028 * @see Torello.JavaDoc.Annotations.StaticFunctional
029 * @see Torello.JavaDoc.Annotations.JDHeaderBackgroundImg
030 * @see Torello.JavaDoc.Annotations.CSSLinks
031 * @see Torello.JavaDoc.Annotations.JavaScriptImport
032 */
033public class TypeAnnotationMirrors
034{
035    /**
036     * {@code 'StaticFunctional'} Data
037     * @see Torello.JavaDoc.Annotations.StaticFunctional
038     */
039    public final SFMirror sfMirror;
040
041    /**
042     * {@code 'JDHeaderBackgroundImg'} Data
043     * @see Torello.JavaDoc.Annotations.JDHeaderBackgroundImg
044     */
045    public final JDHBIMirror jdhbiMirror;
046
047    /**
048     * {@code 'CSSLinks'} Data
049     * @see Torello.JavaDoc.Annotations.CSSLinks
050     */
051    public final CSSLMirror csslMirror;
052
053    /**
054     * {@code 'JavaScriptImport'} Data
055     * @see Torello.JavaDoc.Annotations.JavaScriptImport
056     */
057    public final JSIMirror jsiMirror;
058
059    /**
060     * Iterates the Class-Level / Type-Level Annotations for a single class, and produces one
061     * mirror instance for each JDU annotation placed on a single class, interface or annotation
062     * ({@link Torello.JavaDoc.CIET CIET})
063     */
064    public TypeAnnotationMirrors(
065            final ClassTree ct,
066            final String    fileName,
067            final String    fullNameNoGenerics
068        )
069    {
070        SFMirror    sfMirror    = null;
071        JDHBIMirror jdhbiMirror = null;
072        CSSLMirror  csslMirror  = null;
073        JSIMirror   jsiMirror   = null;
074
075
076        for (final AnnotationTree at : ct.getModifiers().getAnnotations())
077        {
078            final String annotationName     = at.getAnnotationType().toString();
079            final String annotationAsStr    = at.toString();
080
081            if (StrCmpr.equalsXOR(
082                    annotationName,
083                    "StaticFunctional",
084                    "Torello.JavaDoc.Annotations.StaticFunctional"
085                ))
086            {
087                if (sfMirror != null)
088                    dupError(annotationAsStr, sfMirror, fileName, fullNameNoGenerics);
089
090                sfMirror = new SFMirror(at.getArguments(), annotationAsStr);
091            }
092
093            else if (StrCmpr.equalsXOR(
094                    annotationName,
095                    "JDHeaderBackgroundImg",
096                    "Torello.JavaDoc.Annotations.JDHeaderBackgroundImg"
097                ))
098            {
099                if (jdhbiMirror != null)
100                    dupError(annotationAsStr, jdhbiMirror, fileName, fullNameNoGenerics);
101
102                jdhbiMirror = new JDHBIMirror(at.getArguments(), annotationAsStr);
103            }
104
105            else if (StrCmpr.equalsXOR(
106                    annotationName,
107                    "CSSLinks",
108                    "Torello.JavaDoc.Annotations.CSSLinks"
109                ))
110            {
111                if (csslMirror != null)
112                    dupError(annotationAsStr, csslMirror, fileName, fullNameNoGenerics);
113
114                csslMirror = new CSSLMirror(at.getArguments(), annotationAsStr);
115            }
116
117            else if (StrCmpr.equalsXOR(
118                    annotationName,
119                    "JavaScriptImport",
120                    "Torello.JavaDoc.Annotations.JavaScriptImport"
121                ))
122            {
123                if (jsiMirror != null)
124                    dupError(annotationAsStr, jsiMirror, fileName, fullNameNoGenerics);
125
126                jsiMirror = new JSIMirror(at.getArguments(), annotationAsStr);
127            }
128        }
129
130        this.sfMirror       = sfMirror;
131        this.jdhbiMirror    = jdhbiMirror;
132        this.csslMirror     = csslMirror;
133        this.jsiMirror      = jsiMirror;
134    }
135
136
137    // This error only occurs if more than one of these annotations is found / identified on a 
138    // single CIET.
139
140    private static void dupError(
141            final String            annotationAsStr,
142            final AnnotationMirror  mirror,
143            final String            fileName,
144            final String            fullNameNoGenerics
145        )
146    {
147        Messager.assertFail(
148            "There have been multiple placements of Type-Annotation " +
149            '[' + BCYAN + '@' + mirror.getAnnotationName() + RESET + "] which have been placed " +
150            "on type [" + BGREEN + fullNameNoGenerics + RESET + "]:\n" +
151            MsgPrintTools.annotationAsStr(annotationAsStr) +
152            "and:\n" +
153            MsgPrintTools.annotationAsStr(mirror.getAnnotationAsString()) +
154            "Found in File:\n" +
155            MsgPrintTools.fileName(fileName) + '\n' +
156            MsgPrintTools.annotationProcessingError(),
157            JDUAnnotations.TypeAnnotationMirrors
158        );
159    }
160}