Merge pull request #1434 from lugaru1234/generatorOptions

Options processing has been fixed
This commit is contained in:
Tony Tam 2015-10-26 08:46:21 -07:00
commit 8914a30935
5 changed files with 1201 additions and 73 deletions

View File

@ -17,22 +17,44 @@ import io.swagger.util.Json;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class Generator {
static Logger LOGGER = LoggerFactory.getLogger(Generator.class);
public enum Type {
CLIENT("client"),
SERVER("server");
private String name;
Type(String name) {
this.name = name;
}
String getTypeName() {
return name;
}
}
public static String generateClient(String language, GeneratorInput opts) throws ApiException {
Swagger swagger;
LOGGER.debug("generate client for " + language);
return generate(language, opts, Type.CLIENT);
}
public static String generateServer(String language, GeneratorInput opts) throws ApiException {
return generate(language, opts, Type.SERVER);
}
private static String generate(String language, GeneratorInput opts, Type type) throws ApiException {
LOGGER.debug(String.format("generate %s for %s", type.getTypeName(), language));
if (opts == null) {
throw new BadRequestException(400, "No options were supplied");
}
JsonNode node = opts.getSpec();
Swagger swagger;
if (node == null) {
if (opts.getSwaggerUrl() != null) {
swagger = new SwaggerParser().read(opts.getSwaggerUrl());
@ -48,7 +70,8 @@ public class Generator {
ClientOptInput clientOptInput = new ClientOptInput();
ClientOpts clientOpts = new ClientOpts();
String outputFolder = getTmpFolder().getAbsolutePath() + File.separator + language + "-client";
String outputFolder = getTmpFolder().getAbsolutePath() + File.separator + language + "-"
+ type.getTypeName();
String outputFilename = outputFolder + "-bundle.zip";
clientOptInput
@ -63,14 +86,8 @@ public class Generator {
}
if (opts.getOptions() != null) {
for(String key : new String[]{"apiPackage", "modelPackage", "invokerPackage", "groupId", "artifactId", "artifactVersion"}) {
if(isNotEmpty(opts.getOptions().get(key))) {
codegenConfig.additionalProperties().put(key , opts.getOptions().get(key));
}
}
if (isNotEmpty(opts.getOptions().get("library"))) {
codegenConfig.setLibrary(opts.getOptions().get("library"));
for (Map.Entry<String, String> entry : opts.getOptions().entrySet()) {
codegenConfig.additionalProperties().put(entry.getKey(), entry.getValue());
}
}
@ -97,65 +114,6 @@ public class Generator {
return outputFilename;
}
public static String generateServer(String language, GeneratorInput opts) throws ApiException {
LOGGER.debug("generate server for " + language);
Swagger swagger;
if (opts == null) {
throw new BadRequestException(400, "No options were supplied");
}
if (opts == null) {
throw new BadRequestException(400, "No options were supplied");
}
JsonNode node = opts.getSpec();
if (node == null) {
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, true);
}
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) {
return null;
}

View File

@ -0,0 +1,97 @@
package io.swagger.generator.online;
import static org.testng.Assert.assertNotEquals;
import io.swagger.generator.exception.ApiException;
import io.swagger.generator.model.GeneratorInput;
import io.swagger.generator.online.Generator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public abstract class OnlineGeneratorOptionsTest {
private final boolean isServer;
private final String language;
protected OnlineGeneratorOptionsTest(String language, boolean isServer) {
this.language = language;
this.isServer = isServer;
}
@Test
public void optionsTest() throws ApiException, IOException {
final GeneratorInput input = new GeneratorInput();
final HashMap<String, InvocationCounter> options = convertOptions();
final Maps.EntryTransformer<String, InvocationCounter, String> transformer =
new Maps.EntryTransformer<String, InvocationCounter, String>() {
public String transformEntry(String key, InvocationCounter value) {
return value.getValue();
}
};
input.setOptions(Maps.transformEntries(options, transformer));
final ObjectMapper mapper = new ObjectMapper();
input.setSpec(mapper.readTree(loadClassResource(getClass(), "petstore.json")));
String outputFilename;
if (isServer) {
outputFilename = Generator.generateServer(language, input);
} else {
outputFilename = Generator.generateClient(language, input);
}
final File dir = new File(new File(outputFilename).getParent());
FileUtils.deleteDirectory(dir);
for (InvocationCounter option : options.values()) {
assertNotEquals(option.getCounter(), 0, String.format("Option \"%s\" wasn't processed.",
option.getValue()));
}
}
protected abstract Map<String, String> getOptions();
private HashMap<String, InvocationCounter> convertOptions() {
HashMap<String, InvocationCounter> options = new HashMap<String, InvocationCounter>();
for (Map.Entry<String, String> entry : getOptions().entrySet()) {
options.put(entry.getKey(), new InvocationCounter(entry.getValue()));
}
return options;
}
private static String loadClassResource(Class<?> cls, String name) throws IOException {
InputStream in = null;
try {
in = cls.getClassLoader().getResourceAsStream(name);
return IOUtils.toString(in, StandardCharsets.UTF_8);
} finally {
IOUtils.closeQuietly(in);
}
}
private static class InvocationCounter {
private String value;
private int counter;
public InvocationCounter(String value) {
this.value = value;
}
public int getCounter() {
return counter;
}
public String getValue() {
++counter;
return value;
}
}
}

View File

@ -0,0 +1,34 @@
package io.swagger.generator.online;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
public class OnlineJavaClientOptionsTest extends OnlineGeneratorOptionsTest {
public OnlineJavaClientOptionsTest() {
super("java", false);
}
protected OnlineJavaClientOptionsTest(String language, boolean isServer) {
super(language, isServer);
}
@Override
protected Map<String, String> getOptions() {
ImmutableMap.Builder<String, String> builder = new ImmutableMap.Builder<String, String>();
return builder.put("modelPackage", "package")
.put("apiPackage", "apiPackage")
.put("sortParamsByRequiredFlag", "false")
.put("invokerPackage", "io.swagger.client.test")
.put("groupId", "io.swagger.test")
.put("artifactId", "swagger-java-client-test")
.put("artifactVersion", "1.0.0-SNAPSHOT")
.put("sourceFolder", "src/main/java/test")
.put("localVariablePrefix", "tst")
.put("serializableModel", "false")
.put("fullJavaUtil", "true")
.put("library", "jersey2")
.build();
}
}

View File

@ -0,0 +1,9 @@
package io.swagger.generator.online;
public class OnlineJaxRSServerOptionsTest extends OnlineJavaClientOptionsTest{
public OnlineJaxRSServerOptionsTest() {
super("jaxrs", true);
}
}

File diff suppressed because it is too large Load Diff