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

Commit

Permalink
remove dependence on the id of schemas
Browse files Browse the repository at this point in the history
  • Loading branch information
amckenzie committed Aug 14, 2017
1 parent 4fc69e2 commit 90d1ec7
Show file tree
Hide file tree
Showing 11 changed files with 140 additions and 179 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ public class DefinitionBuilderIT {

@Test
public void shouldBuildTypeSpecFromSchema() throws Exception {
final ObjectSchema schema = (ObjectSchema) JsonSchemaLoader
.loadSchema("src/test/resources/schemas/person-schema.json");
final ObjectSchema schema = JsonSchemaLoader
.loadSchema("src/test/resources/schemas/person-schema.json", ObjectSchema.class);

final DefinitionBuilderVisitor definitionBuilderVisitor = new DefinitionBuilderVisitor("uk.gov.justice.pojo");
final JsonSchemaWrapper jsonSchemaWrapper = new JsonSchemaWrapper(schema);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,18 @@ public class JsonSchemaLoader {
/**
* Locate a JSON schema file on the classpath and load it.
* @param path the path to the JSON schema file
* @param clazz The type of the Schema. Must extend org.everit.json.schema.Schema.
* @return the schema
*/
public static Schema loadSchema(final String path) {
@SuppressWarnings("unchecked")
public static <T extends Schema> T loadSchema(final String path, @SuppressWarnings("unused") final Class<T> clazz) {

// TODO: load from classpath rather than working directory
final JSONObject schemaJsonObject = new JSONObject(new FileLoader().loadAsJsonSting(path));
return SchemaLoader.load(schemaJsonObject);
return (T) SchemaLoader.load(schemaJsonObject);
}

public static ArraySchema loadArraySchema(final String path) {
return (ArraySchema) loadSchema(path);
return loadSchema(path, ArraySchema.class);
}
}
15 changes: 5 additions & 10 deletions integration-test/src/test/resources/schemas/person-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,19 @@
"id": "person",
"properties": {
"firstName": {
"type": "string",
"id": "firstName"
"type": "string"
},
"lastName": {
"type": "string",
"id": "lastName"
"type": "string"
},
"required": {
"type": "boolean",
"id": "required"
"type": "boolean"
},
"signedInCount": {
"type": "integer",
"id": "signedInCount"
"type": "integer"
},
"ratio": {
"type": "number",
"id": "ratio"
"type": "number"
}
},
"additionalProperties": false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,18 @@ public DefinitionBuilderVisitor(final String packageName) {
}

@Override
public void visitEnter(final ObjectSchema schema) {
validate(schema);

final String fieldName = schema.getId();
public void enter(final String fieldName, final ObjectSchema schema) {
final ClassDefinition definition = new ClassDefinition(fieldName, new ClassName(packageName, capitalize(fieldName)));

definitions.push(new Entry(schema, definition));
}

@Override
public void visitLeave(final ObjectSchema schema) {
public void leave(final ObjectSchema schema) {
final Deque<Definition> fieldDefinitions = new ArrayDeque<>();

while (definitions.peek().getSchema() != schema) {

fieldDefinitions.push(definitions.pop().getDefinition());
}

Expand All @@ -59,52 +57,48 @@ public void visitLeave(final ObjectSchema schema) {
}

@Override
public void visit(final StringSchema schema) {
validate(schema);
definitions.push(new Entry(schema, new FieldDefinition(schema.getId(), new ClassName(String.class))));
public void visit(final String fieldName, final StringSchema schema) {
definitions.push(new Entry(schema, new FieldDefinition(fieldName, new ClassName(String.class))));
}

@Override
public void visit(final BooleanSchema schema) {
validate(schema);
definitions.push(new Entry(schema, new FieldDefinition(schema.getId(), new ClassName(Boolean.class))));
public void visit(final String fieldName, final BooleanSchema schema) {
definitions.push(new Entry(schema, new FieldDefinition(fieldName, new ClassName(Boolean.class))));
}

@Override
public void visit(final NumberSchema schema) {
validate(schema);

public void visit(final String fieldName, final NumberSchema schema) {
final ClassName className = schema.requiresInteger() ? new ClassName(Integer.class) : new ClassName(BigDecimal.class);
definitions.push(new Entry(schema, new FieldDefinition(schema.getId(), className)));
definitions.push(new Entry(schema, new FieldDefinition(fieldName, className)));
}

@Override
public void visit(final CombinedSchema schema) {
public void visit(final String fieldName, final CombinedSchema schema) {
//TODO: Implement Combined Schema
}

@Override
public void visit(final ArraySchema schema) {
public void visit(final String fieldName, final ArraySchema schema) {
//TODO: Implement Array Schema
}

@Override
public void visit(final ReferenceSchema schema) {
public void visit(final String fieldName, final ReferenceSchema schema) {
//TODO: Implement Reference Schema
}

@Override
public void visit(final EmptySchema schema) {
public void visit(final String fieldName, final EmptySchema schema) {
//TODO: Implement Empty Schema
}

@Override
public void visit(final EnumSchema schema) {
public void visit(final String fieldName, final EnumSchema schema) {
//TODO: Implement Enum Schema
}

@Override
public void visit(final NullSchema schema) {
public void visit(final String fieldName, final NullSchema schema) {
//TODO: Implement Null Schema
}

Expand All @@ -113,12 +107,6 @@ public List<ClassDefinition> getDefinitions() {
return classDefinitions;
}

private void validate(final Schema schema) {
if (schema.getId() == null || schema.getId().isEmpty()) {
throw new UnsupportedSchemaException("Invalid Schema: all schema value types must have the id set for correct source generation.");
}
}

private class Entry {

private final Schema schema;
Expand All @@ -137,4 +125,4 @@ Definition getDefinition() {
return definition;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,48 +24,54 @@ public JsonSchemaWrapper(final Schema schema) {

@Override
public void accept(final Visitor visitor) {
final String fieldName = schema.getId();
accept(fieldName, visitor);
}

private void accept(final String fieldName, final Visitor visitor) {

switch (schema.getClass().getSimpleName()) {
case "ObjectSchema":
final ObjectSchema objectSchema = (ObjectSchema) schema;

visitor.visitEnter(objectSchema);
objectSchema.getPropertySchemas().values()
.forEach(childSchema -> visitChildSchema(visitor, childSchema));
visitor.visitLeave(objectSchema);
visitor.enter(fieldName, objectSchema);
objectSchema.getPropertySchemas()
.forEach((childName, childSchema) -> visitChildSchema(childName, visitor, childSchema));
visitor.leave(objectSchema);
break;
case "StringSchema":
visitor.visit((StringSchema) schema);
visitor.visit(fieldName, (StringSchema) schema);
break;
case "BooleanSchema":
visitor.visit((BooleanSchema) schema);
visitor.visit(fieldName, (BooleanSchema) schema);
break;
case "NumberSchema":
visitor.visit((NumberSchema) schema);
visitor.visit(fieldName, (NumberSchema) schema);
break;
case "EnumSchema":
visitor.visit((EnumSchema) schema);
visitor.visit(fieldName, (EnumSchema) schema);
break;
case "NullSchema":
visitor.visit((NullSchema) schema);
visitor.visit(fieldName, (NullSchema) schema);
break;
case "EmptySchema":
visitor.visit((EmptySchema) schema);
visitor.visit(fieldName, (EmptySchema) schema);
break;
case "ReferenceSchema":
visitor.visit((ReferenceSchema) schema);
visitor.visit(fieldName, (ReferenceSchema) schema);
break;
case "ArraySchema":
visitor.visit((ArraySchema) schema);
visitor.visit(fieldName, (ArraySchema) schema);
break;
case "CombinedSchema":
visitor.visit((CombinedSchema) schema);
visitor.visit(fieldName, (CombinedSchema) schema);
break;
default:
throw new UnsupportedSchemaException(format("Schema of type: %s is not supported.", schema.getClass().getSimpleName()));
}
}

private void visitChildSchema(final Visitor visitor, final Schema childSchema) {
new JsonSchemaWrapper(childSchema).accept(visitor);
private void visitChildSchema(final String fieldName, final Visitor visitor, final Schema childSchema) {
new JsonSchemaWrapper(childSchema).accept(fieldName, visitor);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,27 +17,27 @@

public interface Visitor {

void visitEnter(final ObjectSchema schema);
void enter(final String fieldName, final ObjectSchema schema);

void visitLeave(final ObjectSchema schema);
void leave(final ObjectSchema schema);

void visit(final CombinedSchema schema);
void visit(final String fieldName, final CombinedSchema schema);

void visit(final ArraySchema schema);
void visit(final String fieldName, final ArraySchema schema);

void visit(final ReferenceSchema schema);
void visit(final String fieldName, final ReferenceSchema schema);

void visit(final BooleanSchema schema);
void visit(final String fieldName, final BooleanSchema schema);

void visit(final EmptySchema schema);
void visit(final String fieldName, final EmptySchema schema);

void visit(final EnumSchema schema);
void visit(final String fieldName, final EnumSchema schema);

void visit(final NullSchema schema);
void visit(final String fieldName, final NullSchema schema);

void visit(final NumberSchema schema);
void visit(final String fieldName, final NumberSchema schema);

void visit(final StringSchema schema);
void visit(final String fieldName, final StringSchema schema);

List<ClassDefinition> getDefinitions();
}
Loading

0 comments on commit 90d1ec7

Please sign in to comment.