From 0261121d780efff40de24d18c0f7630825b581fd Mon Sep 17 00:00:00 2001 From: F481 Date: Mon, 24 Aug 2015 14:04:50 +0200 Subject: [PATCH] added some useful log/output messages and exception handling --- .../java/io/swagger/codegen/cmd/Generate.java | 4 +- .../io/swagger/codegen/DefaultCodegen.java | 33 +++++-- .../io/swagger/codegen/DefaultGenerator.java | 88 ++++++++++++------- .../codegen/languages/JavaClientCodegen.java | 11 +++ 4 files changed, 94 insertions(+), 42 deletions(-) diff --git a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Generate.java b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Generate.java index cf22ae91b62..74b445c57ff 100644 --- a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Generate.java +++ b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Generate.java @@ -78,17 +78,19 @@ public class Generate implements Runnable { */ private static CodegenConfig forName(String name) { ServiceLoader loader = load(CodegenConfig.class); + String available = ""; for (CodegenConfig config : loader) { if (config.getName().equals(name)) { return config; } + available = available + config.getName() + "\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: "+available, 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 8a75eac30d6..298d57ff177 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 @@ -391,7 +391,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; @@ -763,7 +769,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; @@ -1002,6 +1008,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(); @@ -1015,7 +1025,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"); @@ -1027,7 +1041,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"); @@ -1040,12 +1054,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); @@ -1060,6 +1075,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..378a874d3e0 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,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { public void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations, Path path) { if (operation != null) { + LOGGER.info("processOperation: resourcePath= " + resourcePath + "\t;" + httpMethod + " " + operation + "\n"); List tags = operation.getTags(); if (tags == null) { tags = new ArrayList(); @@ -445,44 +455,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); + } + 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(); } - } - if (!authMethods.isEmpty()) { - co.authMethods = config.fromSecurity(authMethods); } } } 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 379a2db2eb1..0e9b189d77a 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 @@ -27,8 +27,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"; @@ -85,14 +89,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."; } @@ -194,6 +201,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); } @@ -287,6 +295,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); }