From a72640ce9c70bbdcf5131f02dce1092d772ca8b9 Mon Sep 17 00:00:00 2001 From: Jakub Malek Date: Mon, 30 May 2016 10:33:22 +0200 Subject: [PATCH] NancyFx: - Sealed class for generated Modules - Empty constructor added to model classes - Code cleanup --- .../languages/NancyFXServerCodegen.java | 116 ++++++++++++------ .../src/main/resources/nancyfx/api.mustache | 2 +- .../src/main/resources/nancyfx/model.mustache | 6 + .../options/NancyFXServerOptionsProvider.java | 29 +++-- 4 files changed, 103 insertions(+), 50 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NancyFXServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NancyFXServerCodegen.java index ad04b76cb3e..6fbb624374a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NancyFXServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NancyFXServerCodegen.java @@ -1,6 +1,24 @@ package io.swagger.codegen.languages; -import com.google.common.collect.ImmutableMap; +import static com.google.common.base.Strings.isNullOrEmpty; +import static io.swagger.codegen.CodegenConstants.OPTIONAL_PROJECT_FILE; +import static io.swagger.codegen.CodegenConstants.OPTIONAL_PROJECT_FILE_DESC; +import static io.swagger.codegen.CodegenConstants.PACKAGE_NAME; +import static io.swagger.codegen.CodegenConstants.PACKAGE_VERSION; +import static io.swagger.codegen.CodegenConstants.RETURN_ICOLLECTION; +import static io.swagger.codegen.CodegenConstants.RETURN_ICOLLECTION_DESC; +import static io.swagger.codegen.CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG; +import static io.swagger.codegen.CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC; +import static io.swagger.codegen.CodegenConstants.SOURCE_FOLDER; +import static io.swagger.codegen.CodegenConstants.SOURCE_FOLDER_DESC; +import static io.swagger.codegen.CodegenConstants.USE_COLLECTION; +import static io.swagger.codegen.CodegenConstants.USE_COLLECTION_DESC; +import static io.swagger.codegen.CodegenConstants.USE_DATETIME_OFFSET; +import static io.swagger.codegen.CodegenConstants.USE_DATETIME_OFFSET_DESC; +import static io.swagger.codegen.CodegenType.SERVER; +import static java.util.Arrays.asList; +import static java.util.UUID.randomUUID; +import static org.apache.commons.lang3.StringUtils.capitalize; import io.swagger.codegen.CodegenOperation; import io.swagger.codegen.CodegenProperty; import io.swagger.codegen.CodegenType; @@ -8,20 +26,26 @@ import io.swagger.codegen.SupportingFile; import io.swagger.models.Swagger; import io.swagger.models.properties.Property; import io.swagger.models.properties.StringProperty; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.File; import java.util.Map; +import java.util.Map.Entry; -import static io.swagger.codegen.CodegenConstants.*; -import static io.swagger.codegen.CodegenType.SERVER; -import static java.util.Arrays.asList; -import static java.util.UUID.randomUUID; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableMap; public class NancyFXServerCodegen extends AbstractCSharpCodegen { private static final Logger log = LoggerFactory.getLogger(NancyFXServerCodegen.class); + private static final String API_NAMESPACE = "Modules"; + private static final String MODEL_NAMESPACE = "Models"; + + private static final Map> propertyToSwaggerTypeMapping = + createPropertyToSwaggerTypeMapping(); + private final String packageGuid = "{" + randomUUID().toString().toUpperCase() + "}"; public NancyFXServerCodegen() { @@ -69,8 +93,8 @@ public class NancyFXServerCodegen extends AbstractCSharpCodegen { public void processOpts() { super.processOpts(); - apiPackage = packageName + ".Modules"; - modelPackage = packageName + ".Models"; + apiPackage = isNullOrEmpty(packageName) ? API_NAMESPACE : packageName + "." + API_NAMESPACE; + modelPackage = isNullOrEmpty(packageName) ? MODEL_NAMESPACE : packageName + "." + MODEL_NAMESPACE; supportingFiles.add(new SupportingFile("parameters.mustache", sourceFile("Utils"), "Parameters.cs")); supportingFiles.add(new SupportingFile("packages.config.mustache", sourceFolder(), "packages.config")); @@ -92,78 +116,94 @@ public class NancyFXServerCodegen extends AbstractCSharpCodegen { @Override public String apiFileFolder() { - return outputFolder + File.separator + sourceFolder() + File.separator + "Modules"; + return outputFolder + File.separator + sourceFolder() + File.separator + API_NAMESPACE; } @Override public String modelFileFolder() { - return outputFolder + File.separator + sourceFolder() + File.separator + "Models"; + return outputFolder + File.separator + sourceFolder() + File.separator + MODEL_NAMESPACE; } @Override - protected void processOperation(CodegenOperation operation) { + protected void processOperation(final CodegenOperation operation) { super.processOperation(operation); - - // HACK: Unlikely in the wild, but we need to clean operation paths for MVC Routing - if (operation.path != null) { - String original = operation.path; + if (!isNullOrEmpty(operation.path) && operation.path.contains("?")) { operation.path = operation.path.replace("?", "/"); - if (!original.equals(operation.path)) { - log.warn("Normalized " + original + " to " + operation.path + ". Please verify generated source."); - } } - - // Converts, for example, PUT to HttpPut for controller attributes - operation.httpMethod = operation.httpMethod.substring(0, 1) + operation.httpMethod.substring(1).toLowerCase(); + if (!isNullOrEmpty(operation.httpMethod)) { + operation.httpMethod = capitalize(operation.httpMethod.toLowerCase()); + } } @Override - public String toEnumVarName(String name, String datatype) { + public String toEnumVarName(final String name, final String datatype) { final String enumName = camelize( sanitizeName(name) .replaceFirst("^_", "") .replaceFirst("_$", "")); - log.info("toEnumVarName = " + enumName); - - if (enumName.matches("\\d.*")) { // starts with number - return "_" + enumName; + final String result; + if (enumName.matches("\\d.*")) { + result = "_" + enumName; } else { - return enumName; + result = enumName; } + log.info(String.format("toEnumVarName('%s', %s) = '%s'", name, datatype, enumName)); + return result; } @Override - public String toApiName(String name) { - if (name.length() == 0) { - return "Default"; + public String toApiName(final String name) { + final String apiName; + if (isNullOrEmpty(name)) { + apiName = "Default"; + } else { + apiName = capitalize(name); } - return initialCaps(name); + log.info(String.format("toApiName('%s') = '%s'", name, apiName)); + return apiName; } @Override - public String toApiFilename(String name) { + public String toApiFilename(final String name) { return super.toApiFilename(name) + "Module"; } @Override - public void preprocessSwagger(Swagger swagger) { + public void preprocessSwagger(final Swagger swagger) { additionalProperties.put("packageContext", sanitizeName(swagger.getBasePath())); additionalProperties.put("baseContext", swagger.getBasePath()); } @Override - public String toEnumName(CodegenProperty property) { + public String toEnumName(final CodegenProperty property) { return sanitizeName(camelize(property.name)) ; } @Override - public String getSwaggerType(Property property) { - if (property instanceof StringProperty && "time".equalsIgnoreCase(property.getFormat())) { - return "time"; + public String getSwaggerType(final Property property) { + for (Entry> entry : propertyToSwaggerTypeMapping.entrySet()) { + if (entry.getValue().apply(property)) { + return entry.getKey(); + } } return super.getSwaggerType(property); } + private static Map> createPropertyToSwaggerTypeMapping() { + final ImmutableMap.Builder> mapping = ImmutableMap.builder(); + mapping.put("time", timeProperty()); + return mapping.build(); + } + + private static Predicate timeProperty() { + return new Predicate() { + @Override + public boolean apply(Property property) { + return property instanceof StringProperty && "time".equalsIgnoreCase(property.getFormat()); + } + }; + } + private static Map nodaTimeTypesMappings() { return ImmutableMap.of( "time", "LocalTime?", diff --git a/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache b/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache index 167408e8a36..8e912f5ef17 100644 --- a/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache +++ b/modules/swagger-codegen/src/main/resources/nancyfx/api.mustache @@ -11,7 +11,7 @@ namespace {{packageName}}.{{packageContext}}.Modules { {{#operations}}{{#operation}}{{#allParams}}{{#isEnum}} {{>innerApiEnum}}{{/isEnum}}{{/allParams}}{{/operation}} - public partial class {{classname}}Module : NancyModule + public sealed class {{classname}}Module : NancyModule { public {{classname}}Module({{classname}}Service service) : base("{{baseContext}}") { {{#operation}} diff --git a/modules/swagger-codegen/src/main/resources/nancyfx/model.mustache b/modules/swagger-codegen/src/main/resources/nancyfx/model.mustache index fbb08cec64c..fbb67988ed4 100644 --- a/modules/swagger-codegen/src/main/resources/nancyfx/model.mustache +++ b/modules/swagger-codegen/src/main/resources/nancyfx/model.mustache @@ -16,6 +16,12 @@ namespace {{packageName}}.{{packageContext}}.Models { {{#vars}} public {{>nullableDataType}} {{name}} { get; private set; }{{/vars}} + /// + /// Required by some serializers. + /// + [Obsolete] + public {{classname}}(){} + public {{classname}}({{#vars}}{{>nullableDataType}} {{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}) { {{#vars}} diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/NancyFXServerOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/NancyFXServerOptionsProvider.java index e24df884713..77a374f648e 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/NancyFXServerOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/NancyFXServerOptionsProvider.java @@ -1,15 +1,22 @@ package io.swagger.codegen.options; -import com.google.common.collect.ImmutableMap; -import io.swagger.codegen.CodegenConstants; +import static io.swagger.codegen.CodegenConstants.PACKAGE_NAME; +import static io.swagger.codegen.CodegenConstants.PACKAGE_VERSION; +import static io.swagger.codegen.CodegenConstants.RETURN_ICOLLECTION; +import static io.swagger.codegen.CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG; +import static io.swagger.codegen.CodegenConstants.SOURCE_FOLDER; +import static io.swagger.codegen.CodegenConstants.USE_COLLECTION; +import static io.swagger.codegen.CodegenConstants.USE_DATETIME_OFFSET; import java.util.Map; +import com.google.common.collect.ImmutableMap; + public class NancyFXServerOptionsProvider implements OptionsProvider { public static final String PACKAGE_NAME_VALUE = "swagger_server_nancyfx"; public static final String PACKAGE_VERSION_VALUE = "1.0.0-SNAPSHOT"; public static final String SOURCE_FOLDER_VALUE = "src_nancyfx"; - + @Override public String getLanguage() { return "nancyfx"; @@ -17,14 +24,14 @@ public class NancyFXServerOptionsProvider implements OptionsProvider { @Override public Map createOptions() { - ImmutableMap.Builder builder = new ImmutableMap.Builder(); - return builder.put(CodegenConstants.PACKAGE_NAME, PACKAGE_NAME_VALUE) - .put(CodegenConstants.PACKAGE_VERSION, PACKAGE_VERSION_VALUE) - .put(CodegenConstants.SOURCE_FOLDER, SOURCE_FOLDER_VALUE) - .put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, "true") - .put(CodegenConstants.USE_DATETIME_OFFSET, "true") - .put(CodegenConstants.USE_COLLECTION, "false") - .put(CodegenConstants.RETURN_ICOLLECTION, "false") + final ImmutableMap.Builder builder = ImmutableMap.builder(); + return builder.put(PACKAGE_NAME, PACKAGE_NAME_VALUE) + .put(PACKAGE_VERSION, PACKAGE_VERSION_VALUE) + .put(SOURCE_FOLDER, SOURCE_FOLDER_VALUE) + .put(SORT_PARAMS_BY_REQUIRED_FLAG, "true") + .put(USE_DATETIME_OFFSET, "true") + .put(USE_COLLECTION, "false") + .put(RETURN_ICOLLECTION, "false") .build(); }