diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 9f063bef496bcdf08c73267e6ea02e87eeaf2ba6..813a448da9f0e1b1b9837226d519b3b91b998d49 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -4035,9 +4035,7 @@ public class DefaultCodegen implements CodegenConfig { } r.message = escapeText(response.getDescription()); - // TODO need to revise and test examples in responses - // ApiResponse does not support examples at the moment - //r.examples = toExamples(response.getExamples()); + r.examples = toExamples(response.getContent()); r.jsonSchema = Json.pretty(response); if (response.getExtensions() != null && !response.getExtensions().isEmpty()) { r.vendorExtensions.putAll(response.getExtensions()); @@ -4668,6 +4666,37 @@ public class DefaultCodegen implements CodegenConfig { return output; } + @SuppressWarnings("static-method") + protected List<Map<String, Object>> toExamples(Content content) { + if (content == null || content.isEmpty()) { + return null; + } + + int totalExamples = 0; + for (Map.Entry<String, MediaType> entry : content.entrySet()) { + if (entry.getValue().getExamples() != null) { + totalExamples += entry.getValue().getExamples().size(); + } + } + + if (totalExamples == 0) { + return null; + } + + final List<Map<String, Object>> output = new ArrayList<Map<String, Object>>(totalExamples); + for (Map.Entry<String, MediaType> entry : content.entrySet()) { + if (entry.getValue().getExamples() != null) { + for (Map.Entry<String, Example> exampleEntry : entry.getValue().getExamples().entrySet()) { + final Map<String, Object> kv = new HashMap<String, Object>(); + kv.put("contentType", entry.getKey()); + kv.put("example", exampleEntry.getValue().getValue()); + output.add(kv); + } + } + } + return output; + } + /** * Add headers to codegen property * diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AsciidocDocumentationCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AsciidocDocumentationCodegen.java index db3b11e426734249b467db66a09a11b530673791..a388f9fdec54e10fb9aae840855944c516e7d0fc 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AsciidocDocumentationCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AsciidocDocumentationCodegen.java @@ -37,6 +37,8 @@ import com.samskivert.mustache.Template; import io.swagger.v3.oas.models.OpenAPI; +import com.fasterxml.jackson.databind.ObjectMapper; + /** * basic asciidoc markup generator. * @@ -149,6 +151,35 @@ public class AsciidocDocumentationCodegen extends DefaultCodegen implements Code } } + /** + * Lamda emitting a formatted asciidoc code example. Use: + * + * <pre> + * {{#snippetformatexample}}{{example}}{{/snippetformatjsonexample}} + * </pre> + */ + public class FormatExampleMarkupLambda implements Mustache.Lambda { + + @Override + public void execute(final Template.Fragment frag, final Writer out) throws IOException { + final String content = frag.execute(); + + out.write("[source"); + + if (content.length() > 0 && content.charAt(0) == '{') { + // Assume it is JSON + out.write(",json]\n----\n"); + ObjectMapper mapper = new ObjectMapper(); + mapper.writerWithDefaultPrettyPrinter().writeValue(out, mapper.readTree(content)); + } else { + out.write("]\n----\n"); + out.write(content); + } + + out.write("\n----\n"); + } + } + protected String invokerPackage = "org.openapitools.client"; protected String groupId = "org.openapitools"; protected String artifactId = "openapi-client"; @@ -162,6 +193,7 @@ public class AsciidocDocumentationCodegen extends DefaultCodegen implements Code private IncludeMarkupLambda includeSpecMarkupLambda; private IncludeMarkupLambda includeSnippetMarkupLambda; private LinkMarkupLambda linkSnippetMarkupLambda; + private FormatExampleMarkupLambda formatExampleMarkupLambda; public CodegenType getTag() { return CodegenType.DOCUMENTATION; @@ -343,6 +375,9 @@ public class AsciidocDocumentationCodegen extends DefaultCodegen implements Code this.linkSnippetMarkupLambda = new LinkMarkupLambda(snippetDir); additionalProperties.put("snippetlink", this.linkSnippetMarkupLambda); + this.formatExampleMarkupLambda = new FormatExampleMarkupLambda(); + additionalProperties.put("snippetformatexample", this.formatExampleMarkupLambda); + processBooleanFlag(HEADER_ATTRIBUTES_FLAG, headerAttributes); processBooleanFlag(USE_INTRODUCTION_FLAG, useIntroduction); processBooleanFlag(SKIP_EXAMPLES_FLAG, skipExamples); diff --git a/modules/openapi-generator/src/main/resources/asciidoc-documentation/index.mustache b/modules/openapi-generator/src/main/resources/asciidoc-documentation/index.mustache index fcab76298ef10ed80fc3538148cb06c8825f02d5..f9272d01af93f86dc0a9033f17aeae85a627be19 100644 --- a/modules/openapi-generator/src/main/resources/asciidoc-documentation/index.mustache +++ b/modules/openapi-generator/src/main/resources/asciidoc-documentation/index.mustache @@ -96,7 +96,7 @@ Operation Id:: {{nickname}} ===== Responses .http response codes -[cols="2,3,1"] +[cols="1,2,3a"] |=== | Code | Message | Datatype @@ -106,6 +106,14 @@ Operation Id:: {{nickname}} | {{message}} | {{^simpleType}}{{dataType}}[<<{{baseType}}>>]{{/simpleType}} {{#simpleType}}<<{{dataType}}>>{{/simpleType}} +{{^skipExamples}} +{{#examples}} +.{{contentType}} +{{#snippetformatexample}}{{{example}}}{{/snippetformatexample}} + +{{/examples}} +{{/skipExamples}} + {{/responses}} |===