From cdc9e0c7a2d07cd9cc9aa6c19668e5393216fba8 Mon Sep 17 00:00:00 2001 From: Richard Gomez Date: Sun, 30 Sep 2018 20:06:34 -0400 Subject: [PATCH] Add ConverterIgnore annotation --- .../codegen/annotations/ConverterIgnore.java | 19 +++++++++ .../dataobjecthelper/DataObjectHelperGen.java | 11 ++++++ src/test/asciidoc/dataobjects.adoc | 15 +++++++ .../IgnoreConverterDataObjectConverter.java | 35 +++++++++++++++++ .../codegen/converter/DataObjectTest.java | 31 +++++++++++++++ .../converter/IgnoreConverterDataObject.java | 39 +++++++++++++++++++ 6 files changed, 150 insertions(+) create mode 100644 src/main/java/io/vertx/codegen/annotations/ConverterIgnore.java create mode 100644 src/test/generated/io/vertx/test/codegen/converter/IgnoreConverterDataObjectConverter.java create mode 100644 src/test/java/io/vertx/test/codegen/converter/IgnoreConverterDataObject.java diff --git a/src/main/java/io/vertx/codegen/annotations/ConverterIgnore.java b/src/main/java/io/vertx/codegen/annotations/ConverterIgnore.java new file mode 100644 index 000000000..2f90cf916 --- /dev/null +++ b/src/main/java/io/vertx/codegen/annotations/ConverterIgnore.java @@ -0,0 +1,19 @@ +package io.vertx.codegen.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The annotated DataObject property is ignored by the generated converter. + * + * This can be used to provide custom `fromJson()`/`toJson()` implementations for + * types not compatible with the vertx codegen rules. + * + * @author Richard Gomez + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ConverterIgnore { +} diff --git a/src/main/java/io/vertx/codegen/generators/dataobjecthelper/DataObjectHelperGen.java b/src/main/java/io/vertx/codegen/generators/dataobjecthelper/DataObjectHelperGen.java index 78e3075c0..edd32474a 100644 --- a/src/main/java/io/vertx/codegen/generators/dataobjecthelper/DataObjectHelperGen.java +++ b/src/main/java/io/vertx/codegen/generators/dataobjecthelper/DataObjectHelperGen.java @@ -3,6 +3,8 @@ import io.vertx.codegen.Generator; import io.vertx.codegen.DataObjectModel; import io.vertx.codegen.PropertyInfo; +import io.vertx.codegen.annotations.ConverterIgnore; +import io.vertx.codegen.type.AnnotationValueInfo; import io.vertx.codegen.type.ClassKind; import java.io.PrintWriter; @@ -64,7 +66,12 @@ private void generateToJson(String visibility, boolean inheritConverter, DataObj writer.print("\n"); writer.print(" " + visibility + " static void toJson(" + simpleName + " obj, java.util.Map json) {\n"); model.getPropertyMap().values().forEach(prop -> { + + AnnotationValueInfo ignoreProp = prop.getAnnotation(ConverterIgnore.class.getName()); + if (ignoreProp != null) return; + if ((prop.isDeclared() || inheritConverter) && prop.getGetterMethod() != null && prop.isJsonifiable()) { + ClassKind propKind = prop.getType().getKind(); if (propKind.basic) { if (propKind == ClassKind.STRING) { @@ -142,6 +149,10 @@ private void generateFromson(String visibility, boolean inheritConverter, DataOb writer.print(" for (java.util.Map.Entry member : json) {\n"); writer.print(" switch (member.getKey()) {\n"); model.getPropertyMap().values().forEach(prop -> { + + AnnotationValueInfo ignoreProp = prop.getAnnotation(ConverterIgnore.class.getName()); + if (ignoreProp != null) return; + if (prop.isDeclared() || inheritConverter) { ClassKind propKind = prop.getType().getKind(); if (propKind.basic) { diff --git a/src/test/asciidoc/dataobjects.adoc b/src/test/asciidoc/dataobjects.adoc index 44a8c69d6..2c3a6358e 100644 --- a/src/test/asciidoc/dataobjects.adoc +++ b/src/test/asciidoc/dataobjects.adoc @@ -44,6 +44,21 @@ |[[parentProperty]]`@parentProperty`|`String`|- |=== +[[IgnoreConverterDataObject]] +== IgnoreConverterDataObject + +++++ +++++ +''' + +[cols=">25%,25%,50%"] +[frame="topbot"] +|=== +^|Name | Type ^| Description +|[[ignoredProperty]]`@ignoredProperty`|`String`|- +|[[regularProperty]]`@regularProperty`|`String`|- +|=== + [[NoConverterDataObject]] == NoConverterDataObject diff --git a/src/test/generated/io/vertx/test/codegen/converter/IgnoreConverterDataObjectConverter.java b/src/test/generated/io/vertx/test/codegen/converter/IgnoreConverterDataObjectConverter.java new file mode 100644 index 000000000..4e353e8bc --- /dev/null +++ b/src/test/generated/io/vertx/test/codegen/converter/IgnoreConverterDataObjectConverter.java @@ -0,0 +1,35 @@ +package io.vertx.test.codegen.converter; + +import io.vertx.core.json.JsonObject; +import io.vertx.core.json.JsonArray; +import java.time.Instant; +import java.time.format.DateTimeFormatter; + +/** + * Converter for {@link io.vertx.test.codegen.converter.IgnoreConverterDataObject}. + * NOTE: This class has been automatically generated from the {@link io.vertx.test.codegen.converter.IgnoreConverterDataObject} original class using Vert.x codegen. + */ +public class IgnoreConverterDataObjectConverter { + + public static void fromJson(Iterable> json, IgnoreConverterDataObject obj) { + for (java.util.Map.Entry member : json) { + switch (member.getKey()) { + case "regularProperty": + if (member.getValue() instanceof String) { + obj.setRegularProperty((String)member.getValue()); + } + break; + } + } + } + + public static void toJson(IgnoreConverterDataObject obj, JsonObject json) { + toJson(obj, json.getMap()); + } + + public static void toJson(IgnoreConverterDataObject obj, java.util.Map json) { + if (obj.getRegularProperty() != null) { + json.put("regularProperty", obj.getRegularProperty()); + } + } +} diff --git a/src/test/java/io/vertx/test/codegen/converter/DataObjectTest.java b/src/test/java/io/vertx/test/codegen/converter/DataObjectTest.java index 191363e52..a9a15738d 100644 --- a/src/test/java/io/vertx/test/codegen/converter/DataObjectTest.java +++ b/src/test/java/io/vertx/test/codegen/converter/DataObjectTest.java @@ -722,6 +722,37 @@ public void testNotInherit() { assertEquals(expectedJson, json); } + @Test + public void testIgnoreConverterFromJson() { + String ignored = "foo"; + String regular = "bar"; + + JsonObject json = new JsonObject(); + json.put("ignoredProperty", ignored); + json.put("regularProperty", regular); + + IgnoreConverterDataObject obj = new IgnoreConverterDataObject(json); + + assertNull(obj.getIgnoredProperty()); + assertEquals(regular, obj.getRegularProperty()); + } + + @Test + public void testIgnoreConverterToJson() { + String ignored = "foo"; + String regular = "bar"; + + IgnoreConverterDataObject obj = new IgnoreConverterDataObject(); + obj.setIgnoredProperty(ignored); + obj.setRegularProperty(regular); + + Map json = new HashMap<>(); + IgnoreConverterDataObjectConverter.toJson(obj, json); + + assertNull(json.get("ignoredProperty")); + assertEquals(regular, json.get("regularProperty")); + } + private String toBase64(Buffer buffer) { return Base64.getEncoder().encodeToString(buffer.getBytes()); } diff --git a/src/test/java/io/vertx/test/codegen/converter/IgnoreConverterDataObject.java b/src/test/java/io/vertx/test/codegen/converter/IgnoreConverterDataObject.java new file mode 100644 index 000000000..4f792bb75 --- /dev/null +++ b/src/test/java/io/vertx/test/codegen/converter/IgnoreConverterDataObject.java @@ -0,0 +1,39 @@ +package io.vertx.test.codegen.converter; + +import io.vertx.codegen.annotations.ConverterIgnore; +import io.vertx.codegen.annotations.DataObject; +import io.vertx.core.json.JsonObject; + +/** + * @author Richard Gomez + */ +@DataObject(generateConverter = true) +public class IgnoreConverterDataObject { + + @ConverterIgnore + private String ignoredProperty; + private String regularProperty; + + public IgnoreConverterDataObject() { + } + + public IgnoreConverterDataObject(JsonObject json) { + IgnoreConverterDataObjectConverter.fromJson(json, this); + } + + public String getIgnoredProperty() { + return ignoredProperty; + } + + public void setIgnoredProperty(String ignoredProperty) { + this.ignoredProperty = ignoredProperty; + } + + public String getRegularProperty() { + return regularProperty; + } + + public void setRegularProperty(String regularProperty) { + this.regularProperty = regularProperty; + } +}