diff --git a/README.adoc b/README.adoc index 15053a3a..76f945e4 100644 --- a/README.adoc +++ b/README.adoc @@ -1,6 +1,6 @@ = Swagger2Markup :author: Robert Winkler -:version: 0.2.2 +:version: 0.2.3 :hardbreaks: image:https://travis-ci.org/RobWin/swagger2markup.svg["Build Status", link="https://travis-ci.org/RobWin/swagger2markup"] image:https://coveralls.io/repos/RobWin/swagger2markup/badge.svg["Coverage Status", link="https://coveralls.io/r/RobWin/swagger2markup"] image:https://api.bintray.com/packages/robwin/maven/swagger2markup/images/download.svg[link="https://bintray.com/robwin/maven/swagger2markup/_latestVersion"] image:http://img.shields.io/badge/license-ASF2-blue.svg["Apache License 2", link="http://www.apache.org/licenses/LICENSE-2.0.txt"] @@ -37,7 +37,7 @@ The project is published in JCenter and Maven Central. io.github.robwin swagger2markup - 0.2.2 + 0.2.3 ---- @@ -49,7 +49,7 @@ repositories { jcenter() } -compile "io.github.robwin:swagger2markup:0.2.2" +compile "io.github.robwin:swagger2markup:0.2.3" ---- === Using Swagger2Markup @@ -84,6 +84,22 @@ public class Swagger2MarkupTest { Swagger2MarkupConverter.from(file.getAbsolutePath()).build() .intoFolder("src/docs/asciidoc"); } + + @Test + public void testSwagger2HtmlConversion() throws IOException { + File file = new File(Swagger2MarkupConverterTest.class.getResource("/json/swagger.json").getFile()); + String asciiDoc = Swagger2MarkupConverter.from(file.getAbsolutePath()).build().asString(); + String path = "src/docs/asciidocAsString"; + Files.createDirectories(Paths.get(path)); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(path, "swagger.adoc"), StandardCharsets.UTF_8)){ + writer.write(asciiDoc); } + String asciiDocAsHtml = Asciidoctor.Factory.create().convert(asciiDoc, + OptionsBuilder.options().backend("html5").headerFooter(true).safe(SafeMode.UNSAFE).docType("book").attributes(AttributesBuilder.attributes() + .tableOfContents(true).tableOfContents(Placement.LEFT).sectionNumbers(true).hardbreaks(true).setAnchors(true).attribute("sectlinks"))); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(path, "swagger.html"), StandardCharsets.UTF_8)){ + writer.write(asciiDocAsHtml); + } + } } ---- diff --git a/build.gradle b/build.gradle index 60045d8f..30ce5506 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { } } description = 'swagger2markup Build' -version = '0.2.2' +version = '0.2.3' group = 'io.github.robwin' apply plugin: 'java' @@ -36,6 +36,7 @@ tasks.withType(JavaCompile) { repositories { jcenter() mavenCentral() + mavenLocal() } dependencies { @@ -45,11 +46,13 @@ dependencies { compile 'commons-io:commons-io' compile 'ch.qos.logback:logback-classic' testCompile 'junit:junit' + testCompile 'org.asciidoctor:asciidoctorj:1.5.2' + testCompile 'org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.6' } dependencyManagement { dependencies { - "io.github.robwin:markup-document-builder" "0.1.1" + "io.github.robwin:markup-document-builder" "0.1.2" "io.swagger:swagger-compat-spec-parser" "1.0.0" "commons-collections:commons-collections" "3.2.1" "commons-io:commons-io" "2.4" diff --git a/images/asciidoc.PNG b/images/asciidoc.PNG index 3541d1a2..979d69af 100644 Binary files a/images/asciidoc.PNG and b/images/asciidoc.PNG differ diff --git a/images/asciidoc_html.PNG b/images/asciidoc_html.PNG index 87bb9566..293494d5 100644 Binary files a/images/asciidoc_html.PNG and b/images/asciidoc_html.PNG differ diff --git a/images/asciidoc_pdf.PNG b/images/asciidoc_pdf.PNG index 15a369f3..207c2808 100644 Binary files a/images/asciidoc_pdf.PNG and b/images/asciidoc_pdf.PNG differ diff --git a/images/markdown.PNG b/images/markdown.PNG index 38e883ba..1300d002 100644 Binary files a/images/markdown.PNG and b/images/markdown.PNG differ diff --git a/src/main/java/io/github/robwin/swagger2markup/Swagger2MarkupConverter.java b/src/main/java/io/github/robwin/swagger2markup/Swagger2MarkupConverter.java index 425834ce..7ae6e385 100644 --- a/src/main/java/io/github/robwin/swagger2markup/Swagger2MarkupConverter.java +++ b/src/main/java/io/github/robwin/swagger2markup/Swagger2MarkupConverter.java @@ -45,10 +45,21 @@ public class Swagger2MarkupConverter { * @return a Swagger2MarkupConverter */ public static Builder from(String swaggerSource){ - Validate.notEmpty(swaggerSource, "swaggerSource must not be null!"); + Validate.notEmpty(swaggerSource, "swaggerSource must not be empty!"); return new Builder(swaggerSource); } + /** + * Creates a Swagger2MarkupConverter.Builder from a given Swagger model. + * + * @param swagger the Swagger source. + * @return a Swagger2MarkupConverter + */ + public static Builder from(Swagger swagger){ + Validate.notNull(swagger, "swagger must not be null!"); + return new Builder(swagger); + } + /** * Builds the document with the given markup language and stores * the files in the given folder. @@ -61,6 +72,15 @@ public class Swagger2MarkupConverter { buildDocuments(targetFolderPath); } + /** + * Builds the document with the given markup language and returns it as a String + * + * @return a the document as a String + */ + public String asString() throws IOException{ + return buildDocuments(); + } + /** * Writes a file for the Paths (API) and a file for the Definitions (Model) @@ -72,6 +92,16 @@ public class Swagger2MarkupConverter { new DefinitionsDocument(swagger, markupLanguage, schemasFolderPath).build().writeToFile(directory, DEFINITIONS_DOCUMENT, StandardCharsets.UTF_8); } + /** + * Returns a file for the Paths (API) and a file for the Definitions (Model) + + * @return a the document as a String + */ + private String buildDocuments() throws IOException { + return new PathsDocument(swagger, markupLanguage, examplesFolderPath).build().toString() + .concat(new DefinitionsDocument(swagger, markupLanguage, schemasFolderPath).build().toString()); + } + public static class Builder{ private final Swagger swagger; @@ -88,6 +118,17 @@ public class Swagger2MarkupConverter { swagger = new SwaggerParser().read(swaggerSource); } + /** + * Creates a Builder using a given Swagger model. + * + * @param swagger the Swagger source. + */ + Builder(Swagger swagger){ + this.swagger = swagger; + } + + + public Swagger2MarkupConverter build(){ return new Swagger2MarkupConverter(markupLanguage, swagger, examplesFolderPath, schemasFolderPath); } diff --git a/src/main/java/io/github/robwin/swagger2markup/builder/document/DefinitionsDocument.java b/src/main/java/io/github/robwin/swagger2markup/builder/document/DefinitionsDocument.java index 7fa2c96d..3aacdc4d 100644 --- a/src/main/java/io/github/robwin/swagger2markup/builder/document/DefinitionsDocument.java +++ b/src/main/java/io/github/robwin/swagger2markup/builder/document/DefinitionsDocument.java @@ -2,8 +2,10 @@ package io.github.robwin.swagger2markup.builder.document; import com.wordnik.swagger.models.Model; import com.wordnik.swagger.models.Swagger; +import com.wordnik.swagger.models.properties.AbstractProperty; import com.wordnik.swagger.models.properties.Property; import io.github.robwin.markup.builder.MarkupLanguage; +import io.github.robwin.swagger2markup.utils.PropertyUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; @@ -26,8 +28,6 @@ public class DefinitionsDocument extends MarkupDocument { private static final List IGNORED_DEFINITIONS = Arrays.asList("Void"); private static final String JSON_SCHEMA = "JSON Schema"; private static final String XML_SCHEMA = "XML Schema"; - private static final String NAME_COLUMN = "Name"; - private static final String TYPE_COLUMN = "Type"; public static final String JSON_SCHEMA_EXTENSION = ".json"; public static final String XML_SCHEMA_EXTENSION = ".xsd"; public static final String JSON = "json"; @@ -104,13 +104,22 @@ public class DefinitionsDocument extends MarkupDocument { private void definition(String definitionName, Model model) { this.markupDocBuilder.sectionTitleLevel2(definitionName); Map properties = model.getProperties(); - List csvContent = new ArrayList<>(); - csvContent.add(NAME_COLUMN + DELIMITER + TYPE_COLUMN + DELIMITER + REQUIRED_COLUMN); + List headerAndContent = new ArrayList<>(); + List header = Arrays.asList(NAME_COLUMN, DESCRIPTION_COLUMN, SCHEMA_COLUMN, REQUIRED_COLUMN); + headerAndContent.add(StringUtils.join(header, DELIMITER)); for (Map.Entry propertyEntry : properties.entrySet()) { Property property = propertyEntry.getValue(); - csvContent.add(propertyEntry.getKey() + DELIMITER + property.getType() + DELIMITER + property.getRequired()); + String description = ""; + if(property instanceof AbstractProperty){ + if(StringUtils.isNotBlank(property.getDescription())){ + description = property.getDescription(); + } + } + String type = PropertyUtils.getType(property, markupLanguage); + List content = Arrays.asList(propertyEntry.getKey(), description, type, Boolean.toString(property.getRequired())); + headerAndContent.add(StringUtils.join(content, DELIMITER)); } - this.markupDocBuilder.tableWithHeaderRow(csvContent); + this.markupDocBuilder.tableWithHeaderRow(headerAndContent); } private void definitionSchema(String definitionName) throws IOException { diff --git a/src/main/java/io/github/robwin/swagger2markup/builder/document/MarkupDocument.java b/src/main/java/io/github/robwin/swagger2markup/builder/document/MarkupDocument.java index 0a9f4871..ca2453e6 100644 --- a/src/main/java/io/github/robwin/swagger2markup/builder/document/MarkupDocument.java +++ b/src/main/java/io/github/robwin/swagger2markup/builder/document/MarkupDocument.java @@ -15,8 +15,12 @@ import java.nio.charset.Charset; */ public abstract class MarkupDocument { - protected static final String DELIMITER = ","; + protected static final String DELIMITER = "|"; protected static final String REQUIRED_COLUMN = "Required"; + protected static final String SCHEMA_COLUMN = "Schema"; + protected static final String NAME_COLUMN = "Name"; + protected static final String DESCRIPTION_COLUMN = "Description"; + protected static final String DESCRIPTION = DESCRIPTION_COLUMN; protected Logger logger = LoggerFactory.getLogger(getClass()); protected Swagger swagger; protected MarkupLanguage markupLanguage; diff --git a/src/main/java/io/github/robwin/swagger2markup/builder/document/PathsDocument.java b/src/main/java/io/github/robwin/swagger2markup/builder/document/PathsDocument.java index 7f0e3d07..c6d65e4c 100644 --- a/src/main/java/io/github/robwin/swagger2markup/builder/document/PathsDocument.java +++ b/src/main/java/io/github/robwin/swagger2markup/builder/document/PathsDocument.java @@ -2,17 +2,22 @@ package io.github.robwin.swagger2markup.builder.document; import com.wordnik.swagger.models.*; import com.wordnik.swagger.models.parameters.Parameter; +import com.wordnik.swagger.models.properties.Property; import io.github.robwin.markup.builder.MarkupLanguage; +import io.github.robwin.swagger2markup.utils.ParameterUtils; +import io.github.robwin.swagger2markup.utils.PropertyUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.WordUtils; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -21,20 +26,27 @@ import java.util.Map; */ public class PathsDocument extends MarkupDocument { + private static final String PATHS = "Paths"; private static final String VERSION = "Version: "; - private static final String DESCRIPTION_COLUMN = "Description"; - private static final String DESCRIPTION = DESCRIPTION_COLUMN; + private static final String CONTACT_NAME = "Contact: "; + private static final String CONTACT_EMAIL = "Contact Email: "; + private static final String LICENSE = "License: "; + private static final String LICENSE_URL = "License URL: "; + private static final String TERMS_OF_SERVICE = "Terms of service: "; + private static final String HOST = "Host: "; + private static final String BASE_PATH = "BasePath: "; + private static final String SCHEMES = "Schemes: "; private static final String PARAMETERS = "Parameters"; private static final String PRODUCES = "Produces"; private static final String CONSUMES = "Consumes"; + private static final String TAGS = "Tags"; private static final String RESPONSES = "Responses"; private static final String EXAMPLE_REQUEST = "Example request"; private static final String EXAMPLE_RESPONSE = "Example response"; - private static final String NAME_COLUMN = "Name"; - private static final String LOCATED_IN_COLUMN = "Located in"; - private static final String CODE_COLUMN = "Code"; - public static final String REQUEST_EXAMPLE_FILE_NAME = "request"; - public static final String RESPONSE_EXAMPLE_FILE_NAME = "response"; + private static final String TYPE_COLUMN = "Type"; + private static final String HTTP_CODE_COLUMN = "HTTP Code"; + private static final String REQUEST_EXAMPLE_FILE_NAME = "request"; + private static final String RESPONSE_EXAMPLE_FILE_NAME = "response"; private boolean examplesEnabled; private String examplesFolderPath; @@ -58,32 +70,69 @@ public class PathsDocument extends MarkupDocument { @Override public MarkupDocument build() throws IOException { - documentHeader(swagger.getInfo()); - paths(swagger.getPaths()); + documentHeader(); + paths(); return this; } /** - * Builds the document header - * - * @param info the Swagger Info + * Builds the document header of the swagger model */ - private void documentHeader(Info info) { - this.markupDocBuilder - .documentTitle(info.getTitle()) - .textLine(info.getDescription()) - .textLine(VERSION + info.getVersion()) - .newLine(); + private void documentHeader() { + Info info = swagger.getInfo(); + this.markupDocBuilder.documentTitle(info.getTitle()); + if(StringUtils.isNotBlank(info.getDescription())){ + this.markupDocBuilder.textLine(info.getDescription()); + } + if(StringUtils.isNotBlank(info.getVersion())){ + this.markupDocBuilder.textLine(VERSION + info.getVersion()); + } + Contact contact = info.getContact(); + if(contact != null){ + if(StringUtils.isNotBlank(contact.getName())){ + this.markupDocBuilder.textLine(CONTACT_NAME + contact.getName()); + } + if(StringUtils.isNotBlank(contact.getEmail())){ + this.markupDocBuilder.textLine(CONTACT_EMAIL + contact.getEmail()); + } + } + License license = info.getLicense(); + if(license != null) { + if (StringUtils.isNotBlank(license.getName())) { + this.markupDocBuilder.textLine(LICENSE + license.getName()); + } + if (StringUtils.isNotBlank(license.getUrl())) { + this.markupDocBuilder.textLine(LICENSE_URL + license.getUrl()); + } + } + if(StringUtils.isNotBlank(info.getTermsOfService())){ + this.markupDocBuilder.textLine(TERMS_OF_SERVICE + info.getTermsOfService()); + } + this.markupDocBuilder.newLine(); + + if(StringUtils.isNotBlank(swagger.getHost())){ + this.markupDocBuilder.textLine(HOST + swagger.getHost()); + } + if(StringUtils.isNotBlank(swagger.getBasePath())){ + this.markupDocBuilder.textLine(BASE_PATH + swagger.getBasePath()); + } + if(CollectionUtils.isNotEmpty(swagger.getSchemes())){ + List schemes = new ArrayList<>(); + for(Scheme scheme : swagger.getSchemes()){ + schemes.add(scheme.toString()); + } + this.markupDocBuilder.textLine(SCHEMES + StringUtils.join(schemes, ", ")); + } + this.markupDocBuilder.newLine(); } /** - * Builds all paths of the Swagger file - * - * @param paths a Map of Swagger Paths + * Builds all paths of the Swagger model */ - private void paths(Map paths) throws IOException { + private void paths() throws IOException { + Map paths = swagger.getPaths(); if(MapUtils.isNotEmpty(paths)) { - //this.documentBuilder.sectionTitleLevel1(FEATURES); + this.markupDocBuilder.sectionTitleLevel1(PATHS); for (Map.Entry entry : paths.entrySet()) { Path path = entry.getValue(); path("GET", entry.getKey(), path.getGet()); @@ -110,21 +159,21 @@ public class PathsDocument extends MarkupDocument { responsesSection(operation); consumesSection(operation); producesSection(operation); + tagsSection(operation); examplesSection(operation); } } - private void pathTitle(String httpMethod, String resourcePath, Operation operation) { String summary = operation.getSummary(); String title; if(StringUtils.isNotBlank(summary)) { title = summary; - this.markupDocBuilder.sectionTitleLevel1(title); + this.markupDocBuilder.sectionTitleLevel2(title); this.markupDocBuilder.listing(httpMethod + " " + resourcePath); }else{ title = httpMethod + " " + resourcePath; - this.markupDocBuilder.sectionTitleLevel1(title); + this.markupDocBuilder.sectionTitleLevel2(title); } if (logger.isInfoEnabled()) { logger.info("Path processed: {}", title); @@ -134,7 +183,7 @@ public class PathsDocument extends MarkupDocument { private void descriptionSection(Operation operation) { String description = operation.getDescription(); if(StringUtils.isNotBlank(description)){ - this.markupDocBuilder.sectionTitleLevel2(DESCRIPTION); + this.markupDocBuilder.sectionTitleLevel3(DESCRIPTION); this.markupDocBuilder.paragraph(description); } } @@ -142,20 +191,26 @@ public class PathsDocument extends MarkupDocument { private void parametersSection(Operation operation) { List parameters = operation.getParameters(); if(CollectionUtils.isNotEmpty(parameters)){ - List csvContent = new ArrayList<>(); - csvContent.add(NAME_COLUMN + DELIMITER + LOCATED_IN_COLUMN + DELIMITER + DESCRIPTION_COLUMN + DELIMITER + REQUIRED_COLUMN); + List headerAndContent = new ArrayList<>(); + // Table header row + List header = Arrays.asList(TYPE_COLUMN, NAME_COLUMN, DESCRIPTION_COLUMN, REQUIRED_COLUMN, SCHEMA_COLUMN); + headerAndContent.add(StringUtils.join(header, DELIMITER)); for(Parameter parameter : parameters){ - csvContent.add(parameter.getName() + DELIMITER + parameter.getIn() + DELIMITER + parameter.getDescription() + DELIMITER + parameter.getRequired()); + String type = ParameterUtils.getType(parameter, markupLanguage); + String parameterType = WordUtils.capitalize(parameter.getIn() + "Parameter"); + // Table content row + List content = Arrays.asList(parameterType, parameter.getName(), parameter.getDescription(), Boolean.toString(parameter.getRequired()), type); + headerAndContent.add(StringUtils.join(content, DELIMITER)); } - this.markupDocBuilder.sectionTitleLevel2(PARAMETERS); - this.markupDocBuilder.tableWithHeaderRow(csvContent); + this.markupDocBuilder.sectionTitleLevel3(PARAMETERS); + this.markupDocBuilder.tableWithHeaderRow(headerAndContent); } } private void consumesSection(Operation operation) { List consumes = operation.getConsumes(); if(CollectionUtils.isNotEmpty(consumes)){ - this.markupDocBuilder.sectionTitleLevel2(CONSUMES); + this.markupDocBuilder.sectionTitleLevel3(CONSUMES); this.markupDocBuilder.unorderedList(consumes); } @@ -164,11 +219,19 @@ public class PathsDocument extends MarkupDocument { private void producesSection(Operation operation) { List produces = operation.getProduces(); if(CollectionUtils.isNotEmpty(produces)){ - this.markupDocBuilder.sectionTitleLevel2(PRODUCES); + this.markupDocBuilder.sectionTitleLevel3(PRODUCES); this.markupDocBuilder.unorderedList(produces); } } + private void tagsSection(Operation operation) { + List tags = operation.getTags(); + if(CollectionUtils.isNotEmpty(tags)){ + this.markupDocBuilder.sectionTitleLevel3(TAGS); + this.markupDocBuilder.unorderedList(tags); + } + } + /** * Builds the example section of a Swagger Operation * @@ -198,7 +261,7 @@ public class PathsDocument extends MarkupDocument { for (String fileNameExtension : markupLanguage.getFileNameExtensions()) { java.nio.file.Path path = Paths.get(examplesFolderPath, exampleFolder, exampleFileName + fileNameExtension); if (Files.isReadable(path)) { - this.markupDocBuilder.sectionTitleLevel2(title); + this.markupDocBuilder.sectionTitleLevel3(title); this.markupDocBuilder.paragraph(FileUtils.readFileToString(path.toFile(), StandardCharsets.UTF_8).trim()); if (logger.isInfoEnabled()) { logger.info("Example file processed: {}", path); @@ -216,12 +279,18 @@ public class PathsDocument extends MarkupDocument { Map responses = operation.getResponses(); if(MapUtils.isNotEmpty(responses)){ List csvContent = new ArrayList<>(); - csvContent.add(CODE_COLUMN + DELIMITER + DESCRIPTION_COLUMN); + csvContent.add(HTTP_CODE_COLUMN + DELIMITER + DESCRIPTION_COLUMN + DELIMITER + SCHEMA_COLUMN); for(Map.Entry entry : responses.entrySet()){ Response response = entry.getValue(); - csvContent.add(entry.getKey() + DELIMITER + response.getDescription()); + if(response.getSchema() != null){ + Property property = response.getSchema(); + String type = PropertyUtils.getType(property, markupLanguage); + csvContent.add(entry.getKey() + DELIMITER + response.getDescription() + DELIMITER + type); + }else{ + csvContent.add(entry.getKey() + DELIMITER + response.getDescription() + DELIMITER + "No Content"); + } } - this.markupDocBuilder.sectionTitleLevel2(RESPONSES); + this.markupDocBuilder.sectionTitleLevel3(RESPONSES); this.markupDocBuilder.tableWithHeaderRow(csvContent); } } diff --git a/src/main/java/io/github/robwin/swagger2markup/utils/ModelUtils.java b/src/main/java/io/github/robwin/swagger2markup/utils/ModelUtils.java new file mode 100644 index 00000000..6823161e --- /dev/null +++ b/src/main/java/io/github/robwin/swagger2markup/utils/ModelUtils.java @@ -0,0 +1,27 @@ +package io.github.robwin.swagger2markup.utils; + +import com.wordnik.swagger.models.ArrayModel; +import com.wordnik.swagger.models.Model; +import com.wordnik.swagger.models.ModelImpl; +import com.wordnik.swagger.models.RefModel; +import io.github.robwin.markup.builder.MarkupLanguage; +import org.apache.commons.lang.Validate; + +public final class ModelUtils { + + public static String getType(Model model, MarkupLanguage markupLanguage) { + Validate.notNull(model, "model must not be null!"); + if (model instanceof ModelImpl) { + return ((ModelImpl) model).getType(); + } else if (model instanceof RefModel) { + switch (markupLanguage){ + case ASCIIDOC: return "<<" + ((RefModel) model).getSimpleRef() + ">>"; + default: return ((RefModel) model).getSimpleRef(); + } + } else if (model instanceof ArrayModel) { + ArrayModel arrayModel = ((ArrayModel) model); + return PropertyUtils.getType(arrayModel.getItems(), markupLanguage) + " " + arrayModel.getType(); + } + return "NOT FOUND"; + } +} diff --git a/src/main/java/io/github/robwin/swagger2markup/utils/ParameterUtils.java b/src/main/java/io/github/robwin/swagger2markup/utils/ParameterUtils.java new file mode 100644 index 00000000..0de73747 --- /dev/null +++ b/src/main/java/io/github/robwin/swagger2markup/utils/ParameterUtils.java @@ -0,0 +1,62 @@ +package io.github.robwin.swagger2markup.utils; + +import com.wordnik.swagger.models.Model; +import com.wordnik.swagger.models.parameters.*; +import io.github.robwin.markup.builder.MarkupLanguage; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.Validate; + +public final class ParameterUtils { + + public static String getType(Parameter parameter, MarkupLanguage markupLanguage){ + Validate.notNull(parameter, "property must not be null!"); + String type = "NOT FOUND"; + if(parameter instanceof BodyParameter){ + BodyParameter bodyParameter = (BodyParameter)parameter; + Model model = bodyParameter.getSchema(); + type = ModelUtils.getType(model, markupLanguage); + } + else if(parameter instanceof PathParameter){ + PathParameter pathParameter = (PathParameter)parameter; + type = getTypeWithFormat(pathParameter.getType(), pathParameter.getFormat()); + } + else if(parameter instanceof QueryParameter){ + QueryParameter queryParameter = (QueryParameter)parameter; + type = getTypeWithFormat(queryParameter.getType(), queryParameter.getFormat()); + if(type.equals("array")){ + String collectionFormat = queryParameter.getCollectionFormat(); + type = collectionFormat + " " + PropertyUtils.getType(queryParameter.getItems(), markupLanguage) + " " + type; + } + } + else if(parameter instanceof HeaderParameter){ + HeaderParameter headerParameter = (HeaderParameter)parameter; + type = getTypeWithFormat(headerParameter.getType(), headerParameter.getFormat()); + } + else if(parameter instanceof FormParameter){ + FormParameter formParameter = (FormParameter)parameter; + type = formParameter.getType(); + } + else if(parameter instanceof CookieParameter){ + CookieParameter cookieParameter = (CookieParameter)parameter; + type = getTypeWithFormat(cookieParameter.getType(), cookieParameter.getFormat()); + } + else if(parameter instanceof RefParameter){ + RefParameter refParameter = (RefParameter)parameter; + switch (markupLanguage){ + case ASCIIDOC: return "<<" + refParameter.getSimpleRef() + ">>"; + default: return refParameter.getSimpleRef(); + } + } + return type; + } + + private static String getTypeWithFormat(String typeWithoutFormat, String format) { + String type; + if(StringUtils.isNotBlank(format)){ + type = typeWithoutFormat + " (" + format + ")"; + }else{ + type = typeWithoutFormat; + } + return type; + } +} diff --git a/src/main/java/io/github/robwin/swagger2markup/utils/PropertyUtils.java b/src/main/java/io/github/robwin/swagger2markup/utils/PropertyUtils.java new file mode 100644 index 00000000..84d49130 --- /dev/null +++ b/src/main/java/io/github/robwin/swagger2markup/utils/PropertyUtils.java @@ -0,0 +1,47 @@ +package io.github.robwin.swagger2markup.utils; + +import com.wordnik.swagger.models.properties.ArrayProperty; +import com.wordnik.swagger.models.properties.Property; +import com.wordnik.swagger.models.properties.RefProperty; +import com.wordnik.swagger.models.properties.StringProperty; +import io.github.robwin.markup.builder.MarkupLanguage; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.Validate; + +import java.util.List; + +public final class PropertyUtils { + + public static String getType(Property property, MarkupLanguage markupLanguage){ + Validate.notNull(property, "property must not be null!"); + String type; + if(property instanceof RefProperty){ + RefProperty refProperty = (RefProperty)property; + switch (markupLanguage){ + case ASCIIDOC: return "<<" + refProperty.getSimpleRef() + ">>"; + default: return refProperty.getSimpleRef(); + } + }else if(property instanceof ArrayProperty){ + ArrayProperty arrayProperty = (ArrayProperty)property; + Property items = arrayProperty.getItems(); + type = getType(items, markupLanguage) + " " + arrayProperty.getType(); + }else if(property instanceof StringProperty){ + StringProperty stringProperty = (StringProperty)property; + List enums = stringProperty.getEnum(); + if(CollectionUtils.isNotEmpty(enums)){ + type = "enum" + " (" + StringUtils.join(enums, ", ") + ")"; + }else{ + type = property.getType(); + } + } + else{ + if(StringUtils.isNotBlank(property.getFormat())){ + type = property.getType() + " (" + property.getFormat() + ")"; + }else{ + type = property.getType(); + } + } + return type; + } +} diff --git a/src/test/java/io/github/robwin/swagger2markup/Swagger2MarkupConverterTest.java b/src/test/java/io/github/robwin/swagger2markup/Swagger2MarkupConverterTest.java index 670b7afc..d07567f7 100644 --- a/src/test/java/io/github/robwin/swagger2markup/Swagger2MarkupConverterTest.java +++ b/src/test/java/io/github/robwin/swagger2markup/Swagger2MarkupConverterTest.java @@ -1,10 +1,15 @@ package io.github.robwin.swagger2markup; import io.github.robwin.markup.builder.MarkupLanguage; +import org.asciidoctor.*; import org.junit.Test; +import java.io.BufferedWriter; import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; /** * @author Robert Winkler @@ -12,7 +17,7 @@ import java.io.IOException; public class Swagger2MarkupConverterTest { @Test - public void testSwagger2AsciiDocConverter() throws IOException { + public void testSwagger2MarkupConversion() throws IOException { File file = new File(Swagger2MarkupConverterTest.class.getResource("/json/swagger.json").getFile()); Swagger2MarkupConverter.from(file.getAbsolutePath()). @@ -25,4 +30,37 @@ public class Swagger2MarkupConverterTest { .intoFolder("src/docs/asciidoc"); } + + @Test + public void testSwagger2HtmlConversion() throws IOException { + File file = new File(Swagger2MarkupConverterTest.class.getResource("/json/swagger.json").getFile()); + String asciiDoc = Swagger2MarkupConverter.from(file.getAbsolutePath()).build().asString(); + String path = "src/docs/asciidocAsString"; + Files.createDirectories(Paths.get(path)); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(path, "swagger.adoc"), StandardCharsets.UTF_8)){ + writer.write(asciiDoc); } + String asciiDocAsHtml = Asciidoctor.Factory.create().convert(asciiDoc, + OptionsBuilder.options().backend("html5").headerFooter(true).safe(SafeMode.UNSAFE).docType("book").attributes(AttributesBuilder.attributes() + .tableOfContents(true).tableOfContents(Placement.LEFT).sectionNumbers(true).hardbreaks(true).setAnchors(true).attribute("sectlinks"))); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(path, "swagger.html"), StandardCharsets.UTF_8)){ + writer.write(asciiDocAsHtml); + } + } +/* + @Test + public void testSwagger2PdfConversion() throws IOException { + File file = new File(Swagger2MarkupConverterTest.class.getResource("/json/spica.json").getFile()); + String asciiDoc = Swagger2MarkupConverter.from(file.getAbsolutePath()).build().asString(); + String path = "src/docs/asciidocAsString"; + Files.createDirectories(Paths.get(path)); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(path, "spica.adoc"), StandardCharsets.UTF_8)){ + writer.write(asciiDoc); + } + String asciiDocAsPdf= Asciidoctor.Factory.create().convert(asciiDoc, OptionsBuilder.options().backend("pdf")); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(path, "spica.pdf"), StandardCharsets.UTF_8)){ + writer.write(asciiDocAsPdf); + } + } +*/ + }