From 0dcd8b42b0d5e9abaf38f4c9feed2c8b91674ff5 Mon Sep 17 00:00:00 2001 From: Stephane Carrez Date: Mon, 28 Aug 2023 04:18:50 +0200 Subject: [PATCH] Fix 16417: [Ada] Server generation fails for some response types (#16421) * Fix and improvement of Ada server code generator - add support for EWS (Embedded Web Server) - fix GNAT project to avoid depending on util_http but instead use util_aws or util_curl - update server skeleton generation to handle more data types for the response - add more explanation on the generated server README * Rebuild the Ada client GNAT project --- .../codegen/languages/AbstractAdaCodegen.java | 69 +++++++++++++++++++ .../codegen/languages/AdaCodegen.java | 27 ++++---- .../codegen/languages/AdaServerCodegen.java | 36 +++++----- .../src/main/resources/Ada/README.mustache | 36 +++++++--- .../main/resources/Ada/gnat-project.mustache | 45 +++++++++--- .../main/resources/Ada/server-aws.mustache | 7 ++ .../main/resources/Ada/server-ews.mustache | 7 ++ .../Ada/server-skeleton-body.mustache | 56 ++++++++------- .../src/main/resources/Ada/server.mustache | 25 +++---- samples/client/petstore/ada/petstore.gpr | 27 ++++---- 10 files changed, 233 insertions(+), 102 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/Ada/server-aws.mustache create mode 100644 modules/openapi-generator/src/main/resources/Ada/server-ews.mustache 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 3c4a5ced556..6411726d8c3 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 @@ -759,8 +759,10 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg } CodegenProperty returnProperty = op.returnProperty; + CodegenProperty returnType = null; if (returnProperty != null) { CodegenProperty itemType = returnProperty.getItems(); + returnType = itemType; if (itemType != null) { String dataType; if (itemType.vendorExtensions.containsKey(X_ADA_VECTOR_TYPE_NAME)) { @@ -778,6 +780,73 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg } } + for (CodegenResponse rsp : op.responses) { + + if (rsp.dataType != null) { + String dataType = rsp.dataType; + if (returnType != null) { + if (returnType.vendorExtensions.containsKey(X_ADA_VECTOR_TYPE_NAME)) { + dataType = (String) returnType.vendorExtensions.get(X_ADA_VECTOR_TYPE_NAME); + rsp.vendorExtensions.put(X_ADA_TYPE_NAME, dataType); + } + rsp.vendorExtensions.put("x-is-model-type", isModelType(returnType)); + rsp.vendorExtensions.put("x-is-stream-type", isStreamType(returnType)); + rsp.vendorExtensions.put("x-is-nullable", returnType.isNull); + + // Convert optional members to use the Nullable_ type. + Boolean required = returnType.getHasRequired(); + if (!Boolean.TRUE.equals(required) && nullableTypeMapping.containsKey(dataType)) { + rsp.dataType = nullableTypeMapping.get(dataType); + rsp.vendorExtensions.put("x-is-required", false); + } else { + rsp.vendorExtensions.put("x-is-required", true); + } + if (!rsp.vendorExtensions.containsKey(X_ADA_SERIALIZE_OP)) { + if (returnType.isLong && !required) { + rsp.vendorExtensions.put(X_ADA_SERIALIZE_OP, "Write_Entity"); + } else if (rsp.isLong && "int64".equals(returnType.dataFormat)) { + rsp.vendorExtensions.put(X_ADA_SERIALIZE_OP, "Write_Long_Entity"); + } else { + rsp.vendorExtensions.put(X_ADA_SERIALIZE_OP, "Write_Entity"); + } + } + rsp.vendorExtensions.put("x-scz-return", true); + } else { + rsp.vendorExtensions.put("x-scz-no-return", true); + if (returnProperty != null) { + if (!rsp.vendorExtensions.containsKey(X_ADA_TYPE_NAME)) { + rsp.vendorExtensions.put(X_ADA_TYPE_NAME, returnProperty.dataType); + } + rsp.vendorExtensions.put("x-is-model-type", isModelType(returnProperty)); + rsp.vendorExtensions.put("x-is-stream-type", isStreamType(returnProperty)); + rsp.vendorExtensions.put("x-is-nullable", returnProperty.isNull); + + // Convert optional members to use the Nullable_ type. + Boolean required = returnProperty.getHasRequired(); + if (!Boolean.TRUE.equals(required) && nullableTypeMapping.containsKey(dataType)) { + rsp.dataType = nullableTypeMapping.get(dataType); + rsp.vendorExtensions.put("x-is-required", false); + } else { + rsp.vendorExtensions.put("x-is-required", true); + } + if (!rsp.vendorExtensions.containsKey(X_ADA_SERIALIZE_OP)) { + if (returnProperty.isLong && !required) { + rsp.vendorExtensions.put(X_ADA_SERIALIZE_OP, "Write_Entity"); + } else if (rsp.isLong && "int64".equals(returnProperty.dataFormat)) { + rsp.vendorExtensions.put(X_ADA_SERIALIZE_OP, "Write_Long_Entity"); + } else { + rsp.vendorExtensions.put(X_ADA_SERIALIZE_OP, "Write_Entity"); + } + } + } + } + } + for (CodegenProperty header : rsp.headers) { + header.nameInCamelCase = toModelName(header.baseName); + header.nameInLowerCase = header.baseName.toLowerCase(Locale.ROOT); + } + } + /* * Scan the path parameter to construct a x-path-index that tells the index of * the path parameter. diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaCodegen.java index 8d4a1ea8d4c..45c87f8b1c3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaCodegen.java @@ -89,13 +89,14 @@ public class AdaCodegen extends AbstractAdaCodegen implements CodegenConfig { if (StringUtils.isEmpty(packageName)) { packageName = modelPackage; } - String srcPrefix = "src" + File.separator; - String modelPrefix = srcPrefix + "model" + File.separator + toFilename(modelPackage); - String clientPrefix = srcPrefix + "client" + File.separator + toFilename(modelPackage); - supportingFiles.add(new SupportingFile("model-spec.mustache", "", modelPrefix + "-models.ads")); - supportingFiles.add(new SupportingFile("model-body.mustache", "", modelPrefix + "-models.adb")); - supportingFiles.add(new SupportingFile("client-spec.mustache", "", clientPrefix + "-clients.ads")); - supportingFiles.add(new SupportingFile("client-body.mustache", "", clientPrefix + "-clients.adb")); + String srcDir = "src" + File.separator; + String clientDir = srcDir + "client"; + String modelDir = srcDir + "model"; + String modelPrefix = toFilename(modelPackage); + supportingFiles.add(new SupportingFile("model-spec.mustache", modelDir, modelPrefix + "-models.ads")); + supportingFiles.add(new SupportingFile("model-body.mustache", modelDir, modelPrefix + "-models.adb")); + supportingFiles.add(new SupportingFile("client-spec.mustache", clientDir, modelPrefix + "-clients.ads")); + supportingFiles.add(new SupportingFile("client-body.mustache", clientDir, modelPrefix + "-clients.adb")); if (additionalProperties.containsKey(CodegenConstants.PROJECT_NAME)) { projectName = (String) additionalProperties.get(CodegenConstants.PROJECT_NAME); @@ -121,23 +122,23 @@ public class AdaCodegen extends AbstractAdaCodegen implements CodegenConfig { additionalProperties.put("httpClientPackageName", httpClientPackageName); additionalProperties.put("openApiPackageName", openApiPackageName); additionalProperties.put("openApiGprName", openApiPackageName.toLowerCase(Locale.ROOT)); + additionalProperties.put("httpClientGprName", httpClientPackageName.toLowerCase(Locale.ROOT)); additionalProperties.put(CodegenConstants.PROJECT_NAME, projectName); String[] names = this.modelPackage.split("\\."); String pkgName = names[0]; additionalProperties.put("packageLevel1", pkgName); - supportingFiles.add(new SupportingFile("package-spec-level1.mustache", "", - "src" + File.separator + toFilename(names[0]) + ".ads")); + supportingFiles.add(new SupportingFile("package-spec-level1.mustache", "src", + toFilename(names[0]) + ".ads")); if (names.length > 1) { String fileName = toFilename(names[0]) + "-" + toFilename(names[1]) + ".ads"; pkgName = names[0] + "." + names[1]; additionalProperties.put("packageLevel2", pkgName); - supportingFiles.add(new SupportingFile("package-spec-level2.mustache", "", - "src" + File.separator + fileName)); + supportingFiles.add(new SupportingFile("package-spec-level2.mustache", "src", fileName)); } pkgName = this.modelPackage; - supportingFiles.add(new SupportingFile("client.mustache", "", - "src" + File.separator + toFilename(pkgName) + "-client.adb")); + supportingFiles.add(new SupportingFile("client.mustache", "src", + toFilename(pkgName) + "-client.adb")); additionalProperties.put("packageName", toFilename(pkgName)); // add lambda for mustache templates diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaServerCodegen.java index e4dd0395a6c..45e182f5cb5 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AdaServerCodegen.java @@ -86,16 +86,20 @@ public class AdaServerCodegen extends AbstractAdaCodegen implements CodegenConfi if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) { packageName = (String) additionalProperties.get(CodegenConstants.PACKAGE_NAME); } - String srcPrefix = "src" + File.separator; - String serverPrefix = srcPrefix + "server" + File.separator + toFilename(modelPackage); - String modelPrefix = srcPrefix + "model" + File.separator + toFilename(modelPackage); - String implPrefix = srcPrefix + toFilename(modelPackage); - supportingFiles.add(new SupportingFile("model-spec.mustache", "", modelPrefix + "-models.ads")); - supportingFiles.add(new SupportingFile("model-body.mustache", "", modelPrefix + "-models.adb")); - supportingFiles.add(new SupportingFile("server-skeleton-spec.mustache", "", serverPrefix + "-skeletons.ads")); - supportingFiles.add(new SupportingFile("server-skeleton-body.mustache", "", serverPrefix + "-skeletons.adb")); - supportingFiles.add(new SupportingFile("server-spec.mustache", "", implPrefix + "-servers.ads")); - supportingFiles.add(new SupportingFile("server-body.mustache", "", implPrefix + "-servers.adb")); + String srcDir = "src" + File.separator; + String awsDir = srcDir + "aws"; + String ewsDir = srcDir + "ews"; + String serverDir = srcDir + "server"; + String modelDir = srcDir + "model"; + String modelPrefix = toFilename(modelPackage); + supportingFiles.add(new SupportingFile("model-spec.mustache", modelDir, modelPrefix + "-models.ads")); + supportingFiles.add(new SupportingFile("model-body.mustache", modelDir, modelPrefix + "-models.adb")); + supportingFiles.add(new SupportingFile("server-skeleton-spec.mustache", serverDir, modelPrefix + "-skeletons.ads")); + supportingFiles.add(new SupportingFile("server-skeleton-body.mustache", serverDir, modelPrefix + "-skeletons.adb")); + supportingFiles.add(new SupportingFile("server-spec.mustache", srcDir, modelPrefix + "-servers.ads")); + supportingFiles.add(new SupportingFile("server-body.mustache", srcDir, modelPrefix + "-servers.adb")); + supportingFiles.add(new SupportingFile("server-aws.mustache", awsDir, modelPrefix + "_aws.adb")); + supportingFiles.add(new SupportingFile("server-ews.mustache", ewsDir, modelPrefix + "_ews.adb")); supportingFiles.add(new SupportingFile("openapi.mustache", "web" + File.separator + "swagger", "openapi.json")); @@ -124,23 +128,23 @@ public class AdaServerCodegen extends AbstractAdaCodegen implements CodegenConfi additionalProperties.put("httpClientPackageName", httpClientPackageName); additionalProperties.put("openApiPackageName", openApiPackageName); additionalProperties.put("openApiGprName", openApiPackageName.toLowerCase(Locale.ROOT)); + additionalProperties.put("httpClientGprName", httpClientPackageName.toLowerCase(Locale.ROOT)); additionalProperties.put(CodegenConstants.PROJECT_NAME, projectName); String names[] = this.modelPackage.split("\\."); String pkgName = names[0]; additionalProperties.put("packageLevel1", pkgName); - supportingFiles.add(new SupportingFile("package-spec-level1.mustache", "", - "src" + File.separator + toFilename(names[0]) + ".ads")); + supportingFiles.add(new SupportingFile("package-spec-level1.mustache", "src", + toFilename(names[0]) + ".ads")); if (names.length > 1) { String fileName = toFilename(names[0]) + "-" + toFilename(names[1]) + ".ads"; pkgName = names[0] + "." + names[1]; additionalProperties.put("packageLevel2", pkgName); - supportingFiles.add(new SupportingFile("package-spec-level2.mustache", "", - "src" + File.separator + fileName)); + supportingFiles.add(new SupportingFile("package-spec-level2.mustache", "src", fileName)); } pkgName = this.modelPackage; - supportingFiles.add(new SupportingFile("server.mustache", "", - "src" + File.separator + toFilename(pkgName) + "-server.adb")); + supportingFiles.add(new SupportingFile("server.mustache", "src", + toFilename(pkgName) + "-server.adb")); additionalProperties.put("packageName", toFilename(pkgName)); // add lambda for mustache templates diff --git a/modules/openapi-generator/src/main/resources/Ada/README.mustache b/modules/openapi-generator/src/main/resources/Ada/README.mustache index ef2af40fd69..94846b4ecd5 100644 --- a/modules/openapi-generator/src/main/resources/Ada/README.mustache +++ b/modules/openapi-generator/src/main/resources/Ada/README.mustache @@ -6,23 +6,39 @@ This Ada server was generated by the [OpenAPI Generator](https://openapi-generat By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub. -## Building +## Alire setup -To build the server you will need the GNAT Ada compiler as well as -the [OpenAPI Ada library](https://github.com/stcarrez/swagger-ada). - -When the GNAT Ada compiler and OpenAPI Ada libraries are installed, -run the following command: +Use [Alire](https://github.com/alire-project/alire) to setup and build the project. +First, import the [OpenAPI Ada](https://gitlab.com/stcarrez/openapi-ada) server library with: ```shell - gprbuild -p -P{{projectName}} +alr with openapi_server +``` + +Then choose a servlet web container that will handle the requests. +Two web server implementations are provided: + +* [AWS](https://github.com/AdaCore/aws) +* [EWS](https://github.com/simonjwright/ews) + +and you should run one of the following `alr` command depending on your choice: + +``` +alr with servletada_aws +alr with servletada_ews +``` + +Once these steps are made, build the project with + +``` +alr build ``` After the build is successful, you will get the server binary -in bin/{{packageName}}-server and you can start it as follows: +in `bin/{{packageName}}_aws` or `bin/{{packageName}}_ews` and you can start it as follows: ```shell - ./bin/{{packageName}}-server + ./bin/{{packageName}}_aws ``` ## Structure of the server @@ -40,6 +56,8 @@ src/server/{{packageName}}-skeletons.adb|{{package}}.Skeletons|The server skelet src/server/{{packageName}}-models.ads|{{package}}.Skeletons|The server model types declaration src/server/{{packageName}}-models.adb|{{package}}.Skeletons|The server model types implementation src/{{packageName}}-server.adb|{{package}}.Server|The server main procedure +src/aws/{{packageName}}_aws.adb||The Ada Web Server server main procedure +src/ews/{{packageName}}_ews.adb||The Embedded Web Server server main procedure Files generated in **src/server** should not be modified. The server implementation files (**src/{{packageName}}-server.ads** and **src/{{packageName}}-server.adb**) should diff --git a/modules/openapi-generator/src/main/resources/Ada/gnat-project.mustache b/modules/openapi-generator/src/main/resources/Ada/gnat-project.mustache index bf01f1aa1b3..10272a0dc3a 100644 --- a/modules/openapi-generator/src/main/resources/Ada/gnat-project.mustache +++ b/modules/openapi-generator/src/main/resources/Ada/gnat-project.mustache @@ -8,21 +8,48 @@ with "config"; with "utilada_sys"; with "utilada_xml"; -with "utilada_http"; +with "utilada_{{httpClientGprName}}"; with "security"; with "{{openApiGprName}}";{{#isServer}} with "servletada"; +with "servletada_aws"; +-- with "servletada_ews"; with "{{openApiGprName}}_server";{{/isServer}} project {{{projectName}}} is - Mains := ("{{{packageName}}}-{{{mainName}}}.adb"); - for Main use Mains; - for Source_Dirs use ("src", "src/model", "src/{{{packageDir}}}"); - for Object_Dir use "./" & Config'Exec_Dir & "/bin"; + for Object_Dir use "obj/"; + for Source_Dirs use ("src", "src/model", "src/{{{packageDir}}}"); +{{^isServer}} + Mains := ("{{{packageName}}}-{{{mainName}}}.adb"); +{{/isServer}} +{{#isServer}} + for Main use (); - package Binder renames Config.Binder; - package Builder renames Config.Builder; - package Compiler renames Config.Compiler; - package Linker renames Config.Linker; + Build_AWS : Config.Yes_No := external ("BUILD_AWS", "yes"); + Build_EWS : Config.Yes_No := external ("BUILD_EWS", "no"); + + case Build_AWS is + when "yes" => + for Main use Project'Main & ("{{{packageName}}}_aws.adb"); + for Source_Dirs use Project'Source_Dirs & ("src/aws"); + + when others => + null; + end case; + + case Build_EWS is + when "yes" => + for Main use Project'Main & ("{{{packageName}}}_ews.adb"); + for Source_Dirs use Project'Source_Dirs & ("src/ews"); + + when others => + null; + end case; +{{/isServer}} + + package Binder renames Config.Binder; + package Builder renames Config.Builder; + package Compiler renames Config.Compiler; + package Linker renames Config.Linker; end {{{projectName}}}; diff --git a/modules/openapi-generator/src/main/resources/Ada/server-aws.mustache b/modules/openapi-generator/src/main/resources/Ada/server-aws.mustache new file mode 100644 index 00000000000..b1f02372010 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/Ada/server-aws.mustache @@ -0,0 +1,7 @@ +with Servlet.Server.Web; +with {{{projectName}}}.Server; +procedure {{{projectName}}}_AWS is + Container : Servlet.Server.Web.AWS_Container; +begin + {{{projectName}}}.Server (Container); +end {{{projectName}}}_AWS; diff --git a/modules/openapi-generator/src/main/resources/Ada/server-ews.mustache b/modules/openapi-generator/src/main/resources/Ada/server-ews.mustache new file mode 100644 index 00000000000..4479ed889ad --- /dev/null +++ b/modules/openapi-generator/src/main/resources/Ada/server-ews.mustache @@ -0,0 +1,7 @@ +with Servlet.Server.EWS; +with {{{projectName}}}.Server; +procedure {{{projectName}}}_EWS is + Container : Servlet.Server.EWS.EWS_Container; +begin + {{{projectName}}}.Server (Container); +end {{{projectName}}}_EWS; diff --git a/modules/openapi-generator/src/main/resources/Ada/server-skeleton-body.mustache b/modules/openapi-generator/src/main/resources/Ada/server-skeleton-body.mustache index b83931a6a16..fbd7e2f4ce2 100644 --- a/modules/openapi-generator/src/main/resources/Ada/server-skeleton-body.mustache +++ b/modules/openapi-generator/src/main/resources/Ada/server-skeleton-body.mustache @@ -107,10 +107,7 @@ package body {{package}}.Skeletons is {{#returnType}} {{#responses}} if Context.Get_Status = {{code}} then{{#message}} - Context.Set_Description ("{{message}}");{{/message}} -{{#schema}} -{{#vendorExtensions.x-produces-plain-text}} -{{#isFile}} + Context.Set_Description ("{{message}}");{{/message}}{{#-first}}{{#schema}}{{#vendorExtensions.x-produces-plain-text}}{{#isFile}} {{openApiPackageName}}.Streams.Write (Stream, Result); {{/isFile}}{{^isFile}} Stream.Write ({{openApiPackageName}}.To_String (Result)); @@ -119,15 +116,22 @@ package body {{package}}.Skeletons is {{#isFile}} {{openApiPackageName}}.Streams.Write (Stream, Result); {{/isFile}}{{^isFile}} - Stream.Start_Document;{{#vendorExtensions.x-codegen-response.isString}} - {{openApiPackageName}}.Streams.Serialize (Stream, "", Result);{{/vendorExtensions.x-codegen-response.isString}}{{^vendorExtensions.x-codegen-response.isString}}{{#returnTypeIsPrimitive}} - {{openApiPackageName}}.Streams.Serialize (Stream, "", Result);{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}} - {{package}}.Models.Serialize (Stream, "", Result);{{/returnTypeIsPrimitive}}{{/vendorExtensions.x-codegen-response.isString}} - Stream.End_Document; -{{/isFile}}{{/vendorExtensions.x-produces-plain-text}} - {{/schema}} + Stream.Start_Document;{{#vendorExtensions.x-is-stream-type}}{{^isLong}}{{#vendorExtensions.x-is-required}} + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result);{{/vendorExtensions.x-is-required}}{{^vendorExtensions.x-is-required}}{{#vendorExtensions.x-is-nullable}} + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result);{{/vendorExtensions.x-is-nullable}}{{^vendorExtensions.x-is-nullable}} + if not {{#isFreeFormObject}}{{openApiPackageName}}.Is_Null (Result){{/isFreeFormObject}}{{^isFreeFormObject}}Value.{{name}}.Is_Null{{/isFreeFormObject}} then + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result); + end if;{{/vendorExtensions.x-is-nullable}}{{/vendorExtensions.x-is-required}}{{/isLong}}{{#isLong}}{{#vendorExtensions.x-is-required}} + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result);{{/vendorExtensions.x-is-required}}{{^vendorExtensions.x-is-required}}{{#vendorExtensions.x-is-nullable}} + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result);{{/vendorExtensions.x-is-nullable}}{{^vendorExtensions.x-is-nullable}} + if not Result.Is_Null then + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result); + end if;{{/vendorExtensions.x-is-nullable}}{{/vendorExtensions.x-is-required}}{{/isLong}}{{/vendorExtensions.x-is-stream-type}}{{^vendorExtensions.x-is-stream-type}} + Serialize (Stream, "", Result);{{/vendorExtensions.x-is-stream-type}} + Stream.End_Document;{{/isFile}}{{/vendorExtensions.x-produces-plain-text}}{{/schema}}{{/-first}} return; - end if;{{/responses}}{{/returnType}} + end if; +{{/responses}}{{/returnType}} end {{operationId}}; {{/operation}} {{/operations}} @@ -224,10 +228,7 @@ package body {{package}}.Skeletons is {{#returnType}} {{#responses}} if Context.Get_Status = {{code}} then{{#message}} - Context.Set_Description ("{{message}}");{{/message}} -{{#schema}} -{{#vendorExtensions.x-produces-plain-text}} -{{#isFile}} + Context.Set_Description ("{{message}}");{{/message}}{{#-first}}{{#schema}}{{#vendorExtensions.x-produces-plain-text}}{{#isFile}} {{openApiPackageName}}.Streams.Write (Stream, Result); {{/isFile}}{{^isFile}} Stream.Write ({{openApiPackageName}}.To_String (Result)); @@ -236,15 +237,22 @@ package body {{package}}.Skeletons is {{#isFile}} {{openApiPackageName}}.Streams.Write (Stream, Result); {{/isFile}}{{^isFile}} - Stream.Start_Document;{{#vendorExtensions.x-codegen-response.isString}} - {{openApiPackageName}}.Streams.Serialize (Stream, "", Result);{{/vendorExtensions.x-codegen-response.isString}}{{^vendorExtensions.x-codegen-response.isString}}{{#returnTypeIsPrimitive}} - {{openApiPackageName}}.Streams.Serialize (Stream, "", Result);{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}} - {{package}}.Models.Serialize (Stream, "", Result);{{/returnTypeIsPrimitive}}{{/vendorExtensions.x-codegen-response.isString}} - Stream.End_Document; -{{/isFile}}{{/vendorExtensions.x-produces-plain-text}} - {{/schema}} + Stream.Start_Document;{{#vendorExtensions.x-is-stream-type}}{{^isLong}}{{#vendorExtensions.x-is-required}} + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result);{{/vendorExtensions.x-is-required}}{{^vendorExtensions.x-is-required}}{{#vendorExtensions.x-is-nullable}} + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result);{{/vendorExtensions.x-is-nullable}}{{^vendorExtensions.x-is-nullable}} + if not {{#isFreeFormObject}}{{openApiPackageName}}.Is_Null (Result){{/isFreeFormObject}}{{^isFreeFormObject}}Value.{{name}}.Is_Null{{/isFreeFormObject}} then + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result); + end if;{{/vendorExtensions.x-is-nullable}}{{/vendorExtensions.x-is-required}}{{/isLong}}{{#isLong}}{{#vendorExtensions.x-is-required}} + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result);{{/vendorExtensions.x-is-required}}{{^vendorExtensions.x-is-required}}{{#vendorExtensions.x-is-nullable}} + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result);{{/vendorExtensions.x-is-nullable}}{{^vendorExtensions.x-is-nullable}} + if not Result.Is_Null then + Stream.{{vendorExtensions.x-ada-serialize-op}} ("", Result); + end if;{{/vendorExtensions.x-is-nullable}}{{/vendorExtensions.x-is-required}}{{/isLong}}{{/vendorExtensions.x-is-stream-type}}{{^vendorExtensions.x-is-stream-type}} + Serialize (Stream, "", Result);{{/vendorExtensions.x-is-stream-type}} + Stream.End_Document;{{/isFile}}{{/vendorExtensions.x-produces-plain-text}}{{/schema}}{{/-first}} return; - end if;{{/responses}}{{/returnType}} + end if; +{{/responses}}{{/returnType}} end {{operationId}}; package API_{{operationId}} is diff --git a/modules/openapi-generator/src/main/resources/Ada/server.mustache b/modules/openapi-generator/src/main/resources/Ada/server.mustache index c3708a6f963..64b6ef9035f 100644 --- a/modules/openapi-generator/src/main/resources/Ada/server.mustache +++ b/modules/openapi-generator/src/main/resources/Ada/server.mustache @@ -1,46 +1,37 @@ with Ada.IO_Exceptions; -with AWS.Config.Set; -with {{openApiPackageName}}.Servers.AWS; +with Servlet.Server; with {{openApiPackageName}}.Servers.Applications; with Util.Strings; with Util.Log.Loggers; with Util.Properties; with Util.Properties.Basic; with {{package}}.Servers; -procedure {{package}}.Server is - procedure Configure (Config : in out AWS.Config.Object); - +procedure {{package}}.Server (Server : in out Servlet.Server.Container'Class) is use Util.Properties.Basic; CONFIG_PATH : constant String := "{{packageConfig}}.properties"; - Port : Natural := 8080; - - procedure Configure (Config : in out AWS.Config.Object) is - begin - AWS.Config.Set.Server_Port (Config, Port); - AWS.Config.Set.Max_Connection (Config, 8); - AWS.Config.Set.Accept_Queue_Size (Config, 512); - end Configure; + Port : Natural := 8080; App : aliased {{openApiPackageName}}.Servers.Applications.Application_Type; - WS : {{openApiPackageName}}.Servers.AWS.AWS_Container; Log : constant Util.Log.Loggers.Logger := Util.Log.Loggers.Create ("{{package}}.Server"); Props : Util.Properties.Manager; + Config : Servlet.Server.Configuration; begin Props.Load_Properties (CONFIG_PATH); Util.Log.Loggers.Initialize (Props); Port := Integer_Property.Get (Props, "swagger.port", Port); + Config.Listening_Port := Port; App.Configure (Props); {{package}}.Servers.Server_Impl.Register (App); - WS.Configure (Configure'Access); - WS.Register_Application ("{{basePathWithoutHost}}", App'Unchecked_Access); + Server.Configure (Config); + Server.Register_Application ("{{basePathWithoutHost}}", App'Unchecked_Access); App.Dump_Routes (Util.Log.INFO_LEVEL); Log.Info ("Connect your browser to: http://localhost:{0}{{basePathWithoutHost}}/ui/index.html", Util.Strings.Image (Port)); - WS.Start; + Server.Start; delay 6000.0; diff --git a/samples/client/petstore/ada/petstore.gpr b/samples/client/petstore/ada/petstore.gpr index e4036b9bfa4..b379071a7fb 100644 --- a/samples/client/petstore/ada/petstore.gpr +++ b/samples/client/petstore/ada/petstore.gpr @@ -1,26 +1,25 @@ --- Swagger Petstore --- This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special_key` to test the authorization filters. --- OpenAPI spec version: 1.0.0 +-- OpenAPI Petstore +-- This is a sample server Petstore server. For this sample, you can use the api key `special_key` to test the authorization filters. +-- The version of the OpenAPI document: 1.0.0 -- --- https://github.com/swagger-api/swagger-codegen.git +-- https://openapi-generator.tech -- --- NOTE: Auto generated by the swagger code generator program. +-- NOTE: Auto generated by OpenAPI Generator (https://openapi-generator.tech). with "config"; with "utilada_sys"; with "utilada_xml"; -with "utilada_http"; +with "utilada_curl"; with "security"; with "swagger"; project Petstore is - Mains := ("petstore.adb"); - for Main use Mains; - for Source_Dirs use ("src", "src/model", "src/client"); - for Object_Dir use "./" & Config'Exec_Dir & "/bin"; + for Object_Dir use "obj/"; + for Source_Dirs use ("src", "src/model", "src/client"); + Mains := ("samples-petstore-client.adb"); - package Binder renames Config.Binder; - package Builder renames Config.Builder; - package Compiler renames Config.Compiler; - package Linker renames Config.Linker; + package Binder renames Config.Binder; + package Builder renames Config.Builder; + package Compiler renames Config.Compiler; + package Linker renames Config.Linker; end Petstore;