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 @@ -27,13 +27,16 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class ExamplesUtil {

private static Logger logger = LoggerFactory.getLogger(ExamplesUtil.class);

private static final Integer MAX_RECURSION_TO_DISPLAY = 2;

/**
* Generates a Map of response examples
Expand All @@ -58,7 +61,7 @@ public static Map<String, Object> generateResponseExampleMap(boolean generateMis

if (example == null && schema instanceof RefProperty) {
String simpleRef = ((RefProperty) schema).getSimpleRef();
example = generateExampleForRefModel(generateMissingExamples, simpleRef, definitions, markupDocBuilder);
example = generateExampleForRefModel(generateMissingExamples, simpleRef, definitions, markupDocBuilder, new HashMap< String, Integer >());
}
if (example == null && generateMissingExamples) {
example = PropertyUtils.generateExample(schema, markupDocBuilder);
Expand Down Expand Up @@ -99,17 +102,17 @@ public static Map<String, Object> generateRequestExampleMap(boolean generateMiss
Model schema = ((BodyParameter) parameter).getSchema();
if (schema instanceof RefModel) {
String simpleRef = ((RefModel) schema).getSimpleRef();
example = generateExampleForRefModel(generateMissingExamples, simpleRef, definitions, markupDocBuilder);
example = generateExampleForRefModel(generateMissingExamples, simpleRef, definitions, markupDocBuilder, new HashMap< String, Integer >());
} else if (generateMissingExamples) {
if (schema instanceof ComposedModel) {
example = exampleMapForProperties(getPropertiesForComposedModel(
(ComposedModel) schema, definitions), definitions, markupDocBuilder);
(ComposedModel) schema, definitions), definitions, markupDocBuilder, new HashMap< String, Integer >());
} else if (schema instanceof ArrayModel) {
example = generateExampleForArrayModel((ArrayModel) schema, definitions, markupDocBuilder);
example = generateExampleForArrayModel((ArrayModel) schema, definitions, markupDocBuilder, new HashMap< String, Integer >());
} else {
example = schema.getExample();
if (example == null) {
example = exampleMapForProperties(schema.getProperties(), definitions, markupDocBuilder);
example = exampleMapForProperties(schema.getProperties(), definitions, markupDocBuilder, new HashMap< String, Integer >());
}
}
}
Expand Down Expand Up @@ -150,7 +153,7 @@ public static Map<String, Object> generateRequestExampleMap(boolean generateMiss
}
} else if (parameter instanceof RefParameter) {
String simpleRef = ((RefParameter) parameter).getSimpleRef();
example = generateExampleForRefModel(generateMissingExamples, simpleRef, definitions, markupDocBuilder);
example = generateExampleForRefModel(generateMissingExamples, simpleRef, definitions, markupDocBuilder, new HashMap< String, Integer >());
}

if (example != null)
Expand All @@ -167,19 +170,30 @@ public static Map<String, Object> generateRequestExampleMap(boolean generateMiss
* @param simpleRef the simple reference string
* @param definitions the map of definitions
* @param markupDocBuilder the markup builder
* @param refStack map to detect cyclic references
* @return returns an Object or Map of examples
*/
public static Object generateExampleForRefModel(boolean generateMissingExamples, String simpleRef, Map<String, Model> definitions, MarkupDocBuilder markupDocBuilder) {
public static Object generateExampleForRefModel(boolean generateMissingExamples, String simpleRef, Map<String, Model> definitions, MarkupDocBuilder markupDocBuilder, Map< String, Integer > refStack) {
Model model = definitions.get(simpleRef);
Object example = null;
if (model != null) {
example = model.getExample();
if (example == null && generateMissingExamples) {
if (model instanceof ComposedModel) {
example = exampleMapForProperties(getPropertiesForComposedModel((ComposedModel) model, definitions), definitions, markupDocBuilder);
if (!refStack.containsKey(simpleRef)) {
refStack.put(simpleRef, 1);
} else {
example = exampleMapForProperties(model.getProperties(), definitions, markupDocBuilder);
refStack.put(simpleRef, refStack.get(simpleRef) + 1);
}
if (refStack.get(simpleRef) <= MAX_RECURSION_TO_DISPLAY) {
if (model instanceof ComposedModel) {
example = exampleMapForProperties(getPropertiesForComposedModel((ComposedModel) model, definitions), definitions, markupDocBuilder, refStack);
} else {
example = exampleMapForProperties(model.getProperties(), definitions, markupDocBuilder, refStack);
}
}else{
return "...";
}
refStack.put(simpleRef, refStack.get(simpleRef) - 1);
}
}
return example;
Expand Down Expand Up @@ -217,19 +231,20 @@ private static Map<String, Property> getPropertiesForComposedModel(ComposedModel
* @param properties the map of properties
* @param definitions the map of definitions
* @param markupDocBuilder the markup builder
* @param refStack map to detect cyclic references
*
* @return a Map of examples
*/
public static Map<String, Object> exampleMapForProperties(Map<String, Property> properties, Map<String, Model> definitions, MarkupDocBuilder markupDocBuilder) {
public static Map<String, Object> exampleMapForProperties(Map<String, Property> properties, Map<String, Model> definitions, MarkupDocBuilder markupDocBuilder, Map< String, Integer > refStack) {
Map<String, Object> exampleMap = new LinkedHashMap<>();
if (properties != null) {
for (Map.Entry<String, Property> property : properties.entrySet()) {
Object exampleObject = property.getValue().getExample();
if (exampleObject == null) {
if (property.getValue() instanceof RefProperty) {
exampleObject = generateExampleForRefModel(true, ((RefProperty) property.getValue()).getSimpleRef(), definitions, markupDocBuilder);
exampleObject = generateExampleForRefModel(true, ((RefProperty) property.getValue()).getSimpleRef(), definitions, markupDocBuilder, refStack);
} else if (property.getValue() instanceof ArrayProperty) {
exampleObject = generateExampleForArrayProperty((ArrayProperty) property.getValue(), definitions, markupDocBuilder);
exampleObject = generateExampleForArrayProperty((ArrayProperty) property.getValue(), definitions, markupDocBuilder, refStack);
} else if (property.getValue() instanceof MapProperty) {
exampleObject = generateExampleForMapProperty((MapProperty) property.getValue(), markupDocBuilder);
}
Expand Down Expand Up @@ -257,19 +272,19 @@ public static Object generateExampleForMapProperty(MapProperty property, MarkupD
return exampleMap;
}

public static Object generateExampleForArrayModel(ArrayModel model, Map<String, Model> definitions, MarkupDocBuilder markupDocBuilder) {
public static Object generateExampleForArrayModel(ArrayModel model, Map<String, Model> definitions, MarkupDocBuilder markupDocBuilder, Map< String, Integer > refStack) {
if (model.getExample() != null) {
return model.getExample();
} else if (model.getProperties() != null) {
return new Object[]{exampleMapForProperties(model.getProperties(), definitions, markupDocBuilder)};
return new Object[]{exampleMapForProperties(model.getProperties(), definitions, markupDocBuilder, refStack)};
} else {
Property itemProperty = model.getItems();
if (itemProperty.getExample() != null) {
return new Object[]{itemProperty.getExample()};
} else if (itemProperty instanceof ArrayProperty) {
return new Object[]{generateExampleForArrayProperty((ArrayProperty) itemProperty, definitions, markupDocBuilder)};
return new Object[]{generateExampleForArrayProperty((ArrayProperty) itemProperty, definitions, markupDocBuilder, refStack)};
} else if (itemProperty instanceof RefProperty) {
return new Object[]{generateExampleForRefModel(true, ((RefProperty) itemProperty).getSimpleRef(), definitions, markupDocBuilder)};
return new Object[]{generateExampleForRefModel(true, ((RefProperty) itemProperty).getSimpleRef(), definitions, markupDocBuilder, refStack)};
} else {
return new Object[]{PropertyUtils.generateExample(itemProperty, markupDocBuilder)};
}
Expand All @@ -284,14 +299,14 @@ public static Object generateExampleForArrayModel(ArrayModel model, Map<String,
* @param markupDocBuilder the markup builder
* @return array of Object
*/
public static Object[] generateExampleForArrayProperty(ArrayProperty value, Map<String, Model> definitions, MarkupDocBuilder markupDocBuilder) {
public static Object[] generateExampleForArrayProperty(ArrayProperty value, Map<String, Model> definitions, MarkupDocBuilder markupDocBuilder, Map< String, Integer > refStack) {
Property property = value.getItems();
if (property.getExample() != null) {
return new Object[]{property.getExample()};
} else if (property instanceof ArrayProperty) {
return new Object[]{generateExampleForArrayProperty((ArrayProperty) property, definitions, markupDocBuilder)};
return new Object[]{generateExampleForArrayProperty((ArrayProperty) property, definitions, markupDocBuilder, refStack)};
} else if (property instanceof RefProperty) {
return new Object[]{generateExampleForRefModel(true, ((RefProperty) property).getSimpleRef(), definitions, markupDocBuilder)};
return new Object[]{generateExampleForRefModel(true, ((RefProperty) property).getSimpleRef(), definitions, markupDocBuilder, refStack)};
} else {
return new Object[]{PropertyUtils.generateExample(property, markupDocBuilder)};
}
Expand Down
19 changes: 19 additions & 0 deletions src/test/java/io/github/swagger2markup/AsciidocConverterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,25 @@ public void testSwagger2AsciiDocConversionWithGeneratedExamples() throws IOExcep
Path expectedFilesDirectory = Paths.get(AsciidocConverterTest.class.getResource("/expected/asciidoc/generated_examples").toURI());
DiffUtils.assertThatAllFilesAreEqual(expectedFilesDirectory, outputDirectory, "testSwagger2AsciiDocConversionWithGeneratedExamples.html");
}

@Test
public void testSwagger2AsciiDocConversionWithGeneratedRecursiveExamples() throws IOException, URISyntaxException {
// Given
String swaggerJsonString = IOUtils.toString(getClass().getResourceAsStream("/json/swagger_recursion.json"));
Path outputDirectory = Paths.get("build/test/asciidoc/generated_recursion_examples");
FileUtils.deleteQuietly(outputDirectory.toFile());

// When
Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder().withoutInlineSchema().withGeneratedExamples().build();

Swagger2MarkupConverter.from(swaggerJsonString).withConfig(config).build().toFolder(outputDirectory);

// Then
String[] files = outputDirectory.toFile().list();
assertThat(files).hasSize(4).containsAll(expectedFiles);
Path expectedFilesDirectory = Paths.get(AsciidocConverterTest.class.getResource("/expected/asciidoc/generated_recursion_examples").toURI());
DiffUtils.assertThatAllFilesAreEqual(expectedFilesDirectory, outputDirectory, "testSwagger2AsciiDocConversionWithGeneratedRecursiveExamples.html");
}

@Test
public void testSwagger2AsciiDocWithInlineSchema() throws IOException, URISyntaxException {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@

[[_definitions]]
== Definitions

[[_navigationentry]]
=== NavigationEntry

[options="header", cols=".^3,.^11,.^4"]
|===
|Name|Description|Schema
|*childs* +
_optional_|*Example* : `[ "<<_navigationentry>>" ]`|< <<_navigationentry,NavigationEntry>> > array
|*id* +
_optional_|Primary key of this entry +
*Example* : `0.0`|number(int64)
|===



Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
= API


[[_overview]]
== Overview

=== Version information
[%hardbreaks]
_Version_ : 2.0.0


=== URI scheme
[%hardbreaks]
_BasePath_ : /navigation
_Schemes_ : HTTPS


=== Consumes

* `application/json`


=== Produces

* `application/json`



Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@

[[_paths]]
== Paths

[[_usernavigation]]
=== Get navigation
....
GET /
....


==== Description
Returns the navigation as a tree


==== Responses

[options="header", cols=".^2,.^14,.^4"]
|===
|HTTP Code|Description|Schema
|*200*|Successful response|<<_navigationentry,NavigationEntry>>
|===


==== Tags

* Navigation


==== Example HTTP request

===== Request path
[source,json]
----
"/"
----


==== Example HTTP response

===== Response 200
[source,json]
----
{
"id" : 0.0,
"childs" : [ {
"id" : 0.0,
"childs" : [ "..." ]
} ]
}
----


[[_updatenavigation]]
=== update entry
....
PUT /
....


==== Description
Updates the navigation tree


==== Parameters

[options="header", cols=".^2,.^3,.^9,.^4,.^2"]
|===
|Type|Name|Description|Schema|Default
|*Body*|*entry* +
_optional_||<<_navigationentry,NavigationEntry>>|
|===


==== Responses

[options="header", cols=".^2,.^14,.^4"]
|===
|HTTP Code|Description|Schema
|*200*|Successful response|<<_navigationentry,NavigationEntry>>
|===


==== Tags

* Navigation


==== Example HTTP request

===== Request path
[source,json]
----
"/"
----


===== Request body
[source,json]
----
{
"id" : 0.0,
"childs" : [ {
"id" : 0.0,
"childs" : [ "..." ]
} ]
}
----


==== Example HTTP response

===== Response 200
[source,json]
----
{
"id" : 0.0,
"childs" : [ {
"id" : 0.0,
"childs" : [ "..." ]
} ]
}
----



Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@


Loading