diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/demo/pom.xml b/demo/pom.xml index 4d6ea58..e4d91c5 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -25,23 +25,11 @@ commons-beanutils 1.9.4 - - edu.jhuapl.ses.saa - crucible-all - 1.0.0-b74-7d477359 - pom - edu.jhuapl.ses.srn jackfruit ${project.parent.version} - - junit - junit - 4.11 - test - diff --git a/demo/src/main/java/crucible/crust/logging/Log4j2Configurator.java b/demo/src/main/java/crucible/crust/logging/Log4j2Configurator.java new file mode 100644 index 0000000..628f77c --- /dev/null +++ b/demo/src/main/java/crucible/crust/logging/Log4j2Configurator.java @@ -0,0 +1,179 @@ +package crucible.crust.logging; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.appender.ConsoleAppender; +import org.apache.logging.log4j.core.appender.FileAppender; +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.Configurator; +import org.apache.logging.log4j.core.config.DefaultConfiguration; +import org.apache.logging.log4j.core.config.LoggerConfig; +import org.apache.logging.log4j.core.layout.PatternLayout; + +/** + * A simple configuration class. + *

+ * Default settings: + *

+ * + * @author nairah1 + * + */ +public class Log4j2Configurator { + + private PatternLayout layout; + private final Map fileAppenders; + + private static Log4j2Configurator instance = null; + + /** + * + * @return an instance of this singleton class. + */ + synchronized public static Log4j2Configurator getInstance() { + if (instance == null) { + instance = new Log4j2Configurator(); + } + return instance; + } + + private Log4j2Configurator() { + final LoggerContext loggerContext = LoggerContext.getContext(false); + final Configuration config = loggerContext.getConfiguration(); + layout = PatternLayout.newBuilder().withPattern(DefaultConfiguration.DEFAULT_PATTERN) + .withConfiguration(config).build(); + fileAppenders = new HashMap<>(); + setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%c{1}:%L] %msg%n%throwable"); + setLevel(Level.INFO); + } + + /** + * + * @return a map of logger names to {@link LoggerConfig} + */ + private Map getLoggerMap() { + final LoggerContext loggerContext = LoggerContext.getContext(false); + final Configuration config = loggerContext.getConfiguration(); + + Map loggerMap = new HashMap<>(config.getLoggers()); + loggerMap.put(LogManager.getRootLogger().getName(), + config.getLoggerConfig(LogManager.getRootLogger().getName())); + return Collections.unmodifiableMap(loggerMap); + } + + /** + * + * + * @param filename Append log to named file, or create it if it doesn't exist. + */ + public void addFile(String filename) { + final LoggerContext loggerContext = LoggerContext.getContext(false); + Map loggerMap = getLoggerMap(); + + FileAppender appender = FileAppender.newBuilder().setName(filename).withFileName(filename) + .setLayout(layout).build(); + appender.start(); + + for (String loggerName : loggerMap.keySet()) { + LoggerConfig loggerConfig = loggerMap.get(loggerName); + loggerConfig.addAppender(appender, null, null); + } + loggerContext.updateLoggers(); + fileAppenders.put(filename, appender); + } + + /** + * + * + * @param filename Stop logging to named file. + */ + public void removeFile(String filename) { + if (fileAppenders.containsKey(filename)) { + final LoggerContext loggerContext = LoggerContext.getContext(false); + Map loggerMap = getLoggerMap(); + + FileAppender appender = fileAppenders.get(filename); + for (String loggerName : loggerMap.keySet()) { + LoggerConfig loggerConfig = loggerMap.get(loggerName); + loggerConfig.removeAppender(appender.getName()); + } + loggerContext.updateLoggers(); + fileAppenders.remove(filename); + } + } + + /** + * + * @param pattern layout pattern for all {@link ConsoleAppender} and {@link FileAppender} objects. + */ + public void setPattern(String pattern) { + final LoggerContext loggerContext = LoggerContext.getContext(false); + final Configuration config = loggerContext.getConfiguration(); + + layout = PatternLayout.newBuilder().withConfiguration(config).withPattern(pattern).build(); + + Map loggerMap = getLoggerMap(); + for (String loggerName : loggerMap.keySet()) { + LoggerConfig loggerConfig = loggerMap.get(loggerName); + Map appenderMap = loggerConfig.getAppenders(); + for (String appenderName : appenderMap.keySet()) { + Appender newAppender = null; + Appender oldAppender = appenderMap.get(appenderName); + + // there should be a better way to do this - a toBuilder() method on the appender would be + // really useful + if (oldAppender instanceof ConsoleAppender) { + newAppender = ConsoleAppender.newBuilder().setName(appenderName).setConfiguration(config) + .setLayout(layout).build(); + } else if (oldAppender instanceof FileAppender) { + newAppender = FileAppender.newBuilder().setName(appenderName).setConfiguration(config) + .withFileName(((FileAppender) oldAppender).getFileName()).setLayout(layout).build(); + } + if (newAppender != null) { + newAppender.start(); + loggerConfig.removeAppender(appenderName); + loggerConfig.addAppender(newAppender, null, null); + } + } + } + loggerContext.updateLoggers(); + } + + /** + * Sets the levels of parentLogger and all 'child' loggers to the given + * level. This is simply a call to + * + *
+   * Configurator.setAllLevels(parentLogger, level)
+   * 
+ * + * @param parentLogger + * @param level + */ + public void setLevel(String parentLogger, Level level) { + Configurator.setAllLevels(parentLogger, level); + } + + /** + * Set all logger levels. This is simply a call to + * + *
+   * setLevel(LogManager.getRootLogger().getName(), level)
+   * 
+ * + * @param level + */ + public void setLevel(Level level) { + setLevel(LogManager.getRootLogger().getName(), level); + } + +} diff --git a/demo/src/main/java/jackfruit/demo/SomeRandomClass.java b/demo/src/main/java/jackfruit/demo/SomeRandomClass.java index 56ea285..e6f573b 100644 --- a/demo/src/main/java/jackfruit/demo/SomeRandomClass.java +++ b/demo/src/main/java/jackfruit/demo/SomeRandomClass.java @@ -2,7 +2,7 @@ package jackfruit.demo; public class SomeRandomClass { - private String internalString; + private final String internalString; public String getInternalString() { return internalString; diff --git a/demo/src/test/java/jackfruit/demo/TestProcessor.java b/demo/src/test/java/jackfruit/demo/TestProcessor.java index adf3738..2f90b80 100644 --- a/demo/src/test/java/jackfruit/demo/TestProcessor.java +++ b/demo/src/test/java/jackfruit/demo/TestProcessor.java @@ -1,9 +1,11 @@ package jackfruit.demo; +import crucible.crust.logging.Log4j2Configurator; +import jackfruit.processor.ConfigProcessor; import java.io.File; import java.io.PrintWriter; -import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.Set; import javax.tools.JavaCompiler; import javax.tools.JavaCompiler.CompilationTask; @@ -13,8 +15,6 @@ import javax.tools.StandardJavaFileManager; import javax.tools.StandardLocation; import javax.tools.ToolProvider; import org.junit.Test; -import crucible.crust.logging.Log4j2Configurator; -import jackfruit.processor.ConfigProcessor; /** * From fileKinds = Collections.singleton(Kind.SOURCE); return files.list(StandardLocation.SOURCE_PATH, "", fileKinds, true); diff --git a/jackfruit/pom.xml b/jackfruit/pom.xml index 3d1ed10..7ba46e4 100644 --- a/jackfruit/pom.xml +++ b/jackfruit/pom.xml @@ -30,17 +30,11 @@ 3.10.1 - 2.19.0 + 2.20.0 2.9.2 - - junit - junit - 4.11 - test - com.google.auto.service auto-service diff --git a/jackfruit/src/main/bash/createVersionFile.bash b/jackfruit/src/main/bash/createVersionFile.bash index 3aa4238..f16ca14 100755 --- a/jackfruit/src/main/bash/createVersionFile.bash +++ b/jackfruit/src/main/bash/createVersionFile.bash @@ -2,23 +2,29 @@ # This script is run from maven. See the exec-maven-plugin block in the pom.xml file. -cd $(dirname $0) +package=jackfruit +srcFile="../java/jackfruit/JackfruitVersion.java" -rev=$(git rev-parse --verify --short=8 HEAD) -if [ $? -gt 0 ]; then - rev="UNKNOWN" -fi - -branch=$(git symbolic-ref --short HEAD) -if [ $? -gt 0 ]; then - branch="UNKNOWN" -fi +cd $(dirname "$0") date=$(date -u +"%y.%m.%d") -package=jackfruit -srcFile="../java/jackfruit/JackfruitVersion.java" -mkdir -p $(dirname $srcFile) +rev=$(git rev-parse --verify --short HEAD) +if [ $? -gt 0 ]; then + lastCommit=$(date -u +"%y.%m.%d") + rev="UNVERSIONED" +else + lastCommit=$(git log -1 --format=%cd --date=format:%y.%m.%d) + rev=$(git rev-parse --verify --short HEAD) + + if [[ $(git diff --stat) != '' ]]; then + if [[ $(git status -s | grep -v pom.xml | grep -v pom.bak | grep -v .m2 | grep -v $srcFile) != '' ]]; then + rev=${rev}M + fi + fi +fi + +mkdir -p $(dirname "$srcFile") touch $srcFile @@ -27,10 +33,11 @@ cat < $srcFile package jackfruit; public class JackfruitVersion { - public final static String rev = new String("$rev"); - public final static String packageName = new String("$package"); - public final static String dateString = new String("$date"); - public final static String branch = new String("$branch"); + public final static String lastCommit = "$lastCommit"; + // an M at the end of gitRevision means this was built from a "dirty" git repository + public final static String rev = "$rev"; + public final static String packageName = "$package"; + public final static String dateString = "$date"; } EOF diff --git a/jackfruit/src/main/java/jackfruit/JackfruitVersion.java b/jackfruit/src/main/java/jackfruit/JackfruitVersion.java index 896b8e9..395f2c0 100644 --- a/jackfruit/src/main/java/jackfruit/JackfruitVersion.java +++ b/jackfruit/src/main/java/jackfruit/JackfruitVersion.java @@ -2,9 +2,10 @@ package jackfruit; public class JackfruitVersion { - public final static String rev = new String("9ad69b62"); - public final static String packageName = new String("jackfruit"); - public final static String dateString = new String("22.11.27"); - public final static String branch = new String("UNKNOWN"); + public final static String lastCommit = "23.03.29"; + // an M at the end of gitRevision means this was built from a "dirty" git repository + public final static String rev = "b200487M"; + public final static String packageName = "jackfruit"; + public final static String dateString = "23.03.29"; } diff --git a/jackfruit/src/main/java/jackfruit/annotations/Comment.java b/jackfruit/src/main/java/jackfruit/annotations/Comment.java index 4dd14da..33c2820 100644 --- a/jackfruit/src/main/java/jackfruit/annotations/Comment.java +++ b/jackfruit/src/main/java/jackfruit/annotations/Comment.java @@ -15,5 +15,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.SOURCE) @Target(ElementType.METHOD) public @interface Comment { - public String value() default ""; + String value() default ""; } diff --git a/jackfruit/src/main/java/jackfruit/annotations/DefaultValue.java b/jackfruit/src/main/java/jackfruit/annotations/DefaultValue.java index a282e96..ab5dd23 100644 --- a/jackfruit/src/main/java/jackfruit/annotations/DefaultValue.java +++ b/jackfruit/src/main/java/jackfruit/annotations/DefaultValue.java @@ -19,5 +19,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.SOURCE) @Target(ElementType.METHOD) public @interface DefaultValue { - public String value() default ""; + String value() default ""; } diff --git a/jackfruit/src/main/java/jackfruit/annotations/Jackfruit.java b/jackfruit/src/main/java/jackfruit/annotations/Jackfruit.java index df5aeca..7527c2d 100644 --- a/jackfruit/src/main/java/jackfruit/annotations/Jackfruit.java +++ b/jackfruit/src/main/java/jackfruit/annotations/Jackfruit.java @@ -21,5 +21,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.SOURCE) @Target(ElementType.TYPE) public @interface Jackfruit { - public String prefix() default ""; + String prefix() default ""; } diff --git a/jackfruit/src/main/java/jackfruit/annotations/Key.java b/jackfruit/src/main/java/jackfruit/annotations/Key.java index c1822ac..4e33761 100644 --- a/jackfruit/src/main/java/jackfruit/annotations/Key.java +++ b/jackfruit/src/main/java/jackfruit/annotations/Key.java @@ -15,5 +15,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.SOURCE) @Target(ElementType.METHOD) public @interface Key { - public String value() default ""; + String value() default ""; } diff --git a/jackfruit/src/main/java/jackfruit/annotations/Parser.java b/jackfruit/src/main/java/jackfruit/annotations/Parser.java index ea43d51..00a6918 100644 --- a/jackfruit/src/main/java/jackfruit/annotations/Parser.java +++ b/jackfruit/src/main/java/jackfruit/annotations/Parser.java @@ -8,7 +8,7 @@ package jackfruit.annotations; * @param */ public interface Parser { - public T fromString(String s); + T fromString(String s); - public String toString(T t); + String toString(T t); } diff --git a/jackfruit/src/main/java/jackfruit/annotations/ParserClass.java b/jackfruit/src/main/java/jackfruit/annotations/ParserClass.java index 5ba95fa..40cf284 100644 --- a/jackfruit/src/main/java/jackfruit/annotations/ParserClass.java +++ b/jackfruit/src/main/java/jackfruit/annotations/ParserClass.java @@ -15,5 +15,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.SOURCE) @Target(ElementType.METHOD) public @interface ParserClass { - public Class value(); + Class value(); } diff --git a/jackfruit/src/main/java/jackfruit/processor/AnnotationBundle.java b/jackfruit/src/main/java/jackfruit/processor/AnnotationBundle.java index 3bdabb2..658e40a 100644 --- a/jackfruit/src/main/java/jackfruit/processor/AnnotationBundle.java +++ b/jackfruit/src/main/java/jackfruit/processor/AnnotationBundle.java @@ -1,64 +1,51 @@ package jackfruit.processor; +import jackfruit.annotations.Parser; import java.util.List; import java.util.Optional; import javax.lang.model.type.TypeMirror; import org.immutables.value.Value; -import jackfruit.annotations.Parser; /** * Holds annotation information and other metadata about an annotated method. - * - * @author nairah1 * + * @author nairah1 */ @Value.Immutable public abstract class AnnotationBundle { /** - * * @return the return type of this method without any parameters (e.g. return List rather than - * List<String>) + * List<String>) */ public abstract TypeMirror erasure(); /** - * * @return the parameterized types, if any of this method (e.g. return String if the annotated - * method returns List<String>) + * method returns List<String>) */ public abstract List typeArgs(); /** - * Comment for this configuration parameter. This can be blank. - * - * @return + * @return Comment for this configuration parameter. This can be blank. */ public abstract String comment(); /** - * Default value for this configuration parameter. This is required. - * - * @return + * @return Default value for this configuration parameter. This is required. */ public abstract String defaultValue(); /** - * Key used in the configuration file. If omitted, default value is the name of the configuration - * parameter (the method name). - * - * @return + * @return Key used in the configuration file. If omitted, default value is the name of the + * configuration parameter (the method name). */ public abstract String key(); /** - * If this configuration parameter is not a string or primitive/boxed type, this class will - * convert the string to the proper object and vice versa. This class must implement - * {@link Parser}. - * - * @return + * @return If this configuration parameter is not a string or primitive/boxed type, this class + * will convert the string to the proper object and vice versa. This class must implement + * {@link Parser}. */ public abstract Optional parserClass(); - - } diff --git a/jackfruit/src/main/java/jackfruit/processor/ConfigFactory.java b/jackfruit/src/main/java/jackfruit/processor/ConfigFactory.java index b04a425..c15075f 100644 --- a/jackfruit/src/main/java/jackfruit/processor/ConfigFactory.java +++ b/jackfruit/src/main/java/jackfruit/processor/ConfigFactory.java @@ -7,47 +7,38 @@ import org.apache.commons.configuration2.PropertiesConfigurationLayout; /** * This interface converts instances of annotated interfaces of type T to Apache Commons * Configuration files and vice versa. - * - * @author nairah1 * + * @author nairah1 * @param */ public interface ConfigFactory { /** - * This returns an object of type T with default values. - * - * @return + * @return This returns an object of type T with default values. */ T getTemplate(); /** - * This creates an object of type T from the supplied Apache Commons {@link Configuration}. - * - * @param config - * @return + * @param config configuration to turn into an object of type T + * @return an object of type T from the supplied Apache Commons {@link Configuration}. */ T fromConfig(Configuration config); /** - * This creates an Apache Commons {@link PropertiesConfiguration} from the supplied object T. - * - * @param t + * @param t object to convert to a configuration * @param layout used for formatting the returned PropertiesConfiguration - * @return + * @return an Apache Commons {@link PropertiesConfiguration} from the supplied object T. */ PropertiesConfiguration toConfig(T t, PropertiesConfigurationLayout layout); /** - * This creates an Apache Commons {@link PropertiesConfiguration} from the supplied object T. This - * is simply a call to {@link #toConfig(Object, PropertiesConfigurationLayout)} with a new + * This is simply a call to {@link #toConfig(Object, PropertiesConfigurationLayout)} with a new * PropertiesConfigurationLayout(). - * - * @param t - * @return + * + * @param t object to convert to a configuration + * @return an Apache Commons {@link PropertiesConfiguration} from the supplied object T. */ default PropertiesConfiguration toConfig(T t) { return toConfig(t, new PropertiesConfigurationLayout()); } - } diff --git a/jackfruit/src/main/java/jackfruit/processor/ConfigProcessor.java b/jackfruit/src/main/java/jackfruit/processor/ConfigProcessor.java index 632a424..b87f130 100644 --- a/jackfruit/src/main/java/jackfruit/processor/ConfigProcessor.java +++ b/jackfruit/src/main/java/jackfruit/processor/ConfigProcessor.java @@ -95,10 +95,9 @@ public class ConfigProcessor extends AbstractProcessor { for (Element element : annotatedElements) { try { - if (element instanceof TypeElement) { - TypeElement annotatedType = (TypeElement) element; + if (element instanceof TypeElement annotatedType) { - Jackfruit configParams = (Jackfruit) annotatedType.getAnnotation(Jackfruit.class); + Jackfruit configParams = annotatedType.getAnnotation(Jackfruit.class); String prefix = configParams.prefix().strip(); if (prefix.length() > 0 && !prefix.endsWith(".")) prefix += "."; @@ -161,9 +160,9 @@ public class ConfigProcessor extends AbstractProcessor { Map defaultAnnotationsMap = new LinkedHashMap<>(); for (DeclaredType thisType : classHierarchy) { for (Element e : thisType.asElement().getEnclosedElements()) { - if (e.getKind() == ElementKind.METHOD && e.getAnnotation(DefaultValue.class) != null - && e instanceof ExecutableElement) { - ExecutableElement ex = (ExecutableElement) e; + if (e.getKind() == ElementKind.METHOD + && e.getAnnotation(DefaultValue.class) != null + && e instanceof ExecutableElement ex) { enclosedMethods.put(ex.getSimpleName(), ex); AnnotationBundle defaultValues = defaultAnnotationsMap.get(ex.getSimpleName()); defaultAnnotationsMap.put(ex.getSimpleName(), @@ -301,8 +300,7 @@ public class ConfigProcessor extends AbstractProcessor { builder.comment(((Comment) annotation).value()); } else if (annotation instanceof DefaultValue) { builder.defaultValue(((DefaultValue) annotation).value()); - } else if (annotation instanceof ParserClass) { - ParserClass pc = (ParserClass) annotation; + } else if (annotation instanceof ParserClass pc) { // this works, but there has to be a better way? TypeMirror tm; @@ -334,7 +332,7 @@ public class ConfigProcessor extends AbstractProcessor { * @param tvn * @param m * @param annotationsMap - * @param prefix + * @param prefixMemberName * @return */ private MethodSpec buildToConfig(TypeVariableName tvn, Method m, @@ -554,6 +552,12 @@ public class ConfigProcessor extends AbstractProcessor { .addModifiers(Modifier.PUBLIC).addAnnotation(Override.class) .returns(TypeName.get(method.getReturnType())).addJavadoc(bundle.comment()); + builder.addStatement("String key = $N + $S", prefix, bundle.key()); + builder + .beginControlFlow("if (!config.containsKey(key))") + .addStatement("throw new $T($S + key)", RuntimeException.class, "No such key") + .endControlFlow(); + TypeMirror parser = null; String parserName = null; if (bundle.parserClass().isPresent()) { @@ -570,8 +574,7 @@ public class ConfigProcessor extends AbstractProcessor { ParameterizedTypeName.get(ClassName.get(java.util.ArrayList.class), argType); String listName = method.getSimpleName() + "List"; builder.addStatement("$T " + listName + " = new $T()", listType, arrayListType); - builder.addStatement("String [] parts = config.getStringArray($N + $S)", prefix, - bundle.key()); + builder.addStatement("String [] parts = config.getStringArray(key)"); builder.beginControlFlow("for (String part : parts)"); builder.beginControlFlow("if (part.trim().length() > 0)"); if (bundle.parserClass().isPresent()) { @@ -600,25 +603,24 @@ public class ConfigProcessor extends AbstractProcessor { builder.addStatement("return $L", listName); } else { if (bundle.parserClass().isPresent()) { - builder.addStatement("return $L.fromString(config.getString($N + $S))", parserName, - prefix, bundle.key()); + builder.addStatement("return $L.fromString(config.getString(key))", parserName); } else { if (ConfigProcessorUtils.isBoolean(bundle.erasure(), processingEnv)) { - builder.addStatement("return config.getBoolean($N + $S)", prefix, bundle.key()); + builder.addStatement("return config.getBoolean(key)"); } else if (ConfigProcessorUtils.isByte(bundle.erasure(), processingEnv)) { - builder.addStatement("return config.getByte($N + $S)", prefix, bundle.key()); + builder.addStatement("return config.getByte(key)"); } else if (ConfigProcessorUtils.isDouble(bundle.erasure(), processingEnv)) { - builder.addStatement("return config.getDouble($N + $S)", prefix, bundle.key()); + builder.addStatement("return config.getDouble(key)"); } else if (ConfigProcessorUtils.isFloat(bundle.erasure(), processingEnv)) { - builder.addStatement("return config.getFloat($N + $S)", prefix, bundle.key()); + builder.addStatement("return config.getFloat(key)"); } else if (ConfigProcessorUtils.isInteger(bundle.erasure(), processingEnv)) { - builder.addStatement("return config.getInt($N + $S)", prefix, bundle.key()); + builder.addStatement("return config.getInt(key)"); } else if (ConfigProcessorUtils.isLong(bundle.erasure(), processingEnv)) { - builder.addStatement("return config.getLong($N + $S)", prefix, bundle.key()); + builder.addStatement("return config.getLong(key)"); } else if (ConfigProcessorUtils.isShort(bundle.erasure(), processingEnv)) { - builder.addStatement("return config.getShort($N + $S)", prefix, bundle.key()); + builder.addStatement("return config.getShort(key)"); } else if (ConfigProcessorUtils.isString(bundle.erasure(), processingEnv)) { - builder.addStatement("return config.getString($N + $S)", prefix, bundle.key()); + builder.addStatement("return config.getString(key)"); } else { processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Can't handle return type " + m.getReturnType().getCanonicalName()); diff --git a/jackfruit/src/main/java/jackfruit/processor/ConfigProcessorUtils.java b/jackfruit/src/main/java/jackfruit/processor/ConfigProcessorUtils.java index 1744a42..c773ed7 100644 --- a/jackfruit/src/main/java/jackfruit/processor/ConfigProcessorUtils.java +++ b/jackfruit/src/main/java/jackfruit/processor/ConfigProcessorUtils.java @@ -10,123 +10,114 @@ import javax.tools.Diagnostic; public class ConfigProcessorUtils { /** - * * @param processingEnv * @return true if this annotated member returns a {@link List} */ - public final static boolean isList(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { + public static boolean isList(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { return isClass(typeMirror, processingEnv, java.util.List.class); } /** - * - * @param typeMirror either {@link #erasure()} for the return value, or an element of - * {@link #typeArgs()} for a parameterized type + * @param typeMirror either {@link AnnotationBundle#erasure()} for the return value, or an element of {@link + * AnnotationBundle#typeArgs()} for a parameterized type * @param processingEnv * @return true if this annotated member returns a {@link Boolean} or primitive boolean */ - public final static boolean isBoolean(TypeMirror typeMirror, - ProcessingEnvironment processingEnv) { + public static boolean isBoolean(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { return isClass(typeMirror, processingEnv, java.lang.Boolean.class) || typeMirror.getKind() == TypeKind.BOOLEAN; } /** - * - * @param typeMirror either {@link #erasure()} for the return value, or an element of - * {@link #typeArgs()} for a parameterized type + * @param typeMirror either {@link AnnotationBundle#erasure()} for the return value, or an element of {@link + * AnnotationBundle#typeArgs()} for a parameterized type * @param processingEnv * @return true if this annotated member returns a {@link Byte} or primitive byte */ - public final static boolean isByte(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { + public static boolean isByte(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { return isClass(typeMirror, processingEnv, java.lang.Byte.class) || typeMirror.getKind() == TypeKind.BYTE; } /** - * - * @param typeMirror either {@link #erasure()} for the return value, or an element of - * {@link #typeArgs()} for a parameterized type + * @param typeMirror either {@link AnnotationBundle#erasure()} for the return value, or an element of {@link + * AnnotationBundle#typeArgs()} for a parameterized type * @param processingEnv * @return true if this annotated member returns a {@link Double} or primitive double */ - public final static boolean isDouble(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { + public static boolean isDouble(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { return isClass(typeMirror, processingEnv, java.lang.Double.class) || typeMirror.getKind() == TypeKind.DOUBLE; } /** - * - * @param typeMirror either {@link #erasure()} for the return value, or an element of - * {@link #typeArgs()} for a parameterized type + * @param typeMirror either {@link AnnotationBundle#erasure()} for the return value, or an element of {@link + * AnnotationBundle#typeArgs()} for a parameterized type * @param processingEnv * @return true if this annotated member returns a {@link Float} or primitive float */ - public final static boolean isFloat(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { + public static boolean isFloat(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { return isClass(typeMirror, processingEnv, java.lang.Float.class) || typeMirror.getKind() == TypeKind.FLOAT; } /** - * - * @param typeMirror either {@link #erasure()} for the return value, or an element of - * {@link #typeArgs()} for a parameterized type + * @param typeMirror either {@link AnnotationBundle#erasure()} for the return value, or an element of {@link + * AnnotationBundle#typeArgs()} for a parameterized type * @param processingEnv * @return true if this annotated member returns a {@link Integer} or primitive int */ - public final static boolean isInteger(TypeMirror typeMirror, - ProcessingEnvironment processingEnv) { + public static boolean isInteger(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { return isClass(typeMirror, processingEnv, java.lang.Integer.class) || typeMirror.getKind() == TypeKind.INT; } /** - * - * @param typeMirror either {@link #erasure()} for the return value, or an element of - * {@link #typeArgs()} for a parameterized type + * @param typeMirror either {@link AnnotationBundle#erasure()} for the return value, or an element of {@link + * AnnotationBundle#typeArgs()} for a parameterized type * @param processingEnv * @return true if this annotated member returns a {@link Long} or primitive long */ - public final static boolean isLong(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { + public static boolean isLong(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { return isClass(typeMirror, processingEnv, java.lang.Long.class) || typeMirror.getKind() == TypeKind.LONG; } /** - * - * @param typeMirror either {@link #erasure()} for the return value, or an element of - * {@link #typeArgs()} for a parameterized type + * @param typeMirror either {@link AnnotationBundle#erasure()} for the return value, or an element of {@link + * AnnotationBundle#typeArgs()} for a parameterized type * @param processingEnv * @return true if this annotated member returns a {@link Short} or primitive float */ - public final static boolean isShort(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { + public static boolean isShort(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { return isClass(typeMirror, processingEnv, java.lang.Short.class) || typeMirror.getKind() == TypeKind.SHORT; } /** - * - * @param typeMirror either {@link #erasure()} for the return value, or an element of - * {@link #typeArgs()} for a parameterized type + * @param typeMirror either {@link AnnotationBundle#erasure()} for the return value, or an element of {@link + * AnnotationBundle#typeArgs()} for a parameterized type * @param processingEnv * @return true if this annotated member returns a {@link String} */ - public final static boolean isString(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { + public static boolean isString(TypeMirror typeMirror, ProcessingEnvironment processingEnv) { return isClass(typeMirror, processingEnv, java.lang.String.class); } - private final static boolean isClass(TypeMirror typeMirror, ProcessingEnvironment processingEnv, - Class compareTo) { + private static boolean isClass( + TypeMirror typeMirror, ProcessingEnvironment processingEnv, Class compareTo) { Elements elements = processingEnv.getElementUtils(); Types types = processingEnv.getTypeUtils(); if (elements.getTypeElement(compareTo.getCanonicalName()) == null) { - processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, - String.format("Cannot recognize %s\n", compareTo.getCanonicalName())); + processingEnv + .getMessager() + .printMessage( + Diagnostic.Kind.ERROR, + String.format("Cannot recognize %s\n", compareTo.getCanonicalName())); } - return types.isSubtype(typeMirror, - types.erasure(elements.getTypeElement(compareTo.getCanonicalName()).asType())); + return types.isSubtype( + typeMirror, types.erasure(elements.getTypeElement(compareTo.getCanonicalName()).asType())); } - } diff --git a/pom.xml b/pom.xml index 72972be..d46445e 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ junit junit - 4.11 + 4.13.2 test