From 578c7ad5325f27367999ea4e2cdcc628a0d8b519 Mon Sep 17 00:00:00 2001 From: sipkab <10866741+Sipkab@users.noreply.github.com> Date: Wed, 5 Feb 2020 08:46:21 +0100 Subject: [PATCH] Allow -A option based processor configuration --- .../OptionBasedRecordBuilderMetaData.java | 122 ++++++++++++++++++ .../RecordBuilderMetaDataLoader.java | 45 ++++--- .../processor/RecordBuilderProcessor.java | 2 +- 3 files changed, 151 insertions(+), 18 deletions(-) create mode 100644 record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/OptionBasedRecordBuilderMetaData.java diff --git a/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/OptionBasedRecordBuilderMetaData.java b/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/OptionBasedRecordBuilderMetaData.java new file mode 100644 index 0000000..f6a88ba --- /dev/null +++ b/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/OptionBasedRecordBuilderMetaData.java @@ -0,0 +1,122 @@ +/** + * Copyright 2019 Jordan Zimmerman + * + * 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 io.soabase.recordbuilder.processor; + +import java.util.Map; + +import io.soabase.recordbuilder.core.RecordBuilderMetaData; + +public class OptionBasedRecordBuilderMetaData implements RecordBuilderMetaData { + /** + * @see #suffix() + */ + public static final String OPTION_SUFFIX = "suffix"; + /** + * @see #copyMethodName() + */ + public static final String OPTION_COPY_METHOD_NAME = "copyMethodName"; + /** + * @see #builderMethodName() + */ + public static final String OPTION_BUILDER_METHOD_NAME = "builderMethodName"; + /** + * @see #buildMethodName() + */ + public static final String OPTION_BUILD_METHOD_NAME = "buildMethodName"; + /** + * @see #componentsMethodName() + */ + public static final String OPTION_COMPONENTS_METHOD_NAME = "componentsMethodName"; + /** + * @see #fileComment() + */ + public static final String OPTION_FILE_COMMENT = "fileComment"; + /** + * @see #fileIndent() + */ + public static final String OPTION_FILE_INDENT = "fileIndent"; + /** + * @see #prefixEnclosingClassNames() + */ + public static final String OPTION_PREFIX_ENCLOSING_CLASS_NAMES = "prefixEnclosingClassNames"; + + private final String suffix; + private final String copyMethodName; + private final String builderMethodName; + private final String buildMethodName; + private final String componentsMethodName; + private final String fileComment; + private final String fileIndent; + private final boolean prefixEnclosingClassNames; + + public OptionBasedRecordBuilderMetaData(Map options) { + suffix = options.getOrDefault(OPTION_SUFFIX, "Builder"); + builderMethodName = options.getOrDefault(OPTION_BUILDER_METHOD_NAME, "builder"); + copyMethodName = options.getOrDefault(OPTION_COPY_METHOD_NAME, builderMethodName); + buildMethodName = options.getOrDefault(OPTION_BUILD_METHOD_NAME, "build"); + componentsMethodName = options.getOrDefault(OPTION_COMPONENTS_METHOD_NAME, "stream"); + fileComment = options.getOrDefault(OPTION_FILE_COMMENT, + "Auto generated by io.soabase.recordbuilder.core.RecordBuilder: https://github.com/Randgalt/record-builder"); + fileIndent = options.getOrDefault(OPTION_FILE_INDENT, " "); + String prefixenclosingclassnamesopt = options.get(OPTION_PREFIX_ENCLOSING_CLASS_NAMES); + if (prefixenclosingclassnamesopt == null) { + prefixEnclosingClassNames = true; + } else { + prefixEnclosingClassNames = Boolean.parseBoolean(prefixenclosingclassnamesopt); + } + } + + @Override + public String suffix() { + return suffix; + } + + @Override + public String copyMethodName() { + return copyMethodName; + } + + @Override + public String builderMethodName() { + return builderMethodName; + } + + @Override + public String buildMethodName() { + return buildMethodName; + } + + @Override + public String componentsMethodName() { + return componentsMethodName; + } + + @Override + public String fileComment() { + return fileComment; + } + + @Override + public String fileIndent() { + return fileIndent; + } + + @Override + public boolean prefixEnclosingClassNames() { + return prefixEnclosingClassNames; + } + +} diff --git a/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/RecordBuilderMetaDataLoader.java b/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/RecordBuilderMetaDataLoader.java index 223b67e..e0484c5 100644 --- a/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/RecordBuilderMetaDataLoader.java +++ b/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/RecordBuilderMetaDataLoader.java @@ -17,26 +17,37 @@ package io.soabase.recordbuilder.processor; import io.soabase.recordbuilder.core.RecordBuilderMetaData; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; import java.util.function.Consumer; +import javax.annotation.processing.ProcessingEnvironment; + class RecordBuilderMetaDataLoader { - private final RecordBuilderMetaData metaData; + private final RecordBuilderMetaData metaData; - RecordBuilderMetaDataLoader(String metaDataClassName, Consumer logger) { - RecordBuilderMetaData localMetaData = null; - if ((metaDataClassName != null) && !metaDataClassName.isEmpty()) { - try { - Class clazz = Class.forName(metaDataClassName); - localMetaData = (RecordBuilderMetaData) clazz.getDeclaredConstructor().newInstance(); - logger.accept("Found meta data: " + localMetaData.getClass()); - } catch (Exception e) { - logger.accept("Could not load meta data: " + metaDataClassName + " - " + e.getMessage()); - } - } - metaData = (localMetaData != null) ? localMetaData : RecordBuilderMetaData.DEFAULT; - } + RecordBuilderMetaDataLoader(ProcessingEnvironment processingEnv, Consumer logger) { + Map options = processingEnv.getOptions(); + String metaDataClassName = options.get(RecordBuilderMetaData.JAVAC_OPTION_NAME); + if ((metaDataClassName != null) && !metaDataClassName.isEmpty()) { + RecordBuilderMetaData loadedMetaData = null; + try { + Class clazz = Class.forName(metaDataClassName); + loadedMetaData = (RecordBuilderMetaData) clazz.getDeclaredConstructor().newInstance(); + logger.accept("Found meta data: " + clazz); + } catch (InvocationTargetException e) { + // log the thrown exception instead of the invocation target exception + logger.accept("Could not load meta data: " + metaDataClassName + " - " + e); + } catch (Exception e) { + logger.accept("Could not load meta data: " + metaDataClassName + " - " + e); + } + metaData = (loadedMetaData != null) ? loadedMetaData : RecordBuilderMetaData.DEFAULT; + } else { + metaData = new OptionBasedRecordBuilderMetaData(options); + } + } - RecordBuilderMetaData getMetaData() { - return metaData; - } + RecordBuilderMetaData getMetaData() { + return metaData; + } } diff --git a/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/RecordBuilderProcessor.java b/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/RecordBuilderProcessor.java index 3634486..41b00da 100644 --- a/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/RecordBuilderProcessor.java +++ b/record-builder-processor/src/main/java/io/soabase/recordbuilder/processor/RecordBuilderProcessor.java @@ -64,7 +64,7 @@ public class RecordBuilderProcessor extends AbstractProcessor { messager.printMessage(Diagnostic.Kind.ERROR, "RecordBuilder only valid for records.", element); return; } - var metaData = new RecordBuilderMetaDataLoader(processingEnv.getOptions().get(RecordBuilderMetaData.JAVAC_OPTION_NAME), s -> messager.printMessage(Diagnostic.Kind.NOTE, s)).getMetaData(); + var metaData = new RecordBuilderMetaDataLoader(processingEnv, s -> messager.printMessage(Diagnostic.Kind.NOTE, s)).getMetaData(); process((TypeElement) element, metaData); }