Compare commits
9 Commits
record-bui
...
record-bui
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
af69217eb5 | ||
|
|
9133d5f66d | ||
|
|
456b6f0f62 | ||
|
|
0fc82139de | ||
|
|
0774278032 | ||
|
|
578c7ad532 | ||
|
|
6e10d3a3c0 | ||
|
|
a9fa609911 | ||
|
|
43db1586ac |
10
README.md
10
README.md
@@ -192,6 +192,16 @@ The names of the generated methods, etc. are determined by [RecordBuilderMetaDat
|
||||
- When compiling, make sure that the compiled class is in the processor path
|
||||
- Add a "metaDataClass" compiler option with the class name. E.g. `javac ... -AmetaDataClass=foo.bar.MyMetaData`
|
||||
|
||||
Alternatively, you can provide values for each individual meta data (or combinations):
|
||||
|
||||
- `javac ... -AcopyMethodName=foo`
|
||||
- `javac ... -AbuilderMethodName=foo`
|
||||
- `javac ... -AbuildMethodName=foo`
|
||||
- `javac ... -AcomponentsMethodName=foo`
|
||||
- `javac ... -AfileComment=foo`
|
||||
- `javac ... -AfileIndent=foo`
|
||||
- `javac ... -AprefixEnclosingClassNames=foo`
|
||||
|
||||
## TODOs
|
||||
|
||||
- Document how to integrate with Gradle
|
||||
|
||||
4
pom.xml
4
pom.xml
@@ -5,7 +5,7 @@
|
||||
<groupId>io.soabase.record-builder</groupId>
|
||||
<artifactId>record-builder</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<version>1.5.ea</version>
|
||||
<version>1.6.ea</version>
|
||||
|
||||
<modules>
|
||||
<module>record-builder-core</module>
|
||||
@@ -70,7 +70,7 @@
|
||||
<url>https://github.com/randgalt/record-builder</url>
|
||||
<connection>scm:git:https://github.com/randgalt/record-builder.git</connection>
|
||||
<developerConnection>scm:git:git@github.com:randgalt/record-builder.git</developerConnection>
|
||||
<tag>record-builder-1.5.ea</tag>
|
||||
<tag>record-builder-1.6.ea</tag>
|
||||
</scm>
|
||||
|
||||
<issueManagement>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<parent>
|
||||
<groupId>io.soabase.record-builder</groupId>
|
||||
<artifactId>record-builder</artifactId>
|
||||
<version>1.5.ea</version>
|
||||
<version>1.6.ea</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright 2016 Jordan Zimmerman
|
||||
* 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.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright 2016 Jordan Zimmerman
|
||||
* 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.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<parent>
|
||||
<groupId>io.soabase.record-builder</groupId>
|
||||
<artifactId>record-builder</artifactId>
|
||||
<version>1.5.ea</version>
|
||||
<version>1.6.ea</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright 2016 Jordan Zimmerman
|
||||
* 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.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright 2016 Jordan Zimmerman
|
||||
* 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.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright 2016 Jordan Zimmerman
|
||||
* 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.
|
||||
|
||||
@@ -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<String, String> 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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright 2016 Jordan Zimmerman
|
||||
* 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.
|
||||
@@ -17,23 +17,34 @@ 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;
|
||||
|
||||
RecordBuilderMetaDataLoader(String metaDataClassName, Consumer<String> logger) {
|
||||
RecordBuilderMetaData localMetaData = null;
|
||||
RecordBuilderMetaDataLoader(ProcessingEnvironment processingEnv, Consumer<String> logger) {
|
||||
Map<String, String> 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);
|
||||
localMetaData = (RecordBuilderMetaData) clazz.getDeclaredConstructor().newInstance();
|
||||
logger.accept("Found meta data: " + localMetaData.getClass());
|
||||
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.getCause());
|
||||
} catch (Exception e) {
|
||||
logger.accept("Could not load meta data: " + metaDataClassName + " - " + e.getMessage());
|
||||
logger.accept("Could not load meta data: " + metaDataClassName + " - " + e);
|
||||
}
|
||||
metaData = (loadedMetaData != null) ? loadedMetaData : RecordBuilderMetaData.DEFAULT;
|
||||
} else {
|
||||
metaData = new OptionBasedRecordBuilderMetaData(options);
|
||||
}
|
||||
metaData = (localMetaData != null) ? localMetaData : RecordBuilderMetaData.DEFAULT;
|
||||
}
|
||||
|
||||
RecordBuilderMetaData getMetaData() {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright 2016 Jordan Zimmerman
|
||||
* 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.
|
||||
@@ -34,7 +34,6 @@ import java.util.Set;
|
||||
import static io.soabase.recordbuilder.processor.RecordBuilderProcessor.NAME;
|
||||
|
||||
@SupportedAnnotationTypes(NAME)
|
||||
@SupportedSourceVersion(SourceVersion.RELEASE_14)
|
||||
public class RecordBuilderProcessor extends AbstractProcessor {
|
||||
public static final String NAME = "io.soabase.recordbuilder.core.RecordBuilder";
|
||||
|
||||
@@ -45,14 +44,27 @@ public class RecordBuilderProcessor extends AbstractProcessor {
|
||||
annotations.forEach(annotation -> roundEnv.getElementsAnnotatedWith(annotation).forEach(this::process));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SourceVersion getSupportedSourceVersion() {
|
||||
// we don't directly return RELEASE_14 as that may
|
||||
// not exist in prior releases
|
||||
// if we're running on an older release, returning latest()
|
||||
// is fine as we won't encounter any records anyway
|
||||
return SourceVersion.latest();
|
||||
}
|
||||
|
||||
private void process(Element element) {
|
||||
var messager = processingEnv.getMessager();
|
||||
if (element.getKind() != ElementKind.RECORD) {
|
||||
// we use string based name comparison for the element kind,
|
||||
// as the ElementKind.RECORD enum doesn't exist on JRE releases
|
||||
// older than Java 14, and we don't want to throw unexpected
|
||||
// NoSuchFieldErrors
|
||||
if (!"RECORD".equals(element.getKind().name())) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<parent>
|
||||
<groupId>io.soabase.record-builder</groupId>
|
||||
<artifactId>record-builder</artifactId>
|
||||
<version>1.5.ea</version>
|
||||
<version>1.6.ea</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright 2016 Jordan Zimmerman
|
||||
* 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.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright 2016 Jordan Zimmerman
|
||||
* 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.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright 2016 Jordan Zimmerman
|
||||
* 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.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright 2016 Jordan Zimmerman
|
||||
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.
|
||||
|
||||
Reference in New Issue
Block a user