diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationsEnvironment.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationsEnvironment.java index 576eab5056..301e88e23a 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationsEnvironment.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationsEnvironment.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -61,6 +62,8 @@ public interface AndroidAnnotationsEnvironment { AndroidManifest getAndroidManifest(); + AnnotationElements getExtractedElements(); + AnnotationElements getValidatedElements(); JCodeModel getCodeModel(); diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java index 53c7a4b0ea..fa4063fa36 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java @@ -308,6 +308,14 @@ public void typeHasAnnotation(Class annotation, Element el typeHasAnnotation(annotation, elementType, valid); } + public void typeHasValidAnnotation(Class annotation, Element element, ElementValidation valid) { + typeHasAnnotation(annotation, element, valid); + + if (valid.isValid()) { + typeIsValid(annotation, element.asType(), valid); + } + } + public void typeHasAnnotation(Class annotation, TypeMirror elementType, ElementValidation valid) { Element typeElement = annotationHelper.getTypeUtils().asElement(elementType); if (!elementHasAnnotationSafe(annotation, typeElement)) { @@ -324,14 +332,14 @@ public void typeOrTargetValueHasAnnotation(Class annotatio DeclaredType targetAnnotationClassValue = annotationHelper.extractAnnotationClassParameter(element); if (targetAnnotationClassValue != null) { - typeHasAnnotation(annotation, targetAnnotationClassValue, valid); + targetElement = targetAnnotationClassValue.asElement(); if (!annotationHelper.getTypeUtils().isAssignable(targetAnnotationClassValue, targetElement.asType())) { valid.addError("The value of %s must be assignable into the annotated field"); } - } else { - typeHasAnnotation(annotation, targetElement, valid); } + + typeHasValidAnnotation(annotation, targetElement, valid); } Element findTargetElement(Element element, ElementValidation valid) { @@ -352,6 +360,20 @@ Element findTargetElement(Element element, ElementValidation valid) { return element; } + public void typeIsValid(Class annotation, TypeMirror elementType, ElementValidation elementValidation) { + Set validElements = validatedModel().getRootAnnotatedElements(annotation.getName()); + + Set extractedElements = environment().getExtractedElements().getRootAnnotatedElements(annotation.getName()); + + Element typeElement = annotationHelper.getTypeUtils().asElement(elementType); + + if (!extractedElements.contains(typeElement) || validElements.contains(typeElement)) { + return; + } + + elementValidation.addError("The type " + typeElement.getSimpleName() + " is invalid, " + "please check the messages on that type."); + } + private boolean elementHasAnnotationSafe(Class annotation, Element element) { List annotationMirrors = element.getAnnotationMirrors(); for (AnnotationMirror annotationMirror : annotationMirrors) { diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/AndroidAnnotationProcessor.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/AndroidAnnotationProcessor.java index a6265b7c87..1cb9a12bd5 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/AndroidAnnotationProcessor.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/AndroidAnnotationProcessor.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -37,7 +38,6 @@ import org.androidannotations.internal.exception.AndroidManifestNotFoundException; import org.androidannotations.internal.exception.ProcessingException; import org.androidannotations.internal.exception.RClassNotFoundException; -import org.androidannotations.internal.exception.ValidationException; import org.androidannotations.internal.exception.VersionMismatchException; import org.androidannotations.internal.exception.VersionNotFoundException; import org.androidannotations.internal.generation.CodeModelGenerator; @@ -124,8 +124,6 @@ public boolean process(Set annotations, RoundEnvironment try { checkApiAndProcessorVersions(); processThrowing(annotations, roundEnv); - } catch (ValidationException e) { - // We do nothing, errors have been printed by ModelValidator } catch (ProcessingException e) { handleException(annotations, roundEnv, e); } catch (Exception e) { @@ -136,7 +134,7 @@ public boolean process(Set annotations, RoundEnvironment LOGGER.info("Finish processing"); - LoggerContext.getInstance().close(); + LoggerContext.getInstance().close(roundEnv.processingOver()); return true; } @@ -156,6 +154,8 @@ private void processThrowing(Set annotations, RoundEnviro } AnnotationElementsHolder extractedModel = extractAnnotations(annotations, roundEnv); + androidAnnotationsEnv.setExtractedElements(extractedModel); + AnnotationElementsHolder validatingHolder = extractedModel.validatingHolder(); androidAnnotationsEnv.setValidatedElements(validatingHolder); @@ -210,7 +210,7 @@ private IRClass findRClasses(AndroidManifest androidManifest) throws RClassNotFo } } - private AnnotationElements validateAnnotations(AnnotationElements extractedModel, AnnotationElementsHolder validatingHolder) throws ValidationException { + private AnnotationElements validateAnnotations(AnnotationElements extractedModel, AnnotationElementsHolder validatingHolder) { timeStats.start("Validate Annotations"); ModelValidator modelValidator = new ModelValidator(androidAnnotationsEnv); AnnotationElements validatedAnnotations = modelValidator.validate(extractedModel, validatingHolder); diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/InternalAndroidAnnotationsEnvironment.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/InternalAndroidAnnotationsEnvironment.java index 223055825c..7f97895e67 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/InternalAndroidAnnotationsEnvironment.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/InternalAndroidAnnotationsEnvironment.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -48,6 +49,8 @@ public class InternalAndroidAnnotationsEnvironment implements AndroidAnnotations private IRClass rClass; private AndroidManifest androidManifest; + private AnnotationElements extractedElements; + private AnnotationElements validatedElements; private ProcessHolder processHolder; @@ -73,6 +76,10 @@ public void setAndroidEnvironment(IRClass rClass, AndroidManifest androidManifes this.androidManifest = androidManifest; } + public void setExtractedElements(AnnotationElements extractedElements) { + this.extractedElements = extractedElements; + } + public void setValidatedElements(AnnotationElements validatedElements) { this.validatedElements = validatedElements; } @@ -141,6 +148,11 @@ public AndroidManifest getAndroidManifest() { return androidManifest; } + @Override + public AnnotationElements getExtractedElements() { + return extractedElements; + } + @Override public AnnotationElements getValidatedElements() { return validatedElements; diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/AppHandler.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/AppHandler.java index 3621caee68..b0944b8829 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/AppHandler.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/AppHandler.java @@ -52,7 +52,7 @@ public void validate(Element element, ElementValidation validation) { validatorHelper.isNotPrivate(element, validation); Element param = injectHelper.getParam(element); - validatorHelper.typeHasAnnotation(EApplication.class, param, validation); + validatorHelper.typeHasValidAnnotation(EApplication.class, param, validation); } @Override diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/NonConfigurationInstanceHandler.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/NonConfigurationInstanceHandler.java index d8924b3d71..f96bc30841 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/NonConfigurationInstanceHandler.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/NonConfigurationInstanceHandler.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -51,6 +52,10 @@ public void validate(Element element, ElementValidation validation) { validatorHelper.isNotPrivate(element, validation); validatorHelper.isNotFinal(element, validation); + + if (element.getAnnotation(Bean.class) != null) { + validatorHelper.typeIsValid(EBean.class, element.asType(), validation); + } } @Override diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/exception/ValidationException.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/exception/ValidationException.java deleted file mode 100644 index 90f60f82fc..0000000000 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/exception/ValidationException.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (C) 2010-2016 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.internal.exception; - -import java.util.List; - -import org.androidannotations.ElementValidation; - -public class ValidationException extends Exception { - - private final List failedValidations; - - public ValidationException(List failedValidations) { - this.failedValidations = failedValidations; - } - - public List getFailedValidations() { - return failedValidations; - } - -} diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/process/ModelValidator.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/process/ModelValidator.java index 4ebf636fdb..c22757f5b5 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/process/ModelValidator.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/process/ModelValidator.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +16,7 @@ */ package org.androidannotations.internal.process; -import java.util.ArrayList; import java.util.LinkedHashSet; -import java.util.List; import java.util.Set; import javax.lang.model.element.AnnotationMirror; @@ -26,7 +25,6 @@ import org.androidannotations.AndroidAnnotationsEnvironment; import org.androidannotations.ElementValidation; import org.androidannotations.handler.AnnotationHandler; -import org.androidannotations.internal.exception.ValidationException; import org.androidannotations.internal.model.AnnotationElements; import org.androidannotations.internal.model.AnnotationElementsHolder; import org.androidannotations.logger.Logger; @@ -41,10 +39,9 @@ public ModelValidator(AndroidAnnotationsEnvironment environment) { this.environment = environment; } - public AnnotationElements validate(AnnotationElements extractedModel, AnnotationElementsHolder validatingHolder) throws ValidationException { + public AnnotationElements validate(AnnotationElements extractedModel, AnnotationElementsHolder validatingHolder) { LOGGER.info("Validating elements"); - List failedValidations = new ArrayList<>(); /* * We currently do not validate the elements on the ancestors, assuming @@ -78,22 +75,17 @@ public AnnotationElements validate(AnnotationElements extractedModel, Annotation } for (String warning : elementValidation.getWarnings()) { - LOGGER.warn(warning, elementValidation.getElement(), elementValidation.getAnnotationMirror()); + LOGGER.warn(warning, elementValidation.getElement(), annotationMirror); } if (elementValidation.isValid()) { validatedAnnotatedElements.add(annotatedElement); } else { - failedValidations.add(elementValidation); LOGGER.warn("Element {} invalidated by {}", annotatedElement, annotatedElement, validatorSimpleName); } } } - if (!failedValidations.isEmpty()) { - throw new ValidationException(failedValidations); - } - return validatingHolder; } } diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/LoggerContext.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/LoggerContext.java index 99b0022e86..18381bd475 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/LoggerContext.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/LoggerContext.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -85,9 +86,9 @@ public void setEnvironment(AndroidAnnotationsEnvironment environment) { } } - public void close() { + public void close(boolean lastRound) { for (Appender appender : appenders) { - appender.close(); + appender.close(lastRound); } } diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/Appender.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/Appender.java index 6e692b6003..b7f4f8d7fc 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/Appender.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/Appender.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -44,6 +45,6 @@ public void setEnvironment(AndroidAnnotationsEnvironment environment) { public abstract void append(Level level, Element element, AnnotationMirror annotationMirror, String message); - public abstract void close(); + public abstract void close(boolean lastRound); } diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/ConsoleAppender.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/ConsoleAppender.java index 0d6a470583..0ef528d0d9 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/ConsoleAppender.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/ConsoleAppender.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,6 +16,9 @@ */ package org.androidannotations.logger.appender; +import java.util.LinkedList; +import java.util.List; + import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; @@ -23,6 +27,8 @@ public class ConsoleAppender extends Appender { + private final List errors = new LinkedList<>(); + public ConsoleAppender() { super(new FormatterFull()); } @@ -36,12 +42,17 @@ public void append(Level level, Element element, AnnotationMirror annotationMirr if (level.isSmaller(Level.ERROR)) { System.out.println(message); } else { - System.err.println(message); + errors.add(message); } } @Override - public void close() { + public synchronized void close(boolean lastRound) { + if (lastRound) { + for (String error : errors) { + System.err.println(error); + } + } } } diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/FileAppender.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/FileAppender.java index 50d7bd0678..9e268dbcde 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/FileAppender.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/FileAppender.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -57,7 +58,7 @@ public synchronized void open() { } @Override - public synchronized void close() { + public synchronized void close(boolean lastRound) { if (isStreamOpened()) { try { outputStream.close(); diff --git a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/MessagerAppender.java b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/MessagerAppender.java index b5844cea91..6d831a2a19 100644 --- a/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/MessagerAppender.java +++ b/AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/logger/appender/MessagerAppender.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +16,15 @@ */ package org.androidannotations.logger.appender; +import java.util.LinkedList; +import java.util.List; + import javax.annotation.processing.Messager; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.VariableElement; import javax.tools.Diagnostic.Kind; import org.androidannotations.logger.Level; @@ -25,12 +32,14 @@ public class MessagerAppender extends Appender { + private final List errors = new LinkedList<>(); + + private Messager messager; + public MessagerAppender() { super(new FormatterSimple()); } - private Messager messager; - @Override public void open() { messager = processingEnv.getMessager(); @@ -43,11 +52,21 @@ public void append(Level level, Element element, AnnotationMirror annotationMirr } Kind kind = resolveKind(level); - messager.printMessage(kind, message, element, annotationMirror); + if (!kind.equals(Kind.ERROR)) { + messager.printMessage(kind, message, element, annotationMirror); + } else { + errors.add(new Message(kind, message, element, annotationMirror)); + } } @Override - public void close() { + public synchronized void close(boolean lastRound) { + if (lastRound) { + for (Message error : errors) { + ElementDetails elementDetails = error.getElementDetails(); + messager.printMessage(error.kind, error.message, elementDetails.getElement(), elementDetails.getAnnotationMirror()); + } + } } private Kind resolveKind(Level level) { @@ -66,4 +85,110 @@ private Kind resolveKind(Level level) { return Kind.OTHER; } + private class Message { + private final Kind kind; + private final String message; + private final String annotationMirrorString; + private final List elements = new LinkedList<>(); + + Message(Kind kind, String message, Element element, AnnotationMirror annotationMirror) { + this.kind = kind; + this.message = message; + this.annotationMirrorString = annotationMirror == null ? null : annotationMirror.toString(); + + if (element != null) { + Element enclosingElement = element; + do { + elements.add(0, enclosingElement.toString()); + enclosingElement = enclosingElement.getEnclosingElement(); + } while (!enclosingElement.getKind().equals(ElementKind.PACKAGE)); + } + } + + private AnnotationMirror getAnnotationMirror(Element element) { + if (element == null) { + return null; + } + + for (AnnotationMirror mirror : element.getAnnotationMirrors()) { + if (mirror.toString().equals(annotationMirrorString)) { + return mirror; + } + } + return null; + } + + private Element getElement() { + if (elements.isEmpty()) { + return null; + } + + boolean ignorePackage = false; + List localElements = new LinkedList<>(elements); + Element element = processingEnv.getElementUtils().getTypeElement(localElements.remove(0)); + while (localElements.size() > 0) { + int prevSize = localElements.size(); + if (element instanceof ExecutableElement) { + ExecutableElement method = (ExecutableElement) element; + for (VariableElement param : method.getParameters()) { + if (param.toString().equals(localElements.get(0))) { + localElements.remove(0); + element = param; + break; + } + } + } else { + for (Element elem : element.getEnclosedElements()) { + String elemStringValue = elem.toString(); + String localElement = localElements.get(0); + if (ignorePackage) { + elemStringValue = removePackages(elemStringValue); + localElement = removePackages(localElement); + } + if (elemStringValue.equals(localElement)) { + localElements.remove(0); + element = elem; + break; + } + } + } + if (prevSize == localElements.size()) { + if (ignorePackage) { + // return current element in case we have not found a + // matching one in this round one - should not happen + return element; + } + ignorePackage = true; + } + } + return element; + } + + private String removePackages(String elemStringValue) { + return elemStringValue.replaceAll("([a-zA-Z_$][a-zA-Z_$0-9]*\\.)+", ""); + } + + private ElementDetails getElementDetails() { + Element element = getElement(); + return new ElementDetails(element, getAnnotationMirror(element)); + } + } + + private static class ElementDetails { + private final Element element; + private final AnnotationMirror annotationMirror; + + ElementDetails(Element element, AnnotationMirror annotationMirror) { + this.element = element; + this.annotationMirror = annotationMirror; + } + + public Element getElement() { + return element; + } + + public AnnotationMirror getAnnotationMirror() { + return annotationMirror; + } + } } diff --git a/AndroidAnnotations/androidannotations-rest-spring/rest-spring/src/main/java/org/androidannotations/rest/spring/handler/RestServiceHandler.java b/AndroidAnnotations/androidannotations-rest-spring/rest-spring/src/main/java/org/androidannotations/rest/spring/handler/RestServiceHandler.java index 6352475c8f..57b495696e 100644 --- a/AndroidAnnotations/androidannotations-rest-spring/rest-spring/src/main/java/org/androidannotations/rest/spring/handler/RestServiceHandler.java +++ b/AndroidAnnotations/androidannotations-rest-spring/rest-spring/src/main/java/org/androidannotations/rest/spring/handler/RestServiceHandler.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -53,7 +54,7 @@ public void validate(Element element, ElementValidation validation) { validatorHelper.isNotPrivate(element, validation); Element param = injectHelper.getParam(element); - validatorHelper.typeHasAnnotation(Rest.class, param, validation); + validatorHelper.typeHasValidAnnotation(Rest.class, param, validation); } @Override diff --git a/AndroidAnnotations/androidannotations-rest-spring/rest-spring/src/main/java/org/androidannotations/rest/spring/helper/RestSpringValidatorHelper.java b/AndroidAnnotations/androidannotations-rest-spring/rest-spring/src/main/java/org/androidannotations/rest/spring/helper/RestSpringValidatorHelper.java index 59a24d8053..f5823d9910 100644 --- a/AndroidAnnotations/androidannotations-rest-spring/rest-spring/src/main/java/org/androidannotations/rest/spring/helper/RestSpringValidatorHelper.java +++ b/AndroidAnnotations/androidannotations-rest-spring/rest-spring/src/main/java/org/androidannotations/rest/spring/helper/RestSpringValidatorHelper.java @@ -1,5 +1,6 @@ /** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group + * Copyright (C) 2016-2017 the AndroidAnnotations project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -263,6 +264,8 @@ public void validateConverters(Element element, ElementValidation valid) { if (!hasPublicWithNoArgumentConstructor) { valid.addError("The converter class must have a public no argument constructor"); } + } else { + typeIsValid(EBean.class, converterType, valid); } } else { valid.addError("The converter class must not be abstract"); @@ -300,6 +303,8 @@ public void validateInterceptors(Element element, ElementValidation valid) { if (!hasPublicWithNoArgumentConstructor) { valid.addError("The interceptor class must have a public no argument constructor or be annotated with @EBean"); } + } else { + typeIsValid(EBean.class, interceptorType, valid); } } else { valid.addError("The interceptor class must not be abstract"); @@ -322,6 +327,7 @@ public void validateRestSimpleParameter(Element element, String requiredClass, S if (parameterElement.getKind().isClass()) { if (!annotationHelper.isAbstract(parameterElement)) { if (parameterElement.getAnnotation(EBean.class) != null) { + typeIsValid(EBean.class, paramterType, validation); return; } List constructors = ElementFilter.constructorsIn(parameterElement.getEnclosedElements());