diff --git a/.prettierrc b/.prettierrc index f6c871e4c90..418a4579dd9 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,11 +1,17 @@ { "trailingComma": "es5", "singleQuote": true, - "overrides" : [ + "overrides": [ { "files": "*.php", "options": { - "tabWidth": 4 + "tabWidth": 4 + } + }, + { + "files": "*.java", + "options": { + "printWidth": 140 } } ] diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java index 7f5d6736b82..d7f0827c3f8 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java @@ -1,5 +1,6 @@ package com.algolia.codegen; +import com.algolia.codegen.exceptions.*; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.servers.Server; @@ -11,54 +12,60 @@ @SuppressWarnings("unchecked") public class AlgoliaJavaGenerator extends JavaClientCodegen { - /** - * Configures a friendly name for the generator. This will be used by the generator to select the - * library with the -g flag. - * - * @return the friendly name for the generator - */ @Override public String getName() { return "algolia-java"; } @Override - public CodegenOperation fromOperation( - String path, - String httpMethod, - Operation operation, - List servers - ) { - return Utils.specifyCustomRequest( - super.fromOperation(path, httpMethod, operation, servers) + public void processOpts() { + // generator specific options + setDateLibrary("java8"); + setLibrary("okhttp-gson"); + setSourceFolder("algoliasearch-core/src/main/java"); + setGroupId("com.algolia"); + additionalProperties.put("invokerPackage", "com.algolia"); + setApiPackage("com.algolia.api"); + setApiNameSuffix(Utils.API_SUFFIX); + + super.processOpts(); + + // Prevent all useless file to generate + apiTestTemplateFiles.clear(); + modelTestTemplateFiles.clear(); + apiDocTemplateFiles.clear(); + modelDocTemplateFiles.clear(); + + supportingFiles.removeIf(file -> + file.getTemplateFile().equals("build.gradle.mustache") || + file.getTemplateFile().equals("settings.gradle.mustache") || + file.getTemplateFile().equals("gitignore.mustache") || + file.getTemplateFile().equals("ApiCallback.mustache") || + file.getTemplateFile().equals("ApiResponse.mustache") || + file.getTemplateFile().equals("JSON.mustache") || + file.getTemplateFile().equals("ProgressRequestBody.mustache") || + file.getTemplateFile().equals("ProgressResponseBody.mustache") || + file.getTemplateFile().equals("Pair.mustache") ); } - /** Provides an opportunity to inspect and modify operation data before the code is generated. */ @Override - public Map postProcessOperationsWithModels( - Map objs, - List allModels - ) { - Map results = super.postProcessOperationsWithModels( - objs, - allModels - ); + public CodegenOperation fromOperation(String path, String httpMethod, Operation operation, List servers) { + return Utils.specifyCustomRequest(super.fromOperation(path, httpMethod, operation, servers)); + } + + @Override + public Map postProcessOperationsWithModels(Map objs, List allModels) { + Map results = super.postProcessOperationsWithModels(objs, allModels); + + String kebabClient = Utils.getClientNameKebabCase(results); + additionalProperties.put("isSearchClient", kebabClient.equals("search")); try { - Utils.generateServer( - Utils.getClientNameKebabCase(results), - additionalProperties - ); - additionalProperties.put( - "isSearchClient", - Utils.getClientNameKebabCase(results).equals("search") - ); - additionalProperties.put( - "packageVersion", - Utils.getClientConfigField("java", "packageVersion") - ); - } catch (GenerationException e) { + Utils.generateServer(kebabClient, additionalProperties); + + additionalProperties.put("packageVersion", Utils.getClientConfigField("java", "packageVersion")); + } catch (GeneratorException e) { e.printStackTrace(); System.exit(1); } @@ -71,12 +78,7 @@ public Map postProcessAllModels(Map objs) { Map models = super.postProcessAllModels(objs); for (Object modelContainer : models.values()) { - CodegenModel model = - ((Map>>) modelContainer).get( - "models" - ) - .get(0) - .get("model"); + CodegenModel model = ((Map>>) modelContainer).get("models").get(0).get("model"); if (!model.oneOf.isEmpty()) { List> oneOfList = new ArrayList(); @@ -84,10 +86,7 @@ public Map postProcessAllModels(Map objs) { HashMap oneOfModel = new HashMap(); oneOfModel.put("type", iterateModel); - oneOfModel.put( - "name", - iterateModel.replace("<", "").replace(">", "") - ); + oneOfModel.put("name", iterateModel.replace("<", "").replace(">", "")); oneOfList.add(oneOfModel); } @@ -100,49 +99,6 @@ public Map postProcessAllModels(Map objs) { return models; } - /** - * Returns human-friendly help for the generator. Provide the consumer with help tips, parameters - * here - * - * @return A string value for the help message - */ - @Override - public String getHelp() { - return "Generates an algolia-java client library."; - } - - @Override - public void processOpts() { - // generator specific options - setDateLibrary("java8"); - setLibrary("okhttp-gson"); - setSourceFolder("algoliasearch-core/src/main/java"); - setGroupId("com.algolia"); - additionalProperties.put("invokerPackage", "com.algolia"); - setApiPackage("com.algolia.api"); - setApiNameSuffix(Utils.API_SUFFIX); - - super.processOpts(); - - // Prevent all useless file to generate - apiTestTemplateFiles.clear(); - modelTestTemplateFiles.clear(); - apiDocTemplateFiles.clear(); - modelDocTemplateFiles.clear(); - - supportingFiles.removeIf(file -> - file.getTemplateFile().equals("build.gradle.mustache") || - file.getTemplateFile().equals("settings.gradle.mustache") || - file.getTemplateFile().equals("gitignore.mustache") || - file.getTemplateFile().equals("ApiCallback.mustache") || - file.getTemplateFile().equals("ApiResponse.mustache") || - file.getTemplateFile().equals("JSON.mustache") || - file.getTemplateFile().equals("ProgressRequestBody.mustache") || - file.getTemplateFile().equals("ProgressResponseBody.mustache") || - file.getTemplateFile().equals("Pair.mustache") - ); - } - @Override public String toDefaultValue(Schema schema) { // Replace the {} from openapi with new Object() @@ -156,10 +112,7 @@ public String toDefaultValue(Schema schema) { public String toEnumVarName(String value, String datatype) { if ("String".equals(datatype)) { // convert camelCase77String to CAMEL_CASE_77_STRING - return value - .replaceAll("-", "_") - .replaceAll("(.+?)([A-Z]|[0-9])", "$1_$2") - .toUpperCase(Locale.ROOT); + return value.replaceAll("-", "_").replaceAll("(.+?)([A-Z]|[0-9])", "$1_$2").toUpperCase(Locale.ROOT); } return super.toEnumVarName(value, datatype); } diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaJavaScriptGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaScriptGenerator.java index 6fbe671d59a..41b211eb58d 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaJavaScriptGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaScriptGenerator.java @@ -1,5 +1,6 @@ package com.algolia.codegen; +import com.algolia.codegen.exceptions.*; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.Parameter; @@ -29,28 +30,22 @@ public void processOpts() { setApiPackage("src"); // clear all supported files to avoid unwanted ones supportingFiles.clear(); - // model - supportingFiles.add( - new SupportingFile("modelBarrel.mustache", "model", "index.ts") - ); - // builds - supportingFiles.add( - new SupportingFile("browser.mustache", "builds", "browser.ts") - ); - supportingFiles.add( - new SupportingFile("node.mustache", "builds", "node.ts") - ); + + supportingFiles.add(new SupportingFile("modelBarrel.mustache", "model", "index.ts")); + supportingFiles.add(new SupportingFile("browser.mustache", "builds", "browser.ts")); + supportingFiles.add(new SupportingFile("node.mustache", "builds", "node.ts")); + // root supportingFiles.add(new SupportingFile("index.mustache", "", "index.js")); - supportingFiles.add( - new SupportingFile("index.d.mustache", "", "index.d.ts") - ); - supportingFiles.add( - new SupportingFile("package.mustache", "", "package.json") - ); - supportingFiles.add( - new SupportingFile("tsconfig.mustache", "", "tsconfig.json") - ); + supportingFiles.add(new SupportingFile("index.d.mustache", "", "index.d.ts")); + + supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); + supportingFiles.add(new SupportingFile("tsconfig.mustache", "", "tsconfig.json")); + } + + @Override + public CodegenOperation fromOperation(String path, String httpMethod, Operation operation, List servers) { + return Utils.specifyCustomRequest(super.fromOperation(path, httpMethod, operation, servers)); } /** Set default generator options */ @@ -66,36 +61,21 @@ private void setDefaultGeneratorOptions() { /** Provides an opportunity to inspect and modify operation data before the code is generated. */ @Override - public Map postProcessOperationsWithModels( - Map objs, - List allModels - ) { - Map results = super.postProcessOperationsWithModels( - objs, - allModels - ); + public Map postProcessOperationsWithModels(Map objs, List allModels) { + Map results = super.postProcessOperationsWithModels(objs, allModels); CLIENT = Utils.getClientNameCamelCase(results); setDefaultGeneratorOptions(); try { - Utils.generateServer( - Utils.getClientNameKebabCase(results), - additionalProperties - ); - additionalProperties.put( - "utilsPackageVersion", - Utils.getClientConfigField("javascript", "utilsPackageVersion") - ); - } catch (GenerationException e) { + Utils.generateServer(Utils.getClientNameKebabCase(results), additionalProperties); + additionalProperties.put("utilsPackageVersion", Utils.getClientConfigField("javascript", "utilsPackageVersion")); + } catch (GeneratorException e) { e.printStackTrace(); System.exit(1); } - List operations = - ((Map>) results.get("operations")).get( - "operation" - ); + List operations = ((Map>) results.get("operations")).get("operation"); // We read operations and detect if we should wrap parameters under an object. // We only wrap if there is a mix between body parameters and other parameters. @@ -111,9 +91,7 @@ public Map postProcessOperationsWithModels( boolean hasPathParams = !ope.pathParams.isEmpty(); // If there is nothing but body params, we just check if it's a single param - if ( - hasBodyParams && !hasHeaderParams && !hasQueryParams && !hasPathParams - ) { + if (hasBodyParams && !hasHeaderParams && !hasQueryParams && !hasPathParams) { // At this point the single parameter is already an object, to avoid double wrapping // we skip it if (ope.bodyParams.size() == 1 && !ope.bodyParams.get(0).isArray) { @@ -160,18 +138,6 @@ public String apiFilename(String templateName, String tag) { return super.apiFilename(templateName, toApiFilename(CLIENT)); } - @Override - public CodegenOperation fromOperation( - String path, - String httpMethod, - Operation operation, - List servers - ) { - return Utils.specifyCustomRequest( - super.fromOperation(path, httpMethod, operation, servers) - ); - } - @Override protected String getParameterDataType(Parameter parameter, Schema p) { String type = super.getParameterDataType(parameter, p); diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java index 01bc8b96f32..c697e33653b 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java @@ -1,5 +1,6 @@ package com.algolia.codegen; +import com.algolia.codegen.exceptions.*; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.servers.Server; import java.util.List; @@ -16,15 +17,23 @@ public String getName() { } @Override - public CodegenOperation fromOperation( - String path, - String httpMethod, - Operation operation, - List servers - ) { - return Utils.specifyCustomRequest( - super.fromOperation(path, httpMethod, operation, servers) - ); + public void processOpts() { + // generator specific options + setApiNameSuffix(Utils.API_SUFFIX); + setParameterNamingConvention("camelCase"); + additionalProperties.put("invokerPackage", "Algolia\\AlgoliaSearch"); + + super.processOpts(); + + // Remove base template as we want to change its path + supportingFiles.removeIf(file -> file.getTemplateFile().equals("Configuration.mustache")); + + supportingFiles.add(new SupportingFile("Configuration.mustache", "lib/Configuration", "Configuration.php")); + } + + @Override + public CodegenOperation fromOperation(String path, String httpMethod, Operation operation, List servers) { + return Utils.specifyCustomRequest(super.fromOperation(path, httpMethod, operation, servers)); } /** Set default generator options */ @@ -33,33 +42,21 @@ public void setDefaultGeneratorOptions(String client) { additionalProperties.put("useCache", true); } - additionalProperties.put( - "configClassname", - Utils.createClientName(client, "php") + "Config" - ); + additionalProperties.put("configClassname", Utils.createClientName(client, "php") + "Config"); } /** Provides an opportunity to inspect and modify operation data before the code is generated. */ @Override - public Map postProcessOperationsWithModels( - Map objs, - List allModels - ) { - Map results = super.postProcessOperationsWithModels( - objs, - allModels - ); + public Map postProcessOperationsWithModels(Map objs, List allModels) { + Map results = super.postProcessOperationsWithModels(objs, allModels); String client = Utils.getClientNameKebabCase(results); setDefaultGeneratorOptions(client); try { Utils.generateServer(client, additionalProperties); - additionalProperties.put( - "packageVersion", - Utils.getClientConfigField("php", "packageVersion") - ); - } catch (GenerationException e) { + additionalProperties.put("packageVersion", Utils.getClientConfigField("php", "packageVersion")); + } catch (GeneratorException e) { e.printStackTrace(); System.exit(1); } @@ -67,29 +64,6 @@ public Map postProcessOperationsWithModels( return results; } - @Override - public void processOpts() { - // generator specific options - setApiNameSuffix(Utils.API_SUFFIX); - setParameterNamingConvention("camelCase"); - additionalProperties.put("invokerPackage", "Algolia\\AlgoliaSearch"); - - super.processOpts(); - - // Remove base template as we want to change its path - supportingFiles.removeIf(file -> - file.getTemplateFile().equals("Configuration.mustache") - ); - - supportingFiles.add( - new SupportingFile( - "Configuration.mustache", - "lib/Configuration", - "Configuration.php" - ) - ); - } - public String getComposerPackageName() { return "algolia/algoliasearch-client-php"; } diff --git a/generators/src/main/java/com/algolia/codegen/GenerationException.java b/generators/src/main/java/com/algolia/codegen/GenerationException.java deleted file mode 100644 index 1bd79d2a940..00000000000 --- a/generators/src/main/java/com/algolia/codegen/GenerationException.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.algolia.codegen; - -public class GenerationException extends Exception { - - public GenerationException(String message) { - super(message); - } - - public GenerationException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/generators/src/main/java/com/algolia/codegen/Utils.java b/generators/src/main/java/com/algolia/codegen/Utils.java index 04edbb4320b..ec22ae308fd 100644 --- a/generators/src/main/java/com/algolia/codegen/Utils.java +++ b/generators/src/main/java/com/algolia/codegen/Utils.java @@ -1,5 +1,6 @@ package com.algolia.codegen; +import com.algolia.codegen.exceptions.*; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Sets; import io.swagger.v3.core.util.Json; @@ -16,12 +17,11 @@ public class Utils { /** The suffix of our client names. */ public static final String API_SUFFIX = "Client"; - public static final Set CUSTOM_METHOD = Sets.newHashSet( - "del", - "get", - "post", - "put" - ); + public static final Set CUSTOM_METHOD = Sets.newHashSet("del", "get", "post", "put"); + + private static JsonNode cacheConfig; + + private Utils() {} public static String capitalize(String str) { return str.substring(0, 1).toUpperCase() + str.substring(1); @@ -58,33 +58,20 @@ public static String createClientName(String client, String language) { } public static String getClientNameKebabCase(Map data) { - String client = (String) ((Map) data.get("operations")).get( - "pathPrefix" - ); - return client - .replaceAll("(.+?)([A-Z]|[0-9])", "$1-$2") - .toLowerCase(Locale.ROOT); + String client = (String) ((Map) data.get("operations")).get("pathPrefix"); + return client.replaceAll("(.+?)([A-Z]|[0-9])", "$1-$2").toLowerCase(Locale.ROOT); } public static String getClientNameCamelCase(Map data) { - return (String) ((Map) data.get("operations")).get( - "pathPrefix" - ); + return (String) ((Map) data.get("operations")).get("pathPrefix"); } /** Inject server info into the client to generate the right URL */ - public static void generateServer( - String clientKebab, - Map additionalProperties - ) throws GenerationException { + public static void generateServer(String clientKebab, Map additionalProperties) throws ConfigException { Yaml yaml = new Yaml(); try { - Map spec = yaml.load( - new FileInputStream("specs/bundled/" + clientKebab + ".yml") - ); - List> servers = (List>) spec.get( - "servers" - ); + Map spec = yaml.load(new FileInputStream("specs/bundled/" + clientKebab + ".yml")); + List> servers = (List>) spec.get("servers"); boolean hasRegionalHost = false; boolean fallbackToAliasHost = false; @@ -93,9 +80,7 @@ public static void generateServer( Set allowedRegions = new HashSet<>(); for (Map server : servers) { if (!server.containsKey("url")) { - throw new GenerationException( - "Invalid server, does not contains 'url'" - ); + throw new ConfigException("Invalid server, does not contains 'url'"); } // Determine if the current URL with `region` also have an alias without @@ -117,19 +102,12 @@ public static void generateServer( continue; } - Map> variables = (Map>) server.get( - "variables" - ); + Map> variables = (Map>) server.get("variables"); - if ( - !variables.containsKey("region") || - !variables.get("region").containsKey("enum") - ) { + if (!variables.containsKey("region") || !variables.get("region").containsKey("enum")) { continue; } - ArrayList regions = (ArrayList) variables - .get("region") - .get("enum"); + ArrayList regions = (ArrayList) variables.get("region").get("enum"); hasRegionalHost = true; for (String region : regions) { @@ -144,46 +122,38 @@ public static void generateServer( additionalProperties.put("hasRegionalHost", hasRegionalHost); additionalProperties.put("fallbackToAliasHost", fallbackToAliasHost); additionalProperties.put("host", host); - additionalProperties.put( - "allowedRegions", - allowedRegions.toArray(new String[0]) - ); + additionalProperties.put("allowedRegions", allowedRegions.toArray(new String[0])); } catch (Exception e) { - throw new GenerationException("Couldn't generate servers", e); + throw new ConfigException("Couldn't generate servers", e); } } /** Get the `field` value in the `config/clients.config.json` file for the given language */ - public static String getClientConfigField(String language, String field) - throws GenerationException { - if (language.equals("javascript") && field.equals("packageVersion")) { - throw new GenerationException( - "Cannot read 'packageVersion' with language=\"javascript\", " + - "read configs/openapitools.json instead" - ); + public static String getClientConfigField(String language, String... fields) throws ConfigException { + if (fields.length == 0) { + throw new ConfigException("getClientConfigField requires at least one field"); } - - try { - JsonNode config = Json - .mapper() - .readTree(new File("config/clients.config.json")); - return config.get(language).get(field).asText(); - } catch (IOException e) { - throw new GenerationException( - "Couldn't read packageVersion from clients.config.json", - e - ); + if (language.equals("javascript") && fields[0].equals("packageVersion")) { + throw new ConfigException("Cannot read 'packageVersion' with language=\"javascript\", " + "read configs/openapitools.json instead"); + } + if (cacheConfig == null) { + cacheConfig = readJsonFile("config/clients.config.json"); + } + JsonNode value = cacheConfig.get(language); + for (String field : fields) { + value = value.get(field); + } + if (!value.isTextual()) { + throw new ConfigException(fields[fields.length - 1] + " is not a string"); } + return value.asText(); } - public static JsonNode readJsonFile(String filePath) { - JsonNode json = null; + public static JsonNode readJsonFile(String filePath) throws ConfigException { try { - json = Json.mapper().readTree(new File(filePath)); + return Json.mapper().readTree(new File(filePath)); } catch (IOException e) { - e.printStackTrace(); - System.exit(1); + throw new ConfigException("Cannot read json file " + filePath, e); } - return json; } } diff --git a/generators/src/main/java/com/algolia/codegen/cts/AlgoliaCtsGenerator.java b/generators/src/main/java/com/algolia/codegen/cts/AlgoliaCtsGenerator.java index 7d86eede2fa..ba3410da076 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/AlgoliaCtsGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/cts/AlgoliaCtsGenerator.java @@ -3,10 +3,9 @@ import com.algolia.codegen.Utils; import com.algolia.codegen.cts.manager.CtsManager; import com.algolia.codegen.cts.manager.CtsManagerFactory; +import com.algolia.codegen.exceptions.*; import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.ImmutableMap.Builder; import com.samskivert.mustache.Mustache.Lambda; import io.swagger.v3.core.util.Json; @@ -27,39 +26,16 @@ public class AlgoliaCtsGenerator extends DefaultCodegen { private String packageName; private CtsManager ctsManager; - /** - * Configures the type of generator. - * - * @return the CodegenType for this generator - * @see org.openapitools.codegen.CodegenType - */ @Override public CodegenType getTag() { return CodegenType.OTHER; } - /** - * Configures a friendly name for the generator. This will be used by the generator to select the - * library with the -g flag. - * - * @return the friendly name for the generator - */ @Override public String getName() { return "algolia-cts"; } - /** - * Returns human-friendly help for the generator. Provide the consumer with help tips, parameters - * here - * - * @return A string value for the help message - */ - @Override - public String getHelp() { - return "Generates the CTS"; - } - @Override public void processOpts() { super.processOpts(); @@ -69,30 +45,13 @@ public void processOpts() { packageName = (String) additionalProperties.get("packageName"); ctsManager = CtsManagerFactory.getManager(language); - JsonNode config = Utils.readJsonFile("config/clients.config.json"); - TestConfig testConfig = null; - try { - testConfig = - Json - .mapper() - .treeToValue(config.get(language).get("tests"), TestConfig.class); - } catch (JsonProcessingException e) { - e.printStackTrace(); - System.exit(1); - } + String outputFolder = Utils.getClientConfigField(language, "tests", "outputFolder"); + String extension = Utils.getClientConfigField(language, "tests", "extension"); setTemplateDir("tests/CTS/methods/requests/templates/" + language); setOutputDir("tests/output/" + language); - String clientName = language.equals("php") - ? Utils.createClientName(client, language) - : client; - supportingFiles.add( - new SupportingFile( - "requests.mustache", - testConfig.outputFolder + "/methods/requests", - clientName + testConfig.extension - ) - ); + String clientName = language.equals("php") ? Utils.createClientName(client, language) : client; + supportingFiles.add(new SupportingFile("requests.mustache", outputFolder + "/methods/requests", clientName + extension)); ctsManager.addSupportingFiles(supportingFiles); } @@ -101,13 +60,9 @@ public void processOpts() { public Map postProcessAllModels(Map objs) { Map mod = super.postProcessAllModels(objs); for (Entry entry : mod.entrySet()) { - List innerModel = - ((Map>) entry.getValue()).get("models"); + List innerModel = ((Map>) entry.getValue()).get("models"); if (!innerModel.isEmpty()) { - models.put( - entry.getKey(), - (CodegenModel) ((Map) innerModel.get(0)).get("model") - ); + models.put(entry.getKey(), (CodegenModel) ((Map) innerModel.get(0)).get("model")); } } return mod; @@ -122,32 +77,24 @@ protected Builder addMustacheLambdas() { } @Override - public Map postProcessSupportingFileData( - Map objs - ) { + public Map postProcessSupportingFileData(Map objs) { Map cts = null; try { cts = loadCTS(); Map operations = buildOperations(objs); - // The return value of this function is not used, we need to modify the param - // itself. + // The return value of this function is not used, we need to modify the param itself. Object lambda = objs.get("lambda"); List servers = (List) objs.get("servers"); boolean hasRegionalHost = servers .stream() - .anyMatch(server -> - server.variables - .stream() - .anyMatch(variable -> variable.name.equals("region")) - ); + .anyMatch(server -> server.variables.stream().anyMatch(variable -> variable.name.equals("region"))); Map bundle = objs; bundle.clear(); - // We can put whatever we want in the bundle, and it will be accessible in the - // template + // We can put whatever we want in the bundle, and it will be accessible in the template bundle.put("client", Utils.createClientName(client, language) + "Client"); bundle.put("clientPrefix", Utils.createClientName(client, language)); bundle.put("import", createImportName()); @@ -157,28 +104,18 @@ public Map postProcessSupportingFileData( ctsManager.addDataToBundle(bundle); List blocks = new ArrayList<>(); - ParametersWithDataType paramsType = new ParametersWithDataType( - models, - language - ); + ParametersWithDataType paramsType = new ParametersWithDataType(models, language); for (Entry entry : operations.entrySet()) { String operationId = entry.getKey(); if (!cts.containsKey(operationId)) { - throw new CTSException( - "operationId " + operationId + " does not exist in the spec" - ); + throw new CTSException("operationId " + operationId + " does not exist in the spec"); } Request[] op = cts.get(operationId); List tests = new ArrayList<>(); for (int i = 0; i < op.length; i++) { - Map test = paramsType.buildJSONForRequest( - operationId, - op[i], - entry.getValue(), - i - ); + Map test = paramsType.buildJSONForRequest(operationId, op[i], entry.getValue(), i); tests.add(test); } Map testObj = new HashMap<>(); @@ -190,8 +127,8 @@ public Map postProcessSupportingFileData( return bundle; } catch (CTSException e) { - System.out.println(e.getMessage()); if (e.isSkipable()) { + System.out.println(e.getMessage()); System.exit(0); } e.printStackTrace(); @@ -203,17 +140,13 @@ public Map postProcessSupportingFileData( return null; } - private Map loadCTS() - throws JsonParseException, JsonMappingException, IOException, CTSException { + private Map loadCTS() throws JsonParseException, JsonMappingException, IOException, CTSException { TreeMap cts = new TreeMap<>(); String clientName = client; - // This special case allow us to read the `search` CTS to generated the - // tests for the `algoliasearch-lite` client, which is only available - // in JavaScript - if ( - language.equals("javascript") && clientName.equals("algoliasearch-lite") - ) { + // This special case allow us to read the `search` CTS to generated the tests for the + // `algoliasearch-lite` client, which is only available in JavaScript + if (language.equals("javascript") && clientName.equals("algoliasearch-lite")) { clientName = "search"; } @@ -223,35 +156,21 @@ private Map loadCTS() throw new CTSException("CTS not found at " + dir.getAbsolutePath(), true); } if (!commonTestDir.exists()) { - throw new CTSException( - "CTS not found at " + commonTestDir.getAbsolutePath(), - true - ); + throw new CTSException("CTS not found at " + commonTestDir.getAbsolutePath(), true); } for (File f : dir.listFiles()) { - cts.put( - f.getName().replace(".json", ""), - Json.mapper().readValue(f, Request[].class) - ); + cts.put(f.getName().replace(".json", ""), Json.mapper().readValue(f, Request[].class)); } for (File f : commonTestDir.listFiles()) { - cts.put( - f.getName().replace(".json", ""), - Json.mapper().readValue(f, Request[].class) - ); + cts.put(f.getName().replace(".json", ""), Json.mapper().readValue(f, Request[].class)); } return cts; } // operationId -> CodegenOperation - private TreeMap buildOperations( - Map objs - ) { + private TreeMap buildOperations(Map objs) { HashMap result = new HashMap<>(); - List> apis = - ((Map>>) objs.get("apiInfo")).get( - "apis" - ); + List> apis = ((Map>>) objs.get("apiInfo")).get("apis"); for (Map api : apis) { String apiName = ((String) api.get("baseName")).toLowerCase(); @@ -259,10 +178,7 @@ private TreeMap buildOperations( continue; } - List operations = - ((Map>) api.get("operations")).get( - "operation" - ); + List operations = ((Map>) api.get("operations")).get("operation"); for (CodegenOperation ope : operations) { result.put(ope.operationId, ope); @@ -286,24 +202,11 @@ private String createImportName() { return name; } - /** - * override with any special text escaping logic to handle unsafe characters so as to avoid code - * injection - * - * @param input String to be cleaned up - * @return string with unsafe characters removed or escaped - */ @Override public String escapeUnsafeCharacters(String input) { return input; } - /** - * Escape single and/or double quote to avoid code injection - * - * @param input String to be cleaned up - * @return string with quotation mark removed or escaped - */ public String escapeQuotationMark(String input) { return input.replace("\"", "\\\""); } diff --git a/generators/src/main/java/com/algolia/codegen/cts/EscapeQuotesLambda.java b/generators/src/main/java/com/algolia/codegen/cts/EscapeQuotesLambda.java index 525ad93e5d4..f5da0e05cd4 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/EscapeQuotesLambda.java +++ b/generators/src/main/java/com/algolia/codegen/cts/EscapeQuotesLambda.java @@ -8,8 +8,7 @@ public class EscapeQuotesLambda implements Mustache.Lambda { @Override - public void execute(Template.Fragment fragment, Writer writer) - throws IOException { + public void execute(Template.Fragment fragment, Writer writer) throws IOException { String text = fragment.execute(); writer.write(text.replace("\"", "\\\"")); } diff --git a/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java b/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java index 960faf3d6b9..cd0d2bd0e34 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java +++ b/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java @@ -1,6 +1,7 @@ package com.algolia.codegen.cts; import com.algolia.codegen.Utils; +import com.algolia.codegen.exceptions.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import io.swagger.util.Json; @@ -20,20 +21,13 @@ public class ParametersWithDataType { private final Map models; private final String language; - public ParametersWithDataType( - Map models, - String language - ) { + public ParametersWithDataType(Map models, String language) { this.models = models; this.language = language; } - public Map buildJSONForRequest( - String operationId, - Request req, - CodegenOperation ope, - int testIndex - ) throws CTSException, JsonMappingException, JsonProcessingException { + public Map buildJSONForRequest(String operationId, Request req, CodegenOperation ope, int testIndex) + throws CTSException, JsonMappingException, JsonProcessingException { Map test = new HashMap<>(); test.put("method", operationId); test.put("testName", req.testName == null ? operationId : req.testName); @@ -43,26 +37,13 @@ public Map buildJSONForRequest( if (req.requestOptions != null) { test.put("hasRequestOptions", true); - test.put( - "requestOptions", - Json.mapper().writeValueAsString(req.requestOptions) - ); + test.put("requestOptions", Json.mapper().writeValueAsString(req.requestOptions)); Map requestOptions = new HashMap<>(); if (req.requestOptions.queryParameters != null) { CodegenParameter objSpec = new CodegenParameter(); - objSpec.dataType = - inferDataType(req.requestOptions.queryParameters, objSpec, null); - requestOptions.put( - "queryParameters", - traverseParams( - "queryParameters", - req.requestOptions.queryParameters, - objSpec, - "", - 0 - ) - ); + objSpec.dataType = inferDataType(req.requestOptions.queryParameters, objSpec, null); + requestOptions.put("queryParameters", traverseParams("queryParameters", req.requestOptions.queryParameters, objSpec, "", 0)); } if (req.requestOptions.headers != null) { @@ -92,20 +73,8 @@ public Map buildJSONForRequest( List parametersWithDataType = new ArrayList<>(); // special case if there is only bodyParam which is not an array - if ( - ope.allParams.size() == 1 && - ope.bodyParams.size() == 1 && - !ope.bodyParam.isArray - ) { - parametersWithDataType.add( - traverseParams( - ope.bodyParam.paramName, - req.parameters, - ope.bodyParam, - "", - 0 - ) - ); + if (ope.allParams.size() == 1 && ope.bodyParams.size() == 1 && !ope.bodyParam.isArray) { + parametersWithDataType.add(traverseParams(ope.bodyParam.paramName, req.parameters, ope.bodyParam, "", 0)); } else { for (Entry param : req.parameters.entrySet()) { CodegenParameter specParam = null; @@ -116,13 +85,9 @@ public Map buildJSONForRequest( } } if (specParam == null) { - throw new CTSException( - "Parameter " + param.getKey() + " not found in the root parameter" - ); + throw new CTSException("Parameter " + param.getKey() + " not found in the root parameter"); } - parametersWithDataType.add( - traverseParams(param.getKey(), param.getValue(), specParam, "", 0) - ); + parametersWithDataType.add(traverseParams(param.getKey(), param.getValue(), specParam, "", 0)); } } @@ -139,18 +104,14 @@ private Map traverseParams( ) throws CTSException { String baseType = getTypeName(spec); if (baseType == null) { - throw new CTSException( - "Cannot determine type of " + paramName + " (value: " + param + ")" - ); + throw new CTSException("Cannot determine type of " + paramName + " (value: " + param + ")"); } boolean isCodegenModel = spec instanceof CodegenModel; if (!isCodegenModel) { - // don't overwrite it if it's already a model - // sometimes it's in lowercase for some reason - String lowerBaseType = - baseType.substring(0, 1).toLowerCase() + baseType.substring(1); + // don't overwrite it if it's already a model sometimes it's in lowercase for some reason + String lowerBaseType = baseType.substring(0, 1).toLowerCase() + baseType.substring(1); if (models.containsKey(baseType)) { // get the real model if possible spec = models.get(baseType); @@ -197,8 +158,8 @@ private Map traverseParams( private Map createDefaultOutput() { Map testOutput = new HashMap<>(); - // we need to set all types to false otherwise mustache will read the one from - // the parent context and run into a infinite loop + // we need to set all types to false otherwise mustache will read the one from the parent + // context and run into a infinite loop testOutput.put("isObject", false); testOutput.put("isArray", false); testOutput.put("isFreeFormObject", false); @@ -226,15 +187,7 @@ private void handleArray( List values = new ArrayList<>(); for (int i = 0; i < items.size(); i++) { - values.add( - traverseParams( - paramName + "_" + i, - items.get(i), - spec.getItems(), - paramName, - suffix + 1 - ) - ); + values.add(traverseParams(paramName + "_" + i, items.get(i), spec.getItems(), paramName, suffix + 1)); } testOutput.put("isArray", true); @@ -256,8 +209,7 @@ private void handleModel( int suffix ) throws CTSException { if (!spec.getHasVars()) { - // In this case we might have a complex `allOf`, we will first check - // if it exists + // In this case we might have a complex `allOf`, we will first check if it exists CodegenComposedSchemas composedSchemas = spec.getComposedSchemas(); if (composedSchemas != null) { @@ -269,8 +221,7 @@ private void handleModel( return; } } - // We only throw if there is no `composedSchemas`, because `oneOf` can also - // be handled below + // We only throw if there is no `composedSchemas`, because `oneOf` can also be handled below else { throw new CTSException("Spec has no vars."); } @@ -280,16 +231,12 @@ private void handleModel( throw new CTSException("Spec has items."); } - if ( - spec instanceof CodegenModel && ((CodegenModel) spec).oneOf.size() > 0 - ) { + if (spec instanceof CodegenModel && ((CodegenModel) spec).oneOf.size() > 0) { // find a discriminator to handle oneOf CodegenModel model = (CodegenModel) spec; IJsonSchemaValidationProperties match = findMatchingOneOf(param, model); testOutput.clear(); - testOutput.putAll( - traverseParams(paramName, param, match, parent, suffix) - ); + testOutput.putAll(traverseParams(paramName, param, match, parent, suffix)); HashMap oneOfModel = new HashMap<>(); String typeName = getTypeName(match).replace("<", "").replace(">", ""); @@ -324,24 +271,11 @@ private void handleModel( } if (varSpec == null) { throw new CTSException( - "Parameter " + - entry.getKey() + - " not found in " + - paramName + - ". You might have a type conflict in the spec for " + - baseType + "Parameter " + entry.getKey() + " not found in " + paramName + ". You might have a type conflict in the spec for " + baseType ); } - values.add( - traverseParams( - entry.getKey(), - entry.getValue(), - varSpec, - paramName, - suffix + 1 - ) - ); + values.add(traverseParams(entry.getKey(), entry.getValue(), varSpec, paramName, suffix + 1)); } testOutput.put("isObject", true); testOutput.put("value", values); @@ -368,15 +302,7 @@ private void handleObject( for (Entry entry : vars.entrySet()) { CodegenParameter objSpec = new CodegenParameter(); objSpec.dataType = inferDataType(entry.getValue(), objSpec, null); - values.add( - traverseParams( - entry.getKey(), - entry.getValue(), - objSpec, - paramName, - suffix + 1 - ) - ); + values.add(traverseParams(entry.getKey(), entry.getValue(), objSpec, paramName, suffix + 1)); } // sometimes it's really just an object if (testOutput.get("objectName").equals("Object")) { @@ -387,13 +313,8 @@ private void handleObject( testOutput.put("value", values); } - private void handleMap( - String paramName, - Object param, - Map testOutput, - IJsonSchemaValidationProperties spec, - int suffix - ) throws CTSException { + private void handleMap(String paramName, Object param, Map testOutput, IJsonSchemaValidationProperties spec, int suffix) + throws CTSException { if (spec.getHasVars()) { throw new CTSException("Spec has vars."); } @@ -410,10 +331,7 @@ private void handleMap( // The generator consider a free form object type as an `object`, which // is wrong in our case, so we infer it to explore the right path in the traverseParams // function, but we keep the any type for the CTS. - if ( - items == null || - (items.openApiType.equals("object") && items.isFreeFormObject) - ) { + if (items == null || (items.openApiType.equals("object") && items.isFreeFormObject)) { CodegenParameter maybeMatch = new CodegenParameter(); String paramType = inferDataType(entry.getValue(), maybeMatch, null); @@ -422,33 +340,19 @@ private void handleMap( itemType = maybeMatch; } - values.add( - traverseParams( - entry.getKey(), - entry.getValue(), - itemType, - paramName, - suffix + 1 - ) - ); + values.add(traverseParams(entry.getKey(), entry.getValue(), itemType, paramName, suffix + 1)); } testOutput.put("isFreeFormObject", true); testOutput.put("value", values); } - private void handlePrimitive( - Object param, - Map testOutput, - IJsonSchemaValidationProperties spec - ) throws CTSException { + private void handlePrimitive(Object param, Map testOutput, IJsonSchemaValidationProperties spec) throws CTSException { if (isPrimitiveType(spec)) { transferPrimitiveData(spec, testOutput); } else { inferDataType(param, null, testOutput); - if ( - spec instanceof CodegenParameter && ((CodegenParameter) spec).isAnyType - ) { + if (spec instanceof CodegenParameter && ((CodegenParameter) spec).isAnyType) { testOutput.put("isAnyType", true); } } @@ -494,11 +398,7 @@ private boolean isPrimitiveType(IJsonSchemaValidationProperties param) { return false; } - private String inferDataType( - Object param, - CodegenParameter spec, - Map output - ) throws CTSException { + private String inferDataType(Object param, CodegenParameter spec, Map output) throws CTSException { switch (param.getClass().getSimpleName()) { case "String": if (spec != null) spec.setIsString(true); @@ -523,8 +423,8 @@ private String inferDataType( case "ArrayList": if (spec != null) { spec.setIsArray(true); - // This is just to find the correct path in `handlePrimitive`, - // but it's not always the real type + // This is just to find the correct path in `handlePrimitive`, but it's not always the + // real type CodegenProperty baseItems = new CodegenProperty(); baseItems.dataType = "String"; spec.setItems(baseItems); @@ -536,16 +436,11 @@ private String inferDataType( if (output != null) output.put("isFreeFormObject", true); return "Object"; default: - throw new CTSException( - "Unknown type: " + param.getClass().getSimpleName() - ); + throw new CTSException("Unknown type: " + param.getClass().getSimpleName()); } } - private void transferPrimitiveData( - IJsonSchemaValidationProperties spec, - Map output - ) throws CTSException { + private void transferPrimitiveData(IJsonSchemaValidationProperties spec, Map output) throws CTSException { switch (getTypeName(spec)) { case "String": output.put("isString", true); @@ -567,10 +462,7 @@ private void transferPrimitiveData( } } - private IJsonSchemaValidationProperties findMatchingOneOf( - Object param, - CodegenModel model - ) throws CTSException { + private IJsonSchemaValidationProperties findMatchingOneOf(Object param, CodegenModel model) throws CTSException { if (param instanceof Map) { // for object, check which has the most of property in common int maxCount = 0; @@ -597,7 +489,6 @@ private IJsonSchemaValidationProperties findMatchingOneOf( return bestOneOf; } if (param instanceof List) { - // NICE ---> no idea for list <--- NICE CodegenComposedSchemas composedSchemas = model.getComposedSchemas(); if (composedSchemas != null) { diff --git a/generators/src/main/java/com/algolia/codegen/cts/Request.java b/generators/src/main/java/com/algolia/codegen/cts/Request.java index 76a5f7e9b35..f44bcd4d6d1 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/Request.java +++ b/generators/src/main/java/com/algolia/codegen/cts/Request.java @@ -78,8 +78,7 @@ public String toString() { class RawDeserializer extends JsonDeserializer { @Override - public String deserialize(JsonParser jp, DeserializationContext ctxt) - throws IOException, JsonProcessingException { + public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { TreeNode tree = jp.getCodec().readTree(jp); return tree.toString(); } diff --git a/generators/src/main/java/com/algolia/codegen/cts/TestConfig.java b/generators/src/main/java/com/algolia/codegen/cts/TestConfig.java deleted file mode 100644 index 23de12c884e..00000000000 --- a/generators/src/main/java/com/algolia/codegen/cts/TestConfig.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.algolia.codegen.cts; - -public class TestConfig { - - public String extension; - public String outputFolder; -} diff --git a/generators/src/main/java/com/algolia/codegen/cts/manager/CtsManager.java b/generators/src/main/java/com/algolia/codegen/cts/manager/CtsManager.java index a7bd4fb291f..73e40e57a3b 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/manager/CtsManager.java +++ b/generators/src/main/java/com/algolia/codegen/cts/manager/CtsManager.java @@ -1,77 +1,11 @@ package com.algolia.codegen.cts.manager; -import com.algolia.codegen.GenerationException; -import com.algolia.codegen.Utils; -import com.fasterxml.jackson.databind.JsonNode; +import com.algolia.codegen.exceptions.GeneratorException; import java.util.*; import org.openapitools.codegen.SupportingFile; -public abstract class CtsManager { +public interface CtsManager { + public void addSupportingFiles(List supportingFiles); - public abstract void addSupportingFiles(List supportingFiles); - - protected void addExtraToBundle(Map bundle) - throws GenerationException {} - - public void addDataToBundle(Map bundle) { - try { - this.addExtraToBundle(bundle); - } catch (GenerationException e) { - e.printStackTrace(); - System.exit(1); - } - } - - protected Object[] getFilteredPackageVersions(List packages) { - HashMap result = new HashMap<>(); - - // Read config/openapitools.js for JavaScript - JsonNode openApiToolsConfig = Utils.readJsonFile( - "config/openapitools.json" - ); - Iterator generatorIterator = openApiToolsConfig - .get("generator-cli") - .get("generators") - .elements(); - while (generatorIterator.hasNext()) { - JsonNode generator = generatorIterator.next(); - JsonNode additionalProperties = generator.get("additionalProperties"); - if (!additionalProperties.has("packageVersion")) { - continue; - } - String packageName = additionalProperties.get("packageName").asText(); - String packageVersion = additionalProperties - .get("packageVersion") - .asText(); - if (packages.contains(packageName)) { - result.put(packageName, packageVersion); - } - } - - JsonNode clientsConfig = Utils.readJsonFile("config/clients.config.json"); - Iterator clientsIterator = clientsConfig.elements(); - while (clientsIterator.hasNext()) { - JsonNode client = clientsIterator.next(); - - if (!client.has("packageVersion")) { - continue; - } - String packageName = client.get("packageName").asText(); - String packageVersion = client.get("packageVersion").asText(); - if (packages.contains(packageName)) { - result.put(packageName, packageVersion); - } - } - - return result - .entrySet() - .stream() - .map(entry -> { - Map newEntry = new HashMap<>(); - newEntry.put("packageName", entry.getKey()); - newEntry.put("packageVersion", entry.getValue()); - return newEntry; - }) - .toArray(Object[]::new); - } + public void addDataToBundle(Map bundle) throws GeneratorException; } diff --git a/generators/src/main/java/com/algolia/codegen/cts/manager/JavaCtsManager.java b/generators/src/main/java/com/algolia/codegen/cts/manager/JavaCtsManager.java index d88c73f09fe..06de67167a3 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/manager/JavaCtsManager.java +++ b/generators/src/main/java/com/algolia/codegen/cts/manager/JavaCtsManager.java @@ -1,23 +1,19 @@ package com.algolia.codegen.cts.manager; -import com.algolia.codegen.GenerationException; import com.algolia.codegen.Utils; +import com.algolia.codegen.exceptions.GeneratorException; import java.util.*; import org.openapitools.codegen.SupportingFile; -public class JavaCtsManager extends CtsManager { +public class JavaCtsManager implements CtsManager { + @Override public void addSupportingFiles(List supportingFiles) { - supportingFiles.add( - new SupportingFile("build.mustache", ".", "build.gradle") - ); + supportingFiles.add(new SupportingFile("build.mustache", ".", "build.gradle")); } - protected void addExtraToBundle(Map bundle) - throws GenerationException { - bundle.put( - "packageVersion", - Utils.getClientConfigField("java", "packageVersion") - ); + @Override + public void addDataToBundle(Map bundle) throws GeneratorException { + bundle.put("packageVersion", Utils.getClientConfigField("java", "packageVersion")); } } diff --git a/generators/src/main/java/com/algolia/codegen/cts/manager/JavaScriptCtsManager.java b/generators/src/main/java/com/algolia/codegen/cts/manager/JavaScriptCtsManager.java index 5b4c9f97199..1505ba87f43 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/manager/JavaScriptCtsManager.java +++ b/generators/src/main/java/com/algolia/codegen/cts/manager/JavaScriptCtsManager.java @@ -1,41 +1,38 @@ package com.algolia.codegen.cts.manager; -import com.algolia.codegen.GenerationException; import com.algolia.codegen.Utils; +import com.algolia.codegen.exceptions.GeneratorException; import com.fasterxml.jackson.databind.JsonNode; import java.util.*; +import java.util.Map.Entry; import org.openapitools.codegen.SupportingFile; -public class JavaScriptCtsManager extends CtsManager { +public class JavaScriptCtsManager implements CtsManager { + @Override public void addSupportingFiles(List supportingFiles) { - supportingFiles.add( - new SupportingFile("package.mustache", ".", "package.json") - ); + supportingFiles.add(new SupportingFile("package.mustache", ".", "package.json")); } - private List getPackageDependencies() { - List result = new ArrayList(); + @Override + public void addDataToBundle(Map bundle) throws GeneratorException { + bundle.put("packageDependencies", this.getPackageDependencies()); + bundle.put("utilsPackageVersion", Utils.getClientConfigField("javascript", "utilsPackageVersion")); + } - JsonNode openApiToolsConfig = Utils.readJsonFile( - "config/openapitools.json" - ); - Iterator> fieldIterator = openApiToolsConfig - .get("generator-cli") - .get("generators") - .fields(); + private List> getPackageDependencies() { + List> result = new ArrayList<>(); - while (fieldIterator.hasNext()) { - Map.Entry field = fieldIterator.next(); + JsonNode openApiToolsConfig = Utils.readJsonFile("config/openapitools.json"); + for (Entry field : (Iterable>) () -> + openApiToolsConfig.get("generator-cli").get("generators").fields()) { if (!field.getKey().startsWith("javascript-")) { continue; } JsonNode generator = field.getValue(); JsonNode additionalProperties = generator.get("additionalProperties"); String packageName = additionalProperties.get("packageName").asText(); - String packageVersion = additionalProperties - .get("packageVersion") - .asText(); + String packageVersion = additionalProperties.get("packageVersion").asText(); Map newEntry = new HashMap<>(); newEntry.put("packageName", packageName); @@ -44,13 +41,4 @@ private List getPackageDependencies() { } return result; } - - protected void addExtraToBundle(Map bundle) - throws GenerationException { - bundle.put("packageDependencies", this.getPackageDependencies()); - bundle.put( - "utilsPackageVersion", - Utils.getClientConfigField("javascript", "utilsPackageVersion") - ); - } } diff --git a/generators/src/main/java/com/algolia/codegen/cts/manager/PhpCtsManager.java b/generators/src/main/java/com/algolia/codegen/cts/manager/PhpCtsManager.java index d3c2565bb93..a0df0ec136d 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/manager/PhpCtsManager.java +++ b/generators/src/main/java/com/algolia/codegen/cts/manager/PhpCtsManager.java @@ -1,9 +1,14 @@ package com.algolia.codegen.cts.manager; +import com.algolia.codegen.exceptions.GeneratorException; import java.util.*; import org.openapitools.codegen.SupportingFile; -public class PhpCtsManager extends CtsManager { +public class PhpCtsManager implements CtsManager { + @Override public void addSupportingFiles(List supportingFiles) {} + + @Override + public void addDataToBundle(Map bundle) throws GeneratorException {} } diff --git a/generators/src/main/java/com/algolia/codegen/cts/CTSException.java b/generators/src/main/java/com/algolia/codegen/exceptions/CTSException.java similarity index 78% rename from generators/src/main/java/com/algolia/codegen/cts/CTSException.java rename to generators/src/main/java/com/algolia/codegen/exceptions/CTSException.java index ee4135f4317..6045f179d2d 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/CTSException.java +++ b/generators/src/main/java/com/algolia/codegen/exceptions/CTSException.java @@ -1,6 +1,6 @@ -package com.algolia.codegen.cts; +package com.algolia.codegen.exceptions; -public class CTSException extends Exception { +public class CTSException extends GeneratorException { private boolean skipable; diff --git a/generators/src/main/java/com/algolia/codegen/exceptions/ConfigException.java b/generators/src/main/java/com/algolia/codegen/exceptions/ConfigException.java new file mode 100644 index 00000000000..ebeb5ab03e4 --- /dev/null +++ b/generators/src/main/java/com/algolia/codegen/exceptions/ConfigException.java @@ -0,0 +1,12 @@ +package com.algolia.codegen.exceptions; + +public class ConfigException extends GeneratorException { + + public ConfigException(String message) { + super(message); + } + + public ConfigException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/generators/src/main/java/com/algolia/codegen/exceptions/GeneratorException.java b/generators/src/main/java/com/algolia/codegen/exceptions/GeneratorException.java new file mode 100644 index 00000000000..ee5779b646b --- /dev/null +++ b/generators/src/main/java/com/algolia/codegen/exceptions/GeneratorException.java @@ -0,0 +1,12 @@ +package com.algolia.codegen.exceptions; + +public class GeneratorException extends RuntimeException { + + public GeneratorException(String message) { + super(message); + } + + public GeneratorException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/tests/output/java/src/test/java/com/algolia/CallEcho.java b/tests/output/java/src/test/java/com/algolia/CallEcho.java index 14c42e91a97..28e4820dc20 100644 --- a/tests/output/java/src/test/java/com/algolia/CallEcho.java +++ b/tests/output/java/src/test/java/com/algolia/CallEcho.java @@ -85,12 +85,7 @@ public void enqueue(Callback callback) { body.queryParameters = buildQueryParameters(); body.headers = buildHeaders(request.headers()); - builder.body( - ResponseBody.create( - JSON.serialize(body), - MediaType.parse("application/json") - ) - ); + builder.body(ResponseBody.create(JSON.serialize(body), MediaType.parse("application/json"))); callback.onResponse(this, builder.build()); } catch (Exception e) { e.printStackTrace(); diff --git a/tests/output/java/src/test/java/com/algolia/EchoRequester.java b/tests/output/java/src/test/java/com/algolia/EchoRequester.java index 30f1fd9c7dc..a0e6a4c12e0 100644 --- a/tests/output/java/src/test/java/com/algolia/EchoRequester.java +++ b/tests/output/java/src/test/java/com/algolia/EchoRequester.java @@ -24,8 +24,7 @@ public CallEcho newCall(Request request) { return new CallEcho(request); } - public T handleResponse(Response response, Type returnType) - throws AlgoliaRuntimeException { + public T handleResponse(Response response, Type returnType) throws AlgoliaRuntimeException { lastResponse = response; return null; }