1818import java .io .FileNotFoundException ;
1919import java .io .IOException ;
2020import java .net .URL ;
21+ import java .util .ArrayList ;
2122import java .util .Arrays ;
2223import java .util .Iterator ;
2324import java .util .List ;
2425import java .util .Properties ;
26+ import java .util .ServiceLoader ;
2527import java .util .Set ;
2628
2729import javax .annotation .processing .AbstractProcessor ;
3638import org .androidannotations .exception .ValidationException ;
3739import org .androidannotations .exception .VersionMismatchException ;
3840import org .androidannotations .generation .CodeModelGenerator ;
39- import org .androidannotations .handler .AnnotationHandlers ;
4041import org .androidannotations .helper .AndroidManifest ;
4142import org .androidannotations .helper .AndroidManifestFinder ;
4243import org .androidannotations .helper .ErrorHelper ;
@@ -68,11 +69,12 @@ public class AndroidAnnotationProcessor extends AbstractProcessor {
6869 private final Properties propertiesApi = new Properties ();
6970 private final TimeStats timeStats = new TimeStats ();
7071 private final ErrorHelper errorHelper = new ErrorHelper ();
71- private AnnotationHandlers annotationHandlers ;
72+ private AndroidAnnotationsEnvironment androidAnnotationsEnv ;
7273
7374 @ Override
7475 public synchronized void init (ProcessingEnvironment processingEnv ) {
7576 super .init (processingEnv );
77+ androidAnnotationsEnv = new AndroidAnnotationsEnvironment (processingEnv );
7678
7779 ModelConstants .init (processingEnv );
7880
@@ -89,25 +91,40 @@ public synchronized void init(ProcessingEnvironment processingEnv) {
8991
9092 LOGGER .info ("Initialize AndroidAnnotations {} with options {}" , getAAProcessorVersion (), processingEnv .getOptions ());
9193
92- annotationHandlers = new AnnotationHandlers (processingEnv );
93- loadPlugins (processingEnv );
94+ List <AndroidAnnotationsPlugin > plugins = loadPlugins ();
95+ LOGGER .info ("Plugins loaded: {}" , Arrays .toString (plugins .toArray ()));
96+ androidAnnotationsEnv .setPlugins (plugins );
9497 }
9598
96- private void loadPlugins (ProcessingEnvironment processingEnv ) {
97- List <AndroidAnnotationsPlugin > plugins = AndroidAnnotationsPlugin .load ();
98- LOGGER .info ("Plugins loaded: {}" , Arrays .toString (plugins .toArray ()));
99- for (AndroidAnnotationsPlugin plugin : plugins ) {
100- plugin .addHandlers (annotationHandlers , processingEnv );
99+ private List <AndroidAnnotationsPlugin > loadPlugins () {
100+ ServiceLoader <AndroidAnnotationsPlugin > serviceLoader = ServiceLoader .load (AndroidAnnotationsPlugin .class , AndroidAnnotationsPlugin .class .getClassLoader ());
101+ List <AndroidAnnotationsPlugin > plugins = new ArrayList <>();
102+ plugins .add (new CorePlugin ());
103+ for (AndroidAnnotationsPlugin plugin : serviceLoader ) {
104+ plugins .add (plugin );
101105 }
106+ return plugins ;
102107 }
103108
104- private void checkApiAndCoreVersions () throws VersionMismatchException {
105- String apiVersion = getAAApiVersion ();
106- String coreVersion = getAAProcessorVersion ();
109+ private void loadPropertyFile () throws FileNotFoundException {
110+ String filename = "androidannotations.properties" ;
111+ try {
112+ URL url = getClass ().getClassLoader ().getResource (filename );
113+ properties .load (url .openStream ());
114+ } catch (Exception e ) {
115+ LOGGER .error ("Core property file {} couldn't be parsed" );
116+ throw new FileNotFoundException ("Core property file " + filename + " couldn't be parsed." );
117+ }
118+ }
107119
108- if (!apiVersion .equals (coreVersion )) {
109- LOGGER .error ("AndroidAnnotations version for API ({}) and core ({}) doesn't match. Please check your classpath" , apiVersion , coreVersion );
110- throw new VersionMismatchException ("AndroidAnnotations version for API (" + apiVersion + ") and core (" + coreVersion + ") doesn't match. Please check your classpath" );
120+ private void loadApiPropertyFile () throws FileNotFoundException {
121+ String filename = "androidannotations-api.properties" ;
122+ try {
123+ URL url = EActivity .class .getClassLoader ().getResource (filename );
124+ propertiesApi .load (url .openStream ());
125+ } catch (Exception e ) {
126+ LOGGER .error ("API property file {} couldn't be parsed" );
127+ throw new FileNotFoundException ("API property file " + filename + " couldn't be parsed. Please check your classpath and verify that AA-API's version is at least 3.0" );
111128 }
112129 }
113130
@@ -142,25 +159,13 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
142159 return true ;
143160 }
144161
145- private void loadPropertyFile () throws FileNotFoundException {
146- String filename = "androidannotations.properties" ;
147- try {
148- URL url = getClass ().getClassLoader ().getResource (filename );
149- properties .load (url .openStream ());
150- } catch (Exception e ) {
151- LOGGER .error ("Core property file {} couldn't be parsed" );
152- throw new FileNotFoundException ("Core property file " + filename + " couldn't be parsed." );
153- }
154- }
162+ private void checkApiAndCoreVersions () throws VersionMismatchException {
163+ String apiVersion = getAAApiVersion ();
164+ String coreVersion = getAAProcessorVersion ();
155165
156- private void loadApiPropertyFile () throws FileNotFoundException {
157- String filename = "androidannotations-api.properties" ;
158- try {
159- URL url = EActivity .class .getClassLoader ().getResource (filename );
160- propertiesApi .load (url .openStream ());
161- } catch (Exception e ) {
162- LOGGER .error ("API property file {} couldn't be parsed" );
163- throw new FileNotFoundException ("API property file " + filename + " couldn't be parsed. Please check your classpath and verify that AA-API's version is at least 3.0" );
166+ if (!apiVersion .equals (coreVersion )) {
167+ LOGGER .error ("AndroidAnnotations version for API ({}) and core ({}) doesn't match. Please check your classpath" , apiVersion , coreVersion );
168+ throw new VersionMismatchException ("AndroidAnnotations version for API (" + apiVersion + ") and core (" + coreVersion + ") doesn't match. Please check your classpath" );
164169 }
165170 }
166171
@@ -195,9 +200,10 @@ private void processThrowing(Set<? extends TypeElement> annotations, RoundEnviro
195200
196201 AndroidSystemServices androidSystemServices = new AndroidSystemServices ();
197202
198- annotationHandlers .setAndroidEnvironment (rClass , androidSystemServices , androidManifest );
203+ androidAnnotationsEnv .setAndroidEnvironment (rClass , androidSystemServices , androidManifest );
199204
200205 AnnotationElements validatedModel = validateAnnotations (extractedModel );
206+ androidAnnotationsEnv .setValidatedModel (validatedModel );
201207
202208 ModelProcessor .ProcessResult processResult = processAnnotations (validatedModel );
203209
@@ -247,16 +253,15 @@ private Option<IRClass> findRClasses(AndroidManifest androidManifest) throws IOE
247253
248254 private AnnotationElements validateAnnotations (AnnotationElementsHolder extractedModel ) throws ValidationException {
249255 timeStats .start ("Validate Annotations" );
250- ModelValidator modelValidator = new ModelValidator (annotationHandlers );
256+ ModelValidator modelValidator = new ModelValidator (androidAnnotationsEnv );
251257 AnnotationElements validatedAnnotations = modelValidator .validate (extractedModel );
252258 timeStats .stop ("Validate Annotations" );
253259 return validatedAnnotations ;
254260 }
255261
256262 private ModelProcessor .ProcessResult processAnnotations (AnnotationElements validatedModel ) throws Exception {
257263 timeStats .start ("Process Annotations" );
258- annotationHandlers .setValidatedModel (validatedModel );
259- ModelProcessor modelProcessor = new ModelProcessor (processingEnv , annotationHandlers );
264+ ModelProcessor modelProcessor = new ModelProcessor (androidAnnotationsEnv );
260265 ModelProcessor .ProcessResult processResult = modelProcessor .process (validatedModel );
261266 timeStats .stop ("Process Annotations" );
262267 return processResult ;
@@ -290,7 +295,7 @@ private void handleException(Set<? extends TypeElement> annotations, RoundEnviro
290295
291296 @ Override
292297 public Set <String > getSupportedAnnotationTypes () {
293- return annotationHandlers .getSupportedAnnotationTypes ();
298+ return androidAnnotationsEnv .getSupportedAnnotationTypes ();
294299 }
295300
296301 @ Override
0 commit comments