diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java index 4dc27f16de..4a69669d7c 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java @@ -6,6 +6,7 @@ import io.swagger.models.properties.ObjectProperty; import io.swagger.models.properties.Property; import io.swagger.models.properties.RefProperty; +import io.swagger.models.properties.StringProperty; import io.swagger.models.refs.RefFormat; import io.swagger.models.refs.RefType; import io.swagger.parser.ResolverCache; @@ -110,10 +111,7 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { if (isAnExternalRefFormat(refModel.getRefFormat())) { String joinedRef = join(file, refModel.get$ref()); refModel.set$ref(processRefToExternalDefinition(joinedRef, refModel.getRefFormat())); - }/*else if (isAnExternalRefFormat(refModel.getOriginalRefFormat())) { - String joinedRef = join(file, refModel.getOriginalRef()); - refModel.set$ref(processRefToExternalDefinition(joinedRef, refModel.getOriginalRefFormat())); - }*/else { + }else { processRefToExternalDefinition(file + refModel.get$ref(), RefFormat.RELATIVE); } } else if (allOfModel instanceof ModelImpl) { @@ -127,6 +125,12 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { if (model instanceof ModelImpl) { ModelImpl modelImpl = (ModelImpl) model; + + String discriminator = modelImpl.getDiscriminator(); + if (discriminator != null){ + processDiscriminator(discriminator,modelImpl.getProperties(), file); + } + Property additionalProperties = modelImpl.getAdditionalProperties(); if (additionalProperties != null) { if (additionalProperties instanceof RefProperty) { @@ -157,6 +161,8 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { } + + public String processRefToExternalResponse(String $ref, RefFormat refFormat) { String renamedRef = cache.getRenamedRef($ref); @@ -208,6 +214,24 @@ public String processRefToExternalResponse(String $ref, RefFormat refFormat) { return newRef; } + private void processDiscriminator(String discriminator, Map properties, String file) { + for (Map.Entry prop : properties.entrySet()) { + if (prop.getKey().equals(discriminator)){ + if (prop.getValue() instanceof StringProperty){ + StringProperty stringProperty = (StringProperty) prop.getValue(); + if(stringProperty.getEnum() != null){ + for(String name: stringProperty.getEnum()){ + processRefProperty(new RefProperty(RefType.DEFINITION.getInternalPrefix()+name), file); + } + } + + + } + } + } + + } + private void processProperties(final Map subProps, final String file) { if (subProps == null || 0 == subProps.entrySet().size() ) { return; @@ -245,6 +269,17 @@ else if (prop.getValue() instanceof ObjectProperty){ } } + private void processDiscriminatorAsRefProperty(RefProperty subRef, String externalFile) { + + if (isAnExternalRefFormat(subRef.getRefFormat())) { + String joinedRef = join(externalFile, subRef.get$ref()); + subRef.set$ref(processRefToExternalDefinition(joinedRef, subRef.getRefFormat())); + } else { + String processRef = processRefToExternalDefinition(externalFile + subRef.get$ref(), RefFormat.RELATIVE); + subRef.set$ref(RefType.DEFINITION.getInternalPrefix()+processRef); + } + } + private void processRefProperty(RefProperty subRef, String externalFile) { if (isAnExternalRefFormat(subRef.getRefFormat())) { diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java index 2aed6dc989..2276a57cbf 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java @@ -69,17 +69,33 @@ public void testIssueRelativeRefs2(){ assertEquals(refProperty.get$ref(),"#/definitions/simpleIDType_v01"); } + @Test + public void testIssue927() { + Swagger swagger = new SwaggerParser().read("issue-927/issue-927.yaml"); + assertNotNull(swagger); + assertTrue(swagger.getDefinitions().size() == 3); + assertNotNull(swagger.getDefinitions().get("Pet")); + assertNotNull(swagger.getDefinitions().get("Cat")); + assertNotNull(swagger.getDefinitions().get("Dog")); + } + @Test public void testIssue901_2() { Swagger swagger = new SwaggerParser().read("issue-901/spec2.yaml"); assertNotNull(swagger); - Yaml.prettyPrint(swagger); + assertNotNull(swagger.getDefinitions()); + ArrayProperty arraySchema = (ArrayProperty) swagger.getDefinitions().get("Test.Definition").getProperties().get("stuff"); + String internalRef = ((RefProperty) arraySchema.getItems()).get$ref(); + assertEquals(internalRef,"#/definitions/TEST.THING.OUT.Stuff"); } @Test public void testIssue901() { Swagger swagger = new SwaggerParser().read("issue-901/spec.yaml"); assertNotNull(swagger); + String internalRef = ((RefModel)swagger.getPaths().get("/test").getPut().getResponses().get("200").getResponseSchema()).get$ref(); + assertEquals(internalRef,"#/definitions/Test.Definition"); + assertNotNull(swagger.getDefinitions()); } diff --git a/modules/swagger-parser/src/test/resources/issue-927/issue-927.yaml b/modules/swagger-parser/src/test/resources/issue-927/issue-927.yaml new file mode 100644 index 0000000000..199b86b14f --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue-927/issue-927.yaml @@ -0,0 +1,14 @@ +# API definition + +swagger: '2.0' +info: + version: '1.0.0' + title: Discriminator and Resolved YAML +paths: + /pet: + get: + responses: + 200: + description: A single pet + schema: + $ref: "remote.yaml/#/definitions/Pet" \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/issue-927/remote.yaml b/modules/swagger-parser/src/test/resources/issue-927/remote.yaml new file mode 100644 index 0000000000..6836869519 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue-927/remote.yaml @@ -0,0 +1,47 @@ +# Domain + +definitions: + Pet: + type: object + discriminator: petType + properties: + name: + type: string + petType: + type: string + enum: [Cat, Dog] + required: + - name + - petType + + Cat: ## "Cat" will be used as the discriminator value + description: A representation of a cat + allOf: + - $ref: '#/definitions/Pet' + - type: object + properties: + huntingSkill: + type: string + description: The measured skill for hunting + enum: + - clueless + - lazy + - adventurous + - aggressive + required: + - huntingSkill + + Dog: ## "Dog" will be used as the discriminator value + description: A representation of a dog + allOf: + - $ref: '#/definitions/Pet' + - type: object + properties: + packSize: + type: integer + format: int32 + description: the size of the pack the dog is from + default: 0 + minimum: 0 + required: + - packSize \ No newline at end of file