Skip to content
This repository has been archived by the owner on May 26, 2020. It is now read-only.

Commit

Permalink
Merge 8760257 into 51fc847
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinYSpasov committed Jul 26, 2018
2 parents 51fc847 + 8760257 commit fae604b
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 29 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ This project adheres to [Semantic Versioning](http://semver.org/).

## [Unreleased]

### Changed
- Added integer enum support.
- Upgraded common bom to version 1.28.0
- Upgraded utilities to version 1.15.0
- Upgraded generator maven plugin to version 2.6.1
- Upgraded json schema catalog to version 1.4.0

## [1.4.2] - 2018-07-11
### Changed
- Upgraded framework api to version 2.2.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

public class EnumsIT {
Expand All @@ -28,29 +29,72 @@ public class EnumsIT {
private final GeneratorUtil generatorUtil = new GeneratorUtil();

private final ClassInstantiator classInstantiator = new ClassInstantiator();
private final OutputDirectories outputDirectories = new OutputDirectories();

private static final File JSON_SCHEMA_FILE = new ClasspathFileResource().getFileFromClasspath("/schemas/examples/enum.json");
private OutputDirectories outputDirectories;
private static final File JSON_SCHEMA_STRING_FILE = new ClasspathFileResource().getFileFromClasspath("/schemas/examples/enum-string.json");
private static final File JSON_SCHEMA_INTEGER_FILE = new ClasspathFileResource().getFileFromClasspath("/schemas/examples/enum-integer.json");

@Before
public void setup() throws Exception {
outputDirectories = new OutputDirectories();
outputDirectories.makeDirectories("./target/test-generation/examples/enums");
}

@SuppressWarnings("unchecked")
@Test
public void shouldGenerateJavaClassSourceCode() throws Exception {
public void shouldGenerateJavaClassWithIntegerEnum() throws Exception {

final String packageName = "uk.gov.justice.pojo.enums";

final PojoGeneratorProperties generatorProperties = pojoGeneratorPropertiesBuilder()
.withRootClassName("PersonWithEnum")
.withRootClassName("PersonWithIntegerEnum")
.build();

final List<Class<?>> classes = generatorUtil
.withGeneratorProperties(generatorProperties)
.generateAndCompileJavaSource(
JSON_SCHEMA_FILE,
JSON_SCHEMA_INTEGER_FILE,
packageName,
outputDirectories);

final Class<?> personWithEnumClass = classes.get(1);
final Class<? extends Enum> enumClass = (Class<? extends Enum>) classes.get(0);

final Optional<Method> valueForMethod = ReflectionUtil.methodOf(enumClass, "valueFor");
assertThat(valueForMethod.isPresent(), is(true));

final Optional favouriteNumber = (Optional) valueForMethod.get().invoke(null, 42);
assertThat(favouriteNumber.isPresent(), is(true));

final String name = "Fred";
final Integer age = 21;
final Object personWithEnum = classInstantiator.newInstance(personWithEnumClass, age, favouriteNumber.get(), name);

final String studentJson = objectMapper.writeValueAsString(personWithEnum);

with(studentJson)
.assertThat("$.name", is(name))
.assertThat("$.age", is(age))
.assertThat("$.favouriteNumber", is(42))
;

generatorUtil.validate(JSON_SCHEMA_INTEGER_FILE, studentJson);
}


@SuppressWarnings("unchecked")
@Test
public void shouldGenerateJavaClassWithStringEnum() throws Exception {

final String packageName = "uk.gov.justice.pojo.enums";

final PojoGeneratorProperties generatorProperties = pojoGeneratorPropertiesBuilder()
.withRootClassName("PersonWithStringEnum")
.build();

final List<Class<?>> classes = generatorUtil
.withGeneratorProperties(generatorProperties)
.generateAndCompileJavaSource(
JSON_SCHEMA_STRING_FILE,
packageName,
outputDirectories);

Expand All @@ -72,9 +116,9 @@ public void shouldGenerateJavaClassSourceCode() throws Exception {
with(studentJson)
.assertThat("$.name", is(name))
.assertThat("$.age", is(age))
.assertThat("$.favouriteColour", is("Red"))
;
.assertThat("$.favouriteColour", is("Red"));

generatorUtil.validate(JSON_SCHEMA_FILE, studentJson);
generatorUtil.validate(JSON_SCHEMA_STRING_FILE, studentJson);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"id": "http://justice.gov.uk/events/pojo/enums/person-with-integer-enum.json",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer"
},
"favouriteNumber": {
"type": "integer",
"enum": [
21,
42
]
}
},
"additionalProperties": false,
"required": [
"name",
"age",
"favouriteNumber"
]
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"id": "http://justice.gov.uk/events/pojo/enums/person-with-enum.json",
"id": "http://justice.gov.uk/events/pojo/enums/person-with-string-enum.json",
"properties": {
"name": {
"type": "string"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@
*/
public class EnumDefinition extends ClassDefinition {

private final List<String> enumValues;
private final List<Object> enumValues;

public EnumDefinition(final String fieldName, final List<String> enumValues, final String id) {
public EnumDefinition(final String fieldName, final List<Object> enumValues, final String id) {
super(ENUM, fieldName, id);
this.enumValues = enumValues;
}
Expand All @@ -55,7 +55,7 @@ public EnumDefinition(final String fieldName, final List<String> enumValues, fin
*
* @return The list of enumerated values
*/
public List<String> getEnumValues() {
public List<Object> getEnumValues() {
return enumValues;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.util.Optional;

import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
Expand All @@ -30,11 +31,14 @@ public class EnumGenerator implements ClassGeneratable {
private static final String BLANK_ENUM_NAME = "BLANK";
private static final String SPACE = " ";
private static final String UNDERSCORE = "_";
private static final String NUMBER = "NUMBER";

private final EnumDefinition enumDefinition;
private final ClassNameFactory classNameFactory;
private final PluginContext pluginContext;

private boolean isNumericEnum;

public EnumGenerator(final EnumDefinition definition,
final ClassNameFactory classNameFactory,
final PluginContext pluginContext) {
Expand All @@ -49,16 +53,19 @@ public TypeSpec generate() {
final Builder enumBuilder = enumBuilder(getClassName()).addModifiers(PUBLIC);

enumDefinition.getEnumValues().forEach(enumValue -> {

isNumericEnum = enumValue instanceof Integer;

final String enumName = constructEnumNameFrom(enumValue);

enumBuilder.addEnumConstant(enumName, anonymousClassBuilder("$S", enumValue)
enumBuilder.addEnumConstant(enumName, anonymousClassBuilder(isNumericEnum ? "$L" : "$S", enumValue)
.build());
});

return enumBuilder
.addField(String.class, VALUE_VARIABLE_NAME, PRIVATE, FINAL)
.addField(getClassType(), VALUE_VARIABLE_NAME, PRIVATE, FINAL)
.addMethod(constructorBuilder()
.addParameter(String.class, VALUE_VARIABLE_NAME)
.addParameter(getClassType(), VALUE_VARIABLE_NAME)
.addStatement("this.$L = $L", VALUE_VARIABLE_NAME, VALUE_VARIABLE_NAME)
.build())
.addMethod(buildToStringMethod())
Expand All @@ -71,7 +78,7 @@ private MethodSpec buildToStringMethod() {
.addAnnotation(Override.class)
.addModifiers(PUBLIC)
.returns(String.class)
.addStatement("return $L", VALUE_VARIABLE_NAME)
.addCode(addToStringReturnStatement())
.build();
}

Expand All @@ -82,7 +89,7 @@ private MethodSpec buildValueForMethod() {

final MethodSpec.Builder methodBuilder = methodBuilder("valueFor")
.addModifiers(PUBLIC, STATIC)
.addParameter(String.class, VALUE_VARIABLE_NAME, FINAL)
.addParameter(getClassType(), VALUE_VARIABLE_NAME, FINAL)
.returns(optionalEnumTypeName);

enumDefinition.getEnumValues().forEach(enumValue -> {
Expand All @@ -99,6 +106,17 @@ private MethodSpec buildValueForMethod() {
return methodBuilder.build();
}

private CodeBlock addToStringReturnStatement() {
return CodeBlock
.builder()
.addStatement("return $L", isNumericEnum ? generateStringFromNumber() : VALUE_VARIABLE_NAME)
.build();
}

private String generateStringFromNumber() {
return "String.valueOf(".concat(VALUE_VARIABLE_NAME).concat(")");
}

@Override
public String getSimpleClassName() {
return getClassName().simpleName();
Expand All @@ -109,11 +127,19 @@ public String getPackageName() {
return getClassName().packageName();
}

private String constructEnumNameFrom(final String enumValue) {
return enumValue.isEmpty() ? BLANK_ENUM_NAME : enumValue.toUpperCase().replace(SPACE, UNDERSCORE);

private String constructEnumNameFrom(final Object enumValue) {
if (isNumericEnum) {
return NUMBER.concat(UNDERSCORE).concat(enumValue.toString());
}
return enumValue.toString().isEmpty() ? BLANK_ENUM_NAME : enumValue.toString().toUpperCase().replace(SPACE, UNDERSCORE);
}

private ClassName getClassName() {
return classNameFactory.createClassNameFrom(enumDefinition);
}

private Class<?> getClassType() {
return isNumericEnum ? Integer.class : String.class;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package uk.gov.justice.generation.pojo.visitor;

import static com.google.common.collect.Lists.newArrayList;
import static java.lang.String.format;
import static java.util.stream.Collectors.toList;
import static uk.gov.justice.generation.pojo.dom.DefinitionType.ARRAY;
import static uk.gov.justice.generation.pojo.dom.DefinitionType.BOOLEAN;
import static uk.gov.justice.generation.pojo.dom.DefinitionType.CLASS;
Expand All @@ -19,7 +19,6 @@
import uk.gov.justice.generation.pojo.dom.StringDefinition;

import java.io.StringReader;
import java.util.List;
import java.util.Optional;
import java.util.Set;

Expand Down Expand Up @@ -89,9 +88,8 @@ public Definition constructDefinitionFor(final String fieldName, final Schema sc

if (schema instanceof EnumSchema) {
final Set<Object> possibleValues = ((EnumSchema) schema).getPossibleValues();
final List<String> enumValues = possibleValues.stream().map(Object::toString).collect(toList());

return new EnumDefinition(fieldName, enumValues, schema.getId());
return new EnumDefinition(fieldName, newArrayList(possibleValues), schema.getId());
}

if (schema instanceof StringSchema) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class EnumDefinitionTest {
@Test
public void shouldConstructEnumDefinition() throws Exception {
final String fieldName = "fieldName";
final List<String> enumValues = emptyList();
final List<Object> enumValues = emptyList();
final String id = "id";

final EnumDefinition enumDefinition = new EnumDefinition(fieldName, enumValues, id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,24 @@ public void shouldGenerateTypeSpecForSingleWordEnumValue() {
assertThat(typeSpec.methodSpecs.size(), is(3));
}

@Test
public void shouldGenerateTypeSpecForIntegerEnumValue() {
final ClassName className = get(Pojo.class);

when(enumDefinition.getEnumValues()).thenReturn(singletonList(1));
when(classNameFactory.createTypeNameFrom(enumDefinition, pluginContext)).thenReturn(className);
when(classNameFactory.createClassNameFrom(enumDefinition)).thenReturn(className);

final TypeSpec typeSpec = enumGenerator.generate();

assertThat(typeSpec.name, is("Pojo"));
assertThat(typeSpec.enumConstants.keySet(), hasItem("NUMBER_1"));
assertThat(typeSpec.modifiers.size(), is(1));
assertThat(typeSpec.modifiers, hasItem(PUBLIC));
assertThat(typeSpec.fieldSpecs.size(), is(1));
assertThat(typeSpec.methodSpecs.size(), is(3));
}

@Test
public void shouldGenerateTypeSpecForMultiWordEnumValue() {
final ClassName className = get(Pojo.class);
Expand Down
8 changes: 4 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@
</modules>

<properties>
<common-bom.version>1.27.0</common-bom.version>
<common-bom.version>1.28.0</common-bom.version>
<framework-api-version>2.2.0</framework-api-version>
<utilities.version>1.13.2</utilities.version>
<utilities.version>1.15.0</utilities.version>
<test-utils.version>1.17.3</test-utils.version>
<generator-maven-plugin.version>2.6.0</generator-maven-plugin.version>
<json-schema-catalog.version>1.3.2</json-schema-catalog.version>
<generator-maven-plugin.version>2.6.1</generator-maven-plugin.version>
<json-schema-catalog.version>1.4.0</json-schema-catalog.version>

<cpp.repo.name>jsonschema-pojo-generator</cpp.repo.name>
</properties>
Expand Down

0 comments on commit fae604b

Please sign in to comment.