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}