From 699973dcfe3bfb9624c75006a9ea6f70ad31edeb Mon Sep 17 00:00:00 2001 From: Alexey Nechaev Date: Wed, 22 Apr 2015 16:11:16 +0300 Subject: [PATCH 1/3] Group and version are avaiable from parent pom. --- modules/swagger-codegen/pom.xml | 2 -- modules/swagger-generator/pom.xml | 2 -- 2 files changed, 4 deletions(-) diff --git a/modules/swagger-codegen/pom.xml b/modules/swagger-codegen/pom.xml index 6fc2ca0e016..e5329fce1dc 100644 --- a/modules/swagger-codegen/pom.xml +++ b/modules/swagger-codegen/pom.xml @@ -6,11 +6,9 @@ ../.. 4.0.0 - com.wordnik swagger-codegen jar swagger-codegen (core library) - 2.1.1-M2-SNAPSHOT src/main/java install diff --git a/modules/swagger-generator/pom.xml b/modules/swagger-generator/pom.xml index 143f7e32605..082384dd148 100644 --- a/modules/swagger-generator/pom.xml +++ b/modules/swagger-generator/pom.xml @@ -6,11 +6,9 @@ 2.1.1-M2-SNAPSHOT ../.. - com.wordnik swagger-generator war swagger-generator - 2.1.1-M2-SNAPSHOT src/main/java From fc0be6d5035f53d30b5add3dfd027d52d923fb7c Mon Sep 17 00:00:00 2001 From: Alexey Nechaev Date: Wed, 22 Apr 2015 16:17:28 +0300 Subject: [PATCH 2/3] Fixes #646: Example field handling has been fixed. --- .../swagger/codegen/CodegenResponse.java | 8 +- .../swagger/codegen/DefaultCodegen.java | 81 +++++++++++++------ .../codegen/examples/ExampleGenerator.java | 54 ++++++++----- .../main/resources/htmlDocs/index.mustache | 2 +- .../src/test/resources/2_0/petstore.json | 12 +++ pom.xml | 2 +- 6 files changed, 107 insertions(+), 52 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java index 15931c9fd27..6c3ce5030f0 100644 --- a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java @@ -1,11 +1,13 @@ package com.wordnik.swagger.codegen; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public class CodegenResponse { public String code, message; public Boolean hasMore; - public List> examples; + public List> examples; public final List headers = new ArrayList(); public String dataType, baseType, containerType; public Boolean simpleType; @@ -14,4 +16,4 @@ public class CodegenResponse { public Boolean isListContainer; public Object schema; public String jsonSchema; -} \ No newline at end of file +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java index 6f51374c536..ba67219014a 100644 --- a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java @@ -1,26 +1,58 @@ package com.wordnik.swagger.codegen; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.wordnik.swagger.codegen.examples.ExampleGenerator; -import com.wordnik.swagger.models.*; +import com.wordnik.swagger.models.ArrayModel; +import com.wordnik.swagger.models.Model; +import com.wordnik.swagger.models.ModelImpl; +import com.wordnik.swagger.models.Operation; +import com.wordnik.swagger.models.RefModel; +import com.wordnik.swagger.models.Response; +import com.wordnik.swagger.models.Swagger; import com.wordnik.swagger.models.auth.ApiKeyAuthDefinition; import com.wordnik.swagger.models.auth.BasicAuthDefinition; import com.wordnik.swagger.models.auth.In; import com.wordnik.swagger.models.auth.SecuritySchemeDefinition; -import com.wordnik.swagger.models.parameters.*; -import com.wordnik.swagger.models.properties.*; +import com.wordnik.swagger.models.parameters.BodyParameter; +import com.wordnik.swagger.models.parameters.CookieParameter; +import com.wordnik.swagger.models.parameters.FormParameter; +import com.wordnik.swagger.models.parameters.HeaderParameter; +import com.wordnik.swagger.models.parameters.Parameter; +import com.wordnik.swagger.models.parameters.PathParameter; +import com.wordnik.swagger.models.parameters.QueryParameter; +import com.wordnik.swagger.models.parameters.SerializableParameter; +import com.wordnik.swagger.models.properties.AbstractNumericProperty; +import com.wordnik.swagger.models.properties.ArrayProperty; +import com.wordnik.swagger.models.properties.BooleanProperty; +import com.wordnik.swagger.models.properties.DateProperty; +import com.wordnik.swagger.models.properties.DateTimeProperty; +import com.wordnik.swagger.models.properties.DecimalProperty; +import com.wordnik.swagger.models.properties.DoubleProperty; +import com.wordnik.swagger.models.properties.FloatProperty; +import com.wordnik.swagger.models.properties.IntegerProperty; +import com.wordnik.swagger.models.properties.LongProperty; +import com.wordnik.swagger.models.properties.MapProperty; +import com.wordnik.swagger.models.properties.Property; +import com.wordnik.swagger.models.properties.PropertyBuilder; +import com.wordnik.swagger.models.properties.RefProperty; +import com.wordnik.swagger.models.properties.StringProperty; import com.wordnik.swagger.util.Json; -import org.apache.commons.lang.StringUtils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.*; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class DefaultCodegen { Logger LOGGER = LoggerFactory.getLogger(DefaultCodegen.class); @@ -996,9 +1028,9 @@ public class DefaultCodegen { if(schemes == null) return null; - List secs = new ArrayList(); - for(Iterator entries = schemes.entrySet().iterator(); entries.hasNext(); ) { - Map.Entry entry = (Map.Entry) entries.next(); + List secs = new ArrayList(schemes.size()); + for (Iterator> it = schemes.entrySet().iterator(); it.hasNext();) { + final Map.Entry entry = it.next(); final SecuritySchemeDefinition schemeDefinition = entry.getValue(); CodegenSecurity sec = CodegenModelFactory.newInstance(CodegenModelType.SECURITY); @@ -1018,23 +1050,22 @@ public class DefaultCodegen { sec.isOAuth = !sec.isBasic; } - sec.hasMore = entries.hasNext(); + sec.hasMore = it.hasNext(); secs.add(sec); } return secs; } - protected List> toExamples(Map examples) { + protected List> toExamples(Map examples) { if(examples == null) return null; - List> output = new ArrayList>(); - for(String key: examples.keySet()) { - String value = examples.get(key); + final List> output = new ArrayList>(examples.size()); + for(Map.Entry entry : examples.entrySet()) { - Map kv = new HashMap(); - kv.put("contentType", key); - kv.put("example", value); + final Map kv = new HashMap(); + kv.put("contentType", entry.getKey()); + kv.put("example", entry.getValue()); output.add(kv); } return output; diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/examples/ExampleGenerator.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/examples/ExampleGenerator.java index 80063625440..51d10f7e8a6 100644 --- a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/examples/ExampleGenerator.java +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/examples/ExampleGenerator.java @@ -1,19 +1,33 @@ package com.wordnik.swagger.codegen.examples; -import com.wordnik.swagger.models.*; -import com.wordnik.swagger.models.properties.*; -import com.wordnik.swagger.util.Json; - -import java.text.SimpleDateFormat; - - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; - - import java.math.BigDecimal; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.wordnik.swagger.models.Model; +import com.wordnik.swagger.models.ModelImpl; +import com.wordnik.swagger.models.properties.ArrayProperty; +import com.wordnik.swagger.models.properties.BooleanProperty; +import com.wordnik.swagger.models.properties.DateProperty; +import com.wordnik.swagger.models.properties.DateTimeProperty; +import com.wordnik.swagger.models.properties.DecimalProperty; +import com.wordnik.swagger.models.properties.DoubleProperty; +import com.wordnik.swagger.models.properties.FileProperty; +import com.wordnik.swagger.models.properties.FloatProperty; +import com.wordnik.swagger.models.properties.IntegerProperty; +import com.wordnik.swagger.models.properties.LongProperty; +import com.wordnik.swagger.models.properties.MapProperty; +import com.wordnik.swagger.models.properties.ObjectProperty; +import com.wordnik.swagger.models.properties.Property; +import com.wordnik.swagger.models.properties.RefProperty; +import com.wordnik.swagger.models.properties.StringProperty; +import com.wordnik.swagger.models.properties.UUIDProperty; +import com.wordnik.swagger.util.Json; public class ExampleGenerator { protected Map examples; @@ -22,7 +36,7 @@ public class ExampleGenerator { this.examples = examples; } - public List> generate(Map examples, List mediaTypes, Property property) { + public List> generate(Map examples, List mediaTypes, Property property) { List> output = new ArrayList>(); Set processedModels = new HashSet(); if(examples == null ) { @@ -37,7 +51,6 @@ public class ExampleGenerator { String example = Json.pretty(resolvePropertyToExample(mediaType, property, processedModels)); if(example != null) { - example = example.replaceAll("\n", "\\\\n"); kv.put("example", example); output.add(kv); } @@ -45,7 +58,6 @@ public class ExampleGenerator { else if(property != null && mediaType.startsWith("application/xml")) { String example = new XmlExampleGenerator(this.examples).toXml(property); if(example != null) { - example = example.replaceAll("\n", "\\\\n"); kv.put("example", example); output.add(kv); } @@ -53,12 +65,10 @@ public class ExampleGenerator { } } else { - for(String key: examples.keySet()) { - String value = examples.get(key); - - Map kv = new HashMap(); - kv.put("contentType", key); - kv.put("example", value); + for(Map.Entry entry: examples.entrySet()) { + final Map kv = new HashMap(); + kv.put("contentType", entry.getKey()); + kv.put("example", Json.pretty(entry.getValue())); output.add(kv); } } diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache index 8e228257951..88bf8f42bfe 100644 --- a/modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache @@ -35,7 +35,7 @@ {{#examples}}

