diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfigLoader.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfigLoader.java index c578ab75912..45a57e7bb3a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfigLoader.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfigLoader.java @@ -13,17 +13,22 @@ public class CodegenConfigLoader { */ public static CodegenConfig forName(String name) { ServiceLoader loader = load(CodegenConfig.class); + + StringBuilder availableConfigs = new StringBuilder(); + for (CodegenConfig config : loader) { if (config.getName().equals(name)) { return config; } + + availableConfigs.append(config.getName()).append("\n"); } // else try to load directly try { return (CodegenConfig) Class.forName(name).newInstance(); } catch (Exception e) { - throw new RuntimeException("Can't load config class with name ".concat(name), e); + throw new RuntimeException("Can't load config class with name ".concat(name) + " Available: " + availableConfigs.toString(), e); } } } 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 f15a8785f97..2188af33b7f 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 @@ -394,7 +394,13 @@ public class DefaultCodegen { public String toInstantiationType(Property p) { if (p instanceof MapProperty) { MapProperty ap = (MapProperty) p; - String inner = getSwaggerType(ap.getAdditionalProperties()); + Property additionalProperties2 = ap.getAdditionalProperties(); + String type = additionalProperties2.getType(); + if (null == type) { + LOGGER.error("No Type defined for Additional Property " + additionalProperties2 + "\n" // + + "\tIn Property: " + p); + } + String inner = getSwaggerType(additionalProperties2); return instantiationTypes.get("map") + ""; } else if (p instanceof ArrayProperty) { ArrayProperty ap = (ArrayProperty) p; @@ -769,7 +775,7 @@ public class DefaultCodegen { } } operationId = builder.toString(); - LOGGER.warn("generated operationId " + operationId); + LOGGER.info("generated operationId " + operationId + "\tfor Path: " + httpMethod + " " + path); } operationId = removeNonNameElementToCamelCase(operationId); op.path = path; @@ -1009,6 +1015,10 @@ public class DefaultCodegen { } p.jsonSchema = Json.pretty(param); + if (System.getProperty("debugParser") != null) { + LOGGER.info("working on Parameter " + param); + } + // move the defaultValue for headers, forms and params if (param instanceof QueryParameter) { p.defaultValue = ((QueryParameter) param).getDefaultValue(); @@ -1022,7 +1032,11 @@ public class DefaultCodegen { SerializableParameter qp = (SerializableParameter) param; Property property = null; String collectionFormat = null; - if ("array".equals(qp.getType())) { + String type = qp.getType(); + if (null == type) { + LOGGER.warn("Type is NULL for Serializable Parameter: " + param); + } + if ("array".equals(type)) { Property inner = qp.getItems(); if (inner == null) { LOGGER.warn("warning! No inner type supplied for array parameter \"" + qp.getName() + "\", using String"); @@ -1034,7 +1048,7 @@ public class DefaultCodegen { p.baseType = pr.datatype; p.isContainer = true; imports.add(pr.baseType); - } else if ("object".equals(qp.getType())) { + } else if ("object".equals(type)) { Property inner = qp.getItems(); if (inner == null) { LOGGER.warn("warning! No inner type supplied for map parameter \"" + qp.getName() + "\", using String"); @@ -1047,12 +1061,13 @@ public class DefaultCodegen { imports.add(pr.baseType); } else { Map args = new HashMap(); + String format = qp.getFormat(); args.put(PropertyId.ENUM, qp.getEnum()); - property = PropertyBuilder.build(qp.getType(), qp.getFormat(), args); + property = PropertyBuilder.build(type, format, args); } if (property == null) { - LOGGER.warn("warning! Property type \"" + qp.getType() + "\" not found for parameter \"" + param.getName() + "\", using String"); - property = new StringProperty().description("//TODO automatically added by swagger-codegen. Type was " + qp.getType() + " but not supported"); + LOGGER.warn("warning! Property type \"" + type + "\" not found for parameter \"" + param.getName() + "\", using String"); + property = new StringProperty().description("//TODO automatically added by swagger-codegen. Type was " + type + " but not supported"); } property.setRequired(param.getRequired()); CodegenProperty model = fromProperty(qp.getName(), property); @@ -1067,6 +1082,10 @@ public class DefaultCodegen { imports.add(model.complexType); } } else { + if (!(param instanceof BodyParameter)) { + LOGGER.error("Cannot use Parameter " + param + " as Body Parameter"); + } + BodyParameter bp = (BodyParameter) param; Model model = bp.getSchema(); 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 40b676149a2..e5a49f4eba4 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 @@ -20,6 +20,8 @@ import io.swagger.models.parameters.Parameter; import io.swagger.util.Json; import org.apache.commons.io.IOUtils; import org.joda.time.DateTime; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileInputStream; @@ -39,12 +41,15 @@ import java.util.Map; import java.util.Set; public class DefaultGenerator extends AbstractGenerator implements Generator { + Logger LOGGER = LoggerFactory.getLogger(DefaultGenerator.class); + protected CodegenConfig config; protected ClientOptInput opts = null; protected Swagger swagger = null; public CodeGenStatus status = CodeGenStatus.UNRUN; + @Override public Generator opts(ClientOptInput opts) { this.opts = opts; @@ -55,6 +60,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { return this; } + @Override public List generate() { if (swagger == null || config == null) { throw new RuntimeException("missing swagger input or config!"); @@ -150,6 +156,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { String template = readTemplate(templateFile); Template tmpl = Mustache.compiler() .withLoader(new Mustache.TemplateLoader() { + @Override public Reader getTemplate(String name) { return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); } @@ -203,6 +210,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { String template = readTemplate(templateFile); Template tmpl = Mustache.compiler() .withLoader(new Mustache.TemplateLoader() { + @Override public Reader getTemplate(String name) { return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); } @@ -277,6 +285,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { String template = readTemplate(templateFile); Template tmpl = Mustache.compiler() .withLoader(new Mustache.TemplateLoader() { + @Override public Reader getTemplate(String name) { return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); } @@ -416,6 +425,9 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { public void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations, Path path) { if (operation != null) { + if (System.getProperty("debugOperations") != null) { + LOGGER.debug("processOperation: resourcePath= " + resourcePath + "\t;" + httpMethod + " " + operation + "\n"); + } List tags = operation.getTags(); if (tags == null) { tags = new ArrayList(); @@ -445,44 +457,54 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } for (String tag : tags) { - CodegenOperation co = config.fromOperation(resourcePath, httpMethod, operation, swagger.getDefinitions()); - co.tags = new ArrayList(); - co.tags.add(sanitizeTag(tag)); - config.addOperationToGroup(sanitizeTag(tag), resourcePath, operation, co, operations); + CodegenOperation co = null; + try { + co = config.fromOperation(resourcePath, httpMethod, operation, swagger.getDefinitions()); + co.tags = new ArrayList(); + co.tags.add(sanitizeTag(tag)); + config.addOperationToGroup(sanitizeTag(tag), resourcePath, operation, co, operations); - List>> securities = operation.getSecurity(); - if (securities == null) { - continue; - } - Map authMethods = new HashMap(); - for (Map> security : securities) { - if (security.size() != 1) { - //Not sure what to do + List>> securities = operation.getSecurity(); + if (securities == null) { continue; } - String securityName = security.keySet().iterator().next(); - SecuritySchemeDefinition securityDefinition = fromSecurity(securityName); - if (securityDefinition != null) { - if(securityDefinition instanceof OAuth2Definition) { - OAuth2Definition oauth2Definition = (OAuth2Definition) securityDefinition; - OAuth2Definition oauth2Operation = new OAuth2Definition(); - oauth2Operation.setType(oauth2Definition.getType()); - oauth2Operation.setAuthorizationUrl(oauth2Definition.getAuthorizationUrl()); - oauth2Operation.setFlow(oauth2Definition.getFlow()); - oauth2Operation.setTokenUrl(oauth2Definition.getTokenUrl()); - for (String scope : security.values().iterator().next()) { - if (oauth2Definition.getScopes().containsKey(scope)) { - oauth2Operation.addScope(scope, oauth2Definition.getScopes().get(scope)); - } - } - authMethods.put(securityName, oauth2Operation); - } else { - authMethods.put(securityName, securityDefinition); - } + Map authMethods = new HashMap(); + for (Map> security : securities) { + if (security.size() != 1) { + //Not sure what to do + continue; + } + String securityName = security.keySet().iterator().next(); + SecuritySchemeDefinition securityDefinition = fromSecurity(securityName); + if (securityDefinition != null) { + if(securityDefinition instanceof OAuth2Definition) { + OAuth2Definition oauth2Definition = (OAuth2Definition) securityDefinition; + OAuth2Definition oauth2Operation = new OAuth2Definition(); + oauth2Operation.setType(oauth2Definition.getType()); + oauth2Operation.setAuthorizationUrl(oauth2Definition.getAuthorizationUrl()); + oauth2Operation.setFlow(oauth2Definition.getFlow()); + oauth2Operation.setTokenUrl(oauth2Definition.getTokenUrl()); + for (String scope : security.values().iterator().next()) { + if (oauth2Definition.getScopes().containsKey(scope)) { + oauth2Operation.addScope(scope, oauth2Definition.getScopes().get(scope)); + } + } + authMethods.put(securityName, oauth2Operation); + } else { + authMethods.put(securityName, securityDefinition); + } + } + } + if (!authMethods.isEmpty()) { + co.authMethods = config.fromSecurity(authMethods); } } - if (!authMethods.isEmpty()) { - co.authMethods = config.fromSecurity(authMethods); + catch (Exception ex) { + LOGGER.error("Error while trying to get Config from Operation for tag(" + tag + ")\n" // + + "\tResource: " + httpMethod + " " + resourcePath + "\n"// + + "\tOperation:" + operation + "\n" // + + "\tDefinitions: " + swagger.getDefinitions() + "\n"); + ex.printStackTrace(); } } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/examples/XmlExampleGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/examples/XmlExampleGenerator.java index 73294268f39..a6bfc7d5ddd 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/examples/XmlExampleGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/examples/XmlExampleGenerator.java @@ -128,7 +128,7 @@ public class XmlExampleGenerator { ArrayProperty p = (ArrayProperty) property; Property inner = p.getItems(); boolean wrapped = false; - if (property.getXml() != null && property.getXml().getWrapped()) { + if (property.getXml() != null && property.getXml().getWrapped() != null && property.getXml().getWrapped()) { wrapped = true; } if (wrapped) { 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 6dea59ea773..00b5c99cf4f 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 @@ -24,8 +24,12 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { + private static final Logger LOGGER = LoggerFactory.getLogger(JavaClientCodegen.class); + protected String invokerPackage = "io.swagger.client"; protected String groupId = "io.swagger"; protected String artifactId = "swagger-java-client"; @@ -82,14 +86,17 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(buildLibraryCliOption(supportedLibraries)); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "java"; } + @Override public String getHelp() { return "Generates a Java client library."; } @@ -191,6 +198,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } @@ -284,6 +292,9 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { } else { type = swaggerType; } + if (null == type) { + LOGGER.error("No Type defined for Property " + p); + } return toModelName(type); } 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 5d0a7034537..10070ece512 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 @@ -207,11 +207,14 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig } @SuppressWarnings("unchecked") - private Map getOperations(Map objs) { + private List> getOperations(Map objs) { + List> result = new ArrayList>(); Map apiInfo = (Map) objs.get("apiInfo"); List> apis = (List>) apiInfo.get("apis"); - Map api = apis.get(0); - return (Map) api.get("operations"); + for (Map api : apis) { + result.add((Map) api.get("operations")); + } + return result; } private List> sortOperationsByPath(List ops) { @@ -221,7 +224,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig opsByPath.put(op.path, op); } - List> opsByPathList = new ArrayList>(); + List> opsByPathList = new ArrayList>(); for (Entry> entry : opsByPath.asMap().entrySet()) { Map opsByPathEntry = new HashMap(); opsByPathList.add(opsByPathEntry); @@ -239,16 +242,13 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig @Override public Map postProcessSupportingFileData(Map objs) { - Map operations = getOperations(objs); - - if (operations != null) { + for (Map operations : getOperations(objs)) { @SuppressWarnings("unchecked") List ops = (List) operations.get("operation"); List> opsByPathList = sortOperationsByPath(ops); operations.put("operationsByPath", opsByPathList); } - return super.postProcessSupportingFileData(objs); } } \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/nodejs/swagger.mustache b/modules/swagger-codegen/src/main/resources/nodejs/swagger.mustache index 59940f08b15..3b975e53b80 100644 --- a/modules/swagger-codegen/src/main/resources/nodejs/swagger.mustache +++ b/modules/swagger-codegen/src/main/resources/nodejs/swagger.mustache @@ -14,7 +14,7 @@ {{#operations}} {{#operationsByPath}} "{{{path}}}": { - {{#operation}} + {{#operation}} "{{httpMethod}}": { "summary": "{{summary}}", "description":"{{notes}}", @@ -34,7 +34,6 @@ {{/operation}} } {{#hasMore}},{{/hasMore}} {{/operationsByPath}} - {{#hasMore}},{{/hasMore}} {{/operations}} {{/apis}} {{/apiInfo}}