diff --git a/src/core/lombok/ConfigurationKeys.java b/src/core/lombok/ConfigurationKeys.java index 7124625b..a3259d4f 100644 --- a/src/core/lombok/ConfigurationKeys.java +++ b/src/core/lombok/ConfigurationKeys.java @@ -29,6 +29,7 @@ import lombok.core.configuration.CheckerFrameworkVersion; import lombok.core.configuration.ConfigurationKey; import lombok.core.configuration.FlagUsageType; import lombok.core.configuration.IdentifierName; +import lombok.core.configuration.JacksonVersion; import lombok.core.configuration.LogDeclaration; import lombok.core.configuration.NullAnnotationLibrary; import lombok.core.configuration.NullCheckExceptionType; @@ -713,18 +714,11 @@ public class ConfigurationKeys { /** - * lombok configuration: {@code lombok.jacksonized.useJackson2} = {@code true} | {@code false}. + * lombok configuration: {@code lombok.jacksonized.jacksonVersion} = {@code 2} | {@code 3} | {@code 2_3}. * - * If set to {@code true}, generate Jackson 2.x compatible code. + * The jackson major version to use. */ - public static final ConfigurationKey JACKSONIZED_USE_JACKSON2 = new ConfigurationKey("lombok.jacksonized.useJackson2", "Generate Jackson 2.x compatible code (default: true)") {}; - - /** - * lombok configuration: {@code lombok.jacksonized.useJackson3} = {@code true} | {@code false}. - * - * If set to {@code true}, generate Jackson 3.x compatible code. - */ - public static final ConfigurationKey JACKSONIZED_USE_JACKSON3 = new ConfigurationKey("lombok.jacksonized.useJackson3", "Generate Jackson 3.x compatible code (default: false)") {}; + public static final ConfigurationKey JACKSONIZED_JACKSON_VERSION = new ConfigurationKey("lombok.jacksonized.jacksonVersion", "Select the jackson major version to use (default: 2)") {}; // ----- Configuration System ----- diff --git a/src/core/lombok/core/configuration/JacksonVersion.java b/src/core/lombok/core/configuration/JacksonVersion.java new file mode 100644 index 00000000..6eb34e58 --- /dev/null +++ b/src/core/lombok/core/configuration/JacksonVersion.java @@ -0,0 +1,46 @@ +package lombok.core.configuration; + +public final class JacksonVersion implements ConfigurationValueType { + + private final boolean useJackson2; + private final boolean useJackson3; + + public static final JacksonVersion _2 = new JacksonVersion(true, false); + public static final JacksonVersion _3 = new JacksonVersion(true, false); + public static final JacksonVersion _23 = new JacksonVersion(true, true); + + public JacksonVersion(boolean useJackson2, boolean useJackson3) { + this.useJackson2 = useJackson2; + this.useJackson3 = useJackson3; + } + + public static String exampleValue() { + return "2"; + } + + public static String description() { + return "Select the major version of the jackson framework."; + } + + public static JacksonVersion valueOf(String value) { + if (value == null || value.isEmpty()) { + return _2; + } else if ("2".equals(value.trim())) { + return _2; + } else if ("3".equals(value.trim())) { + return _3; + } else if ("2_3".equals(value.trim())) { + return _23; + } else{ + throw new IllegalArgumentException("Unsupported Jackson version selector. Supported values: 2, 3 or 2_3 "); + } + } + + public boolean useJackson2() { + return useJackson2; + } + + public boolean useJackson3() { + return useJackson3; + } +} diff --git a/src/core/lombok/eclipse/handlers/HandleJacksonized.java b/src/core/lombok/eclipse/handlers/HandleJacksonized.java index 64cb0e89..9d249c02 100644 --- a/src/core/lombok/eclipse/handlers/HandleJacksonized.java +++ b/src/core/lombok/eclipse/handlers/HandleJacksonized.java @@ -44,6 +44,7 @@ import lombok.ConfigurationKeys; import lombok.core.AnnotationValues; import lombok.core.HandlerPriority; import lombok.core.AST.Kind; +import lombok.core.configuration.JacksonVersion; import lombok.core.handlers.HandlerUtil; import lombok.eclipse.Eclipse; import lombok.eclipse.EclipseAnnotationHandler; @@ -147,17 +148,16 @@ public class HandleJacksonized extends EclipseAnnotationHandler { ClassLiteralAccess builderClassLiteralAccess = new ClassLiteralAccess(td.sourceEnd, builderClassExpression); MemberValuePair builderMvp = new MemberValuePair("builder".toCharArray(), td.sourceStart, td.sourceEnd, builderClassLiteralAccess); - Boolean useJackson2 = annotationNode.getAst().readConfigurationOr(ConfigurationKeys.JACKSONIZED_USE_JACKSON2, Boolean.TRUE); - Boolean useJackson3 = annotationNode.getAst().readConfigurationOr(ConfigurationKeys.JACKSONIZED_USE_JACKSON3, Boolean.FALSE); - if (! (useJackson2 || useJackson3)) { - annotationNode.addError("Usage: lombok.jacksonized.useJackson2, lombok.jacksonized.useJackson3 or both must be true."); + JacksonVersion jacksonVersion = annotationNode.getAst().readConfiguration(ConfigurationKeys.JACKSONIZED_JACKSON_VERSION); + if (! (jacksonVersion.useJackson2() || jacksonVersion.useJackson3())) { + annotationNode.addError("Usage: No valid jackson version selected"); return; } - if (useJackson2) { + if (jacksonVersion.useJackson2()) { td.annotations = addAnnotation(td, td.annotations, JACKSON2_JSON_DESERIALIZE_ANNOTATION, builderMvp); } - if (useJackson3) { + if (jacksonVersion.useJackson3()) { td.annotations = addAnnotation(td, td.annotations, JACKSON3_JSON_DESERIALIZE_ANNOTATION, builderMvp); } // Copy annotations from the class to the builder class. @@ -169,10 +169,10 @@ public class HandleJacksonized extends EclipseAnnotationHandler { MemberValuePair withPrefixMvp = new MemberValuePair("withPrefix".toCharArray(), builderClass.sourceStart, builderClass.sourceEnd, withPrefixLiteral); StringLiteral buildMethodNameLiteral = new StringLiteral(buildMethodName.toCharArray(), builderClass.sourceStart, builderClass.sourceEnd, 0); MemberValuePair buildMethodNameMvp = new MemberValuePair("buildMethodName".toCharArray(), builderClass.sourceStart, builderClass.sourceEnd, buildMethodNameLiteral); - if (useJackson2) { + if (jacksonVersion.useJackson2()) { builderClass.annotations = addAnnotation(builderClass, builderClass.annotations, JACKSON2_JSON_POJO_BUILDER_ANNOTATION, withPrefixMvp, buildMethodNameMvp); } - if (useJackson3) { + if (jacksonVersion.useJackson3()) { builderClass.annotations = addAnnotation(builderClass, builderClass.annotations, JACKSON3_JSON_POJO_BUILDER_ANNOTATION, withPrefixMvp, buildMethodNameMvp); } // @SuperBuilder? Make it package-private! diff --git a/src/core/lombok/javac/handlers/HandleJacksonized.java b/src/core/lombok/javac/handlers/HandleJacksonized.java index 4642aaea..281e5295 100644 --- a/src/core/lombok/javac/handlers/HandleJacksonized.java +++ b/src/core/lombok/javac/handlers/HandleJacksonized.java @@ -42,6 +42,7 @@ import lombok.ConfigurationKeys; import lombok.core.AST.Kind; import lombok.core.AnnotationValues; import lombok.core.HandlerPriority; +import lombok.core.configuration.JacksonVersion; import lombok.core.handlers.HandlerUtil; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; @@ -173,14 +174,12 @@ public class HandleJacksonized extends JavacAnnotationHandler { return; } - Boolean useJackson2 = annotationNode.getAst().readConfigurationOr(ConfigurationKeys.JACKSONIZED_USE_JACKSON2, Boolean.TRUE); - Boolean useJackson3 = annotationNode.getAst().readConfigurationOr(ConfigurationKeys.JACKSONIZED_USE_JACKSON3, Boolean.FALSE); - - if (! (useJackson2 || useJackson3)) { - annotationNode.addError("Usage: lombok.jacksonized.useJackson2, lombok.jacksonized.useJackson3 or both must be true."); + JacksonVersion jacksonVersion = annotationNode.getAst().readConfiguration(ConfigurationKeys.JACKSONIZED_JACKSON_VERSION); + if (! (jacksonVersion.useJackson2() || jacksonVersion.useJackson3())) { + annotationNode.addError("Usage: No valid jackson version selected"); return; } - if (useJackson2) { + if (jacksonVersion.useJackson2()) { JCExpression jsonDeserializeType = chainDots(annotatedNode, "com", "fasterxml", "jackson", "databind", "annotation", "JsonDeserialize"); JCExpression builderClassExpression = namePlusTypeParamsToTypeReference(maker, tdNode, annotationNode.toName(builderClassName), false, List.nil()); JCFieldAccess builderClassReference = maker.Select(builderClassExpression, annotatedNode.toName("class")); @@ -189,7 +188,7 @@ public class HandleJacksonized extends JavacAnnotationHandler { recursiveSetGeneratedBy(annotationJsonDeserialize, annotationNode); td.mods.annotations = td.mods.annotations.append(annotationJsonDeserialize); } - if (useJackson3) { + if (jacksonVersion.useJackson3()) { JCExpression jsonDeserializeType = chainDots(annotatedNode, "tools", "jackson", "databind", "annotation", "JsonDeserialize"); JCExpression builderClassExpression = namePlusTypeParamsToTypeReference(maker, tdNode, annotationNode.toName(builderClassName), false, List.nil()); JCFieldAccess builderClassReference = maker.Select(builderClassExpression, annotatedNode.toName("class")); @@ -207,7 +206,7 @@ public class HandleJacksonized extends JavacAnnotationHandler { } builderClass.mods.annotations = builderClass.mods.annotations.appendList(copiedAnnotations); - if (useJackson2) { + if (jacksonVersion.useJackson2()) { // Insert @JsonPOJOBuilder on the builder class. JCExpression jsonPOJOBuilderType = chainDots(annotatedNode, "com", "fasterxml", "jackson", "databind", "annotation", "JsonPOJOBuilder"); JCExpression withPrefixExpr = maker.Assign(maker.Ident(annotationNode.toName("withPrefix")), maker.Literal(setPrefix)); @@ -216,7 +215,7 @@ public class HandleJacksonized extends JavacAnnotationHandler { recursiveSetGeneratedBy(annotationJsonPOJOBuilder, annotatedNode); builderClass.mods.annotations = builderClass.mods.annotations.append(annotationJsonPOJOBuilder); } - if (useJackson3) { + if (jacksonVersion.useJackson3()) { // Insert @JsonPOJOBuilder on the builder class. JCExpression jsonPOJOBuilderType = chainDots(annotatedNode, "tools", "jackson", "databind", "annotation", "JsonPOJOBuilder"); JCExpression withPrefixExpr = maker.Assign(maker.Ident(annotationNode.toName("withPrefix")), maker.Literal(setPrefix)); diff --git a/test/transform/resource/before/JacksonizedBuilderComplex.java b/test/transform/resource/before/JacksonizedBuilderComplex.java index cac9277c..0f243055 100644 --- a/test/transform/resource/before/JacksonizedBuilderComplex.java +++ b/test/transform/resource/before/JacksonizedBuilderComplex.java @@ -1,6 +1,6 @@ //version 8: Jackson deps are at least Java7+. //CONF: lombok.builder.className = Test*Name -//CONF: lombok.jacksonized.useJackson3 = true +//CONF: lombok.jacksonized.jacksonVersion = 2_3 import java.util.List; import lombok.Builder; import lombok.extern.jackson.Jacksonized; diff --git a/test/transform/resource/before/JacksonizedBuilderSimple.java b/test/transform/resource/before/JacksonizedBuilderSimple.java index b9cb8146..3a3c97ba 100644 --- a/test/transform/resource/before/JacksonizedBuilderSimple.java +++ b/test/transform/resource/before/JacksonizedBuilderSimple.java @@ -1,5 +1,5 @@ //version 8: Jackson deps are at least Java7+. -//CONF: lombok.jacksonized.useJackson3 = true +//CONF: lombok.jacksonized.jacksonVersion = 2_3 import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/test/transform/resource/before/JacksonizedBuilderSingular.java b/test/transform/resource/before/JacksonizedBuilderSingular.java index 858f7479..54c4e854 100644 --- a/test/transform/resource/before/JacksonizedBuilderSingular.java +++ b/test/transform/resource/before/JacksonizedBuilderSingular.java @@ -1,5 +1,5 @@ //version 8: Jackson deps are at least Java7+. -//CONF: lombok.jacksonized.useJackson3 = true +//CONF: lombok.jacksonized.jacksonVersion = 2_3 import java.util.List; import java.util.Map; diff --git a/test/transform/resource/before/JacksonizedOnRecord.java b/test/transform/resource/before/JacksonizedOnRecord.java index b3748183..8defef66 100644 --- a/test/transform/resource/before/JacksonizedOnRecord.java +++ b/test/transform/resource/before/JacksonizedOnRecord.java @@ -1,5 +1,5 @@ //version 14: -//CONF: lombok.jacksonized.useJackson3 = true +//CONF: lombok.jacksonized.jacksonVersion = 2_3 import java.util.List; import javax.annotation.Nullable; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/test/transform/resource/before/JacksonizedSuperBuilderSimple.java b/test/transform/resource/before/JacksonizedSuperBuilderSimple.java index 9432d70d..7ca6aa05 100644 --- a/test/transform/resource/before/JacksonizedSuperBuilderSimple.java +++ b/test/transform/resource/before/JacksonizedSuperBuilderSimple.java @@ -1,4 +1,4 @@ -//CONF: lombok.jacksonized.useJackson3 = true +//CONF: lombok.jacksonized.jacksonVersion = 2_3 //version 8: Jackson deps are at least Java7+. public class JacksonizedSuperBuilderSimple { @lombok.extern.jackson.Jacksonized