From 49a6d0e6c1ec54627279bf6b321f189046249592 Mon Sep 17 00:00:00 2001 From: Kirill Vlasov Date: Tue, 15 Dec 2015 14:09:31 +0500 Subject: [PATCH 01/82] Fixing squid:S1161 - @Override annotation should be used on any method overriding (since Java 5) or implementing (since Java 6) another one --- .../src/main/java/io/swagger/codegen/cmd/Meta.java | 1 + .../src/main/java/io/swagger/codegen/MetaGenerator.java | 1 + .../codegen/languages/AbstractTypeScriptClientCodegen.java | 1 + .../io/swagger/codegen/languages/AkkaScalaClientCodegen.java | 5 +++++ .../io/swagger/codegen/languages/AndroidClientCodegen.java | 4 ++++ .../swagger/codegen/languages/AsyncScalaClientCodegen.java | 5 +++++ .../io/swagger/codegen/languages/CSharpClientCodegen.java | 4 ++++ .../codegen/languages/CsharpDotNet2ClientCodegen.java | 4 ++++ .../java/io/swagger/codegen/languages/DartClientCodegen.java | 4 ++++ .../io/swagger/codegen/languages/FlashClientCodegen.java | 5 +++++ .../io/swagger/codegen/languages/FlaskConnexionCodegen.java | 4 ++++ .../java/io/swagger/codegen/languages/JMeterCodegen.java | 5 +++++ .../java/io/swagger/codegen/languages/JavaClientCodegen.java | 3 +++ .../codegen/languages/JavaInflectorServerCodegen.java | 5 +++++ .../swagger/codegen/languages/JavascriptClientCodegen.java | 2 ++ .../io/swagger/codegen/languages/JaxRSServerCodegen.java | 5 +++++ .../io/swagger/codegen/languages/NodeJSServerCodegen.java | 4 ++++ .../java/io/swagger/codegen/languages/ObjcClientCodegen.java | 5 +++++ .../java/io/swagger/codegen/languages/PerlClientCodegen.java | 5 +++++ .../java/io/swagger/codegen/languages/PhpClientCodegen.java | 4 ++++ .../io/swagger/codegen/languages/PythonClientCodegen.java | 4 ++++ .../java/io/swagger/codegen/languages/Qt5CPPGenerator.java | 4 ++++ .../java/io/swagger/codegen/languages/RubyClientCodegen.java | 4 ++++ .../io/swagger/codegen/languages/ScalaClientCodegen.java | 5 +++++ .../io/swagger/codegen/languages/ScalatraServerCodegen.java | 4 ++++ .../io/swagger/codegen/languages/SilexServerCodegen.java | 5 +++++ .../io/swagger/codegen/languages/SinatraServerCodegen.java | 4 ++++ .../codegen/languages/SlimFrameworkServerCodegen.java | 5 +++++ .../io/swagger/codegen/languages/SpringMVCServerCodegen.java | 4 ++++ .../java/io/swagger/codegen/languages/StaticDocCodegen.java | 4 ++++ .../io/swagger/codegen/languages/StaticHtmlGenerator.java | 3 +++ .../java/io/swagger/codegen/languages/SwaggerGenerator.java | 3 +++ .../io/swagger/codegen/languages/SwaggerYamlGenerator.java | 3 +++ .../main/java/io/swagger/codegen/languages/SwiftCodegen.java | 3 +++ .../io/swagger/codegen/languages/TizenClientCodegen.java | 5 +++++ .../codegen/languages/TypeScriptAngularClientCodegen.java | 1 + .../test/java/io/swagger/codegen/AbstractOptionsTest.java | 1 + .../src/test/java/io/swagger/codegen/CodegenTest.java | 1 + .../src/main/java/io/swagger/generator/Bootstrap.java | 1 + .../java/io/swagger/generator/resource/ExceptionWriter.java | 1 + .../java/io/swagger/generator/util/ValidationException.java | 1 + .../swagger/generator/online/OnlineGeneratorOptionsTest.java | 1 + 42 files changed, 143 insertions(+) diff --git a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java index ca06652b942b..9843024b1043 100644 --- a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java +++ b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java @@ -135,6 +135,7 @@ public class Meta implements Runnable { */ private Mustache.TemplateLoader loader(final DefaultGenerator generator) { return new Mustache.TemplateLoader() { + @Override public Reader getTemplate(String name) { return generator.getTemplateReader(TEMPLATE_DIR_CLASSPATH + File.separator + name.concat(MUSTACHE_EXTENSION)); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/MetaGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/MetaGenerator.java index 8c8308471ffc..818edab02147 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/MetaGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/MetaGenerator.java @@ -157,6 +157,7 @@ public class MetaGenerator extends AbstractGenerator { String template = readTemplate(templateDir + File.separator + support.templateFile); Template tmpl = Mustache.compiler() .withLoader(new Mustache.TemplateLoader() { + @Override public Reader getTemplate(String name) { return getTemplateReader(templateDir + File.separator + name + ".mustache"); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java index a8d664918518..0147b47cca36 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java @@ -60,6 +60,7 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp return outputFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java index 29732f1d45ad..aa5d314184b4 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java @@ -154,14 +154,17 @@ public class AkkaScalaClientCodegen extends DefaultCodegen implements CodegenCon cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "akka-scala"; } + @Override public String getHelp() { return "Generates a Scala client library base on Akka/Spray."; } @@ -176,6 +179,7 @@ public class AkkaScalaClientCodegen extends DefaultCodegen implements CodegenCon return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } @@ -321,6 +325,7 @@ public class AkkaScalaClientCodegen extends DefaultCodegen implements CodegenCon } } + @Override public String toDefaultValue(Property p) { if (!p.getRequired()) { return "None"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java index 7983d83cea15..704b38f7f46f 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java @@ -71,14 +71,17 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi .defaultValue("true")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "android"; } + @Override public String getHelp() { return "Generates an Android client library."; } @@ -93,6 +96,7 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java index 5e85712ffcd6..36309c9ee52f 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java @@ -111,14 +111,17 @@ public class AsyncScalaClientCodegen extends DefaultCodegen implements CodegenCo cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "async-scala"; } + @Override public String getHelp() { return "Generates an Asynchronous Scala client library."; } @@ -133,6 +136,7 @@ public class AsyncScalaClientCodegen extends DefaultCodegen implements CodegenCo return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } @@ -182,6 +186,7 @@ public class AsyncScalaClientCodegen extends DefaultCodegen implements CodegenCo } } + @Override public String toDefaultValue(Property p) { if (p instanceof StringProperty) { return "null"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index f69ddd16d351..acf0b1b12621 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -135,14 +135,17 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "csharp"; } + @Override public String getHelp() { return "Generates a CSharp client library."; } @@ -157,6 +160,7 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig return outputFolder + File.separator + sourceFolder + File.separator + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + File.separator + sourceFolder + File.separator + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CsharpDotNet2ClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CsharpDotNet2ClientCodegen.java index 7b6bf5e78445..f3ae3b6a4d81 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CsharpDotNet2ClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CsharpDotNet2ClientCodegen.java @@ -135,14 +135,17 @@ public class CsharpDotNet2ClientCodegen extends DefaultCodegen implements Codege this.packageVersion = packageVersion; } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "CsharpDotNet2"; } + @Override public String getHelp() { return "Generates a C# .Net 2.0 client library."; } @@ -157,6 +160,7 @@ public class CsharpDotNet2ClientCodegen extends DefaultCodegen implements Codege return outputFolder + File.separator + sourceFolder + File.separator + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + File.separator + sourceFolder + File.separator + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/DartClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/DartClientCodegen.java index e18b9eac0a22..7d11f2a81838 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/DartClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/DartClientCodegen.java @@ -84,14 +84,17 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, "source folder for generated code")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "dart"; } + @Override public String getHelp() { return "Generates a Dart client library."; } @@ -157,6 +160,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java index 8608cbe8924c..44c2b9cb09e7 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java @@ -156,14 +156,17 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig return str.replaceAll("\\.", "_"); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "flash"; } + @Override public String getHelp() { return "Generates a Flash client library."; } @@ -179,6 +182,7 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig + apiPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); } + @Override public String modelFileFolder() { return (outputFolder + File.separatorChar + sourceFolder + File.separatorChar + modelPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); @@ -214,6 +218,7 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig return type; } + @Override public String toDefaultValue(Property p) { if (p instanceof StringProperty) { return "null"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java index 7a06ee8b845f..483e841d7355 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java @@ -132,6 +132,7 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf } } + @Override public String apiPackage() { return controllerPackage; } @@ -142,6 +143,7 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf * @return the CodegenType for this generator * @see io.swagger.codegen.CodegenType */ + @Override public CodegenType getTag() { return CodegenType.SERVER; } @@ -152,6 +154,7 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf * * @return the friendly name for the generator */ + @Override public String getName() { return "python-flask"; } @@ -162,6 +165,7 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf * * @return A string value for the help message */ + @Override public String getHelp() { return "Generates a python server library using the connexion project. By default, " + "it will also generate service classes--which you can disable with the `-Dnoservice` environment variable."; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java index fb1674772146..429d992b7ef8 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java @@ -22,6 +22,7 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { * @return the CodegenType for this generator * @see io.swagger.codegen.CodegenType */ + @Override public CodegenType getTag() { return CodegenType.CLIENT; } @@ -32,6 +33,7 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { * * @return the friendly name for the generator */ + @Override public String getName() { return "jmeter"; } @@ -42,6 +44,7 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { * * @return A string value for the help message */ + @Override public String getHelp() { return "Generates a JMeter .jmx file."; } @@ -97,6 +100,7 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { // supportingFiles.add(new SupportingFile("testdata-localhost.mustache", "input", "testdata-localhost.csv")); } + @Override public void preprocessSwagger(Swagger swagger) { if (swagger != null && swagger.getPaths() != null) { for (String pathname : swagger.getPaths().keySet()) { @@ -126,6 +130,7 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { * Location to write model files. You can use the modelPackage() as defined when the class is * instantiated */ + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java index 2f77a4178378..b48ab8008365 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java @@ -530,6 +530,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return objs; } + @Override public Map postProcessOperations(Map objs) { if("retrofit".equals(getLibrary()) || "retrofit2".equals(getLibrary())) { Map operations = (Map) objs.get("operations"); @@ -555,6 +556,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return objs; } + @Override public void preprocessSwagger(Swagger swagger) { if (swagger != null && swagger.getPaths() != null) { for (String pathname : swagger.getPaths().keySet()) { @@ -606,6 +608,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return accepts; } + @Override protected boolean needToImport(String type) { return super.needToImport(type) && type.indexOf(".") < 0; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java index a7a0420d9846..a7612638255d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java @@ -45,14 +45,17 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod ); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "inflector"; } + @Override public String getHelp() { return "Generates a Java Inflector Server application."; } @@ -131,6 +134,7 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod return objs; } + @Override public Map postProcessOperations(Map objs) { Map operations = (Map) objs.get("operations"); if (operations != null) { @@ -188,6 +192,7 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod return camelize(name)+ "Controller"; } + @Override public boolean shouldOverwrite(String filename) { return super.shouldOverwrite(filename); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 51ef135ae0dc..b1796c9d4fd4 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -373,6 +373,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return objs; } + @Override public Map postProcessOperations(Map objs) { if("retrofit".equals(getLibrary())) { Map operations = (Map) objs.get("operations"); @@ -396,6 +397,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return objs; } + @Override protected boolean needToImport(String type) { return super.needToImport(type) && type.indexOf(".") < 0; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java index 6bc1a3924148..a91b405d36bd 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java @@ -35,14 +35,17 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf additionalProperties.put("title", title); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "jaxrs"; } + @Override public String getHelp() { return "Generates a Java JAXRS Server application."; } @@ -144,6 +147,7 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf return objs; } + @Override public Map postProcessOperations(Map objs) { Map operations = (Map) objs.get("operations"); if (operations != null) { @@ -229,6 +233,7 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf return outputFolder + "/" + output + "/" + apiPackage().replace('.', '/'); } + @Override public boolean shouldOverwrite(String filename) { return super.shouldOverwrite(filename) && !filename.endsWith("ServiceImpl.java") && !filename.endsWith("ServiceFactory.java"); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java index 4dee5f6f2df6..914c602f86b4 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java @@ -97,6 +97,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig } } + @Override public String apiPackage() { return "controllers"; } @@ -107,6 +108,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig * @return the CodegenType for this generator * @see io.swagger.codegen.CodegenType */ + @Override public CodegenType getTag() { return CodegenType.SERVER; } @@ -117,6 +119,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig * * @return the friendly name for the generator */ + @Override public String getName() { return "nodejs"; } @@ -127,6 +130,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig * * @return A string value for the help message */ + @Override public String getHelp() { return "Generates a nodejs server library using the swagger-tools project. By default, " + "it will also generate service classes--which you can disable with the `-Dnoservice` environment variable."; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java index 9c488db1254a..78a60089cf7b 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java @@ -133,14 +133,17 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(new CliOption(LICENSE, "License to use in the podspec file.").defaultValue("MIT")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "objc"; } + @Override public String getHelp() { return "Generates an Objective-C client library."; } @@ -356,6 +359,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { return classPrefix + camelize(name) + "Api"; } + @Override public String toApiFilename(String name) { return classPrefix + camelize(name) + "Api"; } @@ -395,6 +399,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { return toVarName(name); } + @Override public String escapeReservedWord(String name) { return "_" + name; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java index 27f39f11ed0d..8190d9963556 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java @@ -104,14 +104,17 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("autodoc.script.mustache", ("bin/").replace('/', File.separatorChar), "autodoc")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "perl"; } + @Override public String getHelp() { return "Generates a Perl client library."; } @@ -126,6 +129,7 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { return (outputFolder + "/lib/WWW/" + moduleName + apiPackage()).replace('/', File.separatorChar); } + @Override public String modelFileFolder() { return (outputFolder + "/lib/WWW/" + moduleName + modelPackage()).replace('/', File.separatorChar); } @@ -162,6 +166,7 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { return type; } + @Override public String toDefaultValue(Property p) { return "null"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java index c712374f4241..0b59e6f4320e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java @@ -139,14 +139,17 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { .replaceAll(regLastPathSeparator+ "$", ""); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "php"; } + @Override public String getHelp() { return "Generates a PHP client library."; } @@ -223,6 +226,7 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { return (outputFolder + "/" + toPackagePath(apiPackage, srcBasePath)); } + @Override public String modelFileFolder() { return (outputFolder + "/" + toPackagePath(modelPackage, srcBasePath)); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java index b5aa56aa2c46..d7fdd39239af 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java @@ -108,14 +108,17 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig return str.replaceAll("\\.", "_"); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "python"; } + @Override public String getHelp() { return "Generates a Python client library."; } @@ -130,6 +133,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig return outputFolder + File.separatorChar + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + File.separatorChar + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java index 2abff5515b08..18ba3718068e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java @@ -140,6 +140,7 @@ public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig { * @return the CodegenType for this generator * @see io.swagger.codegen.CodegenType */ + @Override public CodegenType getTag() { return CodegenType.CLIENT; } @@ -150,6 +151,7 @@ public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig { * * @return the friendly name for the generator */ + @Override public String getName() { return "qt5cpp"; } @@ -160,6 +162,7 @@ public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig { * * @return A string value for the help message */ + @Override public String getHelp() { return "Generates a qt5 C++ client library."; } @@ -189,6 +192,7 @@ public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig { * Location to write model files. You can use the modelPackage() as defined when the class is * instantiated */ + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java index 2fd6d8d8bc09..25f0521c5f8c 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java @@ -130,14 +130,17 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("base_object.mustache", modelFolder, "base_object.rb")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "ruby"; } + @Override public String getHelp() { return "Generates a Ruby client library."; } @@ -166,6 +169,7 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { return outputFolder + File.separator + libFolder + File.separator + gemName + File.separator + apiPackage.replace("/", File.separator); } + @Override public String modelFileFolder() { return outputFolder + File.separator + libFolder + File.separator + gemName + File.separator + modelPackage.replace("/", File.separator); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java index b2f5b9571dd2..8d917430d3ce 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java @@ -112,14 +112,17 @@ public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "scala"; } + @Override public String getHelp() { return "Generates a Scala client library."; } @@ -134,6 +137,7 @@ public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } @@ -183,6 +187,7 @@ public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig } } + @Override public String toDefaultValue(Property p) { if (p instanceof StringProperty) { return "null"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalatraServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalatraServerCodegen.java index d50fa8678876..5d6da580130d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalatraServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalatraServerCodegen.java @@ -123,14 +123,17 @@ public class ScalatraServerCodegen extends DefaultCodegen implements CodegenConf cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "scalatra"; } + @Override public String getHelp() { return "Generates a Scala server application with Scalatra."; } @@ -145,6 +148,7 @@ public class ScalatraServerCodegen extends DefaultCodegen implements CodegenConf return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java index 2e35f412bbfb..3984d0ac85f3 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java @@ -88,14 +88,17 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig supportingFiles.add(new SupportingFile(".htaccess", packagePath.replace('/', File.separatorChar), ".htaccess")); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "silex-PHP"; } + @Override public String getHelp() { return "Generates a Silex server library."; } @@ -110,6 +113,7 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig return (outputFolder + "/" + apiPackage()).replace('/', File.separatorChar); } + @Override public String modelFileFolder() { return (outputFolder + "/" + modelPackage()).replace('/', File.separatorChar); } @@ -148,6 +152,7 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig return toModelName(type); } + @Override public String toDefaultValue(Property p) { return "null"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java index 1c31b45664e6..44f97009371b 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java @@ -81,14 +81,17 @@ public class SinatraServerCodegen extends DefaultCodegen implements CodegenConfi supportingFiles.add(new SupportingFile("swagger.mustache","","swagger.yaml")); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "sinatra"; } + @Override public String getHelp() { return "Generates a Sinatra server library."; } @@ -135,6 +138,7 @@ public class SinatraServerCodegen extends DefaultCodegen implements CodegenConfi return type; } + @Override public String toDefaultValue(Property p) { return "null"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java index ef318cb6bddf..58d8c9e53e5a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java @@ -90,14 +90,17 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege supportingFiles.add(new SupportingFile(".htaccess", packagePath.replace('/', File.separatorChar), ".htaccess")); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "slim"; } + @Override public String getHelp() { return "Generates a Slim Framework server library."; } @@ -112,6 +115,7 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege return (outputFolder + "/" + apiPackage()).replace('/', File.separatorChar); } + @Override public String modelFileFolder() { return (outputFolder + "/" + modelPackage()).replace('/', File.separatorChar); } @@ -162,6 +166,7 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege return super.getTypeDeclaration(name); } + @Override public String toDefaultValue(Property p) { return "null"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java index 446185bcd47e..62c9a2a13482 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java @@ -53,14 +53,17 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen cliOptions.add(new CliOption(CONFIG_PACKAGE, "configuration package for generated code")); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "spring-mvc"; } + @Override public String getHelp() { return "Generates a Java Spring-MVC Server application using the SpringFox integration."; } @@ -126,6 +129,7 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen co.baseName = basePath; } + @Override public Map postProcessOperations(Map objs) { Map operations = (Map) objs.get("operations"); if (operations != null) { diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticDocCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticDocCodegen.java index b27ba23a4cd4..99ba292915a3 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticDocCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticDocCodegen.java @@ -50,14 +50,17 @@ public class StaticDocCodegen extends DefaultCodegen implements CodegenConfig { instantiationTypes.put("map", "HashMap"); } + @Override public CodegenType getTag() { return CodegenType.DOCUMENTATION; } + @Override public String getName() { return "dynamic-html"; } + @Override public String getHelp() { return "Generates a dynamic HTML site."; } @@ -72,6 +75,7 @@ public class StaticDocCodegen extends DefaultCodegen implements CodegenConfig { return outputFolder + File.separator + sourceFolder + File.separator + "operations"; } + @Override public String modelFileFolder() { return outputFolder + File.separator + sourceFolder + File.separator + "models"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticHtmlGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticHtmlGenerator.java index a86c2244995f..cb598f8fbd88 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticHtmlGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticHtmlGenerator.java @@ -50,14 +50,17 @@ public class StaticHtmlGenerator extends DefaultCodegen implements CodegenConfig importMapping = new HashMap(); } + @Override public CodegenType getTag() { return CodegenType.DOCUMENTATION; } + @Override public String getName() { return "html"; } + @Override public String getHelp() { return "Generates a static HTML file."; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerGenerator.java index 3241dde7b922..a98d5fc5b131 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerGenerator.java @@ -19,14 +19,17 @@ public class SwaggerGenerator extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("README.md", "", "README.md")); } + @Override public CodegenType getTag() { return CodegenType.DOCUMENTATION; } + @Override public String getName() { return "swagger"; } + @Override public String getHelp() { return "Creates a static swagger.json file."; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerYamlGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerYamlGenerator.java index 8ee1440b17e9..9c4680112e9d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerYamlGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerYamlGenerator.java @@ -19,14 +19,17 @@ public class SwaggerYamlGenerator extends DefaultCodegen implements CodegenConfi supportingFiles.add(new SupportingFile("README.md", "", "README.md")); } + @Override public CodegenType getTag() { return CodegenType.DOCUMENTATION; } + @Override public String getName() { return "swagger-yaml"; } + @Override public String getHelp() { return "Creates a static swagger.yaml file."; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java index fffd3aa2aae8..e951cfb76d3b 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java @@ -45,14 +45,17 @@ public class SwiftCodegen extends DefaultCodegen implements CodegenConfig { protected String sourceFolder = "Classes" + File.separator + "Swaggers"; private static final Pattern PATH_PARAM_PATTERN = Pattern.compile("\\{[a-zA-Z_]+\\}"); + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "swift"; } + @Override public String getHelp() { return "Generates a swift client library."; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TizenClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TizenClientCodegen.java index 8efb5276cffd..83241ddc5e70 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TizenClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TizenClientCodegen.java @@ -110,14 +110,17 @@ public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig supportingFiles.add(new SupportingFile("error-body.mustache", sourceFolder, PREFIX + "Error.cpp")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "tizen"; } + @Override public String getHelp() { return "Generates a Samsung Tizen C++ client library."; } @@ -250,6 +253,7 @@ public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig return PREFIX + initialCaps(name) + "Api"; } + @Override public String toApiFilename(String name) { return PREFIX + initialCaps(name) + "Api"; } @@ -261,6 +265,7 @@ public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig return "p" + paramName; } + @Override public String escapeReservedWord(String name) { return "_" + name; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java index 6c9b615476de..60b6f2b34c62 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java @@ -10,6 +10,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode return "typescript-angular"; } + @Override public String getHelp() { return "Generates a TypeScript AngularJS client library."; } diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/AbstractOptionsTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/AbstractOptionsTest.java index 7bc2a86bc6bb..002e4ba8f299 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/AbstractOptionsTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/AbstractOptionsTest.java @@ -51,6 +51,7 @@ public abstract class AbstractOptionsTest { private Function getCliOptionTransformer() { return new Function() { + @Override public String apply(CliOption option) { return option.getOpt(); } diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/CodegenTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/CodegenTest.java index 3adc19e6db9b..68c2b4b170bf 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/CodegenTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/CodegenTest.java @@ -86,6 +86,7 @@ public class CodegenTest { final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/requiredTest.json"); final DefaultCodegen codegen = new DefaultCodegen() { + @Override public String getSwaggerType(Property p) { if (p != null && !p.getRequired()) { return "Optional<" + super.getSwaggerType(p) + ">"; diff --git a/modules/swagger-generator/src/main/java/io/swagger/generator/Bootstrap.java b/modules/swagger-generator/src/main/java/io/swagger/generator/Bootstrap.java index 018d34161495..53e67dc099f8 100644 --- a/modules/swagger-generator/src/main/java/io/swagger/generator/Bootstrap.java +++ b/modules/swagger-generator/src/main/java/io/swagger/generator/Bootstrap.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.io.InputStream; public class Bootstrap extends HttpServlet { + @Override public void init(ServletConfig config) throws ServletException { ServletContext context = config.getServletContext(); diff --git a/modules/swagger-generator/src/main/java/io/swagger/generator/resource/ExceptionWriter.java b/modules/swagger-generator/src/main/java/io/swagger/generator/resource/ExceptionWriter.java index fea969d72730..122561ddd942 100644 --- a/modules/swagger-generator/src/main/java/io/swagger/generator/resource/ExceptionWriter.java +++ b/modules/swagger-generator/src/main/java/io/swagger/generator/resource/ExceptionWriter.java @@ -13,6 +13,7 @@ import javax.ws.rs.ext.Provider; @Provider public class ExceptionWriter implements ExceptionMapper { + @Override public Response toResponse(Exception exception) { if (exception instanceof javax.ws.rs.WebApplicationException) { javax.ws.rs.WebApplicationException e = (javax.ws.rs.WebApplicationException) exception; diff --git a/modules/swagger-generator/src/main/java/io/swagger/generator/util/ValidationException.java b/modules/swagger-generator/src/main/java/io/swagger/generator/util/ValidationException.java index ed58675e12b4..fc772a793080 100644 --- a/modules/swagger-generator/src/main/java/io/swagger/generator/util/ValidationException.java +++ b/modules/swagger-generator/src/main/java/io/swagger/generator/util/ValidationException.java @@ -19,6 +19,7 @@ public class ValidationException extends Exception { this.code = code; } + @Override public String getMessage() { return msg; } diff --git a/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java b/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java index 8ec4d1760e8f..55161327b1ce 100644 --- a/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java +++ b/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java @@ -94,6 +94,7 @@ public class OnlineGeneratorOptionsTest { final Maps.EntryTransformer transformer = new Maps.EntryTransformer() { + @Override public String transformEntry(String key, InvocationCounter value) { return value.getValue(); } From b1869c1caeae2815c0d46079075eef1bf137b221 Mon Sep 17 00:00:00 2001 From: Artyom Date: Tue, 15 Dec 2015 11:21:20 +0200 Subject: [PATCH 02/82] Escape \r in XML comments Workaround for #1336 --- .../src/main/java/io/swagger/codegen/DefaultCodegen.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 53c0e6350b0d..d411a1c32a32 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -148,6 +148,7 @@ public class DefaultCodegen { if (input != null) { input = input.trim(); String output = input.replaceAll("\n", "\\\\n"); + output = output.replace("\r", "\\r"); output = output.replace("\"", "\\\""); return output; } From 4ed0173a21c4c64dc691a359cb9c58cf17ad0bc1 Mon Sep 17 00:00:00 2001 From: Kirill Vlasov Date: Tue, 15 Dec 2015 15:03:33 +0500 Subject: [PATCH 03/82] Fixing squid:S2057 - Serializable classes should have a version id --- .../src/main/java/io/swagger/generator/Bootstrap.java | 2 ++ .../main/java/io/swagger/generator/exception/ApiException.java | 1 + .../io/swagger/generator/exception/BadRequestException.java | 1 + .../java/io/swagger/generator/exception/NotFoundException.java | 1 + .../java/io/swagger/generator/util/ValidationException.java | 1 + 5 files changed, 6 insertions(+) diff --git a/modules/swagger-generator/src/main/java/io/swagger/generator/Bootstrap.java b/modules/swagger-generator/src/main/java/io/swagger/generator/Bootstrap.java index 018d34161495..49613764e08d 100644 --- a/modules/swagger-generator/src/main/java/io/swagger/generator/Bootstrap.java +++ b/modules/swagger-generator/src/main/java/io/swagger/generator/Bootstrap.java @@ -26,6 +26,8 @@ import java.io.IOException; import java.io.InputStream; public class Bootstrap extends HttpServlet { + private static final long serialVersionUID = 1400930071893332856L; + public void init(ServletConfig config) throws ServletException { ServletContext context = config.getServletContext(); diff --git a/modules/swagger-generator/src/main/java/io/swagger/generator/exception/ApiException.java b/modules/swagger-generator/src/main/java/io/swagger/generator/exception/ApiException.java index 50019486ec38..fe8b455ecb0e 100644 --- a/modules/swagger-generator/src/main/java/io/swagger/generator/exception/ApiException.java +++ b/modules/swagger-generator/src/main/java/io/swagger/generator/exception/ApiException.java @@ -17,6 +17,7 @@ package io.swagger.generator.exception; public class ApiException extends Exception { + private static final long serialVersionUID = -5085112752305370687L; private int code; public ApiException(int code, String msg) { diff --git a/modules/swagger-generator/src/main/java/io/swagger/generator/exception/BadRequestException.java b/modules/swagger-generator/src/main/java/io/swagger/generator/exception/BadRequestException.java index b90c6ee319d6..7cab512b58cf 100644 --- a/modules/swagger-generator/src/main/java/io/swagger/generator/exception/BadRequestException.java +++ b/modules/swagger-generator/src/main/java/io/swagger/generator/exception/BadRequestException.java @@ -17,6 +17,7 @@ package io.swagger.generator.exception; public class BadRequestException extends ApiException { + private static final long serialVersionUID = -5540416398447252055L; private int code; public BadRequestException(int code, String msg) { diff --git a/modules/swagger-generator/src/main/java/io/swagger/generator/exception/NotFoundException.java b/modules/swagger-generator/src/main/java/io/swagger/generator/exception/NotFoundException.java index 339cac259c1f..b84985d51e1f 100644 --- a/modules/swagger-generator/src/main/java/io/swagger/generator/exception/NotFoundException.java +++ b/modules/swagger-generator/src/main/java/io/swagger/generator/exception/NotFoundException.java @@ -17,6 +17,7 @@ package io.swagger.generator.exception; public class NotFoundException extends ApiException { + private static final long serialVersionUID = -1223255119112336573L; private int code; public NotFoundException(int code, String msg) { diff --git a/modules/swagger-generator/src/main/java/io/swagger/generator/util/ValidationException.java b/modules/swagger-generator/src/main/java/io/swagger/generator/util/ValidationException.java index ed58675e12b4..bb74164e0f0d 100644 --- a/modules/swagger-generator/src/main/java/io/swagger/generator/util/ValidationException.java +++ b/modules/swagger-generator/src/main/java/io/swagger/generator/util/ValidationException.java @@ -3,6 +3,7 @@ package io.swagger.generator.util; import java.util.List; public class ValidationException extends Exception { + private static final long serialVersionUID = 6861195361018260380L; private int code; private String msg; private List errors; From 3f3e444ab19b46ff404da4a09831ba445184c09e Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 15 Dec 2015 19:38:04 +0800 Subject: [PATCH 04/82] Some clean-ups for the Javascript client codegen --- .../languages/JavascriptClientCodegen.java | 108 +++--------------- .../main/resources/Javascript/api.mustache | 4 - .../Javascript/generatedAnnotation.mustache | 1 - .../javascript/src/scripts/rest/api/PetApi.js | 4 - .../src/scripts/rest/api/StoreApi.js | 4 - .../src/scripts/rest/api/UserApi.js | 4 - .../javascript/src/scripts/rest/model/Pet.js | 2 +- 7 files changed, 14 insertions(+), 113 deletions(-) delete mode 100644 modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 51ef135ae0dc..c17b466866c1 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -34,15 +34,8 @@ import org.slf4j.LoggerFactory; public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); - protected String invokerPackage = "io.swagger.client"; - protected String groupId = "io.swagger"; - protected String artifactId = "swagger-java-client"; - protected String artifactVersion = "1.0.0"; protected String sourceFolder = "src"; protected String localVariablePrefix = ""; - protected boolean fullJavaUtil = false; - protected String javaUtilPrefix = ""; - protected Boolean serializableModel = false; public JavascriptClientCodegen() { super(); @@ -80,14 +73,8 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo instantiationTypes.put("map", "HashMap"); cliOptions.add(new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC)); - cliOptions.add(new CliOption(CodegenConstants.GROUP_ID, CodegenConstants.GROUP_ID_DESC)); - cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, CodegenConstants.ARTIFACT_ID_DESC)); - cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC)); cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); - cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC)); - cliOptions.add(new CliOption("fullJavaUtil", "whether to use fully qualified name for classes under java.util (default to false)")); - } @Override @@ -108,9 +95,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public void processOpts() { super.processOpts(); - - typeMapping.put("array", "Array"); - + typeMapping.put("array", "Array"); } @Override @@ -198,84 +183,42 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public String toDefaultValue(Property p) { if (p instanceof ArrayProperty) { - final ArrayProperty ap = (ArrayProperty) p; - final String pattern; - //if (fullJavaUtil) { - // pattern = "new ArrayList()"; - //} else { - // pattern = "new ArrayList<%s>()"; - //} - - pattern = "new Array()"; - return String.format(pattern, getTypeDeclaration(ap.getItems())); + return "[]"; } else if (p instanceof MapProperty) { - final MapProperty ap = (MapProperty) p; - final String pattern; - if (fullJavaUtil) { - pattern = "new java.util.HashMap()"; - } else { - pattern = "new HashMap()"; - } - return String.format(pattern, getTypeDeclaration(ap.getAdditionalProperties())); - + return "{}"; } else if (p instanceof LongProperty) { LongProperty dp = (LongProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString()+"l"; } return "null"; - + // added for Javascript } else if (p instanceof RefProperty) { RefProperty rp = (RefProperty)p; - System.out.println("rp: " + rp.getName() + rp.getAccess() + rp.getDescription() + rp.getExample() + rp.getFormat() + rp.getSimpleRef() + rp.getTitle() + rp.getType()); - - return "new " +rp.getSimpleRef() + "()"; + return "new " +rp.getSimpleRef() + "()"; } - - System.out.println("property: " + p); - + return super.toDefaultValue(p); } - + @Override public String toDefaultValueWithParam(String name, Property p) { if (p instanceof ArrayProperty) { - final ArrayProperty ap = (ArrayProperty) p; - final String pattern; -// if (fullJavaUtil) { -// pattern = "new java.util.ArrayList<%s>()"; -// } else { -// pattern = "new ArrayList<%s>()" ; -// } - pattern = " = new Array()" ; - - return String.format(pattern, getTypeDeclaration(ap.getItems()))+ ";"; + return " = new Array();"; } else if (p instanceof MapProperty) { - final MapProperty ap = (MapProperty) p; - final String pattern; - if (fullJavaUtil) { - pattern = " = new java.util.HashMap()"; - } else { - pattern = "new HashMap()"; - } - return String.format(pattern, getTypeDeclaration(ap.getAdditionalProperties()))+ ";"; - + return " = {}"; } else if (p instanceof LongProperty) { LongProperty dp = (LongProperty) p; return " = data." + name + ";"; - + // added for Javascript } else if (p instanceof RefProperty) { RefProperty rp = (RefProperty)p; - System.out.println("rp: " + rp.getName() + rp.getAccess() + rp.getDescription() + rp.getExample() + rp.getFormat() + rp.getSimpleRef() + rp.getTitle() + rp.getType()); - - return ".constructFromObject(data." + name + ");"; + return ".constructFromObject(data." + name + ");"; } - - System.out.println("property: " + p); - + return super.toDefaultValueWithParam(name, p); } @@ -449,7 +392,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo } } } - + if(removedChildEnum) { // If we removed an entry from this model's vars, we need to ensure hasMore is updated int count = 0, numVars = codegenProperties.size(); @@ -464,22 +407,6 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return codegenModel; } - public void setInvokerPackage(String invokerPackage) { - this.invokerPackage = invokerPackage; - } - - public void setGroupId(String groupId) { - this.groupId = groupId; - } - - public void setArtifactId(String artifactId) { - this.artifactId = artifactId; - } - - public void setArtifactVersion(String artifactVersion) { - this.artifactVersion = artifactVersion; - } - public void setSourceFolder(String sourceFolder) { this.sourceFolder = sourceFolder; } @@ -488,15 +415,6 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo this.localVariablePrefix = localVariablePrefix; } - - public Boolean getSerializableModel() { - return serializableModel; - } - - public void setSerializableModel(Boolean serializableModel) { - this.serializableModel = serializableModel; - } - private String sanitizePackageName(String packageName) { packageName = packageName.trim(); packageName = packageName.replaceAll("[^a-zA-Z0-9_\\.]", "_"); diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index f7bc498ff189..dd115aaa45c1 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -1,7 +1,3 @@ -/* - * {{>generatedAnnotation}} - */ - //export module if ( typeof define === "function" && define.amd ) { define(['jquery'], function($) { diff --git a/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache b/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache deleted file mode 100644 index 49110fc1ad93..000000000000 --- a/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache +++ /dev/null @@ -1 +0,0 @@ -@javax.annotation.Generated(value = "{{generatorClass}}", date = "{{generatedDate}}") \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js index bf35463dc1a5..5b4f65234137 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js +++ b/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js @@ -1,7 +1,3 @@ -/* - * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-09T16:07:21.000+07:00") - */ - //export module if ( typeof define === "function" && define.amd ) { define(['jquery'], function($) { diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js index 5487b1c386ed..e27494c7924d 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js @@ -1,7 +1,3 @@ -/* - * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-09T16:07:21.000+07:00") - */ - //export module if ( typeof define === "function" && define.amd ) { define(['jquery'], function($) { diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js index 30c797cf25f2..ecd9707fa91e 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js +++ b/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js @@ -1,7 +1,3 @@ -/* - * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-09T16:07:21.000+07:00") - */ - //export module if ( typeof define === "function" && define.amd ) { define(['jquery'], function($) { diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js b/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js index b97907396f18..259857334502 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js +++ b/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js @@ -66,7 +66,7 @@ var Pet = function Pet(photoUrls, name) { /** * datatype: Array **/ - self.tags = new Array(); + self.tags = []; /** * pet status in the store From 322e7a4b4bd20eb431b4b09d06eaf0d88eda97ff Mon Sep 17 00:00:00 2001 From: hacki11 Date: Tue, 15 Dec 2015 23:33:48 +0100 Subject: [PATCH 05/82] [C#] fix filename and Content-Disposition parsing on FileStream --- .../src/main/resources/csharp/ApiClient.mustache | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index db865e2b27d4..1b49d9b5347a 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -233,12 +233,15 @@ namespace {{packageName}}.Client ? Path.GetTempPath() : Configuration.TempFolderPath; var regex = new Regex(@"Content-Disposition:.*filename=['""]?([^'""\s]+)['""]?$"); - var match = regex.Match(headers.ToString()); - if (match.Success) + foreach (var header in headers) { - string fileName = filePath + match.Value.Replace("\"", "").Replace("'", ""); - File.WriteAllBytes(fileName, data); - return new FileStream(fileName, FileMode.Open); + var match = regex.Match(header.ToString()); + if (match.Success) + { + string fileName = filePath + match.Groups[1].Value.Replace("\"", "").Replace("'", ""); + File.WriteAllBytes(fileName, data); + return new FileStream(fileName, FileMode.Open); + } } } var stream = new MemoryStream(data); From 199c4f70adf5e0c800f4f02f0455daeaf68d1521 Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 15 Dec 2015 22:57:02 +0800 Subject: [PATCH 06/82] Add some config options to Javascript client codegen --- .../io/swagger/codegen/DefaultCodegen.java | 10 +++ .../languages/ClojureClientCodegen.java | 4 -- .../languages/JavascriptClientCodegen.java | 72 ++++++++++++++++++- samples/client/petstore/javascript/.gitignore | 1 + 4 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 samples/client/petstore/javascript/.gitignore diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 53c0e6350b0d..cbc1f80fc0b9 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1823,6 +1823,16 @@ public class DefaultCodegen { return word; } + /** + * Dashize the given word. + * + * @param word The word + * @return The dashized version of the word, e.g. "my-name" + */ + protected String dashize(String word) { + return underscore(word).replaceAll("[_ ]", "-"); + } + /** * Generate the next name for the given name, i.e. append "2" to the base name if not ending with a number, * otherwise increase the number by 1. For example: diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java index a850785a7dbb..c8b581b3d3a4 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java @@ -199,8 +199,4 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi protected String namespaceToFolder(String ns) { return ns.replace(".", File.separator).replace("-", "_"); } - - protected String dashize(String s) { - return underscore(s).replaceAll("[_ ]", "-"); - } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index c17b466866c1..840cf88fbd85 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -11,7 +11,7 @@ import io.swagger.codegen.CodegenProperty; import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; -import io.swagger.models.Model; +import io.swagger.models.*; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.LongProperty; import io.swagger.models.properties.MapProperty; @@ -34,6 +34,15 @@ import org.slf4j.LoggerFactory; public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); + private static final String PROJECT_NAME = "projectName"; + private static final String PROJECT_DESCRIPTION = "projectDescription"; + private static final String PROJECT_VERSION = "projectVersion"; + private static final String PROJECT_LICENSE_NAME = "projectLicenseName"; + + protected String projectName = null; + protected String projectDescription = null; + protected String projectVersion = null; + protected String sourceFolder = "src"; protected String localVariablePrefix = ""; @@ -72,9 +81,16 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo instantiationTypes.put("array", "Array"); instantiationTypes.put("map", "HashMap"); - cliOptions.add(new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC)); cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); + cliOptions.add(new CliOption(PROJECT_NAME, + "name of the project (Default: generated from info.title or \"swagger-js-client\")")); + cliOptions.add(new CliOption(PROJECT_DESCRIPTION, + "description of the project (Default: using info.description or \"Client library of \")")); + cliOptions.add(new CliOption(PROJECT_VERSION, + "version of the project (Default: using info.version or \"1.0.0\")")); + cliOptions.add(new CliOption(PROJECT_LICENSE_NAME, + "name of the license the project uses (Default: using info.license.name)")); } @Override @@ -98,6 +114,58 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo typeMapping.put("array", "Array"); } + @Override + public void preprocessSwagger(Swagger swagger) { + super.preprocessSwagger(swagger); + + if (additionalProperties.containsKey(PROJECT_NAME)) { + projectName = ((String) additionalProperties.get(PROJECT_NAME)); + } + if (additionalProperties.containsKey(PROJECT_DESCRIPTION)) { + projectDescription = ((String) additionalProperties.get(PROJECT_DESCRIPTION)); + } + if (additionalProperties.containsKey(PROJECT_VERSION)) { + projectVersion = ((String) additionalProperties.get(PROJECT_VERSION)); + } + + if (swagger.getInfo() != null) { + Info info = swagger.getInfo(); + if (projectName == null && info.getTitle() != null) { + // when projectName is not specified, generate it from info.title + projectName = dashize(info.getTitle()); + } + if (projectVersion == null) { + // when projectVersion is not specified, use info.version + projectVersion = info.getVersion(); + } + if (projectDescription == null) { + // when projectDescription is not specified, use info.description + projectDescription = info.getDescription(); + } + if (info.getLicense() != null) { + License license = info.getLicense(); + if (additionalProperties.get(PROJECT_LICENSE_NAME) == null) { + additionalProperties.put(PROJECT_LICENSE_NAME, license.getName()); + } + } + } + + // default values + if (projectName == null) { + projectName = "swagger-js-client"; + } + if (projectVersion == null) { + projectVersion = "1.0.0"; + } + if (projectDescription == null) { + projectDescription = "Client library of " + projectName; + } + + additionalProperties.put(PROJECT_NAME, projectName); + additionalProperties.put(PROJECT_DESCRIPTION, escapeText(projectDescription)); + additionalProperties.put(PROJECT_VERSION, projectVersion); + } + @Override public String escapeReservedWord(String name) { return "_" + name; diff --git a/samples/client/petstore/javascript/.gitignore b/samples/client/petstore/javascript/.gitignore new file mode 100644 index 000000000000..2ccbe4656c60 --- /dev/null +++ b/samples/client/petstore/javascript/.gitignore @@ -0,0 +1 @@ +/node_modules/ From 625e712d7b75608c17b01cc0f2eed8085f2be131 Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 15 Dec 2015 22:58:15 +0800 Subject: [PATCH 07/82] Javascript: add package.json --- .../src/main/resources/Javascript/package.mustache | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/package.mustache diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache new file mode 100644 index 000000000000..7c9d45a3e6d2 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -0,0 +1,13 @@ +{ + "name": "{{{projectName}}}", + "version": "{{{projectVersion}}}", + "description": "{{{projectDescription}}}",{{#projectLicenseName}} + "license": "{{{projectLicenseName}}}",{{/projectLicenseName}} + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "jquery": "^2.1.4" + } +} From 10885790f8f7f62caf890cba415e872a99019aac Mon Sep 17 00:00:00 2001 From: Tomek Cejner Date: Wed, 16 Dec 2015 14:56:37 +0100 Subject: [PATCH 08/82] Bumped alamofire to 3.1.x --- .../swagger-codegen/src/main/resources/swift/Podspec.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache b/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache index 5cf337ad6f2a..d156ef144176 100644 --- a/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache +++ b/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache @@ -16,5 +16,5 @@ Pod::Spec.new do |s| s.documentation_url = '{{podDocumentationURL}}'{{/podDocumentationURL}} s.source_files = '{{projectName}}/Classes/Swaggers/**/*.swift'{{#usePromiseKit}} s.dependency 'PromiseKit', '~> 2.1'{{/usePromiseKit}} - s.dependency 'Alamofire', '~> 3.0.0' + s.dependency 'Alamofire', '~> 3.1.0' end From 2c1d8b19d287dc3fcca033dc8c1efacc180ae749 Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 16 Dec 2015 23:51:48 +0800 Subject: [PATCH 09/82] Make Javascript client a Node.js (NPM) module --- .../languages/JavascriptClientCodegen.java | 118 ++++++++++++------ .../main/resources/Javascript/api.mustache | 17 ++- .../main/resources/Javascript/index.mustache | 10 ++ .../main/resources/Javascript/model.mustache | 16 ++- .../resources/Javascript/package.mustache | 2 +- .../client/petstore/javascript/package.json | 13 ++ .../src/{scripts/rest => }/api/PetApi.js | 22 +++- .../src/{scripts/rest => }/api/StoreApi.js | 25 ++-- .../src/{scripts/rest => }/api/UserApi.js | 16 ++- .../client/petstore/javascript/src/index.js | 22 ++++ .../src/{scripts/rest => }/model/Category.js | 20 ++- .../src/{scripts/rest => }/model/Order.js | 28 +++-- .../src/{scripts/rest => }/model/Pet.js | 22 +++- .../src/{scripts/rest => }/model/Tag.js | 20 ++- .../src/{scripts/rest => }/model/User.js | 20 ++- 15 files changed, 286 insertions(+), 85 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/index.mustache create mode 100644 samples/client/petstore/javascript/package.json rename samples/client/petstore/javascript/src/{scripts/rest => }/api/PetApi.js (96%) rename samples/client/petstore/javascript/src/{scripts/rest => }/api/StoreApi.js (93%) rename samples/client/petstore/javascript/src/{scripts/rest => }/api/UserApi.js (97%) create mode 100644 samples/client/petstore/javascript/src/index.js rename samples/client/petstore/javascript/src/{scripts/rest => }/model/Category.js (69%) rename samples/client/petstore/javascript/src/{scripts/rest => }/model/Order.js (85%) rename samples/client/petstore/javascript/src/{scripts/rest => }/model/Pet.js (85%) rename samples/client/petstore/javascript/src/{scripts/rest => }/model/Tag.js (69%) rename samples/client/petstore/javascript/src/{scripts/rest => }/model/User.js (89%) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 840cf88fbd85..62bc42bf21d2 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -35,11 +35,13 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); private static final String PROJECT_NAME = "projectName"; + private static final String MODULE_NAME = "moduleName"; private static final String PROJECT_DESCRIPTION = "projectDescription"; private static final String PROJECT_VERSION = "projectVersion"; private static final String PROJECT_LICENSE_NAME = "projectLicenseName"; protected String projectName = null; + protected String moduleName = null; protected String projectDescription = null; protected String projectVersion = null; @@ -52,41 +54,44 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo modelTemplateFiles.put("model.mustache", ".js"); apiTemplateFiles.put("api.mustache", ".js"); templateDir = "Javascript"; - apiPackage = "scripts/rest/api"; - modelPackage = "scripts/rest/model"; + apiPackage = "api"; + modelPackage = "model"; + // reference: http://www.w3schools.com/js/js_reserved.asp reservedWords = new HashSet( Arrays.asList( - "abstract", "continue", "for", "new", "switch", "assert", - "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", - "this", "break", "double", "implements", "protected", "throw", "byte", "else", - "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", - "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", - "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", - "native", "super", "while") + "abstract", "arguments", "boolean", "break", "byte", + "case", "catch", "char", "class", "const", + "continue", "debugger", "default", "delete", "do", + "double", "else", "enum", "eval", "export", + "extends", "false", "final", "finally", "float", + "for", "function", "goto", "if", "implements", + "import", "in", "instanceof", "int", "interface", + "let", "long", "native", "new", "null", + "package", "private", "protected", "public", "return", + "short", "static", "super", "switch", "synchronized", + "this", "throw", "throws", "transient", "true", + "try", "typeof", "var", "void", "volatile", + "while", "with", "yield", + "Array", "Date", "eval", "function", "hasOwnProperty", + "Infinity", "isFinite", "isNaN", "isPrototypeOf", + "Math", "NaN", "Number", "Object", + "prototype", "String", "toString", "undefined", "valueOf") ); languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float", - "Object", - "byte[]") + Arrays.asList("String", "Boolean", "Integer", "Number", "Array", "Object", "Date", "File") ); - instantiationTypes.put("array", "Array"); - instantiationTypes.put("map", "HashMap"); + defaultIncludes = new HashSet(languageSpecificPrimitives); - cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC).defaultValue("src")); cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); cliOptions.add(new CliOption(PROJECT_NAME, "name of the project (Default: generated from info.title or \"swagger-js-client\")")); + cliOptions.add(new CliOption(MODULE_NAME, + "module name for AMD, Node or globals (Default: generated from )")); cliOptions.add(new CliOption(PROJECT_DESCRIPTION, - "description of the project (Default: using info.description or \"Client library of \")")); + "description of the project (Default: using info.description or \"Client library of \")")); cliOptions.add(new CliOption(PROJECT_VERSION, "version of the project (Default: using info.version or \"1.0.0\")")); cliOptions.add(new CliOption(PROJECT_LICENSE_NAME, @@ -111,7 +116,25 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public void processOpts() { super.processOpts(); + + typeMapping = new HashMap(); typeMapping.put("array", "Array"); + typeMapping.put("List", "Array"); + typeMapping.put("map", "Object"); + typeMapping.put("object", "Object"); + typeMapping.put("boolean", "Boolean"); + typeMapping.put("char", "String"); + typeMapping.put("string", "String"); + typeMapping.put("short", "Integer"); + typeMapping.put("int", "Integer"); + typeMapping.put("integer", "Integer"); + typeMapping.put("long", "Integer"); + typeMapping.put("float", "Number"); + typeMapping.put("double", "Number"); + typeMapping.put("number", "Number"); + typeMapping.put("DateTime", "Date"); + + importMapping.clear(); } @Override @@ -121,12 +144,21 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo if (additionalProperties.containsKey(PROJECT_NAME)) { projectName = ((String) additionalProperties.get(PROJECT_NAME)); } + if (additionalProperties.containsKey(MODULE_NAME)) { + moduleName = ((String) additionalProperties.get(MODULE_NAME)); + } if (additionalProperties.containsKey(PROJECT_DESCRIPTION)) { projectDescription = ((String) additionalProperties.get(PROJECT_DESCRIPTION)); } if (additionalProperties.containsKey(PROJECT_VERSION)) { projectVersion = ((String) additionalProperties.get(PROJECT_VERSION)); } + if (additionalProperties.containsKey(CodegenConstants.LOCAL_VARIABLE_PREFIX)) { + localVariablePrefix = (String) additionalProperties.get(CodegenConstants.LOCAL_VARIABLE_PREFIX); + } + if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) { + sourceFolder = (String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER); + } if (swagger.getInfo() != null) { Info info = swagger.getInfo(); @@ -154,6 +186,9 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo if (projectName == null) { projectName = "swagger-js-client"; } + if (moduleName == null) { + moduleName = camelize(underscore(projectName)); + } if (projectVersion == null) { projectVersion = "1.0.0"; } @@ -162,8 +197,14 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo } additionalProperties.put(PROJECT_NAME, projectName); + additionalProperties.put(MODULE_NAME, moduleName); additionalProperties.put(PROJECT_DESCRIPTION, escapeText(projectDescription)); additionalProperties.put(PROJECT_VERSION, projectVersion); + additionalProperties.put(CodegenConstants.LOCAL_VARIABLE_PREFIX, localVariablePrefix); + additionalProperties.put(CodegenConstants.SOURCE_FOLDER, sourceFolder); + + supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); + supportingFiles.add(new SupportingFile("index.mustache", sourceFolder, "index.js")); } @Override @@ -233,6 +274,16 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return toModelName(name); } + @Override + public String toModelImport(String name) { + return name; + } + + @Override + public String toApiImport(String name) { + return name; + } + @Override public String getTypeDeclaration(Property p) { if (p instanceof ArrayProperty) { @@ -263,8 +314,8 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo // added for Javascript } else if (p instanceof RefProperty) { - RefProperty rp = (RefProperty)p; - return "new " +rp.getSimpleRef() + "()"; + RefProperty rp = (RefProperty)p; + return "new " +rp.getSimpleRef() + "()"; } return super.toDefaultValue(p); @@ -283,8 +334,8 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo // added for Javascript } else if (p instanceof RefProperty) { - RefProperty rp = (RefProperty)p; - return ".constructFromObject(data." + name + ");"; + RefProperty rp = (RefProperty)p; + return ".constructFromObject(data." + name + ");"; } return super.toDefaultValueWithParam(name, p); @@ -297,7 +348,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo String type = null; if (typeMapping.containsKey(swaggerType)) { type = typeMapping.get(swaggerType); - if (languageSpecificPrimitives.contains(type) || type.indexOf(".") >= 0) { + if (!needToImport(type)) { return type; } } else { @@ -408,7 +459,8 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo } protected boolean needToImport(String type) { - return super.needToImport(type) && type.indexOf(".") < 0; + return !defaultIncludes.contains(type) + && !languageSpecificPrimitives.contains(type); } private String findCommonPrefixOfVars(List vars) { @@ -475,14 +527,6 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return codegenModel; } - public void setSourceFolder(String sourceFolder) { - this.sourceFolder = sourceFolder; - } - - public void setLocalVariablePrefix(String localVariablePrefix) { - this.localVariablePrefix = localVariablePrefix; - } - private String sanitizePackageName(String packageName) { packageName = packageName.trim(); packageName = packageName.replaceAll("[^a-zA-Z0-9_\\.]", "_"); diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index dd115aaa45c1..cce87ee2f7be 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -1,6 +1,14 @@ -//export module +// require files in Node.js environment +{{#imports}} +var {{import}};{{/imports}} +if (typeof module === 'object' && module.exports) { + {{#imports}} + {{import}} = require('./{{import}}.js');{{/imports}} +} + +// export module for AMD if ( typeof define === "function" && define.amd ) { - define(['jquery'], function($) { + define(['jquery'{{#imports}}, '{{import}}'{{/imports}}], function(${{#imports}}, {{import}}{{/imports}}) { return {{classname}}; }); } @@ -124,3 +132,8 @@ var {{classname}} = function {{classname}}() { return queryString; } } + +// export module for Node.js +if (typeof module === 'object' && module.exports) { + module.exports = {{classname}}; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/index.mustache b/modules/swagger-codegen/src/main/resources/Javascript/index.mustache new file mode 100644 index 000000000000..a0207a6cc916 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/index.mustache @@ -0,0 +1,10 @@ +if (typeof module === 'object' && module.exports) { + var {{moduleName}} = {}; + {{#models}} + {{moduleName}}.{{importPath}} = require('./model/{{importPath}}.js'); + {{/models}} + {{#apiInfo}}{{#apis}} + {{moduleName}}.{{importPath}} = require('./api/{{importPath}}.js'); + {{/apis}}{{/apiInfo}} + module.exports = {{moduleName}}; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache index acf0bcffc195..8b021a3badd3 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -1,10 +1,18 @@ +// require files in Node.js environment +{{#imports}} +var {{import}};{{/imports}} +if (typeof module === 'object' && module.exports) { + {{#imports}} + {{import}} = require('./{{import}}.js');{{/imports}} +} + {{#models}}{{#model}} {{#vars}}{{#isEnum}}{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} {{>enumClass}}{{/items}}*/{{/items.isEnum}}{{/vars}} //export module -if ( typeof define === "function" && define.amd ) { - define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], +if ( typeof define === "function" && define.amd ) { + define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], function(${{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}{{datatypeWithEnum}}{{/isPrimitiveType}}{{/vars}}) { return {{classname}}; }); @@ -56,5 +64,9 @@ var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/ return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = {{classname}}; +} {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache index 7c9d45a3e6d2..d39136cafdd6 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -3,7 +3,7 @@ "version": "{{{projectVersion}}}", "description": "{{{projectDescription}}}",{{#projectLicenseName}} "license": "{{{projectLicenseName}}}",{{/projectLicenseName}} - "main": "index.js", + "main": "{{sourceFolder}}/index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, diff --git a/samples/client/petstore/javascript/package.json b/samples/client/petstore/javascript/package.json new file mode 100644 index 000000000000..926778d30156 --- /dev/null +++ b/samples/client/petstore/javascript/package.json @@ -0,0 +1,13 @@ +{ + "name": "swagger-petstore", + "version": "1.0.0", + "description": "This is a sample server Petstore server. You can find out more about Swagger at http://swagger.io or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters", + "license": "Apache 2.0", + "main": "src/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "jquery": "^2.1.4" + } +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js similarity index 96% rename from samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js rename to samples/client/petstore/javascript/src/api/PetApi.js index 5b4f65234137..58ee6a1c9f7d 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -1,6 +1,13 @@ -//export module +// require files in Node.js environment +var Pet; +if (typeof module === 'object' && module.exports) { + + Pet = require('./Pet.js'); +} + +// export module for AMD if ( typeof define === "function" && define.amd ) { - define(['jquery'], function($) { + define(['jquery', 'Pet'], function($, Pet) { return PetApi; }); } @@ -243,7 +250,7 @@ var PetApi = function PetApi() { /** * Find pet by ID * Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions - * @param {Long} petId ID of pet that needs to be fetched + * @param {Integer} petId ID of pet that needs to be fetched * @param {function} callback the callback function * @return Pet */ @@ -379,7 +386,7 @@ var PetApi = function PetApi() { /** * Deletes a pet * - * @param {Long} petId Pet id to delete + * @param {Integer} petId Pet id to delete * @param {String} apiKey * @param {function} callback the callback function * @return void @@ -437,7 +444,7 @@ var PetApi = function PetApi() { /** * uploads an image * - * @param {Long} petId ID of pet to update + * @param {Integer} petId ID of pet to update * @param {String} additionalMetadata Additional data to pass to server * @param {File} file file to upload * @param {function} callback the callback function @@ -522,3 +529,8 @@ var PetApi = function PetApi() { return queryString; } } + +// export module for Node.js +if (typeof module === 'object' && module.exports) { + module.exports = PetApi; +} \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js b/samples/client/petstore/javascript/src/api/StoreApi.js similarity index 93% rename from samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js rename to samples/client/petstore/javascript/src/api/StoreApi.js index e27494c7924d..4cc55ae6cc15 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/api/StoreApi.js @@ -1,6 +1,13 @@ -//export module +// require files in Node.js environment +var Order; +if (typeof module === 'object' && module.exports) { + + Order = require('./Order.js'); +} + +// export module for AMD if ( typeof define === "function" && define.amd ) { - define(['jquery'], function($) { + define(['jquery', 'Order'], function($, Order) { return StoreApi; }); } @@ -12,7 +19,7 @@ var StoreApi = function StoreApi() { * Returns pet inventories by status * Returns a map of status codes to quantities * @param {function} callback the callback function - * @return Map + * @return Object */ self.getInventory = function(callback) { @@ -47,7 +54,7 @@ var StoreApi = function StoreApi() { - //TypeRef returnType = new TypeRef>() {}; + //TypeRef returnType = new TypeRef>() {}; //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; @@ -59,11 +66,10 @@ var StoreApi = function StoreApi() { request.done(function(response, textStatus, jqXHR){ /** - * @returns Map + * @returns Object */ + var myResponse = response; - var myResponse = new Map(); - myResponse.constructFromObject(response); callback(myResponse, textStatus, jqXHR); }); @@ -298,3 +304,8 @@ var StoreApi = function StoreApi() { return queryString; } } + +// export module for Node.js +if (typeof module === 'object' && module.exports) { + module.exports = StoreApi; +} \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js b/samples/client/petstore/javascript/src/api/UserApi.js similarity index 97% rename from samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js rename to samples/client/petstore/javascript/src/api/UserApi.js index ecd9707fa91e..49883023ae71 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js +++ b/samples/client/petstore/javascript/src/api/UserApi.js @@ -1,6 +1,13 @@ -//export module +// require files in Node.js environment +var User; +if (typeof module === 'object' && module.exports) { + + User = require('./User.js'); +} + +// export module for AMD if ( typeof define === "function" && define.amd ) { - define(['jquery'], function($) { + define(['jquery', 'User'], function($, User) { return UserApi; }); } @@ -479,3 +486,8 @@ var UserApi = function UserApi() { return queryString; } } + +// export module for Node.js +if (typeof module === 'object' && module.exports) { + module.exports = UserApi; +} \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/index.js b/samples/client/petstore/javascript/src/index.js new file mode 100644 index 000000000000..f34b7e01432a --- /dev/null +++ b/samples/client/petstore/javascript/src/index.js @@ -0,0 +1,22 @@ +if (typeof module === 'object' && module.exports) { + var SwaggerPetstore = {}; + + SwaggerPetstore.User = require('./model/User.js'); + + SwaggerPetstore.Category = require('./model/Category.js'); + + SwaggerPetstore.Pet = require('./model/Pet.js'); + + SwaggerPetstore.Tag = require('./model/Tag.js'); + + SwaggerPetstore.Order = require('./model/Order.js'); + + + SwaggerPetstore.User = require('./api/User.js'); + + SwaggerPetstore.Store = require('./api/Store.js'); + + SwaggerPetstore.Pet = require('./api/Pet.js'); + + module.exports = SwaggerPetstore; +} \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Category.js b/samples/client/petstore/javascript/src/model/Category.js similarity index 69% rename from samples/client/petstore/javascript/src/scripts/rest/model/Category.js rename to samples/client/petstore/javascript/src/model/Category.js index aec80bf36355..a87f91354a81 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Category.js +++ b/samples/client/petstore/javascript/src/model/Category.js @@ -1,9 +1,15 @@ +// require files in Node.js environment + +if (typeof module === 'object' && module.exports) { + +} + //export module -if ( typeof define === "function" && define.amd ) { - define('Category', ['jquery'], +if ( typeof define === "function" && define.amd ) { + define('Category', ['jquery'], function($) { return Category; }); @@ -14,7 +20,7 @@ var Category = function Category() { var self = this; /** - * datatype: Long + * datatype: Integer **/ self.id = null; @@ -34,14 +40,14 @@ var Category = function Category() { /** - * @return {Long} + * @return {Integer} **/ self.getId = function() { return self.id; } /** - * @param {Long} id + * @param {Integer} id **/ self.setId = function (id) { self.id = id; @@ -66,3 +72,7 @@ var Category = function Category() { return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = Category; +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Order.js b/samples/client/petstore/javascript/src/model/Order.js similarity index 85% rename from samples/client/petstore/javascript/src/scripts/rest/model/Order.js rename to samples/client/petstore/javascript/src/model/Order.js index 73618cef8889..61120e577d6b 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Order.js +++ b/samples/client/petstore/javascript/src/model/Order.js @@ -1,3 +1,9 @@ +// require files in Node.js environment + +if (typeof module === 'object' && module.exports) { + +} + //export module @@ -30,9 +36,9 @@ var StatusEnum = function StatusEnum() { //export module -if ( typeof define === "function" && define.amd ) { - define('Order', ['jquery', 'Date'], - function($, Date) { +if ( typeof define === "function" && define.amd ) { + define('Order', ['jquery'], + function($) { return Order; }); } @@ -42,12 +48,12 @@ var Order = function Order() { var self = this; /** - * datatype: Long + * datatype: Integer **/ self.id = null; /** - * datatype: Long + * datatype: Integer **/ self.petId = null; @@ -91,28 +97,28 @@ var Order = function Order() { /** - * @return {Long} + * @return {Integer} **/ self.getId = function() { return self.id; } /** - * @param {Long} id + * @param {Integer} id **/ self.setId = function (id) { self.id = id; } /** - * @return {Long} + * @return {Integer} **/ self.getPetId = function() { return self.petId; } /** - * @param {Long} petId + * @param {Integer} petId **/ self.setPetId = function (petId) { self.petId = petId; @@ -181,3 +187,7 @@ var Order = function Order() { return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = Order; +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js b/samples/client/petstore/javascript/src/model/Pet.js similarity index 85% rename from samples/client/petstore/javascript/src/scripts/rest/model/Pet.js rename to samples/client/petstore/javascript/src/model/Pet.js index 259857334502..7a25a1d5fdd6 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js +++ b/samples/client/petstore/javascript/src/model/Pet.js @@ -1,3 +1,11 @@ +// require files in Node.js environment +var Category;var Tag; +if (typeof module === 'object' && module.exports) { + + Category = require('./Category.js'); + Tag = require('./Tag.js'); +} + //export module @@ -30,8 +38,8 @@ var StatusEnum = function StatusEnum() { //export module -if ( typeof define === "function" && define.amd ) { - define('Pet', ['jquery', 'Category', 'Array'], +if ( typeof define === "function" && define.amd ) { + define('Pet', ['jquery', 'Category', 'Array'], function($, Category, Array) { return Pet; }); @@ -42,7 +50,7 @@ var Pet = function Pet(photoUrls, name) { var self = this; /** - * datatype: Long + * datatype: Integer **/ self.id = null; @@ -93,14 +101,14 @@ var Pet = function Pet(photoUrls, name) { /** - * @return {Long} + * @return {Integer} **/ self.getId = function() { return self.id; } /** - * @param {Long} id + * @param {Integer} id **/ self.setId = function (id) { self.id = id; @@ -183,3 +191,7 @@ var Pet = function Pet(photoUrls, name) { return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = Pet; +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Tag.js b/samples/client/petstore/javascript/src/model/Tag.js similarity index 69% rename from samples/client/petstore/javascript/src/scripts/rest/model/Tag.js rename to samples/client/petstore/javascript/src/model/Tag.js index 07994ec3dc93..4801da71e41d 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Tag.js +++ b/samples/client/petstore/javascript/src/model/Tag.js @@ -1,9 +1,15 @@ +// require files in Node.js environment + +if (typeof module === 'object' && module.exports) { + +} + //export module -if ( typeof define === "function" && define.amd ) { - define('Tag', ['jquery'], +if ( typeof define === "function" && define.amd ) { + define('Tag', ['jquery'], function($) { return Tag; }); @@ -14,7 +20,7 @@ var Tag = function Tag() { var self = this; /** - * datatype: Long + * datatype: Integer **/ self.id = null; @@ -34,14 +40,14 @@ var Tag = function Tag() { /** - * @return {Long} + * @return {Integer} **/ self.getId = function() { return self.id; } /** - * @param {Long} id + * @param {Integer} id **/ self.setId = function (id) { self.id = id; @@ -66,3 +72,7 @@ var Tag = function Tag() { return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = Tag; +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/User.js b/samples/client/petstore/javascript/src/model/User.js similarity index 89% rename from samples/client/petstore/javascript/src/scripts/rest/model/User.js rename to samples/client/petstore/javascript/src/model/User.js index 19afab44ee68..6d32676a9213 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/User.js +++ b/samples/client/petstore/javascript/src/model/User.js @@ -1,9 +1,15 @@ +// require files in Node.js environment + +if (typeof module === 'object' && module.exports) { + +} + //export module -if ( typeof define === "function" && define.amd ) { - define('User', ['jquery'], +if ( typeof define === "function" && define.amd ) { + define('User', ['jquery'], function($) { return User; }); @@ -14,7 +20,7 @@ var User = function User() { var self = this; /** - * datatype: Long + * datatype: Integer **/ self.id = null; @@ -77,14 +83,14 @@ var User = function User() { /** - * @return {Long} + * @return {Integer} **/ self.getId = function() { return self.id; } /** - * @param {Long} id + * @param {Integer} id **/ self.setId = function (id) { self.id = id; @@ -195,3 +201,7 @@ var User = function User() { return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = User; +} From cc408a0dd7164a61529653585a5c251d4f44317a Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 00:32:50 +0800 Subject: [PATCH 10/82] Add unit tests to Javascript Petstore sample --- .../languages/JavascriptClientCodegen.java | 2 +- .../main/resources/Javascript/api.mustache | 7 +++--- .../resources/Javascript/package.mustache | 7 +++++- .../client/petstore/javascript/package.json | 7 +++++- .../petstore/javascript/src/api/PetApi.js | 6 ++--- .../petstore/javascript/src/api/StoreApi.js | 6 ++--- .../petstore/javascript/src/api/UserApi.js | 6 ++--- .../client/petstore/javascript/src/index.js | 6 ++--- .../client/petstore/javascript/test/test.js | 22 +++++++++++++++++++ 9 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 samples/client/petstore/javascript/test/test.js diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 62bc42bf21d2..55b847668c0b 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -281,7 +281,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public String toApiImport(String name) { - return name; + return toApiName(name); } @Override diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index cce87ee2f7be..2a0c74ce5604 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -1,9 +1,8 @@ // require files in Node.js environment -{{#imports}} -var {{import}};{{/imports}} +var ${{#imports}}, {{import}}{{/imports}}; if (typeof module === 'object' && module.exports) { - {{#imports}} - {{import}} = require('./{{import}}.js');{{/imports}} + $ = require('jquery');{{#imports}} + {{import}} = require('../model/{{import}}.js');{{/imports}} } // export module for AMD diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache index d39136cafdd6..85603bd364b6 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -5,9 +5,14 @@ "license": "{{{projectLicenseName}}}",{{/projectLicenseName}} "main": "{{sourceFolder}}/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "./node_modules/mocha/bin/mocha" }, "dependencies": { "jquery": "^2.1.4" + }, + "devDependencies": { + "mocha": "^2.3.4", + "mockrequire": "0.0.5", + "najax": "0.3.1" } } diff --git a/samples/client/petstore/javascript/package.json b/samples/client/petstore/javascript/package.json index 926778d30156..c5f1afde698c 100644 --- a/samples/client/petstore/javascript/package.json +++ b/samples/client/petstore/javascript/package.json @@ -5,9 +5,14 @@ "license": "Apache 2.0", "main": "src/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "./node_modules/mocha/bin/mocha" }, "dependencies": { "jquery": "^2.1.4" + }, + "devDependencies": { + "mocha": "^2.3.4", + "mockrequire": "0.0.5", + "najax": "0.3.1" } } diff --git a/samples/client/petstore/javascript/src/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js index 58ee6a1c9f7d..d9e10256b1c5 100644 --- a/samples/client/petstore/javascript/src/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -1,8 +1,8 @@ // require files in Node.js environment -var Pet; +var $, Pet; if (typeof module === 'object' && module.exports) { - - Pet = require('./Pet.js'); + $ = require('jquery'); + Pet = require('../model/Pet.js'); } // export module for AMD diff --git a/samples/client/petstore/javascript/src/api/StoreApi.js b/samples/client/petstore/javascript/src/api/StoreApi.js index 4cc55ae6cc15..7a20d8841a36 100644 --- a/samples/client/petstore/javascript/src/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/api/StoreApi.js @@ -1,8 +1,8 @@ // require files in Node.js environment -var Order; +var $, Order; if (typeof module === 'object' && module.exports) { - - Order = require('./Order.js'); + $ = require('jquery'); + Order = require('../model/Order.js'); } // export module for AMD diff --git a/samples/client/petstore/javascript/src/api/UserApi.js b/samples/client/petstore/javascript/src/api/UserApi.js index 49883023ae71..72dc3f3d198e 100644 --- a/samples/client/petstore/javascript/src/api/UserApi.js +++ b/samples/client/petstore/javascript/src/api/UserApi.js @@ -1,8 +1,8 @@ // require files in Node.js environment -var User; +var $, User; if (typeof module === 'object' && module.exports) { - - User = require('./User.js'); + $ = require('jquery'); + User = require('../model/User.js'); } // export module for AMD diff --git a/samples/client/petstore/javascript/src/index.js b/samples/client/petstore/javascript/src/index.js index f34b7e01432a..b772f6024dca 100644 --- a/samples/client/petstore/javascript/src/index.js +++ b/samples/client/petstore/javascript/src/index.js @@ -12,11 +12,11 @@ if (typeof module === 'object' && module.exports) { SwaggerPetstore.Order = require('./model/Order.js'); - SwaggerPetstore.User = require('./api/User.js'); + SwaggerPetstore.UserApi = require('./api/UserApi.js'); - SwaggerPetstore.Store = require('./api/Store.js'); + SwaggerPetstore.StoreApi = require('./api/StoreApi.js'); - SwaggerPetstore.Pet = require('./api/Pet.js'); + SwaggerPetstore.PetApi = require('./api/PetApi.js'); module.exports = SwaggerPetstore; } \ No newline at end of file diff --git a/samples/client/petstore/javascript/test/test.js b/samples/client/petstore/javascript/test/test.js new file mode 100644 index 000000000000..c7d84917f8a2 --- /dev/null +++ b/samples/client/petstore/javascript/test/test.js @@ -0,0 +1,22 @@ +var assert = require('assert'); +var mockrequire = require('mockrequire'); +var najax = require('najax'); + +var PetApi = mockrequire('../src/api/PetApi', { + 'jquery': { + 'ajax': najax + } +}); + +describe('PetApi', function() { + describe('#getPetById', function () { + it('should work', function (done) { + var api = new PetApi(); + api.getPetById(1, function(pet, textStatus, jqXHR) { + assert.equal('success', textStatus); + assert.equal(1, pet.id); + done(); + }); + }); + }); +}); From 5a1c6e6c17bcbfc72abad3856401cdbb17dfde9b Mon Sep 17 00:00:00 2001 From: Tomek Cejner Date: Wed, 16 Dec 2015 21:55:31 +0100 Subject: [PATCH 11/82] Updated samples, and cartfile --- .../swagger-codegen/src/main/resources/swift/Cartfile.mustache | 2 +- samples/client/petstore/swift/Cartfile | 2 +- samples/client/petstore/swift/PetstoreClient.podspec | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache b/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache index c27fd0c14d12..a0906ba59692 100644 --- a/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache +++ b/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache @@ -1,2 +1,2 @@ -github "Alamofire/Alamofire" >= 3.0.0{{#usePromiseKit}} +github "Alamofire/Alamofire" >= 3.1.0{{#usePromiseKit}} github "mxcl/PromiseKit" >=1.5.3{{/usePromiseKit}} diff --git a/samples/client/petstore/swift/Cartfile b/samples/client/petstore/swift/Cartfile index 745e00376a80..5e4bd352eefc 100644 --- a/samples/client/petstore/swift/Cartfile +++ b/samples/client/petstore/swift/Cartfile @@ -1,2 +1,2 @@ -github "Alamofire/Alamofire" >= 3.0.0 +github "Alamofire/Alamofire" >= 3.1.0 github "mxcl/PromiseKit" >=1.5.3 diff --git a/samples/client/petstore/swift/PetstoreClient.podspec b/samples/client/petstore/swift/PetstoreClient.podspec index 3caf12083de0..ed41db4bfb13 100644 --- a/samples/client/petstore/swift/PetstoreClient.podspec +++ b/samples/client/petstore/swift/PetstoreClient.podspec @@ -7,5 +7,5 @@ Pod::Spec.new do |s| s.license = 'Apache License, Version 2.0' s.source_files = 'PetstoreClient/Classes/Swaggers/**/*.swift' s.dependency 'PromiseKit', '~> 2.1' - s.dependency 'Alamofire', '~> 3.0.0' + s.dependency 'Alamofire', '~> 3.1.0' end From 5f13484157ef0da835252dea8d1c750dcfc6830b Mon Sep 17 00:00:00 2001 From: hacki11 Date: Thu, 17 Dec 2015 00:14:21 +0100 Subject: [PATCH 12/82] - add downloadImage to Petstore - fixed equal instead of ':' after Content-Disposition - added definition of file (swagger-maven-plugin generates them) --- .../main/resources/csharp/ApiClient.mustache | 2 +- .../src/test/resources/2_0/petstore.json | 76 ++++++++ .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 162 ++++++++++++++++++ .../main/csharp/IO/Swagger/Api/StoreApi.cs | 1 + .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 1 + .../csharp/IO/Swagger/Client/ApiClient.cs | 24 +-- .../csharp/IO/Swagger/Client/Configuration.cs | 27 ++- .../main/csharp/IO/Swagger/Model/Category.cs | 4 + .../src/main/csharp/IO/Swagger/Model/Order.cs | 4 + .../src/main/csharp/IO/Swagger/Model/Pet.cs | 4 + .../src/main/csharp/IO/Swagger/Model/Tag.cs | 4 + .../src/main/csharp/IO/Swagger/Model/User.cs | 4 + 12 files changed, 287 insertions(+), 26 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 1b49d9b5347a..142b2e6bbb98 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -232,7 +232,7 @@ namespace {{packageName}}.Client var filePath = String.IsNullOrEmpty(Configuration.TempFolderPath) ? Path.GetTempPath() : Configuration.TempFolderPath; - var regex = new Regex(@"Content-Disposition:.*filename=['""]?([^'""\s]+)['""]?$"); + var regex = new Regex(@"Content-Disposition=.*filename=['""]?([^'""\s]+)['""]?$"); foreach (var header in headers) { var match = regex.Match(header.ToString()); 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 66762d74b2bc..ad9cbead5e97 100644 --- a/modules/swagger-codegen/src/test/resources/2_0/petstore.json +++ b/modules/swagger-codegen/src/test/resources/2_0/petstore.json @@ -402,6 +402,23 @@ ] } }, + "/pet/{petId}/downloadImage" : { + "get" : { + "tags" : [ "pet" ], + "summary" : "downloads an image", + "description" : "", + "operationId" : "downloadFile", + "produces" : [ "application/octet-stream" ], + "responses" : { + "200" : { + "description" : "successful operation", + "schema" : { + "$ref" : "#/definitions/File" + } + } + } + } + }, "/store/inventory": { "get": { "tags": [ @@ -972,6 +989,65 @@ "xml": { "name": "Order" } + }, + "definitions" : { + "File": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "name": { + "type": "string" + }, + "canonicalPath": { + "type": "string" + }, + "parent": { + "type": "string" + }, + "absolute": { + "type": "boolean", + "default": false + }, + "absoluteFile": { + "$ref": "#/definitions/File" + }, + "absolutePath": { + "type": "string" + }, + "canonicalFile": { + "$ref": "#/definitions/File" + }, + "freeSpace": { + "type": "integer", + "format": "int64" + }, + "parentFile": { + "$ref": "#/definitions/File" + }, + "totalSpace": { + "type": "integer", + "format": "int64" + }, + "usableSpace": { + "type": "integer", + "format": "int64" + }, + "directory": { + "type": "boolean", + "default": false + }, + "file": { + "type": "boolean", + "default": false + }, + "hidden": { + "type": "boolean", + "default": false + } + } + } } } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index ba58eeac9e0e..4537144f930b 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -6,6 +6,7 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; + namespace IO.Swagger.Api { @@ -307,6 +308,42 @@ namespace IO.Swagger.Api /// Task of ApiResponse System.Threading.Tasks.Task> DeletePetAsyncWithHttpInfo (long? petId, string apiKey = null); + /// + /// downloads an image + /// + /// + /// + /// + /// Stream + Stream DownloadFile (); + + /// + /// downloads an image + /// + /// + /// + /// + /// ApiResponse of Stream + ApiResponse DownloadFileWithHttpInfo (); + + /// + /// downloads an image + /// + /// + /// + /// + /// Task of Stream + System.Threading.Tasks.Task DownloadFileAsync (); + + /// + /// downloads an image + /// + /// + /// + /// + /// Task of ApiResponse (Stream) + System.Threading.Tasks.Task> DownloadFileAsyncWithHttpInfo (); + /// /// uploads an image /// @@ -1487,6 +1524,131 @@ namespace IO.Swagger.Api null); } + /// + /// downloads an image + /// + /// Stream + public Stream DownloadFile () + { + ApiResponse response = DownloadFileWithHttpInfo(); + return response.Data; + } + + /// + /// downloads an image + /// + /// ApiResponse of Stream + public ApiResponse< Stream > DownloadFileWithHttpInfo () + { + + + var path_ = "/pet/{petId}/downloadImage"; + + var pathParams = new Dictionary(); + var queryParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); + var formParams = new Dictionary(); + var fileParams = new Dictionary(); + String postBody = null; + + // to determine the Accept header + String[] http_header_accepts = new String[] { + "application/octet-stream" + }; + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); + if (http_header_accept != null) + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); + + // set "format" to json by default + // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json + pathParams.Add("format", "json"); + + + + + + + + + // make the HTTP request + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + int statusCode = (int) response.StatusCode; + + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling DownloadFile: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling DownloadFile: " + response.ErrorMessage, response.ErrorMessage); + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Stream) Configuration.ApiClient.Deserialize(response, typeof(Stream))); + + } + + /// + /// downloads an image + /// + /// Task of Stream + public async System.Threading.Tasks.Task DownloadFileAsync () + { + ApiResponse response = await DownloadFileAsyncWithHttpInfo(); + return response.Data; + + } + + /// + /// downloads an image + /// + /// Task of ApiResponse (Stream) + public async System.Threading.Tasks.Task> DownloadFileAsyncWithHttpInfo () + { + + + var path_ = "/pet/{petId}/downloadImage"; + + var pathParams = new Dictionary(); + var queryParams = new Dictionary(); + var headerParams = new Dictionary(); + var formParams = new Dictionary(); + var fileParams = new Dictionary(); + String postBody = null; + + // to determine the Accept header + String[] http_header_accepts = new String[] { + "application/octet-stream" + }; + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); + if (http_header_accept != null) + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); + + // set "format" to json by default + // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json + pathParams.Add("format", "json"); + + + + + + + + + // make the HTTP request + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + int statusCode = (int) response.StatusCode; + + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling DownloadFile: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling DownloadFile: " + response.ErrorMessage, response.ErrorMessage); + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Stream) Configuration.ApiClient.Deserialize(response, typeof(Stream))); + + } + /// /// uploads an image /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index a9e9d6e9b741..db82bf8e6440 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -6,6 +6,7 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; + namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index 5502fe15da17..ac4f138c568b 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -6,6 +6,7 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; + namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs index 58ade0637180..7e6807f16a45 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs @@ -196,13 +196,14 @@ namespace IO.Swagger.Client return ((DateTime)obj).ToString (Configuration.DateTimeFormat); else if (obj is IList) { - string flattenString = ""; - string separator = ","; + var flattenedString = new StringBuilder(); foreach (var param in (IList)obj) { - flattenString += param.ToString() + separator; + if (flattenedString.Length > 0) + flattenedString.Append(","); + flattenedString.Append(param); } - return flattenString.Remove(flattenString.Length - 1);; + return flattenedString.ToString(); } else return Convert.ToString (obj); @@ -231,13 +232,16 @@ namespace IO.Swagger.Client var filePath = String.IsNullOrEmpty(Configuration.TempFolderPath) ? Path.GetTempPath() : Configuration.TempFolderPath; - var regex = new Regex(@"Content-Disposition:.*filename=['""]?([^'""\s]+)['""]?$"); - var match = regex.Match(headers.ToString()); - if (match.Success) + var regex = new Regex(@"Content-Disposition=.*filename=['""]?([^'""\s]+)['""]?$"); + foreach (var header in headers) { - string fileName = filePath + match.Value.Replace("\"", "").Replace("'", ""); - File.WriteAllBytes(fileName, data); - return new FileStream(fileName, FileMode.Open); + var match = regex.Match(header.ToString()); + if (match.Success) + { + string fileName = filePath + match.Groups[1].Value.Replace("\"", "").Replace("'", ""); + File.WriteAllBytes(fileName, data); + return new FileStream(fileName, FileMode.Open); + } } } var stream = new MemoryStream(data); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index bfbb9d7479d3..13d16c9ce57f 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -24,15 +24,15 @@ namespace IO.Swagger.Client /// Dictionary of API key prefix /// Temp folder path /// DateTime format string - public Configuration(ApiClient apiClient = null, - Dictionary defaultHeader = null, - string username = null, - string password = null, - string accessToken = null, - Dictionary apiKey = null, - Dictionary apiKeyPrefix = null, - string tempFolderPath = null, - string dateTimeFormat = null + public Configuration(ApiClient apiClient, + Dictionary defaultHeader, + string username, + string password, + string accessToken, + Dictionary apiKey, + Dictionary apiKeyPrefix, + string tempFolderPath, + string dateTimeFormat ) { if (apiClient == null) @@ -43,11 +43,8 @@ namespace IO.Swagger.Client Username = username; Password = password; AccessToken = accessToken; - - if (apiKey != null) - ApiKey = apiKey; - if (apiKeyPrefix != null) - ApiKeyPrefix = apiKeyPrefix; + ApiKey = apiKey; + ApiKeyPrefix = apiKeyPrefix; TempFolderPath = tempFolderPath; DateTimeFormat = dateTimeFormat; @@ -58,7 +55,7 @@ namespace IO.Swagger.Client /// Initializes a new instance of the Configuration class. /// /// Api client. - public Configuration(ApiClient apiClient) + public Configuration(ApiClient apiClient=null) { if (apiClient == null) ApiClient = ApiClient.Default; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index d9cb6b21005d..03551f9492bc 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -122,4 +124,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 2191707bd091..1d214430ec86 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -187,4 +189,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index 10c44fb46a7b..ab60577e85af 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -187,4 +189,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index 93210505bf0f..cf77c2470b2d 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -122,4 +124,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index 1fbd17da993a..eca977c3b183 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -219,4 +221,6 @@ namespace IO.Swagger.Model } } + + } From c5c17123744891fdac673ee37e05b4a310938e6c Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 17 Dec 2015 15:44:22 +0800 Subject: [PATCH 13/82] fix array of inline model body parameter --- .../io/swagger/codegen/InlineModelResolver.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java index f727560210ad..8235797d8e78 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java @@ -13,9 +13,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class InlineModelResolver { private Swagger swagger = null; private boolean skipMatches = false; + static Logger LOGGER = LoggerFactory.getLogger(InlineModelResolver.class); Map addedModels = new HashMap(); Map generatedSignature = new HashMap(); @@ -60,8 +64,19 @@ public class InlineModelResolver { Property inner = am.getItems(); if(inner instanceof ObjectProperty) { + String modelName = uniqueName(bp.getName()); ObjectProperty op = (ObjectProperty) inner; flattenProperties(op.getProperties(), pathname); + + Model inner_model = modelFromProperty(op, modelName); + String existing = matchGenerated(inner_model); + if (existing != null) { + am.setItems(new RefProperty(existing)); + } else { + am.setItems(new RefProperty(modelName)); + addGenerated(modelName, inner_model); + swagger.addDefinition(modelName, inner_model); + } } } } @@ -222,6 +237,7 @@ public class InlineModelResolver { addGenerated(modelName, model); swagger.addDefinition(modelName, model); } + } else { } } if (propsToUpdate.size() > 0) { From c8a10aee338da551892aba9c6fed6262fc7283cb Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 17 Dec 2015 16:44:35 +0800 Subject: [PATCH 14/82] add support for inline array model defined in inline model --- .../swagger/codegen/InlineModelResolver.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java index 8235797d8e78..a52cc2125dbb 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java @@ -157,6 +157,7 @@ public class InlineModelResolver { flattenProperties(properties, modelName); } else if (model instanceof ArrayModel) { + LOGGER.info("arry model of " + modelName); ArrayModel m = (ArrayModel) model; Property inner = m.getItems(); if (inner instanceof ObjectProperty) { @@ -223,6 +224,7 @@ public class InlineModelResolver { Property property = properties.get(key); if (property instanceof ObjectProperty && ((ObjectProperty)property).getProperties().size() > 0) { String modelName = uniqueName(path + "_" + key); + LOGGER.info("flattening: " + modelName); ObjectProperty op = (ObjectProperty) property; Model model = modelFromProperty(op, modelName); @@ -237,7 +239,31 @@ public class InlineModelResolver { addGenerated(modelName, model); swagger.addDefinition(modelName, model); } + } else if (property instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) property; + Property inner = ap.getItems(); + + if (inner instanceof ObjectProperty) { + String modelName = uniqueName(path + "_" + key); + LOGGER.info("flattening(array inner): " + modelName); + + ObjectProperty op = (ObjectProperty) inner; + flattenProperties(op.getProperties(), path); + + Model inner_model = modelFromProperty(op, modelName); + String existing = matchGenerated(inner_model); + + if (existing != null) { + ap.setItems(new RefProperty(existing)); + } else { + ap.setItems(new RefProperty(modelName)); + addGenerated(modelName, inner_model); + LOGGER.info("flattening(array inner): " + modelName); + swagger.addDefinition(modelName, inner_model); + } + } } else { + LOGGER.info("not flattening " + key); } } if (propsToUpdate.size() > 0) { From 13b03d92d429bd9f0f41d92d35d9259d910dd7e1 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 17 Dec 2015 17:01:14 +0800 Subject: [PATCH 15/82] update response to support array of inline model --- .../swagger/codegen/InlineModelResolver.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java index a52cc2125dbb..62ce6eec8fd7 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java @@ -103,11 +103,23 @@ public class InlineModelResolver { } } else if (property instanceof ArrayProperty) { ArrayProperty ap = (ArrayProperty) property; - if(ap.getItems() instanceof ObjectProperty) { - ObjectProperty op = (ObjectProperty) ap.getItems(); - Map props = op.getProperties(); - flattenProperties(props, "path"); - } + Property inner = ap.getItems(); + + if(inner instanceof ObjectProperty) { + String modelName = uniqueName("inline_response_" + key); + ObjectProperty op = (ObjectProperty) inner; + flattenProperties(op.getProperties(), pathname); + + Model inner_model = modelFromProperty(op, modelName); + String existing = matchGenerated(inner_model); + if (existing != null) { + ap.setItems(new RefProperty(existing)); + } else { + ap.setItems(new RefProperty(modelName)); + addGenerated(modelName, inner_model); + swagger.addDefinition(modelName, inner_model); + } + } } else if (property instanceof MapProperty) { MapProperty op = (MapProperty) property; @@ -367,4 +379,5 @@ public class InlineModelResolver { public void setSkipMatches(boolean skipMatches) { this.skipMatches = skipMatches; } + } From 2e143ec054978a3b882837d759e4a6df6c05b3c2 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 17 Dec 2015 17:39:55 +0800 Subject: [PATCH 16/82] fix map of inline response --- .../swagger/codegen/InlineModelResolver.java | 36 +++++++------------ 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java index 62ce6eec8fd7..2b407c4b1c97 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java @@ -110,41 +110,31 @@ public class InlineModelResolver { ObjectProperty op = (ObjectProperty) inner; flattenProperties(op.getProperties(), pathname); - Model inner_model = modelFromProperty(op, modelName); - String existing = matchGenerated(inner_model); + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); if (existing != null) { ap.setItems(new RefProperty(existing)); } else { ap.setItems(new RefProperty(modelName)); - addGenerated(modelName, inner_model); - swagger.addDefinition(modelName, inner_model); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); } } } else if (property instanceof MapProperty) { - MapProperty op = (MapProperty) property; + MapProperty mp = (MapProperty) property; - Property innerProperty = op.getAdditionalProperties(); + Property innerProperty = mp.getAdditionalProperties(); if(innerProperty instanceof ObjectProperty) { - ModelImpl innerModel = new ModelImpl(); - // TODO: model props - innerModel.setTitle(property.getTitle()); - property.getVendorExtensions(); - property.getRequired(); - property.getReadOnly(); - property.getAccess(); - innerModel.setDescription(property.getDescription()); - innerModel.setExample(property.getExample()); - innerModel.setName(property.getName()); - innerModel.setXml(property.getXml()); - - innerModel.setAdditionalProperties(innerProperty); - String modelName = uniqueName("inline_response_" + key); - String existing = matchGenerated(innerModel); + ObjectProperty op = (ObjectProperty) innerProperty; + flattenProperties(op.getProperties(), pathname); + + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); if (existing != null) { - response.setSchema(new RefProperty(existing)); + mp.setAdditionalProperties(new RefProperty(existing)); } else { - response.setSchema(new RefProperty(modelName)); + mp.setAdditionalProperties(new RefProperty(modelName)); addGenerated(modelName, innerModel); swagger.addDefinition(modelName, innerModel); } From c8c047a2bccfa6651d96d9e3cae400c4467f5fb7 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 17 Dec 2015 17:55:47 +0800 Subject: [PATCH 17/82] fix map in inline model --- .../swagger/codegen/InlineModelResolver.java | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java index 2b407c4b1c97..4b79ded26519 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java @@ -68,14 +68,14 @@ public class InlineModelResolver { ObjectProperty op = (ObjectProperty) inner; flattenProperties(op.getProperties(), pathname); - Model inner_model = modelFromProperty(op, modelName); - String existing = matchGenerated(inner_model); + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); if (existing != null) { am.setItems(new RefProperty(existing)); } else { am.setItems(new RefProperty(modelName)); - addGenerated(modelName, inner_model); - swagger.addDefinition(modelName, inner_model); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); } } } @@ -252,18 +252,42 @@ public class InlineModelResolver { ObjectProperty op = (ObjectProperty) inner; flattenProperties(op.getProperties(), path); - Model inner_model = modelFromProperty(op, modelName); - String existing = matchGenerated(inner_model); + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); if (existing != null) { ap.setItems(new RefProperty(existing)); } else { ap.setItems(new RefProperty(modelName)); - addGenerated(modelName, inner_model); + addGenerated(modelName, innerModel); LOGGER.info("flattening(array inner): " + modelName); - swagger.addDefinition(modelName, inner_model); + swagger.addDefinition(modelName, innerModel); } } + } else if (property instanceof MapProperty) { + MapProperty mp = (MapProperty) property; + Property inner = mp.getAdditionalProperties(); + + if (inner instanceof ObjectProperty) { + String modelName = uniqueName(path + "_" + key); + LOGGER.info("flattening(map inner): " + modelName); + + ObjectProperty op = (ObjectProperty) inner; + flattenProperties(op.getProperties(), path); + + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + + if (existing != null) { + mp.setAdditionalProperties(new RefProperty(existing)); + } else { + mp.setAdditionalProperties(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + LOGGER.info("flattening(array inner): " + modelName); + swagger.addDefinition(modelName, innerModel); + } + } + } else { LOGGER.info("not flattening " + key); } From 146b4a481366321304d6197c85cd73c85877f020 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 17:59:57 +0800 Subject: [PATCH 18/82] Use a more real jquery mocking in test --- .../main/resources/Javascript/package.mustache | 9 +++++---- samples/client/petstore/javascript/package.json | 9 +++++---- .../client/petstore/javascript/test/mocha.opts | 1 + samples/client/petstore/javascript/test/test.js | 15 +++++++++++---- 4 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 samples/client/petstore/javascript/test/mocha.opts diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache index 85603bd364b6..e86b1a17aee4 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -8,11 +8,12 @@ "test": "./node_modules/mocha/bin/mocha" }, "dependencies": { - "jquery": "^2.1.4" + "jquery": "~2.1.4" }, "devDependencies": { - "mocha": "^2.3.4", - "mockrequire": "0.0.5", - "najax": "0.3.1" + "mocha": "~2.3.4", + "mockrequire": "~0.0.5", + "domino": "~1.0.20", + "xmlhttprequest": "~1.8.0" } } diff --git a/samples/client/petstore/javascript/package.json b/samples/client/petstore/javascript/package.json index c5f1afde698c..a7bc83e4ae2c 100644 --- a/samples/client/petstore/javascript/package.json +++ b/samples/client/petstore/javascript/package.json @@ -8,11 +8,12 @@ "test": "./node_modules/mocha/bin/mocha" }, "dependencies": { - "jquery": "^2.1.4" + "jquery": "~2.1.4" }, "devDependencies": { - "mocha": "^2.3.4", - "mockrequire": "0.0.5", - "najax": "0.3.1" + "mocha": "~2.3.4", + "mockrequire": "~0.0.5", + "domino": "~1.0.20", + "xmlhttprequest": "~1.8.0" } } diff --git a/samples/client/petstore/javascript/test/mocha.opts b/samples/client/petstore/javascript/test/mocha.opts new file mode 100644 index 000000000000..cf80ee74bca1 --- /dev/null +++ b/samples/client/petstore/javascript/test/mocha.opts @@ -0,0 +1 @@ +--timeout 5000 diff --git a/samples/client/petstore/javascript/test/test.js b/samples/client/petstore/javascript/test/test.js index c7d84917f8a2..8b4f3953e6d4 100644 --- a/samples/client/petstore/javascript/test/test.js +++ b/samples/client/petstore/javascript/test/test.js @@ -1,11 +1,18 @@ var assert = require('assert'); var mockrequire = require('mockrequire'); -var najax = require('najax'); + +var jquery = require('jquery'); +var domino = require('domino'); +var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; +var window = domino.createWindow(); +var $ = jquery(window); +$.support.cors = true; +$.ajaxSettings.xhr = function() { + return new XMLHttpRequest(); +}; var PetApi = mockrequire('../src/api/PetApi', { - 'jquery': { - 'ajax': najax - } + 'jquery': $ }); describe('PetApi', function() { From 03e3a2d0ddaff17b78a78c6f552cb8d9265df686 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 17 Dec 2015 18:05:39 +0800 Subject: [PATCH 19/82] remove logger, replace tab with space --- .../swagger/codegen/InlineModelResolver.java | 72 +++++++++---------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java index 4b79ded26519..6471a0688a8d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java @@ -106,20 +106,20 @@ public class InlineModelResolver { Property inner = ap.getItems(); if(inner instanceof ObjectProperty) { - String modelName = uniqueName("inline_response_" + key); - ObjectProperty op = (ObjectProperty) inner; - flattenProperties(op.getProperties(), pathname); + String modelName = uniqueName("inline_response_" + key); + ObjectProperty op = (ObjectProperty) inner; + flattenProperties(op.getProperties(), pathname); - Model innerModel = modelFromProperty(op, modelName); - String existing = matchGenerated(innerModel); - if (existing != null) { - ap.setItems(new RefProperty(existing)); - } else { - ap.setItems(new RefProperty(modelName)); - addGenerated(modelName, innerModel); - swagger.addDefinition(modelName, innerModel); - } - } + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + ap.setItems(new RefProperty(existing)); + } else { + ap.setItems(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } + } } else if (property instanceof MapProperty) { MapProperty mp = (MapProperty) property; @@ -127,10 +127,10 @@ public class InlineModelResolver { if(innerProperty instanceof ObjectProperty) { String modelName = uniqueName("inline_response_" + key); ObjectProperty op = (ObjectProperty) innerProperty; - flattenProperties(op.getProperties(), pathname); + flattenProperties(op.getProperties(), pathname); - Model innerModel = modelFromProperty(op, modelName); - String existing = matchGenerated(innerModel); + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); if (existing != null) { mp.setAdditionalProperties(new RefProperty(existing)); } else { @@ -159,7 +159,6 @@ public class InlineModelResolver { flattenProperties(properties, modelName); } else if (model instanceof ArrayModel) { - LOGGER.info("arry model of " + modelName); ArrayModel m = (ArrayModel) model; Property inner = m.getItems(); if (inner instanceof ObjectProperty) { @@ -226,7 +225,6 @@ public class InlineModelResolver { Property property = properties.get(key); if (property instanceof ObjectProperty && ((ObjectProperty)property).getProperties().size() > 0) { String modelName = uniqueName(path + "_" + key); - LOGGER.info("flattening: " + modelName); ObjectProperty op = (ObjectProperty) property; Model model = modelFromProperty(op, modelName); @@ -247,22 +245,20 @@ public class InlineModelResolver { if (inner instanceof ObjectProperty) { String modelName = uniqueName(path + "_" + key); - LOGGER.info("flattening(array inner): " + modelName); ObjectProperty op = (ObjectProperty) inner; - flattenProperties(op.getProperties(), path); + flattenProperties(op.getProperties(), path); Model innerModel = modelFromProperty(op, modelName); String existing = matchGenerated(innerModel); - if (existing != null) { - ap.setItems(new RefProperty(existing)); - } else { - ap.setItems(new RefProperty(modelName)); - addGenerated(modelName, innerModel); - LOGGER.info("flattening(array inner): " + modelName); - swagger.addDefinition(modelName, innerModel); - } + if (existing != null) { + ap.setItems(new RefProperty(existing)); + } else { + ap.setItems(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } } } else if (property instanceof MapProperty) { MapProperty mp = (MapProperty) property; @@ -270,26 +266,22 @@ public class InlineModelResolver { if (inner instanceof ObjectProperty) { String modelName = uniqueName(path + "_" + key); - LOGGER.info("flattening(map inner): " + modelName); ObjectProperty op = (ObjectProperty) inner; - flattenProperties(op.getProperties(), path); + flattenProperties(op.getProperties(), path); Model innerModel = modelFromProperty(op, modelName); String existing = matchGenerated(innerModel); - if (existing != null) { - mp.setAdditionalProperties(new RefProperty(existing)); - } else { - mp.setAdditionalProperties(new RefProperty(modelName)); - addGenerated(modelName, innerModel); - LOGGER.info("flattening(array inner): " + modelName); - swagger.addDefinition(modelName, innerModel); - } + if (existing != null) { + mp.setAdditionalProperties(new RefProperty(existing)); + } else { + mp.setAdditionalProperties(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } } - } else { - LOGGER.info("not flattening " + key); } } if (propsToUpdate.size() > 0) { From dcfe40fc444b854b5796260488e4319ca97f2fec Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 18:51:12 +0800 Subject: [PATCH 20/82] Configure Javascript tests to allow running in browser --- .../resources/Javascript/package.mustache | 1 + .../client/petstore/javascript/package.json | 1 + .../client/petstore/javascript/test/helper.js | 19 +++++++++++ .../petstore/javascript/test/run_tests.html | 33 +++++++++++++++++++ .../client/petstore/javascript/test/test.js | 25 ++++---------- 5 files changed, 61 insertions(+), 18 deletions(-) create mode 100644 samples/client/petstore/javascript/test/helper.js create mode 100644 samples/client/petstore/javascript/test/run_tests.html diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache index e86b1a17aee4..53bbed30be93 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -12,6 +12,7 @@ }, "devDependencies": { "mocha": "~2.3.4", + "expect.js": "~0.3.1", "mockrequire": "~0.0.5", "domino": "~1.0.20", "xmlhttprequest": "~1.8.0" diff --git a/samples/client/petstore/javascript/package.json b/samples/client/petstore/javascript/package.json index a7bc83e4ae2c..156300cf760f 100644 --- a/samples/client/petstore/javascript/package.json +++ b/samples/client/petstore/javascript/package.json @@ -12,6 +12,7 @@ }, "devDependencies": { "mocha": "~2.3.4", + "expect.js": "~0.3.1", "mockrequire": "~0.0.5", "domino": "~1.0.20", "xmlhttprequest": "~1.8.0" diff --git a/samples/client/petstore/javascript/test/helper.js b/samples/client/petstore/javascript/test/helper.js new file mode 100644 index 000000000000..a1b798f325f4 --- /dev/null +++ b/samples/client/petstore/javascript/test/helper.js @@ -0,0 +1,19 @@ +var mockrequire = require('mockrequire'); + +var jquery = require('jquery'); +var domino = require('domino'); +var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; +var window = domino.createWindow(); +var $ = jquery(window); +$.support.cors = true; +$.ajaxSettings.xhr = function() { + return new XMLHttpRequest(); +}; + +var requireWithMocks = function(path) { + return mockrequire(path, { + 'jquery': $ + }); +}; + +exports.requireWithMocks = requireWithMocks; diff --git a/samples/client/petstore/javascript/test/run_tests.html b/samples/client/petstore/javascript/test/run_tests.html new file mode 100644 index 000000000000..9f2d78ad0b86 --- /dev/null +++ b/samples/client/petstore/javascript/test/run_tests.html @@ -0,0 +1,33 @@ + + + + Mocha Tests + + + +
+ + + + + + + + + + + + + + + + diff --git a/samples/client/petstore/javascript/test/test.js b/samples/client/petstore/javascript/test/test.js index 8b4f3953e6d4..3c437d0cd5a5 100644 --- a/samples/client/petstore/javascript/test/test.js +++ b/samples/client/petstore/javascript/test/test.js @@ -1,27 +1,16 @@ -var assert = require('assert'); -var mockrequire = require('mockrequire'); - -var jquery = require('jquery'); -var domino = require('domino'); -var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; -var window = domino.createWindow(); -var $ = jquery(window); -$.support.cors = true; -$.ajaxSettings.xhr = function() { - return new XMLHttpRequest(); -}; - -var PetApi = mockrequire('../src/api/PetApi', { - 'jquery': $ -}); +if (typeof module === 'object' && module.exports) { + var expect = require('expect.js'); + var requireWithMocks = require('./helper.js').requireWithMocks; + var PetApi = requireWithMocks('../src/api/PetApi'); +} describe('PetApi', function() { describe('#getPetById', function () { it('should work', function (done) { var api = new PetApi(); api.getPetById(1, function(pet, textStatus, jqXHR) { - assert.equal('success', textStatus); - assert.equal(1, pet.id); + expect(textStatus).to.be('success'); + expect(pet.id).to.be(1); done(); }); }); From 794783a4bb6c35ac771954d067a74620d2fa5539 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 20:05:00 +0800 Subject: [PATCH 21/82] Javascript: bug fixes, clean-ups, tests - Fix the "apiClient.escapeString" issue - Remove unused code in api.mustache - Add test case for creating and getting Pet --- .../main/resources/Javascript/api.mustache | 66 ++-- .../petstore/javascript/src/api/PetApi.js | 309 ++++++++---------- .../petstore/javascript/src/api/StoreApi.js | 179 ++++------ .../petstore/javascript/src/api/UserApi.js | 289 +++++++--------- .../javascript/test/api/PetApiTest.js | 183 +++++++++++ .../client/petstore/javascript/test/helper.js | 6 +- .../petstore/javascript/test/run_tests.html | 14 +- .../client/petstore/javascript/test/test.js | 18 - 8 files changed, 541 insertions(+), 523 deletions(-) create mode 100644 samples/client/petstore/javascript/test/api/PetApiTest.js delete mode 100644 samples/client/petstore/javascript/test/test.js diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index 2a0c74ce5604..3da5ff00aa15 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -14,7 +14,7 @@ if ( typeof define === "function" && define.amd ) { var {{classname}} = function {{classname}}() { var self = this; -{{#operations}} + {{#operations}} {{#operation}} /** * {{summary}} @@ -24,7 +24,6 @@ var {{classname}} = function {{classname}}() { * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} */ self.{{nickname}} = function({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#hasParams}}, {{/hasParams}}callback) { - var {{localVariablePrefix}}postBody = {{#bodyParam}}{{^isBinary}}JSON.stringify({{paramName}}){{/isBinary}}{{#isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; var {{localVariablePrefix}}postBinaryBody = {{#bodyParam}}{{#isBinary}}{{paramName}}{{/isBinary}}{{^isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; {{#allParams}}{{#required}} @@ -42,8 +41,8 @@ var {{classname}} = function {{classname}}() { basePath = basePath.substring(0, basePath.length-1); } - var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} -, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString()){{/pathParams}}); + var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} +, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}{{{paramName}}}.toString(){{/pathParams}}); var queryParams = {}; var headerParams = {}; @@ -59,52 +58,35 @@ var {{classname}} = function {{classname}}() { {{localVariablePrefix}}formParams.put("{{baseName}}", {{paramName}}); {{/formParams}} - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - {{#isResponseBinary}} - byte[] {{localVariablePrefix}}response = null; - {{localVariablePrefix}}response = {{localVariablePrefix}}apiClient.invokeBinaryAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams,{{localVariablePrefix}} postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames); - return {{localVariablePrefix}}response; - {{/isResponseBinary}} - - {{^isResponseBinary}} - {{#returnType}} - //TypeRef {{localVariablePrefix}}returnType = new TypeRef<{{{returnType}}}>() {}; - //return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); - - var options = {type: "{{httpMethod}}", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "{{httpMethod}}", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns {{{returnType}}} - */ - {{#returnTypeIsPrimitive}} var myResponse = response;{{/returnTypeIsPrimitive}} - {{^returnTypeIsPrimitive}} var myResponse = new {{{returnType}}}(); - myResponse.constructFromObject(response);{{/returnTypeIsPrimitive}} - - callback(myResponse, textStatus, jqXHR); - }); - - {{/returnType}}{{^returnType}} - {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null); - {{/returnType}} - {{/isResponseBinary}} - - + request.done(function(response, textStatus, jqXHR){ + {{#returnType}} + /** + * @returns {{{returnType}}} + */ + {{#returnTypeIsPrimitive}}var myResponse = response;{{/returnTypeIsPrimitive}} + {{^returnTypeIsPrimitive}}var myResponse = new {{{returnType}}}(); + myResponse.constructFromObject(response);{{/returnTypeIsPrimitive}} + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + {{/returnType}}{{^returnType}} + if (callback) { + callback(response, textStatus, jqXHR); + } + {{/returnType}} + }); } {{/operation}} - -{{/operations}} + {{/operations}} function replaceAll (haystack, needle, replace) { var result= haystack; @@ -135,4 +117,4 @@ var {{classname}} = function {{classname}}() { // export module for Node.js if (typeof module === 'object' && module.exports) { module.exports = {{classname}}; -} \ No newline at end of file +} diff --git a/samples/client/petstore/javascript/src/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js index d9e10256b1c5..4f77c603b238 100644 --- a/samples/client/petstore/javascript/src/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -15,6 +15,7 @@ if ( typeof define === "function" && define.amd ) { var PetApi = function PetApi() { var self = this; + /** * Update an existing pet * @@ -23,7 +24,6 @@ var PetApi = function PetApi() { * @return void */ self.updatePet = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -34,7 +34,7 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/pet", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -44,22 +44,22 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "PUT", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "PUT", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -70,7 +70,6 @@ var PetApi = function PetApi() { * @return void */ self.addPet = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -81,7 +80,7 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/pet", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -91,22 +90,22 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -117,7 +116,6 @@ var PetApi = function PetApi() { * @return Array */ self.findPetsByStatus = function(status, callback) { - var postBody = null; var postBinaryBody = null; @@ -128,7 +126,7 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/findByStatus", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/pet/findByStatus", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -140,42 +138,28 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Array - */ - - var myResponse = new Array(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Array + */ + + var myResponse = new Array(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -186,7 +170,6 @@ var PetApi = function PetApi() { * @return Array */ self.findPetsByTags = function(tags, callback) { - var postBody = null; var postBinaryBody = null; @@ -197,7 +180,7 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/findByTags", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/pet/findByTags", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -209,42 +192,28 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Array - */ - - var myResponse = new Array(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Array + */ + + var myResponse = new Array(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -255,7 +224,6 @@ var PetApi = function PetApi() { * @return Pet */ self.getPetById = function(petId, callback) { - var postBody = null; var postBinaryBody = null; @@ -273,8 +241,8 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", petId.toString()); var queryParams = {}; var headerParams = {}; @@ -284,42 +252,28 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Pet - */ - - var myResponse = new Pet(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Pet + */ + + var myResponse = new Pet(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -332,7 +286,6 @@ var PetApi = function PetApi() { * @return void */ self.updatePetWithForm = function(petId, name, status, callback) { - var postBody = null; var postBinaryBody = null; @@ -350,8 +303,8 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", petId.toString()); var queryParams = {}; var headerParams = {}; @@ -365,22 +318,22 @@ var PetApi = function PetApi() { formParams.put("status", status); - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -392,7 +345,6 @@ var PetApi = function PetApi() { * @return void */ self.deletePet = function(petId, apiKey, callback) { - var postBody = null; var postBinaryBody = null; @@ -410,8 +362,8 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", petId.toString()); var queryParams = {}; var headerParams = {}; @@ -423,22 +375,22 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "DELETE", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -451,7 +403,6 @@ var PetApi = function PetApi() { * @return void */ self.uploadFile = function(petId, additionalMetadata, file, callback) { - var postBody = null; var postBinaryBody = null; @@ -469,8 +420,8 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/{petId}/uploadImage", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + var path = basePath + replaceAll(replaceAll("/pet/{petId}/uploadImage", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", petId.toString()); var queryParams = {}; var headerParams = {}; @@ -484,25 +435,25 @@ var PetApi = function PetApi() { formParams.put("file", file); - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } - + function replaceAll (haystack, needle, replace) { var result= haystack; @@ -533,4 +484,4 @@ var PetApi = function PetApi() { // export module for Node.js if (typeof module === 'object' && module.exports) { module.exports = PetApi; -} \ No newline at end of file +} diff --git a/samples/client/petstore/javascript/src/api/StoreApi.js b/samples/client/petstore/javascript/src/api/StoreApi.js index 7a20d8841a36..6cfa53744bac 100644 --- a/samples/client/petstore/javascript/src/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/api/StoreApi.js @@ -15,6 +15,7 @@ if ( typeof define === "function" && define.amd ) { var StoreApi = function StoreApi() { var self = this; + /** * Returns pet inventories by status * Returns a map of status codes to quantities @@ -22,7 +23,6 @@ var StoreApi = function StoreApi() { * @return Object */ self.getInventory = function(callback) { - var postBody = null; var postBinaryBody = null; @@ -33,7 +33,7 @@ var StoreApi = function StoreApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/store/inventory", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/store/inventory", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -43,41 +43,27 @@ var StoreApi = function StoreApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef>() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Object - */ - var myResponse = response; - - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Object + */ + var myResponse = response; + + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -88,7 +74,6 @@ var StoreApi = function StoreApi() { * @return Order */ self.placeOrder = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -99,7 +84,7 @@ var StoreApi = function StoreApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/store/order", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/store/order", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -109,42 +94,28 @@ var StoreApi = function StoreApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Order - */ - - var myResponse = new Order(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Order + */ + + var myResponse = new Order(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -155,7 +126,6 @@ var StoreApi = function StoreApi() { * @return Order */ self.getOrderById = function(orderId, callback) { - var postBody = null; var postBinaryBody = null; @@ -173,8 +143,8 @@ var StoreApi = function StoreApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") -, "\\{" + "orderId" + "\\}", apiClient.escapeString(orderId.toString())); + var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") +, "\\{" + "orderId" + "\\}", orderId.toString()); var queryParams = {}; var headerParams = {}; @@ -184,42 +154,28 @@ var StoreApi = function StoreApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Order - */ - - var myResponse = new Order(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Order + */ + + var myResponse = new Order(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -230,7 +186,6 @@ var StoreApi = function StoreApi() { * @return void */ self.deleteOrder = function(orderId, callback) { - var postBody = null; var postBinaryBody = null; @@ -248,8 +203,8 @@ var StoreApi = function StoreApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") -, "\\{" + "orderId" + "\\}", apiClient.escapeString(orderId.toString())); + var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") +, "\\{" + "orderId" + "\\}", orderId.toString()); var queryParams = {}; var headerParams = {}; @@ -259,25 +214,25 @@ var StoreApi = function StoreApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "DELETE", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } - + function replaceAll (haystack, needle, replace) { var result= haystack; @@ -308,4 +263,4 @@ var StoreApi = function StoreApi() { // export module for Node.js if (typeof module === 'object' && module.exports) { module.exports = StoreApi; -} \ No newline at end of file +} diff --git a/samples/client/petstore/javascript/src/api/UserApi.js b/samples/client/petstore/javascript/src/api/UserApi.js index 72dc3f3d198e..bfa1b1c16c8f 100644 --- a/samples/client/petstore/javascript/src/api/UserApi.js +++ b/samples/client/petstore/javascript/src/api/UserApi.js @@ -15,6 +15,7 @@ if ( typeof define === "function" && define.amd ) { var UserApi = function UserApi() { var self = this; + /** * Create user * This can only be done by the logged in user. @@ -23,7 +24,6 @@ var UserApi = function UserApi() { * @return void */ self.createUser = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -34,7 +34,7 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/user", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -44,22 +44,22 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -70,7 +70,6 @@ var UserApi = function UserApi() { * @return void */ self.createUsersWithArrayInput = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -81,7 +80,7 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/createWithArray", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/user/createWithArray", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -91,22 +90,22 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -117,7 +116,6 @@ var UserApi = function UserApi() { * @return void */ self.createUsersWithListInput = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -128,7 +126,7 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/createWithList", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/user/createWithList", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -138,22 +136,22 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -165,7 +163,6 @@ var UserApi = function UserApi() { * @return String */ self.loginUser = function(username, password, callback) { - var postBody = null; var postBinaryBody = null; @@ -176,7 +173,7 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/login", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/user/login", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -190,41 +187,27 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns String - */ - var myResponse = response; - - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns String + */ + var myResponse = response; + + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -234,7 +217,6 @@ var UserApi = function UserApi() { * @return void */ self.logoutUser = function(callback) { - var postBody = null; var postBinaryBody = null; @@ -245,7 +227,7 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/logout", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/user/logout", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -255,22 +237,22 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -281,7 +263,6 @@ var UserApi = function UserApi() { * @return User */ self.getUserByName = function(username, callback) { - var postBody = null; var postBinaryBody = null; @@ -299,8 +280,8 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", apiClient.escapeString(username.toString())); + var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") +, "\\{" + "username" + "\\}", username.toString()); var queryParams = {}; var headerParams = {}; @@ -310,42 +291,28 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns User - */ - - var myResponse = new User(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns User + */ + + var myResponse = new User(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -357,7 +324,6 @@ var UserApi = function UserApi() { * @return void */ self.updateUser = function(username, body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -375,8 +341,8 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", apiClient.escapeString(username.toString())); + var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") +, "\\{" + "username" + "\\}", username.toString()); var queryParams = {}; var headerParams = {}; @@ -386,22 +352,22 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "PUT", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "PUT", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -412,7 +378,6 @@ var UserApi = function UserApi() { * @return void */ self.deleteUser = function(username, callback) { - var postBody = null; var postBinaryBody = null; @@ -430,8 +395,8 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", apiClient.escapeString(username.toString())); + var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") +, "\\{" + "username" + "\\}", username.toString()); var queryParams = {}; var headerParams = {}; @@ -441,25 +406,25 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "DELETE", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } - + function replaceAll (haystack, needle, replace) { var result= haystack; @@ -490,4 +455,4 @@ var UserApi = function UserApi() { // export module for Node.js if (typeof module === 'object' && module.exports) { module.exports = UserApi; -} \ No newline at end of file +} diff --git a/samples/client/petstore/javascript/test/api/PetApiTest.js b/samples/client/petstore/javascript/test/api/PetApiTest.js new file mode 100644 index 000000000000..122dde3982fd --- /dev/null +++ b/samples/client/petstore/javascript/test/api/PetApiTest.js @@ -0,0 +1,183 @@ +if (typeof module === 'object' && module.exports) { + var expect = require('expect.js'); + var requireApiWithMocks = require('../helper.js').requireApiWithMocks; + var PetApi = requireApiWithMocks('PetApi'); + var Pet = require('../../src/model/Pet'); + var Category = require('../../src/model/Category'); + var Tag = require('../../src/model/Tag'); +} + +var api; + +beforeEach(function() { + api = new PetApi(); +}); + +var createRandomPet = function() { + var id = new Date().getTime(); + var pet = new Pet(); + pet.setId(id); + pet.setName("gorilla" + id); + + var category = new Category(); + category.setName("really-happy"); + pet.setCategory(category); + + pet.setStatus('available'); + var photos = ["http://foo.bar.com/1", "http://foo.bar.com/2"]; + pet.setPhotoUrls(photos); + + return pet; +}; + +describe('PetApi', function() { + it('should create and get pet', function (done) { + var pet = createRandomPet(); + api.addPet(pet); + + api.getPetById(pet.id, function(fetched, textStatus, jqXHR) { + expect(textStatus).to.be('success'); + expect(fetched).to.be.ok(); + expect(fetched.id).to.be(pet.id); + expect(fetched.getCategory()).to.be.ok(); + expect(fetched.getCategory().getName()).to.be(pet.getCategory().getName()); + done(); + }); + }); +}); + +/* + @Test + public void testUpdatePet() throws Exception { + Pet pet = createRandomPet(); + pet.setName("programmer"); + + api.updatePet(pet); + + Pet fetched = api.getPetById(pet.getId()); + assertNotNull(fetched); + assertEquals(pet.getId(), fetched.getId()); + assertNotNull(fetched.getCategory()); + assertEquals(fetched.getCategory().getName(), pet.getCategory().getName()); + } + + @Test + public void testFindPetsByStatus() throws Exception { + Pet pet = createRandomPet(); + pet.setName("programmer"); + pet.setStatus(Pet.StatusEnum.AVAILABLE); + + api.updatePet(pet); + + List pets = api.findPetsByStatus(Arrays.asList(new String[]{"available"})); + assertNotNull(pets); + + boolean found = false; + for (Pet fetched : pets) { + if (fetched.getId().equals(pet.getId())) { + found = true; + break; + } + } + + assertTrue(found); + } + + @Test + public void testFindPetsByTags() throws Exception { + Pet pet = createRandomPet(); + pet.setName("monster"); + pet.setStatus(Pet.StatusEnum.AVAILABLE); + + List tags = new ArrayList(); + Tag tag1 = new Tag(); + tag1.setName("friendly"); + tags.add(tag1); + pet.setTags(tags); + + api.updatePet(pet); + + List pets = api.findPetsByTags(Arrays.asList(new String[]{"friendly"})); + assertNotNull(pets); + + boolean found = false; + for (Pet fetched : pets) { + if (fetched.getId().equals(pet.getId())) { + found = true; + break; + } + } + assertTrue(found); + } + + @Test + public void testUpdatePetWithForm() throws Exception { + Pet pet = createRandomPet(); + pet.setName("frank"); + api.addPet(pet); + + Pet fetched = api.getPetById(pet.getId()); + + api.updatePetWithForm(String.valueOf(fetched.getId()), "furt", null); + Pet updated = api.getPetById(fetched.getId()); + + assertEquals(updated.getName(), "furt"); + } + + @Test + public void testDeletePet() throws Exception { + Pet pet = createRandomPet(); + api.addPet(pet); + + Pet fetched = api.getPetById(pet.getId()); + api.deletePet(fetched.getId(), null); + + try { + fetched = api.getPetById(fetched.getId()); + fail("expected an error"); + } catch (ApiException e) { + assertEquals(404, e.getCode()); + } + } + + @Test + public void testUploadFile() throws Exception { + Pet pet = createRandomPet(); + api.addPet(pet); + + File file = new File("hello.txt"); + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.write("Hello world!"); + writer.close(); + + api.uploadFile(pet.getId(), "a test file", new File(file.getAbsolutePath())); + } + + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet2.equals(pet1)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + assertTrue(pet2.equals(pet2)); + assertTrue(pet2.hashCode() == pet2.hashCode()); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } +} +*/ diff --git a/samples/client/petstore/javascript/test/helper.js b/samples/client/petstore/javascript/test/helper.js index a1b798f325f4..018b6428af66 100644 --- a/samples/client/petstore/javascript/test/helper.js +++ b/samples/client/petstore/javascript/test/helper.js @@ -10,10 +10,10 @@ $.ajaxSettings.xhr = function() { return new XMLHttpRequest(); }; -var requireWithMocks = function(path) { - return mockrequire(path, { +var requireApiWithMocks = function(path) { + return mockrequire('../src/api/' + path, { 'jquery': $ }); }; -exports.requireWithMocks = requireWithMocks; +exports.requireApiWithMocks = requireApiWithMocks; diff --git a/samples/client/petstore/javascript/test/run_tests.html b/samples/client/petstore/javascript/test/run_tests.html index 9f2d78ad0b86..d4b9e6c9f652 100644 --- a/samples/client/petstore/javascript/test/run_tests.html +++ b/samples/client/petstore/javascript/test/run_tests.html @@ -11,19 +11,19 @@ - - - - - - - + + + + + + + From a58f755a6a596261857b807d8ddddb9fed9df282 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 21:19:28 +0800 Subject: [PATCH 23/82] Escape path parameters with encodeURIComponent and tweak the test command --- .../src/main/resources/Javascript/api.mustache | 2 +- .../src/main/resources/Javascript/package.mustache | 2 +- samples/client/petstore/javascript/package.json | 2 +- samples/client/petstore/javascript/pom.xml | 4 ++-- samples/client/petstore/javascript/src/api/PetApi.js | 8 ++++---- samples/client/petstore/javascript/src/api/StoreApi.js | 4 ++-- samples/client/petstore/javascript/src/api/UserApi.js | 6 +++--- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index 21734396695f..0236f6a61be2 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -42,7 +42,7 @@ var {{classname}} = function {{classname}}() { } var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} -, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}{{{paramName}}}.toString(){{/pathParams}}); +, "\\{" + "{{baseName}}" + "\\}", encodeURIComponent({{localVariablePrefix}}{{{paramName}}}.toString()){{/pathParams}}); var queryParams = {}; var headerParams = {}; diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache index 53bbed30be93..c77ee835709e 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -5,7 +5,7 @@ "license": "{{{projectLicenseName}}}",{{/projectLicenseName}} "main": "{{sourceFolder}}/index.js", "scripts": { - "test": "./node_modules/mocha/bin/mocha" + "test": "./node_modules/mocha/bin/mocha --recursive" }, "dependencies": { "jquery": "~2.1.4" diff --git a/samples/client/petstore/javascript/package.json b/samples/client/petstore/javascript/package.json index 156300cf760f..6810fd633de5 100644 --- a/samples/client/petstore/javascript/package.json +++ b/samples/client/petstore/javascript/package.json @@ -5,7 +5,7 @@ "license": "Apache 2.0", "main": "src/index.js", "scripts": { - "test": "./node_modules/mocha/bin/mocha" + "test": "./node_modules/mocha/bin/mocha --recursive" }, "dependencies": { "jquery": "~2.1.4" diff --git a/samples/client/petstore/javascript/pom.xml b/samples/client/petstore/javascript/pom.xml index 82d13ff17ca2..b7a17c92b79c 100644 --- a/samples/client/petstore/javascript/pom.xml +++ b/samples/client/petstore/javascript/pom.xml @@ -32,9 +32,9 @@ exec - mocha + npm - --recursive + test diff --git a/samples/client/petstore/javascript/src/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js index fcc769d2f269..3d5eb1dc9e5c 100644 --- a/samples/client/petstore/javascript/src/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -262,7 +262,7 @@ var PetApi = function PetApi() { } var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", petId.toString()); +, "\\{" + "petId" + "\\}", encodeURIComponent(petId.toString())); var queryParams = {}; var headerParams = {}; @@ -329,7 +329,7 @@ var PetApi = function PetApi() { } var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", petId.toString()); +, "\\{" + "petId" + "\\}", encodeURIComponent(petId.toString())); var queryParams = {}; var headerParams = {}; @@ -393,7 +393,7 @@ var PetApi = function PetApi() { } var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", petId.toString()); +, "\\{" + "petId" + "\\}", encodeURIComponent(petId.toString())); var queryParams = {}; var headerParams = {}; @@ -456,7 +456,7 @@ var PetApi = function PetApi() { } var path = basePath + replaceAll(replaceAll("/pet/{petId}/uploadImage", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", petId.toString()); +, "\\{" + "petId" + "\\}", encodeURIComponent(petId.toString())); var queryParams = {}; var headerParams = {}; diff --git a/samples/client/petstore/javascript/src/api/StoreApi.js b/samples/client/petstore/javascript/src/api/StoreApi.js index a05bf10f1796..e52a31059645 100644 --- a/samples/client/petstore/javascript/src/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/api/StoreApi.js @@ -154,7 +154,7 @@ var StoreApi = function StoreApi() { } var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") -, "\\{" + "orderId" + "\\}", orderId.toString()); +, "\\{" + "orderId" + "\\}", encodeURIComponent(orderId.toString())); var queryParams = {}; var headerParams = {}; @@ -219,7 +219,7 @@ var StoreApi = function StoreApi() { } var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") -, "\\{" + "orderId" + "\\}", orderId.toString()); +, "\\{" + "orderId" + "\\}", encodeURIComponent(orderId.toString())); var queryParams = {}; var headerParams = {}; diff --git a/samples/client/petstore/javascript/src/api/UserApi.js b/samples/client/petstore/javascript/src/api/UserApi.js index 32dcafbfc7ad..148e6171ed40 100644 --- a/samples/client/petstore/javascript/src/api/UserApi.js +++ b/samples/client/petstore/javascript/src/api/UserApi.js @@ -306,7 +306,7 @@ var UserApi = function UserApi() { } var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", username.toString()); +, "\\{" + "username" + "\\}", encodeURIComponent(username.toString())); var queryParams = {}; var headerParams = {}; @@ -372,7 +372,7 @@ var UserApi = function UserApi() { } var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", username.toString()); +, "\\{" + "username" + "\\}", encodeURIComponent(username.toString())); var queryParams = {}; var headerParams = {}; @@ -431,7 +431,7 @@ var UserApi = function UserApi() { } var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", username.toString()); +, "\\{" + "username" + "\\}", encodeURIComponent(username.toString())); var queryParams = {}; var headerParams = {}; From 1b0294dac0258bc7c179883d1f41174a7ef628fc Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 21:29:05 +0800 Subject: [PATCH 24/82] Javascript: fix the constructFromObject issue Closes #1721 Also fixed indentations in models --- .../main/resources/Javascript/model.mustache | 49 +++--- .../petstore/javascript/src/model/Category.js | 55 ++++--- .../petstore/javascript/src/model/Order.js | 121 +++++++------- .../petstore/javascript/src/model/Pet.js | 125 +++++++------- .../petstore/javascript/src/model/Tag.js | 55 ++++--- .../petstore/javascript/src/model/User.js | 153 +++++++++--------- 6 files changed, 288 insertions(+), 270 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache index 8b021a3badd3..0588d03a8c13 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -12,34 +12,37 @@ if (typeof module === 'object' && module.exports) { //export module if ( typeof define === "function" && define.amd ) { - define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], - function(${{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}{{datatypeWithEnum}}{{/isPrimitiveType}}{{/vars}}) { - return {{classname}}; - }); + define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], + function(${{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}{{datatypeWithEnum}}{{/isPrimitiveType}}{{/vars}}) { + return {{classname}}; + }); } {{#description}}/** * {{description}} **/{{/description}} var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/-last}}{{/mandatory}}) { {{#parent}}/* extends {{{parent}}}*/{{/parent}} - var self = this; - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}} - * datatype: {{{datatypeWithEnum}}}{{#required}} - * required{{/required}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - self.{{name}} = {{#required}}{{name}}{{/required}}{{^required}}{{{defaultValue}}}{{/required}}; - {{/vars}} - - self.constructFromObject = function(data) { - {{#vars}} - self.{{name}}{{{defaultValueWithParam}}} - {{/vars}} - } + var self = this; + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}} + * datatype: {{{datatypeWithEnum}}}{{#required}} + * required{{/required}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + self.{{name}} = {{#required}}{{name}}{{/required}}{{^required}}{{{defaultValue}}}{{/required}}; + {{/vars}} + self.constructFromObject = function(data) { + if (!data) { + return; + } + {{#vars}} + self.{{name}}{{{defaultValueWithParam}}} + {{/vars}} + } + {{#vars}} /**{{#description}} * get {{{description}}}{{/description}}{{#minimum}} @@ -50,7 +53,7 @@ var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/ self.{{getter}} = function() { return self.{{name}}; } - + /**{{#description}} * set {{{description}}}{{/description}} * @param {{=<% %>=}}{<% datatypeWithEnum %>}<%={{ }}=%> {{name}} @@ -61,7 +64,7 @@ var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/ {{/vars}} self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } diff --git a/samples/client/petstore/javascript/src/model/Category.js b/samples/client/petstore/javascript/src/model/Category.js index a87f91354a81..ff40497a61a0 100644 --- a/samples/client/petstore/javascript/src/model/Category.js +++ b/samples/client/petstore/javascript/src/model/Category.js @@ -9,35 +9,38 @@ if (typeof module === 'object' && module.exports) { //export module if ( typeof define === "function" && define.amd ) { - define('Category', ['jquery'], - function($) { - return Category; - }); + define('Category', ['jquery'], + function($) { + return Category; + }); } var Category = function Category() { - var self = this; - - /** - * datatype: Integer - **/ - self.id = null; - - /** - * datatype: String - **/ - self.name = null; - + var self = this; - self.constructFromObject = function(data) { - - self.id = data.id; - - self.name = data.name; - - } + /** + * datatype: Integer + **/ + self.id = null; + /** + * datatype: String + **/ + self.name = null; + + + self.constructFromObject = function(data) { + if (!data) { + return; + } + + self.id = data.id; + + self.name = data.name; + + } + /** * @return {Integer} @@ -45,7 +48,7 @@ var Category = function Category() { self.getId = function() { return self.id; } - + /** * @param {Integer} id **/ @@ -59,7 +62,7 @@ var Category = function Category() { self.getName = function() { return self.name; } - + /** * @param {String} name **/ @@ -69,7 +72,7 @@ var Category = function Category() { self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } diff --git a/samples/client/petstore/javascript/src/model/Order.js b/samples/client/petstore/javascript/src/model/Order.js index 61120e577d6b..3cf2335b5356 100644 --- a/samples/client/petstore/javascript/src/model/Order.js +++ b/samples/client/petstore/javascript/src/model/Order.js @@ -37,64 +37,67 @@ var StatusEnum = function StatusEnum() { //export module if ( typeof define === "function" && define.amd ) { - define('Order', ['jquery'], - function($) { - return Order; - }); + define('Order', ['jquery'], + function($) { + return Order; + }); } var Order = function Order() { - var self = this; - - /** - * datatype: Integer - **/ - self.id = null; - - /** - * datatype: Integer - **/ - self.petId = null; - - /** - * datatype: Integer - **/ - self.quantity = null; - - /** - * datatype: Date - **/ - self.shipDate = null; - - /** - * Order Status - * datatype: StatusEnum - **/ - self.status = null; - - /** - * datatype: Boolean - **/ - self.complete = null; - + var self = this; - self.constructFromObject = function(data) { - - self.id = data.id; - - self.petId = data.petId; - - self.quantity = data.quantity; - - self.shipDate = data.shipDate; - - self.status = data.status; - - self.complete = data.complete; - - } + /** + * datatype: Integer + **/ + self.id = null; + /** + * datatype: Integer + **/ + self.petId = null; + + /** + * datatype: Integer + **/ + self.quantity = null; + + /** + * datatype: Date + **/ + self.shipDate = null; + + /** + * Order Status + * datatype: StatusEnum + **/ + self.status = null; + + /** + * datatype: Boolean + **/ + self.complete = null; + + + self.constructFromObject = function(data) { + if (!data) { + return; + } + + self.id = data.id; + + self.petId = data.petId; + + self.quantity = data.quantity; + + self.shipDate = data.shipDate; + + self.status = data.status; + + self.complete = data.complete; + + } + /** * @return {Integer} @@ -102,7 +105,7 @@ var Order = function Order() { self.getId = function() { return self.id; } - + /** * @param {Integer} id **/ @@ -116,7 +119,7 @@ var Order = function Order() { self.getPetId = function() { return self.petId; } - + /** * @param {Integer} petId **/ @@ -130,7 +133,7 @@ var Order = function Order() { self.getQuantity = function() { return self.quantity; } - + /** * @param {Integer} quantity **/ @@ -144,7 +147,7 @@ var Order = function Order() { self.getShipDate = function() { return self.shipDate; } - + /** * @param {Date} shipDate **/ @@ -159,7 +162,7 @@ var Order = function Order() { self.getStatus = function() { return self.status; } - + /** * set Order Status * @param {StatusEnum} status @@ -174,7 +177,7 @@ var Order = function Order() { self.getComplete = function() { return self.complete; } - + /** * @param {Boolean} complete **/ @@ -184,7 +187,7 @@ var Order = function Order() { self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } diff --git a/samples/client/petstore/javascript/src/model/Pet.js b/samples/client/petstore/javascript/src/model/Pet.js index 7a25a1d5fdd6..25ae2e951c80 100644 --- a/samples/client/petstore/javascript/src/model/Pet.js +++ b/samples/client/petstore/javascript/src/model/Pet.js @@ -39,66 +39,69 @@ var StatusEnum = function StatusEnum() { //export module if ( typeof define === "function" && define.amd ) { - define('Pet', ['jquery', 'Category', 'Array'], - function($, Category, Array) { - return Pet; - }); + define('Pet', ['jquery', 'Category', 'Array'], + function($, Category, Array) { + return Pet; + }); } var Pet = function Pet(photoUrls, name) { - var self = this; - - /** - * datatype: Integer - **/ - self.id = null; - - /** - * datatype: Category - **/ - self.category = new Category(); - - /** - * datatype: String - * required - **/ - self.name = name; - - /** - * datatype: Array - * required - **/ - self.photoUrls = photoUrls; - - /** - * datatype: Array - **/ - self.tags = []; - - /** - * pet status in the store - * datatype: StatusEnum - **/ - self.status = null; - + var self = this; - self.constructFromObject = function(data) { - - self.id = data.id; - - self.category.constructFromObject(data.category); - - self.name = data.name; - - self.photoUrls = new Array(); - - self.tags = new Array(); - - self.status = data.status; - - } + /** + * datatype: Integer + **/ + self.id = null; + /** + * datatype: Category + **/ + self.category = new Category(); + + /** + * datatype: String + * required + **/ + self.name = name; + + /** + * datatype: Array + * required + **/ + self.photoUrls = photoUrls; + + /** + * datatype: Array + **/ + self.tags = []; + + /** + * pet status in the store + * datatype: StatusEnum + **/ + self.status = null; + + + self.constructFromObject = function(data) { + if (!data) { + return; + } + + self.id = data.id; + + self.category.constructFromObject(data.category); + + self.name = data.name; + + self.photoUrls = new Array(); + + self.tags = new Array(); + + self.status = data.status; + + } + /** * @return {Integer} @@ -106,7 +109,7 @@ var Pet = function Pet(photoUrls, name) { self.getId = function() { return self.id; } - + /** * @param {Integer} id **/ @@ -120,7 +123,7 @@ var Pet = function Pet(photoUrls, name) { self.getCategory = function() { return self.category; } - + /** * @param {Category} category **/ @@ -134,7 +137,7 @@ var Pet = function Pet(photoUrls, name) { self.getName = function() { return self.name; } - + /** * @param {String} name **/ @@ -148,7 +151,7 @@ var Pet = function Pet(photoUrls, name) { self.getPhotoUrls = function() { return self.photoUrls; } - + /** * @param {Array} photoUrls **/ @@ -162,7 +165,7 @@ var Pet = function Pet(photoUrls, name) { self.getTags = function() { return self.tags; } - + /** * @param {Array} tags **/ @@ -177,7 +180,7 @@ var Pet = function Pet(photoUrls, name) { self.getStatus = function() { return self.status; } - + /** * set pet status in the store * @param {StatusEnum} status @@ -188,7 +191,7 @@ var Pet = function Pet(photoUrls, name) { self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } diff --git a/samples/client/petstore/javascript/src/model/Tag.js b/samples/client/petstore/javascript/src/model/Tag.js index 4801da71e41d..0fa97bd8c78a 100644 --- a/samples/client/petstore/javascript/src/model/Tag.js +++ b/samples/client/petstore/javascript/src/model/Tag.js @@ -9,35 +9,38 @@ if (typeof module === 'object' && module.exports) { //export module if ( typeof define === "function" && define.amd ) { - define('Tag', ['jquery'], - function($) { - return Tag; - }); + define('Tag', ['jquery'], + function($) { + return Tag; + }); } var Tag = function Tag() { - var self = this; - - /** - * datatype: Integer - **/ - self.id = null; - - /** - * datatype: String - **/ - self.name = null; - + var self = this; - self.constructFromObject = function(data) { - - self.id = data.id; - - self.name = data.name; - - } + /** + * datatype: Integer + **/ + self.id = null; + /** + * datatype: String + **/ + self.name = null; + + + self.constructFromObject = function(data) { + if (!data) { + return; + } + + self.id = data.id; + + self.name = data.name; + + } + /** * @return {Integer} @@ -45,7 +48,7 @@ var Tag = function Tag() { self.getId = function() { return self.id; } - + /** * @param {Integer} id **/ @@ -59,7 +62,7 @@ var Tag = function Tag() { self.getName = function() { return self.name; } - + /** * @param {String} name **/ @@ -69,7 +72,7 @@ var Tag = function Tag() { self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } diff --git a/samples/client/petstore/javascript/src/model/User.js b/samples/client/petstore/javascript/src/model/User.js index 6d32676a9213..632208a523c8 100644 --- a/samples/client/petstore/javascript/src/model/User.js +++ b/samples/client/petstore/javascript/src/model/User.js @@ -9,78 +9,81 @@ if (typeof module === 'object' && module.exports) { //export module if ( typeof define === "function" && define.amd ) { - define('User', ['jquery'], - function($) { - return User; - }); + define('User', ['jquery'], + function($) { + return User; + }); } var User = function User() { - var self = this; - - /** - * datatype: Integer - **/ - self.id = null; - - /** - * datatype: String - **/ - self.username = null; - - /** - * datatype: String - **/ - self.firstName = null; - - /** - * datatype: String - **/ - self.lastName = null; - - /** - * datatype: String - **/ - self.email = null; - - /** - * datatype: String - **/ - self.password = null; - - /** - * datatype: String - **/ - self.phone = null; - - /** - * User Status - * datatype: Integer - **/ - self.userStatus = null; - + var self = this; - self.constructFromObject = function(data) { - - self.id = data.id; - - self.username = data.username; - - self.firstName = data.firstName; - - self.lastName = data.lastName; - - self.email = data.email; - - self.password = data.password; - - self.phone = data.phone; - - self.userStatus = data.userStatus; - - } + /** + * datatype: Integer + **/ + self.id = null; + /** + * datatype: String + **/ + self.username = null; + + /** + * datatype: String + **/ + self.firstName = null; + + /** + * datatype: String + **/ + self.lastName = null; + + /** + * datatype: String + **/ + self.email = null; + + /** + * datatype: String + **/ + self.password = null; + + /** + * datatype: String + **/ + self.phone = null; + + /** + * User Status + * datatype: Integer + **/ + self.userStatus = null; + + + self.constructFromObject = function(data) { + if (!data) { + return; + } + + self.id = data.id; + + self.username = data.username; + + self.firstName = data.firstName; + + self.lastName = data.lastName; + + self.email = data.email; + + self.password = data.password; + + self.phone = data.phone; + + self.userStatus = data.userStatus; + + } + /** * @return {Integer} @@ -88,7 +91,7 @@ var User = function User() { self.getId = function() { return self.id; } - + /** * @param {Integer} id **/ @@ -102,7 +105,7 @@ var User = function User() { self.getUsername = function() { return self.username; } - + /** * @param {String} username **/ @@ -116,7 +119,7 @@ var User = function User() { self.getFirstName = function() { return self.firstName; } - + /** * @param {String} firstName **/ @@ -130,7 +133,7 @@ var User = function User() { self.getLastName = function() { return self.lastName; } - + /** * @param {String} lastName **/ @@ -144,7 +147,7 @@ var User = function User() { self.getEmail = function() { return self.email; } - + /** * @param {String} email **/ @@ -158,7 +161,7 @@ var User = function User() { self.getPassword = function() { return self.password; } - + /** * @param {String} password **/ @@ -172,7 +175,7 @@ var User = function User() { self.getPhone = function() { return self.phone; } - + /** * @param {String} phone **/ @@ -187,7 +190,7 @@ var User = function User() { self.getUserStatus = function() { return self.userStatus; } - + /** * set User Status * @param {Integer} userStatus @@ -198,7 +201,7 @@ var User = function User() { self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } From 1777124e62d45ad30b635ffd39a92337e6f850b8 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 21:37:04 +0800 Subject: [PATCH 25/82] Javascript: remove call to `apiClietn.parameterToString` --- .../src/main/resources/Javascript/api.mustache | 4 ++-- samples/client/petstore/javascript/src/api/PetApi.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index 0236f6a61be2..9957fc4e2c51 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -42,7 +42,7 @@ var {{classname}} = function {{classname}}() { } var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} -, "\\{" + "{{baseName}}" + "\\}", encodeURIComponent({{localVariablePrefix}}{{{paramName}}}.toString()){{/pathParams}}); +, "\\{" + "{{baseName}}" + "\\}", encodeURIComponent({{{paramName}}}.toString()){{/pathParams}}); var queryParams = {}; var headerParams = {}; @@ -52,7 +52,7 @@ var {{classname}} = function {{classname}}() { queryParams.{{baseName}} = {{paramName}}; {{/queryParams}} {{#headerParams}}if ({{paramName}} != null) - {{localVariablePrefix}}headerParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}})); + {{localVariablePrefix}}headerParams.put("{{baseName}}", {{paramName}}); {{/headerParams}} {{#formParams}}if ({{paramName}} != null) {{localVariablePrefix}}formParams.put("{{baseName}}", {{paramName}}); diff --git a/samples/client/petstore/javascript/src/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js index 3d5eb1dc9e5c..3b6d9c5b4c62 100644 --- a/samples/client/petstore/javascript/src/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -401,7 +401,7 @@ var PetApi = function PetApi() { if (apiKey != null) - headerParams.put("api_key", apiClient.parameterToString(apiKey)); + headerParams.put("api_key", apiKey); From c1dda0ca1768528c98ce3299888b60c1a09b1050 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 18 Dec 2015 16:50:55 +0800 Subject: [PATCH 26/82] update test case for inline model --- .../codegen/InlineModelResolverTest.java | 70 +++++++++++++------ 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java index 68d64562eba6..f972711138b6 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java @@ -73,6 +73,7 @@ public class InlineModelResolverTest { ModelImpl model = (ModelImpl)swagger.getDefinitions().get("inline_response_200"); assertTrue(model.getProperties().size() == 1); assertNotNull(model.getProperties().get("name")); + assertTrue(model.getProperties().get("name") instanceof StringProperty); } @Test @@ -174,13 +175,30 @@ public class InlineModelResolverTest { ArrayModel am = (ArrayModel) schema; Property inner = am.getItems(); + assertTrue(inner instanceof RefProperty); - ObjectProperty op = (ObjectProperty) inner; - Property name = op.getProperties().get("address"); - assertTrue(name instanceof RefProperty); + RefProperty rp = (RefProperty) inner; + + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/body"); + assertEquals(rp.getSimpleRef(), "body"); - Model model = swagger.getDefinitions().get("hello_address"); - assertNotNull(model); + Model inline = swagger.getDefinitions().get("body"); + assertNotNull(inline); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + RefProperty rpAddress = (RefProperty) impl.getProperties().get("address"); + assertNotNull(rpAddress); + assertEquals(rpAddress.getType(), "ref"); + assertEquals(rpAddress.get$ref(), "#/definitions/hello_address"); + assertEquals(rpAddress.getSimpleRef(), "hello_address"); + + Model inlineProp = swagger.getDefinitions().get("hello_address"); + assertNotNull(inlineProp); + assertTrue(inlineProp instanceof ModelImpl); + ModelImpl implProp = (ModelImpl) inlineProp; + assertNotNull(implProp.getProperties().get("street")); + assertTrue(implProp.getProperties().get("street") instanceof StringProperty); } @Test @@ -213,9 +231,17 @@ public class InlineModelResolverTest { assertNotNull(p); - ObjectProperty innerModel = (ObjectProperty) p; - assertTrue(innerModel.getProperties().size() == 1); - assertNotNull(innerModel.getProperties().get("name")); + RefProperty rp = (RefProperty) p; + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/inline_response_200"); + assertEquals(rp.getSimpleRef(), "inline_response_200"); + + Model inline = swagger.getDefinitions().get("inline_response_200"); + assertNotNull(inline); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + assertNotNull(impl.getProperties().get("name")); + assertTrue(impl.getProperties().get("name") instanceof StringProperty); } @Test @@ -258,20 +284,15 @@ public class InlineModelResolverTest { new InlineModelResolver().flatten(swagger); Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); - Property property = response.getSchema(); - assertTrue(property instanceof RefProperty); + assertTrue(property instanceof MapProperty); + assertTrue(swagger.getDefinitions().size() == 1); Model inline = swagger.getDefinitions().get("inline_response_200"); assertTrue(inline instanceof ModelImpl); ModelImpl impl = (ModelImpl) inline; - - Property innerProperty = impl.getAdditionalProperties(); - assertTrue(innerProperty instanceof ObjectProperty); - - ObjectProperty obj = (ObjectProperty) innerProperty; - Property name = obj.getProperties().get("name"); - assertTrue(name instanceof StringProperty); + assertNotNull(impl.getProperties().get("name")); + assertTrue(impl.getProperties().get("name") instanceof StringProperty); } @Test @@ -295,10 +316,17 @@ public class InlineModelResolverTest { ArrayProperty am = (ArrayProperty) response.getSchema(); Property items = am.getItems(); - assertTrue(items instanceof ObjectProperty); - ObjectProperty op = (ObjectProperty) items; - Property name = op.getProperties().get("name"); - assertTrue(name instanceof StringProperty); + assertTrue(items instanceof RefProperty); + RefProperty rp = (RefProperty) items; + assertEquals(rp.getType(), "ref"); + assertEquals(rp.get$ref(), "#/definitions/inline_response_200"); + assertEquals(rp.getSimpleRef(), "inline_response_200"); + + Model inline = swagger.getDefinitions().get("inline_response_200"); + assertTrue(inline instanceof ModelImpl); + ModelImpl impl = (ModelImpl) inline; + assertNotNull(impl.getProperties().get("name")); + assertTrue(impl.getProperties().get("name") instanceof StringProperty); } @Test From 5b0b759e4ec0ab20933787cba675884ed80abbf1 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Fri, 18 Dec 2015 08:12:15 -0500 Subject: [PATCH 27/82] added enum class support --- .../java/io/swagger/codegen/CodegenModel.java | 5 +- .../io/swagger/codegen/DefaultCodegen.java | 4 ++ .../resources/Java/enumOuterClass.mustache | 3 + .../src/main/resources/Java/model.mustache | 58 +------------------ .../src/main/resources/Java/pojo.mustache | 56 ++++++++++++++++++ 5 files changed, 68 insertions(+), 58 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/pojo.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java index 3e2ad6afb2cb..76d88e0eafe6 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java @@ -13,11 +13,12 @@ public class CodegenModel { public String unescapedDescription; public String defaultValue; public List vars = new ArrayList(); - + public List allowableValues; + // list of all required parameters public Set mandatory = new HashSet(); public Set imports = new HashSet(); - public Boolean hasVars, emptyVars, hasMoreModels, hasEnums; + public Boolean hasVars, emptyVars, hasMoreModels, hasEnums, isEnum; public ExternalDocs externalDocs; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index d0af0316811c..e11e38691ef7 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -837,6 +837,10 @@ public class DefaultCodegen { addVars(m, properties, required); } else { ModelImpl impl = (ModelImpl) model; + if(impl.getEnum() != null && impl.getEnum().size() > 0) { + m.isEnum = true; + m.allowableValues = impl.getEnum(); + } if (impl.getAdditionalProperties() != null) { MapProperty mapProperty = new MapProperty(impl.getAdditionalProperties()); addParentContainer(m, name, mapProperty); diff --git a/modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache b/modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache new file mode 100644 index 000000000000..7aea7b92f22f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache @@ -0,0 +1,3 @@ +public enum {{classname}} { + {{#allowableValues}}{{.}}{{^-last}}, {{/-last}}{{/allowableValues}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache index ac27bca08de6..b62cb9832818 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -16,61 +16,7 @@ import com.fasterxml.jackson.annotation.*; /** * {{description}} **/{{/description}} -@ApiModel(description = "{{{description}}}") -{{>generatedAnnotation}} -public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { - {{#vars}}{{#isEnum}} - -{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} - -{{>enumClass}}{{/items}}{{/items.isEnum}} - private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} - - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") - @JsonProperty("{{baseName}}") - public {{{datatypeWithEnum}}} {{getter}}() { - return {{name}}; - } - public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { - this.{{name}} = {{name}}; - } - - {{/vars}} - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} - return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && - {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} - return true;{{/hasVars}} - } - - @Override - public int hashCode() { - return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); - {{/vars}}sb.append("}"); - return sb.toString(); - } -} +{{#isEnum}}{{>enumOuterClass}}{{/isEnum}} +{{^isEnum}}{{>pojo}}{{/isEnum}} {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Java/pojo.mustache b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache new file mode 100644 index 000000000000..2e9facfb14d2 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache @@ -0,0 +1,56 @@ +@ApiModel(description = "{{{description}}}") +{{>generatedAnnotation}} +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { + {{#vars}}{{#isEnum}} + +{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} + +{{>enumClass}}{{/items}}{{/items.isEnum}} + private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") + @JsonProperty("{{baseName}}") + public {{{datatypeWithEnum}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + {{/vars}}sb.append("}"); + return sb.toString(); + } +} \ No newline at end of file From 5814cd47bcb921ceafe5e11f4121887a1bb9cdfe Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Fri, 18 Dec 2015 08:12:31 -0500 Subject: [PATCH 28/82] updated parser for #1357 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 43df2b04be05..112b277b18c0 100644 --- a/pom.xml +++ b/pom.xml @@ -543,7 +543,7 @@ - 1.0.12 + 1.0.14-SNAPSHOT 2.11.1 2.3.4 1.5.5-SNAPSHOT From 968c943c448aad78748ae1a0f77f01e4cc3eb5bd Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Fri, 18 Dec 2015 10:58:30 -0800 Subject: [PATCH 29/82] more enum support --- .../src/main/java/io/swagger/codegen/CodegenModel.java | 2 +- .../src/main/java/io/swagger/codegen/DefaultCodegen.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java index 76d88e0eafe6..d5702b5c50a0 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java @@ -9,7 +9,7 @@ import java.util.Set; public class CodegenModel { public String parent; - public String name, classname, description, classVarName, modelJson; + public String name, classname, description, classVarName, modelJson, dataType; public String unescapedDescription; public String defaultValue; public List vars = new ArrayList(); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index b2894e8b2e9c..11472fec4ff6 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -841,6 +841,8 @@ public class DefaultCodegen { if(impl.getEnum() != null && impl.getEnum().size() > 0) { m.isEnum = true; m.allowableValues = impl.getEnum(); + Property p = PropertyBuilder.build(impl.getType(), impl.getFormat(), null); + m.dataType = getSwaggerType(p); } if (impl.getAdditionalProperties() != null) { MapProperty mapProperty = new MapProperty(impl.getAdditionalProperties()); From 0aa4d2fb8ed8138883cf2f3f79a8e7ba320cc7c1 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 19 Dec 2015 22:55:52 +0800 Subject: [PATCH 30/82] csharp add timeout, fix default constructor --- .../resources/csharp/Configuration.mustache | 55 +++++++++++++----- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 1 - .../main/csharp/IO/Swagger/Api/StoreApi.cs | 1 - .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 1 - .../csharp/IO/Swagger/Client/Configuration.cs | 55 +++++++++++++----- .../main/csharp/IO/Swagger/Model/Category.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/Order.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/Pet.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/Tag.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/User.cs | 4 -- .../SwaggerClientTest/TestConfiguration.cs | 15 +++++ .../bin/Debug/SwaggerClientTest.dll | Bin 113664 -> 117248 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 30764 -> 31881 bytes ...ClientTest.csproj.FilesWrittenAbsolute.txt | 6 +- .../obj/Debug/SwaggerClientTest.dll | Bin 113664 -> 117248 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 30764 -> 31881 bytes 16 files changed, 98 insertions(+), 56 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index b5ebd08ba877..1bd34f844b87 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -24,15 +24,16 @@ namespace {{packageName}}.Client /// Dictionary of API key prefix /// Temp folder path /// DateTime format string - public Configuration(ApiClient apiClient, - Dictionary defaultHeader, - string username, - string password, - string accessToken, - Dictionary apiKey, - Dictionary apiKeyPrefix, - string tempFolderPath, - string dateTimeFormat + public Configuration(ApiClient apiClient = null, + Dictionary defaultHeader = null, + string username = null, + string password = null, + string accessToken = null, + Dictionary apiKey = null, + Dictionary apiKeyPrefix = null, + string tempFolderPath = null, + string dateTimeFormat = null, + int timeout = 100 ) { if (apiClient == null) @@ -43,19 +44,24 @@ namespace {{packageName}}.Client Username = username; Password = password; AccessToken = accessToken; - ApiKey = apiKey; - ApiKeyPrefix = apiKeyPrefix; + + if (defaultHeader != null) + DefaultHeader = defaultHeader; + if (apiKey != null) + ApiKey = apiKey; + if (apiKeyPrefix != null) + ApiKeyPrefix = apiKeyPrefix; TempFolderPath = tempFolderPath; DateTimeFormat = dateTimeFormat; - + Timeout = timeout; } /// /// Initializes a new instance of the Configuration class. /// /// Api client. - public Configuration(ApiClient apiClient=null) + public Configuration(ApiClient apiClient) { if (apiClient == null) ApiClient = ApiClient.Default; @@ -75,20 +81,39 @@ namespace {{packageName}}.Client /// Configuration. public static Configuration Default = new Configuration(); + /// + /// Gets or sets the timeout value of ApiClient. Default to 100 seconds. + /// + /// Timeout. + public int Timeout + { + get { return ApiClient.RestClient.Timeout; } + + set + { + ApiClient.RestClient.Timeout = value; + } + } + /// /// Gets or sets the default API client for making HTTP calls. /// /// The API client. public ApiClient ApiClient; - private readonly Dictionary _defaultHeaderMap = new Dictionary(); + private Dictionary _defaultHeaderMap = new Dictionary(); /// - /// Gets the default header. + /// Gets or sets the default header. /// public Dictionary DefaultHeader { get { return _defaultHeaderMap; } + + set + { + _defaultHeaderMap = value; + } } /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 4537144f930b..e7334aa160bc 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -6,7 +6,6 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; - namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index db82bf8e6440..a9e9d6e9b741 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -6,7 +6,6 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; - namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index ac4f138c568b..5502fe15da17 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -6,7 +6,6 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; - namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index 13d16c9ce57f..c6c2e4559496 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -24,15 +24,16 @@ namespace IO.Swagger.Client /// Dictionary of API key prefix /// Temp folder path /// DateTime format string - public Configuration(ApiClient apiClient, - Dictionary defaultHeader, - string username, - string password, - string accessToken, - Dictionary apiKey, - Dictionary apiKeyPrefix, - string tempFolderPath, - string dateTimeFormat + public Configuration(ApiClient apiClient = null, + Dictionary defaultHeader = null, + string username = null, + string password = null, + string accessToken = null, + Dictionary apiKey = null, + Dictionary apiKeyPrefix = null, + string tempFolderPath = null, + string dateTimeFormat = null, + int timeout = 100 ) { if (apiClient == null) @@ -43,19 +44,24 @@ namespace IO.Swagger.Client Username = username; Password = password; AccessToken = accessToken; - ApiKey = apiKey; - ApiKeyPrefix = apiKeyPrefix; + + if (defaultHeader != null) + DefaultHeader = defaultHeader; + if (apiKey != null) + ApiKey = apiKey; + if (apiKeyPrefix != null) + ApiKeyPrefix = apiKeyPrefix; TempFolderPath = tempFolderPath; DateTimeFormat = dateTimeFormat; - + Timeout = timeout; } /// /// Initializes a new instance of the Configuration class. /// /// Api client. - public Configuration(ApiClient apiClient=null) + public Configuration(ApiClient apiClient) { if (apiClient == null) ApiClient = ApiClient.Default; @@ -75,20 +81,39 @@ namespace IO.Swagger.Client /// Configuration. public static Configuration Default = new Configuration(); + /// + /// Gets or sets the timeout value of ApiClient. Default to 100 seconds. + /// + /// Timeout. + public int Timeout + { + get { return ApiClient.RestClient.Timeout; } + + set + { + ApiClient.RestClient.Timeout = value; + } + } + /// /// Gets or sets the default API client for making HTTP calls. /// /// The API client. public ApiClient ApiClient; - private readonly Dictionary _defaultHeaderMap = new Dictionary(); + private Dictionary _defaultHeaderMap = new Dictionary(); /// - /// Gets the default header. + /// Gets or sets the default header. /// public Dictionary DefaultHeader { get { return _defaultHeaderMap; } + + set + { + _defaultHeaderMap = value; + } } /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index 03551f9492bc..d9cb6b21005d 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -124,6 +122,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 1d214430ec86..2191707bd091 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -189,6 +187,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index ab60577e85af..10c44fb46a7b 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -189,6 +187,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index cf77c2470b2d..93210505bf0f 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -124,6 +122,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index eca977c3b183..1fbd17da993a 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -221,6 +219,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs index a72e1a5ed1d2..4e29c5a25229 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs @@ -107,5 +107,20 @@ namespace SwaggerClientTest.TestConfiguration Assert.AreSame (p4.Configuration.ApiClient, a1); } + [Test ()] + public void TestTimeout () + { + Configuration c1 = new Configuration(); + Assert.AreEqual(c1.Timeout, 100); // default vaue + + c1.Timeout = 10; + Assert.AreEqual(c1.Timeout, 10); + + Configuration c2 = new Configuration(timeout: 20); + Assert.AreEqual(c2.Timeout, 20); + + + + } } } \ No newline at end of file diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 1cc6bc94f0c97cc2eb0e3c881f9499928d0f3982..22cef5104c54181889d4b74bd7f493df286d7160 100755 GIT binary patch literal 117248 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
  • SVtqD(k6U(P00cu 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 D2ea?d literal 30764 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 f?ZIrnoxu2yMB;<(w=0zNNl diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt index 7d68ff048e5d..f115c595d6a0 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt +++ b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt @@ -1,9 +1,9 @@ /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttribute.cs /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.swagger-logo.png -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/nunit.framework.dll -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/RestSharp.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/nunit.framework.dll +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/RestSharp.dll diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 1cc6bc94f0c97cc2eb0e3c881f9499928d0f3982..22cef5104c54181889d4b74bd7f493df286d7160 100755 GIT binary patch literal 117248 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
  • SVtqD(k6U(P00cu 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 D2ea?d literal 30764 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 f?ZIrnoxu2yMB;<(w=0zNNl From 2cc5924498ba1dd10064b17e25b8e2e39fe8a37d Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 19 Dec 2015 23:15:54 +0800 Subject: [PATCH 31/82] update test case, docstring for timeout --- .../resources/csharp/Configuration.mustache | 4 ++-- .../csharp/IO/Swagger/Client/Configuration.cs | 4 ++-- .../SwaggerClientTest/TestConfiguration.cs | 13 +++++-------- .../csharp/SwaggerClientTest/TestPet.cs | 5 ++++- .../bin/Debug/SwaggerClientTest.dll | Bin 117248 -> 117248 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 31881 -> 31890 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 117248 -> 117248 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 31881 -> 31890 bytes 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index 1bd34f844b87..7062a73c1e1c 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -33,7 +33,7 @@ namespace {{packageName}}.Client Dictionary apiKeyPrefix = null, string tempFolderPath = null, string dateTimeFormat = null, - int timeout = 100 + int timeout = 100000 ) { if (apiClient == null) @@ -82,7 +82,7 @@ namespace {{packageName}}.Client public static Configuration Default = new Configuration(); /// - /// Gets or sets the timeout value of ApiClient. Default to 100 seconds. + /// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Default to 100000 milliseconds. /// /// Timeout. public int Timeout diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index c6c2e4559496..000b8893cdf4 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -33,7 +33,7 @@ namespace IO.Swagger.Client Dictionary apiKeyPrefix = null, string tempFolderPath = null, string dateTimeFormat = null, - int timeout = 100 + int timeout = 100000 ) { if (apiClient == null) @@ -82,7 +82,7 @@ namespace IO.Swagger.Client public static Configuration Default = new Configuration(); /// - /// Gets or sets the timeout value of ApiClient. Default to 100 seconds. + /// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Default to 100000 milliseconds. /// /// Timeout. public int Timeout diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs index 4e29c5a25229..140fd2698342 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs @@ -111,16 +111,13 @@ namespace SwaggerClientTest.TestConfiguration public void TestTimeout () { Configuration c1 = new Configuration(); - Assert.AreEqual(c1.Timeout, 100); // default vaue - - c1.Timeout = 10; - Assert.AreEqual(c1.Timeout, 10); - - Configuration c2 = new Configuration(timeout: 20); - Assert.AreEqual(c2.Timeout, 20); - + Assert.AreEqual(100000, c1.Timeout); // default vaue + c1.Timeout = 50000; + Assert.AreEqual(50000, c1.Timeout); + Configuration c2 = new Configuration(timeout: 20000); + Assert.AreEqual(20000, c2.Timeout); } } } \ No newline at end of file diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 7c21f8efeaf1..fbbf44949516 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -114,7 +114,10 @@ namespace SwaggerClientTest.TestPet [Test ()] public void TestGetPetById () { - PetApi petApi = new PetApi (); + // set timeout to 10 seconds + Configuration c1 = new Configuration (timeout: 10000); + + PetApi petApi = new PetApi (c1); Pet response = petApi.GetPetById (petId); Assert.IsInstanceOf (response, "Response is a Pet"); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 22cef5104c54181889d4b74bd7f493df286d7160..b0a59cff946eda2f0653fcd1fc07bd90f80e26e2 100755 GIT binary patch delta 2522 zcmZYB3ry2T7y$75+R~P4m^`$FnNTck|E0{Rn~u3@m}1-#c`1r0<0+z6>>@sJGy8)W z!bX=sNdjiLt}hQ(TR-A$tGFQV6waKJ_WZX9QV8L9^ZEd zNh=!-m5qk_R#@6_JR3&+04k*Tt3Zvj4gwROH~5c+g)mDru*+SH$x+4*w#R9fx6Fyg zNsL83`B;zE04p~D(^tO4m@a{}A7~x6yli3-eB})ECT{Fa z2|c-pD62J%%A1B=!{qXWJsO2yhly#l%3AQB3r4ix3=XeRYdghtHn8uUf6iG2Cs8$) zd%7Z)3SUbZFE}60NrisWC1@GUoH-p%tH>efGDq7oz}GDoo;M$k%7ptUnM@{(OJOpZ5YZ!M))+-HnJ}C5h$p%l z7LjyHsBJYQlfslV+ZxzFdS1!n+SH@UZ4{-{mId!oaG|n~tCqA(@vyaUjFhT)xlWSS zE7i7j&`By${9Jt~S$#GP_u>gyeKzQVLY+)hpAAZoiStGE&9?Q>_md2Y>T_W9ypXIu z2PUMj`W%>b0b^Kw4p>P$mGt-xu$ZJOIb10u@k|>bk0hRHBW&T~=hqm0N`8DU9H8JK z#mnU*wJH_yZ$S&`Gvx!WHj=oRJm@8fo5_O#l&n4p=9;>VELKHRII)+ zz5v?##netFsxO4s#gP)Um9|6JSP5Xs69 z+y)<$bS@9`zz?J_mzS%Xq*`2Qw(W3>=yc_A{ehC#Rt8CzC$FsxvQYBY%Af)zZmlhT z2XtSVyfrV}y^8Db3B52O#TL1Wm>0UQ$vt0Hkz>T=DC4g(n2p+gLuxO|cT=hcb#zdw z88uEiA!pu_u~Vq}-=uovOwyoB71=DfgF(u4u@rlNQ&*8DP+yQD62v;oklge|R2HcK zb(G{ojY!c6e^ZQ~pz>{WcjY$Ue)BtHQs`hs| zGX?cfiYGHu^Cqui1cSz}LJmjmgaxQ7<4wzrnLFV%icN$(h%Se96uWPEJ*FHAC{}N* z*6xCL0wE4K5(Bw`kCLHUYbbWiWkJ*SzzZobZF=+ydzwApUSU6CZ?y;Pr|n(#e*10v zi2XrRW(F)&$L);mX8 hsS(8!>w^Jw!y9EZ7KE_%r^19*B!~*3T&&e{Sez`Y)`n& zJo@RBemjnQ<%f<~6~blFw+65hY#Uh#D5|2LIMjNnFN*gnQq zrln03DTXGBBcl>U8L^3JymcmKJ2cG2wEU}00&fEcGvTBL>YC#$;jkppZwVaFg7lR$uEff`)hY*L%`S!v9q-Ni$@^gbBK8^#Awh)D1ntff)~Op^p#9(Fn6%&d Y9WWLMI}4Arn&kO`@NT#d4f72D0_8JQo&W#< delta 2590 zcmZwJ4NR0}902g=e|Ov+r$astInccDc<1EM`T4T=9WX;05r4|N+d>EpsGfh4G3e6J3m6Exh=l?v4quz~&_xJptkN^L9 zV0*XK8Mf6Kb~Qs#?WfsrL%CPh6E751<2W>gz#QMQd*-m$$O_w z#zBObA3fIM3Ih=Rwgf_Sv8`3jLl%RUJfx%6t06}$YJYohw0Cm|*v}1Sg^Vrd({?wbtI_CDJ=CBcq=`x$g?SbcF(t84FhSp+v0nJ%& zHF->wqSJ((k51BTHRF^C20q2Cj`T@DS|g6#Sgh>mqC1dUa>()f^b}}DRat)16_Hdp zz-2t{xIaA=`i0Io0&S^qR>(ZDoTR}YLKhq!st2ep5)x2O(qSvTY(lEYbqCXjs4j9e zVp2pp99EFm;b=spEd#2%+0ZW1AJJgWgkMoSnM}CLg~?<>P!BF@WXWWLMQD^Jx(H?p z>EuA$BA6!>B&XRH!&0Fsaz2&2N8!uJa;a?zY!Sg(@@A?XLJQ<_k_8_NrOF(3VG%9m|U1Gq{ul`NkZ(JmP4)(yQbw(OhxyvGS!%5IdQC=n`TllMe$ZUVQOs=2WGLTD0VcV7rCLaf3f=n`TT7Qq0DC$kbVPT`uE%t}~` zQg}8iVHc8JMN>>MRXqd)UgI8#j##X~tp)mT-wFW*AdYW#y z20jteIm<~o925$2dZ;>u6pJ&>wiYf5I-L1bLnwZ1>mcFm*s-mH3=}`Lb+8e|PHlh8 zdgweic4{8Davta56?)(v7n$uWA|B}cnXj3sAcqB$QM!vfn2jpC#Pud>qo1n^RXxbn zi1G{V<0CKgSQ~27RjwXBQfSbruxz5PVNhf`or{d%&;+3es79gCST>Jb=ZijvnkVE& zRSVUiPI8GI&WRY^L7~gs68r{-x_{w|4xpNaE}+_k?xBW+LR>7F_#r+o8ns_&F3Np_ z#}=a6xM(urnpZvG=QMs5&|vn$D5}!vw_FPMg6<|xG(HFziL8KWs7m8)%S%xeAdA>8 z<96*vSm2v)hmWEl*LOY%wrdTA_8Fwlw8mGm5GG8FOqNol71A40gS1!rQuHRzvfDQJoLYd@+5BJLU*zK z2V0(&Hjbqj7{|6W$FVZ3aVfNQ#AVqv#7VUDBPf=(zQdW&qH*rDD{<_&b*vH3PWx&4 zi7~FPzIF+O&41tC7dAfBV6Xe1B`PA=I1SO$rGw_M_dUMBC6NAdaCbu1{R5$QUfUD* z*20cw)KOnjBUmSEiwW@+eF0IEw0eWaSNR=yz`~~SXGna}F+KFxKWv96&9J{dssrxU ZyE`D>7t{%(T21h?zL0LX4Yl!xe*roYX{i7J diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb index 34cdb18300fdedde7306847c1f11a5ff68289b8e..25bc7b803d9bea8c3673a505c362c1c36ebbff70 100644 GIT binary patch delta 5514 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 WXw(Yci?2gI@G1NR5+h~u_x}f#^*bd1 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 22cef5104c54181889d4b74bd7f493df286d7160..b0a59cff946eda2f0653fcd1fc07bd90f80e26e2 100755 GIT binary patch delta 2522 zcmZYB3ry2T7y$75+R~P4m^`$FnNTck|E0{Rn~u3@m}1-#c`1r0<0+z6>>@sJGy8)W z!bX=sNdjiLt}hQ(TR-A$tGFQV6waKJ_WZX9QV8L9^ZEd zNh=!-m5qk_R#@6_JR3&+04k*Tt3Zvj4gwROH~5c+g)mDru*+SH$x+4*w#R9fx6Fyg zNsL83`B;zE04p~D(^tO4m@a{}A7~x6yli3-eB})ECT{Fa z2|c-pD62J%%A1B=!{qXWJsO2yhly#l%3AQB3r4ix3=XeRYdghtHn8uUf6iG2Cs8$) zd%7Z)3SUbZFE}60NrisWC1@GUoH-p%tH>efGDq7oz}GDoo;M$k%7ptUnM@{(OJOpZ5YZ!M))+-HnJ}C5h$p%l z7LjyHsBJYQlfslV+ZxzFdS1!n+SH@UZ4{-{mId!oaG|n~tCqA(@vyaUjFhT)xlWSS zE7i7j&`By${9Jt~S$#GP_u>gyeKzQVLY+)hpAAZoiStGE&9?Q>_md2Y>T_W9ypXIu z2PUMj`W%>b0b^Kw4p>P$mGt-xu$ZJOIb10u@k|>bk0hRHBW&T~=hqm0N`8DU9H8JK z#mnU*wJH_yZ$S&`Gvx!WHj=oRJm@8fo5_O#l&n4p=9;>VELKHRII)+ zz5v?##netFsxO4s#gP)Um9|6JSP5Xs69 z+y)<$bS@9`zz?J_mzS%Xq*`2Qw(W3>=yc_A{ehC#Rt8CzC$FsxvQYBY%Af)zZmlhT z2XtSVyfrV}y^8Db3B52O#TL1Wm>0UQ$vt0Hkz>T=DC4g(n2p+gLuxO|cT=hcb#zdw z88uEiA!pu_u~Vq}-=uovOwyoB71=DfgF(u4u@rlNQ&*8DP+yQD62v;oklge|R2HcK zb(G{ojY!c6e^ZQ~pz>{WcjY$Ue)BtHQs`hs| zGX?cfiYGHu^Cqui1cSz}LJmjmgaxQ7<4wzrnLFV%icN$(h%Se96uWPEJ*FHAC{}N* z*6xCL0wE4K5(Bw`kCLHUYbbWiWkJ*SzzZobZF=+ydzwApUSU6CZ?y;Pr|n(#e*10v zi2XrRW(F)&$L);mX8 hsS(8!>w^Jw!y9EZ7KE_%r^19*B!~*3T&&e{Sez`Y)`n& zJo@RBemjnQ<%f<~6~blFw+65hY#Uh#D5|2LIMjNnFN*gnQq zrln03DTXGBBcl>U8L^3JymcmKJ2cG2wEU}00&fEcGvTBL>YC#$;jkppZwVaFg7lR$uEff`)hY*L%`S!v9q-Ni$@^gbBK8^#Awh)D1ntff)~Op^p#9(Fn6%&d Y9WWLMI}4Arn&kO`@NT#d4f72D0_8JQo&W#< delta 2590 zcmZwJ4NR0}902g=e|Ov+r$astInccDc<1EM`T4T=9WX;05r4|N+d>EpsGfh4G3e6J3m6Exh=l?v4quz~&_xJptkN^L9 zV0*XK8Mf6Kb~Qs#?WfsrL%CPh6E751<2W>gz#QMQd*-m$$O_w z#zBObA3fIM3Ih=Rwgf_Sv8`3jLl%RUJfx%6t06}$YJYohw0Cm|*v}1Sg^Vrd({?wbtI_CDJ=CBcq=`x$g?SbcF(t84FhSp+v0nJ%& zHF->wqSJ((k51BTHRF^C20q2Cj`T@DS|g6#Sgh>mqC1dUa>()f^b}}DRat)16_Hdp zz-2t{xIaA=`i0Io0&S^qR>(ZDoTR}YLKhq!st2ep5)x2O(qSvTY(lEYbqCXjs4j9e zVp2pp99EFm;b=spEd#2%+0ZW1AJJgWgkMoSnM}CLg~?<>P!BF@WXWWLMQD^Jx(H?p z>EuA$BA6!>B&XRH!&0Fsaz2&2N8!uJa;a?zY!Sg(@@A?XLJQ<_k_8_NrOF(3VG%9m|U1Gq{ul`NkZ(JmP4)(yQbw(OhxyvGS!%5IdQC=n`TllMe$ZUVQOs=2WGLTD0VcV7rCLaf3f=n`TT7Qq0DC$kbVPT`uE%t}~` zQg}8iVHc8JMN>>MRXqd)UgI8#j##X~tp)mT-wFW*AdYW#y z20jteIm<~o925$2dZ;>u6pJ&>wiYf5I-L1bLnwZ1>mcFm*s-mH3=}`Lb+8e|PHlh8 zdgweic4{8Davta56?)(v7n$uWA|B}cnXj3sAcqB$QM!vfn2jpC#Pud>qo1n^RXxbn zi1G{V<0CKgSQ~27RjwXBQfSbruxz5PVNhf`or{d%&;+3es79gCST>Jb=ZijvnkVE& zRSVUiPI8GI&WRY^L7~gs68r{-x_{w|4xpNaE}+_k?xBW+LR>7F_#r+o8ns_&F3Np_ z#}=a6xM(urnpZvG=QMs5&|vn$D5}!vw_FPMg6<|xG(HFziL8KWs7m8)%S%xeAdA>8 z<96*vSm2v)hmWEl*LOY%wrdTA_8Fwlw8mGm5GG8FOqNol71A40gS1!rQuHRzvfDQJoLYd@+5BJLU*zK z2V0(&Hjbqj7{|6W$FVZ3aVfNQ#AVqv#7VUDBPf=(zQdW&qH*rDD{<_&b*vH3PWx&4 zi7~FPzIF+O&41tC7dAfBV6Xe1B`PA=I1SO$rGw_M_dUMBC6NAdaCbu1{R5$QUfUD* z*20cw)KOnjBUmSEiwW@+eF0IEw0eWaSNR=yz`~~SXGna}F+KFxKWv96&9J{dssrxU ZyE`D>7t{%(T21h?zL0LX4Yl!xe*roYX{i7J diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb index 34cdb18300fdedde7306847c1f11a5ff68289b8e..25bc7b803d9bea8c3673a505c362c1c36ebbff70 100644 GIT binary patch delta 5514 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 WXw(Yci?2gI@G1NR5+h~u_x}f#^*bd1 From 29b4098a8d24fa64a18437bfe314da88ee661391 Mon Sep 17 00:00:00 2001 From: Ian Chan Date: Sat, 19 Dec 2015 23:03:59 +1300 Subject: [PATCH 32/82] Spring-MVC config "j8-async": Uses async servlet & Java 8 interface default This template is mainly for Maven code-gen plugin use-case - when Swagger spec on existing project changes there is no need to manually copy/paste the new functions from the generated client. This will provide a default (empty) implementation to existing impl and user just need to override the stub implementation. Because it generates an interface instead of a concrete stub, an implementation will be needed to actuate a service end-point. And don't forget to put @Controller on the implementation! --- .../languages/SpringMVCServerCodegen.java | 14 +++- .../JavaSpringMVC/api-j8-async.mustache | 64 +++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100755 modules/swagger-codegen/src/main/resources/JavaSpringMVC/api-j8-async.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java index 446185bcd47e..23ffe6c0fc4b 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java @@ -18,12 +18,13 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen public static final String CONFIG_PACKAGE = "configPackage"; protected String title = "Petstore Server"; protected String configPackage = ""; + protected String templateFileName = "api.mustache"; public SpringMVCServerCodegen() { super(); outputFolder = "generated-code/javaSpringMVC"; modelTemplateFiles.put("model.mustache", ".java"); - apiTemplateFiles.put("api.mustache", ".java"); + apiTemplateFiles.put(templateFileName, ".java"); embeddedTemplateDir = templateDir = "JavaSpringMVC"; apiPackage = "io.swagger.api"; modelPackage = "io.swagger.model"; @@ -51,6 +52,11 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen ); cliOptions.add(new CliOption(CONFIG_PACKAGE, "configuration package for generated code")); + + supportedLibraries.clear(); + supportedLibraries.put(DEFAULT_LIBRARY, "Default Spring MVC server stub."); + supportedLibraries.put("j8-async", "Use async servlet feature and Java 8's default interface. Generating interface with service " + + "declaration is useful when using Maven plugin. Just provide a implementation with @Controller to instantiate service."); } public CodegenType getTag() { @@ -168,6 +174,12 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen } } } + if("j8-async".equals(getLibrary())) { + apiTemplateFiles.remove(this.templateFileName); + this.templateFileName = "api-j8-async.mustache"; + apiTemplateFiles.put(this.templateFileName, ".java"); + } + return objs; } diff --git a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/api-j8-async.mustache b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/api-j8-async.mustache new file mode 100755 index 000000000000..b11e5c2db202 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/api-j8-async.mustache @@ -0,0 +1,64 @@ +package {{apiPackage}}; + +import {{modelPackage}}.*; + +{{#imports}}import {{import}}; +{{/imports}} + +import java.util.concurrent.Callable; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.Authorization; +import io.swagger.annotations.AuthorizationScope; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +import static org.springframework.http.MediaType.*; + +@Controller +@RequestMapping(value = "/{{baseName}}", produces = {APPLICATION_JSON_VALUE}) +@Api(value = "/{{baseName}}", description = "the {{baseName}} API") +{{>generatedAnnotation}} +{{#operations}} +public interface {{classname}} { + {{#operation}} + + @ApiOperation(value = "{{{summary}}}", notes = "{{{notes}}}", response = {{{returnType}}}.class{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}{{#hasAuthMethods}}, authorizations = { + {{#authMethods}}@Authorization(value = "{{name}}"{{#isOAuth}}, scopes = { + {{#scopes}}@AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{#hasMore}}, + {{/hasMore}}{{/scopes}} + }{{/isOAuth}}){{#hasMore}}, + {{/hasMore}}{{/authMethods}} + }{{/hasAuthMethods}}) + @ApiResponses(value = { {{#responses}} + @ApiResponse(code = {{{code}}}, message = "{{{message}}}"){{#hasMore}},{{/hasMore}}{{/responses}} }) + @RequestMapping(value = "{{path}}", + {{#hasProduces}}produces = { {{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }, {{/hasProduces}} + {{#hasConsumes}}consumes = { {{#consumes}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} },{{/hasConsumes}} + method = RequestMethod.{{httpMethod}}) + default CallablereturnTypes}}>> {{operationId}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, + {{/hasMore}}{{/allParams}}) + throws NotFoundException { + // do some magic! + return () -> new ResponseEntity<{{>returnTypes}}>(HttpStatus.OK); + } + + {{/operation}} +} +{{/operations}} From aa55c95d1b0be23c1f9d521d66e7ffe33119aa4e Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 21 Dec 2015 14:12:19 +0800 Subject: [PATCH 33/82] fix default needToImport --- .../io/swagger/codegen/DefaultCodegen.java | 3 +- .../java/io/swagger/client/ApiClient.java | 4 +- .../java/io/swagger/client/ApiException.java | 2 +- .../java/io/swagger/client/Configuration.java | 2 +- .../src/main/java/io/swagger/client/Pair.java | 2 +- .../java/io/swagger/client/StringUtil.java | 2 +- .../java/io/swagger/client/api/PetApi.java | 42 ++++++++++++++++++- .../java/io/swagger/client/api/StoreApi.java | 2 +- .../java/io/swagger/client/api/UserApi.java | 2 +- .../io/swagger/client/auth/ApiKeyAuth.java | 2 +- .../swagger/client/auth/Authentication.java | 2 +- .../io/swagger/client/auth/HttpBasicAuth.java | 2 +- .../java/io/swagger/client/auth/OAuth.java | 2 +- .../io/swagger/client/model/Category.java | 3 +- .../java/io/swagger/client/model/Order.java | 3 +- .../java/io/swagger/client/model/Pet.java | 3 +- .../java/io/swagger/client/model/Tag.java | 3 +- .../java/io/swagger/client/model/User.java | 3 +- 18 files changed, 64 insertions(+), 20 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 11472fec4ff6..8d84f065284c 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1714,8 +1714,7 @@ public class DefaultCodegen { */ protected boolean needToImport(String type) { return !defaultIncludes.contains(type) - && !languageSpecificPrimitives.contains(type) - && type.indexOf(".") < 0; + && !languageSpecificPrimitives.contains(type); } protected List> toExamples(Map examples) { diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java index f34125eaa44a..8b3bbb24c9a9 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java @@ -41,7 +41,7 @@ import io.swagger.client.auth.HttpBasicAuth; import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class ApiClient { private Map hostMap = new HashMap(); private Map defaultHeaderMap = new HashMap(); @@ -79,8 +79,8 @@ public class ApiClient { // Setup authentications (key: authentication name, value: authentication). authentications = new HashMap(); - authentications.put("petstore_auth", new OAuth()); authentications.put("api_key", new ApiKeyAuth("header", "api_key")); + authentications.put("petstore_auth", new OAuth()); // Prevent the authentications from being modified. authentications = Collections.unmodifiableMap(authentications); } diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java index ceee6a36c454..0cebcddd1f7c 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class ApiException extends Exception { private int code = 0; private Map> responseHeaders = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java index f39081c3f5dd..fa70b81a40ef 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Configuration { private static ApiClient defaultApiClient = new ApiClient(); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java index 32d1b6cd6f4e..f5b33e8fbba9 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Pair { private String name = ""; private String value = ""; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java index f21a48f2faa2..4ba4ee3a2f3c 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java index 9f07449e6f89..22af7b53b185 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java @@ -12,7 +12,7 @@ import java.io.File; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class PetApi { private ApiClient apiClient; @@ -347,6 +347,46 @@ public class PetApi { } + /** + * downloads an image + * + * @return File + */ + public File downloadFile() throws ApiException { + Object postBody = null; + + // create path and map variables + String path = "/pet/{petId}/downloadImage".replaceAll("\\{format\\}","json"); + + // query params + List queryParams = new ArrayList(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + + + + + final String[] accepts = { + "application/octet-stream" + }; + final String accept = apiClient.selectHeaderAccept(accepts); + + final String[] contentTypes = { + + }; + final String contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + + GenericType returnType = new GenericType() {}; + return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); + + } + /** * uploads an image * diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java index f6f3b84708e7..4e425248d353 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java @@ -12,7 +12,7 @@ import io.swagger.client.model.Order; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class StoreApi { private ApiClient apiClient; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java index 41b273b20b86..33028c95721d 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java @@ -12,7 +12,7 @@ import java.util.*; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class UserApi { private ApiClient apiClient; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index 3cccbb7af1a5..c9dcd028be88 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java index bf8dd7529827..90aa4df66b97 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public interface Authentication { /** Apply authentication settings to header and query params. */ void applyToParams(List queryParams, Map headerParams); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 1a9280b8d7d1..7db3c8e9d5cf 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -9,7 +9,7 @@ import java.util.List; import java.io.UnsupportedEncodingException; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java index a6e36a025a09..940b7267334d 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class OAuth implements Authentication { private String accessToken; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java index a57e6646dba7..abcb97e84eef 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Category { private Long id = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java index 61f1d56309c6..b488fab6c3fd 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java @@ -10,8 +10,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Order { private Long id = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java index f57e68a48d1d..5a979dcb73e7 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java @@ -12,8 +12,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Pet { private Long id = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java index a09cda034ebd..41cfb3d80d6a 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Tag { private Long id = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java index ca5ece25bf9e..61960c622f68 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class User { private Long id = null; From b46e3ad400b1447c7c5697b517e581ad34f5bbf4 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Mon, 21 Dec 2015 22:16:11 -0800 Subject: [PATCH 34/82] updated for #1749 --- .../io/swagger/codegen/plugin/AdditionalParams.java | 6 +++--- .../java/io/swagger/codegen/plugin/CodeGenMojo.java | 10 +++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/AdditionalParams.java b/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/AdditionalParams.java index f3678e783e09..7db012f439cd 100644 --- a/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/AdditionalParams.java +++ b/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/AdditionalParams.java @@ -10,7 +10,7 @@ public final class AdditionalParams { public static final String MODEL_PACKAGE_PARAM = "modelPackage"; public static final String API_PACKAGE_PARAM = "apiPackage"; public static final String INVOKER_PACKAGE_PARAM = "invokerPackage"; + public static final String LIBRARY_PARAM = "library"; - private AdditionalParams() { - } -} + private AdditionalParams() {} +} \ No newline at end of file diff --git a/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/CodeGenMojo.java b/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/CodeGenMojo.java index 22726c84c046..50c9ce48f382 100644 --- a/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/CodeGenMojo.java +++ b/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/CodeGenMojo.java @@ -100,6 +100,12 @@ public class CodeGenMojo extends AbstractMojo { @Parameter(name = "configurationFile", required = false) private String configurationFile; + /** + * Sets the library + */ + @Parameter(name = "library", required = false) + private String library; + /** * A map of language-specific parameters as passed with the -c option to the command line */ @@ -139,7 +145,9 @@ public class CodeGenMojo extends AbstractMojo { System.setProperty(key, value); } } - + if (null != library) { + config.setLibrary(library); + } if (null != templateDirectory) { config.additionalProperties().put(TEMPLATE_DIR_PARAM, templateDirectory.getAbsolutePath()); } From 638ee8883048b6348ec23fbaf3035b36c42e6a9d Mon Sep 17 00:00:00 2001 From: Ian Chan Date: Wed, 23 Dec 2015 10:29:47 +1300 Subject: [PATCH 35/82] Removed Jersey2 test from spring-mvc codegen The previous patch to allow sub options to spring-mvc had removed the invalid Jersey2 option from spring-mvc codegen, this patch also fixes the associated test. --- .../codegen/options/SpringMVCServerOptionsProvider.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SpringMVCServerOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SpringMVCServerOptionsProvider.java index 13a3600918d0..e52373c3c081 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SpringMVCServerOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SpringMVCServerOptionsProvider.java @@ -1,5 +1,6 @@ package io.swagger.codegen.options; +import io.swagger.codegen.CodegenConstants; import io.swagger.codegen.languages.SpringMVCServerCodegen; import java.util.HashMap; @@ -7,6 +8,7 @@ import java.util.Map; public class SpringMVCServerOptionsProvider extends JavaOptionsProvider { public static final String CONFIG_PACKAGE_VALUE = "configPackage"; + public static final String LIBRARY_VALUE = "j8-async"; @Override public String getLanguage() { @@ -17,6 +19,7 @@ public class SpringMVCServerOptionsProvider extends JavaOptionsProvider { public Map createOptions() { Map options = new HashMap(super.createOptions()); options.put(SpringMVCServerCodegen.CONFIG_PACKAGE, CONFIG_PACKAGE_VALUE); + options.put(CodegenConstants.LIBRARY, LIBRARY_VALUE); return options; } From a58901f375022eae80c73c61efa7bc0ba9e2670a Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 23 Dec 2015 18:58:16 +0800 Subject: [PATCH 36/82] Java okhttp-gson client: get/set connect timeout --- .../libraries/okhttp-gson/ApiClient.mustache | 18 ++++++++++++++++++ .../main/java/io/swagger/client/ApiClient.java | 18 ++++++++++++++++++ .../java/io/swagger/client/ApiClientTest.java | 12 ++++++++++++ 3 files changed, 48 insertions(+) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache index 99dcdb517805..664e0e45a58f 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache @@ -23,6 +23,7 @@ import java.util.List; import java.util.ArrayList; import java.util.Date; import java.util.TimeZone; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -471,6 +472,23 @@ public class ApiClient { return this; } + /** + * Connect timeout (in milliseconds). + */ + public int getConnectTimeout() { + return httpClient.getConnectTimeout(); + } + + /** + * Sets the connect timeout. + * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. + */ + public ApiClient setConnectTimeout(int connectionTimeout) { + httpClient.setConnectTimeout(connectionTimeout, TimeUnit.MILLISECONDS); + return this; + } + /** * Format the given parameter object into string. */ diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java index 19cb83d620cb..0314969b99e8 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.ArrayList; import java.util.Date; import java.util.TimeZone; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -470,6 +471,23 @@ public class ApiClient { return this; } + /** + * Connect timeout (in milliseconds). + */ + public int getConnectTimeout() { + return httpClient.getConnectTimeout(); + } + + /** + * Sets the connect timeout. + * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. + */ + public ApiClient setConnectTimeout(int connectionTimeout) { + httpClient.setConnectTimeout(connectionTimeout, TimeUnit.MILLISECONDS); + return this; + } + /** * Format the given parameter object into string. */ diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/ApiClientTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/ApiClientTest.java index 9b5c68057448..ba143470c9ad 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/ApiClientTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/ApiClientTest.java @@ -184,6 +184,18 @@ public class ApiClientTest { auth.setApiKeyPrefix(null); } + @Test + public void testGetAndSetConnectTimeout() { + assertEquals(0, apiClient.getConnectTimeout()); + assertEquals(0, apiClient.getHttpClient().getConnectTimeout()); + + apiClient.setConnectTimeout(10000); + assertEquals(10000, apiClient.getConnectTimeout()); + assertEquals(10000, apiClient.getHttpClient().getConnectTimeout()); + + apiClient.setConnectTimeout(0); + } + @Test public void testParameterToPairsWhenNameIsInvalid() throws Exception { List pairs_a = apiClient.parameterToPairs("csv", null, new Integer(1)); From 7381b816ff6e48aed71a169d3c8f8a6b70a18408 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 23 Dec 2015 05:50:46 -0800 Subject: [PATCH 37/82] fixes #1756 --- .../io/swagger/codegen/DefaultCodegen.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 8d84f065284c..dd8d9aefa902 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -25,23 +25,8 @@ import io.swagger.models.parameters.Parameter; import io.swagger.models.parameters.PathParameter; import io.swagger.models.parameters.QueryParameter; import io.swagger.models.parameters.SerializableParameter; -import io.swagger.models.properties.AbstractNumericProperty; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.BooleanProperty; -import io.swagger.models.properties.ByteArrayProperty; -import io.swagger.models.properties.DateProperty; -import io.swagger.models.properties.DateTimeProperty; -import io.swagger.models.properties.DecimalProperty; -import io.swagger.models.properties.DoubleProperty; -import io.swagger.models.properties.FloatProperty; -import io.swagger.models.properties.IntegerProperty; -import io.swagger.models.properties.LongProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.Property; -import io.swagger.models.properties.PropertyBuilder; +import io.swagger.models.properties.*; import io.swagger.models.properties.PropertyBuilder.PropertyId; -import io.swagger.models.properties.RefProperty; -import io.swagger.models.properties.StringProperty; import io.swagger.util.Json; import org.apache.commons.lang.StringUtils; @@ -423,6 +408,7 @@ public class DefaultCodegen { typeMapping.put("object", "Object"); typeMapping.put("integer", "Integer"); typeMapping.put("ByteArray", "byte[]"); + typeMapping.put("binary", "byte[]"); instantiationTypes = new HashMap(); @@ -636,6 +622,8 @@ public class DefaultCodegen { datatype = "string"; } else if (p instanceof ByteArrayProperty) { datatype = "ByteArray"; + } else if (p instanceof BinaryProperty) { + datatype = "binary"; } else if (p instanceof BooleanProperty) { datatype = "boolean"; } else if (p instanceof DateProperty) { From f2a510912bd3d0cc36a9e0cd37e54321cf42b523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=C5=ADlo=20Ebermann?= Date: Wed, 23 Dec 2015 19:12:03 +0100 Subject: [PATCH 38/82] Fix #1743 by removing `*/` from the .settings ignore line. `*/.settings` applies to just the directory below the current one, where there is no such file. `.settings` applies to all files/directories named such in the whole project. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index db34c76636c6..02ecb7220cdf 100644 --- a/.gitignore +++ b/.gitignore @@ -58,7 +58,7 @@ samples/client/petstore/silex/SwaggerServer/venodr/ samples/client/petstore/python/.projectile samples/client/petstore/python/.venv/ -*/.settings +.settings *.mustache~ *.java~ From 9181b6b0a7b6098a14f127ebede543c140444138 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 24 Dec 2015 14:13:18 +0800 Subject: [PATCH 39/82] update pom to use latest core and parser --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index cd1dd28b9d9b..64f3b7eb5ce3 100644 --- a/pom.xml +++ b/pom.xml @@ -568,10 +568,10 @@ - 1.0.14-SNAPSHOT + 1.0.15-SNAPSHOT 2.11.1 2.3.4 - 1.5.5-SNAPSHOT + 1.5.5 2.1.5-SNAPSHOT 2.3 1.2 From 43c0d20743acc210e283d8bad030588c4bcafee4 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 24 Dec 2015 11:26:15 +0800 Subject: [PATCH 40/82] Ruby client: add "timeout" to configuration --- .../main/resources/ruby/api_client.mustache | 1 + .../resources/ruby/configuration.mustache | 5 ++++ .../petstore/ruby/lib/petstore/api_client.rb | 1 + .../ruby/lib/petstore/configuration.rb | 5 ++++ .../petstore/ruby/spec/api_client_spec.rb | 23 +++++++++++++++++-- 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache index 837b1234fd0b..54854efe332f 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache @@ -71,6 +71,7 @@ module {{moduleName}} :method => http_method, :headers => header_params, :params => query_params, + :timeout => @config.timeout, :ssl_verifypeer => @config.verify_ssl, :sslcert => @config.cert_file, :sslkey => @config.key_file, diff --git a/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache b/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache index 4c05f2560fa1..160fa85a57d1 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache @@ -60,6 +60,10 @@ module {{moduleName}} # @return [String] attr_accessor :temp_folder_path + # The time limit for HTTP request in seconds. + # Default to 0 (never times out). + attr_accessor :timeout + ### TLS/SSL # Set this to false to skip verifying SSL certificate when calling API from https server. # Default to true. @@ -93,6 +97,7 @@ module {{moduleName}} @base_path = '{{contextPath}}' @api_key = {} @api_key_prefix = {} + @timeout = 0 @verify_ssl = true @cert_file = nil @key_file = nil diff --git a/samples/client/petstore/ruby/lib/petstore/api_client.rb b/samples/client/petstore/ruby/lib/petstore/api_client.rb index 52a3eb43855c..53be21db3b0f 100644 --- a/samples/client/petstore/ruby/lib/petstore/api_client.rb +++ b/samples/client/petstore/ruby/lib/petstore/api_client.rb @@ -71,6 +71,7 @@ module Petstore :method => http_method, :headers => header_params, :params => query_params, + :timeout => @config.timeout, :ssl_verifypeer => @config.verify_ssl, :sslcert => @config.cert_file, :sslkey => @config.key_file, diff --git a/samples/client/petstore/ruby/lib/petstore/configuration.rb b/samples/client/petstore/ruby/lib/petstore/configuration.rb index 7173a4450c64..0a67bae014fc 100644 --- a/samples/client/petstore/ruby/lib/petstore/configuration.rb +++ b/samples/client/petstore/ruby/lib/petstore/configuration.rb @@ -60,6 +60,10 @@ module Petstore # @return [String] attr_accessor :temp_folder_path + # The time limit for HTTP request in seconds. + # Default to 0 (never times out). + attr_accessor :timeout + ### TLS/SSL # Set this to false to skip verifying SSL certificate when calling API from https server. # Default to true. @@ -93,6 +97,7 @@ module Petstore @base_path = '/v2' @api_key = {} @api_key_prefix = {} + @timeout = 0 @verify_ssl = true @cert_file = nil @key_file = nil diff --git a/samples/client/petstore/ruby/spec/api_client_spec.rb b/samples/client/petstore/ruby/spec/api_client_spec.rb index c2bfef4e8e4e..aeb4eefad512 100644 --- a/samples/client/petstore/ruby/spec/api_client_spec.rb +++ b/samples/client/petstore/ruby/spec/api_client_spec.rb @@ -59,7 +59,7 @@ describe Petstore::ApiClient do c.api_key['api_key'] = 'special-key2' end api_client2 = Petstore::ApiClient.new(config2) - + auth_names = ['api_key', 'unknown'] header_params = {} @@ -82,7 +82,7 @@ describe Petstore::ApiClient do end api_client = Petstore::ApiClient.new - + header_params = {} query_params = {} auth_names = ['api_key', 'unknown'] @@ -92,6 +92,25 @@ describe Petstore::ApiClient do end end + describe "timeout in #build_request" do + let(:config) { Petstore::Configuration.new } + let(:api_client) { Petstore::ApiClient.new(config) } + + it "defaults to 0" do + Petstore::Configuration.default.timeout.should == 0 + config.timeout.should == 0 + + request = api_client.build_request(:get, '/test') + request.options[:timeout].should == 0 + end + + it "can be customized" do + config.timeout = 100 + request = api_client.build_request(:get, '/test') + request.options[:timeout].should == 100 + end + end + describe "#deserialize" do it "handles Hash" do api_client = Petstore::ApiClient.new From 8fa14446e3c898ca72141cee2579c5087c17ad84 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 24 Dec 2015 17:56:19 +0800 Subject: [PATCH 41/82] Add milliseconds hint to comment of getConnectTimeout --- .../resources/Java/libraries/okhttp-gson/ApiClient.mustache | 2 +- .../okhttp-gson/src/main/java/io/swagger/client/ApiClient.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache index 664e0e45a58f..8c0880bf2171 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache @@ -480,7 +480,7 @@ public class ApiClient { } /** - * Sets the connect timeout. + * Sets the connect timeout (in milliseconds). * A value of 0 means no timeout, otherwise values must be between 1 and * {@link Integer#MAX_VALUE}. */ diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java index 0314969b99e8..10be2206a424 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java @@ -479,7 +479,7 @@ public class ApiClient { } /** - * Sets the connect timeout. + * Sets the connect timeout (in milliseconds). * A value of 0 means no timeout, otherwise values must be between 1 and * {@link Integer#MAX_VALUE}. */ From 916793b820e80849bf91aab54345ec1229b42759 Mon Sep 17 00:00:00 2001 From: Ian Chan Date: Fri, 25 Dec 2015 16:33:04 +1300 Subject: [PATCH 42/82] Added spring-mvc-petstore-j8-aysnc-server.sh executable. Added the executable and config file for spring-mvc's j8-async target. --- bin/all-petstore.sh | 1 + bin/spring-mvc-petstore-j8-async-server.sh | 31 ++++++++++++++++++++++ bin/spring-mvc-petstore-j8-async.json | 3 +++ 3 files changed, 35 insertions(+) create mode 100755 bin/spring-mvc-petstore-j8-async-server.sh create mode 100644 bin/spring-mvc-petstore-j8-async.json diff --git a/bin/all-petstore.sh b/bin/all-petstore.sh index f6156dbcee99..7db8c7ec9161 100755 --- a/bin/all-petstore.sh +++ b/bin/all-petstore.sh @@ -43,6 +43,7 @@ cd $APP_DIR ./bin/silex-petstore-server.sh ./bin/slim-petstore-server.sh ./bin/spring-mvc-petstore-server.sh +./bin/spring-mvc-petstore-j8-async-server.sh ./bin/swift-petstore.sh ./bin/tizen-petstore.sh ./bin/typescript-angular-petstore.sh diff --git a/bin/spring-mvc-petstore-j8-async-server.sh b/bin/spring-mvc-petstore-j8-async-server.sh new file mode 100755 index 000000000000..435c29ac0703 --- /dev/null +++ b/bin/spring-mvc-petstore-j8-async-server.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +SCRIPT="$0" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" + +if [ ! -f "$executable" ] +then + mvn clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="$@ generate -t modules/swagger-codegen/src/main/resources/JavaSpringMVC -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l spring-mvc -o samples/server/petstore/spring-mvc -c bin/spring-mvc-petstore-j8-async.json" + +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/spring-mvc-petstore-j8-async.json b/bin/spring-mvc-petstore-j8-async.json new file mode 100644 index 000000000000..c19430ec9ab1 --- /dev/null +++ b/bin/spring-mvc-petstore-j8-async.json @@ -0,0 +1,3 @@ +{ + "library": "j8-async" +} From 6124062a70065d872148f56629955aa946336914 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 26 Dec 2015 16:12:56 +0800 Subject: [PATCH 43/82] update promisekit and alamofire to the latest version --- .../main/resources/swift/Extensions.mustache | 4 +- .../src/main/resources/swift/Podspec.mustache | 4 +- .../petstore/swift/PetstoreClient.podspec | 4 +- .../Classes/Swaggers/APIs/PetAPI.swift | 166 ++++++++++-------- .../Classes/Swaggers/APIs/StoreAPI.swift | 72 ++++---- .../Classes/Swaggers/APIs/UserAPI.swift | 8 +- .../Classes/Swaggers/Extensions.swift | 4 +- 7 files changed, 142 insertions(+), 120 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/swift/Extensions.mustache b/modules/swagger-codegen/src/main/resources/swift/Extensions.mustache index 0d367cb8be34..ed5786d3faa8 100644 --- a/modules/swagger-codegen/src/main/resources/swift/Extensions.mustache +++ b/modules/swagger-codegen/src/main/resources/swift/Extensions.mustache @@ -66,8 +66,8 @@ extension NSDate: JSONEncodable { {{#usePromiseKit}}extension RequestBuilder { public func execute() -> Promise> { - let deferred = Promise>.defer() - self.execute { (response: Response?, error: NSError?) in + let deferred = Promise>.pendingPromise() + self.execute { (response: Response?, error: ErrorType?) in if let response = response { deferred.fulfill(response) } else { diff --git a/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache b/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache index d156ef144176..85b227ece87c 100644 --- a/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache +++ b/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache @@ -15,6 +15,6 @@ Pod::Spec.new do |s| s.screenshots = {{& podScreenshots}}{{/podScreenshots}}{{#podDocumentationURL}} s.documentation_url = '{{podDocumentationURL}}'{{/podDocumentationURL}} s.source_files = '{{projectName}}/Classes/Swaggers/**/*.swift'{{#usePromiseKit}} - s.dependency 'PromiseKit', '~> 2.1'{{/usePromiseKit}} - s.dependency 'Alamofire', '~> 3.1.0' + s.dependency 'PromiseKit', '~> 3.0.0'{{/usePromiseKit}} + s.dependency 'Alamofire', '~> 3.1.4' end diff --git a/samples/client/petstore/swift/PetstoreClient.podspec b/samples/client/petstore/swift/PetstoreClient.podspec index ed41db4bfb13..1c95cf1afe58 100644 --- a/samples/client/petstore/swift/PetstoreClient.podspec +++ b/samples/client/petstore/swift/PetstoreClient.podspec @@ -6,6 +6,6 @@ Pod::Spec.new do |s| s.source = { :git => 'git@github.com:swagger-api/swagger-mustache.git', :tag => 'v1.0.0' } s.license = 'Apache License, Version 2.0' s.source_files = 'PetstoreClient/Classes/Swaggers/**/*.swift' - s.dependency 'PromiseKit', '~> 2.1' - s.dependency 'Alamofire', '~> 3.1.0' + s.dependency 'PromiseKit', '~> 3.0.0' + s.dependency 'Alamofire', '~> 3.1.4' end diff --git a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift index ea6c50e2549c..57e586dc0290 100644 --- a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift +++ b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift @@ -71,20 +71,20 @@ extension PetstoreClientAPI { - OAuth: - type: oauth2 - name: petstore_auth - - examples: [{contentType=application/json, example=[ { - "photoUrls" : [ "aeiou" ], - "name" : "doggie", + - examples: [{example=[ { + "tags" : [ { + "id" : 123456789, + "name" : "aeiou" + } ], "id" : 123456789, "category" : { - "name" : "aeiou", - "id" : 123456789 + "id" : 123456789, + "name" : "aeiou" }, - "tags" : [ { - "name" : "aeiou", - "id" : 123456789 - } ], - "status" : "aeiou" -} ]}, {contentType=application/xml, example= + "status" : "aeiou", + "name" : "doggie", + "photoUrls" : [ "aeiou" ] +} ], contentType=application/json}, {example= 123456 doggie @@ -93,21 +93,21 @@ extension PetstoreClientAPI { string -}] - - examples: [{contentType=application/json, example=[ { - "photoUrls" : [ "aeiou" ], - "name" : "doggie", +, contentType=application/xml}] + - examples: [{example=[ { + "tags" : [ { + "id" : 123456789, + "name" : "aeiou" + } ], "id" : 123456789, "category" : { - "name" : "aeiou", - "id" : 123456789 + "id" : 123456789, + "name" : "aeiou" }, - "tags" : [ { - "name" : "aeiou", - "id" : 123456789 - } ], - "status" : "aeiou" -} ]}, {contentType=application/xml, example= + "status" : "aeiou", + "name" : "doggie", + "photoUrls" : [ "aeiou" ] +} ], contentType=application/json}, {example= 123456 doggie @@ -116,7 +116,7 @@ extension PetstoreClientAPI { string -}] +, contentType=application/xml}] - parameter status: (query) Status values that need to be considered for filter @@ -145,20 +145,20 @@ extension PetstoreClientAPI { - OAuth: - type: oauth2 - name: petstore_auth - - examples: [{contentType=application/json, example=[ { - "photoUrls" : [ "aeiou" ], - "name" : "doggie", + - examples: [{example=[ { + "tags" : [ { + "id" : 123456789, + "name" : "aeiou" + } ], "id" : 123456789, "category" : { - "name" : "aeiou", - "id" : 123456789 + "id" : 123456789, + "name" : "aeiou" }, - "tags" : [ { - "name" : "aeiou", - "id" : 123456789 - } ], - "status" : "aeiou" -} ]}, {contentType=application/xml, example= + "status" : "aeiou", + "name" : "doggie", + "photoUrls" : [ "aeiou" ] +} ], contentType=application/json}, {example= 123456 doggie @@ -167,21 +167,21 @@ extension PetstoreClientAPI { string -}] - - examples: [{contentType=application/json, example=[ { - "photoUrls" : [ "aeiou" ], - "name" : "doggie", +, contentType=application/xml}] + - examples: [{example=[ { + "tags" : [ { + "id" : 123456789, + "name" : "aeiou" + } ], "id" : 123456789, "category" : { - "name" : "aeiou", - "id" : 123456789 + "id" : 123456789, + "name" : "aeiou" }, - "tags" : [ { - "name" : "aeiou", - "id" : 123456789 - } ], - "status" : "aeiou" -} ]}, {contentType=application/xml, example= + "status" : "aeiou", + "name" : "doggie", + "photoUrls" : [ "aeiou" ] +} ], contentType=application/json}, {example= 123456 doggie @@ -190,7 +190,7 @@ extension PetstoreClientAPI { string -}] +, contentType=application/xml}] - parameter tags: (query) Tags to filter by @@ -219,20 +219,20 @@ extension PetstoreClientAPI { - API Key: - type: apiKey api_key - name: api_key - - examples: [{contentType=application/json, example={ - "photoUrls" : [ "aeiou" ], - "name" : "doggie", + - examples: [{example={ + "tags" : [ { + "id" : 123456789, + "name" : "aeiou" + } ], "id" : 123456789, "category" : { - "name" : "aeiou", - "id" : 123456789 + "id" : 123456789, + "name" : "aeiou" }, - "tags" : [ { - "name" : "aeiou", - "id" : 123456789 - } ], - "status" : "aeiou" -}}, {contentType=application/xml, example= + "status" : "aeiou", + "name" : "doggie", + "photoUrls" : [ "aeiou" ] +}, contentType=application/json}, {example= 123456 doggie @@ -241,21 +241,21 @@ extension PetstoreClientAPI { string -}] - - examples: [{contentType=application/json, example={ - "photoUrls" : [ "aeiou" ], - "name" : "doggie", +, contentType=application/xml}] + - examples: [{example={ + "tags" : [ { + "id" : 123456789, + "name" : "aeiou" + } ], "id" : 123456789, "category" : { - "name" : "aeiou", - "id" : 123456789 + "id" : 123456789, + "name" : "aeiou" }, - "tags" : [ { - "name" : "aeiou", - "id" : 123456789 - } ], - "status" : "aeiou" -}}, {contentType=application/xml, example= + "status" : "aeiou", + "name" : "doggie", + "photoUrls" : [ "aeiou" ] +}, contentType=application/json}, {example= 123456 doggie @@ -264,7 +264,7 @@ extension PetstoreClientAPI { string -}] +, contentType=application/xml}] - parameter petId: (path) ID of pet that needs to be fetched @@ -342,6 +342,28 @@ extension PetstoreClientAPI { return requestBuilder.init(method: "DELETE", URLString: URLString, parameters: parameters, isBody: true) } + /** + + downloads an image + + - GET /pet/{petId}/downloadImage + - + - examples: [{output=none}] + + - returns: RequestBuilder + */ + public class func downloadFile() -> RequestBuilder { + let path = "/pet/{petId}/downloadImage" + let URLString = PetstoreClientAPI.basePath + path + + let nillableParameters: [String:AnyObject?] = [:] + let parameters = APIHelper.rejectNil(nillableParameters) + + let requestBuilder: RequestBuilder.Type = PetstoreClientAPI.requestBuilderFactory.getBuilder() + + return requestBuilder.init(method: "GET", URLString: URLString, parameters: parameters, isBody: true) + } + /** uploads an image diff --git a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift index c3865cb3cccf..f1a2ad59f379 100644 --- a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift +++ b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift @@ -21,12 +21,12 @@ extension PetstoreClientAPI { - API Key: - type: apiKey api_key - name: api_key - - examples: [{contentType=application/json, example={ + - examples: [{example={ "key" : 123 -}}, {contentType=application/xml, example=not implemented io.swagger.models.properties.MapProperty@d1e580af}] - - examples: [{contentType=application/json, example={ +}, contentType=application/json}, {example=not implemented io.swagger.models.properties.MapProperty@d1e580af, contentType=application/xml}] + - examples: [{example={ "key" : 123 -}}, {contentType=application/xml, example=not implemented io.swagger.models.properties.MapProperty@d1e580af}] +}, contentType=application/json}, {example=not implemented io.swagger.models.properties.MapProperty@d1e580af, contentType=application/xml}] - returns: RequestBuilder<[String:Int]> */ @@ -48,36 +48,36 @@ extension PetstoreClientAPI { - POST /store/order - - - examples: [{contentType=application/json, example={ - "petId" : 123456789, - "quantity" : 123, + - examples: [{example={ "id" : 123456789, - "shipDate" : "2015-11-11T12:31:12.079+0000", + "petId" : 123456789, "complete" : true, - "status" : "aeiou" -}}, {contentType=application/xml, example= + "status" : "aeiou", + "quantity" : 123, + "shipDate" : "2015-12-26T03:35:39.893+0000" +}, contentType=application/json}, {example= 123456 123456 0 - 2015-11-11T14:31:12.082Z + 2015-12-26T11:35:39.898Z string true -}] - - examples: [{contentType=application/json, example={ - "petId" : 123456789, - "quantity" : 123, +, contentType=application/xml}] + - examples: [{example={ "id" : 123456789, - "shipDate" : "2015-11-11T12:31:12.079+0000", + "petId" : 123456789, "complete" : true, - "status" : "aeiou" -}}, {contentType=application/xml, example= + "status" : "aeiou", + "quantity" : 123, + "shipDate" : "2015-12-26T03:35:39.893+0000" +}, contentType=application/json}, {example= 123456 123456 0 - 2015-11-11T14:31:12.082Z + 2015-12-26T11:35:39.898Z string true -}] +, contentType=application/xml}] - parameter body: (body) order placed for purchasing the pet @@ -100,36 +100,36 @@ extension PetstoreClientAPI { - GET /store/order/{orderId} - For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions - - examples: [{contentType=application/json, example={ - "petId" : 123456789, - "quantity" : 123, + - examples: [{example={ "id" : 123456789, - "shipDate" : "2015-11-11T12:31:12.083+0000", + "petId" : 123456789, "complete" : true, - "status" : "aeiou" -}}, {contentType=application/xml, example= + "status" : "aeiou", + "quantity" : 123, + "shipDate" : "2015-12-26T03:35:39.900+0000" +}, contentType=application/json}, {example= 123456 123456 0 - 2015-11-11T14:31:12.083Z + 2015-12-26T11:35:39.900Z string true -}] - - examples: [{contentType=application/json, example={ - "petId" : 123456789, - "quantity" : 123, +, contentType=application/xml}] + - examples: [{example={ "id" : 123456789, - "shipDate" : "2015-11-11T12:31:12.083+0000", + "petId" : 123456789, "complete" : true, - "status" : "aeiou" -}}, {contentType=application/xml, example= + "status" : "aeiou", + "quantity" : 123, + "shipDate" : "2015-12-26T03:35:39.900+0000" +}, contentType=application/json}, {example= 123456 123456 0 - 2015-11-11T14:31:12.083Z + 2015-12-26T11:35:39.900Z string true -}] +, contentType=application/xml}] - parameter orderId: (path) ID of pet that needs to be fetched diff --git a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/UserAPI.swift b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/UserAPI.swift index 231e7f59228e..19cf534cea83 100644 --- a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/UserAPI.swift +++ b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/UserAPI.swift @@ -84,8 +84,8 @@ extension PetstoreClientAPI { - GET /user/login - - - examples: [{contentType=application/json, example="aeiou"}, {contentType=application/xml, example=string}] - - examples: [{contentType=application/json, example="aeiou"}, {contentType=application/xml, example=string}] + - examples: [{example="aeiou", contentType=application/json}, {example=string, contentType=application/xml}] + - examples: [{example="aeiou", contentType=application/json}, {example=string, contentType=application/xml}] - parameter username: (query) The user name for login - parameter password: (query) The password for login in clear text @@ -134,7 +134,7 @@ extension PetstoreClientAPI { - GET /user/{username} - - - examples: [{contentType=application/json, example={ + - examples: [{example={ "id" : 1, "username" : "johnp", "firstName" : "John", @@ -143,7 +143,7 @@ extension PetstoreClientAPI { "password" : "-secret-", "phone" : "0123456789", "userStatus" : 0 -}}] +}, contentType=application/json}] - parameter username: (path) The name that needs to be fetched. Use user1 for testing. diff --git a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/Extensions.swift b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/Extensions.swift index 0a9f74b3e764..8015d1bd3a23 100644 --- a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/Extensions.swift +++ b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/Extensions.swift @@ -66,8 +66,8 @@ extension NSDate: JSONEncodable { extension RequestBuilder { public func execute() -> Promise> { - let deferred = Promise>.defer() - self.execute { (response: Response?, error: NSError?) in + let deferred = Promise>.pendingPromise() + self.execute { (response: Response?, error: ErrorType?) in if let response = response { deferred.fulfill(response) } else { From 56380271790bfcc4c06ede1728a0541ed57e8a2d Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 26 Dec 2015 16:15:58 +0800 Subject: [PATCH 44/82] remove downloadImage from petstore.json --- .../src/test/resources/2_0/petstore.json | 76 ------------------- .../Classes/Swaggers/APIs/PetAPI.swift | 22 ------ .../Classes/Swaggers/APIs/StoreAPI.swift | 16 ++-- 3 files changed, 8 insertions(+), 106 deletions(-) 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 ad9cbead5e97..66762d74b2bc 100644 --- a/modules/swagger-codegen/src/test/resources/2_0/petstore.json +++ b/modules/swagger-codegen/src/test/resources/2_0/petstore.json @@ -402,23 +402,6 @@ ] } }, - "/pet/{petId}/downloadImage" : { - "get" : { - "tags" : [ "pet" ], - "summary" : "downloads an image", - "description" : "", - "operationId" : "downloadFile", - "produces" : [ "application/octet-stream" ], - "responses" : { - "200" : { - "description" : "successful operation", - "schema" : { - "$ref" : "#/definitions/File" - } - } - } - } - }, "/store/inventory": { "get": { "tags": [ @@ -989,65 +972,6 @@ "xml": { "name": "Order" } - }, - "definitions" : { - "File": { - "type": "object", - "properties": { - "path": { - "type": "string" - }, - "name": { - "type": "string" - }, - "canonicalPath": { - "type": "string" - }, - "parent": { - "type": "string" - }, - "absolute": { - "type": "boolean", - "default": false - }, - "absoluteFile": { - "$ref": "#/definitions/File" - }, - "absolutePath": { - "type": "string" - }, - "canonicalFile": { - "$ref": "#/definitions/File" - }, - "freeSpace": { - "type": "integer", - "format": "int64" - }, - "parentFile": { - "$ref": "#/definitions/File" - }, - "totalSpace": { - "type": "integer", - "format": "int64" - }, - "usableSpace": { - "type": "integer", - "format": "int64" - }, - "directory": { - "type": "boolean", - "default": false - }, - "file": { - "type": "boolean", - "default": false - }, - "hidden": { - "type": "boolean", - "default": false - } - } - } } } } diff --git a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift index 57e586dc0290..5fc929a20a29 100644 --- a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift +++ b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift @@ -342,28 +342,6 @@ extension PetstoreClientAPI { return requestBuilder.init(method: "DELETE", URLString: URLString, parameters: parameters, isBody: true) } - /** - - downloads an image - - - GET /pet/{petId}/downloadImage - - - - examples: [{output=none}] - - - returns: RequestBuilder - */ - public class func downloadFile() -> RequestBuilder { - let path = "/pet/{petId}/downloadImage" - let URLString = PetstoreClientAPI.basePath + path - - let nillableParameters: [String:AnyObject?] = [:] - let parameters = APIHelper.rejectNil(nillableParameters) - - let requestBuilder: RequestBuilder.Type = PetstoreClientAPI.requestBuilderFactory.getBuilder() - - return requestBuilder.init(method: "GET", URLString: URLString, parameters: parameters, isBody: true) - } - /** uploads an image diff --git a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift index f1a2ad59f379..301bc80285d2 100644 --- a/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift +++ b/samples/client/petstore/swift/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift @@ -54,12 +54,12 @@ extension PetstoreClientAPI { "complete" : true, "status" : "aeiou", "quantity" : 123, - "shipDate" : "2015-12-26T03:35:39.893+0000" + "shipDate" : "2015-12-26T08:15:52.206+0000" }, contentType=application/json}, {example= 123456 123456 0 - 2015-12-26T11:35:39.898Z + 2015-12-26T16:15:52.210Z string true , contentType=application/xml}] @@ -69,12 +69,12 @@ extension PetstoreClientAPI { "complete" : true, "status" : "aeiou", "quantity" : 123, - "shipDate" : "2015-12-26T03:35:39.893+0000" + "shipDate" : "2015-12-26T08:15:52.206+0000" }, contentType=application/json}, {example= 123456 123456 0 - 2015-12-26T11:35:39.898Z + 2015-12-26T16:15:52.210Z string true , contentType=application/xml}] @@ -106,12 +106,12 @@ extension PetstoreClientAPI { "complete" : true, "status" : "aeiou", "quantity" : 123, - "shipDate" : "2015-12-26T03:35:39.900+0000" + "shipDate" : "2015-12-26T08:15:52.211+0000" }, contentType=application/json}, {example= 123456 123456 0 - 2015-12-26T11:35:39.900Z + 2015-12-26T16:15:52.212Z string true , contentType=application/xml}] @@ -121,12 +121,12 @@ extension PetstoreClientAPI { "complete" : true, "status" : "aeiou", "quantity" : 123, - "shipDate" : "2015-12-26T03:35:39.900+0000" + "shipDate" : "2015-12-26T08:15:52.211+0000" }, contentType=application/json}, {example= 123456 123456 0 - 2015-12-26T11:35:39.900Z + 2015-12-26T16:15:52.212Z string true , contentType=application/xml}] From a2c020f9e87b2ce22d2c36e7a3172e2476930734 Mon Sep 17 00:00:00 2001 From: xhh Date: Sat, 26 Dec 2015 16:48:49 +0800 Subject: [PATCH 45/82] Add simple profiling for Java Petstore sample --- .../java/default/petstore_profiling.output | 23 ++++ .../java/io/swagger/PetstoreProfiling.java | 106 ++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 samples/client/petstore/java/default/petstore_profiling.output create mode 100644 samples/client/petstore/java/default/src/test/java/io/swagger/PetstoreProfiling.java diff --git a/samples/client/petstore/java/default/petstore_profiling.output b/samples/client/petstore/java/default/petstore_profiling.output new file mode 100644 index 000000000000..215625487656 --- /dev/null +++ b/samples/client/petstore/java/default/petstore_profiling.output @@ -0,0 +1,23 @@ +# To run the profiling: +# mvn compile test-compile exec:java -Dexec.classpathScope=test -Dexec.mainClass="io.swagger.PetstoreProfiling" + +0: ADD PET => 0.987609128 +0: GET PET => 0.450873167 +0: UPDATE PET => 0.447611998 +0: DELETE PET => 0.397707664 +1: ADD PET => 0.395333121 +1: GET PET => 0.381760136 +1: UPDATE PET => 0.395245221 +1: DELETE PET => 0.384854324 +2: ADD PET => 0.400336227 +2: GET PET => 0.378959921 +2: UPDATE PET => 0.397619284 +2: DELETE PET => 0.383307393 +3: ADD PET => 0.385764805 +3: GET PET => 0.40218304 +3: UPDATE PET => 0.387887511 +3: DELETE PET => 0.398063489 +4: ADD PET => 0.384757488 +4: GET PET => 0.398719713 +4: UPDATE PET => 0.383319052 +4: DELETE PET => 0.408516644 diff --git a/samples/client/petstore/java/default/src/test/java/io/swagger/PetstoreProfiling.java b/samples/client/petstore/java/default/src/test/java/io/swagger/PetstoreProfiling.java new file mode 100644 index 000000000000..ab2ba5d71bf3 --- /dev/null +++ b/samples/client/petstore/java/default/src/test/java/io/swagger/PetstoreProfiling.java @@ -0,0 +1,106 @@ +package io.swagger; + +import java.io.*; +import java.util.*; + +import io.swagger.client.*; +import io.swagger.client.api.*; +import io.swagger.client.model.*; + +public class PetstoreProfiling { + public int total = 5; + public Long newPetId = 50003L; + public String outputFile = "./petstore_profiling.output"; + + public void callApis(int index, List> results) { + long start; + + try { + PetApi petApi = new PetApi(); + + /* ADD PET */ + Pet pet = new Pet(); + pet.setId(newPetId); + pet.setName("profiler"); + pet.setStatus(Pet.StatusEnum.AVAILABLE); + pet.setPhotoUrls(Arrays.asList("http://profiler.com")); + // new tag + Tag tag = new Tag(); + tag.setId(newPetId); // use the same id as pet + tag.setName("profile tag 1"); + // new category + Category category = new Category(); + category.setId(newPetId); // use the same id as pet + category.setName("profile category 1"); + + pet.setTags(Arrays.asList(tag)); + pet.setCategory(category); + + /* ADD PET */ + start = System.nanoTime(); + petApi.addPet(pet); + results.add(buildResult(index, "ADD PET", System.nanoTime() - start)); + + /* GET PET */ + start = System.nanoTime(); + pet = petApi.getPetById(newPetId); + results.add(buildResult(index, "GET PET", System.nanoTime() - start)); + + /* UPDATE PET WITH FORM */ + start = System.nanoTime(); + petApi.updatePetWithForm(String.valueOf(newPetId), "new profiler", "sold"); + results.add(buildResult(index, "UPDATE PET", System.nanoTime() - start)); + + /* DELETE PET */ + start = System.nanoTime(); + petApi.deletePet(newPetId, "special-key"); + results.add(buildResult(index, "DELETE PET", System.nanoTime() - start)); + } catch (ApiException e) { + System.out.println("Caught error: " + e.getMessage()); + System.out.println("HTTP response headers: " + e.getResponseHeaders()); + System.out.println("HTTP response body: " + e.getResponseBody()); + System.out.println("HTTP status code: " + e.getCode()); + } + } + + public void run() { + System.out.printf("Running profiling... (total: %s)\n", total); + + List> results = new ArrayList>(); + for (int i = 0; i < total; i++) { + callApis(i, results); + } + writeResultsToFile(results); + + System.out.printf("Profiling results written to %s\n", outputFile); + } + + private Map buildResult(int index, String name, long time) { + Map result = new HashMap(); + result.put("index", String.valueOf(index)); + result.put("name", name); + result.put("time", String.valueOf(time / 1000000000.0)); + return result; + } + + private void writeResultsToFile(List> results) { + try { + File file = new File(outputFile); + PrintWriter writer = new PrintWriter(file); + String command = "mvn compile test-compile exec:java -Dexec.classpathScope=test -Dexec.mainClass=\"io.swagger.PetstoreProfiling\""; + writer.println("# To run the profiling:"); + writer.printf("# %s\n\n", command); + for (Map result : results) { + writer.printf("%s: %s => %s\n", result.get("index"), result.get("name"), result.get("time")); + } + writer.close(); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) { + final PetstoreProfiling profiling = new PetstoreProfiling(); + profiling.run(); + } +} From ef1222f2bf88ebd369312589489ef0e43b46fbab Mon Sep 17 00:00:00 2001 From: Patrick Culligan Date: Sat, 26 Dec 2015 17:29:56 -0600 Subject: [PATCH 46/82] Added support for vendor extensions on model and property --- .../src/main/java/io/swagger/codegen/CodegenModel.java | 7 +++---- .../src/main/java/io/swagger/codegen/CodegenProperty.java | 4 ++++ .../src/main/java/io/swagger/codegen/DefaultCodegen.java | 5 ++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java index d5702b5c50a0..b4d964647b7e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java @@ -2,10 +2,7 @@ package io.swagger.codegen; import io.swagger.models.ExternalDocs; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class CodegenModel { public String parent; @@ -21,4 +18,6 @@ public class CodegenModel { public Set imports = new HashSet(); public Boolean hasVars, emptyVars, hasMoreModels, hasEnums, isEnum; public ExternalDocs externalDocs; + + public Map vendorExtensions; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java index 32e169ac8782..e77258a08189 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java @@ -38,6 +38,7 @@ public class CodegenProperty { public List _enum; public Map allowableValues; public CodegenProperty items; + public Map vendorExtensions; @Override public boolean equals(Object obj) { @@ -138,6 +139,9 @@ public class CodegenProperty { if (this.allowableValues != other.allowableValues && (this.allowableValues == null || !this.allowableValues.equals(other.allowableValues))) { return false; } + if (this.vendorExtensions != other.vendorExtensions && (this.vendorExtensions == null || !this.vendorExtensions.equals(other.vendorExtensions))) { + return false; + } return true; } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index dd8d9aefa902..5dc25b514d68 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -762,6 +762,9 @@ public class DefaultCodegen { m.classVarName = toVarName(name); m.modelJson = Json.pretty(model); m.externalDocs = model.getExternalDocs(); + m.vendorExtensions = model.getVendorExtensions(); + + if (model instanceof ArrayModel) { ArrayModel am = (ArrayModel) model; ArrayProperty arrayProperty = new ArrayProperty(am.getItems()); @@ -880,9 +883,9 @@ public class DefaultCodegen { property.example = p.getExample(); property.defaultValue = toDefaultValue(p); property.defaultValueWithParam = toDefaultValueWithParam(name, p); - property.jsonSchema = Json.pretty(p); property.isReadOnly = p.getReadOnly(); + property.vendorExtensions = p.getVendorExtensions(); String type = getSwaggerType(p); if (p instanceof AbstractNumericProperty) { From 3266fbbf81cd3faf1730edbb84e8f7c5dff8840e Mon Sep 17 00:00:00 2001 From: Patrick Culligan Date: Sat, 26 Dec 2015 18:18:14 -0600 Subject: [PATCH 47/82] corrected JavaDos issues that were UNRELATED to this PR to get the CI server moving. --- .../java/io/swagger/codegen/DefaultCodegen.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 5dc25b514d68..fb331918d87d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -307,7 +307,7 @@ public class DefaultCodegen { * Return the parameter name by removing invalid characters and proper escaping if * it's a reserved word. * - * @param property Codegen property object + * @param name Codegen property object * @return the sanitized parameter name */ public String toParamName(String name) { @@ -332,8 +332,9 @@ public class DefaultCodegen { * Return the escaped name of the reserved word * * @param name the name to be escaped - * @throws Runtime exception as reserved word is not allowed (default behavior) * @return the escaped reserved word + * + * throws Runtime exception as reserved word is not allowed (default behavior) */ public String escapeReservedWord(String name) { throw new RuntimeException("reserved word " + name + " not allowed"); @@ -369,9 +370,8 @@ public class DefaultCodegen { * between Swagger type and the corresponding import statement for the language. This will * also add some language specified CLI options, if any. * - * @param path the path of the operation - * @param operation Swagger operation object - * @return string presentation of the example path + * + * returns string presentation of the example path (it's a constructor) */ public DefaultCodegen() { defaultIncludes = new HashSet( @@ -1430,7 +1430,7 @@ public class DefaultCodegen { * Convert Swagger Parameter object to Codegen Parameter object * * @param param Swagger parameter object - * @param a set of imports for library/package/module + * @param imports set of imports for library/package/module * @return Codegen Parameter object */ public CodegenParameter fromParameter(Parameter param, Set imports) { @@ -2015,6 +2015,7 @@ public class DefaultCodegen { /** * All library templates supported. * (key: library name, value: library description) + * @return the supported libraries */ public Map supportedLibraries() { return supportedLibraries; From 6a45111e10b7d0684537e2365d40e46364c50bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20J=C3=B8rgensen?= Date: Sun, 27 Dec 2015 15:17:18 +0100 Subject: [PATCH 48/82] Handle wildcard response codes correct in PHP Wildcard response codes was handled like all other response codes resulting in a misleading construction like this: ``` switch ($e->getCode()) { case 0: $data = $this->apiClient->getSerializer()->deserialize($e->getResponseBody(), '\Swagger\Client\Model\Error', $e->getResponseHeaders()); $e->setResponseObject($data); break; } ``` This commit fixes it to use the default fallback of the PHP switch statement: ``` switch ($e->getCode()) { default: $data = $this->apiClient->getSerializer()->deserialize($e->getResponseBody(), '\Swagger\Client\Model\Error', $e->getResponseHeaders()); $e->setResponseObject($data); break; } ``` --- modules/swagger-codegen/src/main/resources/php/api.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache index cce59f4d94b5..23855792e6d7 100644 --- a/modules/swagger-codegen/src/main/resources/php/api.mustache +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -213,7 +213,7 @@ use \{{invokerPackage}}\ObjectSerializer; {{/returnType}} } catch (ApiException $e) { switch ($e->getCode()) { {{#responses}}{{#dataType}} - case {{code}}: + {{^isWildcard}}case {{code}}:{{/isWildcard}}{{#isWildcard}}default:{{/isWildcard}} $data = $this->apiClient->getSerializer()->deserialize($e->getResponseBody(), '{{dataType}}', $e->getResponseHeaders()); $e->setResponseObject($data); break;{{/dataType}}{{/responses}} From 84c35bd0cb3aebd7984c0526de8fad07bc5c5074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20J=C3=B8rgensen?= Date: Sun, 27 Dec 2015 15:29:08 +0100 Subject: [PATCH 49/82] Regenerated PHP petstore sample. --- .../php/SwaggerClient-php/lib/Api/PetApi.php | 80 +++++++++++++++++++ .../lib/ObjectSerializer.php | 2 +- 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index bd82444f4fe0..c91e54f6e57a 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -738,6 +738,86 @@ class PetApi } } + /** + * downloadFile + * + * downloads an image + * + * @return \Swagger\Client\Model\File + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function downloadFile() + { + list($response, $statusCode, $httpHeader) = $this->downloadFileWithHttpInfo (); + return $response; + } + + + /** + * downloadFileWithHttpInfo + * + * downloads an image + * + * @return Array of \Swagger\Client\Model\File, HTTP status code, HTTP response headers (array of strings) + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function downloadFileWithHttpInfo() + { + + + // parse inputs + $resourcePath = "/pet/{petId}/downloadImage"; + $resourcePath = str_replace("{format}", "json", $resourcePath); + $method = "GET"; + $httpBody = ''; + $queryParams = array(); + $headerParams = array(); + $formParams = array(); + $_header_accept = ApiClient::selectHeaderAccept(array('application/octet-stream')); + if (!is_null($_header_accept)) { + $headerParams['Accept'] = $_header_accept; + } + $headerParams['Content-Type'] = ApiClient::selectHeaderContentType(array()); + + + + + + + + // for model (json/xml) + if (isset($_tempBody)) { + $httpBody = $_tempBody; // $_tempBody is the method argument, if present + } elseif (count($formParams) > 0) { + $httpBody = $formParams; // for HTTP post (form) + } + + // make the API Call + try { + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( + $resourcePath, $method, + $queryParams, $httpBody, + $headerParams, '\Swagger\Client\Model\File' + ); + + if (!$response) { + return array(null, $statusCode, $httpHeader); + } + + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\File', $httpHeader), $statusCode, $httpHeader); + + } catch (ApiException $e) { + switch ($e->getCode()) { + case 200: + $data = $this->apiClient->getSerializer()->deserialize($e->getResponseBody(), '\Swagger\Client\Model\File', $e->getResponseHeaders()); + $e->setResponseObject($data); + break; + } + + throw $e; + } + } + /** * uploadFile * diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php index cc023b61bd27..7d7a04e653cc 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php @@ -193,7 +193,7 @@ class ObjectSerializer $deserialized = $values; } elseif ($class === '\DateTime') { $deserialized = new \DateTime($data); - } elseif (in_array($class, array('integer', 'int', 'void', 'number', 'object', 'double', 'float', 'byte', 'DateTime', 'string', 'mixed', 'boolean', 'bool'))) { + } elseif (in_array($class, array('void', 'bool', 'string', 'double', 'byte', 'mixed', 'integer', 'float', 'int', 'DateTime', 'number', 'boolean', 'object'))) { settype($data, $class); $deserialized = $data; } elseif ($class === '\SplFileObject') { From fa9844af7e7509508da787bf9faaa72d5c4965c5 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 28 Dec 2015 16:05:03 +0800 Subject: [PATCH 50/82] remove baseobject from perl, add README.mustache --- .../codegen/languages/PerlClientCodegen.java | 5 +- .../main/resources/perl/BaseObject.mustache | 23 - .../perl/{README.md => README.mustache} | 0 .../src/main/resources/perl/object.mustache | 7 +- samples/client/petstore/perl/README.md | 430 ++++++++---------- .../lib/WWW/SwaggerClient/Object/Category.pm | 82 +++- .../lib/WWW/SwaggerClient/Object/Order.pm | 82 +++- .../perl/lib/WWW/SwaggerClient/Object/Pet.pm | 82 +++- .../perl/lib/WWW/SwaggerClient/Object/Tag.pm | 82 +++- .../perl/lib/WWW/SwaggerClient/Object/User.pm | 82 +++- .../perl/lib/WWW/SwaggerClient/PetApi.pm | 59 +++ .../perl/lib/WWW/SwaggerClient/Role.pm | 4 +- 12 files changed, 659 insertions(+), 279 deletions(-) rename modules/swagger-codegen/src/main/resources/perl/{README.md => README.mustache} (100%) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java index 8190d9963556..2e220841f5db 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java @@ -97,11 +97,12 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("ApiClient.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "ApiClient.pm")); supportingFiles.add(new SupportingFile("Configuration.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "Configuration.pm")); - supportingFiles.add(new SupportingFile("BaseObject.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "Object/BaseObject.pm")); + //supportingFiles.add(new SupportingFile("BaseObject.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "Object/BaseObject.pm")); supportingFiles.add(new SupportingFile("ApiFactory.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "ApiFactory.pm")); supportingFiles.add(new SupportingFile("Role.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "Role.pm")); supportingFiles.add(new SupportingFile("AutoDoc.mustache", ("lib/WWW/" + moduleName + "/Role").replace('/', File.separatorChar), "AutoDoc.pm")); - supportingFiles.add(new SupportingFile("autodoc.script.mustache", ("bin/").replace('/', File.separatorChar), "autodoc")); + supportingFiles.add(new SupportingFile("autodoc.script.mustache", "bin", "autodoc")); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); } @Override diff --git a/modules/swagger-codegen/src/main/resources/perl/BaseObject.mustache b/modules/swagger-codegen/src/main/resources/perl/BaseObject.mustache index a41931940bae..aed1aec3118a 100644 --- a/modules/swagger-codegen/src/main/resources/perl/BaseObject.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/BaseObject.mustache @@ -1,25 +1,3 @@ -package WWW::{{moduleName}}::Object::BaseObject; - -require 5.6.0; -use strict; -use warnings; -use utf8; -use JSON qw(decode_json); -use Data::Dumper; -use Module::Runtime qw(use_module); -use Log::Any qw($log); -use Date::Parse; -use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - - -# -# -# -#NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. -# - __PACKAGE__->mk_classdata('attribute_map' => {}); __PACKAGE__->mk_classdata('swagger_types' => {}); __PACKAGE__->mk_classdata('method_documentation' => {}); @@ -95,4 +73,3 @@ sub _deserialize { } } -1; diff --git a/modules/swagger-codegen/src/main/resources/perl/README.md b/modules/swagger-codegen/src/main/resources/perl/README.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/perl/README.md rename to modules/swagger-codegen/src/main/resources/perl/README.mustache diff --git a/modules/swagger-codegen/src/main/resources/perl/object.mustache b/modules/swagger-codegen/src/main/resources/perl/object.mustache index 00c572453c1e..95af03e09d38 100644 --- a/modules/swagger-codegen/src/main/resources/perl/object.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/object.mustache @@ -13,7 +13,9 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -use base "WWW::{{moduleName}}::Object::BaseObject"; +#use base "WWW::{{moduleName}}::Object::BaseObject"; +use base ("Class::Accessor", "Class::Data::Inheritable"); + # #{{description}} @@ -21,6 +23,8 @@ use base "WWW::{{moduleName}}::Object::BaseObject"; #NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. # +{{>BaseObject}} + __PACKAGE__->class_documentation({description => '{{description}}', class => '{{classname}}', required => [], # TODO @@ -49,6 +53,7 @@ __PACKAGE__->attribute_map( { __PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); + 1; {{/model}} {{/models}} diff --git a/samples/client/petstore/perl/README.md b/samples/client/petstore/perl/README.md index adfe2455d658..d07bf6f71216 100644 --- a/samples/client/petstore/perl/README.md +++ b/samples/client/petstore/perl/README.md @@ -1,281 +1,219 @@ # NAME -My::App - -# VERSION +WWW::SwaggerClient::Role - a Moose role for the Swagger Petstore ## Swagger Petstore version: 1.0.0 -Automatically generated by the Perl Swagger Codegen project: +# VERSION -- Build date: 2015-11-13T20:46:43.271Z +Automatically generated by the Perl Swagger Codegen project: + +- Build date: 2015-12-28T16:00:32.828+08:00 - Build package: class io.swagger.codegen.languages.PerlClientCodegen -- Codegen version: +- Codegen version: -# INHERITANCE +## A note on Moose -## Base class(es) +This role is the only component of the library that uses Moose. See +WWW::SwaggerClient::ApiFactory for non-Moosey usage. -Moose::Object +# SYNOPSIS -## Direct subclasses +The Perl Swagger Codegen project builds a library of Perl modules to interact with +a web service defined by a Swagger specification. See below for how to build the +library. -## All subclasses +This module provides an interface to the generated library. All the classes, +objects, and methods (well, not quite \*all\*, see below) are flattened into this +role. -# COMPOSITION + package MyApp; + use Moose; + with 'WWW::SwaggerClient::Role'; + + package main; + + my $api = MyApp->new({ tokens => $tokens }); + + my $pet = $api->get_pet_by_id(pet_id => $pet_id); + -My::App composes the following roles: +## Structure of the library -## `WWW::SwaggerClient::Role` +The library consists of a set of API classes, one for each endpoint. These APIs +implement the method calls available on each endpoint. -Requires: +Additionally, there is a set of "object" classes, which represent the objects +returned by and sent to the methods on the endpoints. + +An API factory class is provided, which builds instances of each endpoint API. + +This Moose role flattens all the methods from the endpoint APIs onto the consuming +class. It also provides methods to retrieve the endpoint API objects, and the API +factory object, should you need it. + +For documentation of all these methods, see AUTOMATIC DOCUMENTATION below. + +## Configuring authentication + +In the normal case, the Swagger spec will describe what parameters are +required and where to put them. You just need to supply the tokens. + + my $tokens = { + # basic + username => $username, + password => $password, + + # oauth + access_token => $oauth_token, + + # keys + $some_key => { token => $token, + prefix => $prefix, + in => $in, # 'head||query', + }, + + $another => { token => $token, + prefix => $prefix, + in => $in, # 'head||query', + }, + ..., + + }; + + my $api = MyApp->new({ tokens => $tokens }); + +Note these are all optional, as are `prefix` and `in`, and depend on the API +you are accessing. Usually `prefix` and `in` will be determined by the code generator from +the spec and you will not need to set them at run time. If not, `in` will +default to 'head' and `prefix` to the empty string. + +The tokens will be placed in the `WWW::SwaggerClient::Configuration` namespace +as follows, but you don't need to know about this. + +- `$WWW::SwaggerClient::Configuration::username` + + String. The username for basic auth. + +- `$WWW::SwaggerClient::Configuration::password` + + String. The password for basic auth. + +- `$WWW::SwaggerClient::Configuration::api_key` + + Hashref. Keyed on the name of each key (there can be multiple tokens). + + $WWW::SwaggerClient::Configuration::api_key = { + secretKey => 'aaaabbbbccccdddd', + anotherKey => '1111222233334444', + }; + +- `$WWW::SwaggerClient::Configuration::api_key_prefix` + + Hashref. Keyed on the name of each key (there can be multiple tokens). Note not + all api keys require a prefix. + + $WWW::SwaggerClient::Configuration::api_key_prefix = { + secretKey => 'string', + anotherKey => 'same or some other string', + }; + +- `$WWW::SwaggerClient::Configuration::access_token` + + String. The OAuth access token. # METHODS -## `add_pet()` +## `base_url` - Defined in: WWW::SwaggerClient::PetApi - Delegates to: add_pet() - On: WWW::SwaggerClient::PetApi - Via: pet_api() - Doc: Add a new pet to the store - Same as: $self->pet_api->add_pet() - -## `create_user()` - - Defined in: WWW::SwaggerClient::UserApi - Delegates to: create_user() - On: WWW::SwaggerClient::UserApi - Via: user_api() - Doc: Create user - Same as: $self->user_api->create_user() - -## `create_users_with_array_input()` - - Defined in: WWW::SwaggerClient::UserApi - Delegates to: create_users_with_array_input() - On: WWW::SwaggerClient::UserApi - Via: user_api() - Doc: Creates list of users with given input array - Same as: $self->user_api->create_users_with_array_input() - -## `create_users_with_list_input()` - - Defined in: WWW::SwaggerClient::UserApi - Delegates to: create_users_with_list_input() - On: WWW::SwaggerClient::UserApi - Via: user_api() - Doc: Creates list of users with given input array - Same as: $self->user_api->create_users_with_list_input() - -## `delete_order()` - - Defined in: WWW::SwaggerClient::StoreApi - Delegates to: delete_order() - On: WWW::SwaggerClient::StoreApi - Via: store_api() - Doc: Delete purchase order by ID - Same as: $self->store_api->delete_order() - -## `delete_pet()` - - Defined in: WWW::SwaggerClient::PetApi - Delegates to: delete_pet() - On: WWW::SwaggerClient::PetApi - Via: pet_api() - Doc: Deletes a pet - Same as: $self->pet_api->delete_pet() - -## `delete_user()` - - Defined in: WWW::SwaggerClient::UserApi - Delegates to: delete_user() - On: WWW::SwaggerClient::UserApi - Via: user_api() - Doc: Delete user - Same as: $self->user_api->delete_user() - -## `find_pets_by_status()` - - Defined in: WWW::SwaggerClient::PetApi - Delegates to: find_pets_by_status() - On: WWW::SwaggerClient::PetApi - Via: pet_api() - Doc: Finds Pets by status - Same as: $self->pet_api->find_pets_by_status() - -## `find_pets_by_tags()` - - Defined in: WWW::SwaggerClient::PetApi - Delegates to: find_pets_by_tags() - On: WWW::SwaggerClient::PetApi - Via: pet_api() - Doc: Finds Pets by tags - Same as: $self->pet_api->find_pets_by_tags() - -## `get_inventory()` - - Defined in: WWW::SwaggerClient::StoreApi - Delegates to: get_inventory() - On: WWW::SwaggerClient::StoreApi - Via: store_api() - Doc: Returns pet inventories by status - Same as: $self->store_api->get_inventory() - -## `get_order_by_id()` - - Defined in: WWW::SwaggerClient::StoreApi - Delegates to: get_order_by_id() - On: WWW::SwaggerClient::StoreApi - Via: store_api() - Doc: Find purchase order by ID - Same as: $self->store_api->get_order_by_id() - -## `get_pet_by_id()` - - Defined in: WWW::SwaggerClient::PetApi - Delegates to: get_pet_by_id() - On: WWW::SwaggerClient::PetApi - Via: pet_api() - Doc: Find pet by ID - Same as: $self->pet_api->get_pet_by_id() - -## `get_user_by_name()` - - Defined in: WWW::SwaggerClient::UserApi - Delegates to: get_user_by_name() - On: WWW::SwaggerClient::UserApi - Via: user_api() - Doc: Get user by user name - Same as: $self->user_api->get_user_by_name() - -## `login_user()` - - Defined in: WWW::SwaggerClient::UserApi - Delegates to: login_user() - On: WWW::SwaggerClient::UserApi - Via: user_api() - Doc: Logs user into the system - Same as: $self->user_api->login_user() - -## `logout_user()` - - Defined in: WWW::SwaggerClient::UserApi - Delegates to: logout_user() - On: WWW::SwaggerClient::UserApi - Via: user_api() - Doc: Logs out current logged in user session - Same as: $self->user_api->logout_user() - -## `place_order()` - - Defined in: WWW::SwaggerClient::StoreApi - Delegates to: place_order() - On: WWW::SwaggerClient::StoreApi - Via: store_api() - Doc: Place an order for a pet - Same as: $self->store_api->place_order() - -## `update_pet()` - - Defined in: WWW::SwaggerClient::PetApi - Delegates to: update_pet() - On: WWW::SwaggerClient::PetApi - Via: pet_api() - Doc: Update an existing pet - Same as: $self->pet_api->update_pet() - -## `update_pet_with_form()` - - Defined in: WWW::SwaggerClient::PetApi - Delegates to: update_pet_with_form() - On: WWW::SwaggerClient::PetApi - Via: pet_api() - Doc: Updates a pet in the store with form data - Same as: $self->pet_api->update_pet_with_form() - -## `update_user()` - - Defined in: WWW::SwaggerClient::UserApi - Delegates to: update_user() - On: WWW::SwaggerClient::UserApi - Via: user_api() - Doc: Updated user - Same as: $self->user_api->update_user() - -## `upload_file()` - - Defined in: WWW::SwaggerClient::PetApi - Delegates to: upload_file() - On: WWW::SwaggerClient::PetApi - Via: pet_api() - Doc: uploads an image - Same as: $self->pet_api->upload_file() - -# ATTRIBUTES +The generated code has the `base_url` already set as a default value. This method +returns (and optionally sets, but only if the API client has not been +created yet) the current value of `base_url`. ## `api_factory` - is: ro - isa: WWW::SwaggerClient::ApiFactory - reqd: no - lazy: yes - doc: Builds an instance of the endpoint API class - handles: +Returns an API factory object. You probably won't need to call this directly. -## `base_url` + $self->api_factory('Pet'); # returns a WWW::SwaggerClient::PetApi instance + + $self->pet_api; # the same - is: ro - isa: Str - reqd: no - lazy: no - doc: Root of the server that requests are sent to - handles: +# MISSING METHODS -## `pet_api` +Most of the methods on the API are delegated to individual endpoint API objects +(e.g. Pet API, Store API, User API etc). Where different endpoint APIs use the +same method name (e.g. `new()`), these methods can't be delegated. So you need +to call `$api->pet_api->new()`. - is: ro - isa: WWW::SwaggerClient::PetApi - reqd: no - lazy: yes - doc: - handles: add_pet, delete_pet, find_pets_by_status, find_pets_by_tags, - get_pet_by_id, update_pet, update_pet_with_form, upload_file +In principle, every API is susceptible to the presence of a few, random, undelegatable +method names. In practice, because of the way method names are constructed, it's +unlikely in general that any methods will be undelegatable, except for: -## `store_api` + new() + class_documentation() + method_documentation() - is: ro - isa: WWW::SwaggerClient::StoreApi - reqd: no - lazy: yes - doc: - handles: delete_order, get_inventory, get_order_by_id, place_order +To call these methods, you need to get a handle on the relevant object, either +by calling `$api->foo_api` or by retrieving an object, e.g. +`$api->get_pet_by_id(pet_id => $pet_id)`. They are class methods, so +you could also call them on class names. -## `tokens` +# BUILDING YOUR LIBRARY - is: ro - isa: HashRef - reqd: no - lazy: no - doc: The auth tokens required by the application - basic, OAuth and/or API key(s) - handles: +See the homepage `https://github.com/swagger-api/swagger-codegen` for full details. +But briefly, clone the git repository, build the codegen codebase, set up your build +config file, then run the API build script. You will need git, Java 7 and Apache +maven 3.0.3 or better already installed. -## `user_api` +The config file should specify the project name for the generated library: - is: ro - isa: WWW::SwaggerClient::UserApi - reqd: no - lazy: yes - doc: - handles: create_user, create_users_with_array_input, - create_users_with_list_input, delete_user, get_user_by_name, - login_user, logout_user, update_user + {"moduleName":"MyProjectName"} -## `version_info` +Your library files will be built under `WWW::MyProjectName`. - is: ro - isa: HashRef - reqd: no - lazy: no - doc: Information about the application version and the codegen codebase version - handles: + $ git clone https://github.com/swagger-api/swagger-codegen.git + $ cd swagger-codegen + $ mvn package + $ java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \ + -i [URL or file path to JSON swagger API spec] \ + -l perl \ + -c /path/to/config/file.json \ + -o /path/to/output/folder + +Bang, all done. Run the `autodoc` script in the `bin` directory to see the API +you just built. + +# AUTOMATIC DOCUMENTATION + +You can print out a summary of the generated API by running the included +`autodoc` script in the `bin` directory of your generated library. A few +output formats are supported: + + Usage: autodoc [OPTION] + + -w wide format (default) + -n narrow format + -p POD format + -H HTML format + -m Markdown format + -h print this help message + -c your application class + + +The `-c` option allows you to load and inspect your own application. A dummy +namespace is used if you don't supply your own class. + +# DOCUMENTATION FROM THE SWAGGER SPEC + +Additional documentation for each class and method may be provided by the Swagger +spec. If so, this is available via the `class_documentation()` and +`method_documentation()` methods on each generated object class, and the +`method_documentation()` method on the endpoint API classes: + + my $cmdoc = $api->pet_api->method_documentation->{$method_name}; + + my $odoc = $api->get_pet_by_id->(pet_id => $pet_id)->class_documentation; + my $omdoc = $api->get_pet_by_id->(pet_id => $pet_id)->method_documentation->{method_name}; + + +Each of these calls returns a hashref with various useful pieces of information. diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm index 43c12b040c73..77dd19a7caf2 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm @@ -11,7 +11,9 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -use base "WWW::SwaggerClient::Object::BaseObject"; +#use base "WWW::SwaggerClient::Object::BaseObject"; +use base ("Class::Accessor", "Class::Data::Inheritable"); + # # @@ -19,6 +21,83 @@ use base "WWW::SwaggerClient::Object::BaseObject"; #NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. # +#__PACKAGE__->mk_classdata('attribute_map' => {}); +#__PACKAGE__->mk_classdata('swagger_types' => {}); +#__PACKAGE__->mk_classdata('method_documentation' => {}); +#__PACKAGE__->mk_classdata('class_documentation' => {}); + +# new object +sub new { + my ($class, %args) = @_; + + my $self = bless {}, $class; + + foreach my $attribute (keys %{$class->attribute_map}) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{ $args_key } ); + } + + return $self; +} + +# return perl hash +sub to_hash { + return decode_json(JSON->new->convert_blessed->encode( shift )); +} + +# used by JSON for serialization +sub TO_JSON { + my $self = shift; + my $_data = {}; + foreach my $_key (keys %{$self->attribute_map}) { + if (defined $self->{$_key}) { + $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + } + } + return $_data; +} + +# from Perl hashref +sub from_hash { + my ($self, $hash) = @_; + + # loop through attributes and use swagger_types to deserialize the data + while ( my ($_key, $_type) = each %{$self->swagger_types} ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ($_type =~ /^array\[/i) { # array + my $_subclass = substr($_type, 6, -1); + my @_array = (); + foreach my $_element (@{$hash->{$_json_attribute}}) { + push @_array, $self->_deserialize($_subclass, $_element); + } + $self->{$_key} = \@_array; + } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime + $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); + } else { + $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + } + + return $self; +} + +# deserialize non-array data +sub _deserialize { + my ($self, $type, $data) = @_; + $log->debugf("deserializing %s with %s",Dumper($data), $type); + + if ($type eq 'DateTime') { + return DateTime->from_epoch(epoch => str2time($data)); + } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + return $data; + } else { # hash(model) + my $_instance = eval "WWW::SwaggerClient::Object::$type->new()"; + return $_instance->from_hash($data); + } +} + + + __PACKAGE__->class_documentation({description => '', class => 'Category', required => [], # TODO @@ -54,4 +133,5 @@ __PACKAGE__->attribute_map( { __PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); + 1; diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Order.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Order.pm index ea5f6160ee5f..cbb7a21c26c9 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Order.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Order.pm @@ -11,7 +11,9 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -use base "WWW::SwaggerClient::Object::BaseObject"; +#use base "WWW::SwaggerClient::Object::BaseObject"; +use base ("Class::Accessor", "Class::Data::Inheritable"); + # # @@ -19,6 +21,83 @@ use base "WWW::SwaggerClient::Object::BaseObject"; #NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. # +__PACKAGE__->mk_classdata('attribute_map' => {}); +__PACKAGE__->mk_classdata('swagger_types' => {}); +__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata('class_documentation' => {}); + +# new object +sub new { + my ($class, %args) = @_; + + my $self = bless {}, $class; + + foreach my $attribute (keys %{$class->attribute_map}) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{ $args_key } ); + } + + return $self; +} + +# return perl hash +sub to_hash { + return decode_json(JSON->new->convert_blessed->encode( shift )); +} + +# used by JSON for serialization +sub TO_JSON { + my $self = shift; + my $_data = {}; + foreach my $_key (keys %{$self->attribute_map}) { + if (defined $self->{$_key}) { + $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + } + } + return $_data; +} + +# from Perl hashref +sub from_hash { + my ($self, $hash) = @_; + + # loop through attributes and use swagger_types to deserialize the data + while ( my ($_key, $_type) = each %{$self->swagger_types} ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ($_type =~ /^array\[/i) { # array + my $_subclass = substr($_type, 6, -1); + my @_array = (); + foreach my $_element (@{$hash->{$_json_attribute}}) { + push @_array, $self->_deserialize($_subclass, $_element); + } + $self->{$_key} = \@_array; + } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime + $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); + } else { + $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + } + + return $self; +} + +# deserialize non-array data +sub _deserialize { + my ($self, $type, $data) = @_; + $log->debugf("deserializing %s with %s",Dumper($data), $type); + + if ($type eq 'DateTime') { + return DateTime->from_epoch(epoch => str2time($data)); + } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + return $data; + } else { # hash(model) + my $_instance = eval "WWW::SwaggerClient::Object::$type->new()"; + return $_instance->from_hash($data); + } +} + + + __PACKAGE__->class_documentation({description => '', class => 'Order', required => [], # TODO @@ -90,4 +169,5 @@ __PACKAGE__->attribute_map( { __PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); + 1; diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Pet.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Pet.pm index a1aeb1341784..f1f49e85f5e8 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Pet.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Pet.pm @@ -11,7 +11,9 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -use base "WWW::SwaggerClient::Object::BaseObject"; +#use base "WWW::SwaggerClient::Object::BaseObject"; +use base ("Class::Accessor", "Class::Data::Inheritable"); + # # @@ -19,6 +21,83 @@ use base "WWW::SwaggerClient::Object::BaseObject"; #NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. # +__PACKAGE__->mk_classdata('attribute_map' => {}); +__PACKAGE__->mk_classdata('swagger_types' => {}); +__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata('class_documentation' => {}); + +# new object +sub new { + my ($class, %args) = @_; + + my $self = bless {}, $class; + + foreach my $attribute (keys %{$class->attribute_map}) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{ $args_key } ); + } + + return $self; +} + +# return perl hash +sub to_hash { + return decode_json(JSON->new->convert_blessed->encode( shift )); +} + +# used by JSON for serialization +sub TO_JSON { + my $self = shift; + my $_data = {}; + foreach my $_key (keys %{$self->attribute_map}) { + if (defined $self->{$_key}) { + $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + } + } + return $_data; +} + +# from Perl hashref +sub from_hash { + my ($self, $hash) = @_; + + # loop through attributes and use swagger_types to deserialize the data + while ( my ($_key, $_type) = each %{$self->swagger_types} ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ($_type =~ /^array\[/i) { # array + my $_subclass = substr($_type, 6, -1); + my @_array = (); + foreach my $_element (@{$hash->{$_json_attribute}}) { + push @_array, $self->_deserialize($_subclass, $_element); + } + $self->{$_key} = \@_array; + } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime + $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); + } else { + $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + } + + return $self; +} + +# deserialize non-array data +sub _deserialize { + my ($self, $type, $data) = @_; + $log->debugf("deserializing %s with %s",Dumper($data), $type); + + if ($type eq 'DateTime') { + return DateTime->from_epoch(epoch => str2time($data)); + } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + return $data; + } else { # hash(model) + my $_instance = eval "WWW::SwaggerClient::Object::$type->new()"; + return $_instance->from_hash($data); + } +} + + + __PACKAGE__->class_documentation({description => '', class => 'Pet', required => [], # TODO @@ -90,4 +169,5 @@ __PACKAGE__->attribute_map( { __PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); + 1; diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Tag.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Tag.pm index a50eded7cde0..dd84157915bb 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Tag.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Tag.pm @@ -11,7 +11,9 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -use base "WWW::SwaggerClient::Object::BaseObject"; +#use base "WWW::SwaggerClient::Object::BaseObject"; +use base ("Class::Accessor", "Class::Data::Inheritable"); + # # @@ -19,6 +21,83 @@ use base "WWW::SwaggerClient::Object::BaseObject"; #NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. # +__PACKAGE__->mk_classdata('attribute_map' => {}); +__PACKAGE__->mk_classdata('swagger_types' => {}); +__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata('class_documentation' => {}); + +# new object +sub new { + my ($class, %args) = @_; + + my $self = bless {}, $class; + + foreach my $attribute (keys %{$class->attribute_map}) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{ $args_key } ); + } + + return $self; +} + +# return perl hash +sub to_hash { + return decode_json(JSON->new->convert_blessed->encode( shift )); +} + +# used by JSON for serialization +sub TO_JSON { + my $self = shift; + my $_data = {}; + foreach my $_key (keys %{$self->attribute_map}) { + if (defined $self->{$_key}) { + $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + } + } + return $_data; +} + +# from Perl hashref +sub from_hash { + my ($self, $hash) = @_; + + # loop through attributes and use swagger_types to deserialize the data + while ( my ($_key, $_type) = each %{$self->swagger_types} ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ($_type =~ /^array\[/i) { # array + my $_subclass = substr($_type, 6, -1); + my @_array = (); + foreach my $_element (@{$hash->{$_json_attribute}}) { + push @_array, $self->_deserialize($_subclass, $_element); + } + $self->{$_key} = \@_array; + } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime + $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); + } else { + $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + } + + return $self; +} + +# deserialize non-array data +sub _deserialize { + my ($self, $type, $data) = @_; + $log->debugf("deserializing %s with %s",Dumper($data), $type); + + if ($type eq 'DateTime') { + return DateTime->from_epoch(epoch => str2time($data)); + } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + return $data; + } else { # hash(model) + my $_instance = eval "WWW::SwaggerClient::Object::$type->new()"; + return $_instance->from_hash($data); + } +} + + + __PACKAGE__->class_documentation({description => '', class => 'Tag', required => [], # TODO @@ -54,4 +133,5 @@ __PACKAGE__->attribute_map( { __PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); + 1; diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/User.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/User.pm index cb431b1e059f..3e7fd312141e 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/User.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/User.pm @@ -11,7 +11,9 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -use base "WWW::SwaggerClient::Object::BaseObject"; +#use base "WWW::SwaggerClient::Object::BaseObject"; +use base ("Class::Accessor", "Class::Data::Inheritable"); + # # @@ -19,6 +21,83 @@ use base "WWW::SwaggerClient::Object::BaseObject"; #NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. # +__PACKAGE__->mk_classdata('attribute_map' => {}); +__PACKAGE__->mk_classdata('swagger_types' => {}); +__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata('class_documentation' => {}); + +# new object +sub new { + my ($class, %args) = @_; + + my $self = bless {}, $class; + + foreach my $attribute (keys %{$class->attribute_map}) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{ $args_key } ); + } + + return $self; +} + +# return perl hash +sub to_hash { + return decode_json(JSON->new->convert_blessed->encode( shift )); +} + +# used by JSON for serialization +sub TO_JSON { + my $self = shift; + my $_data = {}; + foreach my $_key (keys %{$self->attribute_map}) { + if (defined $self->{$_key}) { + $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + } + } + return $_data; +} + +# from Perl hashref +sub from_hash { + my ($self, $hash) = @_; + + # loop through attributes and use swagger_types to deserialize the data + while ( my ($_key, $_type) = each %{$self->swagger_types} ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ($_type =~ /^array\[/i) { # array + my $_subclass = substr($_type, 6, -1); + my @_array = (); + foreach my $_element (@{$hash->{$_json_attribute}}) { + push @_array, $self->_deserialize($_subclass, $_element); + } + $self->{$_key} = \@_array; + } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime + $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); + } else { + $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + } + + return $self; +} + +# deserialize non-array data +sub _deserialize { + my ($self, $type, $data) = @_; + $log->debugf("deserializing %s with %s",Dumper($data), $type); + + if ($type eq 'DateTime') { + return DateTime->from_epoch(epoch => str2time($data)); + } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + return $data; + } else { # hash(model) + my $_instance = eval "WWW::SwaggerClient::Object::$type->new()"; + return $_instance->from_hash($data); + } +} + + + __PACKAGE__->class_documentation({description => '', class => 'User', required => [], # TODO @@ -108,4 +187,5 @@ __PACKAGE__->attribute_map( { __PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); + 1; diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/PetApi.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/PetApi.pm index 06ccfca98e80..7cceeca62fd8 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/PetApi.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/PetApi.pm @@ -567,6 +567,65 @@ sub delete_pet { } +# +# download_file +# +# downloads an image +# +{ + my $params = { + }; + __PACKAGE__->method_documentation->{ download_file } = { + summary => 'downloads an image', + params => $params, + returns => 'File', + }; +} +# @return File +# +sub download_file { + my ($self, %args) = @_; + + + + # parse inputs + my $_resource_path = '/pet/{petId}/downloadImage'; + $_resource_path =~ s/{format}/json/; # default format to json + + my $_method = 'GET'; + my $query_params = {}; + my $header_params = {}; + my $form_params = {}; + + # 'Accept' and 'Content-Type' header + my $_header_accept = $self->{api_client}->select_header_accept('application/octet-stream'); + if ($_header_accept) { + $header_params->{'Accept'} = $_header_accept; + } + $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + + + + + + my $_body_data; + + + # authentication setting, if any + my $auth_settings = [qw()]; + + # make the API Call + my $response = $self->{api_client}->call_api($_resource_path, $_method, + $query_params, $form_params, + $header_params, $_body_data, $auth_settings); + if (!$response) { + return; + } + my $_response_object = $self->{api_client}->deserialize('File', $response); + return $_response_object; + +} + # # upload_file # diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm index 941d9e0ce246..cfe13ba5e216 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm @@ -37,7 +37,7 @@ has version_info => ( is => 'ro', default => sub { { app_name => 'Swagger Petstore', app_version => '1.0.0', - generated_date => '2015-11-20T17:35:18.902+08:00', + generated_date => '2015-12-28T16:00:32.828+08:00', generator_class => 'class io.swagger.codegen.languages.PerlClientCodegen', } }, documentation => 'Information about the application version and the codegen codebase version' @@ -103,7 +103,7 @@ Automatically generated by the Perl Swagger Codegen project: =over 4 -=item Build date: 2015-11-20T17:35:18.902+08:00 +=item Build date: 2015-12-28T16:00:32.828+08:00 =item Build package: class io.swagger.codegen.languages.PerlClientCodegen From 7b10023784136ff1eae9b0391e0ec52e66885308 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 28 Dec 2015 16:12:18 +0800 Subject: [PATCH 51/82] update perl sample --- samples/client/petstore/perl/README.md | 2 +- .../lib/WWW/SwaggerClient/Object/Category.pm | 8 +-- .../perl/lib/WWW/SwaggerClient/PetApi.pm | 59 ------------------- .../perl/lib/WWW/SwaggerClient/Role.pm | 4 +- 4 files changed, 7 insertions(+), 66 deletions(-) diff --git a/samples/client/petstore/perl/README.md b/samples/client/petstore/perl/README.md index d07bf6f71216..5468824638bb 100644 --- a/samples/client/petstore/perl/README.md +++ b/samples/client/petstore/perl/README.md @@ -8,7 +8,7 @@ WWW::SwaggerClient::Role - a Moose role for the Swagger Petstore Automatically generated by the Perl Swagger Codegen project: -- Build date: 2015-12-28T16:00:32.828+08:00 +- Build date: 2015-12-28T16:09:37.489+08:00 - Build package: class io.swagger.codegen.languages.PerlClientCodegen - Codegen version: diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm index 77dd19a7caf2..a1b2b4af09c3 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm @@ -21,10 +21,10 @@ use base ("Class::Accessor", "Class::Data::Inheritable"); #NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. # -#__PACKAGE__->mk_classdata('attribute_map' => {}); -#__PACKAGE__->mk_classdata('swagger_types' => {}); -#__PACKAGE__->mk_classdata('method_documentation' => {}); -#__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata('attribute_map' => {}); +__PACKAGE__->mk_classdata('swagger_types' => {}); +__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata('class_documentation' => {}); # new object sub new { diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/PetApi.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/PetApi.pm index 7cceeca62fd8..06ccfca98e80 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/PetApi.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/PetApi.pm @@ -567,65 +567,6 @@ sub delete_pet { } -# -# download_file -# -# downloads an image -# -{ - my $params = { - }; - __PACKAGE__->method_documentation->{ download_file } = { - summary => 'downloads an image', - params => $params, - returns => 'File', - }; -} -# @return File -# -sub download_file { - my ($self, %args) = @_; - - - - # parse inputs - my $_resource_path = '/pet/{petId}/downloadImage'; - $_resource_path =~ s/{format}/json/; # default format to json - - my $_method = 'GET'; - my $query_params = {}; - my $header_params = {}; - my $form_params = {}; - - # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/octet-stream'); - if ($_header_accept) { - $header_params->{'Accept'} = $_header_accept; - } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); - - - - - - my $_body_data; - - - # authentication setting, if any - my $auth_settings = [qw()]; - - # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { - return; - } - my $_response_object = $self->{api_client}->deserialize('File', $response); - return $_response_object; - -} - # # upload_file # diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm index cfe13ba5e216..dfc004ebc3d8 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm @@ -37,7 +37,7 @@ has version_info => ( is => 'ro', default => sub { { app_name => 'Swagger Petstore', app_version => '1.0.0', - generated_date => '2015-12-28T16:00:32.828+08:00', + generated_date => '2015-12-28T16:09:37.489+08:00', generator_class => 'class io.swagger.codegen.languages.PerlClientCodegen', } }, documentation => 'Information about the application version and the codegen codebase version' @@ -103,7 +103,7 @@ Automatically generated by the Perl Swagger Codegen project: =over 4 -=item Build date: 2015-12-28T16:00:32.828+08:00 +=item Build date: 2015-12-28T16:09:37.489+08:00 =item Build package: class io.swagger.codegen.languages.PerlClientCodegen From d6125483cf92b3e2cf9695b1374dc4b6321073b1 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 28 Dec 2015 16:32:41 +0800 Subject: [PATCH 52/82] remove commented code in perl --- .../java/io/swagger/codegen/languages/PerlClientCodegen.java | 1 - .../swagger-codegen/src/main/resources/perl/object.mustache | 1 - samples/client/petstore/perl/README.md | 2 +- .../petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm | 1 - .../petstore/perl/lib/WWW/SwaggerClient/Object/Order.pm | 1 - .../client/petstore/perl/lib/WWW/SwaggerClient/Object/Pet.pm | 1 - .../client/petstore/perl/lib/WWW/SwaggerClient/Object/Tag.pm | 1 - .../client/petstore/perl/lib/WWW/SwaggerClient/Object/User.pm | 1 - samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm | 4 ++-- 9 files changed, 3 insertions(+), 10 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java index 2e220841f5db..51f394d5db32 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java @@ -97,7 +97,6 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("ApiClient.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "ApiClient.pm")); supportingFiles.add(new SupportingFile("Configuration.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "Configuration.pm")); - //supportingFiles.add(new SupportingFile("BaseObject.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "Object/BaseObject.pm")); supportingFiles.add(new SupportingFile("ApiFactory.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "ApiFactory.pm")); supportingFiles.add(new SupportingFile("Role.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "Role.pm")); supportingFiles.add(new SupportingFile("AutoDoc.mustache", ("lib/WWW/" + moduleName + "/Role").replace('/', File.separatorChar), "AutoDoc.pm")); diff --git a/modules/swagger-codegen/src/main/resources/perl/object.mustache b/modules/swagger-codegen/src/main/resources/perl/object.mustache index 95af03e09d38..d2e1b2a2a505 100644 --- a/modules/swagger-codegen/src/main/resources/perl/object.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/object.mustache @@ -13,7 +13,6 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -#use base "WWW::{{moduleName}}::Object::BaseObject"; use base ("Class::Accessor", "Class::Data::Inheritable"); diff --git a/samples/client/petstore/perl/README.md b/samples/client/petstore/perl/README.md index 5468824638bb..4cf6dc854702 100644 --- a/samples/client/petstore/perl/README.md +++ b/samples/client/petstore/perl/README.md @@ -8,7 +8,7 @@ WWW::SwaggerClient::Role - a Moose role for the Swagger Petstore Automatically generated by the Perl Swagger Codegen project: -- Build date: 2015-12-28T16:09:37.489+08:00 +- Build date: 2015-12-28T16:30:58.036+08:00 - Build package: class io.swagger.codegen.languages.PerlClientCodegen - Codegen version: diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm index a1b2b4af09c3..39767d613edd 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Category.pm @@ -11,7 +11,6 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -#use base "WWW::SwaggerClient::Object::BaseObject"; use base ("Class::Accessor", "Class::Data::Inheritable"); diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Order.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Order.pm index cbb7a21c26c9..500218017bc2 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Order.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Order.pm @@ -11,7 +11,6 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -#use base "WWW::SwaggerClient::Object::BaseObject"; use base ("Class::Accessor", "Class::Data::Inheritable"); diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Pet.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Pet.pm index f1f49e85f5e8..eadf72be0054 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Pet.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Pet.pm @@ -11,7 +11,6 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -#use base "WWW::SwaggerClient::Object::BaseObject"; use base ("Class::Accessor", "Class::Data::Inheritable"); diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Tag.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Tag.pm index dd84157915bb..e114c1e1ec03 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Tag.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/Tag.pm @@ -11,7 +11,6 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -#use base "WWW::SwaggerClient::Object::BaseObject"; use base ("Class::Accessor", "Class::Data::Inheritable"); diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/User.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/User.pm index 3e7fd312141e..463424288d82 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/User.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Object/User.pm @@ -11,7 +11,6 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -#use base "WWW::SwaggerClient::Object::BaseObject"; use base ("Class::Accessor", "Class::Data::Inheritable"); diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm index dfc004ebc3d8..4b4d5144f58d 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm @@ -37,7 +37,7 @@ has version_info => ( is => 'ro', default => sub { { app_name => 'Swagger Petstore', app_version => '1.0.0', - generated_date => '2015-12-28T16:09:37.489+08:00', + generated_date => '2015-12-28T16:30:58.036+08:00', generator_class => 'class io.swagger.codegen.languages.PerlClientCodegen', } }, documentation => 'Information about the application version and the codegen codebase version' @@ -103,7 +103,7 @@ Automatically generated by the Perl Swagger Codegen project: =over 4 -=item Build date: 2015-12-28T16:09:37.489+08:00 +=item Build date: 2015-12-28T16:30:58.036+08:00 =item Build package: class io.swagger.codegen.languages.PerlClientCodegen From 670e56f692e7ba5d85884ff642f593d33b42f428 Mon Sep 17 00:00:00 2001 From: xhh Date: Mon, 28 Dec 2015 17:42:33 +0800 Subject: [PATCH 53/82] Remove base_object from Ruby model and move methods from base_object to each model so that model files will have no dependency when generating "models only" --- .../codegen/languages/RubyClientCodegen.java | 1 - .../main/resources/ruby/base_object.mustache | 9 -- .../src/main/resources/ruby/gem.mustache | 1 - .../src/main/resources/ruby/model.mustache | 6 +- samples/client/petstore/ruby/lib/petstore.rb | 1 - .../ruby/lib/petstore/models/base_object.rb | 99 ------------------- .../ruby/lib/petstore/models/category.rb | 96 +++++++++++++++++- .../ruby/lib/petstore/models/order.rb | 96 +++++++++++++++++- .../petstore/ruby/lib/petstore/models/pet.rb | 96 +++++++++++++++++- .../petstore/ruby/lib/petstore/models/tag.rb | 96 +++++++++++++++++- .../petstore/ruby/lib/petstore/models/user.rb | 96 +++++++++++++++++- .../petstore/ruby/spec/base_object_spec.rb | 6 +- 12 files changed, 483 insertions(+), 120 deletions(-) delete mode 100644 samples/client/petstore/ruby/lib/petstore/models/base_object.rb diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java index 25f0521c5f8c..d292362e2b94 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java @@ -127,7 +127,6 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("configuration.mustache", gemFolder, "configuration.rb")); supportingFiles.add(new SupportingFile("version.mustache", gemFolder, "version.rb")); String modelFolder = gemFolder + File.separator + modelPackage.replace("/", File.separator); - supportingFiles.add(new SupportingFile("base_object.mustache", modelFolder, "base_object.rb")); } @Override diff --git a/modules/swagger-codegen/src/main/resources/ruby/base_object.mustache b/modules/swagger-codegen/src/main/resources/ruby/base_object.mustache index ddb68998e9eb..d4ea5b334a62 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/base_object.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/base_object.mustache @@ -1,9 +1,3 @@ -require 'date' - -module {{moduleName}} - # base class containing fundamental method such as to_hash, build_from_hash and more - class BaseObject - # build the object from hash def build_from_hash(attributes) return nil unless attributes.is_a?(Hash) @@ -94,6 +88,3 @@ module {{moduleName}} value end end - - end -end diff --git a/modules/swagger-codegen/src/main/resources/ruby/gem.mustache b/modules/swagger-codegen/src/main/resources/ruby/gem.mustache index 2000b2be86f1..ec5ee0ac17c3 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/gem.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/gem.mustache @@ -5,7 +5,6 @@ require '{{gemName}}/version' require '{{gemName}}/configuration' # Models -require '{{gemName}}/{{modelPackage}}/base_object' {{#models}} require '{{importPath}}' {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/ruby/model.mustache b/modules/swagger-codegen/src/main/resources/ruby/model.mustache index f253a2c0e60f..21de688e525c 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/model.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/model.mustache @@ -1,6 +1,8 @@ +require 'date' + module {{moduleName}}{{#models}}{{#model}}{{#description}} # {{{description}}}{{/description}} - class {{classname}} < BaseObject{{#vars}}{{#description}} + class {{classname}}{{#vars}}{{#description}} # {{{description}}}{{/description}} attr_accessor :{{{name}}} {{/vars}} @@ -64,6 +66,8 @@ module {{moduleName}}{{#models}}{{#model}}{{#description}} def hash [{{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}].hash end + +{{> base_object}} end {{/model}} {{/models}} diff --git a/samples/client/petstore/ruby/lib/petstore.rb b/samples/client/petstore/ruby/lib/petstore.rb index 4c21fb331d3f..82cc9a8c4fc8 100644 --- a/samples/client/petstore/ruby/lib/petstore.rb +++ b/samples/client/petstore/ruby/lib/petstore.rb @@ -5,7 +5,6 @@ require 'petstore/version' require 'petstore/configuration' # Models -require 'petstore/models/base_object' require 'petstore/models/user' require 'petstore/models/category' require 'petstore/models/pet' diff --git a/samples/client/petstore/ruby/lib/petstore/models/base_object.rb b/samples/client/petstore/ruby/lib/petstore/models/base_object.rb deleted file mode 100644 index af0ec63e79f4..000000000000 --- a/samples/client/petstore/ruby/lib/petstore/models/base_object.rb +++ /dev/null @@ -1,99 +0,0 @@ -require 'date' - -module Petstore - # base class containing fundamental method such as to_hash, build_from_hash and more - class BaseObject - - # build the object from hash - def build_from_hash(attributes) - return nil unless attributes.is_a?(Hash) - self.class.swagger_types.each_pair do |key, type| - if type =~ /^Array<(.*)>/i - if attributes[self.class.attribute_map[key]].is_a?(Array) - self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } ) - else - #TODO show warning in debug mode - end - elsif !attributes[self.class.attribute_map[key]].nil? - self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]])) - else - # data not found in attributes(hash), not an issue as the data can be optional - end - end - - self - end - - def _deserialize(type, value) - case type.to_sym - when :DateTime - DateTime.parse(value) - when :Date - Date.parse(value) - when :String - value.to_s - when :Integer - value.to_i - when :Float - value.to_f - when :BOOLEAN - if value =~ /^(true|t|yes|y|1)$/i - true - else - false - end - when /\AArray<(?.+)>\z/ - inner_type = Regexp.last_match[:inner_type] - value.map { |v| _deserialize(inner_type, v) } - when /\AHash<(?.+), (?.+)>\z/ - k_type = Regexp.last_match[:k_type] - v_type = Regexp.last_match[:v_type] - {}.tap do |hash| - value.each do |k, v| - hash[_deserialize(k_type, k)] = _deserialize(v_type, v) - end - end - else # model - _model = Petstore.const_get(type).new - _model.build_from_hash(value) - end - end - - def to_s - to_hash.to_s - end - - # to_body is an alias to to_body (backward compatibility)) - def to_body - to_hash - end - - # return the object in the form of hash - def to_hash - hash = {} - self.class.attribute_map.each_pair do |attr, param| - value = self.send(attr) - next if value.nil? - hash[param] = _to_hash(value) - end - hash - end - - # Method to output non-array value in the form of hash - # For object, use to_hash. Otherwise, just return the value - def _to_hash(value) - if value.is_a?(Array) - value.compact.map{ |v| _to_hash(v) } - elsif value.is_a?(Hash) - {}.tap do |hash| - value.each { |k, v| hash[k] = _to_hash(v) } - end - elsif value.respond_to? :to_hash - value.to_hash - else - value - end - end - - end -end diff --git a/samples/client/petstore/ruby/lib/petstore/models/category.rb b/samples/client/petstore/ruby/lib/petstore/models/category.rb index e223e747e747..2e6effd24c02 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/category.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/category.rb @@ -1,5 +1,7 @@ +require 'date' + module Petstore - class Category < BaseObject + class Category attr_accessor :id attr_accessor :name @@ -58,5 +60,97 @@ module Petstore def hash [id, name].hash end + + # build the object from hash + def build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + self.class.swagger_types.each_pair do |key, type| + if type =~ /^Array<(.*)>/i + if attributes[self.class.attribute_map[key]].is_a?(Array) + self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } ) + else + #TODO show warning in debug mode + end + elsif !attributes[self.class.attribute_map[key]].nil? + self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]])) + else + # data not found in attributes(hash), not an issue as the data can be optional + end + end + + self + end + + def _deserialize(type, value) + case type.to_sym + when :DateTime + DateTime.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :BOOLEAN + if value =~ /^(true|t|yes|y|1)$/i + true + else + false + end + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + _model = Petstore.const_get(type).new + _model.build_from_hash(value) + end + end + + def to_s + to_hash.to_s + end + + # to_body is an alias to to_body (backward compatibility)) + def to_body + to_hash + end + + # return the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + next if value.nil? + hash[param] = _to_hash(value) + end + hash + end + + # Method to output non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + def _to_hash(value) + if value.is_a?(Array) + value.compact.map{ |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + end end diff --git a/samples/client/petstore/ruby/lib/petstore/models/order.rb b/samples/client/petstore/ruby/lib/petstore/models/order.rb index 19a33d1cfc30..0ff43744c75a 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/order.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/order.rb @@ -1,5 +1,7 @@ +require 'date' + module Petstore - class Order < BaseObject + class Order attr_accessor :id attr_accessor :pet_id @@ -108,5 +110,97 @@ module Petstore def hash [id, pet_id, quantity, ship_date, status, complete].hash end + + # build the object from hash + def build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + self.class.swagger_types.each_pair do |key, type| + if type =~ /^Array<(.*)>/i + if attributes[self.class.attribute_map[key]].is_a?(Array) + self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } ) + else + #TODO show warning in debug mode + end + elsif !attributes[self.class.attribute_map[key]].nil? + self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]])) + else + # data not found in attributes(hash), not an issue as the data can be optional + end + end + + self + end + + def _deserialize(type, value) + case type.to_sym + when :DateTime + DateTime.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :BOOLEAN + if value =~ /^(true|t|yes|y|1)$/i + true + else + false + end + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + _model = Petstore.const_get(type).new + _model.build_from_hash(value) + end + end + + def to_s + to_hash.to_s + end + + # to_body is an alias to to_body (backward compatibility)) + def to_body + to_hash + end + + # return the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + next if value.nil? + hash[param] = _to_hash(value) + end + hash + end + + # Method to output non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + def _to_hash(value) + if value.is_a?(Array) + value.compact.map{ |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + end end diff --git a/samples/client/petstore/ruby/lib/petstore/models/pet.rb b/samples/client/petstore/ruby/lib/petstore/models/pet.rb index fb967cbbab4f..cba403d7e280 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/pet.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/pet.rb @@ -1,5 +1,7 @@ +require 'date' + module Petstore - class Pet < BaseObject + class Pet attr_accessor :id attr_accessor :category @@ -112,5 +114,97 @@ module Petstore def hash [id, category, name, photo_urls, tags, status].hash end + + # build the object from hash + def build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + self.class.swagger_types.each_pair do |key, type| + if type =~ /^Array<(.*)>/i + if attributes[self.class.attribute_map[key]].is_a?(Array) + self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } ) + else + #TODO show warning in debug mode + end + elsif !attributes[self.class.attribute_map[key]].nil? + self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]])) + else + # data not found in attributes(hash), not an issue as the data can be optional + end + end + + self + end + + def _deserialize(type, value) + case type.to_sym + when :DateTime + DateTime.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :BOOLEAN + if value =~ /^(true|t|yes|y|1)$/i + true + else + false + end + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + _model = Petstore.const_get(type).new + _model.build_from_hash(value) + end + end + + def to_s + to_hash.to_s + end + + # to_body is an alias to to_body (backward compatibility)) + def to_body + to_hash + end + + # return the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + next if value.nil? + hash[param] = _to_hash(value) + end + hash + end + + # Method to output non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + def _to_hash(value) + if value.is_a?(Array) + value.compact.map{ |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + end end diff --git a/samples/client/petstore/ruby/lib/petstore/models/tag.rb b/samples/client/petstore/ruby/lib/petstore/models/tag.rb index 681c2a2a5c94..a821b665d178 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/tag.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/tag.rb @@ -1,5 +1,7 @@ +require 'date' + module Petstore - class Tag < BaseObject + class Tag attr_accessor :id attr_accessor :name @@ -58,5 +60,97 @@ module Petstore def hash [id, name].hash end + + # build the object from hash + def build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + self.class.swagger_types.each_pair do |key, type| + if type =~ /^Array<(.*)>/i + if attributes[self.class.attribute_map[key]].is_a?(Array) + self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } ) + else + #TODO show warning in debug mode + end + elsif !attributes[self.class.attribute_map[key]].nil? + self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]])) + else + # data not found in attributes(hash), not an issue as the data can be optional + end + end + + self + end + + def _deserialize(type, value) + case type.to_sym + when :DateTime + DateTime.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :BOOLEAN + if value =~ /^(true|t|yes|y|1)$/i + true + else + false + end + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + _model = Petstore.const_get(type).new + _model.build_from_hash(value) + end + end + + def to_s + to_hash.to_s + end + + # to_body is an alias to to_body (backward compatibility)) + def to_body + to_hash + end + + # return the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + next if value.nil? + hash[param] = _to_hash(value) + end + hash + end + + # Method to output non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + def _to_hash(value) + if value.is_a?(Array) + value.compact.map{ |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + end end diff --git a/samples/client/petstore/ruby/lib/petstore/models/user.rb b/samples/client/petstore/ruby/lib/petstore/models/user.rb index ca00bf34be13..1959adeaa422 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/user.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/user.rb @@ -1,5 +1,7 @@ +require 'date' + module Petstore - class User < BaseObject + class User attr_accessor :id attr_accessor :username @@ -119,5 +121,97 @@ module Petstore def hash [id, username, first_name, last_name, email, password, phone, user_status].hash end + + # build the object from hash + def build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + self.class.swagger_types.each_pair do |key, type| + if type =~ /^Array<(.*)>/i + if attributes[self.class.attribute_map[key]].is_a?(Array) + self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } ) + else + #TODO show warning in debug mode + end + elsif !attributes[self.class.attribute_map[key]].nil? + self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]])) + else + # data not found in attributes(hash), not an issue as the data can be optional + end + end + + self + end + + def _deserialize(type, value) + case type.to_sym + when :DateTime + DateTime.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :BOOLEAN + if value =~ /^(true|t|yes|y|1)$/i + true + else + false + end + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + _model = Petstore.const_get(type).new + _model.build_from_hash(value) + end + end + + def to_s + to_hash.to_s + end + + # to_body is an alias to to_body (backward compatibility)) + def to_body + to_hash + end + + # return the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + next if value.nil? + hash[param] = _to_hash(value) + end + hash + end + + # Method to output non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + def _to_hash(value) + if value.is_a?(Array) + value.compact.map{ |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + end end diff --git a/samples/client/petstore/ruby/spec/base_object_spec.rb b/samples/client/petstore/ruby/spec/base_object_spec.rb index 313d47f5d54f..a2614ba9c168 100644 --- a/samples/client/petstore/ruby/spec/base_object_spec.rb +++ b/samples/client/petstore/ruby/spec/base_object_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -class ArrayMapObject < Petstore::BaseObject +class ArrayMapObject < Petstore::Category attr_accessor :int_arr, :pet_arr, :int_map, :pet_map, :int_arr_map, :pet_arr_map def self.attribute_map @@ -27,7 +27,7 @@ class ArrayMapObject < Petstore::BaseObject end -describe Petstore::BaseObject do +describe 'BaseObject' do describe 'array and map properties' do let(:obj) { ArrayMapObject.new } @@ -78,4 +78,4 @@ describe Petstore::BaseObject do obj.to_hash.should == data end end -end \ No newline at end of file +end From 7a63dd141659aba513a1944d067abc8dd0be99f9 Mon Sep 17 00:00:00 2001 From: Kirill Vlasov Date: Tue, 15 Dec 2015 14:20:15 +0500 Subject: [PATCH 54/82] Fixing pmd:RedundantFieldInitializer - Redundant Field Initializer --- .../src/main/java/io/swagger/codegen/CodegenProperty.java | 2 +- .../src/main/java/io/swagger/codegen/DefaultCodegen.java | 4 ++-- .../main/java/io/swagger/codegen/DefaultGenerator.java | 4 ++-- .../main/java/io/swagger/codegen/InlineModelResolver.java | 8 ++++---- .../io/swagger/codegen/config/CodegenConfigurator.java | 4 ++-- .../codegen/languages/AsyncScalaClientCodegen.java | 2 +- .../swagger/codegen/languages/ClojureClientCodegen.java | 8 ++++---- .../io/swagger/codegen/languages/FlashClientCodegen.java | 2 +- .../io/swagger/codegen/languages/JavaClientCodegen.java | 2 +- .../codegen/languages/JavascriptClientCodegen.java | 8 ++++---- .../io/swagger/codegen/languages/PythonClientCodegen.java | 4 ++-- .../io/swagger/codegen/languages/RubyClientCodegen.java | 4 ++-- .../io/swagger/codegen/languages/ScalaClientCodegen.java | 2 +- .../swagger/codegen/languages/SinatraServerCodegen.java | 4 ++-- .../java/io/swagger/codegen/languages/SwiftCodegen.java | 2 +- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java index 32e169ac8782..32a12cdb21b3 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java @@ -31,7 +31,7 @@ public class CodegenProperty { public Double maximum; public Boolean exclusiveMinimum; public Boolean exclusiveMaximum; - public Boolean hasMore = null, required = null, secondaryParam = null; + public Boolean hasMore, required, secondaryParam; public Boolean isPrimitiveType, isContainer, isNotContainer; public boolean isEnum; public Boolean isReadOnly = false; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index dd8d9aefa902..d9c7b4f26815 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -71,9 +71,9 @@ public class DefaultCodegen { protected List supportingFiles = new ArrayList(); protected List cliOptions = new ArrayList(); protected boolean skipOverwrite; - protected boolean supportsInheritance = false; + protected boolean supportsInheritance; protected Map supportedLibraries = new LinkedHashMap(); - protected String library = null; + protected String library; protected Boolean sortParamsByRequiredFlag = true; protected Boolean ensureUniqueParams = true; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index 3623361387ed..2c5ca67198c7 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -22,8 +22,8 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Logger LOGGER = LoggerFactory.getLogger(DefaultGenerator.class); protected CodegenConfig config; - protected ClientOptInput opts = null; - protected Swagger swagger = null; + protected ClientOptInput opts; + protected Swagger swagger; @Override public Generator opts(ClientOptInput opts) { diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java index 6471a0688a8d..2e698162182d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java @@ -17,8 +17,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class InlineModelResolver { - private Swagger swagger = null; - private boolean skipMatches = false; + private Swagger swagger; + private boolean skipMatches; static Logger LOGGER = LoggerFactory.getLogger(InlineModelResolver.class); Map addedModels = new HashMap(); @@ -118,8 +118,8 @@ public class InlineModelResolver { ap.setItems(new RefProperty(modelName)); addGenerated(modelName, innerModel); swagger.addDefinition(modelName, innerModel); - } - } + } + } } else if (property instanceof MapProperty) { MapProperty mp = (MapProperty) property; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java index ad892917c701..8771d10aebe4 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java @@ -41,8 +41,8 @@ public class CodegenConfigurator { private String lang; private String inputSpec; private String outputDir; - private boolean verbose = false; - private boolean skipOverwrite = false; + private boolean verbose; + private boolean skipOverwrite; private String templateDir; private String auth; private String apiPackage; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java index 36309c9ee52f..310b4788dd08 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java @@ -33,7 +33,7 @@ public class AsyncScalaClientCodegen extends DefaultCodegen implements CodegenCo protected String sourceFolder = "src/main/scala"; protected String clientName = "SwaggerClient"; protected String authScheme = ""; - protected boolean authPreemptive = false; + protected boolean authPreemptive; protected boolean asyncHttpClient = !authScheme.isEmpty(); public AsyncScalaClientCodegen() { diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java index c8b581b3d3a4..d4a8ada06b97 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java @@ -26,10 +26,10 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi private static final String PROJECT_LICENSE_URL = "projectLicenseUrl"; private static final String BASE_NAMESPACE = "baseNamespace"; - protected String projectName = null; - protected String projectDescription = null; - protected String projectVersion = null; - protected String baseNamespace = null; + protected String projectName; + protected String projectDescription; + protected String projectVersion; + protected String baseNamespace; protected String sourceFolder = "src"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java index 44c2b9cb09e7..dac3d23b22ac 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java @@ -26,7 +26,7 @@ import java.util.HashSet; public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig { protected String packageName = "io.swagger"; - protected String packageVersion = null; + protected String packageVersion; protected String invokerPackage = "io.swagger"; protected String sourceFolder = "src/main/flex"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java index e408641c8a62..282fa7c68ce7 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java @@ -52,7 +52,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { protected String projectFolder = "src" + File.separator + "main"; protected String sourceFolder = projectFolder + File.separator + "java"; protected String localVariablePrefix = ""; - protected boolean fullJavaUtil = false; + protected boolean fullJavaUtil; protected String javaUtilPrefix = ""; protected Boolean serializableModel = false; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 67b99bbd2828..ac680d594632 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -40,10 +40,10 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo private static final String PROJECT_VERSION = "projectVersion"; private static final String PROJECT_LICENSE_NAME = "projectLicenseName"; - protected String projectName = null; - protected String moduleName = null; - protected String projectDescription = null; - protected String projectVersion = null; + protected String projectName; + protected String moduleName; + protected String projectDescription; + protected String projectVersion; protected String sourceFolder = "src"; protected String localVariablePrefix = ""; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java index d7fdd39239af..5ac251ed02fc 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java @@ -15,8 +15,8 @@ import java.util.HashSet; import org.apache.commons.lang.StringUtils; public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig { - protected String packageName = null; - protected String packageVersion = null; + protected String packageName; + protected String packageVersion; public PythonClientCodegen() { super(); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java index 25f0521c5f8c..a85b6e152d0b 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java @@ -19,8 +19,8 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { public static final String GEM_NAME = "gemName"; public static final String MODULE_NAME = "moduleName"; public static final String GEM_VERSION = "gemVersion"; - protected String gemName = null; - protected String moduleName = null; + protected String gemName; + protected String moduleName; protected String gemVersion = "1.0.0"; protected String libFolder = "lib"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java index 8d917430d3ce..9469cbb8e819 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java @@ -35,7 +35,7 @@ public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig protected String artifactVersion = "1.0.0"; protected String sourceFolder = "src/main/scala"; protected String authScheme = ""; - protected boolean authPreemptive = false; + protected boolean authPreemptive; protected boolean asyncHttpClient = !authScheme.isEmpty(); public ScalaClientCodegen() { diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java index 44f97009371b..e478c00341e2 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java @@ -21,8 +21,8 @@ import java.util.Map; import org.apache.commons.lang.StringUtils; public class SinatraServerCodegen extends DefaultCodegen implements CodegenConfig { - protected String gemName = null; - protected String moduleName = null; + protected String gemName; + protected String moduleName; protected String gemVersion = "1.0.0"; protected String libFolder = "lib"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java index e951cfb76d3b..ddd72e4230b3 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java @@ -40,7 +40,7 @@ public class SwiftCodegen extends DefaultCodegen implements CodegenConfig { protected static final String LIBRARY_PROMISE_KIT = "PromiseKit"; protected static final String[] RESPONSE_LIBRARIES = { LIBRARY_PROMISE_KIT }; protected String projectName = "SwaggerClient"; - protected boolean unwrapRequired = false; + protected boolean unwrapRequired; protected String[] responseAs = new String[0]; protected String sourceFolder = "Classes" + File.separator + "Swaggers"; private static final Pattern PATH_PARAM_PATTERN = Pattern.compile("\\{[a-zA-Z_]+\\}"); From 861ea27db736b7fb26492ff4e84ef00792a01126 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 29 Dec 2015 00:01:18 +0800 Subject: [PATCH 55/82] update pom commonio to latest version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 64f3b7eb5ce3..33b7e2c1f89b 100644 --- a/pom.xml +++ b/pom.xml @@ -573,7 +573,7 @@ 2.3.4 1.5.5 2.1.5-SNAPSHOT - 2.3 + 2.4 1.2 4.8.1 1.0.0 From 3103846f451d7fb9fa9ac6fcfa4007ef59f15d32 Mon Sep 17 00:00:00 2001 From: Ian Chan Date: Tue, 29 Dec 2015 13:40:46 +1300 Subject: [PATCH 56/82] Enforce Java 1.8 when generating spring-mvc with j8-async option The spring-mvc j8-async code is now located in it's own sample directory with Java 8 enforced via Maven plug-in. --- bin/spring-mvc-petstore-j8-async-server.sh | 2 +- .../languages/SpringMVCServerCodegen.java | 12 ++ .../JavaSpringMVC/pom-j8-async.mustache | 172 ++++++++++++++++++ 3 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 modules/swagger-codegen/src/main/resources/JavaSpringMVC/pom-j8-async.mustache diff --git a/bin/spring-mvc-petstore-j8-async-server.sh b/bin/spring-mvc-petstore-j8-async-server.sh index 435c29ac0703..d43b0c432865 100755 --- a/bin/spring-mvc-petstore-j8-async-server.sh +++ b/bin/spring-mvc-petstore-j8-async-server.sh @@ -26,6 +26,6 @@ fi # if you've executed sbt assembly previously it will use that instead. export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" -ags="$@ generate -t modules/swagger-codegen/src/main/resources/JavaSpringMVC -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l spring-mvc -o samples/server/petstore/spring-mvc -c bin/spring-mvc-petstore-j8-async.json" +ags="$@ generate -t modules/swagger-codegen/src/main/resources/JavaSpringMVC -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l spring-mvc -o samples/server/petstore/spring-mvc-j8-async -c bin/spring-mvc-petstore-j8-async.json" java $JAVA_OPTS -jar $executable $ags diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java index 23ffe6c0fc4b..b68c9dd98996 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java @@ -178,6 +178,18 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen apiTemplateFiles.remove(this.templateFileName); this.templateFileName = "api-j8-async.mustache"; apiTemplateFiles.put(this.templateFileName, ".java"); + + int originalPomFileIdx = -1; + for (int i = 0; i < supportingFiles.size(); i++) { + if ("pom.xml".equals(supportingFiles.get(i).destinationFilename)) { + originalPomFileIdx = i; + break; + } + } + if (originalPomFileIdx > -1) { + supportingFiles.remove(originalPomFileIdx); + } + supportingFiles.add(new SupportingFile("pom-j8-async.mustache", "", "pom.xml")); } return objs; diff --git a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/pom-j8-async.mustache b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/pom-j8-async.mustache new file mode 100644 index 000000000000..566a4c83d8de --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/pom-j8-async.mustache @@ -0,0 +1,172 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + src/main/java + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + maven-failsafe-plugin + 2.6 + + + + integration-test + verify + + + + + + org.eclipse.jetty + jetty-maven-plugin + ${jetty-version} + + + {{^contextPath}}/{{/contextPath}}{{#contextPath}}{{contextPath}}{{/contextPath}} + + target/${project.artifactId}-${project.version} + 8079 + stopit + + 8002 + 60000 + + + + + start-jetty + pre-integration-test + + start + + + 0 + true + + + + stop-jetty + post-integration-test + + stop + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + + + + io.swagger + swagger-jersey-jaxrs + ${swagger-core-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + + + com.sun.jersey + jersey-core + ${jersey-version} + + + com.sun.jersey + jersey-json + ${jersey-version} + + + com.sun.jersey + jersey-servlet + ${jersey-version} + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + + + com.sun.jersey + jersey-server + ${jersey-version} + + + + + org.springframework + spring-core + ${spring-version} + + + org.springframework + spring-webmvc + ${spring-version} + + + org.springframework + spring-web + ${spring-version} + + + + + io.springfox + springfox-swagger2 + ${springfox-version} + + + io.springfox + springfox-swagger-ui + ${springfox-version} + + + + junit + junit + ${junit-version} + test + + + javax.servlet + servlet-api + ${servlet-api-version} + + + + + jcenter-snapshots + jcenter + http://oss.jfrog.org/artifactory/oss-snapshot-local/ + + + + 1.5.4 + 9.2.9.v20150224 + 1.13 + 1.6.3 + 1.6.1 + 4.8.1 + 2.5 + 2.0.4-SNAPSHOT + 4.0.9.RELEASE + + \ No newline at end of file From 3d4b5ff1c74c8e5f8fb7515a5002fcc551c14ec1 Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 29 Dec 2015 12:09:54 +0800 Subject: [PATCH 57/82] Java: Move method StringUtil.toIndentedString to model Closes #1701 --- .../main/resources/Java/StringUtil.mustache | 9 -- .../Java/libraries/okhttp-gson/model.mustache | 17 +++- .../Java/libraries/retrofit/model.mustache | 17 +++- .../Java/libraries/retrofit2/model.mustache | 17 +++- .../src/main/resources/Java/pojo.mustache | 19 +++- .../java/io/swagger/client/StringUtil.java | 11 +-- .../io/swagger/client/model/Category.java | 20 +++- .../java/io/swagger/client/model/Order.java | 28 ++++-- .../java/io/swagger/client/model/Pet.java | 30 ++++-- .../java/io/swagger/client/model/Tag.java | 20 +++- .../java/io/swagger/client/model/User.java | 32 +++++-- .../java/io/swagger/client/StringUtil.java | 11 +-- .../io/swagger/client/model/ApiResponse.java | 92 ------------------- .../io/swagger/client/model/Category.java | 21 ++++- .../java/io/swagger/client/model/Order.java | 29 ++++-- .../java/io/swagger/client/model/Pet.java | 31 +++++-- .../java/io/swagger/client/model/Tag.java | 21 ++++- .../java/io/swagger/client/model/User.java | 33 +++++-- .../java/io/swagger/client/StringUtil.java | 11 +-- .../io/swagger/client/model/Category.java | 21 ++++- .../java/io/swagger/client/model/Order.java | 29 ++++-- .../java/io/swagger/client/model/Pet.java | 31 +++++-- .../java/io/swagger/client/model/Tag.java | 21 ++++- .../java/io/swagger/client/model/User.java | 33 +++++-- .../java/io/swagger/client/StringUtil.java | 11 +-- .../io/swagger/client/model/Category.java | 17 +++- .../java/io/swagger/client/model/Order.java | 25 +++-- .../java/io/swagger/client/model/Pet.java | 25 +++-- .../java/io/swagger/client/model/Tag.java | 17 +++- .../java/io/swagger/client/model/User.java | 29 ++++-- .../java/io/swagger/client/StringUtil.java | 11 +-- .../io/swagger/client/model/ApiResponse.java | 72 --------------- .../io/swagger/client/model/Category.java | 17 +++- .../java/io/swagger/client/model/Order.java | 25 +++-- .../java/io/swagger/client/model/Pet.java | 27 ++++-- .../java/io/swagger/client/model/Tag.java | 17 +++- .../java/io/swagger/client/model/User.java | 29 ++++-- .../client/petstore/java/retrofit2/README.md | 43 +++++++++ .../retrofit2/src/main/AndroidManifest.xml | 3 + .../java/io/swagger/client/StringUtil.java | 11 +-- .../io/swagger/client/model/Category.java | 17 +++- .../java/io/swagger/client/model/Order.java | 25 +++-- .../java/io/swagger/client/model/Pet.java | 27 ++++-- .../java/io/swagger/client/model/Tag.java | 17 +++- .../java/io/swagger/client/model/User.java | 29 ++++-- 45 files changed, 658 insertions(+), 440 deletions(-) delete mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java delete mode 100644 samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/ApiResponse.java create mode 100644 samples/client/petstore/java/retrofit2/README.md create mode 100644 samples/client/petstore/java/retrofit2/src/main/AndroidManifest.xml diff --git a/modules/swagger-codegen/src/main/resources/Java/StringUtil.mustache b/modules/swagger-codegen/src/main/resources/Java/StringUtil.mustache index c9583f1bc636..073966b0c217 100644 --- a/modules/swagger-codegen/src/main/resources/Java/StringUtil.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/StringUtil.mustache @@ -39,13 +39,4 @@ public class StringUtil { } return out.toString(); } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - public static String toIndentedString(Object o) { - if (o == null) return "null"; - return o.toString().replace("\n", "\n "); - } } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache index b7b4ea2cf3f0..0794a94f6dce 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache @@ -65,14 +65,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); {{/vars}}sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache index b7b4ea2cf3f0..0794a94f6dce 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache @@ -65,14 +65,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); {{/vars}}sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache index b7b4ea2cf3f0..0794a94f6dce 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache @@ -65,14 +65,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); {{/vars}}sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Java/pojo.mustache b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache index 2e9facfb14d2..8d92141fa7fb 100644 --- a/modules/swagger-codegen/src/main/resources/Java/pojo.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache @@ -45,12 +45,23 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); {{/vars}}sb.append("}"); return sb.toString(); } -} \ No newline at end of file + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java index 4ba4ee3a2f3c..cd6112efeb91 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:32:50.163+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). @@ -39,13 +39,4 @@ public class StringUtil { } return out.toString(); } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - public static String toIndentedString(Object o) { - if (o == null) return "null"; - return o.toString().replace("\n", "\n "); - } } diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java index abcb97e84eef..03efe0d240c8 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:32:50.163+08:00") public class Category { private Long id = null; @@ -62,13 +62,25 @@ public class Category { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Category {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java index b488fab6c3fd..fc1cb16b3202 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:32:50.163+08:00") public class Order { private Long id = null; @@ -140,17 +140,29 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Order {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" petId: ").append(StringUtil.toIndentedString(petId)).append("\n"); - sb.append(" quantity: ").append(StringUtil.toIndentedString(quantity)).append("\n"); - sb.append(" shipDate: ").append(StringUtil.toIndentedString(shipDate)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); - sb.append(" complete: ").append(StringUtil.toIndentedString(complete)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java index 5a979dcb73e7..d5577325a7ce 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java @@ -2,8 +2,8 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import java.util.Objects; @@ -14,7 +14,7 @@ import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:32:50.163+08:00") public class Pet { private Long id = null; @@ -142,17 +142,29 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Pet {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" category: ").append(StringUtil.toIndentedString(category)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); - sb.append(" photoUrls: ").append(StringUtil.toIndentedString(photoUrls)).append("\n"); - sb.append(" tags: ").append(StringUtil.toIndentedString(tags)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java index 41cfb3d80d6a..66f5ea8474d0 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:32:50.163+08:00") public class Tag { private Long id = null; @@ -62,13 +62,25 @@ public class Tag { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Tag {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java index 61960c622f68..5f2ad2cd4cf4 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:32:50.163+08:00") public class User { private Long id = null; @@ -147,19 +147,31 @@ public class User { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class User {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" username: ").append(StringUtil.toIndentedString(username)).append("\n"); - sb.append(" firstName: ").append(StringUtil.toIndentedString(firstName)).append("\n"); - sb.append(" lastName: ").append(StringUtil.toIndentedString(lastName)).append("\n"); - sb.append(" email: ").append(StringUtil.toIndentedString(email)).append("\n"); - sb.append(" password: ").append(StringUtil.toIndentedString(password)).append("\n"); - sb.append(" phone: ").append(StringUtil.toIndentedString(phone)).append("\n"); - sb.append(" userStatus: ").append(StringUtil.toIndentedString(userStatus)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java index c843634389db..bd924d2f4b7f 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:53:36.016+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). @@ -39,13 +39,4 @@ public class StringUtil { } return out.toString(); } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - public static String toIndentedString(Object o) { - if (o == null) return "null"; - return o.toString().replace("\n", "\n "); - } } diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java deleted file mode 100644 index ab98bf61e891..000000000000 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java +++ /dev/null @@ -1,92 +0,0 @@ -package io.swagger.client.model; - -import io.swagger.client.StringUtil; - - - -import java.util.Objects; - -import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; - - - -@ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") -public class ApiResponse { - - private Integer code = null; - private String type = null; - private String message = null; - - - /** - **/ - @ApiModelProperty(value = "") - @JsonProperty("code") - public Integer getCode() { - return code; - } - public void setCode(Integer code) { - this.code = code; - } - - - /** - **/ - @ApiModelProperty(value = "") - @JsonProperty("type") - public String getType() { - return type; - } - public void setType(String type) { - this.type = type; - } - - - /** - **/ - @ApiModelProperty(value = "") - @JsonProperty("message") - public String getMessage() { - return message; - } - public void setMessage(String message) { - this.message = message; - } - - - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ApiResponse apiResponse = (ApiResponse) o; - return Objects.equals(code, apiResponse.code) && - Objects.equals(type, apiResponse.type) && - Objects.equals(message, apiResponse.message); - } - - @Override - public int hashCode() { - return Objects.hash(code, type, message); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class ApiResponse {\n"); - - sb.append(" code: ").append(StringUtil.toIndentedString(code)).append("\n"); - sb.append(" type: ").append(StringUtil.toIndentedString(type)).append("\n"); - sb.append(" message: ").append(StringUtil.toIndentedString(message)).append("\n"); - sb.append("}"); - return sb.toString(); - } -} - - diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java index 463da28c6384..c0d16bbe2c1d 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:53:36.016+08:00") public class Category { private Long id = null; @@ -61,13 +62,25 @@ public class Category { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Category {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java index 9b4907677594..d2a2d7a66e21 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java @@ -10,8 +10,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:53:36.016+08:00") public class Order { private Long id = null; @@ -139,17 +140,29 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Order {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" petId: ").append(StringUtil.toIndentedString(petId)).append("\n"); - sb.append(" quantity: ").append(StringUtil.toIndentedString(quantity)).append("\n"); - sb.append(" shipDate: ").append(StringUtil.toIndentedString(shipDate)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); - sb.append(" complete: ").append(StringUtil.toIndentedString(complete)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java index 471bbe34b006..b7095d0e74f7 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java @@ -2,8 +2,8 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import java.util.Objects; @@ -12,8 +12,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:53:36.016+08:00") public class Pet { private Long id = null; @@ -141,17 +142,29 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Pet {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" category: ").append(StringUtil.toIndentedString(category)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); - sb.append(" photoUrls: ").append(StringUtil.toIndentedString(photoUrls)).append("\n"); - sb.append(" tags: ").append(StringUtil.toIndentedString(tags)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java index 02b5b85be403..b9469ad2a508 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:53:36.016+08:00") public class Tag { private Long id = null; @@ -61,13 +62,25 @@ public class Tag { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Tag {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java index 4d072f67d477..1fdfef1eecea 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:53:36.016+08:00") public class User { private Long id = null; @@ -146,19 +147,31 @@ public class User { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class User {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" username: ").append(StringUtil.toIndentedString(username)).append("\n"); - sb.append(" firstName: ").append(StringUtil.toIndentedString(firstName)).append("\n"); - sb.append(" lastName: ").append(StringUtil.toIndentedString(lastName)).append("\n"); - sb.append(" email: ").append(StringUtil.toIndentedString(email)).append("\n"); - sb.append(" password: ").append(StringUtil.toIndentedString(password)).append("\n"); - sb.append(" phone: ").append(StringUtil.toIndentedString(phone)).append("\n"); - sb.append(" userStatus: ").append(StringUtil.toIndentedString(userStatus)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/StringUtil.java index e9cc1341e04f..1fa35d9ee726 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:35:06.891+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). @@ -39,13 +39,4 @@ public class StringUtil { } return out.toString(); } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - public static String toIndentedString(Object o) { - if (o == null) return "null"; - return o.toString().replace("\n", "\n "); - } } diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java index abe1bb895d39..c0b1b559f90d 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:35:06.891+08:00") public class Category { private Long id = null; @@ -61,13 +62,25 @@ public class Category { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Category {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Order.java index 6c90b3eca400..002d51a2908a 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Order.java @@ -10,8 +10,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:35:06.891+08:00") public class Order { private Long id = null; @@ -139,17 +140,29 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Order {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" petId: ").append(StringUtil.toIndentedString(petId)).append("\n"); - sb.append(" quantity: ").append(StringUtil.toIndentedString(quantity)).append("\n"); - sb.append(" shipDate: ").append(StringUtil.toIndentedString(shipDate)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); - sb.append(" complete: ").append(StringUtil.toIndentedString(complete)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java index 28343f0fc441..33126c58b78f 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java @@ -2,8 +2,8 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import java.util.Objects; @@ -12,8 +12,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:35:06.891+08:00") public class Pet { private Long id = null; @@ -141,17 +142,29 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Pet {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" category: ").append(StringUtil.toIndentedString(category)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); - sb.append(" photoUrls: ").append(StringUtil.toIndentedString(photoUrls)).append("\n"); - sb.append(" tags: ").append(StringUtil.toIndentedString(tags)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java index a7ee39070c84..28d7f5779a64 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:35:06.891+08:00") public class Tag { private Long id = null; @@ -61,13 +62,25 @@ public class Tag { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Tag {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java index 5bfea7707f47..d68a953a95c3 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:35:06.891+08:00") public class User { private Long id = null; @@ -146,19 +147,31 @@ public class User { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class User {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" username: ").append(StringUtil.toIndentedString(username)).append("\n"); - sb.append(" firstName: ").append(StringUtil.toIndentedString(firstName)).append("\n"); - sb.append(" lastName: ").append(StringUtil.toIndentedString(lastName)).append("\n"); - sb.append(" email: ").append(StringUtil.toIndentedString(email)).append("\n"); - sb.append(" password: ").append(StringUtil.toIndentedString(password)).append("\n"); - sb.append(" phone: ").append(StringUtil.toIndentedString(phone)).append("\n"); - sb.append(" userStatus: ").append(StringUtil.toIndentedString(userStatus)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } + diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java index 3a105a258e4b..e67d875db410 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T12:21:33.403+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:33:26.877+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). @@ -39,13 +39,4 @@ public class StringUtil { } return out.toString(); } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - public static String toIndentedString(Object o) { - if (o == null) return "null"; - return o.toString().replace("\n", "\n "); - } } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java index 4f15da15c65b..25ca3dbe94ea 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java @@ -64,13 +64,24 @@ public class Category { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Category {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java index 18c51201ad40..3e9c7bb0765d 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java @@ -149,17 +149,28 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Order {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" petId: ").append(StringUtil.toIndentedString(petId)).append("\n"); - sb.append(" quantity: ").append(StringUtil.toIndentedString(quantity)).append("\n"); - sb.append(" shipDate: ").append(StringUtil.toIndentedString(shipDate)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); - sb.append(" complete: ").append(StringUtil.toIndentedString(complete)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java index 7e771866b39e..d67add42e256 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java @@ -151,17 +151,28 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Pet {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" category: ").append(StringUtil.toIndentedString(category)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); - sb.append(" photoUrls: ").append(StringUtil.toIndentedString(photoUrls)).append("\n"); - sb.append(" tags: ").append(StringUtil.toIndentedString(tags)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java index 474904011f74..b444bf874878 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java @@ -64,13 +64,24 @@ public class Tag { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Tag {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java index 82f1a0822db4..8fbc8cbd231c 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java @@ -155,19 +155,30 @@ public class User { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class User {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" username: ").append(StringUtil.toIndentedString(username)).append("\n"); - sb.append(" firstName: ").append(StringUtil.toIndentedString(firstName)).append("\n"); - sb.append(" lastName: ").append(StringUtil.toIndentedString(lastName)).append("\n"); - sb.append(" email: ").append(StringUtil.toIndentedString(email)).append("\n"); - sb.append(" password: ").append(StringUtil.toIndentedString(password)).append("\n"); - sb.append(" phone: ").append(StringUtil.toIndentedString(phone)).append("\n"); - sb.append(" userStatus: ").append(StringUtil.toIndentedString(userStatus)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/StringUtil.java index fa3abdc9c787..3f54bb1c0164 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:14.988+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:34:07.014+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). @@ -39,13 +39,4 @@ public class StringUtil { } return out.toString(); } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - public static String toIndentedString(Object o) { - if (o == null) return "null"; - return o.toString().replace("\n", "\n "); - } } diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/ApiResponse.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/ApiResponse.java deleted file mode 100644 index 777de9a34e3e..000000000000 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/ApiResponse.java +++ /dev/null @@ -1,72 +0,0 @@ -package io.swagger.client.model; - -import io.swagger.client.StringUtil; - -import com.google.gson.annotations.SerializedName; - - - -import io.swagger.annotations.*; - - - -@ApiModel(description = "") -public class ApiResponse { - - @SerializedName("code") - private Integer code = null; - - @SerializedName("type") - private String type = null; - - @SerializedName("message") - private String message = null; - - - - /** - **/ - @ApiModelProperty(value = "") - public Integer getCode() { - return code; - } - public void setCode(Integer code) { - this.code = code; - } - - - /** - **/ - @ApiModelProperty(value = "") - public String getType() { - return type; - } - public void setType(String type) { - this.type = type; - } - - - /** - **/ - @ApiModelProperty(value = "") - public String getMessage() { - return message; - } - public void setMessage(String message) { - this.message = message; - } - - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class ApiResponse {\n"); - - sb.append(" code: ").append(StringUtil.toIndentedString(code)).append("\n"); - sb.append(" type: ").append(StringUtil.toIndentedString(type)).append("\n"); - sb.append(" message: ").append(StringUtil.toIndentedString(message)).append("\n"); - sb.append("}"); - return sb.toString(); - } -} diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java index 4f15da15c65b..25ca3dbe94ea 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java @@ -64,13 +64,24 @@ public class Category { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Category {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java index 18c51201ad40..3e9c7bb0765d 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java @@ -149,17 +149,28 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Order {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" petId: ").append(StringUtil.toIndentedString(petId)).append("\n"); - sb.append(" quantity: ").append(StringUtil.toIndentedString(quantity)).append("\n"); - sb.append(" shipDate: ").append(StringUtil.toIndentedString(shipDate)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); - sb.append(" complete: ").append(StringUtil.toIndentedString(complete)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java index bc3b80370b05..d67add42e256 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java @@ -2,8 +2,8 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import com.google.gson.annotations.SerializedName; @@ -151,17 +151,28 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Pet {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" category: ").append(StringUtil.toIndentedString(category)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); - sb.append(" photoUrls: ").append(StringUtil.toIndentedString(photoUrls)).append("\n"); - sb.append(" tags: ").append(StringUtil.toIndentedString(tags)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java index 474904011f74..b444bf874878 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java @@ -64,13 +64,24 @@ public class Tag { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Tag {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java index 82f1a0822db4..8fbc8cbd231c 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java @@ -155,19 +155,30 @@ public class User { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class User {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" username: ").append(StringUtil.toIndentedString(username)).append("\n"); - sb.append(" firstName: ").append(StringUtil.toIndentedString(firstName)).append("\n"); - sb.append(" lastName: ").append(StringUtil.toIndentedString(lastName)).append("\n"); - sb.append(" email: ").append(StringUtil.toIndentedString(email)).append("\n"); - sb.append(" password: ").append(StringUtil.toIndentedString(password)).append("\n"); - sb.append(" phone: ").append(StringUtil.toIndentedString(phone)).append("\n"); - sb.append(" userStatus: ").append(StringUtil.toIndentedString(userStatus)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/retrofit2/README.md b/samples/client/petstore/java/retrofit2/README.md new file mode 100644 index 000000000000..1a6255eb563e --- /dev/null +++ b/samples/client/petstore/java/retrofit2/README.md @@ -0,0 +1,43 @@ +# swagger-petstore-retrofit2 + +## Requirements + +Building the API client library requires [Maven](https://maven.apache.org/) to be installed. + +## Installation & Usage + +To install the API client library to your local Maven repository, simply execute: + +```shell +mvn install +``` + +To deploy it to a remote Maven repository instead, configure the settings of the repository and execute: + +```shell +mvn deploy +``` + +Refer to the [official documentation](https://maven.apache.org/plugins/maven-deploy-plugin/usage.html) for more information. + +After the client libarary is installed/deployed, you can use it in your Maven project by adding the following to your *pom.xml*: + +```xml + + io.swagger + swagger-petstore-retrofit2 + 1.0.0 + compile + + +``` + +## Recommendation + +It's recommended to create an instance of `ApiClient` per thread in a multithreaded environment to avoid any potential issue. + +## Author + +apiteam@swagger.io + + diff --git a/samples/client/petstore/java/retrofit2/src/main/AndroidManifest.xml b/samples/client/petstore/java/retrofit2/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..465dcb520c40 --- /dev/null +++ b/samples/client/petstore/java/retrofit2/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + + diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java index 47f9908c4ded..9beb93a84653 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-28T16:01:49.902+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-29T11:39:24.077+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). @@ -39,13 +39,4 @@ public class StringUtil { } return out.toString(); } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - public static String toIndentedString(Object o) { - if (o == null) return "null"; - return o.toString().replace("\n", "\n "); - } } diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java index 4f15da15c65b..25ca3dbe94ea 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java @@ -64,13 +64,24 @@ public class Category { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Category {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java index 18c51201ad40..3e9c7bb0765d 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java @@ -149,17 +149,28 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Order {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" petId: ").append(StringUtil.toIndentedString(petId)).append("\n"); - sb.append(" quantity: ").append(StringUtil.toIndentedString(quantity)).append("\n"); - sb.append(" shipDate: ").append(StringUtil.toIndentedString(shipDate)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); - sb.append(" complete: ").append(StringUtil.toIndentedString(complete)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java index bc3b80370b05..d67add42e256 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java @@ -2,8 +2,8 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import com.google.gson.annotations.SerializedName; @@ -151,17 +151,28 @@ public enum StatusEnum { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Pet {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" category: ").append(StringUtil.toIndentedString(category)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); - sb.append(" photoUrls: ").append(StringUtil.toIndentedString(photoUrls)).append("\n"); - sb.append(" tags: ").append(StringUtil.toIndentedString(tags)).append("\n"); - sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java index 474904011f74..b444bf874878 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java @@ -64,13 +64,24 @@ public class Tag { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class Tag {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java index 82f1a0822db4..8fbc8cbd231c 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java @@ -155,19 +155,30 @@ public class User { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class User {\n"); - sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); - sb.append(" username: ").append(StringUtil.toIndentedString(username)).append("\n"); - sb.append(" firstName: ").append(StringUtil.toIndentedString(firstName)).append("\n"); - sb.append(" lastName: ").append(StringUtil.toIndentedString(lastName)).append("\n"); - sb.append(" email: ").append(StringUtil.toIndentedString(email)).append("\n"); - sb.append(" password: ").append(StringUtil.toIndentedString(password)).append("\n"); - sb.append(" phone: ").append(StringUtil.toIndentedString(phone)).append("\n"); - sb.append(" userStatus: ").append(StringUtil.toIndentedString(userStatus)).append("\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } From acc43e7f7146b50e6933bbce0b3301c1d644e744 Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Mon, 28 Dec 2015 21:14:08 -0800 Subject: [PATCH 58/82] Update README.mustache Fix broken link --- .../swagger-codegen/src/main/resources/nodejs/README.mustache | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/nodejs/README.mustache b/modules/swagger-codegen/src/main/resources/nodejs/README.mustache index edeea0005c06..183cd5e6d2a5 100644 --- a/modules/swagger-codegen/src/main/resources/nodejs/README.mustache +++ b/modules/swagger-codegen/src/main/resources/nodejs/README.mustache @@ -5,7 +5,7 @@ This server was generated by the [swagger-codegen](https://github.com/swagger-ap This example uses the [expressjs](http://expressjs.com/) framework. To see how to make this your own, look here: -[README](https://github.com/swagger-api/swagger-codegen/README.md) +[README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md) ### Running the server To run the server, follow these simple steps: @@ -21,4 +21,4 @@ To view the Swagger UI interface: open http://localhost:8080/docs ``` -This project leverages the mega-awesome [swagger-tools](https://github.com/apigee-127/swagger-tools) middleware which does most all the work. \ No newline at end of file +This project leverages the mega-awesome [swagger-tools](https://github.com/apigee-127/swagger-tools) middleware which does most all the work. From 11d6bb9a95b978464a60bd4181a1d6f118981e41 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 29 Dec 2015 15:00:56 +0800 Subject: [PATCH 59/82] php remove duplicated type mapping --- .../codegen/languages/PhpClientCodegen.java | 5 +- .../php/SwaggerClient-php/lib/Api/PetApi.php | 80 ------------------- .../lib/ObjectSerializer.php | 2 +- 3 files changed, 3 insertions(+), 84 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java index 0b59e6f4320e..6ce24b2e1ef0 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java @@ -85,14 +85,13 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { typeMapping.put("string", "string"); typeMapping.put("byte", "int"); typeMapping.put("boolean", "bool"); - typeMapping.put("date", "\\DateTime"); - typeMapping.put("datetime", "\\DateTime"); + typeMapping.put("Date", "\\Date"); + typeMapping.put("DateTime", "\\DateTime"); typeMapping.put("file", "\\SplFileObject"); typeMapping.put("map", "map"); typeMapping.put("array", "array"); typeMapping.put("list", "array"); typeMapping.put("object", "object"); - typeMapping.put("DateTime", "\\DateTime"); cliOptions.add(new CliOption(CodegenConstants.MODEL_PACKAGE, CodegenConstants.MODEL_PACKAGE_DESC)); cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index c91e54f6e57a..bd82444f4fe0 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -738,86 +738,6 @@ class PetApi } } - /** - * downloadFile - * - * downloads an image - * - * @return \Swagger\Client\Model\File - * @throws \Swagger\Client\ApiException on non-2xx response - */ - public function downloadFile() - { - list($response, $statusCode, $httpHeader) = $this->downloadFileWithHttpInfo (); - return $response; - } - - - /** - * downloadFileWithHttpInfo - * - * downloads an image - * - * @return Array of \Swagger\Client\Model\File, HTTP status code, HTTP response headers (array of strings) - * @throws \Swagger\Client\ApiException on non-2xx response - */ - public function downloadFileWithHttpInfo() - { - - - // parse inputs - $resourcePath = "/pet/{petId}/downloadImage"; - $resourcePath = str_replace("{format}", "json", $resourcePath); - $method = "GET"; - $httpBody = ''; - $queryParams = array(); - $headerParams = array(); - $formParams = array(); - $_header_accept = ApiClient::selectHeaderAccept(array('application/octet-stream')); - if (!is_null($_header_accept)) { - $headerParams['Accept'] = $_header_accept; - } - $headerParams['Content-Type'] = ApiClient::selectHeaderContentType(array()); - - - - - - - - // for model (json/xml) - if (isset($_tempBody)) { - $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } elseif (count($formParams) > 0) { - $httpBody = $formParams; // for HTTP post (form) - } - - // make the API Call - try { - list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( - $resourcePath, $method, - $queryParams, $httpBody, - $headerParams, '\Swagger\Client\Model\File' - ); - - if (!$response) { - return array(null, $statusCode, $httpHeader); - } - - return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\File', $httpHeader), $statusCode, $httpHeader); - - } catch (ApiException $e) { - switch ($e->getCode()) { - case 200: - $data = $this->apiClient->getSerializer()->deserialize($e->getResponseBody(), '\Swagger\Client\Model\File', $e->getResponseHeaders()); - $e->setResponseObject($data); - break; - } - - throw $e; - } - } - /** * uploadFile * diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php index 7d7a04e653cc..cc023b61bd27 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php @@ -193,7 +193,7 @@ class ObjectSerializer $deserialized = $values; } elseif ($class === '\DateTime') { $deserialized = new \DateTime($data); - } elseif (in_array($class, array('void', 'bool', 'string', 'double', 'byte', 'mixed', 'integer', 'float', 'int', 'DateTime', 'number', 'boolean', 'object'))) { + } elseif (in_array($class, array('integer', 'int', 'void', 'number', 'object', 'double', 'float', 'byte', 'DateTime', 'string', 'mixed', 'boolean', 'bool'))) { settype($data, $class); $deserialized = $data; } elseif ($class === '\SplFileObject') { From fed4ba3cf867da004b888c2eb0733f527d7c56af Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 29 Dec 2015 15:04:27 +0800 Subject: [PATCH 60/82] use DateTime for php date --- .../java/io/swagger/codegen/languages/PhpClientCodegen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java index 6ce24b2e1ef0..d2f5aaef0be4 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java @@ -85,7 +85,7 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { typeMapping.put("string", "string"); typeMapping.put("byte", "int"); typeMapping.put("boolean", "bool"); - typeMapping.put("Date", "\\Date"); + typeMapping.put("Date", "\\DateTime"); typeMapping.put("DateTime", "\\DateTime"); typeMapping.put("file", "\\SplFileObject"); typeMapping.put("map", "map"); From 8882c36c9192489aa7c1b75aedc95ba69ad57004 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 29 Dec 2015 15:21:38 +0800 Subject: [PATCH 61/82] fix perl datetime mapping --- .../java/io/swagger/codegen/languages/PerlClientCodegen.java | 4 ++-- samples/client/petstore/perl/README.md | 2 +- samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java index 51f394d5db32..70f52403f887 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java @@ -63,8 +63,8 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { typeMapping.put("double", "double"); typeMapping.put("boolean", "boolean"); typeMapping.put("string", "string"); - typeMapping.put("date", "DateTime"); - typeMapping.put("dateTime", "DateTime"); + typeMapping.put("Date", "DateTime"); + typeMapping.put("DateTime", "DateTime"); typeMapping.put("password", "string"); typeMapping.put("array", "ARRAY"); typeMapping.put("map", "HASH"); diff --git a/samples/client/petstore/perl/README.md b/samples/client/petstore/perl/README.md index 4cf6dc854702..ef43f3fcfd2d 100644 --- a/samples/client/petstore/perl/README.md +++ b/samples/client/petstore/perl/README.md @@ -8,7 +8,7 @@ WWW::SwaggerClient::Role - a Moose role for the Swagger Petstore Automatically generated by the Perl Swagger Codegen project: -- Build date: 2015-12-28T16:30:58.036+08:00 +- Build date: 2015-12-29T15:20:56.867+08:00 - Build package: class io.swagger.codegen.languages.PerlClientCodegen - Codegen version: diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm index 4b4d5144f58d..3d45a004b990 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm @@ -37,7 +37,7 @@ has version_info => ( is => 'ro', default => sub { { app_name => 'Swagger Petstore', app_version => '1.0.0', - generated_date => '2015-12-28T16:30:58.036+08:00', + generated_date => '2015-12-29T15:20:56.867+08:00', generator_class => 'class io.swagger.codegen.languages.PerlClientCodegen', } }, documentation => 'Information about the application version and the codegen codebase version' @@ -103,7 +103,7 @@ Automatically generated by the Perl Swagger Codegen project: =over 4 -=item Build date: 2015-12-28T16:30:58.036+08:00 +=item Build date: 2015-12-29T15:20:56.867+08:00 =item Build package: class io.swagger.codegen.languages.PerlClientCodegen From e4078855f578fe86aa0346cc623ce1276c4c25cd Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 29 Dec 2015 16:29:20 +0800 Subject: [PATCH 62/82] fix date mapping for perl --- .../java/io/swagger/codegen/languages/PerlClientCodegen.java | 2 +- samples/client/petstore/perl/README.md | 2 +- samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java index 70f52403f887..8950ff21a22f 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java @@ -63,7 +63,7 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { typeMapping.put("double", "double"); typeMapping.put("boolean", "boolean"); typeMapping.put("string", "string"); - typeMapping.put("Date", "DateTime"); + typeMapping.put("date", "DateTime"); typeMapping.put("DateTime", "DateTime"); typeMapping.put("password", "string"); typeMapping.put("array", "ARRAY"); diff --git a/samples/client/petstore/perl/README.md b/samples/client/petstore/perl/README.md index ef43f3fcfd2d..b8b8c1bda778 100644 --- a/samples/client/petstore/perl/README.md +++ b/samples/client/petstore/perl/README.md @@ -8,7 +8,7 @@ WWW::SwaggerClient::Role - a Moose role for the Swagger Petstore Automatically generated by the Perl Swagger Codegen project: -- Build date: 2015-12-29T15:20:56.867+08:00 +- Build date: 2015-12-29T16:27:28.775+08:00 - Build package: class io.swagger.codegen.languages.PerlClientCodegen - Codegen version: diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm index 3d45a004b990..8c9e85ed5063 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm @@ -37,7 +37,7 @@ has version_info => ( is => 'ro', default => sub { { app_name => 'Swagger Petstore', app_version => '1.0.0', - generated_date => '2015-12-29T15:20:56.867+08:00', + generated_date => '2015-12-29T16:27:28.775+08:00', generator_class => 'class io.swagger.codegen.languages.PerlClientCodegen', } }, documentation => 'Information about the application version and the codegen codebase version' @@ -103,7 +103,7 @@ Automatically generated by the Perl Swagger Codegen project: =over 4 -=item Build date: 2015-12-29T15:20:56.867+08:00 +=item Build date: 2015-12-29T16:27:28.775+08:00 =item Build package: class io.swagger.codegen.languages.PerlClientCodegen From e864994b62d826d99a2014c80e1128113936168f Mon Sep 17 00:00:00 2001 From: Andy Lowry Date: Tue, 29 Dec 2015 11:58:28 -0500 Subject: [PATCH 63/82] [Akka-Scala] Fix #1781 re specs w/o security defs Per issue recommendation, fix is to DefaultCodegen#fromSecurity, which now returns an empty list rather than null if no securityDefinitions property is present in the swagger spec --- .../src/main/java/io/swagger/codegen/DefaultCodegen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index afeb5cd62d5f..a4bc5c54a201 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1602,7 +1602,7 @@ public class DefaultCodegen { */ public List fromSecurity(Map schemes) { if (schemes == null) { - return null; + return Collections.emptyList(); } List secs = new ArrayList(schemes.size()); From ffe12b0620b61ad6a0ca957b3941e07f1f811ac4 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Tue, 29 Dec 2015 23:28:09 -0800 Subject: [PATCH 64/82] added library, date library --- .../codegen/languages/JaxRSServerCodegen.java | 69 ++++++++++++++++++- .../codegen/jaxrs/JaxRSServerOptionsTest.java | 2 + .../options/JaxRSServerOptionsProvider.java | 18 +++++ 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java index a91b405d36bd..53a7bbffcab5 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java @@ -9,8 +9,10 @@ import java.io.File; import java.util.*; public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConfig { + protected String dateLibrary = "default"; protected String title = "Swagger Server"; + public static final String DATE_LIBRARY = "dateLibrary"; public JaxRSServerCodegen() { super.processOpts(); @@ -24,7 +26,6 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf apiTemplateFiles.put("apiService.mustache", ".java"); apiTemplateFiles.put("apiServiceImpl.mustache", ".java"); apiTemplateFiles.put("apiServiceFactory.mustache", ".java"); - embeddedTemplateDir = templateDir = "JavaJaxRS"; apiPackage = System.getProperty("swagger.codegen.jaxrs.apipackage", "io.swagger.api"); modelPackage = System.getProperty("swagger.codegen.jaxrs.modelpackage", "io.swagger.model"); @@ -33,6 +34,34 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf additionalProperties.put(CodegenConstants.ARTIFACT_ID, artifactId); additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, artifactVersion); additionalProperties.put("title", title); + + embeddedTemplateDir = templateDir = "JavaJaxRS" + File.separator + "jersey1_18"; + + for(int i = 0; i < cliOptions.size(); i++) { + if(CodegenConstants.LIBRARY.equals(cliOptions.get(i).getOpt())) { + cliOptions.remove(i); + break; + } + } + + CliOption dateLibrary = new CliOption(DATE_LIBRARY, "Option. Date library to use"); + Map dateOptions = new HashMap(); + dateOptions.put("java8", "Java 8 native"); + dateOptions.put("joda", "Joda"); + dateLibrary.setEnum(dateOptions); + + cliOptions.add(dateLibrary); + + CliOption library = new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use"); + library.setDefault(DEFAULT_LIBRARY); + + Map supportedLibraries = new LinkedHashMap(); + + supportedLibraries.put(DEFAULT_LIBRARY, "Jersey core 1.18.1"); +// supportedLibraries.put("jersey2", "Jersey2 core library 2.x"); + library.setEnum(supportedLibraries); + + cliOptions.add(library); } @Override @@ -54,6 +83,10 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf public void processOpts() { super.processOpts(); +// if("jersey2".equals(getLibrary())) { +// embeddedTemplateDir = templateDir = "JavaJaxRS" + File.separator + "jersey2"; +// } + supportingFiles.clear(); supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); @@ -68,6 +101,36 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf supportingFiles.add(new SupportingFile("web.mustache", ("src/main/webapp/WEB-INF"), "web.xml")); + if (additionalProperties.containsKey("dateLibrary")) { + setDateLibrary(additionalProperties.get("dateLibrary").toString()); + additionalProperties.put(dateLibrary, "true"); + } + + if("joda".equals(dateLibrary)) { + typeMapping.put("date", "LocalDate"); + typeMapping.put("DateTime", "DateTime"); + + importMapping.put("LocalDate", "org.joda.time.LocalDate"); + importMapping.put("DateTime", "org.joda.time.DateTime"); + + supportingFiles.add(new SupportingFile("JodaDateTimeProvider.mustache", + (sourceFolder + '/' + apiPackage).replace(".", "/"), "JodaDateTimeProvider.java")); + supportingFiles.add(new SupportingFile("JodaLocalDateProvider.mustache", + (sourceFolder + '/' + apiPackage).replace(".", "/"), "JodaLocalDateProvider.java")); + } + else if ("java8".equals(dateLibrary)) { + additionalProperties.put("java8", "true"); + additionalProperties.put("javaVersion", "1.8"); + typeMapping.put("date", "LocalDate"); + typeMapping.put("date-time", "LocalDateTime"); + importMapping.put("LocalDate", "java.time.LocalDate"); + importMapping.put("LocalDateTime", "java.time.LocalDateTime"); + + supportingFiles.add(new SupportingFile("LocalDateTimeProvider.mustache", + (sourceFolder + '/' + apiPackage).replace(".", "/"), "LocalDateTimeProvider.java")); + supportingFiles.add(new SupportingFile("LocalDateProvider.mustache", + (sourceFolder + '/' + apiPackage).replace(".", "/"), "LocalDateProvider.java")); + } } @Override @@ -237,4 +300,8 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf public boolean shouldOverwrite(String filename) { return super.shouldOverwrite(filename) && !filename.endsWith("ServiceImpl.java") && !filename.endsWith("ServiceFactory.java"); } + + public void setDateLibrary(String library) { + this.dateLibrary = library; + } } diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxRSServerOptionsTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxRSServerOptionsTest.java index ac6288b7f1e8..055bb721ad81 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxRSServerOptionsTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxRSServerOptionsTest.java @@ -49,6 +49,8 @@ public class JaxRSServerOptionsTest extends JavaClientOptionsTest { times = 1; clientCodegen.setFullJavaUtil(Boolean.valueOf(JaxRSServerOptionsProvider.FULL_JAVA_UTIL_VALUE)); times = 1; + clientCodegen.setDateLibrary("joda"); + times = 1; }}; } } diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JaxRSServerOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JaxRSServerOptionsProvider.java index 0b735363b77e..ae68a5dfb835 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JaxRSServerOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JaxRSServerOptionsProvider.java @@ -1,6 +1,13 @@ package io.swagger.codegen.options; +import com.google.common.collect.ImmutableMap; +import io.swagger.codegen.languages.JaxRSServerCodegen; + +import java.util.Map; + public class JaxRSServerOptionsProvider extends JavaOptionsProvider { + public static final String JODA_DATE_LIBRARY = "joda"; + @Override public boolean isServer() { return true; @@ -10,4 +17,15 @@ public class JaxRSServerOptionsProvider extends JavaOptionsProvider { public String getLanguage() { return "jaxrs"; } + + @Override + public Map createOptions() { + Map options = super.createOptions(); + + ImmutableMap.Builder builder = new ImmutableMap.Builder(); + builder.putAll(options) + .put(JaxRSServerCodegen.DATE_LIBRARY, "joda"); + + return builder.build(); + } } From 29f928d644ff001557084d3be2d3472682d11fb9 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Tue, 29 Dec 2015 23:28:31 -0800 Subject: [PATCH 65/82] prepare for multiple jaxrs libraries --- config-feign.json | 1 - .../{ => jersey1_18}/ApiException.mustache | 0 .../{ => jersey1_18}/ApiOriginFilter.mustache | 0 .../ApiResponseMessage.mustache | 0 .../jersey1_18/JodaDateTimeProvider.mustache | 44 +++++++++++++++++++ .../jersey1_18/JodaLocalDateProvider.mustache | 44 +++++++++++++++++++ .../jersey1_18/LocalDateProvider.mustache | 44 +++++++++++++++++++ .../jersey1_18/LocalDateTimeProvider.mustache | 44 +++++++++++++++++++ .../NotFoundException.mustache | 0 .../{ => jersey1_18}/README.mustache | 0 .../{ => jersey1_18}/allowableValues.mustache | 0 .../JavaJaxRS/{ => jersey1_18}/api.mustache | 0 .../{ => jersey1_18}/apiService.mustache | 0 .../apiServiceFactory.mustache | 0 .../{ => jersey1_18}/apiServiceImpl.mustache | 0 .../{ => jersey1_18}/bodyParams.mustache | 0 .../{ => jersey1_18}/formParams.mustache | 0 .../generatedAnnotation.mustache | 0 .../{ => jersey1_18}/headerParams.mustache | 0 .../JavaJaxRS/{ => jersey1_18}/model.mustache | 0 .../{ => jersey1_18}/pathParams.mustache | 0 .../JavaJaxRS/{ => jersey1_18}/pom.mustache | 0 .../{ => jersey1_18}/project/build.properties | 0 .../{ => jersey1_18}/project/plugins.sbt | 0 .../{ => jersey1_18}/queryParams.mustache | 0 .../{ => jersey1_18}/returnTypes.mustache | 0 .../serviceBodyParams.mustache | 0 .../serviceFormParams.mustache | 0 .../serviceHeaderParams.mustache | 0 .../servicePathParams.mustache | 0 .../serviceQueryParams.mustache | 0 .../JavaJaxRS/{ => jersey1_18}/web.mustache | 0 .../java/jaxrs/AllowableValuesTest.java | 2 +- 33 files changed, 177 insertions(+), 2 deletions(-) delete mode 100644 config-feign.json rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/ApiException.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/ApiOriginFilter.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/ApiResponseMessage.mustache (100%) create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaDateTimeProvider.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaLocalDateProvider.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateProvider.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateTimeProvider.mustache rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/NotFoundException.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/README.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/allowableValues.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/api.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/apiService.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/apiServiceFactory.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/apiServiceImpl.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/bodyParams.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/formParams.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/generatedAnnotation.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/headerParams.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/model.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/pathParams.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/pom.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/project/build.properties (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/project/plugins.sbt (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/queryParams.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/returnTypes.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/serviceBodyParams.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/serviceFormParams.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/serviceHeaderParams.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/servicePathParams.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/serviceQueryParams.mustache (100%) rename modules/swagger-codegen/src/main/resources/JavaJaxRS/{ => jersey1_18}/web.mustache (100%) diff --git a/config-feign.json b/config-feign.json deleted file mode 100644 index 3b8c48c3caa0..000000000000 --- a/config-feign.json +++ /dev/null @@ -1 +0,0 @@ -{"library":"feign"} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiException.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiException.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiOriginFilter.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiOriginFilter.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiResponseMessage.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiResponseMessage.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaDateTimeProvider.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaDateTimeProvider.mustache new file mode 100644 index 000000000000..f94217909835 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaDateTimeProvider.mustache @@ -0,0 +1,44 @@ +package {{apiPackage}}; + +import com.sun.jersey.core.spi.component.ComponentContext; +import com.sun.jersey.spi.inject.Injectable; +import com.sun.jersey.spi.inject.PerRequestTypeInjectableProvider; + +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.Provider; +import org.joda.time.DateTime; +import java.util.List; + +@Provider +public class JodaDateTimeProvider extends PerRequestTypeInjectableProvider { + private final UriInfo uriInfo; + + public JodaDateTimeProvider(@Context UriInfo uriInfo) { + super(DateTime.class); + this.uriInfo = uriInfo; + } + + @Override + public Injectable getInjectable(final ComponentContext cc, final QueryParam a) { + return new Injectable() { + @Override + public DateTime getValue() { + final List values = uriInfo.getQueryParameters().get(a.value()); + + if (values == null || values.isEmpty()) + return null; + if (values.size() > 1) { + throw new WebApplicationException(Response.status(Status.BAD_REQUEST). + entity(a.value() + " cannot contain multiple values").build()); + } + + return DateTime.parse(values.get(0)); + } + }; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaLocalDateProvider.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaLocalDateProvider.mustache new file mode 100644 index 000000000000..7bd4027e63dc --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaLocalDateProvider.mustache @@ -0,0 +1,44 @@ +package {{apiPackage}}; + +import com.sun.jersey.core.spi.component.ComponentContext; +import com.sun.jersey.spi.inject.Injectable; +import com.sun.jersey.spi.inject.PerRequestTypeInjectableProvider; + +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.Provider; +import org.joda.time.LocalDate; +import java.util.List; + +@Provider +public class JodaLocalDateProvider extends PerRequestTypeInjectableProvider { + private final UriInfo uriInfo; + + public JodaLocalDateProvider(@Context UriInfo uriInfo) { + super(LocalDate.class); + this.uriInfo = uriInfo; + } + + @Override + public Injectable getInjectable(final ComponentContext cc, final QueryParam a) { + return new Injectable() { + @Override + public LocalDate getValue() { + final List values = uriInfo.getQueryParameters().get(a.value()); + + if (values == null || values.isEmpty()) + return null; + if (values.size() > 1) { + throw new WebApplicationException(Response.status(Status.BAD_REQUEST). + entity(a.value() + " cannot contain multiple values").build()); + } + + return LocalDate.parse(values.get(0)); + } + }; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateProvider.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateProvider.mustache new file mode 100644 index 000000000000..8c4cd4cbd157 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateProvider.mustache @@ -0,0 +1,44 @@ +package {{apiPackage}}; + +import com.sun.jersey.core.spi.component.ComponentContext; +import com.sun.jersey.spi.inject.Injectable; +import com.sun.jersey.spi.inject.PerRequestTypeInjectableProvider; + +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.Provider; +import java.time.LocalDate; +import java.util.List; + +@Provider +public class LocalDateProvider extends PerRequestTypeInjectableProvider { + private final UriInfo uriInfo; + + public LocalDateProvider(@Context UriInfo uriInfo) { + super(LocalDate.class); + this.uriInfo = uriInfo; + } + + @Override + public Injectable getInjectable(final ComponentContext cc, final QueryParam a) { + return new Injectable() { + @Override + public LocalDate getValue() { + final List values = uriInfo.getQueryParameters().get(a.value()); + + if (values == null || values.isEmpty()) + return null; + if (values.size() > 1) { + throw new WebApplicationException(Response.status(Status.BAD_REQUEST). + entity(a.value() + " cannot contain multiple values").build()); + } + + return LocalDate.parse(values.get(0)); + } + }; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateTimeProvider.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateTimeProvider.mustache new file mode 100644 index 000000000000..93bb6f19d506 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateTimeProvider.mustache @@ -0,0 +1,44 @@ +package {{apiPackage}}; + +import com.sun.jersey.core.spi.component.ComponentContext; +import com.sun.jersey.spi.inject.Injectable; +import com.sun.jersey.spi.inject.PerRequestTypeInjectableProvider; + +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.Provider; +import java.time.LocalDateTime; +import java.util.List; + +@Provider +public class LocalDateTimeProvider extends PerRequestTypeInjectableProvider { + private final UriInfo uriInfo; + + public LocalDateTimeProvider(@Context UriInfo uriInfo) { + super(LocalDateTime.class); + this.uriInfo = uriInfo; + } + + @Override + public Injectable getInjectable(final ComponentContext cc, final QueryParam a) { + return new Injectable() { + @Override + public LocalDateTime getValue() { + final List values = uriInfo.getQueryParameters().get(a.value()); + + if (values == null || values.isEmpty()) + return null; + if (values.size() > 1) { + throw new WebApplicationException(Response.status(Status.BAD_REQUEST). + entity(a.value() + " cannot contain multiple values").build()); + } + + return LocalDateTime.parse(values.get(0)); + } + }; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/NotFoundException.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/NotFoundException.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/allowableValues.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/allowableValues.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/allowableValues.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/allowableValues.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/api.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/api.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiService.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiService.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/apiService.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiService.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceFactory.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiServiceFactory.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceFactory.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiServiceFactory.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceImpl.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiServiceImpl.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceImpl.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiServiceImpl.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/bodyParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/bodyParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/formParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/formParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/generatedAnnotation.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/generatedAnnotation.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/generatedAnnotation.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/generatedAnnotation.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/headerParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/headerParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pathParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pathParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pom.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pom.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/project/build.properties similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/project/build.properties diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/project/plugins.sbt similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/project/plugins.sbt diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/queryParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/queryParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/returnTypes.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/returnTypes.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/returnTypes.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/returnTypes.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceBodyParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceBodyParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceBodyParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceBodyParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceFormParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceFormParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceFormParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceFormParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceHeaderParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceHeaderParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceHeaderParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceHeaderParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/servicePathParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/servicePathParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/servicePathParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/servicePathParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceQueryParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceQueryParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceQueryParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceQueryParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/web.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/web.mustache diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/java/jaxrs/AllowableValuesTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/java/jaxrs/AllowableValuesTest.java index ef24287b0051..9ae5e6dc3e4b 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/java/jaxrs/AllowableValuesTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/java/jaxrs/AllowableValuesTest.java @@ -17,7 +17,7 @@ import java.nio.charset.StandardCharsets; public class AllowableValuesTest { - private static final String TEMPLATE_FILE = "JavaJaxRS/allowableValues.mustache"; + private static final String TEMPLATE_FILE = "JavaJaxRS/jersey1_18/allowableValues.mustache"; private static final String PROVIDER_NAME = "operations"; private static String loadClassResource(Class cls, String name) throws IOException { From 405e09a0578755969ebb37c2f1c03148f01fdc6b Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Tue, 29 Dec 2015 23:44:15 -0800 Subject: [PATCH 66/82] added tests --- .../codegen/languages/JaxRSServerCodegen.java | 2 +- .../codegen/jaxrs/JaxrsJava8ModelTest.java | 36 +++++++++++++++++++ .../codegen/jaxrs/JaxrsJodaModelTest.java | 36 +++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxrsJava8ModelTest.java create mode 100644 modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxrsJodaModelTest.java diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java index 53a7bbffcab5..10b2ec77206c 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java @@ -122,7 +122,7 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf additionalProperties.put("java8", "true"); additionalProperties.put("javaVersion", "1.8"); typeMapping.put("date", "LocalDate"); - typeMapping.put("date-time", "LocalDateTime"); + typeMapping.put("DateTime", "LocalDateTime"); importMapping.put("LocalDate", "java.time.LocalDate"); importMapping.put("LocalDateTime", "java.time.LocalDateTime"); diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxrsJava8ModelTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxrsJava8ModelTest.java new file mode 100644 index 000000000000..55219787f89d --- /dev/null +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxrsJava8ModelTest.java @@ -0,0 +1,36 @@ +package io.swagger.codegen.jaxrs; + +import io.swagger.codegen.CodegenModel; +import io.swagger.codegen.languages.JaxRSServerCodegen; +import io.swagger.models.Model; +import io.swagger.models.ModelImpl; +import io.swagger.models.properties.DateProperty; +import io.swagger.models.properties.DateTimeProperty; +import io.swagger.models.properties.LongProperty; +import io.swagger.util.Json; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; + +public class JaxrsJava8ModelTest { + @Test(description = "convert a simple java model with java8 types") + public void simpleModelTest() { + final Model model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("theDate", new DateProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name"); + + final JaxRSServerCodegen codegen = new JaxRSServerCodegen(); + codegen.setDateLibrary("java8"); + codegen.processOpts(); + final CodegenModel cm = codegen.fromModel("sample", model); + + Json.prettyPrint(cm); + assertEquals(cm.vars.get(0).datatype, "Long"); + assertEquals(cm.vars.get(1).datatype, "LocalDate"); + assertEquals(cm.vars.get(2).datatype, "LocalDateTime"); + } +} diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxrsJodaModelTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxrsJodaModelTest.java new file mode 100644 index 000000000000..3f2ac1a9ec1b --- /dev/null +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JaxrsJodaModelTest.java @@ -0,0 +1,36 @@ +package io.swagger.codegen.jaxrs; + +import io.swagger.codegen.CodegenModel; +import io.swagger.codegen.languages.JaxRSServerCodegen; +import io.swagger.models.Model; +import io.swagger.models.ModelImpl; +import io.swagger.models.properties.DateProperty; +import io.swagger.models.properties.DateTimeProperty; +import io.swagger.models.properties.LongProperty; +import io.swagger.util.Json; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; + +public class JaxrsJodaModelTest { + @Test(description = "convert a simple java model with Joda types") + public void simpleModelTest() { + final Model model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("theDate", new DateProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name"); + + final JaxRSServerCodegen codegen = new JaxRSServerCodegen(); + codegen.setDateLibrary("joda"); + codegen.processOpts(); + final CodegenModel cm = codegen.fromModel("sample", model); + + Json.prettyPrint(cm); + assertEquals(cm.vars.get(0).datatype, "Long"); + assertEquals(cm.vars.get(1).datatype, "LocalDate"); + assertEquals(cm.vars.get(2).datatype, "DateTime"); + } +} From 05b0d8f1bf3229ebda5cb338362f56a5cce6096d Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 30 Dec 2015 00:06:24 -0800 Subject: [PATCH 67/82] added `serverPort` --- .../swagger/codegen/languages/JaxRSServerCodegen.java | 10 ++++++++++ .../resources/JavaJaxRS/jersey1_18/README.mustache | 2 +- .../main/resources/JavaJaxRS/jersey1_18/pom.mustache | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java index 10b2ec77206c..ae22656cd979 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java @@ -166,6 +166,16 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf if("/".equals(swagger.getBasePath())) { swagger.setBasePath(""); } + + String host = swagger.getHost(); + String port = "8080"; + if(host != null) { + String[] parts = host.split(":"); + if(parts.length > 0) { + port = parts[1]; + } + } + this.additionalProperties.put("serverPort", port); if(swagger != null && swagger.getPaths() != null) { for(String pathname : swagger.getPaths().keySet()) { Path path = swagger.getPath(pathname); diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache index f240464851d2..7bad8dbee0ad 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache @@ -16,7 +16,7 @@ mvn clean package jetty:run You can then view the swagger listing here: ``` -http://localhost:8080{{contextPath}}/swagger.json +http://localhost:{{serverPort}}{{contextPath}}/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pom.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pom.mustache index b8426a0a6931..0d1b06de43a0 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pom.mustache @@ -37,7 +37,7 @@ 8079 stopit - 8080 + {{serverPort}} 60000 From 67bea9ec270162517353dc39f3a608ac06239ef0 Mon Sep 17 00:00:00 2001 From: lugaru1234 Date: Wed, 30 Dec 2015 16:27:59 +0300 Subject: [PATCH 68/82] CliOption.type has ben set to boolean for boolean options --- .../src/main/java/io/swagger/codegen/DefaultCodegen.java | 7 ++++--- .../io/swagger/codegen/languages/AndroidClientCodegen.java | 5 +++-- .../io/swagger/codegen/languages/CSharpClientCodegen.java | 7 +++++-- .../io/swagger/codegen/languages/JavaClientCodegen.java | 7 ++++--- .../io/swagger/codegen/languages/PerlClientCodegen.java | 7 +++++-- .../io/swagger/codegen/languages/PythonClientCodegen.java | 3 ++- 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 8364800fce69..415fd729de90 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -434,9 +434,10 @@ public class DefaultCodegen { importMapping.put("LocalTime", "org.joda.time.*"); cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, - CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC).defaultValue("true")); - cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC) - .defaultValue("true")); + CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC, BooleanProperty.TYPE) + .defaultValue(Boolean.TRUE.toString())); + cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC, + BooleanProperty.TYPE).defaultValue(Boolean.TRUE.toString())); } /** diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java index 704b38f7f46f..636739c6b642 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java @@ -7,6 +7,7 @@ import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.BooleanProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; @@ -67,8 +68,8 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, "artifactId for use in the generated build.gradle and pom.xml")); cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, "artifact version for use in the generated build.gradle and pom.xml")); cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); - cliOptions.add(new CliOption(USE_ANDROID_MAVEN_GRADLE_PLUGIN, "A flag to toggle android-maven gradle plugin.") - .defaultValue("true")); + cliOptions.add(new CliOption(USE_ANDROID_MAVEN_GRADLE_PLUGIN, "A flag to toggle android-maven gradle plugin.", + BooleanProperty.TYPE).defaultValue(Boolean.TRUE.toString())); } @Override diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index acf0b1b12621..5a1d1b9598bd 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -89,8 +89,11 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig cliOptions.add(new CliOption(CodegenConstants.PACKAGE_NAME, "C# package name (convention: Camel.Case).") .defaultValue("IO.Swagger")); cliOptions.add(new CliOption(CodegenConstants.PACKAGE_VERSION, "C# package version.").defaultValue("1.0.0")); - cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC)); - cliOptions.add(new CliOption(CodegenConstants.OPTIONAL_METHOD_ARGUMENT, "C# Optional method argument, e.g. void square(int x=10) (.net 4.0+ only). Default: false").defaultValue("false")); + cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, + CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC, BooleanProperty.TYPE)); + cliOptions.add(new CliOption(CodegenConstants.OPTIONAL_METHOD_ARGUMENT, "C# Optional method argument, " + + "e.g. void square(int x=10) (.net 4.0+ only).", BooleanProperty.TYPE) + .defaultValue(Boolean.FALSE.toString())); } @Override diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java index e408641c8a62..08a28b81bf1c 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java @@ -99,9 +99,10 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC)); cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); - cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC)); - cliOptions.add(new CliOption(FULL_JAVA_UTIL, "whether to use fully qualified name for classes under java.util") - .defaultValue("false")); + cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC, + BooleanProperty.TYPE)); + cliOptions.add(new CliOption(FULL_JAVA_UTIL, "whether to use fully qualified name for classes under java.util", + BooleanProperty.TYPE).defaultValue(Boolean.FALSE.toString())); supportedLibraries.put(DEFAULT_LIBRARY, "HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2"); supportedLibraries.put("feign", "HTTP client: Netflix Feign 8.1.1"); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java index 8950ff21a22f..76c1afacb565 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java @@ -7,6 +7,7 @@ import io.swagger.codegen.SupportingFile; import io.swagger.codegen.CodegenConstants; import io.swagger.codegen.CliOption; import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.BooleanProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; @@ -73,8 +74,10 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.clear(); cliOptions.add(new CliOption(MODULE_NAME, "Perl module name (convention: CamelCase).").defaultValue("SwaggerClient")); cliOptions.add(new CliOption(MODULE_VERSION, "Perl module version.").defaultValue("1.0.0")); - cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC)); - cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, + CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC, BooleanProperty.TYPE)); + cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC, + BooleanProperty.TYPE)); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java index d7fdd39239af..205e710e990f 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java @@ -65,7 +65,8 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig .defaultValue("swagger_client")); cliOptions.add(new CliOption(CodegenConstants.PACKAGE_VERSION, "python package version.") .defaultValue("1.0.0")); - cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, + CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC, BooleanProperty.TYPE)); } @Override From 460e5befec4e5f821e6f0808b5fc166844f578c9 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 30 Dec 2015 10:42:20 -0800 Subject: [PATCH 69/82] fixed index issue --- .../java/io/swagger/codegen/languages/JaxRSServerCodegen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java index ae22656cd979..1cf57b8bdef1 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java @@ -171,7 +171,7 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf String port = "8080"; if(host != null) { String[] parts = host.split(":"); - if(parts.length > 0) { + if(parts.length > 1) { port = parts[1]; } } From ac7856d009f5915b0dd246f9c07efe9000afc860 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 30 Dec 2015 12:27:31 -0800 Subject: [PATCH 70/82] formatting --- .../main/resources/Java/enumClass.mustache | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache index e0ec74385ff0..6010e26704f5 100644 --- a/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache @@ -1,17 +1,17 @@ -public enum {{{datatypeWithEnum}}} { - {{#allowableValues}}{{#enumVars}}{{{name}}}("{{{value}}}"){{^-last}}, - {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + public enum {{{datatypeWithEnum}}} { + {{#allowableValues}}{{#enumVars}}{{{name}}}("{{{value}}}"){{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} - private String value; + private String value; - {{{datatypeWithEnum}}}(String value) { - this.value = value; + {{{datatypeWithEnum}}}(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return value; + } } - - @Override - @JsonValue - public String toString() { - return value; - } -} From 1cd54ee6856a8be28082678ff1193b2edf86d60f Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 30 Dec 2015 12:32:37 -0800 Subject: [PATCH 71/82] added `bigDecimalAsString` option to allow serializing with strings --- .../io/swagger/codegen/CodegenConfig.java | 4 ++ .../io/swagger/codegen/CodegenConstants.java | 3 + .../io/swagger/codegen/DefaultCodegen.java | 18 ++++- .../codegen/languages/JavaClientCodegen.java | 69 +++++++++++-------- .../src/main/resources/Java/pojo.mustache | 1 + .../JavaInflectorServerOptionsTest.java | 4 +- .../codegen/options/JavaOptionsProvider.java | 1 + 7 files changed, 68 insertions(+), 32 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java index c111a3af2fcb..a74e652bb6d8 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java @@ -109,6 +109,10 @@ public interface CodegenConfig { Map postProcessSupportingFileData(Map objs); + void postProcessModelProperty(CodegenModel model, CodegenProperty property); + + void postProcessParameter(CodegenParameter parameter); + String apiFilename(String templateName, String tag); boolean shouldOverwrite(String filename); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java index 9c2711f8cad8..06d7e801176d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java @@ -34,6 +34,9 @@ public class CodegenConstants { public static final String SERIALIZABLE_MODEL = "serializableModel"; public static final String SERIALIZABLE_MODEL_DESC = "boolean - toggle \"implements Serializable\" for generated models"; + public static final String SERIALIZE_BIG_DECIMAL_AS_STRING = "bigDecimalAsString"; + public static final String SERIALIZE_BIG_DECIMAL_AS_STRING_DESC = "boolean - treat BigDecimal values as Strings to avoid precision loss. Default: false"; + public static final String LIBRARY = "library"; public static final String LIBRARY_DESC = "library template (sub-template)"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 415fd729de90..c8362d1b19d0 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -120,6 +120,12 @@ public class DefaultCodegen { return objs; } + // override to post-process any model properties + public void postProcessModelProperty(CodegenModel model, CodegenProperty property){} + + // override to post-process any parameters + public void postProcessParameter(CodegenParameter parameter){} + //override with any special handling of the entire swagger spec public void preprocessSwagger(Swagger swagger) { } @@ -620,7 +626,9 @@ public class DefaultCodegen { **/ public String getSwaggerType(Property p) { String datatype = null; - if (p instanceof StringProperty) { + if (p instanceof StringProperty && "number".equals(p.getFormat())) { + datatype = "BigDecimal"; + } else if (p instanceof StringProperty) { datatype = "string"; } else if (p instanceof ByteArrayProperty) { datatype = "ByteArray"; @@ -843,6 +851,12 @@ public class DefaultCodegen { } addVars(m, impl.getProperties(), impl.getRequired()); } + + if(m.vars != null) { + for(CodegenProperty prop : m.vars) { + postProcessModelProperty(m, prop); + } + } return m; } @@ -1595,6 +1609,8 @@ public class DefaultCodegen { } p.paramName = toParamName(bp.getName()); } + + postProcessParameter(p); return p; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java index 08a28b81bf1c..f23b719d679f 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java @@ -1,45 +1,21 @@ package io.swagger.codegen.languages; import com.google.common.base.Strings; -import io.swagger.codegen.CliOption; -import io.swagger.codegen.CodegenConfig; -import io.swagger.codegen.CodegenConstants; -import io.swagger.codegen.CodegenModel; -import io.swagger.codegen.CodegenOperation; -import io.swagger.codegen.CodegenProperty; -import io.swagger.codegen.CodegenType; -import io.swagger.codegen.DefaultCodegen; -import io.swagger.codegen.SupportingFile; +import io.swagger.codegen.*; import io.swagger.models.Model; import io.swagger.models.Operation; import io.swagger.models.Path; import io.swagger.models.Swagger; -import io.swagger.models.parameters.BodyParameter; import io.swagger.models.parameters.FormParameter; import io.swagger.models.parameters.Parameter; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.BooleanProperty; -import io.swagger.models.properties.DoubleProperty; -import io.swagger.models.properties.FloatProperty; -import io.swagger.models.properties.IntegerProperty; -import io.swagger.models.properties.LongProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.Property; -import io.swagger.models.properties.StringProperty; - -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 io.swagger.models.properties.*; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; +import java.util.*; + public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(JavaClientCodegen.class); public static final String FULL_JAVA_UTIL = "fullJavaUtil"; @@ -55,6 +31,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { protected boolean fullJavaUtil = false; protected String javaUtilPrefix = ""; protected Boolean serializableModel = false; + protected boolean serializeBigDecimalAsString = false; public JavaClientCodegen() { super(); @@ -101,6 +78,8 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC, BooleanProperty.TYPE)); + cliOptions.add(new CliOption(CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING, CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING_DESC, + BooleanProperty.TYPE)); cliOptions.add(new CliOption(FULL_JAVA_UTIL, "whether to use fully qualified name for classes under java.util", BooleanProperty.TYPE).defaultValue(Boolean.FALSE.toString())); @@ -181,6 +160,10 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { this.setLibrary((String) additionalProperties.get(CodegenConstants.LIBRARY)); } + if(additionalProperties.containsKey(CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING)) { + this.setSerializeBigDecimalAsString(Boolean.valueOf(additionalProperties.get(CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING).toString())); + } + // need to put back serializableModel (boolean) into additionalProperties as value in additionalProperties is string additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, serializableModel); @@ -212,6 +195,11 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { this.sanitizeConfig(); + + // optional jackson mappings for BigDecimal support + importMapping.put("ToStringSerializer", "com.fasterxml.jackson.databind.ser.std.ToStringSerializer"); + importMapping.put("JsonSerialize", "com.fasterxml.jackson.databind.annotation.JsonSerialize"); + final String invokerFolder = (sourceFolder + '/' + invokerPackage).replace(".", "/"); supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); @@ -471,6 +459,26 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return codegenModel; } + @Override + public void postProcessModelProperty(CodegenModel model, CodegenProperty property) { + if(serializeBigDecimalAsString) { + if (property.baseType.equals("BigDecimal")) { + // we serialize BigDecimal as `string` to avoid precision loss + property.vendorExtensions.put("extraAnnotation", "@JsonSerialize(using = ToStringSerializer.class)"); + + // this requires some more imports to be added for this model... + model.imports.add("ToStringSerializer"); + model.imports.add("JsonSerialize"); + } + } + return; + } + + @Override + public void postProcessParameter(CodegenParameter parameter) { + return; + } + @Override public Map postProcessModels(Map objs) { List models = (List) objs.get("models"); @@ -702,6 +710,9 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { this.localVariablePrefix = localVariablePrefix; } + public void setSerializeBigDecimalAsString(boolean s) { + this.serializeBigDecimalAsString = s; + } public Boolean getSerializableModel() { return serializableModel; diff --git a/modules/swagger-codegen/src/main/resources/Java/pojo.mustache b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache index 8d92141fa7fb..6d65b5a888da 100644 --- a/modules/swagger-codegen/src/main/resources/Java/pojo.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache @@ -14,6 +14,7 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali * minimum: {{minimum}}{{/minimum}}{{#maximum}} * maximum: {{maximum}}{{/maximum}} **/ + {{#vendorExtensions.extraAnnotation}}{{vendorExtensions.extraAnnotation}}{{/vendorExtensions.extraAnnotation}} @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") @JsonProperty("{{baseName}}") public {{{datatypeWithEnum}}} {{getter}}() { diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/inflector/JavaInflectorServerOptionsTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/inflector/JavaInflectorServerOptionsTest.java index d7046dda9b2a..8c54a382993b 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/inflector/JavaInflectorServerOptionsTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/inflector/JavaInflectorServerOptionsTest.java @@ -4,8 +4,6 @@ import io.swagger.codegen.CodegenConfig; import io.swagger.codegen.java.JavaClientOptionsTest; import io.swagger.codegen.languages.JavaInflectorServerCodegen; import io.swagger.codegen.options.JavaInflectorServerOptionsProvider; -import io.swagger.codegen.options.JavaOptionsProvider; - import mockit.Expectations; import mockit.Tested; @@ -50,6 +48,8 @@ public class JavaInflectorServerOptionsTest extends JavaClientOptionsTest { times = 1; clientCodegen.setFullJavaUtil(Boolean.valueOf(JavaInflectorServerOptionsProvider.FULL_JAVA_UTIL_VALUE)); times = 1; + clientCodegen.setSerializeBigDecimalAsString(true); + times = 1; }}; } } diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JavaOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JavaOptionsProvider.java index 8ea7ee314528..7e5fd36793a8 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JavaOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JavaOptionsProvider.java @@ -38,6 +38,7 @@ public class JavaOptionsProvider implements OptionsProvider { .put(CodegenConstants.SERIALIZABLE_MODEL, SERIALIZABLE_MODEL_VALUE) .put(JavaClientCodegen.FULL_JAVA_UTIL, FULL_JAVA_UTIL_VALUE) .put(CodegenConstants.LIBRARY, LIBRARY_VALUE) + .put(CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING, "true") .build(); } From d75e602168a9075a9df371f8017c500837afa594 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 30 Dec 2015 13:16:08 -0800 Subject: [PATCH 72/82] made imports more intelligent --- .../java/io/swagger/codegen/CodegenModel.java | 2 +- .../io/swagger/codegen/DefaultGenerator.java | 1 + .../codegen/languages/JavaClientCodegen.java | 21 ++++++++++++++++++- .../src/main/resources/Java/model.mustache | 3 --- .../codegen/java/JavaModelEnumTest.java | 4 +--- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java index b4d964647b7e..3713261f8f1d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java @@ -15,7 +15,7 @@ public class CodegenModel { // list of all required parameters public Set mandatory = new HashSet(); - public Set imports = new HashSet(); + public Set imports = new TreeSet(); public Boolean hasVars, emptyVars, hasMoreModels, hasEnums, isEnum; public ExternalDocs externalDocs; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index 3623361387ed..01ac045c38dc 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -697,6 +697,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { mo.put("model", cm); mo.put("importPath", config.toModelImport(key)); models.add(mo); + allImports.addAll(cm.imports); } objs.put("models", models); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java index f23b719d679f..247517d948c3 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java @@ -147,7 +147,6 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { this.setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); } - if (additionalProperties.containsKey(CodegenConstants.LOCAL_VARIABLE_PREFIX)) { this.setLocalVariablePrefix((String) additionalProperties.get(CodegenConstants.LOCAL_VARIABLE_PREFIX)); } @@ -200,6 +199,14 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { importMapping.put("ToStringSerializer", "com.fasterxml.jackson.databind.ser.std.ToStringSerializer"); importMapping.put("JsonSerialize", "com.fasterxml.jackson.databind.annotation.JsonSerialize"); + // imports for pojos + importMapping.put("ApiModelProperty", "io.swagger.annotations.ApiModelProperty"); + importMapping.put("ApiModel", "io.swagger.annotations.ApiModel"); + importMapping.put("JsonProperty", "com.fasterxml.jackson.annotation.JsonProperty"); + importMapping.put("JsonValue", "com.fasterxml.jackson.annotation.JsonValue"); + importMapping.put("Objects", "java.util.Objects"); + importMapping.put("StringUtil", invokerPackage + ".StringUtil"); + final String invokerFolder = (sourceFolder + '/' + invokerPackage).replace(".", "/"); supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); @@ -471,6 +478,18 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { model.imports.add("JsonSerialize"); } } + if(model.isEnum == null || model.isEnum) { + // needed by all pojos, but not enums + model.imports.add("ApiModelProperty"); + model.imports.add("ApiModel"); + model.imports.add("JsonProperty"); + model.imports.add("Objects"); + model.imports.add("StringUtil"); + + if(model.hasEnums != null || model.hasEnums == true) { + model.imports.add("JsonValue"); + } + } return; } diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache index b62cb9832818..2f3d4780a333 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -6,10 +6,7 @@ import {{invokerPackage}}.StringUtil; {{#serializableModel}} import java.io.Serializable;{{/serializableModel}} -import java.util.Objects; -import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.*; {{#models}} {{#model}}{{#description}} diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/java/JavaModelEnumTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/java/JavaModelEnumTest.java index 46828a1f805f..33470e9bb501 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/java/JavaModelEnumTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/java/JavaModelEnumTest.java @@ -10,13 +10,11 @@ import io.swagger.models.ModelImpl; import io.swagger.models.RefModel; import io.swagger.models.properties.Property; import io.swagger.models.properties.StringProperty; - import org.testng.Assert; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -83,7 +81,7 @@ public class JavaModelEnumTest { Assert.assertEquals(cm.name, "sample"); Assert.assertEquals(cm.classname, "Sample"); Assert.assertEquals(cm.parent, "ParentModel"); - Assert.assertEquals(cm.imports, Collections.singletonList("ParentModel")); + Assert.assertTrue(cm.imports.contains("ParentModel")); // Assert that only the unshared/uninherited enum remains Assert.assertEquals(cm.vars.size(), 1); From 788c70922d1322fc99930ff51a2f51e345e864a1 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 30 Dec 2015 13:40:51 -0800 Subject: [PATCH 73/82] updated cli name --- .../src/main/java/io/swagger/codegen/SwaggerCodegen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/SwaggerCodegen.java b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/SwaggerCodegen.java index 3cdc01fe3f5a..502e4d046bae 100644 --- a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/SwaggerCodegen.java +++ b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/SwaggerCodegen.java @@ -21,7 +21,7 @@ public class SwaggerCodegen { public static void main(String[] args) { - Cli.CliBuilder builder = Cli.builder("swagger") + Cli.CliBuilder builder = Cli.builder("swagger-codegen-cli") .withDescription("Swagger code generator CLI. More info on swagger.io") .withDefaultCommand(Langs.class) .withCommands( From 83460ba81afac7fbdef0e9e4ea26d7d7b605427f Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 30 Dec 2015 13:40:58 -0800 Subject: [PATCH 74/82] improved install instructions --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f1691144b9a..9f396cc3ff42 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,20 @@ Swagger Codegen Version | Release Date | Swagger Spec compatibility | Notes ### Prerequisites -You need the following installed and available in your $PATH: +If you're looking for the latest stable version, you can grab it directly from maven central (you'll need the java 7 runtime): + +``` +wget http://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.1.4/swagger-codegen-cli-2.1.4.jar swagger-codegen-cli.jar + +java -jar swagger-codegen-cli.jar help +``` + +On a mac, it's even easier with `brew`: +``` +brew install swagger-codegen +``` + +To build from source, you need the following installed and available in your $PATH: * [Java 7](http://java.oracle.com) From 9ca914f769ed2840b19f51d9c61a6ff4d3a3dd73 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 30 Dec 2015 14:20:52 -0800 Subject: [PATCH 75/82] updated jaxrs generator pojos --- .../codegen/languages/JaxRSServerCodegen.java | 18 +---- .../JavaJaxRS/jersey1_18/StringUtil.mustache | 42 +++++++++++ .../JavaJaxRS/jersey1_18/enumClass.mustache | 17 +++++ .../jersey1_18/enumOuterClass.mustache | 3 + .../JavaJaxRS/jersey1_18/model.mustache | 70 +++---------------- .../JavaJaxRS/jersey1_18/pojo.mustache | 68 ++++++++++++++++++ 6 files changed, 140 insertions(+), 78 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/StringUtil.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumClass.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumOuterClass.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java index 1cf57b8bdef1..9998822c4c90 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java @@ -100,6 +100,8 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf (sourceFolder + '/' + apiPackage).replace(".", "/"), "NotFoundException.java")); supportingFiles.add(new SupportingFile("web.mustache", ("src/main/webapp/WEB-INF"), "web.xml")); + supportingFiles.add(new SupportingFile("StringUtil.mustache", + (sourceFolder + '/' + apiPackage).replace(".", "/"), "StringUtil.java")); if (additionalProperties.containsKey("dateLibrary")) { setDateLibrary(additionalProperties.get("dateLibrary").toString()); @@ -204,22 +206,6 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf } } - @Override - public Map postProcessModels(Map objs) { - List models = (List) objs.get("models"); - for (Object _mo : models) { - Map mo = (Map) _mo; - CodegenModel cm = (CodegenModel) mo.get("model"); - for (CodegenProperty var : cm.vars) { - // handle default value for enum, e.g. available => StatusEnum.available - if (var.isEnum && var.defaultValue != null && !"null".equals(var.defaultValue)) { - var.defaultValue = var.datatypeWithEnum + "." + var.defaultValue; - } - } - } - return objs; - } - @Override public Map postProcessOperations(Map objs) { Map operations = (Map) objs.get("operations"); diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/StringUtil.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/StringUtil.mustache new file mode 100644 index 000000000000..073966b0c217 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/StringUtil.mustache @@ -0,0 +1,42 @@ +package {{invokerPackage}}; + +{{>generatedAnnotation}} +public class StringUtil { + /** + * Check if the given array contains the given value (with case-insensitive comparison). + * + * @param array The array + * @param value The value to search + * @return true if the array contains the value + */ + public static boolean containsIgnoreCase(String[] array, String value) { + for (String str : array) { + if (value == null && str == null) return true; + if (value != null && value.equalsIgnoreCase(str)) return true; + } + return false; + } + + /** + * Join an array of strings with the given separator. + *

    + * Note: This might be replaced by utility method from commons-lang or guava someday + * if one of those libraries is added as dependency. + *

    + * + * @param array The array of strings + * @param separator The separator + * @return the resulting string + */ + public static String join(String[] array, String separator) { + int len = array.length; + if (len == 0) return ""; + + StringBuilder out = new StringBuilder(); + out.append(array[0]); + for (int i = 1; i < len; i++) { + out.append(separator).append(array[i]); + } + return out.toString(); + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumClass.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumClass.mustache new file mode 100644 index 000000000000..6010e26704f5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumClass.mustache @@ -0,0 +1,17 @@ + + public enum {{{datatypeWithEnum}}} { + {{#allowableValues}}{{#enumVars}}{{{name}}}("{{{value}}}"){{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + + private String value; + + {{{datatypeWithEnum}}}(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return value; + } + } diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumOuterClass.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumOuterClass.mustache new file mode 100644 index 000000000000..7aea7b92f22f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumOuterClass.mustache @@ -0,0 +1,3 @@ +public enum {{classname}} { + {{#allowableValues}}{{.}}{{^-last}}, {{/-last}}{{/allowableValues}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache index 63bba4a8dfb9..2f3d4780a333 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache @@ -1,73 +1,19 @@ package {{package}}; +import {{invokerPackage}}.StringUtil; {{#imports}}import {{import}}; {{/imports}} -import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +{{#serializableModel}} +import java.io.Serializable;{{/serializableModel}} -import java.util.Objects; {{#models}} -{{#model}}{{#unescapedDescription}} +{{#model}}{{#description}} /** - * {{unescapedDescription}} - **/{{/unescapedDescription}} -@ApiModel(description = "{{{description}}}") -{{>generatedAnnotation}} -public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { - {{#vars}}{{#isEnum}} - public enum {{datatypeWithEnum}} { - {{#allowableValues}}{{#values}} {{.}}, {{/values}}{{/allowableValues}} - }; - private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/isEnum}}{{^isEnum}} - private {{{datatype}}} {{name}} = {{{defaultValue}}};{{/isEnum}}{{/vars}} - - {{#vars}} - /**{{#unescapedDescription}} - * {{{unescapedDescription}}}{{/unescapedDescription}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") - @JsonProperty("{{baseName}}") - public {{{datatypeWithEnum}}} {{getter}}() { - return {{name}}; - } - public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { - this.{{name}} = {{name}}; - } - - {{/vars}} - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} - return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && - {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} - return true;{{/hasVars}} - } - - @Override - public int hashCode() { - return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); - {{/vars}}sb.append("}\n"); - return sb.toString(); - } -} + * {{description}} + **/{{/description}} +{{#isEnum}}{{>enumOuterClass}}{{/isEnum}} +{{^isEnum}}{{>pojo}}{{/isEnum}} {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache new file mode 100644 index 000000000000..6d65b5a888da --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache @@ -0,0 +1,68 @@ +@ApiModel(description = "{{{description}}}") +{{>generatedAnnotation}} +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { + {{#vars}}{{#isEnum}} + +{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} + +{{>enumClass}}{{/items}}{{/items.isEnum}} + private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + {{#vendorExtensions.extraAnnotation}}{{vendorExtensions.extraAnnotation}}{{/vendorExtensions.extraAnnotation}} + @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") + @JsonProperty("{{baseName}}") + public {{{datatypeWithEnum}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); + {{/vars}}sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} From e08e578c5843ac8786b3ea7003eaa170894fb635 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 30 Dec 2015 14:51:37 -0800 Subject: [PATCH 76/82] updated templates per #1789 --- .../languages/JavaInflectorServerCodegen.java | 18 +---- .../JavaInflector/StringUtil.mustache | 42 ++++++++++++ .../JavaInflector/enumClass.mustache | 17 +++++ .../JavaInflector/enumOuterClass.mustache | 3 + .../resources/JavaInflector/model.mustache | 43 +----------- .../resources/JavaInflector/pojo.mustache | 68 +++++++++++++++++++ 6 files changed, 135 insertions(+), 56 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/JavaInflector/StringUtil.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaInflector/enumClass.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaInflector/enumOuterClass.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaInflector/pojo.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java index a7612638255d..01ca02f185d9 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java @@ -73,6 +73,8 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod "src/main/swagger", "swagger.yaml") ); + supportingFiles.add(new SupportingFile("StringUtil.mustache", + (sourceFolder + '/' + invokerPackage).replace(".", "/"), "StringUtil.java")); } @Override @@ -118,22 +120,6 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod co.baseName = basePath; } - @Override - public Map postProcessModels(Map objs) { - List models = (List) objs.get("models"); - for (Object _mo : models) { - Map mo = (Map) _mo; - CodegenModel cm = (CodegenModel) mo.get("model"); - for (CodegenProperty var : cm.vars) { - // handle default value for enum, e.g. available => StatusEnum.available - if (var.isEnum && var.defaultValue != null && !"null".equals(var.defaultValue)) { - var.defaultValue = var.datatypeWithEnum + "." + var.defaultValue; - } - } - } - return objs; - } - @Override public Map postProcessOperations(Map objs) { Map operations = (Map) objs.get("operations"); diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/StringUtil.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/StringUtil.mustache new file mode 100644 index 000000000000..073966b0c217 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/StringUtil.mustache @@ -0,0 +1,42 @@ +package {{invokerPackage}}; + +{{>generatedAnnotation}} +public class StringUtil { + /** + * Check if the given array contains the given value (with case-insensitive comparison). + * + * @param array The array + * @param value The value to search + * @return true if the array contains the value + */ + public static boolean containsIgnoreCase(String[] array, String value) { + for (String str : array) { + if (value == null && str == null) return true; + if (value != null && value.equalsIgnoreCase(str)) return true; + } + return false; + } + + /** + * Join an array of strings with the given separator. + *

    + * Note: This might be replaced by utility method from commons-lang or guava someday + * if one of those libraries is added as dependency. + *

    + * + * @param array The array of strings + * @param separator The separator + * @return the resulting string + */ + public static String join(String[] array, String separator) { + int len = array.length; + if (len == 0) return ""; + + StringBuilder out = new StringBuilder(); + out.append(array[0]); + for (int i = 1; i < len; i++) { + out.append(separator).append(array[i]); + } + return out.toString(); + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/enumClass.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/enumClass.mustache new file mode 100644 index 000000000000..6010e26704f5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/enumClass.mustache @@ -0,0 +1,17 @@ + + public enum {{{datatypeWithEnum}}} { + {{#allowableValues}}{{#enumVars}}{{{name}}}("{{{value}}}"){{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + + private String value; + + {{{datatypeWithEnum}}}(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return value; + } + } diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/enumOuterClass.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/enumOuterClass.mustache new file mode 100644 index 000000000000..7aea7b92f22f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/enumOuterClass.mustache @@ -0,0 +1,3 @@ +public enum {{classname}} { + {{#allowableValues}}{{.}}{{^-last}}, {{/-last}}{{/allowableValues}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/model.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/model.mustache index 39f0f0b6fa12..005d63991daf 100644 --- a/modules/swagger-codegen/src/main/resources/JavaInflector/model.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/model.mustache @@ -3,50 +3,13 @@ package {{package}}; {{#imports}}import {{import}}; {{/imports}} -import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +{{#serializableModel}}import java.io.Serializable;{{/serializableModel}} {{#models}} - {{#model}}{{#description}} /** * {{description}} **/{{/description}} -@ApiModel(description = "{{{description}}}") -{{>generatedAnnotation}} -public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { - {{#vars}}{{#isEnum}} - public enum {{datatypeWithEnum}} { - {{#allowableValues}}{{#values}} {{.}}, {{/values}}{{/allowableValues}} - }; - private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/isEnum}}{{^isEnum}} - private {{{datatype}}} {{name}} = {{{defaultValue}}};{{/isEnum}}{{/vars}} - - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") - @JsonProperty("{{baseName}}") - public {{{datatypeWithEnum}}} {{getter}}() { - return {{name}}; - } - public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { - this.{{name}} = {{name}}; - } - - {{/vars}} - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); - {{/vars}}sb.append("}\n"); - return sb.toString(); - } -} +{{#isEnum}}{{>enumOuterClass}}{{/isEnum}} +{{^isEnum}}{{>pojo}}{{/isEnum}} {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/pojo.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/pojo.mustache new file mode 100644 index 000000000000..eea33d346d4d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/pojo.mustache @@ -0,0 +1,68 @@ +{{#description}}@ApiModel(description = "{{{description}}}"){{/description}} +{{>generatedAnnotation}} +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { + {{#vars}}{{#isEnum}} + +{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} + +{{>enumClass}}{{/items}}{{/items.isEnum}} + private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + {{#vendorExtensions.extraAnnotation}}{{vendorExtensions.extraAnnotation}}{{/vendorExtensions.extraAnnotation}} + @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") + @JsonProperty("{{baseName}}") + public {{{datatypeWithEnum}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); + {{/vars}}sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} From adb3795a44dae580421ca3f0c5ca40cab6c7c0b3 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Wed, 30 Dec 2015 14:51:43 -0800 Subject: [PATCH 77/82] formatting --- .../io/swagger/codegen/DefaultGenerator.java | 17 +++++++++++------ .../src/main/resources/Java/model.mustache | 6 +----- .../src/main/resources/Java/pojo.mustache | 2 +- .../JavaJaxRS/jersey1_18/model.mustache | 6 +----- .../JavaJaxRS/jersey1_18/pojo.mustache | 2 +- 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index 01ac045c38dc..c5be6d4563a8 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -702,25 +702,30 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } objs.put("models", models); - List> imports = new ArrayList>(); + Set importSet = new TreeSet(); for (String nextImport : allImports) { - Map im = new LinkedHashMap(); + Map im = new HashMap(); String mapping = config.importMapping().get(nextImport); if (mapping == null) { mapping = config.toModelImport(nextImport); } if (mapping != null && !config.defaultIncludes().contains(mapping)) { - im.put("import", mapping); - imports.add(im); + importSet.add(mapping); } // add instantiation types mapping = config.instantiationTypes().get(nextImport); if (mapping != null && !config.defaultIncludes().contains(mapping)) { - im.put("import", mapping); - imports.add(im); + importSet.add(mapping); } } + List> imports = new ArrayList>(); + for(String s: importSet) { + Map item = new HashMap(); + item.put("import", s); + imports.add(item); + } + objs.put("imports", imports); config.postProcessModels(objs); diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache index 2f3d4780a333..005d63991daf 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -1,14 +1,10 @@ package {{package}}; -import {{invokerPackage}}.StringUtil; {{#imports}}import {{import}}; {{/imports}} -{{#serializableModel}} -import java.io.Serializable;{{/serializableModel}} - +{{#serializableModel}}import java.io.Serializable;{{/serializableModel}} {{#models}} - {{#model}}{{#description}} /** * {{description}} diff --git a/modules/swagger-codegen/src/main/resources/Java/pojo.mustache b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache index 6d65b5a888da..eea33d346d4d 100644 --- a/modules/swagger-codegen/src/main/resources/Java/pojo.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache @@ -1,4 +1,4 @@ -@ApiModel(description = "{{{description}}}") +{{#description}}@ApiModel(description = "{{{description}}}"){{/description}} {{>generatedAnnotation}} public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { {{#vars}}{{#isEnum}} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache index 2f3d4780a333..005d63991daf 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache @@ -1,14 +1,10 @@ package {{package}}; -import {{invokerPackage}}.StringUtil; {{#imports}}import {{import}}; {{/imports}} -{{#serializableModel}} -import java.io.Serializable;{{/serializableModel}} - +{{#serializableModel}}import java.io.Serializable;{{/serializableModel}} {{#models}} - {{#model}}{{#description}} /** * {{description}} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache index 6d65b5a888da..eea33d346d4d 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache @@ -1,4 +1,4 @@ -@ApiModel(description = "{{{description}}}") +{{#description}}@ApiModel(description = "{{{description}}}"){{/description}} {{>generatedAnnotation}} public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { {{#vars}}{{#isEnum}} From 9a54371ca9e0355dfebd7cdfe4c4632684791c5a Mon Sep 17 00:00:00 2001 From: Ron Date: Wed, 30 Dec 2015 14:52:15 -0800 Subject: [PATCH 78/82] Swagger Spec -> OpenAPI Spec --- CONTRIBUTING.md | 4 ++-- README.md | 16 ++++++++-------- modules/swagger-codegen-maven-plugin/README.md | 2 +- .../io/swagger/codegen/DefaultGenerator.java | 2 +- .../codegen/languages/PhpClientCodegen.java | 2 +- .../codegen/languages/SilexServerCodegen.java | 2 +- .../languages/SlimFrameworkServerCodegen.java | 2 +- .../JavaJaxRS/jersey1_18/README.mustache | 2 +- .../main/resources/JavaSpringMVC/README.mustache | 2 +- .../src/main/resources/codegen/README.mustache | 4 ++-- .../resources/flaskConnexion/README.mustache | 2 +- .../src/main/resources/nodejs/README.mustache | 2 +- .../src/main/resources/perl/ApiClient.mustache | 2 +- .../src/main/resources/perl/README.mustache | 6 +++--- .../src/main/resources/perl/Role.mustache | 6 +++--- .../main/resources/php/configuration.mustache | 2 +- .../src/main/resources/scalatra/README.mustache | 2 +- .../src/main/resources/silex/README.mustache | 2 +- .../src/main/resources/slim/README.mustache | 2 +- .../src/main/resources/validator/index.mustache | 4 ++-- samples/client/petstore/perl/README.md | 6 +++--- samples/server-generator/node/README.md | 2 +- samples/server-generator/php/README.md | 2 +- .../php/templates/README.mustache | 2 +- samples/server/petstore/nodejs/README.md | 2 +- 25 files changed, 41 insertions(+), 41 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4bef580bb265..f80eeb3cd013 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ - Before submitting an issue, search the [open issue](https://github.com/swagger-api/swagger-codegen/issues) and [closed issue](https://github.com/swagger-api/swagger-codegen/issues?q=is%3Aissue+is%3Aclosed) to ensure no one else has reported something similar before. - The issue should contain details on how to repeat the issue, e.g. - - the Swagger spec for reproducing the issue (:bulb: use [Gist](https://gist.github.com) to share). If the Swagger spec cannot be shared publicly, it will be hard for the community to help + - the OpenAPI Spec for reproducing the issue (:bulb: use [Gist](https://gist.github.com) to share). If the OpenAPI Spec cannot be shared publicly, it will be hard for the community to help - version of Swagger Codegen - language (`-l` in the command line, e.g. java, csharp, php) - You can also make a suggestion or ask a question by opening an "issue" @@ -56,7 +56,7 @@ To start the CI tests, you can run `mvn verify -Psamples` (assuming you've all t ### Tips - Smaller changes are easier to review -- [Optional] For bug fixes, provide a Swagger spec to repeat the issue so that the reviewer can use it to confirm the fix +- [Optional] For bug fixes, provide a OpenAPI Spec to repeat the issue so that the reviewer can use it to confirm the fix - Add test case(s) to cover the change - Document the fix in the code to make the code more readable - Make sure test cases passed after the change (one way is to leverage https://travis-ci.org/ to run the CI tests) diff --git a/README.md b/README.md index 9f396cc3ff42..bbb6a443368f 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ## Overview This is the swagger codegen project, which allows generation of client libraries automatically from a Swagger-compliant server. -Check out [Swagger-Spec](https://github.com/swagger-api/swagger-spec) for additional information about the Swagger project, including additional libraries with support for other languages and more. +Check out [Swagger-Spec](https://github.com/OAI/OpenAPI-Specification) for additional information about the Swagger project, including additional libraries with support for other languages and more. # Table of contents @@ -32,7 +32,7 @@ Check out [Swagger-Spec](https://github.com/swagger-api/swagger-spec) for additi - [Where is Javascript???](#where-is-javascript) - [Generating a client from local files](#generating-a-client-from-local-files) - [Customizing the generator](#customizing-the-generator) - - [Validating your swagger spec](#validating-your-swagger-spec) + - [Validating your OpenAPI Spec](#validating-your-swagger-spec) - [Generating dynamic html api documentation](#generating-dynamic-html-api-documentation) - [Generating static html api documentation](#generating-static-html-api-documentation) - [To build a server stub](#to-build-a-server-stub) @@ -50,9 +50,9 @@ Check out [Swagger-Spec](https://github.com/swagger-api/swagger-spec) for additi ## Compatibility -The Swagger Specification has undergone 3 revisions since initial creation in 2010. The swagger-codegen project has the following compatibilies with the swagger specification: +The OpenAPI Specification has undergone 3 revisions since initial creation in 2010. The swagger-codegen project has the following compatibilies with the OpenAPI Specification: -Swagger Codegen Version | Release Date | Swagger Spec compatibility | Notes +Swagger Codegen Version | Release Date | OpenAPI Spec compatibility | Notes -------------------------- | ------------ | -------------------------- | ----- 2.1.5-SNAPSHOT | | 1.0, 1.1, 1.2, 2.0 | [master](https://github.com/swagger-api/swagger-codegen) 2.1.4 (**current stable**) | 2015-10-25 | 1.0, 1.1, 1.2, 2.0 | [tag v2.1.4](https://github.com/swagger-api/swagger-codegen/tree/v2.1.4) @@ -177,7 +177,7 @@ OPTIONS name=value,name=value -i , --input-spec - location of the swagger spec, as URL or file (required) + location of the OpenAPI Spec, as URL or file (required) -l , --lang client language to generate (maybe class name in classpath, @@ -248,12 +248,12 @@ java -cp output/myLibrary/target/myClientCodegen-swagger-codegen-1.0.0.jar:modul ### Where is Javascript??? See our [javascript library](http://github.com/swagger-api/swagger-js)--it's completely dynamic and doesn't require static code generation. -There is a third-party component called [swagger-js-codegen](https://github.com/wcandillon/swagger-js-codegen) that can generate angularjs or nodejs source code from a swagger specification. +There is a third-party component called [swagger-js-codegen](https://github.com/wcandillon/swagger-js-codegen) that can generate angularjs or nodejs source code from a OpenAPI Specification. :exclamation: On Dec 7th 2015, a Javascript API client generator has been added by @jfiala. ### Generating a client from local files -If you don't want to call your server, you can save the swagger spec files into a directory and pass an argument +If you don't want to call your server, you can save the OpenAPI Spec files into a directory and pass an argument to the code generator like this: ``` @@ -432,7 +432,7 @@ and specify the `classname` when running the generator: Your subclass will now be loaded and overrides the `PREFIX` value in the superclass. -### Validating your swagger spec +### Validating your OpenAPI Spec You have options. The easiest is to use our [online validator](https://github.com/swagger-api/validator-badge) which not only will let you validate your spec, but with the debug flag, you can see what's wrong with your spec. For example: diff --git a/modules/swagger-codegen-maven-plugin/README.md b/modules/swagger-codegen-maven-plugin/README.md index 372b2c90adf6..f42e9cc8778b 100644 --- a/modules/swagger-codegen-maven-plugin/README.md +++ b/modules/swagger-codegen-maven-plugin/README.md @@ -37,7 +37,7 @@ mvn clean compile ### General Configuration parameters -- `inputSpec` - swagger spec file path +- `inputSpec` - OpenAPI Spec file path - `language` - target generation language - `output` - target output path (default is `${project.build.directory}/generated-sources/swagger`) - `templateDirectory` - directory with mustache templates diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index 01ac045c38dc..705d55932138 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -563,7 +563,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Map authMethods = new HashMap(); // NOTE: Use only the first security requirement for now. // See the "security" field of "Swagger Object": - // https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#swagger-object + // https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#swagger-object // "there is a logical OR between the security requirements" if (securities.size() > 1) { LOGGER.warn("More than 1 security requirements are found, using only the first one"); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java index d2f5aaef0be4..192fd285e534 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java @@ -76,7 +76,7 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { String primitives = "'" + StringUtils.join(languageSpecificPrimitives, "', '") + "'"; additionalProperties.put("primitives", primitives); - // ref: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#data-types + // ref: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types typeMapping = new HashMap(); typeMapping.put("integer", "int"); typeMapping.put("long", "int"); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java index 3984d0ac85f3..4effb480048e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java @@ -65,7 +65,7 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig instantiationTypes.put("array", "array"); instantiationTypes.put("map", "map"); - // ref: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#data-types + // ref: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types typeMapping = new HashMap(); typeMapping.put("integer", "int"); typeMapping.put("long", "int"); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java index 58d8c9e53e5a..ae28493fe7ce 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java @@ -67,7 +67,7 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege instantiationTypes.put("array", "array"); instantiationTypes.put("map", "map"); - // ref: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#data-types + // ref: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types typeMapping = new HashMap(); typeMapping.put("integer", "int"); typeMapping.put("long", "int"); diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache index 7bad8dbee0ad..3551b9e99149 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache @@ -2,7 +2,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This is an example of building a swagger-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. diff --git a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/README.mustache b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/README.mustache index 9cf2b4bc6e80..1354151afbbe 100644 --- a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/README.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/README.mustache @@ -4,7 +4,7 @@ Spring MVC Server ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [swagger-spec](https://github.com/swagger-api/swagger-core), you can easily generate a server stub. This is an example of building a swagger-enabled server in Java using the Spring MVC framework. +This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [OpenAPI-Spec](https://github.com/swagger-api/swagger-core), you can easily generate a server stub. This is an example of building a swagger-enabled server in Java using the Spring MVC framework. The underlying library integrating swagger to Spring-MVC is [springfox](https://github.com/springfox/springfox) diff --git a/modules/swagger-codegen/src/main/resources/codegen/README.mustache b/modules/swagger-codegen/src/main/resources/codegen/README.mustache index a434038ec411..268a84a0edd1 100644 --- a/modules/swagger-codegen/src/main/resources/codegen/README.mustache +++ b/modules/swagger-codegen/src/main/resources/codegen/README.mustache @@ -9,7 +9,7 @@ your changes applied. The goal of Swaggerâ„¢ is to define a standard, language-agnostic interface to REST APIs which allows both humans and computers to discover and understand the capabilities of the service without access to source code, documentation, or through network traffic inspection. When properly defined via Swagger, a consumer can understand and interact with the remote service with a minimal amount of implementation logic. Similar to what interfaces have done for lower-level programming, Swagger removes the guesswork in calling the service. -Check out [Swagger-Spec](https://github.com/swagger-api/swagger-spec) for additional information about the Swagger project, including additional libraries with support for other languages and more. +Check out [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) for additional information about the Swagger project, including additional libraries with support for other languages and more. ## How do I use this? At this point, you've likely generated a client setup. It will include something along these lines: @@ -62,7 +62,7 @@ the object you have available during client generation: ``` # The following additional debug options are available for all codegen targets: -# -DdebugSwagger prints the swagger specification as interpreted by the codegen +# -DdebugSwagger prints the OpenAPI Specification as interpreted by the codegen # -DdebugModels prints models passed to the template engine # -DdebugOperations prints operations passed to the template engine # -DdebugSupportingFiles prints additional data passed to the template engine diff --git a/modules/swagger-codegen/src/main/resources/flaskConnexion/README.mustache b/modules/swagger-codegen/src/main/resources/flaskConnexion/README.mustache index ed64b6675587..7e80a2086ef5 100644 --- a/modules/swagger-codegen/src/main/resources/flaskConnexion/README.mustache +++ b/modules/swagger-codegen/src/main/resources/flaskConnexion/README.mustache @@ -2,7 +2,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This is an example of building a swagger-enabled flask server. This example uses the [connexion](https://github.com/zalando/connexion) library on top of Flask. diff --git a/modules/swagger-codegen/src/main/resources/nodejs/README.mustache b/modules/swagger-codegen/src/main/resources/nodejs/README.mustache index 183cd5e6d2a5..d94aa385ec03 100644 --- a/modules/swagger-codegen/src/main/resources/nodejs/README.mustache +++ b/modules/swagger-codegen/src/main/resources/nodejs/README.mustache @@ -1,7 +1,7 @@ # Swagger generated server ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [swagger-spec](https://github.com/swagger-api/swagger-spec) from a remote server, you can easily generate a server stub. This is an example of building a node.js server. +This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub. This is an example of building a node.js server. This example uses the [expressjs](http://expressjs.com/) framework. To see how to make this your own, look here: diff --git a/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache index 1623721cc70d..4d7d5bb70882 100644 --- a/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache @@ -345,7 +345,7 @@ sub update_params_for_auth { # The endpoint API class has not found any settings for auth. This may be deliberate, # in which case update_params_for_auth() will be a no-op. But it may also be that the -# swagger spec does not describe the intended authorization. So we check in the config for any +# OpenAPI Spec does not describe the intended authorization. So we check in the config for any # auth tokens and if we find any, we use them for all endpoints; sub _global_auth_setup { my ($self, $header_params, $query_params) = @_; diff --git a/modules/swagger-codegen/src/main/resources/perl/README.mustache b/modules/swagger-codegen/src/main/resources/perl/README.mustache index 8d0b7695c153..ac94b5b06380 100644 --- a/modules/swagger-codegen/src/main/resources/perl/README.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/README.mustache @@ -20,7 +20,7 @@ WWW::{{moduleName}}::ApiFactory for non-Moosey usage. # SYNOPSIS The Perl Swagger Codegen project builds a library of Perl modules to interact with -a web service defined by a Swagger specification. See below for how to build the +a web service defined by a OpenAPI Specification. See below for how to build the library. This module provides an interface to the generated library. All the classes, @@ -56,7 +56,7 @@ For documentation of all these methods, see AUTOMATIC DOCUMENTATION below. ## Configuring authentication -In the normal case, the Swagger spec will describe what parameters are +In the normal case, the OpenAPI Spec will describe what parameters are required and where to put them. You just need to supply the tokens. my $tokens = { @@ -203,7 +203,7 @@ output formats are supported: The `-c` option allows you to load and inspect your own application. A dummy namespace is used if you don't supply your own class. -# DOCUMENTATION FROM THE SWAGGER SPEC +# DOCUMENTATION FROM THE OpenAPI Spec Additional documentation for each class and method may be provided by the Swagger spec. If so, this is available via the `class_documentation()` and diff --git a/modules/swagger-codegen/src/main/resources/perl/Role.mustache b/modules/swagger-codegen/src/main/resources/perl/Role.mustache index 7bca8cca78d7..ac2298a08e9f 100644 --- a/modules/swagger-codegen/src/main/resources/perl/Role.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/Role.mustache @@ -119,7 +119,7 @@ WWW::{{moduleName}}::ApiFactory for non-Moosey usage. =head1 SYNOPSIS The Perl Swagger Codegen project builds a library of Perl modules to interact with -a web service defined by a Swagger specification. See below for how to build the +a web service defined by a OpenAPI Specification. See below for how to build the library. This module provides an interface to the generated library. All the classes, @@ -154,7 +154,7 @@ For documentation of all these methods, see AUTOMATIC DOCUMENTATION below. =head2 Configuring authentication -In the normal case, the Swagger spec will describe what parameters are +In the normal case, the OpenAPI Spec will describe what parameters are required and where to put them. You just need to supply the tokens. my $tokens = { @@ -304,7 +304,7 @@ output formats are supported: The C<-c> option allows you to load and inspect your own application. A dummy namespace is used if you don't supply your own class. -=head1 DOCUMENTATION FROM THE SWAGGER SPEC +=head1 DOCUMENTATION FROM THE OpenAPI Spec Additional documentation for each class and method may be provided by the Swagger spec. If so, this is available via the C and diff --git a/modules/swagger-codegen/src/main/resources/php/configuration.mustache b/modules/swagger-codegen/src/main/resources/php/configuration.mustache index 28082851c009..161affb1c9d8 100644 --- a/modules/swagger-codegen/src/main/resources/php/configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/php/configuration.mustache @@ -516,7 +516,7 @@ class Configuration $report = "PHP SDK ({{invokerPackage}}) Debug Report:\n"; $report .= " OS: ".php_uname()."\n"; $report .= " PHP Version: ".phpversion()."\n"; - $report .= " Swagger Spec Version: {{version}}\n"; + $report .= " OpenAPI Spec Version: {{version}}\n"; $report .= " SDK Package Version: {{artifactVersion}}\n"; $report .= " Temp Folder Path: ".self::getDefaultConfiguration()->getTempFolderPath()."\n"; diff --git a/modules/swagger-codegen/src/main/resources/scalatra/README.mustache b/modules/swagger-codegen/src/main/resources/scalatra/README.mustache index 3ffa01fb2571..327870827fd6 100644 --- a/modules/swagger-codegen/src/main/resources/scalatra/README.mustache +++ b/modules/swagger-codegen/src/main/resources/scalatra/README.mustache @@ -2,7 +2,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This is an example of building a swagger-enabled scalatra server. This example uses the [scalatra](http://scalatra.org/) framework. To see how to make this your own, look here: diff --git a/modules/swagger-codegen/src/main/resources/silex/README.mustache b/modules/swagger-codegen/src/main/resources/silex/README.mustache index 9f35636b3f86..d335e2f4ab88 100644 --- a/modules/swagger-codegen/src/main/resources/silex/README.mustache +++ b/modules/swagger-codegen/src/main/resources/silex/README.mustache @@ -2,7 +2,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This is an example of building a PHP server. This example uses the [Silex](http://silex.sensiolabs.org/) micro-framework. To see how to make this your own, please take a look at the template here: diff --git a/modules/swagger-codegen/src/main/resources/slim/README.mustache b/modules/swagger-codegen/src/main/resources/slim/README.mustache index 3b19f46bd38f..03910060439a 100644 --- a/modules/swagger-codegen/src/main/resources/slim/README.mustache +++ b/modules/swagger-codegen/src/main/resources/slim/README.mustache @@ -2,7 +2,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This is an example of building a PHP server. This example uses the [Slim Framework](http://www.slimframework.com/). To see how to make this your own, please take a look at the template here: diff --git a/modules/swagger-codegen/src/main/resources/validator/index.mustache b/modules/swagger-codegen/src/main/resources/validator/index.mustache index 2f4c45b32dc0..0a1a54387749 100644 --- a/modules/swagger-codegen/src/main/resources/validator/index.mustache +++ b/modules/swagger-codegen/src/main/resources/validator/index.mustache @@ -2,7 +2,7 @@ - Swagger Spec Validator + OpenAPI Spec Validator