From d92743ec2972e48f3dcbbba52d0e1d6e2c82c903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Reegn?= Date: Tue, 11 Oct 2016 19:20:12 +0200 Subject: [PATCH 1/2] make NOTE diagnostic printing in APT optional Since javac doesn't support hiding only NOTE diagnostic messages, you have to hide them together with WARN. That's usually not what you want however, since compiler WARN messages might point out bugs in your code, so you would want to leave them on. Solution is to not print NOTE by default and enable it with an additional compiler arg with -A: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#options With this change that means you can pass -Aquerydsl.logInfo=true will enable NOTE messages, but by default they are not logged. resolves #2032 --- .../java/com/querydsl/apt/APTOptions.java | 5 +++ .../apt/AbstractQuerydslProcessor.java | 43 +++++++++++++++---- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/querydsl-apt/src/main/java/com/querydsl/apt/APTOptions.java b/querydsl-apt/src/main/java/com/querydsl/apt/APTOptions.java index 5913b31d9..c8676e35a 100644 --- a/querydsl-apt/src/main/java/com/querydsl/apt/APTOptions.java +++ b/querydsl-apt/src/main/java/com/querydsl/apt/APTOptions.java @@ -96,6 +96,11 @@ public final class APTOptions { */ public static final String QUERYDSL_VARIABLE_NAME_FUNCTION_CLASS = "querydsl.variableNameFunctionClass"; + /** + * set whether info level messages should be written to stdout (default: false) + */ + public static final String QUERYDSL_LOG_INFO = "querydsl.logInfo"; + private APTOptions() { } } diff --git a/querydsl-apt/src/main/java/com/querydsl/apt/AbstractQuerydslProcessor.java b/querydsl-apt/src/main/java/com/querydsl/apt/AbstractQuerydslProcessor.java index 9a13d78c5..54ea1dace 100644 --- a/querydsl-apt/src/main/java/com/querydsl/apt/AbstractQuerydslProcessor.java +++ b/querydsl-apt/src/main/java/com/querydsl/apt/AbstractQuerydslProcessor.java @@ -13,6 +13,8 @@ */ package com.querydsl.apt; +import static com.querydsl.apt.APTOptions.*; + import java.io.IOException; import java.io.Writer; import java.lang.annotation.Annotation; @@ -26,7 +28,6 @@ import javax.lang.model.type.DeclaredType; import javax.lang.model.type.NoType; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.ElementFilter; -import javax.tools.Diagnostic; import javax.tools.Diagnostic.Kind; import javax.tools.JavaFileObject; @@ -63,16 +64,19 @@ public abstract class AbstractQuerydslProcessor extends AbstractProcessor { private Context context; + private boolean shouldLogInfo; + @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { - processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Running " + getClass().getSimpleName()); + setLogInfo(); + logInfo("Running " + getClass().getSimpleName()); if (roundEnv.processingOver() || annotations.size() == 0) { return ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS; } if (roundEnv.getRootElements() == null || roundEnv.getRootElements().isEmpty()) { - processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "No sources to process"); + logInfo("No sources to process"); return ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS; } @@ -504,27 +508,27 @@ public abstract class AbstractQuerydslProcessor extends AbstractProcessor { } private void serializeMetaTypes() { if (!context.supertypes.isEmpty()) { - processingEnv.getMessager().printMessage(Kind.NOTE, "Serializing Supertypes"); + logInfo("Serializing Supertypes"); serialize(conf.getSupertypeSerializer(), context.supertypes.values()); } if (!context.entityTypes.isEmpty()) { - processingEnv.getMessager().printMessage(Kind.NOTE, "Serializing Entity types"); + logInfo("Serializing Entity types"); serialize(conf.getEntitySerializer(), context.entityTypes.values()); } if (!context.extensionTypes.isEmpty()) { - processingEnv.getMessager().printMessage(Kind.NOTE, "Serializing Extension types"); + logInfo("Serializing Extension types"); serialize(conf.getEmbeddableSerializer(), context.extensionTypes.values()); } if (!context.embeddableTypes.isEmpty()) { - processingEnv.getMessager().printMessage(Kind.NOTE, "Serializing Embeddable types"); + logInfo("Serializing Embeddable types"); serialize(conf.getEmbeddableSerializer(), context.embeddableTypes.values()); } if (!context.projectionTypes.isEmpty()) { - processingEnv.getMessager().printMessage(Kind.NOTE, "Serializing Projection types"); + logInfo("Serializing Projection types"); serialize(conf.getDTOSerializer(), context.projectionTypes.values()); } @@ -539,6 +543,27 @@ public abstract class AbstractQuerydslProcessor extends AbstractProcessor { return SourceVersion.latestSupported(); } + @Override + public Set getSupportedOptions() { + Set optionKeys = new HashSet(); + optionKeys.add(QUERYDSL_LOG_INFO); + return optionKeys; + } + + private void setLogInfo() { + boolean hasProperty = processingEnv.getOptions().containsKey(QUERYDSL_LOG_INFO); + if (hasProperty) { + String val = processingEnv.getOptions().get(QUERYDSL_LOG_INFO); + shouldLogInfo = Boolean.parseBoolean(val); + } + } + + private void logInfo(String message) { + if (shouldLogInfo) { + processingEnv.getMessager().printMessage(Kind.NOTE, message); + } + } + private void serialize(Serializer serializer, Collection models) { for (EntityType model : models) { try { @@ -565,7 +590,7 @@ public abstract class AbstractQuerydslProcessor extends AbstractProcessor { } } - processingEnv.getMessager().printMessage(Kind.NOTE, "Generating " + className + " for " + elements); + logInfo("Generating " + className + " for " + elements); JavaFileObject fileObject = processingEnv.getFiler().createSourceFile(className, elements.toArray(new Element[elements.size()])); Writer writer = fileObject.openWriter(); From f52c728f15f70dce4822bb166b8fcd8f0a556cc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Reegn?= Date: Mon, 3 Apr 2017 22:41:41 +0200 Subject: [PATCH 2/2] add tests for enabling note logging --- .../querydsl/apt/AbstractProcessorTest.java | 12 +++- .../test/java/com/querydsl/apt/NoteTest.java | 63 +++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 querydsl-apt/src/test/java/com/querydsl/apt/NoteTest.java diff --git a/querydsl-apt/src/test/java/com/querydsl/apt/AbstractProcessorTest.java b/querydsl-apt/src/test/java/com/querydsl/apt/AbstractProcessorTest.java index 8a8b921ff..8d9bc00a5 100644 --- a/querydsl-apt/src/test/java/com/querydsl/apt/AbstractProcessorTest.java +++ b/querydsl-apt/src/test/java/com/querydsl/apt/AbstractProcessorTest.java @@ -66,8 +66,8 @@ public abstract class AbstractProcessorTest { options.addAll(getAPTOptions()); options.addAll(classes); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - ByteArrayOutputStream err = new ByteArrayOutputStream(); + ByteArrayOutputStream out = getStdOut(); + ByteArrayOutputStream err = getStdErr(); int compilationResult = compiler.run(null, out, err, options.toArray(new String[options.size()])); // Processor.elementCache.clear(); @@ -77,6 +77,14 @@ public abstract class AbstractProcessorTest { } } + protected ByteArrayOutputStream getStdOut() { + return new ByteArrayOutputStream(); + } + + protected ByteArrayOutputStream getStdErr() { + return new ByteArrayOutputStream(); + } + protected Collection getAPTOptions() { return Collections.emptyList(); } diff --git a/querydsl-apt/src/test/java/com/querydsl/apt/NoteTest.java b/querydsl-apt/src/test/java/com/querydsl/apt/NoteTest.java new file mode 100644 index 000000000..55bcd0ae9 --- /dev/null +++ b/querydsl-apt/src/test/java/com/querydsl/apt/NoteTest.java @@ -0,0 +1,63 @@ +package com.querydsl.apt; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import org.junit.Test; + +public class NoteTest extends AbstractProcessorTest { + + private Collection aptOptions; + + private ByteArrayOutputStream err = new ByteArrayOutputStream(); + + private static final String packagePath = "src/test/java/com/querydsl/apt/"; + + public void process() throws IOException { + List classes = getFiles(packagePath); + process(QuerydslAnnotationProcessor.class, classes, "includedClasses"); + } + + @Override + protected Collection getAPTOptions() { + return aptOptions; + } + + @Override + protected ByteArrayOutputStream getStdErr() { + return err; + } + + protected boolean isStdErrEmpty() { + return getStdErr().toByteArray().length == 0; + } + + @Test + public void processDefault() throws IOException { + aptOptions = Collections.emptyList(); + process(); + assertTrue(isStdErrEmpty()); + } + + @Test + public void processEnabled() throws IOException { + aptOptions = Arrays.asList("-Aquerydsl.logInfo=true"); + process(); + assertFalse(isStdErrEmpty()); + } + + @Test + public void processDisabled() throws IOException { + aptOptions = Arrays.asList("-Aquerydsl.logInfo=false"); + process(); + assertTrue(isStdErrEmpty()); + } + +}