2222import static org .androidannotations .rclass .ProjectRClassFinder .RESOURCE_PACKAGE_NAME_OPTION ;
2323
2424import java .io .IOException ;
25- import java .io .PrintWriter ;
26- import java .io .StringWriter ;
25+ import java .net .URL ;
2726import java .util .Collections ;
2827import java .util .HashSet ;
2928import java .util .Map ;
29+ import java .util .Properties ;
3030import java .util .Set ;
3131
3232import javax .annotation .processing .AbstractProcessor ;
121121import org .androidannotations .annotations .rest .RestService ;
122122import org .androidannotations .annotations .sharedpreferences .Pref ;
123123import org .androidannotations .annotations .sharedpreferences .SharedPref ;
124+ import org .androidannotations .exception .ProcessingException ;
124125import org .androidannotations .generation .CodeModelGenerator ;
125126import org .androidannotations .helper .AndroidManifest ;
126127import org .androidannotations .helper .AndroidManifestFinder ;
128+ import org .androidannotations .helper .ErrorHelper ;
127129import org .androidannotations .helper .Option ;
128130import org .androidannotations .helper .TimeStats ;
129131import org .androidannotations .model .AndroidRes ;
276278@ SupportedOptions ({ TRACE_OPTION , ANDROID_MANIFEST_FILE_OPTION , RESOURCE_PACKAGE_NAME_OPTION })
277279public class AndroidAnnotationProcessor extends AbstractProcessor {
278280
281+ private final Properties properties = new Properties ();
279282 private final TimeStats timeStats = new TimeStats ();
283+ private final ErrorHelper errorHelper = new ErrorHelper ();
284+
280285 private Set <String > supportedAnnotationNames ;
281286
282287 @ Override
@@ -285,6 +290,8 @@ public synchronized void init(ProcessingEnvironment processingEnv) {
285290
286291 Messager messager = processingEnv .getMessager ();
287292
293+ loadPropertyFile ();
294+
288295 timeStats .setMessager (messager );
289296
290297 messager .printMessage (Diagnostic .Kind .NOTE , "Starting AndroidAnnotations annotation processing" );
@@ -296,16 +303,34 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
296303 timeStats .start ("Whole Processing" );
297304 try {
298305 processThrowing (annotations , roundEnv );
299- } catch (Exception e ) {
306+ } catch (ProcessingException e ) {
300307 handleException (annotations , roundEnv , e );
308+ } catch (Exception e ) {
309+ handleException (annotations , roundEnv , new ProcessingException (e , null ));
301310 }
302311 timeStats .stop ("Whole Processing" );
303312 timeStats .logStats ();
304313 return true ;
305314 }
306315
307- private void processThrowing (Set <? extends TypeElement > annotations , RoundEnvironment roundEnv ) throws Exception {
316+ private void loadPropertyFile () {
317+ String filename = "androidannotations-version.properties" ;
318+ try {
319+ URL url = getClass ().getClassLoader ().getResource (filename );
320+ properties .load (url .openStream ());
321+ } catch (Exception e ) {
322+ e .printStackTrace ();
308323
324+ Messager messager = processingEnv .getMessager ();
325+ messager .printMessage (Diagnostic .Kind .NOTE , "AndroidAnnotations processing failed because " + filename + " couldn't be parsed : " + e .getLocalizedMessage ());
326+ }
327+ }
328+
329+ private String getAAProcessorVersion () {
330+ return properties .getProperty ("version" , "3.0+" );
331+ }
332+
333+ private void processThrowing (Set <? extends TypeElement > annotations , RoundEnvironment roundEnv ) throws ProcessingException , Exception {
309334 if (nothingToDo (annotations , roundEnv )) {
310335 return ;
311336 }
@@ -378,7 +403,7 @@ private Option<IRClass> findRClasses(AndroidManifest androidManifest) throws IOE
378403 return Option .of (coumpoundRClass );
379404 }
380405
381- private AnnotationElements validateAnnotations (AnnotationElementsHolder extractedModel , IRClass rClass , AndroidSystemServices androidSystemServices , AndroidManifest androidManifest ) {
406+ private AnnotationElements validateAnnotations (AnnotationElementsHolder extractedModel , IRClass rClass , AndroidSystemServices androidSystemServices , AndroidManifest androidManifest ) throws ProcessingException , Exception {
382407 timeStats .start ("Validate Annotations" );
383408 ModelValidator modelValidator = buildModelValidator (rClass , androidSystemServices , androidManifest );
384409 AnnotationElements validatedAnnotations = modelValidator .validate (extractedModel );
@@ -475,7 +500,7 @@ private boolean traceActivated() {
475500 }
476501 }
477502
478- private ProcessResult processAnnotations (AnnotationElements validatedModel , IRClass rClass , AndroidSystemServices androidSystemServices , AndroidManifest androidManifest ) throws Exception {
503+ private ProcessResult processAnnotations (AnnotationElements validatedModel , IRClass rClass , AndroidSystemServices androidSystemServices , AndroidManifest androidManifest ) throws ProcessingException , Exception {
479504 timeStats .start ("Process Annotations" );
480505 ModelProcessor modelProcessor = buildModelProcessor (rClass , androidSystemServices , androidManifest , validatedModel );
481506 ProcessResult processResult = modelProcessor .process (validatedModel );
@@ -567,13 +592,13 @@ private void generateSources(ProcessResult processResult) throws IOException {
567592 timeStats .start ("Generate Sources" );
568593 Messager messager = processingEnv .getMessager ();
569594 messager .printMessage (Diagnostic .Kind .NOTE , "Number of files generated by AndroidAnnotations: " + processResult .codeModel .countArtifacts ());
570- CodeModelGenerator modelGenerator = new CodeModelGenerator (processingEnv .getFiler (), messager );
595+ CodeModelGenerator modelGenerator = new CodeModelGenerator (processingEnv .getFiler (), messager , getAAProcessorVersion () );
571596 modelGenerator .generate (processResult );
572597 timeStats .stop ("Generate Sources" );
573598 }
574599
575- private void handleException (Set <? extends TypeElement > annotations , RoundEnvironment roundEnv , Exception e ) {
576- String errorMessage = "Unexpected error. Please report an issue on AndroidAnnotations, with the following content: " + stackTraceToString ( e );
600+ private void handleException (Set <? extends TypeElement > annotations , RoundEnvironment roundEnv , ProcessingException e ) {
601+ String errorMessage = errorHelper . getErrorMessage ( processingEnv , e , getAAProcessorVersion () );
577602
578603 Messager messager = processingEnv .getMessager ();
579604 messager .printMessage (Diagnostic .Kind .ERROR , errorMessage );
@@ -588,13 +613,6 @@ private void handleException(Set<? extends TypeElement> annotations, RoundEnviro
588613 messager .printMessage (Diagnostic .Kind .ERROR , errorMessage , element );
589614 }
590615
591- private String stackTraceToString (Throwable e ) {
592- StringWriter writer = new StringWriter ();
593- PrintWriter pw = new PrintWriter (writer );
594- e .printStackTrace (pw );
595- return writer .toString ();
596- }
597-
598616 @ Override
599617 public Set <String > getSupportedAnnotationTypes () {
600618 if (supportedAnnotationNames == null ) {
0 commit comments