Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand Down Expand Up @@ -157,6 +161,8 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) {
}




public String processRefToExternalResponse(String $ref, RefFormat refFormat) {

String renamedRef = cache.getRenamedRef($ref);
Expand Down Expand Up @@ -208,6 +214,24 @@ public String processRefToExternalResponse(String $ref, RefFormat refFormat) {
return newRef;
}

private void processDiscriminator(String discriminator, Map<String, Property> properties, String file) {
for (Map.Entry<String, Property> 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<String, Property> subProps, final String file) {
if (subProps == null || 0 == subProps.entrySet().size() ) {
return;
Expand Down Expand Up @@ -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())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());

}

Expand Down
14 changes: 14 additions & 0 deletions modules/swagger-parser/src/test/resources/issue-927/issue-927.yaml
Original file line number Diff line number Diff line change
@@ -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"
47 changes: 47 additions & 0 deletions modules/swagger-parser/src/test/resources/issue-927/remote.yaml
Original file line number Diff line number Diff line change
@@ -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