Merge pull request #438 from swagger-api/develop_2.0

merged to master for patch release
This commit is contained in:
Tony Tam
2015-02-17 21:48:20 -08:00
26 changed files with 196 additions and 98 deletions

View File

@@ -2,7 +2,7 @@
<parent>
<groupId>com.wordnik</groupId>
<artifactId>swagger-codegen-project</artifactId>
<version>2.1.0-M1</version>
<version>2.1.1-M1</version>
<relativePath>../..</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -10,7 +10,7 @@
<artifactId>swagger-codegen-distribution</artifactId>
<packaging>jar</packaging>
<name>swagger-codegen (executable)</name>
<version>2.1.0-M1</version>
<version>2.1.1-M1</version>
<build>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<outputDirectory>target/classes</outputDirectory>
@@ -19,6 +19,17 @@
<directory>target</directory>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.wordnik.swagger.codegen.Codegen</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
@@ -41,14 +52,21 @@
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.wordnik.swagger.codegen.Codegen</mainClass>
</manifest>
</archive>
</configuration>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

View File

@@ -2,7 +2,7 @@
<parent>
<groupId>com.wordnik</groupId>
<artifactId>swagger-codegen-project</artifactId>
<version>2.1.0-M1</version>
<version>2.1.1-M1</version>
<relativePath>../..</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -10,7 +10,7 @@
<artifactId>swagger-codegen</artifactId>
<packaging>jar</packaging>
<name>swagger-codegen (core library)</name>
<version>2.1.0-M1</version>
<version>2.1.1-M1</version>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<defaultGoal>install</defaultGoal>

View File

@@ -71,11 +71,11 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi
@Override
public String apiFileFolder() {
return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/");
return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar);
}
public String modelFileFolder() {
return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/");
return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar);
}
@Override

View File

@@ -80,11 +80,11 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig {
@Override
public String apiFileFolder() {
return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/");
return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar);
}
public String modelFileFolder() {
return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/");
return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar);
}
@Override

View File

@@ -69,11 +69,11 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig {
@Override
public String apiFileFolder() {
return outputFolder + "/" + apiPackage().replaceAll("\\.", "/");
return outputFolder + "/" + apiPackage().replace('.', File.separatorChar);
}
public String modelFileFolder() {
return outputFolder + "/" + modelPackage().replaceAll("\\.", "/");
return outputFolder + "/" + modelPackage().replace('.', File.separatorChar);
}
@Override

View File

@@ -54,7 +54,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));
supportingFiles.add(new SupportingFile("swagger.mustache", module, "swagger.py"));
supportingFiles.add(new SupportingFile("__init__.mustache", module, "__init__.py"));
supportingFiles.add(new SupportingFile("__init__.mustache", modelPackage.replaceAll("\\.", File.separator), "__init__.py"));
supportingFiles.add(new SupportingFile("__init__.mustache", modelPackage.replace('.', File.separatorChar), "__init__.py"));
}
@Override

View File

@@ -106,11 +106,11 @@ public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig
@Override
public String apiFileFolder() {
return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/");
return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar);
}
public String modelFileFolder() {
return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/");
return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar);
}
@Override

View File

@@ -128,11 +128,11 @@ public class ScalatraServerCodegen extends DefaultCodegen implements CodegenConf
@Override
public String apiFileFolder() {
return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/");
return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar);
}
public String modelFileFolder() {
return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/");
return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar);
}
@Override

View File

@@ -51,8 +51,11 @@ public class ApiInvoker {
}
public static Object deserialize(String json, String containerType, Class cls) throws ApiException {
if(null != containerType) {
containerType = containerType.toLowerCase();
}
try{
if("List".equals(containerType)) {
if("list".equals(containerType) || "array".equals(containerType)) {
JavaType typeInfo = JsonUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, cls);
List response = (List<?>) JsonUtil.getJsonMapper().readValue(json, typeInfo);
return response;

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.wordnik</groupId>
<artifactId>swagger-codegen-project</artifactId>
<version>2.1.0-M1</version>
<version>2.1.1-M1</version>
<relativePath>../..</relativePath>
</parent>
<groupId>com.wordnik</groupId>
@@ -200,10 +200,18 @@
<artifactId>jetty-deploy</artifactId>
<version>${jetty-version}</version>
</dependency>
<dependency>
<groupId>org.scalatest</groupId>
<artifactId>scalatest_2.11</artifactId>
<version>${scala-test-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
@@ -228,6 +236,5 @@
<scala-maven-plugin-version>3.1.5</scala-maven-plugin-version>
<scala-version>2.10.0</scala-version>
<scala-test-version>1.9</scala-test-version>
</properties>
</project>

View File

@@ -31,11 +31,13 @@ public class Bootstrap extends HttpServlet {
bc.setBasePath("/api");
bc.setTitle("Swagger Generator");
bc.setDescription("This is an online swagger codegen server. You can find out more " +
"at <a href=\"https://github.com/wordnik/swagger-generator\">https://github.com/wordnik/swagger-generator</a> or on irc.freenode.net, #swagger." +
"at <a href=\"https://github.com/wordnik/swagger-generator\">https://github.com/swagger-api/swagger-codegen</a> or on irc.freenode.net, #swagger." +
"http://helloreverb.com/terms/");
bc.setTermsOfServiceUrl("http://helloreverb.com/terms/");
bc.setContact("apiteam@swagger.io");
bc.setLicense("Apache 2.0");
bc.setVersion("1.0.0");
bc.setHost("generator.swagger.io");
bc.setLicenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html");
bc.setResourcePackage("com.wordnik.swagger.generator.resource");
bc.setScan(true);

View File

@@ -2,18 +2,25 @@ package com.wordnik.swagger.generator.model;
public class ResponseCode {
private String code;
private String link;
public ResponseCode() {}
public ResponseCode(String code, String link) {
setCode(code);
setLink(link);
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public ResponseCode() {}
public ResponseCode(String code) {
setCode(code);
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}

View File

@@ -11,20 +11,33 @@ import com.wordnik.swagger.generator.util.ZipUtil;
import com.fasterxml.jackson.databind.JsonNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.List;
import java.util.ArrayList;
public class Generator {
static Logger LOGGER = LoggerFactory.getLogger(Generator.class);
public static String generateClient(String language, GeneratorInput opts) throws ApiException {
Swagger swagger;
LOGGER.debug("generate client for " + language);
if(opts == null) {
throw new BadRequestException(400, "No options were supplied");
}
JsonNode node = opts.getSpec();
if(node == null) {
throw new BadRequestException(400, "No swagger specification was supplied");
if(opts.getSwaggerUrl() != null) {
swagger = new SwaggerParser().read(opts.getSwaggerUrl());
}
else
throw new BadRequestException(400, "No swagger specification was supplied");
}
else {
swagger = new SwaggerParser().read(node);
}
Swagger swagger = new SwaggerParser().read(node);
if(swagger == null) {
throw new BadRequestException(400, "The swagger specification supplied was not valid");
}
@@ -67,8 +80,56 @@ public class Generator {
return outputFilename;
}
public static String generateServer(String language, GeneratorInput opts) {
return "";
public static String generateServer(String language, GeneratorInput opts) throws ApiException {
LOGGER.debug("generate server for " + language);
if(opts == null) {
throw new BadRequestException(400, "No options were supplied");
}
JsonNode node = opts.getSpec();
if(node == null) {
throw new BadRequestException(400, "No swagger specification was supplied");
}
Swagger swagger = new SwaggerParser().read(node);
if(swagger == null) {
throw new BadRequestException(400, "The swagger specification supplied was not valid");
}
ClientOptInput clientOptInput = new ClientOptInput();
ClientOpts clientOpts = new ClientOpts();
String outputFolder = getTmpFolder().getAbsolutePath() + File.separator + language + "-server";
String outputFilename = outputFolder + "-bundle.zip";
clientOptInput
.opts(clientOpts)
.swagger(swagger);
CodegenConfig codegenConfig = Codegen.getConfig(language);
if(codegenConfig == null) {
throw new BadRequestException(400, "Unsupported target " + language + " supplied");
}
codegenConfig.setOutputDir(outputFolder);
Json.prettyPrint(clientOpts);
clientOptInput.setConfig(codegenConfig);
try{
List<File> files = new Codegen().opts(clientOptInput).generate();
if(files.size() > 0) {
List<File> filesToAdd = new ArrayList<File>();
filesToAdd.add(new File(outputFolder));
ZipUtil zip = new ZipUtil();
zip.compressFiles(filesToAdd, outputFilename);
}
else {
throw new BadRequestException(400, "A target generation was attempted, but no files were created!");
}
}
catch (Exception e) {
throw new BadRequestException(500, "Unable to build target: " + e.getMessage());
}
return outputFilename;
}
public static InputOption clientOptions(String language) {

View File

@@ -18,10 +18,25 @@ import javax.ws.rs.core.*;
public class SwaggerResource {
private static Map<String, Generated> fileMap = new HashMap<String, Generated>();
static List<String> clients = new ArrayList<String>();
static List<String> servers = new ArrayList<String>();
static {
List<CodegenConfig> extensions = Codegen.getExtensions();
for(CodegenConfig config : extensions) {
if(config.getTag().equals(CodegenType.CLIENT) || config.getTag().equals(CodegenType.DOCUMENTATION)) {
clients.add(config.getName());
}
else if(config.getTag().equals(CodegenType.SERVER)) {
servers.add(config.getName());
}
}
}
@GET
@Path("/download/{fileId}")
@Produces({"application/zip", "application/json"})
@ApiOperation(value = "Downloads a pre-generated file", response = File.class)
@Produces({"application/zip"})
@ApiOperation(value = "Downloads a pre-generated file",
response = String.class)
public Response downloadFile(@PathParam("fileId") String fileId) throws Exception {
Generated g = fileMap.get(fileId);
System.out.println("looking for fileId " + fileId);
@@ -43,7 +58,8 @@ public class SwaggerResource {
@POST
@Path("/clients/{language}")
@Produces({"application/zip", "application/json"})
@ApiOperation(value = "Generates a client library based on the config")
@ApiOperation(
value = "Generates a client library based on the config")
public Response generateClient(
@ApiParam(value = "The target language for the client library", allowableValues = "android,java,php,objc,docs", required = true) @PathParam("language") String language,
@ApiParam(value = "Configuration for building the client library", required = true) GeneratorInput opts) throws Exception {
@@ -57,7 +73,8 @@ public class SwaggerResource {
g.setFriendlyName(language + "-client");
fileMap.put(code, g);
System.out.println(code + ", " + filename);
return Response.ok().entity(new ResponseCode(code)).build();
String link = "http://generator.swagger.io/api/gen/download/" + code;
return Response.ok().entity(new ResponseCode(code, link)).build();
}
else {
return Response.status(500).build();
@@ -70,46 +87,22 @@ public class SwaggerResource {
response = String.class,
responseContainer = "List")
public Response clientOptions() {
String[] languages = {"android", "java", "php", "objc", "docs"};
String[] languages = new String[clients.size()];
languages = clients.toArray(languages);
return Response.ok().entity(languages).build();
}
@GET
@Path("/clients/{language}")
@ApiOperation(value = "Gets options for a client generation",
notes = "Values which are not required will use the provided default values",
response = InputOption.class,
responseContainer = "List")
@ApiResponses(value = {
@com.wordnik.swagger.annotations.ApiResponse(code = 400, message = "Invalid model supplied", response = ValidationMessage.class),
})
public Response clientLibraryOptions(
@ApiParam(value = "The target language for the client library", allowableValues = "android,java,php,objc,docs", required = true) @PathParam("language") String language) {
return Response.ok().entity(Generator.clientOptions(language)).build();
}
@GET
@Path("/servers")
@ApiOperation(value = "Gets languages supported by the server generator",
response = String.class,
responseContainer = "List")
public Response serverOptions() {
String[] languages = {"jaxrs","nodejs"};
String[] languages = new String[servers.size()];
languages = servers.toArray(languages);
return Response.ok().entity(languages).build();
}
@GET
@Path("/servers/{language}")
@ApiOperation(value = "Gets options for a server generation",
notes = "Values which are not required will use the provided default values",
response = InputOption.class,
responseContainer = "List")
public Response serverFrameworkOptions(
@ApiParam(value = "The target framework for the client library", allowableValues = "jaxrs,nodejs", required = true) @PathParam("language") String framework) {
return Response.ok().entity(Generator.serverOptions(framework)).build();
}
@POST
@Path("/servers/{framework}")
@ApiOperation(value = "Generates a server library for the supplied server framework",
@@ -130,7 +123,8 @@ public class SwaggerResource {
g.setFriendlyName(framework + "-server");
fileMap.put(code, g);
System.out.println(code + ", " + filename);
return Response.ok().entity(new ResponseCode(code)).build();
String link = "http://generator.swagger.io/api/gen/download/" + code;
return Response.ok().entity(new ResponseCode(code, link)).build();
}
else {
return Response.status(500).build();

View File

@@ -9,7 +9,7 @@
<artifactId>swagger-codegen-project</artifactId>
<packaging>pom</packaging>
<name>swagger-codegen-project</name>
<version>2.1.0-M1</version>
<version>2.1.1-M1</version>
<url>https://github.com/swagger-api/swagger-codegen</url>
<scm>
<connection>scm:git:git@github.com:swagger-api/swagger-codegen.git</connection>

View File

@@ -1,8 +1,8 @@
package io.swagger.client.model;
import io.swagger.client.model.Category;
import java.util.*;
import io.swagger.client.model.Tag;
import java.util.*;
import com.wordnik.swagger.annotations.*;
import com.fasterxml.jackson.annotation.JsonProperty;

View File

@@ -51,8 +51,11 @@ public class ApiInvoker {
}
public static Object deserialize(String json, String containerType, Class cls) throws ApiException {
if(null != containerType) {
containerType = containerType.toLowerCase();
}
try{
if("List".equals(containerType)) {
if("list".equals(containerType) || "array".equals(containerType)) {
JavaType typeInfo = JsonUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, cls);
List response = (List<?>) JsonUtil.getJsonMapper().readValue(json, typeInfo);
return response;

View File

@@ -1,8 +1,8 @@
package io.swagger.client.model;
import io.swagger.client.model.Category;
import java.util.*;
import io.swagger.client.model.Tag;
import java.util.*;
import com.wordnik.swagger.annotations.*;
import com.fasterxml.jackson.annotation.JsonProperty;

View File

@@ -1,7 +1,7 @@
#import <Foundation/Foundation.h>
#import "SWGObject.h"
#import "SWGCategory.h"
#import "SWGTag.h"
#import "SWGCategory.h"
@interface SWGPet : SWGObject

View File

@@ -17,11 +17,11 @@
using namespace Tizen::Web::Json;
using Tizen::Base::Integer;
using Tizen::Base::Long;
using Tizen::Base::DateTime;
using Tizen::Base::String;
using Tizen::Base::Boolean;
using Tizen::Base::DateTime;
using Tizen::Base::Integer;
namespace Swagger {

View File

@@ -17,9 +17,9 @@
using namespace Tizen::Web::Json;
#include "SamiCategory.h"
using Tizen::Base::Long;
using Tizen::Base::String;
#include "SamiCategory.h"
#include "SamiTag.h"
using Tizen::Base::Collection::IList;

View File

@@ -17,9 +17,9 @@
using namespace Tizen::Web::Json;
using Tizen::Base::Integer;
using Tizen::Base::Long;
using Tizen::Base::String;
using Tizen::Base::Integer;
namespace Swagger {

View File

@@ -58,25 +58,6 @@
</ul>
</div>
<div class="section-box">
<div class="section-header">
<a href="#!/StoreApi">StoreApi</a>
</div>
<ul>
<li><a href="#!/StoreApi#getInventory">getInventory</a></li>
<li><a href="#!/StoreApi#placeOrder">placeOrder</a></li>
<li><a href="#!/StoreApi#getOrderById">getOrderById</a></li>
<li><a href="#!/StoreApi#deleteOrder">deleteOrder</a></li>
</ul>
</div>
<div class="section-box">
<div class="section-header">
<a href="#!/PetApi">PetApi</a>
@@ -104,6 +85,25 @@
</ul>
</div>
<div class="section-box">
<div class="section-header">
<a href="#!/StoreApi">StoreApi</a>
</div>
<ul>
<li><a href="#!/StoreApi#getInventory">getInventory</a></li>
<li><a href="#!/StoreApi#placeOrder">placeOrder</a></li>
<li><a href="#!/StoreApi#getOrderById">getOrderById</a></li>
<li><a href="#!/StoreApi#deleteOrder">deleteOrder</a></li>
</ul>
</div>
</div>
<div class="non-sidebar">

View File

@@ -417,9 +417,12 @@
<h3 class="field-label">Parameters</h3>
<div class="field-items">
<<<<<<< HEAD
=======
<div class="param">petId (required)</div>
<div class="param-desc"><span class="param-type">Path Parameter</span> &mdash; ID of pet to update </div>
>>>>>>> master
<div class="param">additionalMetadata (optional)</div>
<div class="param-desc"><span class="param-type">Form Parameter</span> &mdash; Additional data to pass to server </div>

View File

@@ -1,8 +1,8 @@
package io.swagger.model;
import io.swagger.model.Category;
import java.util.*;
import io.swagger.model.Tag;
import java.util.*;
import com.wordnik.swagger.annotations.*;
import com.fasterxml.jackson.annotation.JsonProperty;