Skip to content
This repository was archived by the owner on Aug 8, 2018. It is now read-only.

Commit 8365dce

Browse files
Andre RaboldFrank Schmid
Andre Rabold
authored and
Frank Schmid
committed
Use external model references instead of inlining
1 parent 43ad8e7 commit 8365dce

File tree

2 files changed

+23
-38
lines changed

2 files changed

+23
-38
lines changed

src/com/amazonaws/service/apigateway/importer/impl/SchemaTransformer.java

+14-29
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.fasterxml.jackson.core.JsonProcessingException;
1818
import com.fasterxml.jackson.databind.JsonNode;
1919
import com.fasterxml.jackson.databind.ObjectMapper;
20+
import com.fasterxml.jackson.databind.SerializationFeature;
2021
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
2122
import com.fasterxml.jackson.databind.node.ObjectNode;
2223
import com.fasterxml.jackson.databind.node.TextNode;
@@ -39,15 +40,15 @@ public class SchemaTransformer {
3940

4041
/**
4142
* Get a schema schema in "flattened" form whereby all dependent references are resolved
42-
* and included as inline schema definitions
43+
* and included as external schema definitions
4344
*
4445
* @return the json-schema string in flattened form
4546
*/
46-
public String flatten(String model, String models) {
47-
return getFlattened(deserialize(model), deserialize(models));
47+
public String flatten(String apiId, String model, String models) {
48+
return getFlattened(apiId, deserialize(model), deserialize(models));
4849
}
4950

50-
private void buildSchemaReferenceMap(JsonNode model, JsonNode models, Map<String, String> modelMap) {
51+
private void buildSchemaReferenceMap(String apiId, JsonNode model, JsonNode models, Map<String, String> modelMap) {
5152
Map<JsonNode, JsonNode> refs = new HashMap<>();
5253
findReferences(model, refs);
5354

@@ -58,10 +59,10 @@ private void buildSchemaReferenceMap(JsonNode model, JsonNode models, Map<String
5859

5960
JsonNode subSchema = getSchema(schemaName, models);
6061

61-
// replace reference values with inline definitions
62-
replaceRef((ObjectNode) refs.get(ref), schemaName);
62+
// replace reference values with external definitions
63+
replaceRef(apiId, (ObjectNode) refs.get(ref), schemaName);
6364

64-
buildSchemaReferenceMap(subSchema, models, modelMap);
65+
buildSchemaReferenceMap(apiId, subSchema, models, modelMap);
6566

6667
modelMap.put(schemaName, serializeExisting(subSchema));
6768
}
@@ -71,12 +72,10 @@ private JsonNode getSchema(String schemaName, JsonNode models) {
7172
return models.findPath(schemaName);
7273
}
7374

74-
private String getFlattened(JsonNode model, JsonNode models) {
75+
private String getFlattened(String apiId, JsonNode model, JsonNode models) {
7576
HashMap<String, String> schemaMap = new HashMap<>();
7677

77-
buildSchemaReferenceMap(model, models, schemaMap);
78-
79-
replaceRefs(model, schemaMap);
78+
buildSchemaReferenceMap(apiId, model, models, schemaMap);
8079

8180
if (LOG.isTraceEnabled()) {
8281
try {
@@ -108,26 +107,12 @@ private void validate(JsonNode rootNode) {
108107
}
109108
}
110109

111-
/*
112-
* Add schema references as inline definitions to the root schema
113-
*/
114-
private void replaceRefs(JsonNode root, HashMap<String, String> schemaMap) {
115-
116-
ObjectNode definitionsNode = new ObjectNode(JsonNodeFactory.instance);
117-
118-
for (Map.Entry<String, String> entry : schemaMap.entrySet()) {
119-
JsonNode schemaNode = deserialize(entry.getValue());
120-
definitionsNode.set(entry.getKey(), schemaNode);
121-
}
122-
123-
((ObjectNode)root).set("definitions", definitionsNode);
124-
}
125-
126110
/*
127111
* Replace a reference node with an inline reference
128112
*/
129-
private void replaceRef(ObjectNode parent, String schemaName) {
130-
parent.set("$ref", new TextNode("#/definitions/" + schemaName));
113+
private void replaceRef(String apiId, ObjectNode parent, String schemaName) {
114+
// parent.set("$ref", new TextNode("#/definitions/" + schemaName));
115+
parent.set("$ref", new TextNode("https://apigateway.amazonaws.com/restapis/" + apiId + "/models/" + schemaName));
131116
}
132117

133118
/*
@@ -163,7 +148,7 @@ JsonNode deserialize(String schemaText) {
163148
*/
164149
private String serializeExisting(JsonNode root) {
165150
try {
166-
return new ObjectMapper().writeValueAsString(root);
151+
return new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(root);
167152
} catch (JsonProcessingException e) {
168153
throw new IllegalStateException("Could not serialize generated schema json", e);
169154
}

src/com/amazonaws/service/apigateway/importer/impl/sdk/ApiGatewaySdkSwaggerApiImporter.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,13 @@ private void createModels(RestApi api, Map<String, com.wordnik.swagger.models.Mo
113113
private void createModel(RestApi api, String modelName, com.wordnik.swagger.models.Model model, Map<String, com.wordnik.swagger.models.Model> definitions, String modelContentType) {
114114
LOG.info(format("Creating model for api id %s with name %s", api.getId(), modelName));
115115

116-
createModel(api, modelName, model.getDescription(), generateSchema(model, modelName, definitions), modelContentType);
116+
createModel(api, modelName, model.getDescription(), generateSchema(api, model, modelName, definitions), modelContentType);
117117
}
118118

119119
private void createModel(RestApi api, String modelName, Property model, String modelContentType) {
120120
LOG.info(format("Creating model for api id %s with name %s", api.getId(), modelName));
121121

122-
createModel(api, modelName, model.getDescription(), generateSchema(model, modelName, swagger.getDefinitions()), modelContentType);
122+
createModel(api, modelName, model.getDescription(), generateSchema(api, model, modelName, swagger.getDefinitions()), modelContentType);
123123
}
124124

125125
private void updateMethods(RestApi api, String basePath, Map<String, Path> paths, List<String> apiProduces) {
@@ -320,17 +320,17 @@ private Boolean isApiKeyRequired(Operation op) {
320320
return false;
321321
}
322322

323-
private String generateSchema(Property model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
324-
return generateSchemaString(model, modelName, definitions);
323+
private String generateSchema(RestApi api, Property model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
324+
return generateSchemaString(api, model, modelName, definitions);
325325
}
326326

327-
private String generateSchemaString(Object model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
327+
private String generateSchemaString(RestApi api, Object model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
328328
try {
329329
String modelSchema = Json.mapper().writeValueAsString(model);
330330
String models = Json.mapper().writeValueAsString(definitions);
331331

332332
// inline all references
333-
String schema = new SchemaTransformer().flatten(modelSchema, models);
333+
String schema = new SchemaTransformer().flatten(api.getId(), modelSchema, models);
334334

335335
LOG.info("Generated json-schema for model " + modelName + ": " + schema);
336336

@@ -340,8 +340,8 @@ private String generateSchemaString(Object model, String modelName, Map<String,
340340
}
341341
}
342342

343-
private String generateSchema(com.wordnik.swagger.models.Model model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
344-
return generateSchemaString(model, modelName, definitions);
343+
private String generateSchema(RestApi api, com.wordnik.swagger.models.Model model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
344+
return generateSchemaString(api, model, modelName, definitions);
345345
}
346346

347347
private Optional<String> getInputModel(BodyParameter p) {
@@ -400,7 +400,7 @@ private void updateModels(RestApi api, Map<String, com.wordnik.swagger.models.Mo
400400

401401
private void updateModel(RestApi api, String modelName, com.wordnik.swagger.models.Model model) {
402402
LOG.info(format("Updating model for api id %s and model name %s", api.getId(), modelName));
403-
updateModel(api, modelName, generateSchema(model, modelName, swagger.getDefinitions()));
403+
updateModel(api, modelName, generateSchema(api, model, modelName, swagger.getDefinitions()));
404404
}
405405

406406
private void updateMethod(RestApi api, Resource resource, String httpMethod, Operation op, String modelContentType) {

0 commit comments

Comments
 (0)