From 9007253d1e3475a86f2ed043c1703c1afe4c1b43 Mon Sep 17 00:00:00 2001 From: Damien Date: Tue, 4 Jun 2013 23:07:00 +0200 Subject: [PATCH 1/8] Add some information about the context of the crash --- .../AndroidAnnotationProcessor.java | 28 ++++----- .../exception/ProcessingException.java | 25 ++++++++ .../helper/ErrorHelper.java | 62 +++++++++++++++++++ .../processing/ModelProcessor.java | 25 ++++++-- .../validation/ModelValidator.java | 13 +++- 5 files changed, 131 insertions(+), 22 deletions(-) create mode 100644 AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/exception/ProcessingException.java create mode 100644 AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java index 4f7de7646c..e84ec88686 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java @@ -21,8 +21,6 @@ import static org.androidannotations.helper.ModelConstants.TRACE_OPTION; import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.Collections; import java.util.HashSet; import java.util.Map; @@ -117,9 +115,11 @@ import org.androidannotations.annotations.rest.RestService; import org.androidannotations.annotations.sharedpreferences.Pref; import org.androidannotations.annotations.sharedpreferences.SharedPref; +import org.androidannotations.exception.ProcessingException; import org.androidannotations.generation.CodeModelGenerator; import org.androidannotations.helper.AndroidManifest; import org.androidannotations.helper.AndroidManifestFinder; +import org.androidannotations.helper.ErrorHelper; import org.androidannotations.helper.Option; import org.androidannotations.helper.TimeStats; import org.androidannotations.model.AndroidRes; @@ -271,6 +271,8 @@ public class AndroidAnnotationProcessor extends AbstractProcessor { private final TimeStats timeStats = new TimeStats(); + private final ErrorHelper errorHelper = new ErrorHelper(); + private Set supportedAnnotationNames; @Override @@ -290,16 +292,17 @@ public boolean process(Set annotations, RoundEnvironment timeStats.start("Whole Processing"); try { processThrowing(annotations, roundEnv); - } catch (Exception e) { + } catch (ProcessingException e) { handleException(annotations, roundEnv, e); + } catch (Exception e) { + handleException(annotations, roundEnv, new ProcessingException(e, null)); } timeStats.stop("Whole Processing"); timeStats.logStats(); return true; } - private void processThrowing(Set annotations, RoundEnvironment roundEnv) throws Exception { - + private void processThrowing(Set annotations, RoundEnvironment roundEnv) throws ProcessingException, Exception { if (nothingToDo(annotations, roundEnv)) { return; } @@ -372,7 +375,7 @@ private Option findRClasses(AndroidManifest androidManifest) throws IOE return Option.of(coumpoundRClass); } - private AnnotationElements validateAnnotations(AnnotationElementsHolder extractedModel, IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + private AnnotationElements validateAnnotations(AnnotationElementsHolder extractedModel, IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) throws ProcessingException, Exception { timeStats.start("Validate Annotations"); ModelValidator modelValidator = buildModelValidator(rClass, androidSystemServices, androidManifest); AnnotationElements validatedAnnotations = modelValidator.validate(extractedModel); @@ -468,7 +471,7 @@ private boolean traceActivated() { } } - private ProcessResult processAnnotations(AnnotationElements validatedModel, IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) throws Exception { + private ProcessResult processAnnotations(AnnotationElements validatedModel, IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) throws ProcessingException, Exception { timeStats.start("Process Annotations"); ModelProcessor modelProcessor = buildModelProcessor(rClass, androidSystemServices, androidManifest, validatedModel); ProcessResult processResult = modelProcessor.process(validatedModel); @@ -564,8 +567,8 @@ private void generateSources(ProcessResult processResult) throws IOException { timeStats.stop("Generate Sources"); } - private void handleException(Set annotations, RoundEnvironment roundEnv, Exception e) { - String errorMessage = "Unexpected error. Please report an issue on AndroidAnnotations, with the following content: " + stackTraceToString(e); + private void handleException(Set annotations, RoundEnvironment roundEnv, ProcessingException e) { + String errorMessage = errorHelper.getErrorMessage(e); Messager messager = processingEnv.getMessager(); messager.printMessage(Diagnostic.Kind.ERROR, errorMessage); @@ -580,13 +583,6 @@ private void handleException(Set annotations, RoundEnviro messager.printMessage(Diagnostic.Kind.ERROR, errorMessage, element); } - private String stackTraceToString(Throwable e) { - StringWriter writer = new StringWriter(); - PrintWriter pw = new PrintWriter(writer); - e.printStackTrace(pw); - return writer.toString(); - } - @Override public Set getSupportedAnnotationTypes() { if (supportedAnnotationNames == null) { diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/exception/ProcessingException.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/exception/ProcessingException.java new file mode 100644 index 0000000000..fde33fd53a --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/exception/ProcessingException.java @@ -0,0 +1,25 @@ +package org.androidannotations.exception; + +import javax.lang.model.element.Element; + +public class ProcessingException extends Exception { + + private static final long serialVersionUID = -1282996599471872615L; + + private Element element; + + public ProcessingException(Throwable cause, Element element) { + super(cause); + this.element = element; + } + + public ProcessingException(String message, Throwable cause, Element element) { + super(message, cause); + this.element = element; + } + + public Element getElement() { + return element; + } + +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java new file mode 100644 index 0000000000..69dbce68fb --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java @@ -0,0 +1,62 @@ +package org.androidannotations.helper; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; + +import org.androidannotations.exception.ProcessingException; + +public class ErrorHelper { + + public String getErrorMessage(ProcessingException e) { + String errorMessage = "Unexpected error. Please report an issue on AndroidAnnotations, with the following content and tell us if you can reproduce it or not. The error was thrown on:\n"; + if (e.getElement() != null) { + errorMessage += elementFullString(e.getElement()) + "\n"; + } + errorMessage += "with stacktrace: " + stackTraceToString(e.getCause()); + return errorMessage; + } + + private String elementFullString(Element element) { + String result = ""; + List annotations = element.getAnnotationMirrors(); + for (AnnotationMirror annotation : annotations) { + result += annotationFullString(annotation) + "\n"; + } + return result + element.toString(); + } + + private String annotationFullString(AnnotationMirror annotation) { + String result = annotation.toString(); + + Map fields = annotation.getElementValues(); + if (fields != null) { + result += "("; + Set fieldKeys = fields.keySet(); + int i = 0; + for (ExecutableElement fieldKey : fieldKeys) { + result += fieldKey.getSimpleName().toString() + "=" + fields.get(fieldKey).getValue().toString(); + if (++i < fieldKeys.size()) { + result += ", "; + } + } + result += ")"; + } + return result; + } + + private String stackTraceToString(Throwable e) { + StringWriter writer = new StringWriter(); + PrintWriter pw = new PrintWriter(writer); + e.printStackTrace(pw); + return writer.toString(); + } + +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java index 7e70c22d0f..9aad843c6a 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java @@ -24,6 +24,7 @@ import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; +import org.androidannotations.exception.ProcessingException; import org.androidannotations.model.AnnotationElements; import org.androidannotations.model.AnnotationElements.AnnotatedAndRootElements; @@ -59,7 +60,7 @@ public void register(GeneratingElementProcessor processor) { typeProcessors.add(processor); } - public ProcessResult process(AnnotationElements validatedModel) throws Exception { + public ProcessResult process(AnnotationElements validatedModel) throws ProcessingException, Exception { JCodeModel codeModel = new JCodeModel(); @@ -75,7 +76,7 @@ public ProcessResult process(AnnotationElements validatedModel) throws Exception * extend them). */ if (!isAbstractClass(annotatedElement)) { - processor.process(annotatedElement, codeModel, eBeansHolder); + processThrowing(processor, annotatedElement, codeModel, eBeansHolder); } } /* @@ -99,7 +100,7 @@ public ProcessResult process(AnnotationElements validatedModel) throws Exception * elements that are not validated, and therefore not available. */ if (holder != null) { - processor.process(elements.annotatedElement, codeModel, holder); + processThrowing(processor, elements.annotatedElement, codeModel, holder); } } @@ -120,7 +121,7 @@ public ProcessResult process(AnnotationElements validatedModel) throws Exception */ if (!isAbstractClass(enclosingElement)) { EBeanHolder holder = eBeansHolder.getEBeanHolder(enclosingElement); - processor.process(annotatedElement, codeModel, holder); + processThrowing(processor, annotatedElement, codeModel, holder); } } @@ -132,6 +133,22 @@ public ProcessResult process(AnnotationElements validatedModel) throws Exception eBeansHolder.getApiClassesToGenerate()); } + private void processThrowing(GeneratingElementProcessor processor, Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception, ProcessingException { + try { + processor.process(element, codeModel, eBeansHolder); + } catch (Exception e) { + throw new ProcessingException(e, element); + } + } + + private void processThrowing(DecoratingElementProcessor processor, Element element, JCodeModel codeModel, EBeanHolder eBeanHolder) throws Exception, ProcessingException { + try { + processor.process(element, codeModel, eBeanHolder); + } catch (Exception e) { + throw new ProcessingException(e, element); + } + } + private boolean isAbstractClass(Element annotatedElement) { if (annotatedElement instanceof TypeElement) { TypeElement typeElement = (TypeElement) annotatedElement; diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ModelValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ModelValidator.java index a414b7d5cd..295aa08c82 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ModelValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ModelValidator.java @@ -22,6 +22,7 @@ import javax.lang.model.element.Element; +import org.androidannotations.exception.ProcessingException; import org.androidannotations.model.AnnotationElements; import org.androidannotations.model.AnnotationElementsHolder; @@ -33,7 +34,7 @@ public void register(ElementValidator validator) { validators.add(validator); } - public AnnotationElements validate(AnnotationElementsHolder extractedModel) { + public AnnotationElements validate(AnnotationElementsHolder extractedModel) throws ProcessingException, Exception { /* * We currently do not validate the elements on the ancestors, assuming @@ -52,7 +53,7 @@ public AnnotationElements validate(AnnotationElementsHolder extractedModel) { validatedElements.putRootAnnotatedElements(annotationName, validatedAnnotatedElements); for (Element annotatedElement : annotatedElements) { - if (validator.validate(annotatedElement, validatedElements)) { + if (validateThrowing(validator, annotatedElement, validatedElements)) { validatedAnnotatedElements.add(annotatedElement); } } @@ -60,4 +61,12 @@ public AnnotationElements validate(AnnotationElementsHolder extractedModel) { return validatedElements; } + private boolean validateThrowing(ElementValidator validator, Element element, AnnotationElements validatedElements) throws Exception, ProcessingException { + try { + return validator.validate(element, validatedElements); + } catch (Exception e) { + throw new ProcessingException(e, element); + } + } + } From 9174d75ab9f7868f2b1300af13865321fd9eb3f8 Mon Sep 17 00:00:00 2001 From: Damien Date: Wed, 5 Jun 2013 01:27:28 +0200 Subject: [PATCH 2/8] Add java compiler version in crash report --- .../helper/ErrorHelper.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java index 69dbce68fb..755fd32fbf 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java @@ -1,5 +1,8 @@ package org.androidannotations.helper; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import java.util.List; @@ -20,6 +23,7 @@ public String getErrorMessage(ProcessingException e) { if (e.getElement() != null) { errorMessage += elementFullString(e.getElement()) + "\n"; } + errorMessage += "compiled with " + getJavaCompilerVersion() + "\n"; errorMessage += "with stacktrace: " + stackTraceToString(e.getCause()); return errorMessage; } @@ -52,6 +56,29 @@ private String annotationFullString(AnnotationMirror annotation) { return result; } + private String getJavaCompilerVersion() { + ProcessBuilder pb = new ProcessBuilder("javac", "-version"); + pb.redirectErrorStream(true); + + BufferedReader in = null; + try { + Process process = pb.start(); + in = new BufferedReader(new InputStreamReader(process.getInputStream())); + String buffer = in.readLine(); + process.waitFor(); + return buffer; + } catch (Exception e) { + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + } + } + } + return "unknown"; + } + private String stackTraceToString(Throwable e) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); From 0afbc427cfeaa67f9386eb3989174af574e51b37 Mon Sep 17 00:00:00 2001 From: Damien Date: Wed, 5 Jun 2013 01:31:38 +0200 Subject: [PATCH 3/8] Add AA version --- .../org/androidannotations/AndroidAnnotationProcessor.java | 3 +++ .../main/java/org/androidannotations/helper/ErrorHelper.java | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java index e84ec88686..a264955957 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java @@ -270,6 +270,9 @@ @SupportedOptions({ TRACE_OPTION, ANDROID_MANIFEST_FILE_OPTION }) public class AndroidAnnotationProcessor extends AbstractProcessor { + // TODO: We whould find a better way + public static final String ANDROIDANNOTATION_VERSION = "3.0-SNAPSHOT"; + private final TimeStats timeStats = new TimeStats(); private final ErrorHelper errorHelper = new ErrorHelper(); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java index 755fd32fbf..7eeb33b1af 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java @@ -14,12 +14,13 @@ import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; +import org.androidannotations.AndroidAnnotationProcessor; import org.androidannotations.exception.ProcessingException; public class ErrorHelper { public String getErrorMessage(ProcessingException e) { - String errorMessage = "Unexpected error. Please report an issue on AndroidAnnotations, with the following content and tell us if you can reproduce it or not. The error was thrown on:\n"; + String errorMessage = "Unexpected error. Please report an issue on AndroidAnnotations " + AndroidAnnotationProcessor.ANDROIDANNOTATION_VERSION + ", with the following content and tell us if you can reproduce it or not. The error was thrown on:\n"; if (e.getElement() != null) { errorMessage += elementFullString(e.getElement()) + "\n"; } From e209f37dee98e193c300e53b36ed7666d3cc16dc Mon Sep 17 00:00:00 2001 From: Damien Date: Wed, 5 Jun 2013 01:42:20 +0200 Subject: [PATCH 4/8] Add information about enclosing element in crash report --- .../java/org/androidannotations/helper/ErrorHelper.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java index 7eeb33b1af..a707861520 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java @@ -35,7 +35,11 @@ private String elementFullString(Element element) { for (AnnotationMirror annotation : annotations) { result += annotationFullString(annotation) + "\n"; } - return result + element.toString(); + Element enclosingElement = element.getEnclosingElement(); + if (enclosingElement != null) { + result += enclosingElement.toString() + "."; + } + return result + element.asType().toString(); } private String annotationFullString(AnnotationMirror annotation) { From 918e869e3c5c38c5b3b74445f2458fe9302b5d07 Mon Sep 17 00:00:00 2001 From: Damien Date: Thu, 6 Jun 2013 20:26:53 +0200 Subject: [PATCH 5/8] Use ElementUtils from ProcessingEnvironment to print the context instead of home-made system --- .../AndroidAnnotationProcessor.java | 2 +- .../helper/ErrorHelper.java | 46 +++++-------------- 2 files changed, 13 insertions(+), 35 deletions(-) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java index a264955957..81c34c8c01 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java @@ -571,7 +571,7 @@ private void generateSources(ProcessResult processResult) throws IOException { } private void handleException(Set annotations, RoundEnvironment roundEnv, ProcessingException e) { - String errorMessage = errorHelper.getErrorMessage(e); + String errorMessage = errorHelper.getErrorMessage(processingEnv, e); Messager messager = processingEnv.getMessager(); messager.printMessage(Diagnostic.Kind.ERROR, errorMessage); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java index a707861520..3c704c7b00 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java @@ -1,62 +1,40 @@ package org.androidannotations.helper; import java.io.BufferedReader; +import java.io.CharArrayWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.List; -import java.util.Map; -import java.util.Set; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; +import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; +import javax.lang.model.util.Elements; import org.androidannotations.AndroidAnnotationProcessor; import org.androidannotations.exception.ProcessingException; public class ErrorHelper { - public String getErrorMessage(ProcessingException e) { + public String getErrorMessage(ProcessingEnvironment processingEnv, ProcessingException e) { String errorMessage = "Unexpected error. Please report an issue on AndroidAnnotations " + AndroidAnnotationProcessor.ANDROIDANNOTATION_VERSION + ", with the following content and tell us if you can reproduce it or not. The error was thrown on:\n"; if (e.getElement() != null) { - errorMessage += elementFullString(e.getElement()) + "\n"; + errorMessage += elementFullString(processingEnv, e.getElement()) + "\n"; } errorMessage += "compiled with " + getJavaCompilerVersion() + "\n"; errorMessage += "with stacktrace: " + stackTraceToString(e.getCause()); return errorMessage; } - private String elementFullString(Element element) { - String result = ""; - List annotations = element.getAnnotationMirrors(); - for (AnnotationMirror annotation : annotations) { - result += annotationFullString(annotation) + "\n"; - } + private String elementFullString(ProcessingEnvironment processingEnv, Element element) { + Elements elementUtils = processingEnv.getElementUtils(); + CharArrayWriter writer = new CharArrayWriter(); + elementUtils.printElements(writer, element); + String result = writer.toString(); + Element enclosingElement = element.getEnclosingElement(); if (enclosingElement != null) { - result += enclosingElement.toString() + "."; - } - return result + element.asType().toString(); - } - - private String annotationFullString(AnnotationMirror annotation) { - String result = annotation.toString(); - - Map fields = annotation.getElementValues(); - if (fields != null) { - result += "("; - Set fieldKeys = fields.keySet(); - int i = 0; - for (ExecutableElement fieldKey : fieldKeys) { - result += fieldKey.getSimpleName().toString() + "=" + fields.get(fieldKey).getValue().toString(); - if (++i < fieldKeys.size()) { - result += ", "; - } - } - result += ")"; + result = result + "\nin: " + enclosingElement.toString(); } return result; } From 511119d2c4fe17d46dcc04d8e60fbe699fc66fd4 Mon Sep 17 00:00:00 2001 From: Damien Date: Fri, 19 Jul 2013 21:10:50 +0200 Subject: [PATCH 6/8] Uses a property instead of a constant for AA processor version --- .../org.eclipse.core.resources.prefs | 1 + AndroidAnnotations/androidannotations/pom.xml | 18 ++++++++++++- .../AndroidAnnotationProcessor.java | 27 ++++++++++++++++--- .../helper/ErrorHelper.java | 5 ++-- .../androidannotations-version.properties | 1 + 5 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 AndroidAnnotations/androidannotations/src/main/resources/androidannotations-version.properties diff --git a/AndroidAnnotations/androidannotations/.settings/org.eclipse.core.resources.prefs b/AndroidAnnotations/androidannotations/.settings/org.eclipse.core.resources.prefs index c584550030..d25a71a2d6 100644 --- a/AndroidAnnotations/androidannotations/.settings/org.eclipse.core.resources.prefs +++ b/AndroidAnnotations/androidannotations/.settings/org.eclipse.core.resources.prefs @@ -2,6 +2,7 @@ eclipse.preferences.version=1 encoding//src/main/java=UTF-8 encoding//src/main/java/rebel.xml=UTF-8 encoding//src/main/resources=UTF-8 +encoding//src/main/resources/androidannotations-version.properties=utf-8 encoding//src/main/resources/rebel.xml=UTF-8 encoding//src/test/java=UTF-8 encoding//src/test/resources=UTF-8 diff --git a/AndroidAnnotations/androidannotations/pom.xml b/AndroidAnnotations/androidannotations/pom.xml index 49d21ae26c..c5b2d0aa85 100644 --- a/AndroidAnnotations/androidannotations/pom.xml +++ b/AndroidAnnotations/androidannotations/pom.xml @@ -77,7 +77,16 @@ + + org.apache.maven.plugins + maven-resources-plugin + 2.5 + + ${project.build.sourceEncoding} + + + src/main/resources @@ -88,7 +97,14 @@ src/main/java - org/androidannotations/api/** + org/androidannotations/api/** + + + + src/main/resources + true + + **/*.properties diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java index 81c34c8c01..18b15e61e4 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java @@ -21,9 +21,11 @@ import static org.androidannotations.helper.ModelConstants.TRACE_OPTION; import java.io.IOException; +import java.net.URL; import java.util.Collections; import java.util.HashSet; import java.util.Map; +import java.util.Properties; import java.util.Set; import javax.annotation.processing.AbstractProcessor; @@ -270,9 +272,7 @@ @SupportedOptions({ TRACE_OPTION, ANDROID_MANIFEST_FILE_OPTION }) public class AndroidAnnotationProcessor extends AbstractProcessor { - // TODO: We whould find a better way - public static final String ANDROIDANNOTATION_VERSION = "3.0-SNAPSHOT"; - + private final Properties properties = new Properties(); private final TimeStats timeStats = new TimeStats(); private final ErrorHelper errorHelper = new ErrorHelper(); @@ -284,6 +284,8 @@ public synchronized void init(ProcessingEnvironment processingEnv) { Messager messager = processingEnv.getMessager(); + loadPropertyFile(); + timeStats.setMessager(messager); messager.printMessage(Diagnostic.Kind.NOTE, "Starting AndroidAnnotations annotation processing"); @@ -305,6 +307,23 @@ public boolean process(Set annotations, RoundEnvironment return true; } + private void loadPropertyFile() { + String filename = "androidannotations-version.properties"; + try { + URL url = getClass().getClassLoader().getResource(filename); + properties.load(url.openStream()); + } catch (Exception e) { + e.printStackTrace(); + + Messager messager = processingEnv.getMessager(); + messager.printMessage(Diagnostic.Kind.NOTE, "AndroidAnnotations processing failed because " + filename + " couldn't be parsed : " + e.getLocalizedMessage()); + } + } + + private String getAAProcessorVersion() { + return properties.getProperty("version", "3.0+"); + } + private void processThrowing(Set annotations, RoundEnvironment roundEnv) throws ProcessingException, Exception { if (nothingToDo(annotations, roundEnv)) { return; @@ -571,7 +590,7 @@ private void generateSources(ProcessResult processResult) throws IOException { } private void handleException(Set annotations, RoundEnvironment roundEnv, ProcessingException e) { - String errorMessage = errorHelper.getErrorMessage(processingEnv, e); + String errorMessage = errorHelper.getErrorMessage(processingEnv, e, getAAProcessorVersion()); Messager messager = processingEnv.getMessager(); messager.printMessage(Diagnostic.Kind.ERROR, errorMessage); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java index 3c704c7b00..45fdb0a59a 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java @@ -11,13 +11,12 @@ import javax.lang.model.element.Element; import javax.lang.model.util.Elements; -import org.androidannotations.AndroidAnnotationProcessor; import org.androidannotations.exception.ProcessingException; public class ErrorHelper { - public String getErrorMessage(ProcessingEnvironment processingEnv, ProcessingException e) { - String errorMessage = "Unexpected error. Please report an issue on AndroidAnnotations " + AndroidAnnotationProcessor.ANDROIDANNOTATION_VERSION + ", with the following content and tell us if you can reproduce it or not. The error was thrown on:\n"; + public String getErrorMessage(ProcessingEnvironment processingEnv, ProcessingException e, String aaVersion) { + String errorMessage = "Unexpected error. Please report an issue on AndroidAnnotations " + aaVersion + ", with the following content and tell us if you can reproduce it or not. The error was thrown on:\n"; if (e.getElement() != null) { errorMessage += elementFullString(processingEnv, e.getElement()) + "\n"; } diff --git a/AndroidAnnotations/androidannotations/src/main/resources/androidannotations-version.properties b/AndroidAnnotations/androidannotations/src/main/resources/androidannotations-version.properties new file mode 100644 index 0000000000..e5683df88c --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/resources/androidannotations-version.properties @@ -0,0 +1 @@ +version=${project.version} \ No newline at end of file From d82f3c16551056f69fcd056d08d20c9639fc6813 Mon Sep 17 00:00:00 2001 From: Damien Date: Fri, 19 Jul 2013 21:11:20 +0200 Subject: [PATCH 7/8] Write AA version used in generated header files --- .../org/androidannotations/AndroidAnnotationProcessor.java | 2 +- .../androidannotations/generation/CodeModelGenerator.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java index 18b15e61e4..6da5f06240 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java @@ -584,7 +584,7 @@ private void generateSources(ProcessResult processResult) throws IOException { timeStats.start("Generate Sources"); Messager messager = processingEnv.getMessager(); messager.printMessage(Diagnostic.Kind.NOTE, "Number of files generated by AndroidAnnotations: " + processResult.codeModel.countArtifacts()); - CodeModelGenerator modelGenerator = new CodeModelGenerator(processingEnv.getFiler(), messager); + CodeModelGenerator modelGenerator = new CodeModelGenerator(processingEnv.getFiler(), messager, getAAProcessorVersion()); modelGenerator.generate(processResult); timeStats.stop("Generate Sources"); } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/CodeModelGenerator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/CodeModelGenerator.java index d96ffb7ffd..50495ef3fa 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/CodeModelGenerator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/CodeModelGenerator.java @@ -28,10 +28,12 @@ public class CodeModelGenerator { private final Filer filer; private final Messager messager; + private final String aaVersion; - public CodeModelGenerator(Filer filer, Messager messager) { + public CodeModelGenerator(Filer filer, Messager messager, String aaVersion) { this.filer = filer; this.messager = messager; + this.aaVersion = aaVersion; } public void generate(ProcessResult processResult) throws IOException { @@ -41,7 +43,7 @@ public void generate(ProcessResult processResult) throws IOException { SourceCodewriter sourceCodeWriter = new SourceCodewriter(filer, messager, processResult.originatingElements); - PrologCodeWriter prologCodeWriter = new PrologCodeWriter(sourceCodeWriter, "DO NOT EDIT THIS FILE, IT HAS BEEN GENERATED USING AndroidAnnotations.\n"); + PrologCodeWriter prologCodeWriter = new PrologCodeWriter(sourceCodeWriter, "DO NOT EDIT THIS FILE, IT HAS BEEN GENERATED USING AndroidAnnotations " + aaVersion + ".\n"); processResult.codeModel.build(prologCodeWriter, new ResourceCodeWriter(filer)); } From 65590d4593c0946a2cde6a30823fe15edcd442c9 Mon Sep 17 00:00:00 2001 From: Damien Date: Fri, 20 Sep 2013 16:24:11 +0200 Subject: [PATCH 8/8] Improve error message --- .../helper/ErrorHelper.java | 48 +++++++++++++++---- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java index 45fdb0a59a..d55c3bb87f 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ErrorHelper.java @@ -6,6 +6,11 @@ import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; @@ -16,12 +21,19 @@ public class ErrorHelper { public String getErrorMessage(ProcessingEnvironment processingEnv, ProcessingException e, String aaVersion) { - String errorMessage = "Unexpected error. Please report an issue on AndroidAnnotations " + aaVersion + ", with the following content and tell us if you can reproduce it or not. The error was thrown on:\n"; - if (e.getElement() != null) { - errorMessage += elementFullString(processingEnv, e.getElement()) + "\n"; + String errorMessage = "Unexpected error in AndroidAnnotations " + aaVersion + "!\n" // + + "You should check if there is already an issue about it on https://github.com/excilys/androidannotations/search?q=" + urlEncodedErrorMessage(e) + "&type=Issues\n" // + + "If none exists, please open a new one with the following content and tell us if you can reproduce it or not. Don't forget to give us as much information as you can (like parts of your code in failure).\n"; + errorMessage += "Java version: " + getJavaCompilerVersion() + "\n"; + errorMessage += "Javac processors options: " + annotationProcessorOptions(processingEnv) + "\n"; + errorMessage += "Stacktrace: " + stackTraceToString(e.getCause()); + + Element element = e.getElement(); + if (element != null) { + errorMessage += "Thrown from: " + elementContainer(element) + "\n"; + errorMessage += "Element (" + element.getClass().getSimpleName() + "): " + elementFullString(processingEnv, element) + "\n"; } - errorMessage += "compiled with " + getJavaCompilerVersion() + "\n"; - errorMessage += "with stacktrace: " + stackTraceToString(e.getCause()); + return errorMessage; } @@ -29,13 +41,23 @@ private String elementFullString(ProcessingEnvironment processingEnv, Element el Elements elementUtils = processingEnv.getElementUtils(); CharArrayWriter writer = new CharArrayWriter(); elementUtils.printElements(writer, element); - String result = writer.toString(); + return writer.toString(); + } + private String elementContainer(Element element) { Element enclosingElement = element.getEnclosingElement(); - if (enclosingElement != null) { - result = result + "\nin: " + enclosingElement.toString(); + return enclosingElement != null ? enclosingElement.toString() : ""; + } + + private String annotationProcessorOptions(ProcessingEnvironment processingEnv) { + Map options = processingEnv.getOptions(); + Set> optionsEntries = options.entrySet(); + + String result = ""; + for (Entry optionEntry : optionsEntries) { + result += optionEntry.getKey() + "=" + optionEntry.getValue() + ", "; } - return result; + return result.length() > 2 ? result.substring(0, result.length() - 2) : result; } private String getJavaCompilerVersion() { @@ -61,6 +83,14 @@ private String getJavaCompilerVersion() { return "unknown"; } + private String urlEncodedErrorMessage(Throwable e) { + try { + return URLEncoder.encode(e.getCause().getClass().getName(), "UTF-8"); + } catch (UnsupportedEncodingException e1) { + return ""; + } + } + private String stackTraceToString(Throwable e) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer);