diff --git a/docs/generators/ada-server.md b/docs/generators/ada-server.md index 731aefee3588..d423d9e8d201 100644 --- a/docs/generators/ada-server.md +++ b/docs/generators/ada-server.md @@ -31,14 +31,17 @@ These options may be applied as additional-properties (cli) or configOptions (pl ## LANGUAGE PRIMITIVES ## RESERVED WORDS @@ -210,8 +213,8 @@ These options may be applied as additional-properties (cli) or configOptions (pl ### Security Feature | Name | Supported | Defined By | | ---- | --------- | ---------- | -|BasicAuth|✓|OAS2,OAS3 -|ApiKey|✓|OAS2,OAS3 +|BasicAuth|✗|OAS2,OAS3 +|ApiKey|✗|OAS2,OAS3 |OpenIDConnect|✗|OAS3 |BearerToken|✗|OAS3 |OAuth2_Implicit|✗|OAS2,OAS3 diff --git a/docs/generators/ada.md b/docs/generators/ada.md index 7fe92e9ee48c..51021230c985 100644 --- a/docs/generators/ada.md +++ b/docs/generators/ada.md @@ -31,14 +31,17 @@ These options may be applied as additional-properties (cli) or configOptions (pl ## LANGUAGE PRIMITIVES ## RESERVED WORDS @@ -124,7 +127,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl ### Client Modification Feature | Name | Supported | Defined By | | ---- | --------- | ---------- | -|BasePath|✗|ToolingExtension +|BasePath|✓|ToolingExtension |Authorizations|✗|ToolingExtension |UserAgent|✗|ToolingExtension |MockServer|✗|ToolingExtension @@ -165,7 +168,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl ### Documentation Feature | Name | Supported | Defined By | | ---- | --------- | ---------- | -|Readme|✗|ToolingExtension +|Readme|✓|ToolingExtension |Model|✓|ToolingExtension |Api|✓|ToolingExtension @@ -185,7 +188,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |MultiServer|✗|OAS3 |ParameterizedServer|✗|OAS3 |ParameterStyling|✗|OAS3 -|Callbacks|✓|OAS3 +|Callbacks|✗|OAS3 |LinkObjects|✗|OAS3 ### Parameter Feature @@ -204,20 +207,20 @@ These options may be applied as additional-properties (cli) or configOptions (pl | ---- | --------- | ---------- | |Simple|✓|OAS2,OAS3 |Composite|✓|OAS2,OAS3 -|Polymorphism|✓|OAS2,OAS3 +|Polymorphism|✗|OAS2,OAS3 |Union|✗|OAS3 ### Security Feature | Name | Supported | Defined By | | ---- | --------- | ---------- | -|BasicAuth|✓|OAS2,OAS3 -|ApiKey|✓|OAS2,OAS3 +|BasicAuth|✗|OAS2,OAS3 +|ApiKey|✗|OAS2,OAS3 |OpenIDConnect|✗|OAS3 -|BearerToken|✓|OAS3 -|OAuth2_Implicit|✓|OAS2,OAS3 -|OAuth2_Password|✓|OAS2,OAS3 -|OAuth2_ClientCredentials|✓|OAS2,OAS3 -|OAuth2_AuthorizationCode|✓|OAS2,OAS3 +|BearerToken|✗|OAS3 +|OAuth2_Implicit|✗|OAS2,OAS3 +|OAuth2_Password|✗|OAS2,OAS3 +|OAuth2_ClientCredentials|✗|OAS2,OAS3 +|OAuth2_AuthorizationCode|✗|OAS2,OAS3 ### Wire Format Feature | Name | Supported | Defined By | diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java index d09d7ab2c02b..f85738baa79c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java @@ -28,6 +28,12 @@ import io.swagger.v3.oas.models.servers.Server; import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.*; +import org.openapitools.codegen.meta.features.ClientModificationFeature; +import org.openapitools.codegen.meta.features.DocumentationFeature; +import org.openapitools.codegen.meta.features.GlobalFeature; +import org.openapitools.codegen.meta.features.SchemaSupportFeature; +import org.openapitools.codegen.meta.features.SecurityFeature; +import org.openapitools.codegen.meta.features.WireFormatFeature; import org.openapitools.codegen.utils.ModelUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,6 +56,26 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg public AbstractAdaCodegen() { super(); + modifyFeatureSet(features -> features + .includeDocumentationFeatures(DocumentationFeature.Readme) + .wireFormatFeatures(EnumSet.of(WireFormatFeature.JSON, WireFormatFeature.XML)) + .securityFeatures(EnumSet.noneOf( + SecurityFeature.class + )) + .excludeGlobalFeatures( + GlobalFeature.XMLStructureDefinitions, + GlobalFeature.Callbacks, + GlobalFeature.LinkObjects, + GlobalFeature.ParameterStyling + ) + .excludeSchemaSupportFeatures( + SchemaSupportFeature.Polymorphism + ) + .includeClientModificationFeatures( + ClientModificationFeature.BasePath + ) + ); + /* * Reserved words. Override this with reserved words specific to your language */ @@ -168,7 +194,8 @@ public AbstractAdaCodegen() { embeddedTemplateDir = templateDir = "Ada"; languageSpecificPrimitives = new HashSet( - Arrays.asList("integer", "boolean", "Integer", "Character", "Boolean", "long", "float", "double")); + Arrays.asList("integer", "boolean", "number", "long", "float", + "double", "object", "string", "date", "DateTime", "binary")); } public String toFilename(String name) { @@ -198,20 +225,28 @@ protected String toAdaIdentifier(String name, String prefix) { } StringBuilder result = new StringBuilder(); boolean needUpperCase = true; + boolean prevUpperCase = false; + if (name.isEmpty() || Character.isDigit(name.charAt(0)) || name.charAt(0) == '_') { + result.append(prefix); + } for (int i = 0; i < name.length(); i++) { char c = name.charAt(i); + boolean isUpperOrDigit = Character.isUpperCase(c) || Character.isDigit(c); if (needUpperCase) { needUpperCase = false; + prevUpperCase = isUpperOrDigit; result.append(Character.toUpperCase(c)); - } else if (Character.isUpperCase((c))) { - if (!needUpperCase) { + } else if (isUpperOrDigit) { + if (!prevUpperCase) { result.append('_'); } result.append(c); needUpperCase = false; + prevUpperCase = true; } else { result.append(c); + prevUpperCase = isUpperOrDigit; if (c == '_') { needUpperCase = true; } @@ -276,6 +311,40 @@ public String toModelName(final String name) { return result; } + @Override + public String toEnumVarName(String value, String datatype) { + String var = null; + if (value.isEmpty()) { + var = "EMPTY"; + } + + // for symbol, e.g. $, # + else if (getSymbolName(value) != null) { + var = getSymbolName(value).toUpperCase(Locale.ROOT); + } + + // number + else if ("Integer".equals(datatype) || "Long".equals(datatype) || + "Float".equals(datatype) || "Double".equals(datatype)) { + String varName = "NUMBER_" + value; + varName = varName.replaceAll("-", "MINUS_"); + varName = varName.replaceAll("\\+", "PLUS_"); + varName = varName.replaceAll("\\.", "_DOT_"); + var = varName; + } + + // string + else { + var = value.replaceAll("\\W+", "_").toUpperCase(Locale.ROOT); + if (var.matches("\\d.*")) { + var = "_" + var; + } else { + var = sanitizeName(var); + } + } + return var; + } + @Override public CodegenProperty fromProperty(String name, Schema p) { CodegenProperty property = super.fromProperty(name, p); @@ -371,6 +440,44 @@ public String getTypeDeclaration(Schema p) { return modelPackage + ".Models." + modelType; } + private boolean isStreamType(CodegenProperty parameter) { + boolean isStreamType = parameter.isString || parameter.isBoolean || parameter.isDate + || parameter.isDateTime || parameter.isInteger || parameter.isLong + || (parameter.isFreeFormObject && !parameter.isMapContainer); + + return isStreamType; + } + + private boolean isModelType(CodegenProperty parameter) { + boolean isModel = parameter.dataType.startsWith(modelPackage); + if (!isModel && !parameter.isPrimitiveType && !parameter.isDate + && !parameter.isFreeFormObject + && !parameter.isString && !parameter.isContainer && !parameter.isFile + && !parameter.dataType.startsWith("Swagger")) { + isModel = true; + } + return isModel; + } + + private boolean isStreamType(CodegenParameter parameter) { + boolean isStreamType = parameter.isString || parameter.isBoolean || parameter.isDate + || parameter.isDateTime || parameter.isInteger || parameter.isLong + || (parameter.isFreeFormObject && !parameter.isMapContainer); + + return isStreamType; + } + + private boolean isModelType(CodegenParameter parameter) { + boolean isModel = parameter.dataType.startsWith(modelPackage); + if (!isModel && !parameter.isPrimitiveType && !parameter.isDate + && !parameter.isFreeFormObject + && !parameter.isString && !parameter.isContainer && !parameter.isFile + && !parameter.dataType.startsWith("Swagger")) { + isModel = true; + } + return isModel; + } + /** * Overrides postProcessParameter to add a vendor extension "x-is-model-type". * This boolean indicates that the parameter comes from the model package. @@ -385,12 +492,8 @@ public void postProcessParameter(CodegenParameter parameter) { if (parameter.dataType == null) { return; } - boolean isModel = parameter.dataType.startsWith(modelPackage); - if (!isModel && !parameter.isPrimitiveType && !parameter.isDate - && !parameter.isString && !parameter.isContainer && !parameter.isFile) { - isModel = true; - } - parameter.vendorExtensions.put("x-is-model-type", isModel); + parameter.vendorExtensions.put("x-is-model-type", isModelType(parameter)); + parameter.vendorExtensions.put("x-is-stream-type", isStreamType(parameter)); } /** @@ -426,6 +529,8 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation if (methodResponse != null && ModelUtils.getSchemaFromResponse(methodResponse) != null) { CodegenProperty cm = fromProperty("response", ModelUtils.getSchemaFromResponse(methodResponse)); op.vendorExtensions.put("x-codegen-response", cm); + op.vendorExtensions.put("x-is-model-type", isModelType(cm)); + op.vendorExtensions.put("x-is-stream-type", isStreamType(cm)); if ("HttpContent".equals(cm.dataType)) { op.vendorExtensions.put("x-codegen-response-ishttpcontent", true); } @@ -524,7 +629,7 @@ public Map postProcessOperationsWithModels(Map o if (last < 0) { break; } - if (path.substring(pos, last - 1).equals(p.baseName)) { + if (path.substring(pos, last).equals(p.baseName)) { break; } pos = last + 1; @@ -558,6 +663,7 @@ public Map postProcessModels(Map objs) { isModel = true; } p.vendorExtensions.put("x-is-model-type", isModel); + p.vendorExtensions.put("x-is-stream-type", isStreamType(p)); Boolean required = p.getRequired(); // Convert optional members to use the Nullable_ type. diff --git a/modules/openapi-generator/src/main/resources/Ada/client-body.mustache b/modules/openapi-generator/src/main/resources/Ada/client-body.mustache index 2b20aed1165f..16c436671c9c 100644 --- a/modules/openapi-generator/src/main/resources/Ada/client-body.mustache +++ b/modules/openapi-generator/src/main/resources/Ada/client-body.mustache @@ -39,10 +39,15 @@ package body {{package}}.Clients is URI.Add_Param ("{{baseName}}", {{paramName}});{{/isDateTime}}{{/isQueryParam}}{{/queryParams}} URI.Set_Path ("{{path}}");{{#pathParams}} URI.Set_Path_Param ("{{baseName}}", {{^isString}}Swagger.To_String ({{/isString}}{{paramName}}{{^isString}}){{/isString}});{{/pathParams}} - Client.Call (Swagger.Clients.{{httpMethod}}, URI{{#hasBodyParam}}, Req{{/hasBodyParam}}{{#hasFormParams}}, Req{{/hasFormParams}}{{#returnType}}, Reply{{/returnType}});{{#returnType}}{{#vendorExtensions.x-codegen-response.isString}} - Swagger.Streams.Deserialize (Reply, "", Result);{{/vendorExtensions.x-codegen-response.isString}}{{^vendorExtensions.x-codegen-response.isString}}{{#returnTypeIsPrimitive}} - Swagger.Streams.Deserialize (Reply, "", Result);{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}} - {{package}}.Models.Deserialize (Reply, "", Result);{{/returnTypeIsPrimitive}}{{/vendorExtensions.x-codegen-response.isString}}{{/returnType}} + Client.Call (Swagger.Clients.{{httpMethod}}, URI{{#hasBodyParam}}, Req{{/hasBodyParam}}{{#hasFormParams}}, Req{{/hasFormParams}}{{#returnType}}, Reply{{/returnType}}); + {{#returnType}} + {{^vendorExtensions.x-is-model-type}} + Swagger.Streams.Deserialize (Reply, "", Result); + {{/vendorExtensions.x-is-model-type}} + {{#vendorExtensions.x-is-model-type}} + {{package}}.Models.Deserialize (Reply, "", Result); + {{/vendorExtensions.x-is-model-type}} + {{/returnType}} end {{operationId}}; {{/operation}} {{/operations}} diff --git a/modules/openapi-generator/src/main/resources/Ada/model-body.mustache b/modules/openapi-generator/src/main/resources/Ada/model-body.mustache index cec88232ad95..114109c8e991 100644 --- a/modules/openapi-generator/src/main/resources/Ada/model-body.mustache +++ b/modules/openapi-generator/src/main/resources/Ada/model-body.mustache @@ -11,13 +11,10 @@ package body {{package}}.Models is Name : in String; Value : in {{classname}}) is begin - Into.Start_Entity (Name);{{#vars}}{{^isPrimitiveType}}{{^isString}}{{^isContainer}}{{^isDateTime}} - Serialize (Into, "{{baseName}}", Value.{{name}});{{/isDateTime}}{{/isContainer}}{{/isString}}{{/isPrimitiveType}}{{#isPrimitiveType}}{{^isLong}} - Into.Write_Entity ("{{baseName}}", Value.{{name}});{{/isLong}}{{/isPrimitiveType}}{{#isLong}} - Serialize (Into, "{{baseName}}", Value.{{name}});{{/isLong}}{{#isString}} - Into.Write_Entity ("{{baseName}}", Value.{{name}});{{/isString}}{{#isContainer}} - Serialize (Into, "{{baseName}}", Value.{{name}});{{/isContainer}}{{#isDateTime}} - Into.Write_Entity ("{{baseName}}", Value.{{name}});{{/isDateTime}}{{/vars}} + Into.Start_Entity (Name);{{#vars}}{{#vendorExtensions.x-is-stream-type}}{{^isLong}} + Into.Write_Entity ("{{baseName}}", Value.{{name}});{{/isLong}}{{#isLong}} + Into.Write_Long_Entity ("{{baseName}}", Value.{{name}});{{/isLong}}{{/vendorExtensions.x-is-stream-type}}{{^vendorExtensions.x-is-stream-type}} + Serialize (Into, "{{baseName}}", Value.{{name}});{{/vendorExtensions.x-is-stream-type}}{{/vars}} Into.End_Entity (Name); end Serialize;