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

Commit 7a22d5b

Browse files
author
Andre Rabold
committed
Use external model references instead of inlining
1 parent 5ddb61b commit 7a22d5b

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

Lines changed: 14 additions & 29 deletions
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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,13 @@ private void createModels(RestApi api, Map<String, com.wordnik.swagger.models.Mo
105105
private void createModel(RestApi api, String modelName, com.wordnik.swagger.models.Model model, Map<String, com.wordnik.swagger.models.Model> definitions, String modelContentType) {
106106
LOG.info(format("Creating model for api id %s with name %s", api.getId(), modelName));
107107

108-
createModel(api, modelName, model.getDescription(), generateSchema(model, modelName, definitions), modelContentType);
108+
createModel(api, modelName, model.getDescription(), generateSchema(api, model, modelName, definitions), modelContentType);
109109
}
110110

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

114-
createModel(api, modelName, model.getDescription(), generateSchema(model, modelName, swagger.getDefinitions()), modelContentType);
114+
createModel(api, modelName, model.getDescription(), generateSchema(api, model, modelName, swagger.getDefinitions()), modelContentType);
115115
}
116116

117117
private void updateMethods(RestApi api, String basePath, Map<String, Path> paths, List<String> apiProduces) {
@@ -313,17 +313,17 @@ private Boolean isApiKeyRequired(Operation op) {
313313
return false;
314314
}
315315

316-
private String generateSchema(Property model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
317-
return generateSchemaString(model, modelName, definitions);
316+
private String generateSchema(RestApi api, Property model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
317+
return generateSchemaString(api, model, modelName, definitions);
318318
}
319319

320-
private String generateSchemaString(Object model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
320+
private String generateSchemaString(RestApi api, Object model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
321321
try {
322322
String modelSchema = Json.mapper().writeValueAsString(model);
323323
String models = Json.mapper().writeValueAsString(definitions);
324324

325325
// inline all references
326-
String schema = new SchemaTransformer().flatten(modelSchema, models);
326+
String schema = new SchemaTransformer().flatten(api.getId(), modelSchema, models);
327327

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

@@ -333,8 +333,8 @@ private String generateSchemaString(Object model, String modelName, Map<String,
333333
}
334334
}
335335

336-
private String generateSchema(com.wordnik.swagger.models.Model model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
337-
return generateSchemaString(model, modelName, definitions);
336+
private String generateSchema(RestApi api, com.wordnik.swagger.models.Model model, String modelName, Map<String, com.wordnik.swagger.models.Model> definitions) {
337+
return generateSchemaString(api, model, modelName, definitions);
338338
}
339339

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

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

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

0 commit comments

Comments
 (0)