From 46ac89320066ea7998535098246050c8553ea808 Mon Sep 17 00:00:00 2001 From: lnash94 Date: Tue, 13 Feb 2024 09:35:14 +0530 Subject: [PATCH 1/5] Add complex path collector --- .../openapi/cmd/BallerinaCodeGenerator.java | 85 +++++++++++++------ .../openapi/core/GeneratorUtils.java | 19 +++++ 2 files changed, 80 insertions(+), 24 deletions(-) diff --git a/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java b/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java index b5f260777..8b9f77274 100644 --- a/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java +++ b/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java @@ -108,26 +108,14 @@ public void generateClientAndService(String definitionPath, String serviceName, // Generate service String concatTitle = serviceName.toLowerCase(Locale.ENGLISH); String srcFile = concatTitle + "_service.bal"; - OASServiceMetadata oasServiceMetadata = new OASServiceMetadata.Builder() - .withOpenAPI(openAPIDef) - .withFilters(filter) - .withNullable(nullable) - .withGenerateServiceType(generateServiceType) - .withGenerateWithoutDataBinding(generateWithoutDataBinding) - .build(); - BallerinaServiceGenerator serviceGenerator = new BallerinaServiceGenerator(oasServiceMetadata); - String serviceContent = Formatter.format - (serviceGenerator.generateSyntaxTree()).toSourceCode(); - sourceFiles.add(new GenSrcFile(GenSrcFile.GenFileType.GEN_SRC, srcPackage, srcFile, - (licenseHeader.isBlank() ? DEFAULT_FILE_HEADER : licenseHeader) + serviceContent)); - - if (generateServiceType) { - BallerinaServiceObjectGenerator ballerinaServiceObjectGenerator = new - BallerinaServiceObjectGenerator(serviceGenerator.getFunctionList()); - String serviceType = Formatter.format(ballerinaServiceObjectGenerator.generateSyntaxTree()).toSourceCode(); - sourceFiles.add(new GenSrcFile(GenSrcFile.GenFileType.GEN_SRC, srcPackage, - "service_type.bal", (licenseHeader.isBlank() ? DO_NOT_MODIFY_FILE_HEADER : - licenseHeader) + serviceType)); + List complexPaths = GeneratorUtils.collectComplexPaths(openAPIDef); + if (!complexPaths.isEmpty()) { + isResource = false; + outStream.println("remote function(s) will be generated for client and the service generation can not be " + + "proceed due to the given openapi definition contains following complex path(s):"); + for (String path: complexPaths) { + outStream.println(path); + } } // Generate client. // Generate ballerina client remote. @@ -154,10 +142,35 @@ public void generateClientAndService(String definitionPath, String serviceName, //Update type definition list List preGeneratedTypeDefNodes = new ArrayList<>( clientGenerator.getBallerinaAuthConfigGenerator().getAuthRelatedTypeDefinitionNodes()); - List typeInclusionRecords = serviceGenerator.getTypeInclusionRecords(); List typeDefinitionNodeList = clientGenerator.getTypeDefinitionNodeList(); - preGeneratedTypeDefNodes.addAll(typeInclusionRecords); preGeneratedTypeDefNodes.addAll(typeDefinitionNodeList); + String serviceContent = ""; + if (complexPaths.isEmpty()) { + OASServiceMetadata oasServiceMetadata = new OASServiceMetadata.Builder() + .withOpenAPI(openAPIDef) + .withFilters(filter) + .withNullable(nullable) + .withGenerateServiceType(generateServiceType) + .withGenerateWithoutDataBinding(generateWithoutDataBinding) + .build(); + BallerinaServiceGenerator serviceGenerator = new BallerinaServiceGenerator(oasServiceMetadata); + serviceContent = Formatter.format + (serviceGenerator.generateSyntaxTree()).toSourceCode(); + sourceFiles.add(new GenSrcFile(GenSrcFile.GenFileType.GEN_SRC, srcPackage, srcFile, + (licenseHeader.isBlank() ? DEFAULT_FILE_HEADER : licenseHeader) + serviceContent)); + + if (generateServiceType) { + BallerinaServiceObjectGenerator ballerinaServiceObjectGenerator = new + BallerinaServiceObjectGenerator(serviceGenerator.getFunctionList()); + String serviceType = Formatter.format(ballerinaServiceObjectGenerator.generateSyntaxTree()). + toSourceCode(); + sourceFiles.add(new GenSrcFile(GenSrcFile.GenFileType.GEN_SRC, srcPackage, + "service_type.bal", (licenseHeader.isBlank() ? DO_NOT_MODIFY_FILE_HEADER : + licenseHeader) + serviceType)); + } + List typeInclusionRecords = serviceGenerator.getTypeInclusionRecords(); + preGeneratedTypeDefNodes.addAll(typeInclusionRecords); + } // Generate ballerina types. // Generate ballerina records to represent schemas. @@ -222,7 +235,9 @@ public void generateClient(String definitionPath, String outPath, Filter filter, Path srcPath = Paths.get(outPath); Path implPath = CodegenUtils.getImplPath(srcPackage, srcPath); List genFiles = generateClientFiles(Paths.get(definitionPath), filter, nullable, isResource); - writeGeneratedSources(genFiles, srcPath, implPath, GEN_CLIENT); + if (!genFiles.isEmpty()) { + writeGeneratedSources(genFiles, srcPath, implPath, GEN_CLIENT); + } } /** @@ -244,6 +259,9 @@ public void generateService(String definitionPath, String serviceName, String ou Path implPath = CodegenUtils.getImplPath(srcPackage, srcPath); List genFiles = generateBallerinaService(Paths.get(definitionPath), serviceName, filter, nullable, generateServiceType, generateWithoutDataBinding); + if (genFiles.isEmpty()) { + return; + } writeGeneratedSources(genFiles, srcPath, implPath, GEN_SERVICE); } @@ -339,6 +357,16 @@ private List generateClientFiles(Path openAPI, Filter filter, boolea // Normalize OpenAPI definition OpenAPI openAPIDef = GeneratorUtils.normalizeOpenAPI(openAPI, !isResource); checkOpenAPIVersion(openAPIDef); + // Validate the service generation + List complexPaths = GeneratorUtils.collectComplexPaths(openAPIDef); + if (!complexPaths.isEmpty()) { + outStream.println("remote function(s) will be generated for client due to the given openapi definition" + + " contains following complex path(s):"); + for (String path: complexPaths) { + outStream.println(path); + } + isResource = false; + } // Generate ballerina service and resources. OASClientConfig.Builder clientMetaDataBuilder = new OASClientConfig.Builder(); OASClientConfig oasClientConfig = clientMetaDataBuilder @@ -417,7 +445,16 @@ public List generateBallerinaService(Path openAPI, String serviceNam } else { openAPIDef.getInfo().setTitle(serviceName); } - + // Validate the service generation + List complexPaths = GeneratorUtils.collectComplexPaths(openAPIDef); + if (!complexPaths.isEmpty()) { + outStream.println("service generation can not be done due to the given openapi definition contains" + + " following complex path(s):"); + for (String path: complexPaths) { + outStream.println(path); + } + return new ArrayList<>(); + } List sourceFiles = new ArrayList<>(); String concatTitle = serviceName == null ? openAPIDef.getInfo().getTitle().toLowerCase(Locale.ENGLISH) : diff --git a/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java b/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java index c811b96fe..c4c150426 100644 --- a/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java +++ b/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java @@ -1175,4 +1175,23 @@ private static String getPathParameterType(Schema typeSchema, String pathPara } return type; } + + /** + * Filter the complex paths. + * + * @param openAPI + * @return + */ + public static List collectComplexPaths(OpenAPI openAPI) { + //Check given openapi has complex path + List complexPathList = new ArrayList<>(); + if (openAPI.getPaths() != null) { + for (Map.Entry path : openAPI.getPaths().entrySet()) { + if (isComplexURL(path.getKey())) { + complexPathList.add(path.getKey()); + } + } + } + return complexPathList; + } } From 632807560c921d197668876a6867404dff22a178 Mon Sep 17 00:00:00 2001 From: lnash94 Date: Tue, 13 Feb 2024 19:45:21 +0530 Subject: [PATCH 2/5] Add tests for complex path collector --- .../openapi/cmd/BallerinaCodeGenerator.java | 2 +- .../ballerina/openapi/cmd/OpenAPICmdTest.java | 88 ++++++++++- .../src/test/resources/complexPath.yaml | 139 ++++++++++++++++++ .../openapi/core/GeneratorUtils.java | 6 +- 4 files changed, 230 insertions(+), 5 deletions(-) create mode 100644 openapi-cli/src/test/resources/complexPath.yaml diff --git a/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java b/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java index 8b9f77274..1e70fe35e 100644 --- a/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java +++ b/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java @@ -82,7 +82,7 @@ public class BallerinaCodeGenerator { private String licenseHeader = ""; private boolean includeTestFiles; - private static final PrintStream outStream = System.err; + private static final PrintStream outStream = System.out; /** * Generates ballerina source for provided Open API Definition in {@code definitionPath}. diff --git a/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java b/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java index 728c4f8f4..a179e8bf6 100644 --- a/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java +++ b/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java @@ -29,8 +29,10 @@ import org.testng.annotations.Test; import picocli.CommandLine; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -43,10 +45,14 @@ public class OpenAPICmdTest extends OpenAPICommandTest { private static final String LINE_SEPARATOR = System.lineSeparator(); + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + @BeforeTest(description = "This will create a new ballerina project for testing below scenarios.") public void setupBallerinaProject() throws IOException { super.setup(); + System.setOut(new PrintStream(outputStream)); } @Test(description = "Test openapi command with help flag") @@ -650,9 +656,89 @@ public void getRelativePath() { equals("..\\..\\dir2\\dir3\\dir4\\test.txt")); } + @Test(description = "service generation for the parameterized path in OAS") + public void testForComplexPathInService() { + Path yamlContract = resourceDir.resolve(Paths.get("complexPath.yaml")); + String[] args = {"--input", yamlContract.toString(), "-o", this.tmpDir.toString(), "--mode", "service"}; + OpenApiCmd cmd = new OpenApiCmd(standardOut, tmpDir, false); + new CommandLine(cmd).parseArgs(args); + cmd.execute(); + Assert.assertTrue(outputStream.toString().contains("service generation can not be done due to the given" + + " openapi definition contains following complex path(s):\n" + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\n" + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom\n" + + "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo\n" + + "/payroll/v1/workers/{associateoid}/organizational-pay-statements/{payStatementId}/images/" + + "{imageId}.{imageExtension}\n" + + "/v3/ClientGroups/GetClientGroupByUserDefinedIdentifier(UserDefinedIdentifier=" + + "'{userDefinedIdentifier}')\n" + + "/companies({company_id})/items({item_id})")); + } + + @Test(description = "service type generation for the parameterized path in OAS") + public void testForComplexPathInServiceType() { + Path yamlContract = resourceDir.resolve(Paths.get("complexPath.yaml")); + String[] args = {"--input", yamlContract.toString(), "-o", this.tmpDir.toString(), "--mode", "service", + "--with-service-type"}; + OpenApiCmd cmd = new OpenApiCmd(standardOut, tmpDir, false); + new CommandLine(cmd).parseArgs(args); + cmd.execute(); + Assert.assertTrue(outputStream.toString().contains("service generation can not be done due to the " + + "given openapi definition contains following complex path(s):\n" + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\n" + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom\n" + + "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo\n" + + "/payroll/v1/workers/{associateoid}/organizational-pay-statements/{payStatementId}/images/" + + "{imageId}.{imageExtension}\n" + + "/v3/ClientGroups/GetClientGroupByUserDefinedIdentifier(UserDefinedIdentifier='" + + "{userDefinedIdentifier}')\n" + + "/companies({company_id})/items({item_id})")); + } + + @Test(description = "client generation for the parameterized path in OAS") + public void testForComplexPathInClient() { + Path yamlContract = resourceDir.resolve(Paths.get("complexPath.yaml")); + String[] args = {"--input", yamlContract.toString(), "-o", this.tmpDir.toString(), "--mode", "client"}; + OpenApiCmd cmd = new OpenApiCmd(standardOut, tmpDir, false); + new CommandLine(cmd).parseArgs(args); + cmd.execute(); + Assert.assertTrue(outputStream.toString().contains("remote function(s) will be generated for client " + + "due to the given openapi definition contains following complex path(s):\n" + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\n" + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom\n" + + "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo\n" + + "/payroll/v1/workers/{associateoid}/organizational-pay-statements/{payStatementId}/images/" + + "{imageId}.{imageExtension}\n" + + "/v3/ClientGroups/GetClientGroupByUserDefinedIdentifier(UserDefinedIdentifier=" + + "'{userDefinedIdentifier}')\n" + + "/companies({company_id})/items({item_id})\n" + + "Client generated successfully.")); + } + + @Test(description = "both client and service generation for the parameterized path in OAS") + public void testForComplexPathInBothClientAndService() { + Path yamlContract = resourceDir.resolve(Paths.get("complexPath.yaml")); + String[] args = {"--input", yamlContract.toString(), "-o", this.tmpDir.toString()}; + OpenApiCmd cmd = new OpenApiCmd(standardOut, tmpDir, false); + new CommandLine(cmd).parseArgs(args); + cmd.execute(); + Assert.assertTrue(outputStream.toString().contains("remote function(s) will be generated for client" + + " and the service generation can not be proceed due to the given openapi definition contains" + + " following complex path(s):\n" + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\n" + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom\n" + + "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo\n" + + "/payroll/v1/workers/{associateoid}/organizational-pay-statements/{payStatementId}/images/" + + "{imageId}.{imageExtension}\n" + + "/v3/ClientGroups/GetClientGroupByUserDefinedIdentifier(UserDefinedIdentifier=" + + "'{userDefinedIdentifier}')\n" + + "/companies({company_id})/items({item_id})\n" + + "Following files were created.")); + } + @AfterTest public void clean() { System.setErr(null); - System.setOut(null); + System.setOut(standardOut); } } diff --git a/openapi-cli/src/test/resources/complexPath.yaml b/openapi-cli/src/test/resources/complexPath.yaml new file mode 100644 index 000000000..fc62360a6 --- /dev/null +++ b/openapi-cli/src/test/resources/complexPath.yaml @@ -0,0 +1,139 @@ +openapi: 3.0.0 +info: + title: Formstack API + version: "2.0" +servers: + - url: https://www.formstack.com/api/v2 + +paths: + /v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo: + post: + operationId: post1 + parameters: + - in: path + name: spreadsheetId + required: true + schema: + type: string + - in: path + name: sheetId + required: true + schema: + type: integer + responses: + "200": + content: + application/json: + schema: + type: string + description: Successful response + /v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom: + post: + operationId: post2 + parameters: + - in: path + name: spreadsheetId + required: true + schema: + type: string + - in: path + name: sheetId + required: true + schema: + type: integer + responses: + "200": + content: + application/json: + schema: + type: string + description: Successful response + /v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo: + post: + operationId: post3 + parameters: + - in: path + name: spreadsheetId + required: true + schema: + type: string + - in: path + name: sheetId + required: true + schema: + type: integer + responses: + "200": + content: + application/json: + schema: + type: string + description: Successful response + /payroll/v1/workers/{associateoid}/organizational-pay-statements/{payStatementId}/images/{imageId}.{imageExtension}: + post: + operationId: post4 + parameters: + - in: path + name: associateoid + required: true + schema: + type: string + - in: path + name: payStatementId + required: true + schema: + type: integer + - in: path + name: imageId + required: true + schema: + type: integer + - in: path + name: imageExtension + required: true + schema: + type: string + responses: + "200": + content: + application/json: + schema: + type: string + description: Successful response + /v3/ClientGroups/GetClientGroupByUserDefinedIdentifier(UserDefinedIdentifier='{userDefinedIdentifier}'): + post: + operationId: post5 + parameters: + - in: path + name: userDefinedIdentifier + required: true + schema: + type: string + responses: + "200": + content: + application/json: + schema: + type: string + description: Successful response + /companies({company_id})/items({item_id}): + post: + operationId: post6 + parameters: + - in: path + name: company_id + required: true + schema: + type: string + - in: path + name: item_id + required: true + schema: + type: integer + responses: + "200": + content: + application/json: + schema: + type: string + description: Successful response diff --git a/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java b/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java index c4c150426..3a616fa11 100644 --- a/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java +++ b/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java @@ -1177,10 +1177,10 @@ private static String getPathParameterType(Schema typeSchema, String pathPara } /** - * Filter the complex paths. + * Collect the complex paths in the OAS definition. * - * @param openAPI - * @return + * @param openAPI - openAPI definition. + * @return List of complex paths */ public static List collectComplexPaths(OpenAPI openAPI) { //Check given openapi has complex path From cbd44cc9c25333007a49557f1ac68af4a0de36db Mon Sep 17 00:00:00 2001 From: lnash94 Date: Wed, 14 Feb 2024 11:35:11 +0530 Subject: [PATCH 3/5] fix review suggestion --- .../ballerina/openapi/cmd/BallerinaCodeGenerator.java | 10 +++++----- .../java/io/ballerina/openapi/core/GeneratorUtils.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java b/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java index 1e70fe35e..361200e9c 100644 --- a/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java +++ b/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java @@ -106,9 +106,9 @@ public void generateClientAndService(String definitionPath, String serviceName, OpenAPI openAPIDef = GeneratorUtils.normalizeOpenAPI(openAPIPath, !isResource); checkOpenAPIVersion(openAPIDef); // Generate service - String concatTitle = serviceName.toLowerCase(Locale.ENGLISH); - String srcFile = concatTitle + "_service.bal"; - List complexPaths = GeneratorUtils.collectComplexPaths(openAPIDef); + String serviceTitle = serviceName.toLowerCase(Locale.ENGLISH); + String srcFile = String.format("%s_service.bal", serviceTitle); + List complexPaths = GeneratorUtils.getComplexPaths(openAPIDef); if (!complexPaths.isEmpty()) { isResource = false; outStream.println("remote function(s) will be generated for client and the service generation can not be " + @@ -358,7 +358,7 @@ private List generateClientFiles(Path openAPI, Filter filter, boolea OpenAPI openAPIDef = GeneratorUtils.normalizeOpenAPI(openAPI, !isResource); checkOpenAPIVersion(openAPIDef); // Validate the service generation - List complexPaths = GeneratorUtils.collectComplexPaths(openAPIDef); + List complexPaths = GeneratorUtils.getComplexPaths(openAPIDef); if (!complexPaths.isEmpty()) { outStream.println("remote function(s) will be generated for client due to the given openapi definition" + " contains following complex path(s):"); @@ -446,7 +446,7 @@ public List generateBallerinaService(Path openAPI, String serviceNam openAPIDef.getInfo().setTitle(serviceName); } // Validate the service generation - List complexPaths = GeneratorUtils.collectComplexPaths(openAPIDef); + List complexPaths = GeneratorUtils.getComplexPaths(openAPIDef); if (!complexPaths.isEmpty()) { outStream.println("service generation can not be done due to the given openapi definition contains" + " following complex path(s):"); diff --git a/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java b/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java index 3a616fa11..d8c4416dc 100644 --- a/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java +++ b/openapi-core/src/main/java/io/ballerina/openapi/core/GeneratorUtils.java @@ -1182,7 +1182,7 @@ private static String getPathParameterType(Schema typeSchema, String pathPara * @param openAPI - openAPI definition. * @return List of complex paths */ - public static List collectComplexPaths(OpenAPI openAPI) { + public static List getComplexPaths(OpenAPI openAPI) { //Check given openapi has complex path List complexPathList = new ArrayList<>(); if (openAPI.getPaths() != null) { From 9f0bf3260a9a9ee87697fabe4b6a551b9750a387 Mon Sep 17 00:00:00 2001 From: lnash94 Date: Tue, 27 Feb 2024 10:17:09 +0530 Subject: [PATCH 4/5] Fix test for Windows os --- .../ballerina/openapi/cmd/OpenAPICmdTest.java | 58 ++++++++++--------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java b/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java index a179e8bf6..94eb21fce 100644 --- a/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java +++ b/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java @@ -663,16 +663,18 @@ public void testForComplexPathInService() { OpenApiCmd cmd = new OpenApiCmd(standardOut, tmpDir, false); new CommandLine(cmd).parseArgs(args); cmd.execute(); - Assert.assertTrue(outputStream.toString().contains("service generation can not be done due to the given" + - " openapi definition contains following complex path(s):\n" + - "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\n" + - "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom\n" + - "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo\n" + + String expectedOutput = "service generation can not be done due to the given" + + " openapi definition contains following complex path(s):" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo" + System.lineSeparator() + "/payroll/v1/workers/{associateoid}/organizational-pay-statements/{payStatementId}/images/" + - "{imageId}.{imageExtension}\n" + + "{imageId}.{imageExtension}" + System.lineSeparator() + "/v3/ClientGroups/GetClientGroupByUserDefinedIdentifier(UserDefinedIdentifier=" + - "'{userDefinedIdentifier}')\n" + - "/companies({company_id})/items({item_id})")); + "'{userDefinedIdentifier}')" + System.lineSeparator() + + "/companies({company_id})/items({item_id})"; + + Assert.assertTrue(outputStream.toString().contains(expectedOutput)); } @Test(description = "service type generation for the parameterized path in OAS") @@ -684,14 +686,14 @@ public void testForComplexPathInServiceType() { new CommandLine(cmd).parseArgs(args); cmd.execute(); Assert.assertTrue(outputStream.toString().contains("service generation can not be done due to the " + - "given openapi definition contains following complex path(s):\n" + - "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\n" + - "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom\n" + - "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo\n" + + "given openapi definition contains following complex path(s):" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo" + System.lineSeparator() + "/payroll/v1/workers/{associateoid}/organizational-pay-statements/{payStatementId}/images/" + - "{imageId}.{imageExtension}\n" + + "{imageId}.{imageExtension}" + System.lineSeparator() + "/v3/ClientGroups/GetClientGroupByUserDefinedIdentifier(UserDefinedIdentifier='" + - "{userDefinedIdentifier}')\n" + + "{userDefinedIdentifier}')" + System.lineSeparator() + "/companies({company_id})/items({item_id})")); } @@ -703,15 +705,15 @@ public void testForComplexPathInClient() { new CommandLine(cmd).parseArgs(args); cmd.execute(); Assert.assertTrue(outputStream.toString().contains("remote function(s) will be generated for client " + - "due to the given openapi definition contains following complex path(s):\n" + - "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\n" + - "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom\n" + - "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo\n" + + "due to the given openapi definition contains following complex path(s):" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo" + System.lineSeparator() + "/payroll/v1/workers/{associateoid}/organizational-pay-statements/{payStatementId}/images/" + - "{imageId}.{imageExtension}\n" + + "{imageId}.{imageExtension}" + System.lineSeparator() + "/v3/ClientGroups/GetClientGroupByUserDefinedIdentifier(UserDefinedIdentifier=" + - "'{userDefinedIdentifier}')\n" + - "/companies({company_id})/items({item_id})\n" + + "'{userDefinedIdentifier}')" + System.lineSeparator() + + "/companies({company_id})/items({item_id})" + System.lineSeparator() + "Client generated successfully.")); } @@ -724,15 +726,15 @@ public void testForComplexPathInBothClientAndService() { cmd.execute(); Assert.assertTrue(outputStream.toString().contains("remote function(s) will be generated for client" + " and the service generation can not be proceed due to the given openapi definition contains" + - " following complex path(s):\n" + - "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo\n" + - "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom\n" + - "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo\n" + + " following complex path(s):" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom" + System.lineSeparator() + + "/v4/spreadsheets/{spreadsheetId}.{sheetId}/sheets/{sheetId}:copyTo" + System.lineSeparator() + "/payroll/v1/workers/{associateoid}/organizational-pay-statements/{payStatementId}/images/" + - "{imageId}.{imageExtension}\n" + + "{imageId}.{imageExtension}" + System.lineSeparator() + "/v3/ClientGroups/GetClientGroupByUserDefinedIdentifier(UserDefinedIdentifier=" + - "'{userDefinedIdentifier}')\n" + - "/companies({company_id})/items({item_id})\n" + + "'{userDefinedIdentifier}')" + System.lineSeparator() + + "/companies({company_id})/items({item_id})" + System.lineSeparator() + "Following files were created.")); } From b42865ece2817853629f9c017dbca12063a74b12 Mon Sep 17 00:00:00 2001 From: lnash94 Date: Wed, 28 Feb 2024 21:00:19 +0530 Subject: [PATCH 5/5] Fix review suggestions --- .../io/ballerina/openapi/cmd/BallerinaCodeGenerator.java | 9 +++++---- .../java/io/ballerina/openapi/cmd/OpenAPICmdTest.java | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java b/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java index 361200e9c..36f361c12 100644 --- a/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java +++ b/openapi-cli/src/main/java/io/ballerina/openapi/cmd/BallerinaCodeGenerator.java @@ -111,8 +111,9 @@ public void generateClientAndService(String definitionPath, String serviceName, List complexPaths = GeneratorUtils.getComplexPaths(openAPIDef); if (!complexPaths.isEmpty()) { isResource = false; - outStream.println("remote function(s) will be generated for client and the service generation can not be " + - "proceed due to the given openapi definition contains following complex path(s):"); + outStream.println("WARNING: remote function(s) will be generated for client and the service" + + " generation can not be proceed due to the given openapi definition contains following" + + " complex path(s):"); for (String path: complexPaths) { outStream.println(path); } @@ -360,8 +361,8 @@ private List generateClientFiles(Path openAPI, Filter filter, boolea // Validate the service generation List complexPaths = GeneratorUtils.getComplexPaths(openAPIDef); if (!complexPaths.isEmpty()) { - outStream.println("remote function(s) will be generated for client due to the given openapi definition" + - " contains following complex path(s):"); + outStream.println("WARNING: remote function(s) will be generated for client due to the given openapi " + + "definition contains following complex path(s):"); for (String path: complexPaths) { outStream.println(path); } diff --git a/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java b/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java index 94eb21fce..98a5ed278 100644 --- a/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java +++ b/openapi-cli/src/test/java/io/ballerina/openapi/cmd/OpenAPICmdTest.java @@ -704,7 +704,7 @@ public void testForComplexPathInClient() { OpenApiCmd cmd = new OpenApiCmd(standardOut, tmpDir, false); new CommandLine(cmd).parseArgs(args); cmd.execute(); - Assert.assertTrue(outputStream.toString().contains("remote function(s) will be generated for client " + + Assert.assertTrue(outputStream.toString().contains("WARNING: remote function(s) will be generated for client " + "due to the given openapi definition contains following complex path(s):" + System.lineSeparator() + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo" + System.lineSeparator() + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyFrom" + System.lineSeparator() + @@ -724,7 +724,7 @@ public void testForComplexPathInBothClientAndService() { OpenApiCmd cmd = new OpenApiCmd(standardOut, tmpDir, false); new CommandLine(cmd).parseArgs(args); cmd.execute(); - Assert.assertTrue(outputStream.toString().contains("remote function(s) will be generated for client" + + Assert.assertTrue(outputStream.toString().contains("WARNING: remote function(s) will be generated for client" + " and the service generation can not be proceed due to the given openapi definition contains" + " following complex path(s):" + System.lineSeparator() + "/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo" + System.lineSeparator() +