From 1972f36ec1daf80799d427f0456e2a85b60f2247 Mon Sep 17 00:00:00 2001 From: Gunnar Morling Date: Mon, 1 Jul 2013 23:39:55 +0200 Subject: [PATCH] #32 Simplifying messaging --- .../org/mapstruct/ap/MappingProcessor.java | 12 ++- .../java/org/mapstruct/ap/model/Mapper.java | 9 +- .../DefaultModelElementProcessorContext.java | 59 +++++++++- .../ap/processor/MapperCreationProcessor.java | 102 ++++++++---------- .../processor/MapperRenderingProcessor.java | 9 +- .../processor/MethodRetrievalProcessor.java | 35 ++---- .../ap/processor/ModelElementProcessor.java | 15 ++- .../mapstruct/ap/testutil/MapperTestBase.java | 4 +- 8 files changed, 140 insertions(+), 105 deletions(-) diff --git a/processor/src/main/java/org/mapstruct/ap/MappingProcessor.java b/processor/src/main/java/org/mapstruct/ap/MappingProcessor.java index cbdd113f3..b877bcfb7 100644 --- a/processor/src/main/java/org/mapstruct/ap/MappingProcessor.java +++ b/processor/src/main/java/org/mapstruct/ap/MappingProcessor.java @@ -129,10 +129,18 @@ public class MappingProcessor extends AbstractProcessor { return ANNOTATIONS_CLAIMED_EXCLUSIVELY; } + /** + * Applies all registered {@link ModelElementProcessor}s to the given mapper + * type. + * + * @param context The processor context. + * @param mapperTypeElement The mapper type element. + */ private void processMapperTypeElement(ProcessorContext context, TypeElement mapperTypeElement) { - Object mapper = mapperTypeElement; + Object model = null; + for ( ModelElementProcessor processor : getProcessors() ) { - mapper = process( context, processor, mapperTypeElement, mapper ); + model = process( context, processor, mapperTypeElement, model ); } } diff --git a/processor/src/main/java/org/mapstruct/ap/model/Mapper.java b/processor/src/main/java/org/mapstruct/ap/model/Mapper.java index 103884325..309fcac1d 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/Mapper.java +++ b/processor/src/main/java/org/mapstruct/ap/model/Mapper.java @@ -34,11 +34,9 @@ public class Mapper extends AbstractModelElement { private final List mappingMethods; private final List referencedMappers; private final Options options; - private final boolean isErroneous; public Mapper(String packageName, String interfaceName, String implementationName, - List mappingMethods, List referencedMappers, Options options, - boolean isErroneous) { + List mappingMethods, List referencedMappers, Options options) { this.packageName = packageName; this.interfaceName = interfaceName; this.implementationName = implementationName; @@ -46,7 +44,6 @@ public class Mapper extends AbstractModelElement { this.mappingMethods = mappingMethods; this.referencedMappers = referencedMappers; this.options = options; - this.isErroneous = isErroneous; } @Override @@ -132,10 +129,6 @@ public class Mapper extends AbstractModelElement { return options; } - public boolean isErroneous() { - return isErroneous; - } - public void addAnnotation(Annotation annotation) { annotations.add( annotation ); } diff --git a/processor/src/main/java/org/mapstruct/ap/processor/DefaultModelElementProcessorContext.java b/processor/src/main/java/org/mapstruct/ap/processor/DefaultModelElementProcessorContext.java index a7e3019ae..ff0825e47 100644 --- a/processor/src/main/java/org/mapstruct/ap/processor/DefaultModelElementProcessorContext.java +++ b/processor/src/main/java/org/mapstruct/ap/processor/DefaultModelElementProcessorContext.java @@ -21,8 +21,12 @@ package org.mapstruct.ap.processor; import javax.annotation.processing.Filer; import javax.annotation.processing.Messager; import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; +import javax.tools.Diagnostic.Kind; import org.mapstruct.ap.model.Options; @@ -33,11 +37,13 @@ import org.mapstruct.ap.model.Options; */ public class DefaultModelElementProcessorContext implements ModelElementProcessor.ProcessorContext { - private ProcessingEnvironment processingEnvironment; - private Options options; + private final ProcessingEnvironment processingEnvironment; + private final DelegatingMessager messager; + private final Options options; public DefaultModelElementProcessorContext(ProcessingEnvironment processingEnvironment, Options options) { this.processingEnvironment = processingEnvironment; + this.messager = new DelegatingMessager( processingEnvironment.getMessager() ); this.options = options; } @@ -58,11 +64,58 @@ public class DefaultModelElementProcessorContext implements ModelElementProcesso @Override public Messager getMessager() { - return processingEnvironment.getMessager(); + return messager; } @Override public Options getOptions() { return options; } + + @Override + public boolean isErroneous() { + return messager.isErroneous(); + } + + private static class DelegatingMessager implements Messager { + + private final Messager delegate; + private boolean isErroneous = false; + + public DelegatingMessager(Messager delegate) { + this.delegate = delegate; + } + + public void printMessage(Kind kind, CharSequence msg) { + delegate.printMessage( kind, msg ); + if ( kind == Kind.ERROR ) { + isErroneous = true; + } + } + + public void printMessage(Kind kind, CharSequence msg, Element e) { + delegate.printMessage( kind, msg, e ); + if ( kind == Kind.ERROR ) { + isErroneous = true; + } + } + + public void printMessage(Kind kind, CharSequence msg, Element e, AnnotationMirror a) { + delegate.printMessage( kind, msg, e, a ); + if ( kind == Kind.ERROR ) { + isErroneous = true; + } + } + + public void printMessage(Kind kind, CharSequence msg, Element e, AnnotationMirror a, AnnotationValue v) { + delegate.printMessage( kind, msg, e, a, v ); + if ( kind == Kind.ERROR ) { + isErroneous = true; + } + } + + public boolean isErroneous() { + return isErroneous; + } + } } diff --git a/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java b/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java index aa94dc1a1..70003e2f3 100644 --- a/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java +++ b/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java @@ -28,14 +28,12 @@ import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.processing.Messager; -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 javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; +import javax.tools.Diagnostic.Kind; import org.mapstruct.ap.MapperPrism; import org.mapstruct.ap.conversion.Conversion; @@ -77,10 +75,8 @@ public class MapperCreationProcessor implements ModelElementProcessor sourceElement) { + public Mapper process(ProcessorContext context, TypeElement mapperTypeElement, List sourceModel) { this.elementUtils = context.getElementUtils(); this.typeUtils = context.getTypeUtils(); this.messager = context.getMessager(); @@ -90,7 +86,7 @@ public class MapperCreationProcessor implements ModelElementProcessor methods) { ReportingPolicy unmappedTargetPolicy = getEffectiveUnmappedTargetPolicy( element ); List mappingMethods = getMappingMethods( methods, unmappedTargetPolicy ); @@ -110,8 +105,7 @@ public class MapperCreationProcessor implements ModelElementProcessor mappedTargetProperties.size() && unmappedTargetPolicy.requiresReport() ) { targetProperties.removeAll( mappedTargetProperties ); - printMessage( - unmappedTargetPolicy, + messager.printMessage( + unmappedTargetPolicy.getDiagnosticKind(), MessageFormat.format( "Unmapped target {0,choice,1#property|1 targetProperties) { for ( Mapping mappedProperty : method.getMappings().values() ) { if ( !sourceProperties.contains( mappedProperty.getSourceName() ) ) { - printMessage( - ReportingPolicy.ERROR, + messager.printMessage( + Kind.ERROR, String.format( "Unknown property \"%s\" in parameter type %s.", mappedProperty.getSourceName(), method.getSourceType() - ), method.getExecutable(), mappedProperty.getMirror(), mappedProperty.getSourceAnnotationValue() + ), + method.getExecutable(), + mappedProperty.getMirror(), + mappedProperty.getSourceAnnotationValue() ); } if ( !targetProperties.contains( mappedProperty.getTargetName() ) ) { - printMessage( - ReportingPolicy.ERROR, + messager.printMessage( + Kind.ERROR, String.format( "Unknown property \"%s\" in return type %s.", mappedProperty.getTargetName(), method.getTargetType() - ), method.getExecutable(), mappedProperty.getMirror(), mappedProperty.getTargetAnnotationValue() + ), + method.getExecutable(), + mappedProperty.getMirror(), + mappedProperty.getTargetAnnotationValue() ); } } @@ -397,51 +397,33 @@ public class MapperCreationProcessor implements ModelElementProcessor { @Override - public Void process(ProcessorContext context, TypeElement mapperTypeElement, Mapper sourceElement) { - if ( !sourceElement.isErroneous() ) { - writeToSourceFile( context.getFiler(), sourceElement ); + public Void process(ProcessorContext context, TypeElement mapperTypeElement, Mapper mapper) { + if ( !context.isErroneous() ) { + writeToSourceFile( context.getFiler(), mapper ); } + return null; } diff --git a/processor/src/main/java/org/mapstruct/ap/processor/MethodRetrievalProcessor.java b/processor/src/main/java/org/mapstruct/ap/processor/MethodRetrievalProcessor.java index 76b15bd8c..c5b432f6d 100644 --- a/processor/src/main/java/org/mapstruct/ap/processor/MethodRetrievalProcessor.java +++ b/processor/src/main/java/org/mapstruct/ap/processor/MethodRetrievalProcessor.java @@ -23,17 +23,16 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.processing.Messager; -import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Types; +import javax.tools.Diagnostic.Kind; import org.mapstruct.ap.MapperPrism; import org.mapstruct.ap.MappingPrism; import org.mapstruct.ap.MappingsPrism; -import org.mapstruct.ap.model.ReportingPolicy; import org.mapstruct.ap.model.Type; import org.mapstruct.ap.model.source.Mapping; import org.mapstruct.ap.model.source.Method; @@ -51,17 +50,17 @@ import static javax.lang.model.util.ElementFilter.methodsIn; * * @author Gunnar Morling */ -public class MethodRetrievalProcessor implements ModelElementProcessor> { +public class MethodRetrievalProcessor implements ModelElementProcessor> { - private Types typeUtils; private Messager messager; + private Types typeUtils; private TypeUtil typeUtil; private Executables executables; @Override - public List process(ProcessorContext context, TypeElement mapperTypeElement, TypeElement sourceElement) { - this.typeUtils = context.getTypeUtils(); + public List process(ProcessorContext context, TypeElement mapperTypeElement, Void sourceModel) { this.messager = context.getMessager(); + this.typeUtils = context.getTypeUtils(); this.typeUtil = new TypeUtil( context.getElementUtils(), typeUtils ); this.executables = new Executables( typeUtil ); @@ -148,8 +147,8 @@ public class MethodRetrievalProcessor implements ModelElementProcessor { Messager getMessager(); Options getOptions(); + + /** + * Whether the currently processed mapper type is erroneous which is the + * case if at least one diagnostic with {@link Kind#ERROR} is reported + * by any of the participating processors. + * + * @return {@code true} if the currently processed mapper type is + * erroneous, {@code false} otherwise. + */ + boolean isErroneous(); } /** @@ -66,7 +77,7 @@ public interface ModelElementProcessor { * @param context Context providing common infrastructure objects. * @param mapperTypeElement The original type element from which the given mapper object * is derived. - * @param sourceElement The current representation of the bean mapper. Never + * @param sourceModel The current representation of the bean mapper. Never * {@code null} (the very first processor receives the original * type element). * @@ -76,7 +87,7 @@ public interface ModelElementProcessor { * return {@code null} except for the very last processor which * generates the resulting Java source file. */ - R process(ProcessorContext context, TypeElement mapperTypeElement, P sourceElement); + R process(ProcessorContext context, TypeElement mapperTypeElement, P sourceModel); /** * Returns the priority value of this processor which must be between 1 diff --git a/processor/src/test/java/org/mapstruct/ap/testutil/MapperTestBase.java b/processor/src/test/java/org/mapstruct/ap/testutil/MapperTestBase.java index bb0fdf572..5d5b5e022 100644 --- a/processor/src/test/java/org/mapstruct/ap/testutil/MapperTestBase.java +++ b/processor/src/test/java/org/mapstruct/ap/testutil/MapperTestBase.java @@ -150,7 +150,7 @@ public abstract class MapperTestBase { while ( actualIterator.hasNext() ) { assertThat( expectedIterator.hasNext() ).describedAs( String.format( - "Found less diagnostics than expected. Actual: %s; Expected: %s.", + "Found more diagnostics than expected. Actual: %s; Expected: %s.", actualDiagnostics, expectedDiagnostics ) @@ -174,7 +174,7 @@ public abstract class MapperTestBase { assertThat( expectedIterator.hasNext() ).describedAs( String.format( - "Found more diagnostics than expected. Actual: %s; Expected: %s.", + "Found less diagnostics than expected. Actual: %s; Expected: %s.", actualDiagnostics, expectedDiagnostics )