diff --git a/jsonschema2pojo-ant/src/main/java/org/jsonschema2pojo/ant/Jsonschema2PojoTask.java b/jsonschema2pojo-ant/src/main/java/org/jsonschema2pojo/ant/Jsonschema2PojoTask.java index 660d06aa2..96b0fed8b 100644 --- a/jsonschema2pojo-ant/src/main/java/org/jsonschema2pojo/ant/Jsonschema2PojoTask.java +++ b/jsonschema2pojo-ant/src/main/java/org/jsonschema2pojo/ant/Jsonschema2PojoTask.java @@ -151,6 +151,8 @@ public class Jsonschema2PojoTask extends Task implements GenerationConfig { private boolean includeDynamicBuilders = false; + private String[] baseClassInterfaces = new String[0]; + private String dateTimeType; private String timeType; @@ -764,6 +766,16 @@ public void setIncludeDynamicBuilders(boolean includeDynamicBuilders) { this.includeDynamicBuilders = includeDynamicBuilders; } + /** + * Sets the 'baseClassInterfaces' property of this class + * + * @param baseClassInterfaces + * Interfaces added to top-level generated classes. + */ + public void setBaseClassInterfaces(String[] baseClassInterfaces) { + this.baseClassInterfaces = baseClassInterfaces; + } + /** * Sets the 'formatDateTimes' property of this class * @@ -1096,6 +1108,11 @@ public boolean isIncludeDynamicBuilders() { return includeDynamicBuilders; } + @Override + public String[] getBaseClassInterfaces() { + return baseClassInterfaces; + } + @Override public String getDateTimeType() { return dateTimeType; diff --git a/jsonschema2pojo-ant/src/site/Jsonschema2PojoTask.html b/jsonschema2pojo-ant/src/site/Jsonschema2PojoTask.html index e9dea274b..e8ccc0fe8 100644 --- a/jsonschema2pojo-ant/src/site/Jsonschema2PojoTask.html +++ b/jsonschema2pojo-ant/src/site/Jsonschema2PojoTask.html @@ -188,6 +188,11 @@

Parameters

Whether to include dynamic builders or to omit these methods. No (default false) + + baseClassInterfaces + Interfaces to add to top-level generated classes. + No (default "" (none)) + includeConstructors Whether to generate constructors for generated Java types diff --git a/jsonschema2pojo-cli/src/main/java/org/jsonschema2pojo/cli/Arguments.java b/jsonschema2pojo-cli/src/main/java/org/jsonschema2pojo/cli/Arguments.java index 0c804b2ee..1fe2205ce 100644 --- a/jsonschema2pojo-cli/src/main/java/org/jsonschema2pojo/cli/Arguments.java +++ b/jsonschema2pojo-cli/src/main/java/org/jsonschema2pojo/cli/Arguments.java @@ -21,6 +21,7 @@ import java.io.File; import java.io.FileFilter; import java.net.URL; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -186,6 +187,9 @@ public class Arguments implements GenerationConfig { @Parameter(names = { "-idb", "--include-dynamic-builders" }, description = "Include dynamic builder support on generated types.") private boolean includeDynamicBuilders = false; + @Parameter(names = { "-in", "--base-class-interface" }, description = "Include given interface on top-level generated classes.") + private List baseClassInterfaces = Collections.emptyList(); + @Parameter(names = { "-fd", "--format-dates" }, description = "Whether the fields of type `date` are formatted during serialization with a default pattern of `yyyy-MM-dd`") private boolean formatDates = false; @@ -460,6 +464,11 @@ public boolean isIncludeDynamicBuilders() { return includeDynamicBuilders; } + @Override + public List getBaseClassInterfaces() { + return baseClassInterfaces; + } + @Override public String getDateTimeType() { return dateTimeType; diff --git a/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/DefaultGenerationConfig.java b/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/DefaultGenerationConfig.java index dfeb6b180..3b741f975 100644 --- a/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/DefaultGenerationConfig.java +++ b/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/DefaultGenerationConfig.java @@ -19,7 +19,9 @@ import java.io.File; import java.io.FileFilter; import java.net.URL; +import java.util.Collections; import java.util.Iterator; +import java.util.List; import org.jsonschema2pojo.rules.RuleFactory; @@ -349,6 +351,14 @@ public boolean isIncludeDynamicBuilders() { return false; } + /** + * @return {} + */ + @Override + public String[] getBaseClassInterfaces() { + return new String[] {}; + } + @Override public String getDateTimeType() { return null; @@ -427,4 +437,4 @@ public Language getTargetLanguage() { return Language.JAVA; } -} \ No newline at end of file +} diff --git a/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/GenerationConfig.java b/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/GenerationConfig.java index f0596b99a..467a2220b 100644 --- a/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/GenerationConfig.java +++ b/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/GenerationConfig.java @@ -20,6 +20,7 @@ import java.io.FileFilter; import java.net.URL; import java.util.Iterator; +import java.util.List; import org.jsonschema2pojo.rules.RuleFactory; @@ -422,6 +423,13 @@ public interface GenerationConfig { */ boolean isIncludeDynamicBuilders(); + /** + * Gets the `baseClassInterfaces` configuration option. + * + * @return a list of interfaces added to each generated base class + */ + String[] getBaseClassInterfaces(); + /** * Gets the `dateTimeType` configuration option. *

diff --git a/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/rules/EnumRule.java b/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/rules/EnumRule.java index a5dcc9e10..ab33f50b5 100644 --- a/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/rules/EnumRule.java +++ b/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/rules/EnumRule.java @@ -108,6 +108,11 @@ public JType apply(String nodeName, JsonNode node, JsonNode parent, JClassContai schema.setJavaTypeIfEmpty(_enum); + if (parent == null) { + for (String _interface : ruleFactory.getGenerationConfig().getBaseClassInterfaces()) { + _enum._implements(resolveType(_enum._package(), _interface)); + } + } if (node.has("javaInterfaces")) { addInterfaces(_enum, node.get("javaInterfaces")); } diff --git a/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/rules/ObjectRule.java b/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/rules/ObjectRule.java index 86488218e..28028258d 100644 --- a/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/rules/ObjectRule.java +++ b/jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/rules/ObjectRule.java @@ -122,6 +122,11 @@ public JType apply(String nodeName, JsonNode node, JsonNode parent, JPackage _pa ruleFactory.getPropertiesRule().apply(nodeName, node.get("properties"), node, jclass, schema); + if (parent == null) { + for (String _interface : ruleFactory.getGenerationConfig().getBaseClassInterfaces()) { + jclass._implements(resolveType(jclass._package(), _interface)); + } + } if (node.has("javaInterfaces")) { addInterfaces(jclass, node.get("javaInterfaces")); } diff --git a/jsonschema2pojo-core/src/test/java/org/jsonschema2pojo/rules/EnumRuleTest.java b/jsonschema2pojo-core/src/test/java/org/jsonschema2pojo/rules/EnumRuleTest.java index 98b79d230..6a5f74b5c 100644 --- a/jsonschema2pojo-core/src/test/java/org/jsonschema2pojo/rules/EnumRuleTest.java +++ b/jsonschema2pojo-core/src/test/java/org/jsonschema2pojo/rules/EnumRuleTest.java @@ -21,6 +21,7 @@ import static org.mockito.Mockito.*; import org.jsonschema2pojo.Annotator; +import org.jsonschema2pojo.GenerationConfig; import org.jsonschema2pojo.Schema; import org.jsonschema2pojo.util.NameHelper; import org.junit.Before; @@ -44,6 +45,7 @@ public class EnumRuleTest { private Annotator annotator = mock(Annotator.class); private RuleFactory ruleFactory = mock(RuleFactory.class); private TypeRule typeRule = mock(TypeRule.class); + private GenerationConfig config = mock(GenerationConfig.class); private EnumRule rule = new EnumRule(ruleFactory); @@ -52,6 +54,7 @@ public void wireUpConfig() { when(ruleFactory.getNameHelper()).thenReturn(nameHelper); when(ruleFactory.getAnnotator()).thenReturn(annotator); when(ruleFactory.getTypeRule()).thenReturn(typeRule); + when(ruleFactory.getGenerationConfig()).thenReturn(config); } @Test @@ -61,6 +64,7 @@ public void applyGeneratesUniqueEnumNamesForMultipleEnumNodesWithSameName() { when(nameHelper.getFieldName(anyString(), Matchers.any(JsonNode.class))).thenAnswer(firstArgAnswer); when(nameHelper.replaceIllegalCharacters(anyString())).thenAnswer(firstArgAnswer); when(nameHelper.normalizeName(anyString())).thenAnswer(firstArgAnswer); + when(config.getBaseClassInterfaces()).thenReturn(new String[0]); JPackage jpackage = new JCodeModel()._package(getClass().getPackage().getName()); diff --git a/jsonschema2pojo-gradle-plugin/src/main/groovy/org/jsonschema2pojo/gradle/JsonSchemaExtension.groovy b/jsonschema2pojo-gradle-plugin/src/main/groovy/org/jsonschema2pojo/gradle/JsonSchemaExtension.groovy index 39655984c..9c2462c0c 100644 --- a/jsonschema2pojo-gradle-plugin/src/main/groovy/org/jsonschema2pojo/gradle/JsonSchemaExtension.groovy +++ b/jsonschema2pojo-gradle-plugin/src/main/groovy/org/jsonschema2pojo/gradle/JsonSchemaExtension.groovy @@ -51,6 +51,7 @@ public class JsonSchemaExtension implements GenerationConfig { boolean includeDynamicGetters boolean includeDynamicSetters boolean includeDynamicBuilders + String[] baseClassInterfaces boolean includeConstructors boolean constructorsRequiredPropertiesOnly boolean includeHashcodeAndEquals @@ -137,6 +138,7 @@ public class JsonSchemaExtension implements GenerationConfig { includeDynamicGetters = false includeDynamicSetters = false includeDynamicBuilders = false + baseClassInterfaces = [] as String[] formatDates = false formatTimes = false formatDateTimes = false @@ -239,6 +241,7 @@ public class JsonSchemaExtension implements GenerationConfig { |includeDynamicGetters = ${includeDynamicGetters} |includeDynamicSetters = ${includeDynamicSetters} |includeDynamicBuilders = ${includeDynamicBuilders} + |baseClassInterfaces = ${baseClassInterfaces} |formatDates = ${formatDates} |formatTimes = ${formatTimes} |formatDateTimes = ${formatDateTimes} diff --git a/jsonschema2pojo-maven-plugin/src/main/java/org/jsonschema2pojo/maven/Jsonschema2PojoMojo.java b/jsonschema2pojo-maven-plugin/src/main/java/org/jsonschema2pojo/maven/Jsonschema2PojoMojo.java index 769fb5d73..dbb6be162 100644 --- a/jsonschema2pojo-maven-plugin/src/main/java/org/jsonschema2pojo/maven/Jsonschema2PojoMojo.java +++ b/jsonschema2pojo-maven-plugin/src/main/java/org/jsonschema2pojo/maven/Jsonschema2PojoMojo.java @@ -617,6 +617,14 @@ public class Jsonschema2PojoMojo extends AbstractMojo implements GenerationConfi */ private boolean includeDynamicBuilders = false; + /** + * Interfaces to add to all top-level generated classes. + * + * @parameter property="jsonschema2pojo.baseClassInterfaces" + * default-value="" + */ + private String[] baseClassInterfaces = new String[0]; + /** * The project being built. * @@ -1062,6 +1070,11 @@ public boolean isIncludeDynamicBuilders() { return includeDynamicBuilders; } + @Override + public String[] getBaseClassInterfaces() { + return baseClassInterfaces; + } + @Override public String getDateTimeType() { return dateTimeType;