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
package Torello.JDUInternal.Annotations.TypeAnnotations.Mirror;

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;

// A Java Annotation-Mirror used as a 'data-class' to hold the actual values (during upgrade
// processing) that the user has actually assigned to an Annotation inside his or her 
// '.java' source-files.

public class TypeAnnotationMirrors
{
    // @StaticFunctional
    public final SFMirror sfMirror;

    // @JDHeaderBackgroundImg Data
    public final JDHBIMirror jdhbiMirror;

    // @CSSStyleSheets Data
    public final CSSLMirror csslMirror;

    // @JavaScriptImport 
    public final JSIMirror jsiMirror;


    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.StaticFunctional"))
            {
                if (sfMirror != null)
                    dupError(annotationAsStr, sfMirror, fileName, fullNameNoGenerics);

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

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

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

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

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

            else if (StrCmpr.equalsXOR
                (annotationName, "JavaScriptImport", "Torello.JavaDoc.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;
    }

    private static void dupError(
            final String                annotationAsStr,
            final TypeAnnotationMirror  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
        );
    }
}