Example data

Content-Type: {{{contentType}}}
-
{{{example}}}
+
{{example}}
{{/examples}}
diff --git a/modules/swagger-codegen/src/test/resources/2_0/petstore.json b/modules/swagger-codegen/src/test/resources/2_0/petstore.json index b4678fc3ab9..30c53134633 100644 --- a/modules/swagger-codegen/src/test/resources/2_0/petstore.json +++ b/modules/swagger-codegen/src/test/resources/2_0/petstore.json @@ -720,6 +720,18 @@ "description": "successful operation", "schema": { "$ref": "#/definitions/User" + }, + "examples": { + "application/json": { + "id": 1, + "username": "johnp", + "firstName": "John", + "lastName": "Public", + "email": "johnp@swagger.io", + "password": "-secret-", + "phone": "0123456789", + "userStatus": 0 + } } }, "400": { diff --git a/pom.xml b/pom.xml index fd7d05b546a..a578b45741b 100644 --- a/pom.xml +++ b/pom.xml @@ -440,7 +440,7 @@ 1.0.6-SNAPSHOT 2.10.4 2.3.4 - 1.5.1-M2 + 1.5.2-M2-SNAPSHOT 2.1.4 2.3 1.2 From 9a361746854dc1c177e48433c4a6248b896b682a Mon Sep 17 00:00:00 2001 From: Alexey Nechaev Date: Thu, 23 Apr 2015 11:50:07 +0300 Subject: [PATCH 3/3] Clean up of '\n' escaping. --- .../languages/NodeJSServerCodegen.java | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java index 0c6e6067607..9d516c398f6 100644 --- a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java @@ -1,11 +1,19 @@ package com.wordnik.swagger.codegen.languages; -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.util.Json; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; import java.io.File; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.wordnik.swagger.codegen.CodegenConfig; +import com.wordnik.swagger.codegen.CodegenOperation; +import com.wordnik.swagger.codegen.CodegenParameter; +import com.wordnik.swagger.codegen.CodegenResponse; +import com.wordnik.swagger.codegen.CodegenType; +import com.wordnik.swagger.codegen.DefaultCodegen; +import com.wordnik.swagger.codegen.SupportingFile; public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig { protected String apiVersion = "1.0.0"; @@ -156,8 +164,10 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig @Override public Map postProcessOperations(Map objs) { - Map objectMap = (Map)objs.get("operations"); - List operations = (List)objectMap.get("operation"); + @SuppressWarnings("unchecked") + Map objectMap = (Map) objs.get("operations"); + @SuppressWarnings("unchecked") + List operations = (List) objectMap.get("operation"); for(CodegenOperation operation : operations) { operation.httpMethod = operation.httpMethod.toLowerCase(); List params = operation.allParams; @@ -170,20 +180,14 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig resp.code = "default"; } } - if(operation.examples != null && operation.examples.size() > 0) { - List> examples = operation.examples; - for(int i = examples.size() - 1; i >= 0; i--) { - Map example = examples.get(i); - String contentType = example.get("contentType"); - if(contentType != null && contentType.indexOf("application/json") == 0) { - String jsonExample = example.get("example"); - if(jsonExample != null) { - jsonExample = jsonExample.replaceAll("\\\\n", "\n"); - example.put("example", jsonExample); - } + if(operation.examples != null && !operation.examples.isEmpty()) { + // Leave application/json* items only + for (Iterator> it = operation.examples.iterator(); it.hasNext();) { + final Map example = it.next(); + final String contentType = example.get("contentType"); + if (contentType == null || !contentType.startsWith("application/json")) { + it.remove(); } - else - examples.remove(i); } } }