From 2f80568658b0607b75aee103101bcdf6ce0fe794 Mon Sep 17 00:00:00 2001 From: Sreenidhi Sreesha Date: Tue, 22 Nov 2016 23:13:15 -0800 Subject: [PATCH] Refactor code to make it more readable. (#4224) --- .../io/swagger/codegen/DefaultCodegen.java | 117 +- .../io/swagger/codegen/DefaultGenerator.java | 1172 ++++++++--------- .../languages/AbstractJavaCodegen.java | 102 +- 3 files changed, 686 insertions(+), 705 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 2eac677995c2..265513d7189e 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 @@ -217,7 +217,6 @@ public class DefaultCodegen { // for enum model if (Boolean.TRUE.equals(cm.isEnum) && cm.allowableValues != null) { Map allowableValues = cm.allowableValues; - List values = (List) allowableValues.get("values"); List> enumVars = new ArrayList>(); String commonPrefix = findCommonPrefixOfVars(values); @@ -259,7 +258,6 @@ public class DefaultCodegen { public String findCommonPrefixOfVars(List vars) { try { String[] listStr = vars.toArray(new String[vars.size()]); - String prefix = StringUtils.getCommonPrefix(listStr); // exclude trailing characters that should be part of a valid variable // e.g. ["status-on", "status-off"] => "status-" (not "status-o") @@ -362,7 +360,13 @@ public class DefaultCodegen { // replace " with \" // outter unescape to retain the original multi-byte characters // finally escalate characters avoiding code injection - return escapeUnsafeCharacters(StringEscapeUtils.unescapeJava(StringEscapeUtils.escapeJava(input).replace("\\/", "/")).replaceAll("[\\t\\n\\r]"," ").replace("\\", "\\\\").replace("\"", "\\\"")); + return escapeUnsafeCharacters( + StringEscapeUtils.unescapeJava( + StringEscapeUtils.escapeJava(input) + .replace("\\/", "/")) + .replaceAll("[\\t\\n\\r]"," ") + .replace("\\", "\\\\") + .replace("\"", "\\\"")); } /** @@ -372,7 +376,8 @@ public class DefaultCodegen { * @return string with unsafe characters removed or escaped */ public String escapeUnsafeCharacters(String input) { - LOGGER.warn("escapeUnsafeCharacters should be overridden in the code generator with proper logic to escape unsafe characters"); + LOGGER.warn("escapeUnsafeCharacters should be overridden in the code generator with proper logic to escape " + + "unsafe characters"); // doing nothing by default and code generator should implement // the logic to prevent code injection // later we'll make this method abstract to make sure @@ -386,7 +391,8 @@ public class DefaultCodegen { * @return string with quotation mark removed or escaped */ public String escapeQuotationMark(String input) { - LOGGER.warn("escapeQuotationMark should be overridden in the code generator with proper logic to escape single/double quote"); + LOGGER.warn("escapeQuotationMark should be overridden in the code generator with proper logic to escape " + + "single/double quote"); return input.replace("\"", "\\\""); } @@ -1232,7 +1238,6 @@ public class DefaultCodegen { m.discriminator = ((ModelImpl) model).getDiscriminator(); } - if (model instanceof ArrayModel) { ArrayModel am = (ArrayModel) model; ArrayProperty arrayProperty = new ArrayProperty(am.getItems()); @@ -1319,7 +1324,7 @@ public class DefaultCodegen { addVars(m, properties, required, allProperties, allRequired); } else { ModelImpl impl = (ModelImpl) model; - if (m != null && impl.getType() != null) { + if (impl.getType() != null) { Property p = PropertyBuilder.build(impl.getType(), impl.getFormat(), null); m.dataType = getSwaggerType(p); } @@ -1350,7 +1355,7 @@ public class DefaultCodegen { if (model == null || allDefinitions == null) return false; - Model child = ((ComposedModel) model).getChild(); + Model child = model.getChild(); if (child instanceof ModelImpl && ((ModelImpl) child).getDiscriminator() != null) { return true; } @@ -1372,7 +1377,9 @@ public class DefaultCodegen { addParentContainer(codegenModel, codegenModel.name, mapProperty); } - protected void addProperties(Map properties, List required, Model model, Map allDefinitions) { + protected void addProperties(Map properties, + List required, Model model, + Map allDefinitions) { if (model instanceof ModelImpl) { ModelImpl mi = (ModelImpl) model; @@ -1403,9 +1410,7 @@ public class DefaultCodegen { if (name == null || name.length() == 0) { return name; } - return camelize(toVarName(name)); - } /** @@ -1422,7 +1427,6 @@ public class DefaultCodegen { } CodegenProperty property = CodegenModelFactory.newInstance(CodegenModelType.PROPERTY); - property.name = toVarName(name); property.baseName = name; property.nameInCamelCase = camelize(property.name, false); @@ -1504,7 +1508,6 @@ public class DefaultCodegen { property.allowableValues = allowableValues; }*/ } - if (p instanceof IntegerProperty) { IntegerProperty sp = (IntegerProperty) p; property.isInteger = true; @@ -1522,7 +1525,6 @@ public class DefaultCodegen { property.allowableValues = allowableValues; } } - if (p instanceof LongProperty) { LongProperty sp = (LongProperty) p; property.isLong = true; @@ -1540,11 +1542,9 @@ public class DefaultCodegen { property.allowableValues = allowableValues; } } - if (p instanceof BooleanProperty) { property.isBoolean = true; } - if (p instanceof BinaryProperty) { property.isBinary = true; } @@ -1554,7 +1554,6 @@ public class DefaultCodegen { if (p instanceof ByteArrayProperty) { property.isByteArray = true; } - // type is number and without format if (p instanceof DecimalProperty && !(p instanceof DoubleProperty) && !(p instanceof FloatProperty)) { DecimalProperty sp = (DecimalProperty) p; @@ -1573,7 +1572,6 @@ public class DefaultCodegen { property.allowableValues = allowableValues; }*/ } - if (p instanceof DoubleProperty) { DoubleProperty sp = (DoubleProperty) p; property.isDouble = true; @@ -1591,7 +1589,6 @@ public class DefaultCodegen { property.allowableValues = allowableValues; } } - if (p instanceof FloatProperty) { FloatProperty sp = (FloatProperty) p; property.isFloat = true; @@ -1627,7 +1624,6 @@ public class DefaultCodegen { property.allowableValues = allowableValues; } } - if (p instanceof DateTimeProperty) { DateTimeProperty sp = (DateTimeProperty) p; property.isDateTime = true; @@ -1690,25 +1686,26 @@ public class DefaultCodegen { protected void updatePropertyForArray(CodegenProperty property, CodegenProperty innerProperty) { if (innerProperty == null) { LOGGER.warn("skipping invalid array property " + Json.pretty(property)); - } else { - if (!languageSpecificPrimitives.contains(innerProperty.baseType)) { - property.complexType = innerProperty.baseType; - } else { - property.isPrimitiveType = true; - } - property.items = innerProperty; - // inner item is Enum - if (isPropertyInnerMostEnum(property)) { - // isEnum is set to true when the type is an enum - // or the inner type of an array/map is an enum - property.isEnum = true; - // update datatypeWithEnum and default value for array - // e.g. List => List - updateDataTypeWithEnumForArray(property); - // set allowable values to enum values (including array/map of enum) - property.allowableValues = getInnerEnumAllowableValues(property); - } + return; } + if (!languageSpecificPrimitives.contains(innerProperty.baseType)) { + property.complexType = innerProperty.baseType; + } else { + property.isPrimitiveType = true; + } + property.items = innerProperty; + // inner item is Enum + if (isPropertyInnerMostEnum(property)) { + // isEnum is set to true when the type is an enum + // or the inner type of an array/map is an enum + property.isEnum = true; + // update datatypeWithEnum and default value for array + // e.g. List => List + updateDataTypeWithEnumForArray(property); + // set allowable values to enum values (including array/map of enum) + property.allowableValues = getInnerEnumAllowableValues(property); + } + } /** @@ -1720,24 +1717,23 @@ public class DefaultCodegen { if (innerProperty == null) { LOGGER.warn("skipping invalid map property " + Json.pretty(property)); return; + } + if (!languageSpecificPrimitives.contains(innerProperty.baseType)) { + property.complexType = innerProperty.baseType; } else { - if (!languageSpecificPrimitives.contains(innerProperty.baseType)) { - property.complexType = innerProperty.baseType; - } else { - property.isPrimitiveType = true; - } - property.items = innerProperty; - // inner item is Enum - if (isPropertyInnerMostEnum(property)) { - // isEnum is set to true when the type is an enum - // or the inner type of an array/map is an enum - property.isEnum = true; - // update datatypeWithEnum and default value for map - // e.g. Dictionary => Dictionary - updateDataTypeWithEnumForMap(property); - // set allowable values to enum values (including array/map of enum) - property.allowableValues = getInnerEnumAllowableValues(property); - } + property.isPrimitiveType = true; + } + property.items = innerProperty; + // inner item is Enum + if (isPropertyInnerMostEnum(property)) { + // isEnum is set to true when the type is an enum + // or the inner type of an array/map is an enum + property.isEnum = true; + // update datatypeWithEnum and default value for map + // e.g. Dictionary => Dictionary + updateDataTypeWithEnumForMap(property); + // set allowable values to enum values (including array/map of enum) + property.allowableValues = getInnerEnumAllowableValues(property); } } @@ -1867,7 +1863,11 @@ public class DefaultCodegen { * @param swagger a Swagger object representing the spec * @return Codegen Operation object */ - public CodegenOperation fromOperation(String path, String httpMethod, Operation operation, Map definitions, Swagger swagger) { + public CodegenOperation fromOperation(String path, + String httpMethod, + Operation operation, + Map definitions, + Swagger swagger) { CodegenOperation op = CodegenModelFactory.newInstance(CodegenModelType.OPERATION); Set imports = new HashSet(); op.vendorExtensions = operation.getVendorExtensions(); @@ -1936,7 +1936,7 @@ public class DefaultCodegen { } // if "produces" is defined (per operation or using global definition) - if (produces != null && produces.size() > 0) { + if (produces != null && !produces.isEmpty()) { List> c = new ArrayList>(); int count = 0; for (String key : produces) { @@ -2228,7 +2228,7 @@ public class DefaultCodegen { if (param instanceof SerializableParameter) { SerializableParameter qp = (SerializableParameter) param; - Property property = null; + Property property; String collectionFormat = null; String type = qp.getType(); if (null == type) { @@ -3345,7 +3345,6 @@ public class DefaultCodegen { if (pattern != null && !pattern.matches("^/.*")) { return "/" + pattern + "/"; } - return pattern; } 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 6d481148c54d..b97c562a1a8d 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,79 +20,74 @@ import java.util.*; import org.apache.commons.lang3.StringUtils; public class DefaultGenerator extends AbstractGenerator implements Generator { - protected Logger LOGGER = LoggerFactory.getLogger(DefaultGenerator.class); - + protected final Logger LOGGER = LoggerFactory.getLogger(DefaultGenerator.class); protected CodegenConfig config; protected ClientOptInput opts; protected Swagger swagger; protected CodegenIgnoreProcessor ignoreProcessor; + private Boolean generateApis = null; + private Boolean generateModels = null; + private Boolean generateSupportingFiles = null; + private Boolean generateApiTests = null; + private Boolean generateApiDocumentation = null; + private Boolean generateModelTests = null; + private Boolean generateModelDocumentation = null; + private String basePath; + private String basePathWithoutHost; + private String contextPath; @Override public Generator opts(ClientOptInput opts) { this.opts = opts; - this.swagger = opts.getSwagger(); this.config = opts.getConfig(); - this.config.additionalProperties().putAll(opts.getOpts().getProperties()); - ignoreProcessor = new CodegenIgnoreProcessor(this.config.getOutputDir()); - return this; } - @Override - public List generate() { - Boolean generateApis = null; - Boolean generateModels = null; - Boolean generateSupportingFiles = null; - Boolean generateApiTests = null; - Boolean generateApiDocumentation = null; - Boolean generateModelTests = null; - Boolean generateModelDocumentation = null; + private String getScheme() { + String scheme; + if (swagger.getSchemes() != null && swagger.getSchemes().size() > 0) { + scheme = config.escapeText(swagger.getSchemes().get(0).toValue()); + } else { + scheme = "https"; + } + scheme = config.escapeText(scheme); + return scheme; + } - Set modelsToGenerate = null; - Set apisToGenerate = null; - Set supportingFilesToGenerate = null; + private String getHost(){ + StringBuilder hostBuilder = new StringBuilder(); + hostBuilder.append(getScheme()); + hostBuilder.append("://"); + if (swagger.getHost() != null) { + hostBuilder.append(swagger.getHost()); + } else { + hostBuilder.append("localhost"); + } + if (swagger.getBasePath() != null) { + hostBuilder.append(swagger.getBasePath()); + } + return hostBuilder.toString(); + } + + private void configureGeneratorProperties() { // allows generating only models by specifying a CSV of models to generate, or empty for all - if(System.getProperty("models") != null) { - String modelNames = System.getProperty("models"); - generateModels = true; - if(!modelNames.isEmpty()) { - modelsToGenerate = new HashSet(Arrays.asList(modelNames.split(","))); - } - } - if(System.getProperty("apis") != null) { - String apiNames = System.getProperty("apis"); - generateApis = true; - if(!apiNames.isEmpty()) { - apisToGenerate = new HashSet(Arrays.asList(apiNames.split(","))); - } - } - if(System.getProperty("supportingFiles") != null) { - String supportingFiles = System.getProperty("supportingFiles"); - generateSupportingFiles = true; - if(!supportingFiles.isEmpty()) { - supportingFilesToGenerate = new HashSet(Arrays.asList(supportingFiles.split(","))); - } - } - if(System.getProperty("modelTests") != null) { - generateModelTests = Boolean.valueOf(System.getProperty("modelTests")); - } - if(System.getProperty("modelDocs") != null) { - generateModelDocumentation = Boolean.valueOf(System.getProperty("modelDocs")); - } - if(System.getProperty("apiTests") != null) { - generateApiTests = Boolean.valueOf(System.getProperty("apiTests")); - } - if(System.getProperty("apiDocs") != null) { - generateApiDocumentation = Boolean.valueOf(System.getProperty("apiDocs")); - } + generateApis = System.getProperty("apis") != null ? true:null; + generateModels = System.getProperty("models") != null ? true: null; + generateSupportingFiles = System.getProperty("supportingFiles") != null ? true:null; + // model/api tests and documentation options rely on parent generate options (api or model) and no other options. + // They default to true in all scenarios and can only be marked false explicitly + generateModelTests = System.getProperty("modelTests") != null ? Boolean.valueOf(System.getProperty("modelTests")): true; + generateModelDocumentation = System.getProperty("modelDocs") != null ? Boolean.valueOf(System.getProperty("modelDocs")):true; + generateApiTests = System.getProperty("apiTests") != null ? Boolean.valueOf(System.getProperty("apiTests")): true; + generateApiDocumentation = System.getProperty("apiDocs") != null ? Boolean.valueOf(System.getProperty("apiDocs")):true; if(generateApis == null && generateModels == null && generateSupportingFiles == null) { // no specifics are set, generate everything - generateApis = true; generateModels = true; generateSupportingFiles = true; + generateApis = generateModels = generateSupportingFiles = true; } else { if(generateApis == null) { @@ -105,267 +100,224 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { generateSupportingFiles = false; } } - - // model/api tests and documentation options rely on parent generate options (api or model) and no other options. - // They default to true in all scenarios and can only be marked false explicitly - if (generateModelTests == null) { - generateModelTests = true; - } - if (generateModelDocumentation == null) { - generateModelDocumentation = true; - } - if (generateApiTests == null) { - generateApiTests = true; - } - if (generateApiDocumentation == null) { - generateApiDocumentation = true; - } - // Additional properties added for tests to exclude references in project related files config.additionalProperties().put(CodegenConstants.GENERATE_API_TESTS, generateApiTests); config.additionalProperties().put(CodegenConstants.GENERATE_MODEL_TESTS, generateModelTests); - if(Boolean.FALSE.equals(generateApiTests) && Boolean.FALSE.equals(generateModelTests)) { - config.additionalProperties().put(CodegenConstants.EXCLUDE_TESTS, Boolean.TRUE); - } - - if (swagger == null || config == null) { - throw new RuntimeException("missing swagger input or config!"); + if(!generateApiTests && !generateModelTests) { + config.additionalProperties().put(CodegenConstants.EXCLUDE_TESTS, true); } if (System.getProperty("debugSwagger") != null) { Json.prettyPrint(swagger); } - List files = new ArrayList(); config.processOpts(); config.preprocessSwagger(swagger); - config.additionalProperties().put("generatedDate", DateTime.now().toString()); config.additionalProperties().put("generatorClass", config.getClass().toString()); config.additionalProperties().put("inputSpec", config.getInputSpec()); - - if (swagger.getInfo() != null) { - Info info = swagger.getInfo(); - if (info.getTitle() != null) { - config.additionalProperties().put("appName", config.escapeText(info.getTitle())); - } - if (info.getVersion() != null) { - config.additionalProperties().put("appVersion", config.escapeText(info.getVersion())); - } - - if (StringUtils.isEmpty(info.getDescription())) { - // set a default description if none if provided - config.additionalProperties().put("appDescription", - "No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)"); - } else { - config.additionalProperties().put("appDescription", - config.escapeText(info.getDescription())); - } - - if (info.getContact() != null) { - Contact contact = info.getContact(); - config.additionalProperties().put("infoUrl", config.escapeText(contact.getUrl())); - if (contact.getEmail() != null) { - config.additionalProperties().put("infoEmail", config.escapeText(contact.getEmail())); - } - } - if (info.getLicense() != null) { - License license = info.getLicense(); - if (license.getName() != null) { - config.additionalProperties().put("licenseInfo", config.escapeText(license.getName())); - } - if (license.getUrl() != null) { - config.additionalProperties().put("licenseUrl", config.escapeText(license.getUrl())); - } - } - if (info.getVersion() != null) { - config.additionalProperties().put("version", config.escapeText(info.getVersion())); - } - if (info.getTermsOfService() != null) { - config.additionalProperties().put("termsOfService", config.escapeText(info.getTermsOfService())); - } + if (swagger.getVendorExtensions() != null) { + config.vendorExtensions().putAll(swagger.getVendorExtensions()); } + } - if(swagger.getVendorExtensions() != null) { - config.vendorExtensions().putAll(swagger.getVendorExtensions()); + private void configureSwaggerInfo() { + Info info = swagger.getInfo(); + if (info == null) { + return; } - - StringBuilder hostBuilder = new StringBuilder(); - String scheme; - if (swagger.getSchemes() != null && swagger.getSchemes().size() > 0) { - scheme = config.escapeText(swagger.getSchemes().get(0).toValue()); + if (info.getTitle() != null) { + config.additionalProperties().put("appName", config.escapeText(info.getTitle())); + } + if (info.getVersion() != null) { + config.additionalProperties().put("appVersion", config.escapeText(info.getVersion())); + } + if (StringUtils.isEmpty(info.getDescription())) { + // set a default description if none if provided + config.additionalProperties().put("appDescription", + "No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)"); } else { - scheme = "https"; + config.additionalProperties().put("appDescription", config.escapeText(info.getDescription())); } - scheme = config.escapeText(scheme); - hostBuilder.append(scheme); - hostBuilder.append("://"); - if (swagger.getHost() != null) { - hostBuilder.append(swagger.getHost()); - } else { - hostBuilder.append("localhost"); + + if (info.getContact() != null) { + Contact contact = info.getContact(); + config.additionalProperties().put("infoUrl", config.escapeText(contact.getUrl())); + if (contact.getEmail() != null) { + config.additionalProperties().put("infoEmail", config.escapeText(contact.getEmail())); + } } - if (swagger.getBasePath() != null) { - hostBuilder.append(swagger.getBasePath()); + if (info.getLicense() != null) { + License license = info.getLicense(); + if (license.getName() != null) { + config.additionalProperties().put("licenseInfo", config.escapeText(license.getName())); + } + if (license.getUrl() != null) { + config.additionalProperties().put("licenseUrl", config.escapeText(license.getUrl())); + } } - String contextPath = config.escapeText(swagger.getBasePath() == null ? "" : swagger.getBasePath()); - String basePath = config.escapeText(hostBuilder.toString()); - String basePathWithoutHost = config.escapeText(swagger.getBasePath()); + if (info.getVersion() != null) { + config.additionalProperties().put("version", config.escapeText(info.getVersion())); + } + if (info.getTermsOfService() != null) { + config.additionalProperties().put("termsOfService", config.escapeText(info.getTermsOfService())); + } + } - // resolve inline models - InlineModelResolver inlineModelResolver = new InlineModelResolver(); - inlineModelResolver.flatten(swagger); + private void generateModelTests(List files, Map models, String modelName) throws IOException{ + // to generate model test files + for (String templateName : config.modelTestTemplateFiles().keySet()) { + String suffix = config.modelTestTemplateFiles().get(templateName); + String filename = config.modelTestFileFolder() + File.separator + config.toModelTestFilename(modelName) + suffix; + // do not overwrite test file that already exists + if (new File(filename).exists()) { + LOGGER.info("File exists. Skipped overwriting " + filename); + continue; + } + File written = processTemplateToFile(models, templateName, filename); + if (written != null) { + files.add(written); + } + } + } - List allOperations = new ArrayList(); - List allModels = new ArrayList(); + private void generateModelDocumentation(List files, Map models, String modelName) throws IOException { + for (String templateName : config.modelDocTemplateFiles().keySet()) { + String suffix = config.modelDocTemplateFiles().get(templateName); + String filename = config.modelDocFileFolder() + File.separator + config.toModelDocFilename(modelName) + suffix; + if (!config.shouldOverwrite(filename)) { + LOGGER.info("Skipped overwriting " + filename); + continue; + } + File written = processTemplateToFile(models, templateName, filename); + if (written != null) { + files.add(written); + } + } + } + + private void generateModels(List files, List allModels) { + + if (!generateModels) { + return; + } - // models final Map definitions = swagger.getDefinitions(); - if (definitions != null) { - Set modelKeys = definitions.keySet(); + if (definitions == null) { + return; + } - if(generateModels) { - if(modelsToGenerate != null && modelsToGenerate.size() > 0) { - Set updatedKeys = new HashSet(); - for(String m : modelKeys) { - if(modelsToGenerate.contains(m)) { - updatedKeys.add(m); - } - } - modelKeys = updatedKeys; + String modelNames = System.getProperty("models"); + Set modelsToGenerate = null; + if(modelNames != null && !modelNames.isEmpty()) { + modelsToGenerate = new HashSet(Arrays.asList(modelNames.split(","))); + } + + Set modelKeys = definitions.keySet(); + if(modelsToGenerate != null && !modelsToGenerate.isEmpty()) { + Set updatedKeys = new HashSet(); + for(String m : modelKeys) { + if(modelsToGenerate.contains(m)) { + updatedKeys.add(m); + } + } + modelKeys = updatedKeys; + } + + // store all processed models + Map allProcessedModels = new TreeMap(new Comparator() { + @Override + public int compare(String o1, String o2) { + Model model1 = definitions.get(o1); + Model model2 = definitions.get(o2); + + int model1InheritanceDepth = getInheritanceDepth(model1); + int model2InheritanceDepth = getInheritanceDepth(model2); + + if (model1InheritanceDepth == model2InheritanceDepth) { + return ObjectUtils.compare(config.toModelName(o1), config.toModelName(o2)); + } else if (model1InheritanceDepth > model2InheritanceDepth) { + return 1; + } else { + return -1; + } + } + + private int getInheritanceDepth(Model model) { + int inheritanceDepth = 0; + Model parent = getParent(model); + + while (parent != null) { + inheritanceDepth++; + parent = getParent(parent); } - // store all processed models - Map allProcessedModels = new TreeMap(new Comparator() { - @Override - public int compare(String o1, String o2) { - Model model1 = definitions.get(o1); - Model model2 = definitions.get(o2); + return inheritanceDepth; + } - int model1InheritanceDepth = getInheritanceDepth(model1); - int model2InheritanceDepth = getInheritanceDepth(model2); - - if (model1InheritanceDepth == model2InheritanceDepth) { - return ObjectUtils.compare(config.toModelName(o1), config.toModelName(o2)); - } else if (model1InheritanceDepth > model2InheritanceDepth) { - return 1; - } else { - return -1; - } - } - - private int getInheritanceDepth(Model model) { - int inheritanceDepth = 0; - Model parent = getParent(model); - - while (parent != null) { - inheritanceDepth++; - parent = getParent(parent); - } - - return inheritanceDepth; - } - - private Model getParent(Model model) { - if (model instanceof ComposedModel) { - Model parent = ((ComposedModel) model).getParent(); - if(parent != null) { - return definitions.get(parent.getReference()); - } - } - - return null; - } - }); - - // process models only - for (String name : modelKeys) { - try { - //don't generate models that have an import mapping - if(config.importMapping().containsKey(name)) { - LOGGER.info("Model " + name + " not imported due to import mapping"); - continue; - } - - Model model = definitions.get(name); - Map modelMap = new HashMap(); - modelMap.put(name, model); - Map models = processModels(config, modelMap, definitions); - models.put("classname", config.toModelName(name)); - models.putAll(config.additionalProperties()); - - allProcessedModels.put(name, models); - - } catch (Exception e) { - throw new RuntimeException("Could not process model '" + name + "'" + ".Please make sure that your schema is correct!", e); + private Model getParent(Model model) { + if (model instanceof ComposedModel) { + Model parent = ((ComposedModel) model).getParent(); + if(parent != null) { + return definitions.get(parent.getReference()); } } - // post process all processed models - allProcessedModels = config.postProcessAllModels(allProcessedModels); + return null; + } + }); - // generate files based on processed models - for (String name: allProcessedModels.keySet()) { - Map models = (Map)allProcessedModels.get(name); + // process models only + for (String name : modelKeys) { + try { + //don't generate models that have an import mapping + if(config.importMapping().containsKey(name)) { + LOGGER.info("Model " + name + " not imported due to import mapping"); + continue; + } + Model model = definitions.get(name); + Map modelMap = new HashMap(); + modelMap.put(name, model); + Map models = processModels(config, modelMap, definitions); + models.put("classname", config.toModelName(name)); + models.putAll(config.additionalProperties()); + allProcessedModels.put(name, models); + } catch (Exception e) { + throw new RuntimeException("Could not process model '" + name + "'" + ".Please make sure that your schema is correct!", e); + } + } - try { - //don't generate models that have an import mapping - if(config.importMapping().containsKey(name)) { - continue; - } + // post process all processed models + allProcessedModels = config.postProcessAllModels(allProcessedModels); - allModels.add(((List) models.get("models")).get(0)); - - for (String templateName : config.modelTemplateFiles().keySet()) { - String suffix = config.modelTemplateFiles().get(templateName); - String filename = config.modelFileFolder() + File.separator + config.toModelFilename(name) + suffix; - if (!config.shouldOverwrite(filename)) { - LOGGER.info("Skipped overwriting " + filename); - continue; - } - - File written = processTemplateToFile(models, templateName, filename); - if(written != null) { - files.add(written); - } - } - - if(generateModelTests) { - // to generate model test files - for (String templateName : config.modelTestTemplateFiles().keySet()) { - String suffix = config.modelTestTemplateFiles().get(templateName); - String filename = config.modelTestFileFolder() + File.separator + config.toModelTestFilename(name) + suffix; - // do not overwrite test file that already exists - if (new File(filename).exists()) { - LOGGER.info("File exists. Skipped overwriting " + filename); - continue; - } - - File written = processTemplateToFile(models, templateName, filename); - if (written != null) { - files.add(written); - } - } - } - - if(generateModelDocumentation) { - // to generate model documentation files - for (String templateName : config.modelDocTemplateFiles().keySet()) { - String suffix = config.modelDocTemplateFiles().get(templateName); - String filename = config.modelDocFileFolder() + File.separator + config.toModelDocFilename(name) + suffix; - if (!config.shouldOverwrite(filename)) { - LOGGER.info("Skipped overwriting " + filename); - continue; - } - - File written = processTemplateToFile(models, templateName, filename); - if (written != null) { - files.add(written); - } - } - } - } catch (Exception e) { - throw new RuntimeException("Could not generate model '" + name + "'", e); + // generate files based on processed models + for (String modelName: allProcessedModels.keySet()) { + Map models = (Map)allProcessedModels.get(modelName); + try { + //don't generate models that have an import mapping + if(config.importMapping().containsKey(modelName)) { + continue; + } + allModels.add(((List) models.get("models")).get(0)); + for (String templateName : config.modelTemplateFiles().keySet()) { + String suffix = config.modelTemplateFiles().get(templateName); + String filename = config.modelFileFolder() + File.separator + config.toModelFilename(modelName) + suffix; + if (!config.shouldOverwrite(filename)) { + LOGGER.info("Skipped overwriting " + filename); + continue; + } + File written = processTemplateToFile(models, templateName, filename); + if(written != null) { + files.add(written); } } + if(generateModelTests) { + generateModelTests(files, models, modelName); + } + if(generateModelDocumentation) { + // to generate model documentation files + generateModelDocumentation(files, models, modelName); + } + } catch (Exception e) { + throw new RuntimeException("Could not generate model '" + modelName + "'", e); } } if (System.getProperty("debugModels") != null) { @@ -373,134 +325,269 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Json.prettyPrint(allModels); } - // apis + } + + private void generateApis(List files, List allOperations) { + if (!generateApis) { + return; + } Map> paths = processPaths(swagger.getPaths()); - if(generateApis) { - if(apisToGenerate != null && apisToGenerate.size() > 0) { - Map> updatedPaths = new TreeMap>(); - for(String m : paths.keySet()) { - if(apisToGenerate.contains(m)) { - updatedPaths.put(m, paths.get(m)); + Set apisToGenerate = null; + String apiNames = System.getProperty("apis"); + if(apiNames != null && !apiNames.isEmpty()) { + apisToGenerate = new HashSet(Arrays.asList(apiNames.split(","))); + } + if(apisToGenerate != null && !apisToGenerate.isEmpty()) { + Map> updatedPaths = new TreeMap>(); + for(String m : paths.keySet()) { + if(apisToGenerate.contains(m)) { + updatedPaths.put(m, paths.get(m)); + } + } + paths = updatedPaths; + } + for (String tag : paths.keySet()) { + try { + List ops = paths.get(tag); + Collections.sort(ops, new Comparator() { + @Override + public int compare(CodegenOperation one, CodegenOperation another) { + return ObjectUtils.compare(one.operationId, another.operationId); + } + }); + Map operation = processOperations(config, tag, ops); + + operation.put("basePath", basePath); + operation.put("basePathWithoutHost", basePathWithoutHost); + operation.put("contextPath", contextPath); + operation.put("baseName", tag); + operation.put("modelPackage", config.modelPackage()); + operation.putAll(config.additionalProperties()); + operation.put("classname", config.toApiName(tag)); + operation.put("classVarName", config.toApiVarName(tag)); + operation.put("importPath", config.toApiImport(tag)); + operation.put("classFilename", config.toApiFilename(tag)); + + if(!config.vendorExtensions().isEmpty()) { + operation.put("vendorExtensions", config.vendorExtensions()); + } + + // Pass sortParamsByRequiredFlag through to the Mustache template... + boolean sortParamsByRequiredFlag = true; + if (this.config.additionalProperties().containsKey(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG)) { + sortParamsByRequiredFlag = Boolean.valueOf(this.config.additionalProperties().get(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG).toString()); + } + operation.put("sortParamsByRequiredFlag", sortParamsByRequiredFlag); + + processMimeTypes(swagger.getConsumes(), operation, "consumes"); + processMimeTypes(swagger.getProduces(), operation, "produces"); + + allOperations.add(new HashMap(operation)); + for (int i = 0; i < allOperations.size(); i++) { + Map oo = (Map) allOperations.get(i); + if (i < (allOperations.size() - 1)) { + oo.put("hasMore", "true"); } } - paths = updatedPaths; - } - for (String tag : paths.keySet()) { - try { - List ops = paths.get(tag); - Collections.sort(ops, new Comparator() { - @Override - public int compare(CodegenOperation one, CodegenOperation another) { - return ObjectUtils.compare(one.operationId, another.operationId); + + for (String templateName : config.apiTemplateFiles().keySet()) { + String filename = config.apiFilename(templateName, tag); + if (!config.shouldOverwrite(filename) && new File(filename).exists()) { + LOGGER.info("Skipped overwriting " + filename); + continue; + } + + File written = processTemplateToFile(operation, templateName, filename); + if(written != null) { + files.add(written); + } + } + + if(generateApiTests) { + // to generate api test files + for (String templateName : config.apiTestTemplateFiles().keySet()) { + String filename = config.apiTestFilename(templateName, tag); + // do not overwrite test file that already exists + if (new File(filename).exists()) { + LOGGER.info("File exists. Skipped overwriting " + filename); + continue; } - }); - Map operation = processOperations(config, tag, ops); - operation.put("basePath", basePath); - operation.put("basePathWithoutHost", basePathWithoutHost); - operation.put("contextPath", contextPath); - operation.put("baseName", tag); - operation.put("modelPackage", config.modelPackage()); - operation.putAll(config.additionalProperties()); - operation.put("classname", config.toApiName(tag)); - operation.put("classVarName", config.toApiVarName(tag)); - operation.put("importPath", config.toApiImport(tag)); - operation.put("classFilename", config.toApiFilename(tag)); - - if(!config.vendorExtensions().isEmpty()) { - operation.put("vendorExtensions", config.vendorExtensions()); - } - - // Pass sortParamsByRequiredFlag through to the Mustache template... - boolean sortParamsByRequiredFlag = true; - if (this.config.additionalProperties().containsKey(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG)) { - sortParamsByRequiredFlag = Boolean.valueOf(this.config.additionalProperties().get(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG).toString()); - } - operation.put("sortParamsByRequiredFlag", sortParamsByRequiredFlag); - - processMimeTypes(swagger.getConsumes(), operation, "consumes"); - processMimeTypes(swagger.getProduces(), operation, "produces"); - - allOperations.add(new HashMap(operation)); - for (int i = 0; i < allOperations.size(); i++) { - Map oo = (Map) allOperations.get(i); - if (i < (allOperations.size() - 1)) { - oo.put("hasMore", "true"); + File written = processTemplateToFile(operation, templateName, filename); + if (written != null) { + files.add(written); } } + } - for (String templateName : config.apiTemplateFiles().keySet()) { - String filename = config.apiFilename(templateName, tag); + + if(generateApiDocumentation) { + // to generate api documentation files + for (String templateName : config.apiDocTemplateFiles().keySet()) { + String filename = config.apiDocFilename(templateName, tag); if (!config.shouldOverwrite(filename) && new File(filename).exists()) { LOGGER.info("Skipped overwriting " + filename); continue; } File written = processTemplateToFile(operation, templateName, filename); - if(written != null) { + if (written != null) { files.add(written); } } - - if(generateApiTests) { - // to generate api test files - for (String templateName : config.apiTestTemplateFiles().keySet()) { - String filename = config.apiTestFilename(templateName, tag); - // do not overwrite test file that already exists - if (new File(filename).exists()) { - LOGGER.info("File exists. Skipped overwriting " + filename); - continue; - } - - File written = processTemplateToFile(operation, templateName, filename); - if (written != null) { - files.add(written); - } - } - } - - - if(generateApiDocumentation) { - // to generate api documentation files - for (String templateName : config.apiDocTemplateFiles().keySet()) { - String filename = config.apiDocFilename(templateName, tag); - if (!config.shouldOverwrite(filename) && new File(filename).exists()) { - LOGGER.info("Skipped overwriting " + filename); - continue; - } - - File written = processTemplateToFile(operation, templateName, filename); - if (written != null) { - files.add(written); - } - } - } - - } catch (Exception e) { - throw new RuntimeException("Could not generate api file for '" + tag + "'", e); } + + } catch (Exception e) { + throw new RuntimeException("Could not generate api file for '" + tag + "'", e); } } - if (System.getProperty("debugOperations") != null) { LOGGER.info("############ Operation info ############"); Json.prettyPrint(allOperations); } - // supporting files + } + + private void generateSupportingFiles(List files, Map bundle) { + if (!generateSupportingFiles) { + return; + } + Set supportingFilesToGenerate = null; + String supportingFiles = System.getProperty("supportingFiles"); + if(supportingFiles!= null && !supportingFiles.isEmpty()) { + supportingFilesToGenerate = new HashSet(Arrays.asList(supportingFiles.split(","))); + } + + for (SupportingFile support : config.supportingFiles()) { + try { + String outputFolder = config.outputFolder(); + if (StringUtils.isNotEmpty(support.folder)) { + outputFolder += File.separator + support.folder; + } + File of = new File(outputFolder); + if (!of.isDirectory()) { + of.mkdirs(); + } + String outputFilename = outputFolder + File.separator + support.destinationFilename; + if (!config.shouldOverwrite(outputFilename)) { + LOGGER.info("Skipped overwriting " + outputFilename); + continue; + } + String templateFile; + if( support instanceof GlobalSupportingFile) { + templateFile = config.getCommonTemplateDir() + File.separator + support.templateFile; + } else { + templateFile = getFullTemplateFile(config, support.templateFile); + } + boolean shouldGenerate = true; + if(supportingFilesToGenerate != null && !supportingFilesToGenerate.isEmpty()) { + shouldGenerate = supportingFilesToGenerate.contains(support.destinationFilename); + } + if (!shouldGenerate){ + continue; + } + + if(ignoreProcessor.allowsFile(new File(outputFilename))) { + if (templateFile.endsWith("mustache")) { + String template = readTemplate(templateFile); + Mustache.Compiler compiler = Mustache.compiler(); + compiler = config.processCompiler(compiler); + Template tmpl = compiler + .withLoader(new Mustache.TemplateLoader() { + @Override + public Reader getTemplate(String name) { + return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); + } + }) + .defaultValue("") + .compile(template); + + writeToFile(outputFilename, tmpl.execute(bundle)); + files.add(new File(outputFilename)); + } else { + InputStream in = null; + + try { + in = new FileInputStream(templateFile); + } catch (Exception e) { + // continue + } + if (in == null) { + in = this.getClass().getClassLoader().getResourceAsStream(getCPResourcePath(templateFile)); + } + File outputFile = new File(outputFilename); + OutputStream out = new FileOutputStream(outputFile, false); + if (in != null) { + LOGGER.info("writing file " + outputFile); + IOUtils.copy(in, out); + } else { + LOGGER.error("can't open " + templateFile + " for input"); + } + files.add(outputFile); + } + } else { + LOGGER.info("Skipped generation of " + outputFilename + " due to rule in .swagger-codegen-ignore"); + } + } catch (Exception e) { + throw new RuntimeException("Could not generate supporting file '" + support + "'", e); + } + } + + // Consider .swagger-codegen-ignore a supporting file + // Output .swagger-codegen-ignore if it doesn't exist and wasn't explicitly created by a generator + final String swaggerCodegenIgnore = ".swagger-codegen-ignore"; + String ignoreFileNameTarget = config.outputFolder() + File.separator + swaggerCodegenIgnore; + File ignoreFile = new File(ignoreFileNameTarget); + if(!ignoreFile.exists()) { + String ignoreFileNameSource = File.separator + config.getCommonTemplateDir() + File.separator + swaggerCodegenIgnore; + String ignoreFileContents = readResourceContents(ignoreFileNameSource); + try { + writeToFile(ignoreFileNameTarget, ignoreFileContents); + } catch (IOException e) { + throw new RuntimeException("Could not generate supporting file '" + swaggerCodegenIgnore + "'", e); + } + files.add(ignoreFile); + } + + /* + * The following code adds default LICENSE (Apache-2.0) for all generators + * To use license other than Apache2.0, update the following file: + * modules/swagger-codegen/src/main/resources/_common/LICENSE + * + final String apache2License = "LICENSE"; + String licenseFileNameTarget = config.outputFolder() + File.separator + apache2License; + File licenseFile = new File(licenseFileNameTarget); + String licenseFileNameSource = File.separator + config.getCommonTemplateDir() + File.separator + apache2License; + String licenseFileContents = readResourceContents(licenseFileNameSource); + try { + writeToFile(licenseFileNameTarget, licenseFileContents); + } catch (IOException e) { + throw new RuntimeException("Could not generate LICENSE file '" + apache2License + "'", e); + } + files.add(licenseFile); + */ + + } + + private Map buildSupportFileBundle(List allOperations, List allModels) { + Map bundle = new HashMap(); bundle.putAll(config.additionalProperties()); bundle.put("apiPackage", config.apiPackage()); Map apis = new HashMap(); apis.put("apis", allOperations); + if (swagger.getHost() != null) { bundle.put("host", swagger.getHost()); } + contextPath = config.escapeText(swagger.getBasePath() == null ? "" : swagger.getBasePath()); + basePath = config.escapeText(getHost()); + basePathWithoutHost = config.escapeText(swagger.getBasePath()); bundle.put("swagger", this.swagger); bundle.put("basePath", basePath); bundle.put("basePathWithoutHost",basePathWithoutHost); - bundle.put("scheme", scheme); + bundle.put("scheme", getScheme()); bundle.put("contextPath", contextPath); bundle.put("apiInfo", apis); bundle.put("models", allModels); @@ -533,122 +620,33 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { LOGGER.info("############ Supporting file info ############"); Json.prettyPrint(bundle); } + return bundle; + } - if(generateSupportingFiles) { - for (SupportingFile support : config.supportingFiles()) { - try { - String outputFolder = config.outputFolder(); - if (StringUtils.isNotEmpty(support.folder)) { - outputFolder += File.separator + support.folder; - } - File of = new File(outputFolder); - if (!of.isDirectory()) { - of.mkdirs(); - } - String outputFilename = outputFolder + File.separator + support.destinationFilename; - if (!config.shouldOverwrite(outputFilename)) { - LOGGER.info("Skipped overwriting " + outputFilename); - continue; - } - String templateFile; - if( support instanceof GlobalSupportingFile) { - templateFile = config.getCommonTemplateDir() + File.separator + support.templateFile; - } else { - templateFile = getFullTemplateFile(config, support.templateFile); - } - boolean shouldGenerate = true; - if(supportingFilesToGenerate != null && supportingFilesToGenerate.size() > 0) { - if(supportingFilesToGenerate.contains(support.destinationFilename)) { - shouldGenerate = true; - } - else { - shouldGenerate = false; - } - } - if(shouldGenerate) { - if(ignoreProcessor.allowsFile(new File(outputFilename))) { - if (templateFile.endsWith("mustache")) { - String template = readTemplate(templateFile); - Mustache.Compiler compiler = Mustache.compiler(); - compiler = config.processCompiler(compiler); - Template tmpl = compiler - .withLoader(new Mustache.TemplateLoader() { - @Override - public Reader getTemplate(String name) { - return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); - } - }) - .defaultValue("") - .compile(template); + @Override + public List generate() { - writeToFile(outputFilename, tmpl.execute(bundle)); - files.add(new File(outputFilename)); - } else { - InputStream in = null; - - try { - in = new FileInputStream(templateFile); - } catch (Exception e) { - // continue - } - if (in == null) { - in = this.getClass().getClassLoader().getResourceAsStream(getCPResourcePath(templateFile)); - } - File outputFile = new File(outputFilename); - OutputStream out = new FileOutputStream(outputFile, false); - if (in != null) { - LOGGER.info("writing file " + outputFile); - IOUtils.copy(in, out); - } else { - if (in == null) { - LOGGER.error("can't open " + templateFile + " for input"); - } - } - files.add(outputFile); - } - } else { - LOGGER.info("Skipped generation of " + outputFilename + " due to rule in .swagger-codegen-ignore"); - } - } - } catch (Exception e) { - throw new RuntimeException("Could not generate supporting file '" + support + "'", e); - } - } - - // Consider .swagger-codegen-ignore a supporting file - // Output .swagger-codegen-ignore if it doesn't exist and wasn't explicitly created by a generator - final String swaggerCodegenIgnore = ".swagger-codegen-ignore"; - String ignoreFileNameTarget = config.outputFolder() + File.separator + swaggerCodegenIgnore; - File ignoreFile = new File(ignoreFileNameTarget); - if(!ignoreFile.exists()) { - String ignoreFileNameSource = File.separator + config.getCommonTemplateDir() + File.separator + swaggerCodegenIgnore; - String ignoreFileContents = readResourceContents(ignoreFileNameSource); - try { - writeToFile(ignoreFileNameTarget, ignoreFileContents); - } catch (IOException e) { - throw new RuntimeException("Could not generate supporting file '" + swaggerCodegenIgnore + "'", e); - } - files.add(ignoreFile); - } - - /* - * The following code adds default LICENSE (Apache-2.0) for all generators - * To use license other than Apache2.0, update the following file: - * modules/swagger-codegen/src/main/resources/_common/LICENSE - * - final String apache2License = "LICENSE"; - String licenseFileNameTarget = config.outputFolder() + File.separator + apache2License; - File licenseFile = new File(licenseFileNameTarget); - String licenseFileNameSource = File.separator + config.getCommonTemplateDir() + File.separator + apache2License; - String licenseFileContents = readResourceContents(licenseFileNameSource); - try { - writeToFile(licenseFileNameTarget, licenseFileContents); - } catch (IOException e) { - throw new RuntimeException("Could not generate LICENSE file '" + apache2License + "'", e); - } - files.add(licenseFile); - */ + if (swagger == null || config == null) { + throw new RuntimeException("missing swagger input or config!"); } + configureGeneratorProperties(); + configureSwaggerInfo(); + + // resolve inline models + InlineModelResolver inlineModelResolver = new InlineModelResolver(); + inlineModelResolver.flatten(swagger); + + List files = new ArrayList(); + // models + List allModels = new ArrayList(); + generateModels(files, allModels); + // apis + List allOperations = new ArrayList(); + generateApis(files, allOperations); + + // supporting files + Map bundle = buildSupportFileBundle(allOperations, allModels); + generateSupportingFiles(files, bundle); config.processSwagger(swagger); return files; } @@ -658,7 +656,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { String templateFile = getFullTemplateFile(config, templateName); String template = readTemplate(templateFile); Mustache.Compiler compiler = Mustache.compiler(); - compiler = config.processCompiler(compiler); + compiler = config.processCompiler(compiler); Template tmpl = compiler .withLoader(new Mustache.TemplateLoader() { @Override @@ -678,29 +676,30 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } private static void processMimeTypes(List mimeTypeList, Map operation, String source) { - if (mimeTypeList != null && mimeTypeList.size() > 0) { - List> c = new ArrayList>(); - int count = 0; - for (String key : mimeTypeList) { - Map mediaType = new HashMap(); - mediaType.put("mediaType", key); - count += 1; - if (count < mimeTypeList.size()) { - mediaType.put("hasMore", "true"); - } else { - mediaType.put("hasMore", null); - } - c.add(mediaType); - } - operation.put(source, c); - String flagFieldName = "has" + source.substring(0, 1).toUpperCase() + source.substring(1); - operation.put(flagFieldName, true); + if (mimeTypeList == null || mimeTypeList.isEmpty()){ + return; } + List> c = new ArrayList>(); + int count = 0; + for (String key : mimeTypeList) { + Map mediaType = new HashMap(); + mediaType.put("mediaType", key); + count += 1; + if (count < mimeTypeList.size()) { + mediaType.put("hasMore", "true"); + } else { + mediaType.put("hasMore", null); + } + c.add(mediaType); + } + operation.put(source, c); + String flagFieldName = "has" + source.substring(0, 1).toUpperCase() + source.substring(1); + operation.put(flagFieldName, true); + } public Map> processPaths(Map paths) { Map> ops = new TreeMap>(); - for (String resourcePath : paths.keySet()) { Path path = paths.get(resourcePath); processOperation(resourcePath, "get", path.getGet(), ops, path); @@ -714,115 +713,107 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { return ops; } - public SecuritySchemeDefinition fromSecurity(String name) { - Map map = swagger.getSecurityDefinitions(); - if (map == null) { - return null; + private void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations, Path path) { + if (operation == null) { + return; } - return map.get(name); - } - - public void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations, Path path) { - if (operation != null) { - if (System.getProperty("debugOperations") != null) { - LOGGER.info("processOperation: resourcePath= " + resourcePath + "\t;" + httpMethod + " " + operation - + "\n"); - } - List tags = operation.getTags(); - if (tags == null) { - tags = new ArrayList(); - tags.add("default"); + if (System.getProperty("debugOperations") != null) { + LOGGER.info("processOperation: resourcePath= " + resourcePath + "\t;" + httpMethod + " " + operation + "\n"); + } + List tags = operation.getTags(); + if (tags == null) { + tags = new ArrayList(); + tags.add("default"); + } + /* + build up a set of parameter "ids" defined at the operation level + per the swagger 2.0 spec "A unique parameter is defined by a combination of a name and location" + i'm assuming "location" == "in" + */ + Set operationParameters = new HashSet(); + if (operation.getParameters() != null) { + for (Parameter parameter : operation.getParameters()) { + operationParameters.add(generateParameterId(parameter)); } + } - /* - build up a set of parameter "ids" defined at the operation level - per the swagger 2.0 spec "A unique parameter is defined by a combination of a name and location" - i'm assuming "location" == "in" - */ - Set operationParameters = new HashSet(); - if (operation.getParameters() != null) { - for (Parameter parameter : operation.getParameters()) { - operationParameters.add(generateParameterId(parameter)); + //need to propagate path level down to the operation + if (path.getParameters() != null) { + for (Parameter parameter : path.getParameters()) { + //skip propagation if a parameter with the same name is already defined at the operation level + if (!operationParameters.contains(generateParameterId(parameter))) { + operation.addParameter(parameter); } } + } - //need to propagate path level down to the operation - if(path.getParameters() != null) { - for (Parameter parameter : path.getParameters()) { - //skip propagation if a parameter with the same name is already defined at the operation level - if (!operationParameters.contains(generateParameterId(parameter))) { - operation.addParameter(parameter); + for (String tag : tags) { + try { + CodegenOperation codegenOperation = config.fromOperation(resourcePath, httpMethod, operation, swagger.getDefinitions(), swagger); + codegenOperation.tags = new ArrayList(); + codegenOperation.tags.add(config.sanitizeTag(tag)); + config.addOperationToGroup(config.sanitizeTag(tag), resourcePath, operation, codegenOperation, operations); + + List>> securities = operation.getSecurity(); + if (securities == null && swagger.getSecurity() != null) { + securities = new ArrayList>>(); + for (SecurityRequirement sr : swagger.getSecurity()) { + securities.add(sr.getRequirements()); } } - } - - for (String tag : tags) { - CodegenOperation co = null; - try { - co = config.fromOperation(resourcePath, httpMethod, operation, swagger.getDefinitions(), swagger); - co.tags = new ArrayList(); - co.tags.add(config.sanitizeTag(tag)); - config.addOperationToGroup(config.sanitizeTag(tag), resourcePath, operation, co, operations); - - List>> securities = operation.getSecurity(); - if (securities == null && swagger.getSecurity() != null) { - securities = new ArrayList>>(); - for (SecurityRequirement sr : swagger.getSecurity()) { - securities.add(sr.getRequirements()); + if (securities == null || swagger.getSecurityDefinitions() == null) { + continue; + } + Map authMethods = new HashMap(); + for (Map> security: securities) { + for (String securityName : security.keySet()) { + SecuritySchemeDefinition securityDefinition = swagger.getSecurityDefinitions().get(securityName); + if (securityDefinition == null) { + continue; + } + 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()); + oauth2Operation.setScopes(new HashMap()); + for (String scope : security.get(securityName)) { + if (oauth2Definition.getScopes().containsKey(scope)) { + oauth2Operation.addScope(scope, oauth2Definition.getScopes().get(scope)); + } + } + authMethods.put(securityName, oauth2Operation); + } else { + authMethods.put(securityName, securityDefinition); } } - if (securities == null || securities.isEmpty()) { - continue; - } - Map authMethods = new HashMap(); - for (Map> security: securities) { - for (String securityName : security.keySet()) { - 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()); - oauth2Operation.setScopes(new HashMap()); - for (String scope : security.get(securityName)) { - 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); - co.hasAuthMethods = true; - } } - catch (Exception ex) { - String msg = "Could not process operation:\n" // + if (!authMethods.isEmpty()) { + codegenOperation.authMethods = config.fromSecurity(authMethods); + codegenOperation.hasAuthMethods = true; + } + } + catch (Exception ex) { + String msg = "Could not process operation:\n" // + " Tag: " + tag + "\n"// + " Operation: " + operation.getOperationId() + "\n" // + " Resource: " + httpMethod + " " + resourcePath + "\n"// + " Definitions: " + swagger.getDefinitions() + "\n" // + " Exception: " + ex.getMessage(); - throw new RuntimeException(msg, ex); - } + throw new RuntimeException(msg, ex); } } + } private static String generateParameterId(Parameter parameter) { return parameter.getName() + ":" + parameter.getIn(); } - @SuppressWarnings("static-method") - public Map processOperations(CodegenConfig config, String tag, List ops) { + + private Map processOperations(CodegenConfig config, String tag, List ops) { Map operations = new HashMap(); Map objs = new HashMap(); objs.put("classname", config.toApiName(tag)); @@ -869,7 +860,6 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { if (imports.size() > 0) { operations.put("hasImport", true); } - config.postProcessOperations(operations); if (objs.size() > 0) { List os = (List) objs.get("operation"); @@ -882,8 +872,8 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { return operations; } - @SuppressWarnings("static-method") - public Map processModels(CodegenConfig config, Map definitions, Map allDefinitions) { + + private Map processModels(CodegenConfig config, Map definitions, Map allDefinitions) { Map objs = new HashMap(); objs.put("package", config.modelPackage()); List models = new ArrayList(); @@ -899,7 +889,6 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { allImports.addAll(cm.imports); } objs.put("models", models); - Set importSet = new TreeSet(); for (String nextImport : allImports) { String mapping = config.importMapping().get(nextImport); @@ -915,17 +904,14 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { 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); - return objs; } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java index 4f11ea6fa383..829e2604f1d7 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java @@ -449,7 +449,6 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code } else if (p instanceof MapProperty) { MapProperty mp = (MapProperty) p; Property inner = mp.getAdditionalProperties(); - return getSwaggerType(p) + ""; } return super.getTypeDeclaration(p); @@ -639,7 +638,6 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, parentModel); codegenModel = AbstractJavaCodegen.reconcileInlineEnums(codegenModel, parentCodegenModel); } - return codegenModel; } @@ -667,7 +665,6 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code model.imports.add("ApiModelProperty"); model.imports.add("ApiModel"); } - return; } @Override @@ -712,26 +709,27 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code @Override public void preprocessSwagger(Swagger swagger) { - if (swagger != null && swagger.getPaths() != null) { - for (String pathname : swagger.getPaths().keySet()) { - Path path = swagger.getPath(pathname); - if (path.getOperations() != null) { - for (Operation operation : path.getOperations()) { - boolean hasFormParameters = false; - for (Parameter parameter : operation.getParameters()) { - if (parameter instanceof FormParameter) { - hasFormParameters = true; - } - } - - String defaultContentType = hasFormParameters ? "application/x-www-form-urlencoded" : "application/json"; - String contentType = operation.getConsumes() == null || operation.getConsumes().isEmpty() - ? defaultContentType : operation.getConsumes().get(0); - String accepts = getAccept(operation); - operation.setVendorExtension("x-contentType", contentType); - operation.setVendorExtension("x-accepts", accepts); + if (swagger == null || swagger.getPaths() == null){ + return; + } + for (String pathname : swagger.getPaths().keySet()) { + Path path = swagger.getPath(pathname); + if (path.getOperations() == null){ + continue; + } + for (Operation operation : path.getOperations()) { + boolean hasFormParameters = false; + for (Parameter parameter : operation.getParameters()) { + if (parameter instanceof FormParameter) { + hasFormParameters = true; } } + String defaultContentType = hasFormParameters ? "application/x-www-form-urlencoded" : "application/json"; + String contentType = operation.getConsumes() == null || operation.getConsumes().isEmpty() + ? defaultContentType : operation.getConsumes().get(0); + String accepts = getAccept(operation); + operation.setVendorExtension("x-contentType", contentType); + operation.setVendorExtension("x-accepts", accepts); } } } @@ -820,9 +818,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code @Override public CodegenOperation fromOperation(String path, String httpMethod, Operation operation, Map definitions, Swagger swagger) { CodegenOperation op = super.fromOperation(path, httpMethod, operation, definitions, swagger); - op.path = sanitizePath(op.path); - return op; } @@ -834,43 +830,43 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code // Because the child models extend the parents, the enums will be available via the parent. // Only bother with reconciliation if the parent model has enums. - if (parentCodegenModel.hasEnums) { + if (!parentCodegenModel.hasEnums) { + return codegenModel; + } - // Get the properties for the parent and child models - final List parentModelCodegenProperties = parentCodegenModel.vars; - List codegenProperties = codegenModel.vars; + // Get the properties for the parent and child models + final List parentModelCodegenProperties = parentCodegenModel.vars; + List codegenProperties = codegenModel.vars; - // Iterate over all of the parent model properties - boolean removedChildEnum = false; - for (CodegenProperty parentModelCodegenPropery : parentModelCodegenProperties) { - // Look for enums - if (parentModelCodegenPropery.isEnum) { - // Now that we have found an enum in the parent class, - // and search the child class for the same enum. - Iterator iterator = codegenProperties.iterator(); - while (iterator.hasNext()) { - CodegenProperty codegenProperty = iterator.next(); - if (codegenProperty.isEnum && codegenProperty.equals(parentModelCodegenPropery)) { - // We found an enum in the child class that is - // a duplicate of the one in the parent, so remove it. - iterator.remove(); - removedChildEnum = true; - } + // Iterate over all of the parent model properties + boolean removedChildEnum = false; + for (CodegenProperty parentModelCodegenPropery : parentModelCodegenProperties) { + // Look for enums + if (parentModelCodegenPropery.isEnum) { + // Now that we have found an enum in the parent class, + // and search the child class for the same enum. + Iterator iterator = codegenProperties.iterator(); + while (iterator.hasNext()) { + CodegenProperty codegenProperty = iterator.next(); + if (codegenProperty.isEnum && codegenProperty.equals(parentModelCodegenPropery)) { + // We found an enum in the child class that is + // a duplicate of the one in the parent, so remove it. + iterator.remove(); + removedChildEnum = true; } } } - - 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(); - for(CodegenProperty codegenProperty : codegenProperties) { - count += 1; - codegenProperty.hasMore = (count < numVars) ? true : null; - } - codegenModel.vars = codegenProperties; - } } + 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(); + for(CodegenProperty codegenProperty : codegenProperties) { + count += 1; + codegenProperty.hasMore = (count < numVars) ? true : null; + } + codegenModel.vars = codegenProperties; + } return codegenModel; }