diff --git a/.github/workflows/gradle-pr.yml b/.github/workflows/gradle-pr.yml
index c90edfb1..84913fa3 100644
--- a/.github/workflows/gradle-pr.yml
+++ b/.github/workflows/gradle-pr.yml
@@ -16,7 +16,10 @@ jobs:
id: get-version
run: |
cd scs-multiapi-gradle-plugin
- echo "version=$(gradle properties -q | grep "version:" | awk '{print $2}')" | tee $GITHUB_OUTPUT
+ # Usar el wrapper para asegurar la versión de Gradle configurada en gradle-wrapper.properties
+ # Ejecutar con flags para salida determinista
+ version=$(./gradlew --no-daemon --console=plain properties -q | grep "version:" | awk '{print $2}')
+ echo "version=$version" | tee $GITHUB_OUTPUT
- name: Check if plugin version has been published
uses: lakuapik/gh-actions-http-status@v1
id: plugin-version-check
diff --git a/.github/workflows/maven-pr.yml b/.github/workflows/maven-pr.yml
index 08048f49..8fa70ffb 100644
--- a/.github/workflows/maven-pr.yml
+++ b/.github/workflows/maven-pr.yml
@@ -43,10 +43,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- - name: Set up JDK 17
+ - name: Set up JDK 21
uses: actions/setup-java@v2
with:
- java-version: "17"
+ java-version: "21"
distribution: "adopt"
- name: Cache Maven packages
uses: actions/cache@v4
diff --git a/multiapi-engine/pom.xml b/multiapi-engine/pom.xml
index 8da9dfab..23bec8c7 100644
--- a/multiapi-engine/pom.xml
+++ b/multiapi-engine/pom.xml
@@ -4,14 +4,14 @@
com.sngular
multiapi-engine
- 6.2.1
+ 6.3.0
jar
- 17
- 17
+ 21
+ 21
2.1.12
- 3.15.0
+ 3.17.0
2.16.1
4.4
2.17.2
@@ -69,6 +69,7 @@
org.projectlombok
lombok
${lombok.version}
+ provided
org.slf4j
@@ -209,10 +210,17 @@
maven-compiler-plugin
3.14.0
- ${maven.compiler.target}
- ${maven.compiler.target}
+
+ ${maven.compiler.target}
true
lines,vars,source
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/PluginConstants.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/PluginConstants.java
index 338794d0..5ca22c42 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/PluginConstants.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/PluginConstants.java
@@ -14,5 +14,6 @@ public class PluginConstants {
public static final String GENERATED_SOURCES_API_GENERATOR_FOLDER = "apigenerator/";
- private PluginConstants() {}
+ private PluginConstants() {
+ }
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/AsyncApiGenerator.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/AsyncApiGenerator.java
index 37b9c12a..fd3e49b5 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/AsyncApiGenerator.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/AsyncApiGenerator.java
@@ -6,6 +6,17 @@
package com.sngular.api.generator.plugin.asyncapi;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
@@ -15,33 +26,34 @@
import com.sngular.api.generator.plugin.common.files.ClasspathFileLocation;
import com.sngular.api.generator.plugin.common.files.DirectoryFileLocation;
import com.sngular.api.generator.plugin.common.files.FileLocation;
+import com.sngular.api.generator.plugin.common.tools.PathUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
-import java.io.*;
-import java.net.URI;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
@Slf4j
public class AsyncApiGenerator {
private final Integer springBootVersion;
+
private final boolean overwriteModel;
+
private final File targetFolder;
+
private final String processedGeneratedSourcesFolder;
+
private final String groupId;
+
private final File baseDir;
- public AsyncApiGenerator(final Integer springBootVersion,
- boolean overwriteModel,
- final File targetFolder,
- final String processedGeneratedSourcesFolder,
- final String groupId,
- final File baseDir) {
- log.debug("Initializing AsyncApiGenerator with Spring Boot version: {}", springBootVersion);
+ public AsyncApiGenerator(
+ final Integer springBootVersion,
+ boolean overwriteModel,
+ final File targetFolder,
+ final String processedGeneratedSourcesFolder,
+ final String groupId,
+ final File baseDir) {
+ log.debug("Initializing AsyncApiGenerator with Spring Boot version:{}", springBootVersion);
this.springBootVersion = springBootVersion;
this.overwriteModel = overwriteModel;
this.targetFolder = targetFolder;
@@ -61,10 +73,8 @@ public final void processFileSpec(final List specsListFile) {
final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
final JsonNode openApi = mapper.readTree(ymlLocation.getKey());
final String version = getAsyncApiVersion(openApi);
-
BaseAsyncApiHandler handler = AsyncApiHandlerFactory
- .getHandler(version, springBootVersion, overwriteModel, targetFolder, processedGeneratedSourcesFolder, groupId, baseDir);
-
+ .getHandler(version, springBootVersion, overwriteModel, targetFolder, processedGeneratedSourcesFolder, groupId, baseDir);
handler.processFileSpec(Collections.singletonList(specFile));
} catch (IOException e) {
log.error("Error processing spec file: {}", specFile.getFilePath(), e);
@@ -74,10 +84,8 @@ public final void processFileSpec(final List specsListFile) {
}
private static Pair resolveYmlLocation(final String ymlFilePath) throws FileNotFoundException {
- log.debug("Resolving YAML file location: {}", ymlFilePath);
-
+ log.debug("Resolving YAML file location:{}", ymlFilePath);
final InputStream classPathInput = AsyncApiGenerator.class.getClassLoader().getResourceAsStream(ymlFilePath);
-
final InputStream ymlFile;
final FileLocation ymlParentPath;
if (Objects.nonNull(classPathInput)) {
@@ -88,9 +96,13 @@ private static Pair resolveYmlLocation(final String y
log.debug("Looking for file in filesystem");
final File f = new File(ymlFilePath);
ymlFile = new FileInputStream(f);
- ymlParentPath = new DirectoryFileLocation(f.toPath().getParent());
+ // For absolute paths, use the parent directly; otherwise, resolve relative to current directory
+ if (PathUtil.isAbsolutePath(ymlFilePath)) {
+ ymlParentPath = new DirectoryFileLocation(Paths.get(ymlFilePath).getParent());
+ } else {
+ ymlParentPath = new DirectoryFileLocation(f.toPath().getParent());
+ }
}
-
return new ImmutablePair<>(ymlFile, ymlParentPath);
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/exception/InvalidAvroException.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/exception/InvalidAvroException.java
index f35e3a20..f83784df 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/exception/InvalidAvroException.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/exception/InvalidAvroException.java
@@ -7,8 +7,10 @@
package com.sngular.api.generator.plugin.asyncapi.exception;
public class InvalidAvroException extends RuntimeException {
- private static final String ERROR_MESSAGE = "AsyncApi -> Avro schema at path %s lacks a namespace.";
- public InvalidAvroException(final String enumName) {
- super(String.format(ERROR_MESSAGE, enumName));
- }
+
+ private static final String ERROR_MESSAGE = "AsyncApi -> Avro schema at path %s lacks a namespace.";
+
+ public InvalidAvroException(final String enumName) {
+ super(String.format(ERROR_MESSAGE, enumName));
+ }
}
\ No newline at end of file
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApi2Handler.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApi2Handler.java
index bb995b0e..922b4c71 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApi2Handler.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApi2Handler.java
@@ -1,8 +1,26 @@
package com.sngular.api.generator.plugin.asyncapi.handler;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.sngular.api.generator.plugin.asyncapi.exception.*;
+import com.sngular.api.generator.plugin.asyncapi.exception.ChannelNameException;
+import com.sngular.api.generator.plugin.asyncapi.exception.DuplicatedOperationException;
+import com.sngular.api.generator.plugin.asyncapi.exception.ExternalRefComponentNotFoundException;
+import com.sngular.api.generator.plugin.asyncapi.exception.FileSystemException;
+import com.sngular.api.generator.plugin.asyncapi.exception.InvalidAsyncAPIException;
+import com.sngular.api.generator.plugin.asyncapi.exception.InvalidAvroException;
import com.sngular.api.generator.plugin.asyncapi.model.ProcessBindingsResult;
import com.sngular.api.generator.plugin.asyncapi.model.ProcessMethodResult;
import com.sngular.api.generator.plugin.asyncapi.parameter.OperationParameterObject;
@@ -20,21 +38,15 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URISyntaxException;
-import java.util.*;
-import java.util.Map.Entry;
-
public class AsyncApi2Handler extends BaseAsyncApiHandler {
- public AsyncApi2Handler(final Integer springBootVersion,
- boolean overwriteModel,
- final File targetFolder,
- final String processedGeneratedSourcesFolder,
- final String groupId,
- final File baseDir) {
+ public AsyncApi2Handler(
+ final Integer springBootVersion,
+ boolean overwriteModel,
+ final File targetFolder,
+ final String processedGeneratedSourcesFolder,
+ final String groupId,
+ final File baseDir) {
super(springBootVersion, overwriteModel, targetFolder, processedGeneratedSourcesFolder, groupId, baseDir);
}
@@ -83,15 +95,15 @@ protected Map getAllSchemas(final FileLocation ymlParent, fina
ApiTool.getComponent(node, SCHEMAS).forEachRemaining(
schema -> totalSchemas.putIfAbsent(SCHEMAS.toUpperCase() + SLASH + MapperUtil.getSchemaKey(schema.getKey()), schema.getValue())
- );
+ );
ApiTool.getComponent(node, MESSAGES).forEachRemaining(
message -> getMessageSchemas(message.getKey(), message.getValue(), ymlParent, totalSchemas)
- );
+ );
getChannels(node).forEachRemaining(
channel -> getChannelSchemas(channel.getValue(), totalSchemas, ymlParent)
- );
+ );
return totalSchemas;
}
@@ -132,7 +144,8 @@ protected void processSupplierMethod(
@Override
protected void processStreamBridgeMethod(
- final String operationId, final JsonNode channel, final OperationParameterObject operationObject, final FileLocation ymlParent, final String channelName, final Map totalSchemas)
+ final String operationId, final JsonNode channel, final OperationParameterObject operationObject, final FileLocation ymlParent, final String channelName,
+ final Map totalSchemas)
throws IOException {
final ProcessMethodResult result = processMethod(operationId, channel, operationObject, ymlParent, totalSchemas);
final String regex = "[a-zA-Z0-9.\\-]*";
@@ -153,7 +166,8 @@ protected void processSubscribeMethod(
}
@Override
- protected void fillTemplateFactory(final String operationId,
+ protected void fillTemplateFactory(
+ final String operationId,
final ProcessMethodResult processedMethod, final Map totalSchemas, final OperationParameterObject operationObject)
throws IOException {
final String classFullName = processedMethod.getNamespace();
@@ -238,7 +252,7 @@ protected String processMessageRef(final JsonNode messageBody, final String mode
if (messageContent.startsWith("#")) {
namespace = processModelPackage(MapperUtil.getLongRefClass(messageBody), modelPackage);
} else if (messageContent.contains("#") || StringUtils.endsWith(messageContent, "yml")
- || StringUtils.endsWith(messageContent, "yaml") || StringUtils.endsWith(messageContent, "json")) {
+ || StringUtils.endsWith(messageContent, "yaml") || StringUtils.endsWith(messageContent, "json")) {
namespace = processExternalRef(modelPackage, ymlParent, messageBody);
} else {
namespace = processExternalAvro(ymlParent, messageContent);
@@ -261,7 +275,9 @@ protected String processExternalAvro(final FileLocation ymlParent, final String
final JsonNode fileTree = mapper.readTree(avroFile);
final JsonNode avroNamespace = fileTree.get("namespace");
- if (avroNamespace == null) throw new InvalidAvroException(avroFilePath);
+ if (avroNamespace == null) {
+ throw new InvalidAvroException(avroFilePath);
+ }
namespace = avroNamespace.asText() + PACKAGE_SEPARATOR + fileTree.get("name").asText();
} catch (final IOException e) {
@@ -292,7 +308,8 @@ protected String processExternalRef(final String modelPackage, final FileLocatio
}
@Override
- protected void processBindings(final ProcessBindingsResult.ProcessBindingsResultBuilder bindingsResult, final JsonNode message,
+ protected void processBindings(
+ final ProcessBindingsResult.ProcessBindingsResultBuilder bindingsResult, final JsonNode message,
final CommonSpecFile commonSpecFile) {
if (message.has(BINDINGS)) {
final var bindingsNode = message.get(BINDINGS);
@@ -335,6 +352,27 @@ protected String processModelPackage(final String extractedPackage, final String
return processedPackage;
}
+ @Override
+ protected JsonNode getChannelFromOperation(final JsonNode openApi, final JsonNode operation) {
+ return operation;
+ }
+
+ @Override
+ protected String getOperationId(final JsonNode channel) {
+ final JsonNode channelDefinition = getChannelDefinition(channel);
+ if (!channelDefinition.has(OPERATION_ID)) {
+ throw new InvalidAsyncAPIException("Operation ID is required");
+ }
+
+ final String operationId = channelDefinition.get(OPERATION_ID).asText();
+ if (processedOperationIds.contains(operationId)) {
+ throw new DuplicatedOperationException(operationId);
+ }
+
+ processedOperationIds.add(operationId);
+ return operationId;
+ }
+
private Iterator> getChannels(final JsonNode node) {
return ApiTool.hasNode(node, CHANNELS) ? ApiTool.getNode(node, CHANNELS).fields() : Collections.emptyIterator();
}
@@ -408,25 +446,4 @@ private JsonNode getChannelDefinition(final JsonNode channel) {
return channelDefinition;
}
-
- @Override
- protected String getOperationId(final JsonNode channel) {
- final JsonNode channelDefinition = getChannelDefinition(channel);
- if (!channelDefinition.has(OPERATION_ID)) {
- throw new InvalidAsyncAPIException("Operation ID is required");
- }
-
- final String operationId = channelDefinition.get(OPERATION_ID).asText();
- if (processedOperationIds.contains(operationId)) {
- throw new DuplicatedOperationException(operationId);
- }
-
- processedOperationIds.add(operationId);
- return operationId;
- }
-
- @Override
- protected JsonNode getChannelFromOperation(final JsonNode openApi, final JsonNode operation) {
- return operation;
- }
}
\ No newline at end of file
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApi3Handler.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApi3Handler.java
index 3203a76a..e84d2707 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApi3Handler.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApi3Handler.java
@@ -1,8 +1,26 @@
package com.sngular.api.generator.plugin.asyncapi.handler;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.sngular.api.generator.plugin.asyncapi.exception.*;
+import com.sngular.api.generator.plugin.asyncapi.exception.ChannelNameException;
+import com.sngular.api.generator.plugin.asyncapi.exception.DuplicatedOperationException;
+import com.sngular.api.generator.plugin.asyncapi.exception.ExternalRefComponentNotFoundException;
+import com.sngular.api.generator.plugin.asyncapi.exception.FileSystemException;
+import com.sngular.api.generator.plugin.asyncapi.exception.InvalidAsyncAPIException;
+import com.sngular.api.generator.plugin.asyncapi.exception.InvalidAvroException;
import com.sngular.api.generator.plugin.asyncapi.model.ProcessBindingsResult;
import com.sngular.api.generator.plugin.asyncapi.model.ProcessMethodResult;
import com.sngular.api.generator.plugin.asyncapi.parameter.OperationParameterObject;
@@ -21,21 +39,15 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URISyntaxException;
-import java.util.*;
-import java.util.Map.Entry;
-
public class AsyncApi3Handler extends BaseAsyncApiHandler {
- public AsyncApi3Handler(final Integer springBootVersion,
- boolean overwriteModel,
- final File targetFolder,
- final String processedGeneratedSourcesFolder,
- final String groupId,
- final File baseDir) {
+ public AsyncApi3Handler(
+ final Integer springBootVersion,
+ boolean overwriteModel,
+ final File targetFolder,
+ final String processedGeneratedSourcesFolder,
+ final String groupId,
+ final File baseDir) {
super(springBootVersion, overwriteModel, targetFolder, processedGeneratedSourcesFolder, groupId, baseDir);
}
@@ -83,15 +95,15 @@ protected Map getAllSchemas(final FileLocation ymlParent, fina
ApiTool.getComponent(node, SCHEMAS).forEachRemaining(
schema -> totalSchemas.putIfAbsent(SCHEMAS.toUpperCase() + SLASH + MapperUtil.getSchemaKey(schema.getKey()), schema.getValue())
- );
+ );
ApiTool.getComponent(node, MESSAGES).forEachRemaining(
message -> getMessageSchemas(message.getKey(), message.getValue(), ymlParent, totalSchemas)
- );
+ );
getChannels(node).forEachRemaining(
channel -> getChannelSchemas(channel.getValue(), totalSchemas, ymlParent)
- );
+ );
return totalSchemas;
}
@@ -101,7 +113,7 @@ protected void processOperation(
final SpecFile fileParameter, final FileLocation ymlParent, final Entry entry, final JsonNode channel,
final String operationId, final JsonNode operation, final Map totalSchemas) throws IOException, TemplateException {
final String action = ApiTool.getNodeAsString(operation, "action");
- if (!StringUtils.endsWithIgnoreCase(action,"send") && !StringUtils.endsWithIgnoreCase(action,"receive")) {
+ if (!StringUtils.endsWithIgnoreCase(action, "send") && !StringUtils.endsWithIgnoreCase(action, "receive")) {
throw new InvalidAsyncAPIException("Operation action must be either 'send' or 'receive'");
}
@@ -137,7 +149,8 @@ protected void processSupplierMethod(
@Override
protected void processStreamBridgeMethod(
- final String operationId, final JsonNode operation, final OperationParameterObject operationObject, final FileLocation ymlParent, final String channelName, final Map totalSchemas)
+ final String operationId, final JsonNode operation, final OperationParameterObject operationObject, final FileLocation ymlParent, final String channelName,
+ final Map totalSchemas)
throws IOException {
final ProcessMethodResult result = processMethod(operationId, operation, operationObject, ymlParent, totalSchemas);
if (!channelName.matches("[a-zA-Z0-9.\\-]*")) {
@@ -148,7 +161,8 @@ protected void processStreamBridgeMethod(
}
@Override
- protected void processSubscribeMethod(final String operationId,
+ protected void processSubscribeMethod(
+ final String operationId,
final JsonNode operation, final OperationParameterObject operationObject, final FileLocation ymlParent,
final Map totalSchemas) throws IOException {
final ProcessMethodResult result = processMethod(operationId, operation, operationObject, ymlParent, totalSchemas);
@@ -157,7 +171,8 @@ protected void processSubscribeMethod(final String operationId,
}
@Override
- protected void fillTemplateFactory(final String operationId,
+ protected void fillTemplateFactory(
+ final String operationId,
final ProcessMethodResult processedMethod, final Map totalSchemas, final OperationParameterObject operationObject)
throws IOException {
final String classFullName = processedMethod.getNamespace();
@@ -235,19 +250,6 @@ protected Pair processMethodRef(
return processPayload(operationObject, MapperUtil.getRefClass(method), solvePayload(message, totalSchemas, ymlParent), ymlParent);
}
- private JsonNode solvePayload(final JsonNode message, Map totalSchemas, FileLocation ymlParent) {
- JsonNode payloadNode;
- if (ApiTool.hasNode(message, PAYLOAD)) {
- payloadNode = ApiTool.getNode(message, PAYLOAD);
- } else if (ApiTool.hasRef(message)) {
- final var solvedMessage = SchemaUtil.solveRef(ApiTool.getRefValue(message), totalSchemas, ymlParent.getPath());
- payloadNode = solvePayload(solvedMessage, totalSchemas, ymlParent);
- } else {
- payloadNode = message;
- }
- return payloadNode;
- }
-
@Override
protected String processMessageRef(final JsonNode messageBody, final String modelPackage, final FileLocation ymlParent) throws IOException {
final String namespace;
@@ -255,7 +257,7 @@ protected String processMessageRef(final JsonNode messageBody, final String mode
if (messageContent.startsWith("#")) {
namespace = processModelPackage(MapperUtil.getLongRefClass(messageBody), modelPackage);
} else if (messageContent.contains("#") || StringUtils.endsWith(messageContent, "yml")
- || StringUtils.endsWith(messageContent, "yaml") || StringUtils.endsWith(messageContent, "json")) {
+ || StringUtils.endsWith(messageContent, "yaml") || StringUtils.endsWith(messageContent, "json")) {
namespace = processExternalRef(modelPackage, ymlParent, messageBody);
} else {
namespace = processExternalAvro(ymlParent, messageContent);
@@ -278,7 +280,9 @@ protected String processExternalAvro(final FileLocation ymlParent, final String
final JsonNode fileTree = mapper.readTree(avroFile);
final JsonNode avroNamespace = fileTree.get("namespace");
- if (avroNamespace == null) throw new InvalidAvroException(avroFilePath);
+ if (avroNamespace == null) {
+ throw new InvalidAvroException(avroFilePath);
+ }
namespace = avroNamespace.asText() + PACKAGE_SEPARATOR + fileTree.get("name").asText();
} catch (final IOException e) {
@@ -306,7 +310,8 @@ protected String processExternalRef(final String modelPackage, final FileLocatio
}
@Override
- protected void processBindings(final ProcessBindingsResult.ProcessBindingsResultBuilder bindingsResult, final JsonNode message,
+ protected void processBindings(
+ final ProcessBindingsResult.ProcessBindingsResultBuilder bindingsResult, final JsonNode message,
final CommonSpecFile commonSpecFile) {
if (message.has(BINDINGS)) {
final var bindingsNode = message.get(BINDINGS);
@@ -349,6 +354,44 @@ protected String processModelPackage(final String extractedPackage, final String
return processedPackage;
}
+ @Override
+ protected JsonNode getChannelFromOperation(final JsonNode openApi, final JsonNode operation) {
+ if (operation.has("channel")) {
+ final JsonNode channelRef = operation.get("channel");
+ if (channelRef.has(REF)) {
+ final String channelPath = ApiTool.getRefValue(channelRef);
+ return ApiTool.getNode(openApi, channelPath.substring(1));
+ }
+ }
+ throw new InvalidAsyncAPIException("Operation must have a channel reference");
+ }
+
+ @Override
+ protected String getOperationId(final JsonNode operation) {
+ if (!operation.has(OPERATION_ID)) {
+ throw new InvalidAsyncAPIException("Operation must have an operationId");
+ }
+ final String operationId = operation.get(OPERATION_ID).asText();
+ if (processedOperationIds.contains(operationId)) {
+ throw new DuplicatedOperationException(operationId);
+ }
+ processedOperationIds.add(operationId);
+ return operationId;
+ }
+
+ private JsonNode solvePayload(final JsonNode message, Map totalSchemas, FileLocation ymlParent) {
+ JsonNode payloadNode;
+ if (ApiTool.hasNode(message, PAYLOAD)) {
+ payloadNode = ApiTool.getNode(message, PAYLOAD);
+ } else if (ApiTool.hasRef(message)) {
+ final var solvedMessage = SchemaUtil.solveRef(ApiTool.getRefValue(message), totalSchemas, ymlParent.path());
+ payloadNode = solvePayload(solvedMessage, totalSchemas, ymlParent);
+ } else {
+ payloadNode = message;
+ }
+ return payloadNode;
+ }
+
private Iterator> getChannels(final JsonNode node) {
return ApiTool.hasNode(node, CHANNELS) ? ApiTool.getFieldIterator(node, CHANNELS) : Collections.emptyIterator();
}
@@ -401,29 +444,4 @@ private boolean isValidOperation(
}
return result;
}
-
- @Override
- protected JsonNode getChannelFromOperation(final JsonNode openApi, final JsonNode operation) {
- if (operation.has("channel")) {
- final JsonNode channelRef = operation.get("channel");
- if (channelRef.has(REF)) {
- final String channelPath = ApiTool.getRefValue(channelRef);
- return ApiTool.getNode(openApi, channelPath.substring(1));
- }
- }
- throw new InvalidAsyncAPIException("Operation must have a channel reference");
- }
-
- @Override
- protected String getOperationId(final JsonNode operation) {
- if (!operation.has(OPERATION_ID)) {
- throw new InvalidAsyncAPIException("Operation must have an operationId");
- }
- final String operationId = operation.get(OPERATION_ID).asText();
- if (processedOperationIds.contains(operationId)) {
- throw new DuplicatedOperationException(operationId);
- }
- processedOperationIds.add(operationId);
- return operationId;
- }
}
\ No newline at end of file
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApiHandlerFactory.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApiHandlerFactory.java
index 67b27d20..dafb2b5b 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApiHandlerFactory.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/AsyncApiHandlerFactory.java
@@ -1,27 +1,28 @@
package com.sngular.api.generator.plugin.asyncapi.handler;
-import lombok.extern.slf4j.Slf4j;
-
import java.io.File;
+import lombok.extern.slf4j.Slf4j;
+
@Slf4j
public final class AsyncApiHandlerFactory {
- private AsyncApiHandlerFactory() {
- }
+ private AsyncApiHandlerFactory() {
+ }
- public static BaseAsyncApiHandler getHandler(final String apiVersion, final Integer springBootVersion,
- boolean overwriteModel,
- final File targetFolder,
- final String processedGeneratedSourcesFolder,
- final String groupId,
- final File baseDir) {
- BaseAsyncApiHandler handler;
- if (apiVersion.startsWith("3.")) {
- handler = new AsyncApi3Handler(springBootVersion, overwriteModel, targetFolder, processedGeneratedSourcesFolder, groupId, baseDir);
- } else {
- handler = new AsyncApi2Handler(springBootVersion, overwriteModel, targetFolder, processedGeneratedSourcesFolder, groupId, baseDir);
- }
- return handler;
+ public static BaseAsyncApiHandler getHandler(
+ final String apiVersion, final Integer springBootVersion,
+ boolean overwriteModel,
+ final File targetFolder,
+ final String processedGeneratedSourcesFolder,
+ final String groupId,
+ final File baseDir) {
+ BaseAsyncApiHandler handler;
+ if (apiVersion.startsWith("3.")) {
+ handler = new AsyncApi3Handler(springBootVersion, overwriteModel, targetFolder, processedGeneratedSourcesFolder, groupId, baseDir);
+ } else {
+ handler = new AsyncApi2Handler(springBootVersion, overwriteModel, targetFolder, processedGeneratedSourcesFolder, groupId, baseDir);
}
+ return handler;
+ }
}
\ No newline at end of file
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/BaseAsyncApiHandler.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/BaseAsyncApiHandler.java
index fa3e445b..b3d314b6 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/BaseAsyncApiHandler.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/handler/BaseAsyncApiHandler.java
@@ -1,5 +1,18 @@
package com.sngular.api.generator.plugin.asyncapi.handler;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.regex.Pattern;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.sngular.api.generator.plugin.asyncapi.exception.DuplicateClassException;
import com.sngular.api.generator.plugin.asyncapi.model.ProcessBindingsResult;
@@ -20,59 +33,74 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.regex.Pattern;
-
@Slf4j
public abstract class BaseAsyncApiHandler {
protected static final String PACKAGE_SEPARATOR_STR = ".";
+
protected static final String SLASH = "/";
+
protected static final Pattern PACKAGE_SEPARATOR = Pattern.compile(PACKAGE_SEPARATOR_STR);
+
protected static final String DEFAULT_ASYNCAPI_API_PACKAGE = "com.sngular.api.asyncapi";
+
protected static final String DEFAULT_ASYNCAPI_MODEL_PACKAGE = DEFAULT_ASYNCAPI_API_PACKAGE + ".model";
+
protected static final String CONSUMER_CLASS_NAME = "Subscriber";
+
protected static final String SUPPLIER_CLASS_NAME = "Producer";
+
protected static final String STREAM_BRIDGE_CLASS_NAME = "StreamBridgeProducer";
+
protected static final String SUBSCRIBE = "subscribe";
+
protected static final String PUBLISH = "publish";
+
protected static final String OPERATION_ID = "operationId";
+
protected static final String AVSC = "avsc";
+
protected static final String PAYLOAD = "payload";
+
protected static final String REF = "$ref";
+
protected static final String MESSAGES = "messages";
+
protected static final String EVENT = "event";
+
protected static final String MESSAGE = "message";
+
protected static final String SCHEMAS = "schemas";
+
protected static final String CHANNELS = "channels";
+
protected static final String BINDINGS = "bindings";
+
protected static final String KAFKA = "kafka";
+
protected static final String KEY = "key";
protected final List processedOperationIds = new ArrayList<>();
+
protected final List processedClassnames = new ArrayList<>();
+
protected final List processedApiPackages = new ArrayList<>();
+
protected final Path baseDir;
+
protected final TemplateFactory templateFactory;
+
protected final String groupId;
+
protected final Integer springBootVersion;
- protected BaseAsyncApiHandler(final Integer springBootVersion,
- boolean overwriteModel,
- final File targetFolder,
- final String processedGeneratedSourcesFolder,
- final String groupId,
- final File baseDir) {
+ protected BaseAsyncApiHandler(
+ final Integer springBootVersion,
+ boolean overwriteModel,
+ final File targetFolder,
+ final String processedGeneratedSourcesFolder,
+ final String groupId,
+ final File baseDir) {
this.groupId = groupId;
this.baseDir = baseDir.toPath().toAbsolutePath();
this.templateFactory = new TemplateFactory(overwriteModel, targetFolder, processedGeneratedSourcesFolder, baseDir);
@@ -135,22 +163,26 @@ protected abstract void processSupplierMethod(
final Map totalSchemas) throws IOException, TemplateException;
protected abstract void processStreamBridgeMethod(
- final String operationId, final JsonNode channel, final OperationParameterObject operationObject, final FileLocation ymlParent, final String channelName, final Map totalSchemas)
+ final String operationId, final JsonNode channel, final OperationParameterObject operationObject, final FileLocation ymlParent, final String channelName,
+ final Map totalSchemas)
throws IOException, TemplateException;
protected abstract void processSubscribeMethod(
final String operationId, final JsonNode channel, final OperationParameterObject operationObject, final FileLocation ymlParent,
final Map totalSchemas) throws IOException, TemplateException;
- protected abstract void fillTemplateFactory(final String operationId,
+ protected abstract void fillTemplateFactory(
+ final String operationId,
final ProcessMethodResult processedMethod, final Map totalSchemas, final OperationParameterObject operationObject)
throws IOException;
- protected abstract ProcessMethodResult processMethod(final String operationId,
+ protected abstract ProcessMethodResult processMethod(
+ final String operationId,
final JsonNode channel, final OperationParameterObject operationObject, final FileLocation ymlParent, final Map totalSchemas)
throws IOException;
- protected abstract Pair processPayload(final OperationParameterObject operationObject, final String messageName, final JsonNode payload, final FileLocation ymlParent)
+ protected abstract Pair processPayload(
+ final OperationParameterObject operationObject, final String messageName, final JsonNode payload, final FileLocation ymlParent)
throws IOException;
protected abstract Pair processMethodRef(
@@ -163,10 +195,12 @@ protected abstract Pair processMethodRef(
protected abstract String processExternalRef(final String modelPackage, final FileLocation ymlParent, final JsonNode message) throws IOException;
- protected abstract void processBindings(final ProcessBindingsResult.ProcessBindingsResultBuilder bindingsResult, final JsonNode message,
+ protected abstract void processBindings(
+ final ProcessBindingsResult.ProcessBindingsResultBuilder bindingsResult, final JsonNode message,
final CommonSpecFile commonSpecFile);
- protected abstract void processKafkaBindings(final ProcessBindingsResult.ProcessBindingsResultBuilder bindingsResult, final JsonNode kafkaBindings, final CommonSpecFile specFile);
+ protected abstract void processKafkaBindings(
+ final ProcessBindingsResult.ProcessBindingsResultBuilder bindingsResult, final JsonNode kafkaBindings, final CommonSpecFile specFile);
protected abstract String processModelPackage(final String extractedPackage, final String modelPackage);
@@ -178,28 +212,16 @@ protected void setUpTemplate(final SpecFile fileParameter, final Integer springB
processJavaEEPackage(springBootVersion);
}
- protected void processEntitiesSuffix(final SpecFile fileParameter) {
- templateFactory.setSupplierEntitiesSuffix(fileParameter.getSupplier() != null && fileParameter.getSupplier().getModelNameSuffix() != null
- ? fileParameter.getSupplier().getModelNameSuffix() : null);
- templateFactory.setStreamBridgeEntitiesSuffix(fileParameter.getStreamBridge() != null && fileParameter.getStreamBridge().getModelNameSuffix() != null
- ? fileParameter.getStreamBridge().getModelNameSuffix() : null);
- templateFactory.setSubscribeEntitiesSuffix(fileParameter.getConsumer() != null && fileParameter.getConsumer().getModelNameSuffix() != null
- ? fileParameter.getConsumer().getModelNameSuffix() : null);
- }
-
- protected void checkClassPackageDuplicate(final String className, final String apiPackage) {
- if (className != null && processedClassnames.contains(className)
- && apiPackage != null && processedApiPackages.contains(apiPackage)
- && processedClassnames.lastIndexOf(className) == processedApiPackages.lastIndexOf(apiPackage)) {
- throw new DuplicateClassException(className, apiPackage);
+ protected void processPackage(final SpecFile fileParameter) {
+ if (ObjectUtils.anyNotNull(fileParameter.getSupplier(), fileParameter.getStreamBridge(), fileParameter.getConsumer())) {
+ templateFactory.setSupplierPackageName(evaluatePackage(fileParameter.getSupplier()));
+ templateFactory.setStreamBridgePackageName(evaluatePackage(fileParameter.getStreamBridge()));
+ templateFactory.setSubscribePackageName(evaluatePackage(fileParameter.getConsumer()));
+ } else {
+ throw new InvalidAPIException("No Configuration provided, nothing will be generated.");
}
}
- protected void addProcessedClassesAndPackagesToGlobalVariables(final String className, final String apiPackage, final String defaultClassName) {
- processedClassnames.add(className != null ? className : defaultClassName);
- processedApiPackages.add(apiPackage != null ? apiPackage : DEFAULT_ASYNCAPI_API_PACKAGE);
- }
-
protected void processClassNames(final SpecFile fileParameter) {
templateFactory.setSupplierClassName(fileParameter.getSupplier() != null && fileParameter.getSupplier().getClassNamePostfix() != null
? fileParameter.getSupplier().getClassNamePostfix() : SUPPLIER_CLASS_NAME);
@@ -209,18 +231,17 @@ protected void processClassNames(final SpecFile fileParameter) {
? fileParameter.getConsumer().getClassNamePostfix() : CONSUMER_CLASS_NAME);
}
- protected void processJavaEEPackage(final Integer springBootVersion) {
- templateFactory.calculateJavaEEPackage(springBootVersion);
+ protected void processEntitiesSuffix(final SpecFile fileParameter) {
+ templateFactory.setSupplierEntitiesSuffix(fileParameter.getSupplier() != null && fileParameter.getSupplier().getModelNameSuffix() != null
+ ? fileParameter.getSupplier().getModelNameSuffix() : null);
+ templateFactory.setStreamBridgeEntitiesSuffix(fileParameter.getStreamBridge() != null && fileParameter.getStreamBridge().getModelNameSuffix() != null
+ ? fileParameter.getStreamBridge().getModelNameSuffix() : null);
+ templateFactory.setSubscribeEntitiesSuffix(fileParameter.getConsumer() != null && fileParameter.getConsumer().getModelNameSuffix() != null
+ ? fileParameter.getConsumer().getModelNameSuffix() : null);
}
- protected void processPackage(final SpecFile fileParameter) {
- if (ObjectUtils.anyNotNull(fileParameter.getSupplier(), fileParameter.getStreamBridge(), fileParameter.getConsumer())) {
- templateFactory.setSupplierPackageName(evaluatePackage(fileParameter.getSupplier()));
- templateFactory.setStreamBridgePackageName(evaluatePackage(fileParameter.getStreamBridge()));
- templateFactory.setSubscribePackageName(evaluatePackage(fileParameter.getConsumer()));
- } else {
- throw new InvalidAPIException("No Configuration provided, nothing will be generated.");
- }
+ protected void processJavaEEPackage(final Integer springBootVersion) {
+ templateFactory.calculateJavaEEPackage(springBootVersion);
}
protected String evaluatePackage(final OperationParameterObject operation) {
@@ -233,6 +254,19 @@ protected String evaluatePackage(final OperationParameterObject operation) {
return evaluated;
}
+ protected void checkClassPackageDuplicate(final String className, final String apiPackage) {
+ if (className != null && processedClassnames.contains(className)
+ && apiPackage != null && processedApiPackages.contains(apiPackage)
+ && processedClassnames.lastIndexOf(className) == processedApiPackages.lastIndexOf(apiPackage)) {
+ throw new DuplicateClassException(className, apiPackage);
+ }
+ }
+
+ protected void addProcessedClassesAndPackagesToGlobalVariables(final String className, final String apiPackage, final String defaultClassName) {
+ processedClassnames.add(className != null ? className : defaultClassName);
+ processedApiPackages.add(apiPackage != null ? apiPackage : DEFAULT_ASYNCAPI_API_PACKAGE);
+ }
+
protected boolean shouldBuild(final JsonNode schemaToBuild) {
boolean result = Boolean.FALSE;
if (ApiTool.hasRef(schemaToBuild)) {
@@ -252,5 +286,6 @@ protected void writeSchemaObject(final boolean usingLombok, final String modelPa
}
protected abstract JsonNode getChannelFromOperation(final JsonNode openApi, final JsonNode operation);
+
protected abstract String getOperationId(final JsonNode operation);
}
\ No newline at end of file
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/model/MethodObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/model/MethodObject.java
index 6b2d2ae5..6222580f 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/model/MethodObject.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/model/MethodObject.java
@@ -7,6 +7,7 @@
package com.sngular.api.generator.plugin.asyncapi.model;
import java.util.Objects;
+
import com.sngular.api.generator.plugin.asyncapi.util.BindingTypeEnum;
import com.sngular.api.generator.plugin.common.model.SchemaObject;
import lombok.Builder;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/parameter/OperationParameterObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/parameter/OperationParameterObject.java
index f332414c..3d6e6228 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/parameter/OperationParameterObject.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/parameter/OperationParameterObject.java
@@ -13,6 +13,7 @@
package com.sngular.api.generator.plugin.asyncapi.parameter;
import java.util.List;
+
import com.sngular.api.generator.plugin.common.model.CommonSpecFile;
import lombok.AllArgsConstructor;
import lombok.Data;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/ClassTemplate.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/ClassTemplate.java
index 30a8ce46..811b2de2 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/ClassTemplate.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/ClassTemplate.java
@@ -7,6 +7,7 @@
package com.sngular.api.generator.plugin.asyncapi.template;
import java.nio.file.Path;
+
import com.sngular.api.generator.plugin.common.model.SchemaObject;
import lombok.Builder;
import lombok.Value;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/ClasspathTemplateLoader.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/ClasspathTemplateLoader.java
index fb7418e7..b75af53b 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/ClasspathTemplateLoader.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/ClasspathTemplateLoader.java
@@ -6,9 +6,6 @@
package com.sngular.api.generator.plugin.asyncapi.template;
-import com.sngular.api.generator.plugin.common.template.CommonTemplateLoader;
-import com.sngular.api.generator.plugin.exception.GeneratorTemplateException;
-
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
@@ -16,15 +13,18 @@
import java.util.Map;
import java.util.Objects;
-public class ClasspathTemplateLoader extends CommonTemplateLoader {
+import com.sngular.api.generator.plugin.common.template.CommonTemplateLoader;
+import com.sngular.api.generator.plugin.exception.GeneratorTemplateException;
+public class ClasspathTemplateLoader extends CommonTemplateLoader {
private static final List TEMPLATE_FILES = List.of(
- "interfaceConsumer.ftlh", "interfaceConsumerWithKafkaBindings.ftlh",
- "interfaceSupplier.ftlh", "interfaceSupplierWithKafkaBindings.ftlh",
- "templateConsumers.ftlh", "templateConsumersWithKafkaBindings.ftlh",
- "templateMessageWrapper.ftlh", "templateStreamBridge.ftlh", "templateStreamBridgeWithKafkaBindings.ftlh",
- "templateSuppliers.ftlh", "templateSuppliersWithKafkaBindings.ftlh");
+ "interfaceConsumer.ftlh", "interfaceConsumerWithKafkaBindings.ftlh",
+ "interfaceSupplier.ftlh", "interfaceSupplierWithKafkaBindings.ftlh",
+ "templateConsumers.ftlh", "templateConsumersWithKafkaBindings.ftlh",
+ "templateMessageWrapper.ftlh", "templateStreamBridge.ftlh", "templateStreamBridgeWithKafkaBindings.ftlh",
+ "templateSuppliers.ftlh", "templateSuppliersWithKafkaBindings.ftlh");
+
public ClasspathTemplateLoader() {
super();
init(getResourceFolderFiles());
@@ -35,7 +35,7 @@ private Map getResourceFolderFiles() {
try {
for (var templateFile : TEMPLATE_MODEL_FILES) {
templates.put(templateFile,
- readFile((InputStream) Objects.requireNonNull(LOADER.getResource("templates/model/" + templateFile)).getContent()));
+ readFile((InputStream) Objects.requireNonNull(LOADER.getResource("templates/model/" + templateFile)).getContent()));
}
for (var templateFile : TEMPLATE_FILES) {
templates.put(templateFile,
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/TemplateFactory.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/TemplateFactory.java
index ce8fe36a..c10d9ac7 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/TemplateFactory.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/template/TemplateFactory.java
@@ -6,13 +6,6 @@
package com.sngular.api.generator.plugin.asyncapi.template;
-import com.sngular.api.generator.plugin.asyncapi.exception.NonSupportedBindingException;
-import com.sngular.api.generator.plugin.asyncapi.model.MethodObject;
-import com.sngular.api.generator.plugin.asyncapi.parameter.SpecFile;
-import com.sngular.api.generator.plugin.asyncapi.util.BindingTypeEnum;
-import com.sngular.api.generator.plugin.common.template.CommonTemplateFactory;
-import org.apache.commons.lang3.StringUtils;
-
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
@@ -21,6 +14,13 @@
import java.util.Map;
import java.util.Objects;
+import com.sngular.api.generator.plugin.asyncapi.exception.NonSupportedBindingException;
+import com.sngular.api.generator.plugin.asyncapi.model.MethodObject;
+import com.sngular.api.generator.plugin.asyncapi.parameter.SpecFile;
+import com.sngular.api.generator.plugin.asyncapi.util.BindingTypeEnum;
+import com.sngular.api.generator.plugin.common.template.CommonTemplateFactory;
+import org.apache.commons.lang3.StringUtils;
+
public class TemplateFactory extends CommonTemplateFactory {
private static final String SUBSCRIBE_PACKAGE = "subscribePackage";
@@ -55,10 +55,11 @@ public class TemplateFactory extends CommonTemplateFactory {
private String subscribeClassName = null;
- public TemplateFactory(boolean enableOverwrite,
- final File targetFolder,
- final String processedGeneratedSourcesFolder,
- final File baseDir) {
+ public TemplateFactory(
+ boolean enableOverwrite,
+ final File targetFolder,
+ final String processedGeneratedSourcesFolder,
+ final File baseDir) {
super(enableOverwrite, targetFolder, processedGeneratedSourcesFolder, baseDir, new ClasspathTemplateLoader());
}
@@ -84,6 +85,39 @@ public final void fillTemplates() throws IOException {
this.generateInterfaces();
}
+ private String checkTemplate(final String bindingType, final String defaultTemplate) {
+ final String templateName;
+ switch (BindingTypeEnum.valueOf(bindingType)) {
+ case NONBINDING:
+ templateName = defaultTemplate;
+ break;
+ case KAFKA:
+ templateName = StringUtils.remove(defaultTemplate, ".ftlh") + TemplateIndexConstants.KAFKA_BINDINGS_FTLH;
+ break;
+ default:
+ throw new NonSupportedBindingException(bindingType);
+ }
+ return templateName;
+ }
+
+ private void generateInterfaces() throws IOException {
+ final ArrayList allMethods = new ArrayList<>(subscribeMethods);
+ allMethods.addAll(publishMethods);
+
+ for (MethodObject method : allMethods) {
+ addToRoot("method", method);
+
+ if (Objects.equals(method.getType(), "publish")) {
+ fillTemplate(supplierFilePath, "I" + method.getOperationId().substring(0, 1).toUpperCase() + method.getOperationId().substring(1),
+ checkTemplate(method.getBindingType(), TemplateIndexConstants.TEMPLATE_INTERFACE_SUPPLIERS));
+ } else if (Objects.equals(method.getType(), "subscribe")) {
+ fillTemplate(subscribeFilePath, "I" + method.getOperationId().substring(0, 1).toUpperCase() + method.getOperationId().substring(1),
+ checkTemplate(method.getBindingType(), TemplateIndexConstants.TEMPLATE_INTERFACE_CONSUMERS));
+ }
+ }
+ cleanData();
+ }
+
public final void setSubscribePackageName(final String packageName) {
addToRoot(SUBSCRIBE_PACKAGE, packageName);
}
@@ -115,50 +149,38 @@ public final void setStreamBridgeClassName(final String className) {
this.streamBridgeClassName = className;
}
- public final void setSubscribeFilePath(final Path path) {
- this.subscribeFilePath = path.toString();
- }
-
- public final void setSupplierFilePath(final Path path) {
- this.supplierFilePath = path.toString();
- }
-
- public final void setStreamBridgeFilePath(final Path path) {
- this.streamBridgeFilePath = path.toString();
- }
-
public final void addSupplierMethod(final String operationId, final String classNamespace, final String bindings, final String bindingType) {
publishMethods.add(MethodObject
- .builder()
- .operationId(operationId)
- .classNamespace(classNamespace)
- .type("publish")
- .keyClassNamespace(bindings)
- .bindingType(bindingType)
- .build());
+ .builder()
+ .operationId(operationId)
+ .classNamespace(classNamespace)
+ .type("publish")
+ .keyClassNamespace(bindings)
+ .bindingType(bindingType)
+ .build());
}
public final void addStreamBridgeMethod(final String operationId, final String classNamespace, final String channelName, final String bindings, final String bindingType) {
streamBridgeMethods.add(MethodObject
- .builder()
- .operationId(operationId)
- .channelName(channelName)
- .classNamespace(classNamespace)
- .type("streamBridge")
- .keyClassNamespace(bindings)
- .bindingType(bindingType)
- .build());
+ .builder()
+ .operationId(operationId)
+ .channelName(channelName)
+ .classNamespace(classNamespace)
+ .type("streamBridge")
+ .keyClassNamespace(bindings)
+ .bindingType(bindingType)
+ .build());
}
public final void addSubscribeMethod(final String operationId, final String classNamespace, final String bindings, final String bindingType) {
subscribeMethods.add(MethodObject
- .builder()
- .operationId(operationId)
- .classNamespace(classNamespace)
- .type("subscribe")
- .keyClassNamespace(bindings)
- .bindingType(bindingType)
- .build());
+ .builder()
+ .operationId(operationId)
+ .classNamespace(classNamespace)
+ .type("subscribe")
+ .keyClassNamespace(bindings)
+ .bindingType(bindingType)
+ .build());
}
public final void setSupplierEntitiesSuffix(final String suffix) {
@@ -204,13 +226,13 @@ public final void fillTemplateWrapper(
final String className,
final String keyClassFullName,
final String keyClassName
- ) throws IOException {
+ ) throws IOException {
final var filePath = processPath(getPath(modelPackage));
addToRoot(Map.of(WRAPPER_PACKAGE, modelPackage,
- "classNamespace", classFullName,
- "className", className,
- "keyNamespace", keyClassFullName,
- "keyClassName", keyClassName));
+ "classNamespace", classFullName,
+ "className", className,
+ "keyNamespace", keyClassFullName,
+ "keyClassName", keyClassName));
writeTemplateToFile(TemplateIndexConstants.TEMPLATE_MESSAGE_WRAPPER, filePath, "MessageWrapper");
}
@@ -228,36 +250,16 @@ public void processFilePaths(final SpecFile fileParameter, final String defaultA
setSubscribeFilePath(processPath(pathToCreate));
}
}
- private void generateInterfaces() throws IOException {
- final ArrayList allMethods = new ArrayList<>(subscribeMethods);
- allMethods.addAll(publishMethods);
- for (MethodObject method : allMethods) {
- addToRoot("method", method);
+ public final void setSupplierFilePath(final Path path) {
+ this.supplierFilePath = path.toString();
+ }
- if (Objects.equals(method.getType(), "publish")) {
- fillTemplate(supplierFilePath, "I" + method.getOperationId().substring(0, 1).toUpperCase() + method.getOperationId().substring(1),
- checkTemplate(method.getBindingType(), TemplateIndexConstants.TEMPLATE_INTERFACE_SUPPLIERS));
- } else if (Objects.equals(method.getType(), "subscribe")) {
- fillTemplate(subscribeFilePath, "I" + method.getOperationId().substring(0, 1).toUpperCase() + method.getOperationId().substring(1),
- checkTemplate(method.getBindingType(), TemplateIndexConstants.TEMPLATE_INTERFACE_CONSUMERS));
- }
- }
- cleanData();
+ public final void setStreamBridgeFilePath(final Path path) {
+ this.streamBridgeFilePath = path.toString();
}
- private String checkTemplate(final String bindingType, final String defaultTemplate) {
- final String templateName;
- switch (BindingTypeEnum.valueOf(bindingType)) {
- case NONBINDING:
- templateName = defaultTemplate;
- break;
- case KAFKA:
- templateName = StringUtils.remove(defaultTemplate, ".ftlh") + TemplateIndexConstants.KAFKA_BINDINGS_FTLH;
- break;
- default:
- throw new NonSupportedBindingException(bindingType);
- }
- return templateName;
+ public final void setSubscribeFilePath(final Path path) {
+ this.subscribeFilePath = path.toString();
}
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/util/AsyncApiUtil.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/util/AsyncApiUtil.java
index 7a43e668..f057bff7 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/util/AsyncApiUtil.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/util/AsyncApiUtil.java
@@ -1,19 +1,19 @@
package com.sngular.api.generator.plugin.asyncapi.util;
+import java.nio.file.Path;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.sngular.api.generator.plugin.asyncapi.parameter.SpecFile;
import com.sngular.api.generator.plugin.common.tools.SchemaUtil;
-import java.nio.file.Path;
-
public final class AsyncApiUtil {
- private AsyncApiUtil() {
- throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
- }
+ private AsyncApiUtil() {
+ throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
+ }
- public static JsonNode getPojoFromSpecFile(final Path baseDir, final SpecFile specFile) {
+ public static JsonNode getPojoFromSpecFile(final Path baseDir, final SpecFile specFile) {
- return SchemaUtil.getPojoFromRef(baseDir.toUri(), specFile.getFilePath());
- }
+ return SchemaUtil.getPojoFromRef(baseDir.toUri(), specFile.getFilePath());
+ }
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/util/ReferenceProcessor.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/util/ReferenceProcessor.java
index b9adb143..903712ba 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/util/ReferenceProcessor.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/asyncapi/util/ReferenceProcessor.java
@@ -1,5 +1,11 @@
package com.sngular.api.generator.plugin.asyncapi.util;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.sngular.api.generator.plugin.asyncapi.exception.FileSystemException;
import com.sngular.api.generator.plugin.common.files.FileLocation;
@@ -8,12 +14,6 @@
import lombok.Builder;
import org.apache.commons.lang3.StringUtils;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
public final class ReferenceProcessor {
private static final String JSON = "json";
@@ -26,12 +26,12 @@ public final class ReferenceProcessor {
private static final String AVSC = "avsc";
- private List alreadyProcessed;
-
private final FileLocation ymlParent;
private final Map totalSchemas;
+ private List alreadyProcessed;
+
@Builder
public ReferenceProcessor(final FileLocation ymlParent, final Map totalSchemas) {
this.ymlParent = ymlParent;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/ClasspathFileLocation.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/ClasspathFileLocation.java
index 1272526f..eb110022 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/ClasspathFileLocation.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/ClasspathFileLocation.java
@@ -6,50 +6,92 @@
package com.sngular.api.generator.plugin.common.files;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
-@RequiredArgsConstructor
-@Getter
-public class ClasspathFileLocation implements FileLocation {
+import com.sngular.api.generator.plugin.common.tools.PathUtil;
- private final URI path;
+public record ClasspathFileLocation(URI path) implements FileLocation {
@Override
- public final InputStream getFileAtLocation(final String filename) throws IOException {
+ public InputStream getFileAtLocation(final String filename) throws IOException {
return resolveInUri(path, filename).toURL().openStream();
}
+ private static URI resolveInUri(URI parentUri, String relativePath) {
+ // If it's an absolute filesystem path: return directly
+ if (PathUtil.isAbsolutePath(relativePath)) {
+ return Paths.get(relativePath).toUri();
+ }
- @Override
- public final URI getPath() {
- return URI.create(path.toString());
- }
+ String scheme = parentUri.getScheme();
- private static URI resolveInUri(URI parentUri, String relativePath) {
- if ("jar".equals(parentUri.getScheme())) {
- String[] parts = parentUri.getSchemeSpecificPart().split("!", 2);
+ if ("jar".equals(scheme)) {
+ // Extract and
+ String ssp = parentUri.getSchemeSpecificPart();
+ String[] parts = ssp.split("!", 2);
if (parts.length != 2) {
throw new IllegalArgumentException("Invalid JAR URI: " + parentUri);
}
- String jarPath = parts[0];
- Path parentInsideJar = Paths.get(parts[1]);
- Path resolvedPath = parentInsideJar.resolve(relativePath).normalize();
+ String jarPath = parts[0]; // already a valid file: URI
+ String inside = parts[1].replace('\\', '/'); // force forward slashes
- return URI.create("jar:" + jarPath + "!" + resolvedPath.toString().replace("\\", "/"));
- } else if ("file".equals(parentUri.getScheme())) {
- Path parentPath = Paths.get(parentUri);
- Path resolved = parentPath.resolve(relativePath).normalize();
+ // Resolve inside-JAR path using Path logic
+ Path baseInsideJar = inside.isEmpty() || "/".equals(inside)
+ ? Paths.get("") // root of jar
+ : Paths.get(inside);
+
+ Path resolved = baseInsideJar.resolve(relativePath).normalize();
+
+ // Build URI-safe entry path **fast**
+ String entryPath = toJarEntryPath(resolved);
+
+ return URI.create("jar:" + jarPath + "!" + entryPath);
+ }
+
+ // Normal filesystem file:
+ if ("file".equals(scheme)) {
+ Path parent = Paths.get(parentUri);
+ Path resolved = parent.resolve(relativePath).normalize();
return resolved.toUri();
- } else {
- throw new IllegalArgumentException("Unsupported URI scheme: " + parentUri.getScheme());
}
+
+ throw new IllegalArgumentException("Unsupported URI scheme: " + scheme);
+ }
+
+ /**
+ * Converts a Path to a JAR-entry-safe path string using '/' separators.
+ * No streams, no iteration overhead, extremely fast.
+ */
+ private static String toJarEntryPath(Path path) {
+ int nameCount = path.getNameCount();
+
+ // Root of the jar → just "/"
+ if (nameCount == 0) {
+ return "/";
+ }
+
+ // Estimate length to reduce reallocations
+ StringBuilder sb = new StringBuilder(path.toString().length() + nameCount + 2);
+ sb.append('/');
+
+ for (int i = 0; i < nameCount; i++) {
+ sb.append(path.getName(i));
+ if (i < nameCount - 1) {
+ sb.append('/');
+ }
+ }
+
+ return sb.toString();
+ }
+
+
+ @Override
+ public URI path() {
+ return URI.create(path.toString());
}
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/DirectoryFileLocation.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/DirectoryFileLocation.java
index fa4afadf..a67ea8c4 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/DirectoryFileLocation.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/DirectoryFileLocation.java
@@ -6,15 +6,17 @@
package com.sngular.api.generator.plugin.common.files;
-import com.sngular.api.generator.plugin.asyncapi.exception.FileSystemException;
-import lombok.Getter;
-
+import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.nio.file.Path;
+import com.sngular.api.generator.plugin.asyncapi.exception.FileSystemException;
+import com.sngular.api.generator.plugin.common.tools.PathUtil;
+import lombok.Getter;
+
@Getter
public class DirectoryFileLocation implements FileLocation {
@@ -27,14 +29,21 @@ public DirectoryFileLocation(final Path directoryPath) {
@Override
public final InputStream getFileAtLocation(final String filename) {
try {
- return new FileInputStream(path.resolve(filename).toFile());
+ // Check if filename is an absolute path
+ if (PathUtil.isAbsolutePath(filename)) {
+ // For absolute paths, open directly without resolving against parent
+ return new FileInputStream(new File(filename));
+ } else {
+ // For relative paths, resolve against the parent directory
+ return new FileInputStream(path.resolve(filename).toFile());
+ }
} catch (final IOException e) {
throw new FileSystemException(e.getMessage());
}
}
@Override
- public final URI getPath() {
+ public final URI path() {
return path.toUri();
}
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/FileLocation.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/FileLocation.java
index 66f726f5..f9dc8b96 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/FileLocation.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/files/FileLocation.java
@@ -14,5 +14,5 @@ public interface FileLocation {
InputStream getFileAtLocation(String filename) throws IOException;
- URI getPath();
+ URI path();
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/CommonSpecFile.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/CommonSpecFile.java
index 19361ff7..64fb292c 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/CommonSpecFile.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/CommonSpecFile.java
@@ -1,6 +1,7 @@
package com.sngular.api.generator.plugin.common.model;
import java.util.Map;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -13,30 +14,30 @@
@AllArgsConstructor
public class CommonSpecFile {
- private String filePath;
+ private String filePath;
- private String apiPackage;
+ private String apiPackage;
- private String modelPackage;
+ private String modelPackage;
- private String modelNamePrefix;
+ private String modelNamePrefix;
- private String modelNameSuffix;
+ private String modelNameSuffix;
- private String classNamePostfix;
+ private String classNamePostfix;
- private boolean useLombokModelAnnotation;
+ private boolean useLombokModelAnnotation;
- @Builder.Default
- private String dateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss";
+ @Builder.Default
+ private String dateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss";
- @Builder.Default
- private String dateFormat = "yyyy-MM-dd";
+ @Builder.Default
+ private String dateFormat = "yyyy-MM-dd";
- @Builder.Default
- private TypeConstants.TimeType useTimeType = TypeConstants.TimeType.LOCAL;
+ @Builder.Default
+ private TypeConstants.TimeType useTimeType = TypeConstants.TimeType.LOCAL;
- public Map getFormats() {
- return Map.of("DATE_TIME", dateTimeFormat, "DATE", dateFormat);
- }
+ public Map getFormats() {
+ return Map.of("DATE_TIME", dateTimeFormat, "DATE", dateFormat);
+ }
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObject.java
index 601b17ba..4d546b85 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObject.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObject.java
@@ -1,6 +1,7 @@
package com.sngular.api.generator.plugin.common.model;
import java.util.Map;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -12,19 +13,19 @@
@EqualsAndHashCode(of = "baseName")
public class SchemaFieldObject {
- private String baseName;
+ private String baseName;
- @Builder.Default
- private SchemaFieldObjectType dataType = new SchemaFieldObjectType(TypeConstants.OBJECT);
+ @Builder.Default
+ private SchemaFieldObjectType dataType = new SchemaFieldObjectType(TypeConstants.OBJECT);
- @Builder.Default
- private SchemaFieldObjectProperties restrictions = new SchemaFieldObjectProperties();
+ @Builder.Default
+ private SchemaFieldObjectProperties restrictions = new SchemaFieldObjectProperties();
- private String importClass;
+ private String importClass;
- private boolean required;
+ private boolean required;
- private Map enumValues;
+ private Map enumValues;
- private Object constValue;
+ private Object constValue;
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectProperties.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectProperties.java
index e644f6f3..0e961b52 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectProperties.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectProperties.java
@@ -3,6 +3,7 @@
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
+
import lombok.Data;
@Data
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectType.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectType.java
index 61f91c70..72bed1be 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectType.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectType.java
@@ -6,45 +6,47 @@
package com.sngular.api.generator.plugin.common.model;
-import com.sngular.api.generator.plugin.openapi.exception.CodeGenerationException;
-import lombok.Data;
-import org.apache.commons.lang3.StringUtils;
-
import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.Map;
import java.util.Objects;
+import com.sngular.api.generator.plugin.openapi.exception.CodeGenerationException;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+
@Data
public class SchemaFieldObjectType {
public static final String ZONED_DATE_TIME = "ZonedDateTime";
+
public static final String OFFSET_DATE_TIME = "OffsetDateTime";
+
private static final Map TYPE_MAPPINGS = Map.ofEntries(
- new SimpleImmutableEntry<>(TypeConstants.OBJECT, "Object"),
- new SimpleImmutableEntry<>(TypeConstants.ARRAY, "List>"),
- new SimpleImmutableEntry<>(TypeConstants.MAP, "Map"),
- new SimpleImmutableEntry<>(TypeConstants.BIG_DECIMAL, "BigDecimal"),
- new SimpleImmutableEntry<>(TypeConstants.INTEGER, "Integer"),
- new SimpleImmutableEntry<>(TypeConstants.DOUBLE, "Double"),
- new SimpleImmutableEntry<>(TypeConstants.FLOAT, "Float"),
- new SimpleImmutableEntry<>(TypeConstants.LONG, "Long"),
- new SimpleImmutableEntry<>(TypeConstants.STRING, "String"),
- new SimpleImmutableEntry<>(TypeConstants.ENUM, "Enum"),
- new SimpleImmutableEntry<>(TypeConstants.LOCALDATE, "LocalDate"),
- new SimpleImmutableEntry<>(TypeConstants.LOCALDATETIME, "LocalDateTime"),
- new SimpleImmutableEntry<>(TypeConstants.ZONEDDATE, ZONED_DATE_TIME),
- new SimpleImmutableEntry<>(TypeConstants.ZONEDDATETIME, ZONED_DATE_TIME),
- new SimpleImmutableEntry<>(TypeConstants.OFFSETDATE, OFFSET_DATE_TIME),
- new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, OFFSET_DATE_TIME),
- new SimpleImmutableEntry<>(TypeConstants.MULTIPART_FILE, "MultipartFile")
- );
+ new SimpleImmutableEntry<>(TypeConstants.OBJECT, "Object"),
+ new SimpleImmutableEntry<>(TypeConstants.ARRAY, "List>"),
+ new SimpleImmutableEntry<>(TypeConstants.MAP, "Map"),
+ new SimpleImmutableEntry<>(TypeConstants.BIG_DECIMAL, "BigDecimal"),
+ new SimpleImmutableEntry<>(TypeConstants.INTEGER, "Integer"),
+ new SimpleImmutableEntry<>(TypeConstants.DOUBLE, "Double"),
+ new SimpleImmutableEntry<>(TypeConstants.FLOAT, "Float"),
+ new SimpleImmutableEntry<>(TypeConstants.LONG, "Long"),
+ new SimpleImmutableEntry<>(TypeConstants.STRING, "String"),
+ new SimpleImmutableEntry<>(TypeConstants.ENUM, "Enum"),
+ new SimpleImmutableEntry<>(TypeConstants.LOCALDATE, "LocalDate"),
+ new SimpleImmutableEntry<>(TypeConstants.LOCALDATETIME, "LocalDateTime"),
+ new SimpleImmutableEntry<>(TypeConstants.ZONEDDATE, ZONED_DATE_TIME),
+ new SimpleImmutableEntry<>(TypeConstants.ZONEDDATETIME, ZONED_DATE_TIME),
+ new SimpleImmutableEntry<>(TypeConstants.OFFSETDATE, OFFSET_DATE_TIME),
+ new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, OFFSET_DATE_TIME),
+ new SimpleImmutableEntry<>(TypeConstants.MULTIPART_FILE, "MultipartFile")
+ );
private static final Map IMPORT_TYPE_MAPPINGS = Map.ofEntries(
new SimpleImmutableEntry<>(TypeConstants.OBJECT, "java.util.Object"),
new SimpleImmutableEntry<>(TypeConstants.ARRAY, "java.util.List"),
new SimpleImmutableEntry<>(TypeConstants.MAP, "java.util.Map"),
new SimpleImmutableEntry<>(TypeConstants.BIG_DECIMAL, "java.math.BigDecimal"),
- new SimpleImmutableEntry<>(TypeConstants.STRING, "java.util.String"),
+ new SimpleImmutableEntry<>(TypeConstants.STRING, "java.lang.String"),
new SimpleImmutableEntry<>(TypeConstants.LOCALDATE, "java.time.LocalDate"),
new SimpleImmutableEntry<>(TypeConstants.LOCALDATETIME, "java.time.LocalDateTime"),
new SimpleImmutableEntry<>(TypeConstants.ZONEDDATE, "java.time." + ZONED_DATE_TIME),
@@ -52,32 +54,32 @@ public class SchemaFieldObjectType {
new SimpleImmutableEntry<>(TypeConstants.OFFSETDATE, "java.time." + OFFSET_DATE_TIME),
new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, "java.time." + OFFSET_DATE_TIME),
new SimpleImmutableEntry<>(TypeConstants.MULTIPART_FILE, "MultipartFile")
- );
+ );
private static final Map IMPL_TYPE_MAPPINGS = Map.ofEntries(
- new SimpleImmutableEntry<>(TypeConstants.OBJECT, "Object"),
- new SimpleImmutableEntry<>(TypeConstants.ARRAY, "ArrayList>"),
- new SimpleImmutableEntry<>(TypeConstants.MAP, "HashMap"),
- new SimpleImmutableEntry<>(TypeConstants.BIG_DECIMAL, "BigDecimal"),
- new SimpleImmutableEntry<>(TypeConstants.INTEGER, "Integer"),
- new SimpleImmutableEntry<>(TypeConstants.DOUBLE, "Double"),
- new SimpleImmutableEntry<>(TypeConstants.FLOAT, "Float"),
- new SimpleImmutableEntry<>(TypeConstants.LONG, "Long"),
- new SimpleImmutableEntry<>(TypeConstants.STRING, "String"),
- new SimpleImmutableEntry<>(TypeConstants.ENUM, "Enum"),
- new SimpleImmutableEntry<>(TypeConstants.LOCALDATE, "LocalDate"),
- new SimpleImmutableEntry<>(TypeConstants.LOCALDATETIME, "LocalDateTime"),
- new SimpleImmutableEntry<>(TypeConstants.ZONEDDATE, ZONED_DATE_TIME),
- new SimpleImmutableEntry<>(TypeConstants.ZONEDDATETIME, ZONED_DATE_TIME),
- new SimpleImmutableEntry<>(TypeConstants.OFFSETDATE, OFFSET_DATE_TIME),
- new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, OFFSET_DATE_TIME),
- new SimpleImmutableEntry<>(TypeConstants.MULTIPART_FILE, "MultipartFile")
- );
-
- private SchemaFieldObjectType innerType;
+ new SimpleImmutableEntry<>(TypeConstants.OBJECT, "Object"),
+ new SimpleImmutableEntry<>(TypeConstants.ARRAY, "ArrayList>"),
+ new SimpleImmutableEntry<>(TypeConstants.MAP, "HashMap"),
+ new SimpleImmutableEntry<>(TypeConstants.BIG_DECIMAL, "BigDecimal"),
+ new SimpleImmutableEntry<>(TypeConstants.INTEGER, "Integer"),
+ new SimpleImmutableEntry<>(TypeConstants.DOUBLE, "Double"),
+ new SimpleImmutableEntry<>(TypeConstants.FLOAT, "Float"),
+ new SimpleImmutableEntry<>(TypeConstants.LONG, "Long"),
+ new SimpleImmutableEntry<>(TypeConstants.STRING, "String"),
+ new SimpleImmutableEntry<>(TypeConstants.ENUM, "Enum"),
+ new SimpleImmutableEntry<>(TypeConstants.LOCALDATE, "LocalDate"),
+ new SimpleImmutableEntry<>(TypeConstants.LOCALDATETIME, "LocalDateTime"),
+ new SimpleImmutableEntry<>(TypeConstants.ZONEDDATE, ZONED_DATE_TIME),
+ new SimpleImmutableEntry<>(TypeConstants.ZONEDDATETIME, ZONED_DATE_TIME),
+ new SimpleImmutableEntry<>(TypeConstants.OFFSETDATE, OFFSET_DATE_TIME),
+ new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, OFFSET_DATE_TIME),
+ new SimpleImmutableEntry<>(TypeConstants.MULTIPART_FILE, "MultipartFile")
+ );
private final String baseType;
+ private SchemaFieldObjectType innerType;
+
public SchemaFieldObjectType(final String baseType, final SchemaFieldObjectType innerType) {
this.innerType = innerType;
this.baseType = baseType;
@@ -100,6 +102,10 @@ public static SchemaFieldObjectType fromTypeList(final String... types) {
return result;
}
+ public void setDeepType(final String type) {
+ setDeepType(new SchemaFieldObjectType(type));
+ }
+
public void setDeepType(final SchemaFieldObjectType type) {
SchemaFieldObjectType parentType = this;
while (Objects.nonNull(parentType.innerType)) {
@@ -109,10 +115,6 @@ public void setDeepType(final SchemaFieldObjectType type) {
parentType.innerType = type;
}
- public void setDeepType(final String type) {
- setDeepType(new SchemaFieldObjectType(type));
- }
-
public boolean containsType(final String type) {
return type.equalsIgnoreCase(baseType) || Objects.nonNull(innerType) && innerType.containsType(type);
}
@@ -135,7 +137,7 @@ public String getImplementationTypeString() {
private String innerGetClassString() {
final String baseString = TypeConstants.OBJECT.equals(baseType) && Objects.nonNull(innerType) ? innerType.innerGetClassString()
- : TYPE_MAPPINGS.getOrDefault(baseType, baseType);
+ : TYPE_MAPPINGS.getOrDefault(baseType, baseType);
return baseString.split("<")[0];
}
@@ -150,8 +152,8 @@ public String getVariableNameString() {
}
@Override
- public String toString() {
- return mapIntoString(TYPE_MAPPINGS);
+ public int hashCode() {
+ return Objects.hash(Objects.isNull(innerType) ? 0 : innerType.hashCode(), baseType);
}
@Override
@@ -167,8 +169,8 @@ public boolean equals(final Object obj) {
}
@Override
- public int hashCode() {
- return Objects.hash(Objects.isNull(innerType) ? 0 : innerType.hashCode(), baseType);
+ public String toString() {
+ return mapIntoString(TYPE_MAPPINGS);
}
public String getImportName() {
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaObject.java
index a3ddc3f2..a8576ef1 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaObject.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaObject.java
@@ -4,6 +4,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -17,44 +18,44 @@
@EqualsAndHashCode(of = {"schemaName", "className"})
public class SchemaObject {
- private boolean isEnum;
+ private boolean isEnum;
- private String schemaName;
+ private String schemaName;
- private String className;
+ private String className;
- private List importList;
+ private List importList;
- private Set fieldObjectList;
+ private Set fieldObjectList;
- private String schemaCombinator;
+ private String schemaCombinator;
- private String parentPackage;
+ private String parentPackage;
- public static final class SchemaObjectBuilder {
+ public static final class SchemaObjectBuilder {
- private final List importList = new ArrayList<>();
+ private final List importList = new ArrayList<>();
- private final Set fieldObjectList = new HashSet<>();
+ private final Set fieldObjectList = new HashSet<>();
- public SchemaObjectBuilder importList(final List importList) {
- this.importList.addAll(importList);
- return this;
- }
+ public SchemaObjectBuilder importList(final List importList) {
+ this.importList.addAll(importList);
+ return this;
+ }
- public SchemaObjectBuilder importItem(final String importItem) {
- this.importList.add(importItem);
- return this;
- }
+ public SchemaObjectBuilder importItem(final String importItem) {
+ this.importList.add(importItem);
+ return this;
+ }
- public SchemaObjectBuilder fieldObjectList(final Set fieldObjectList) {
- this.fieldObjectList.addAll(fieldObjectList);
- return this;
- }
+ public SchemaObjectBuilder fieldObjectList(final Set fieldObjectList) {
+ this.fieldObjectList.addAll(fieldObjectList);
+ return this;
+ }
- public SchemaObjectBuilder fieldObject(final SchemaFieldObject fieldObject) {
- this.fieldObjectList.add(fieldObject);
- return this;
- }
+ public SchemaObjectBuilder fieldObject(final SchemaFieldObject fieldObject) {
+ this.fieldObjectList.add(fieldObject);
+ return this;
}
+ }
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/TypeConstants.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/TypeConstants.java
index e713f6d3..a4fd82a7 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/TypeConstants.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/TypeConstants.java
@@ -73,6 +73,7 @@ public final class TypeConstants {
ZONEDDATETIME,
OFFSETDATE,
OFFSETDATETIME);
+
public static final Set ALL_TYPES = Set.of(
NUMBER,
BOOLEAN,
@@ -91,8 +92,8 @@ public final class TypeConstants {
ZONEDDATETIME,
OFFSETDATE,
OFFSETDATETIME,
- MULTIPART_FILE
- );
+ MULTIPART_FILE
+ );
private TypeConstants() {
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/template/CommonTemplateFactory.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/template/CommonTemplateFactory.java
index e5895ac1..9b4c4dd4 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/template/CommonTemplateFactory.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/template/CommonTemplateFactory.java
@@ -1,5 +1,20 @@
package com.sngular.api.generator.plugin.common.template;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
import com.sngular.api.generator.plugin.asyncapi.exception.FileSystemException;
import com.sngular.api.generator.plugin.asyncapi.parameter.OperationParameterObject;
import com.sngular.api.generator.plugin.asyncapi.template.ClassTemplate;
@@ -14,15 +29,6 @@
import freemarker.template.TemplateExceptionHandler;
import org.apache.commons.lang3.StringUtils;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.*;
-
public abstract class CommonTemplateFactory {
private static final List BASIC_DATA_TYPES = List.of("Integer", "Long", "Float", "Double", "Boolean", "String", "Char", "Byte", "Short");
@@ -35,6 +41,8 @@ public abstract class CommonTemplateFactory {
private static final String FILE_TYPE_JAVA = ".java";
+ protected boolean generateExceptionTemplate;
+
private final Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
private final Map root = new HashMap<>();
@@ -51,13 +59,12 @@ public abstract class CommonTemplateFactory {
private final File baseDir;
- protected boolean generateExceptionTemplate;
-
- protected CommonTemplateFactory(boolean checkOverwrite,
- final File targetFolder,
- final String processedGeneratedSourcesFolder,
- final File baseDir,
- final CommonTemplateLoader classpathTemplateLoader) {
+ protected CommonTemplateFactory(
+ boolean checkOverwrite,
+ final File targetFolder,
+ final String processedGeneratedSourcesFolder,
+ final File baseDir,
+ final CommonTemplateLoader classpathTemplateLoader) {
this.checkOverwrite = checkOverwrite;
cfg.setTemplateLoader(classpathTemplateLoader);
cfg.setDefaultEncoding("UTF-8");
@@ -66,41 +73,19 @@ protected CommonTemplateFactory(boolean checkOverwrite,
cfg.setAPIBuiltinEnabled(true);
addToRoot("checkBasicTypes", BASIC_DATA_TYPES);
this.targetFolder = targetFolder;
- this.targetFileFilter = (dir, name) -> name.toLowerCase().contains(targetFolder.toPath().getFileName().toString());
+ this.targetFileFilter = (dir, name) -> name.toLowerCase().contains(targetFolder.toPath().getFileName().toString());
this.processedGeneratedSourcesFolder = processedGeneratedSourcesFolder;
this.baseDir = baseDir;
}
- private static String getTemplateName(ClassTemplate classTemplate) {
- String templateName;
- if (classTemplate.getClassSchema().isEnum()) {
- templateName = CommonTemplateIndexConstants.TEMPLATE_CONTENT_ENUM;
- } else {
- templateName = classTemplate.isUseLombok() ? CommonTemplateIndexConstants.TEMPLATE_CONTENT_SCHEMA_LOMBOK : CommonTemplateIndexConstants.TEMPLATE_CONTENT_SCHEMA;
- }
- return templateName;
- }
-
- private ClassTemplate getClassTemplate() {
- ClassTemplate ourClassTemplate = null;
- final var classTemplateListIt = classTemplateList.iterator();
- while (Objects.isNull(ourClassTemplate) && classTemplateListIt.hasNext()) {
- final var classTemplate = classTemplateListIt.next();
- if (classTemplate.getFilePath().endsWith("schemas")) {
- ourClassTemplate = classTemplate;
- }
- }
- if (ourClassTemplate == null) {
- ourClassTemplate = classTemplateList.get(0);
- }
-
- return ourClassTemplate;
+ protected void addToRoot(final String key, final Object value) {
+ root.put(key, value);
}
protected void generateTemplates() {
final String exceptionPackage;
- if (Boolean.TRUE.equals(generateExceptionTemplate)) {
+ if (generateExceptionTemplate) {
exceptionPackage = getClassTemplate().getModelPackage();
} else {
exceptionPackage = null;
@@ -109,7 +94,7 @@ protected void generateTemplates() {
classTemplateList.forEach(classTemplate -> {
try {
fillTemplates(classTemplate.getPropertiesPath(), classTemplate.getModelPackage(),
- fillTemplateSchema(classTemplate, exceptionPackage));
+ fillTemplateSchema(classTemplate, exceptionPackage));
if (generateExceptionTemplate) {
fillTemplateModelClassException(classTemplate.getModelPackage());
}
@@ -119,10 +104,20 @@ protected void generateTemplates() {
});
}
- protected void fillTemplate(final String filePathToSave, final String className, final String templateName) throws IOException {
- final var fileToSave = Paths.get(filePathToSave);
- fileToSave.toFile().mkdirs();
- writeTemplateToFile(templateName, fileToSave, className);
+ private ClassTemplate getClassTemplate() {
+ ClassTemplate ourClassTemplate = null;
+ final var classTemplateListIt = classTemplateList.iterator();
+ while (Objects.isNull(ourClassTemplate) && classTemplateListIt.hasNext()) {
+ final var classTemplate = classTemplateListIt.next();
+ if (classTemplate.getFilePath().endsWith("schemas")) {
+ ourClassTemplate = classTemplate;
+ }
+ }
+ if (ourClassTemplate == null) {
+ ourClassTemplate = classTemplateList.get(0);
+ }
+
+ return ourClassTemplate;
}
@SuppressWarnings("checkstyle:CyclomaticComplexity")
@@ -131,51 +126,51 @@ protected void fillTemplates(final Path filePathToSave, final String modelPackag
switch (current) {
case "Size":
fillTemplateCustom(filePathToSave, modelPackage, "Size", CommonTemplateIndexConstants.TEMPLATE_SIZE_ANNOTATION, "SizeValidator",
- CommonTemplateIndexConstants.TEMPLATE_SIZE_VALIDATOR_ANNOTATION);
+ CommonTemplateIndexConstants.TEMPLATE_SIZE_VALIDATOR_ANNOTATION);
break;
case "Pattern":
fillTemplateCustom(filePathToSave, modelPackage, "Pattern", CommonTemplateIndexConstants.TEMPLATE_PATTERN_ANNOTATION,
- "PatternValidator", CommonTemplateIndexConstants.TEMPLATE_PATTERN_VALIDATOR_ANNOTATION);
+ "PatternValidator", CommonTemplateIndexConstants.TEMPLATE_PATTERN_VALIDATOR_ANNOTATION);
break;
case "MultipleOf":
fillTemplateCustom(filePathToSave, modelPackage, "MultipleOf", CommonTemplateIndexConstants.TEMPLATE_MULTIPLEOF_ANNOTATION,
- "MultipleOfValidator", CommonTemplateIndexConstants.TEMPLATE_MULTIPLEOF_VALIDATOR_ANNOTATION);
+ "MultipleOfValidator", CommonTemplateIndexConstants.TEMPLATE_MULTIPLEOF_VALIDATOR_ANNOTATION);
break;
case "Maximum":
fillTemplateCustom(filePathToSave, modelPackage, "MaxInteger", CommonTemplateIndexConstants.TEMPLATE_MAX_INTEGER_ANNOTATION,
- "MaxIntegerValidator", CommonTemplateIndexConstants.TEMPLATE_MAX_INTEGER_VALIDATOR_ANNOTATION);
+ "MaxIntegerValidator", CommonTemplateIndexConstants.TEMPLATE_MAX_INTEGER_VALIDATOR_ANNOTATION);
fillTemplateCustom(filePathToSave, modelPackage, "MaxBigDecimal", CommonTemplateIndexConstants.TEMPLATE_MAX_BIG_DECIMAL_ANNOTATION,
- "MaxBigDecimalValidator", CommonTemplateIndexConstants.TEMPLATE_MAX_BIG_DECIMAL_VALIDATOR_ANNOTATION);
+ "MaxBigDecimalValidator", CommonTemplateIndexConstants.TEMPLATE_MAX_BIG_DECIMAL_VALIDATOR_ANNOTATION);
fillTemplateCustom(filePathToSave, modelPackage, "MaxDouble", CommonTemplateIndexConstants.TEMPLATE_MAX_DOUBLE_ANNOTATION,
- "MaxDoubleValidator", CommonTemplateIndexConstants.TEMPLATE_MAX_DOUBLE_VALIDATOR_ANNOTATION);
+ "MaxDoubleValidator", CommonTemplateIndexConstants.TEMPLATE_MAX_DOUBLE_VALIDATOR_ANNOTATION);
fillTemplateCustom(filePathToSave, modelPackage, "MaxFloat", CommonTemplateIndexConstants.TEMPLATE_MAX_FLOAT_ANNOTATION,
- "MaxFloatValidator", CommonTemplateIndexConstants.TEMPLATE_MAX_FLOAT_VALIDATOR_ANNOTATION);
+ "MaxFloatValidator", CommonTemplateIndexConstants.TEMPLATE_MAX_FLOAT_VALIDATOR_ANNOTATION);
break;
case "Minimum":
fillTemplateCustom(filePathToSave, modelPackage, "MinInteger", CommonTemplateIndexConstants.TEMPLATE_MIN_INTEGER_ANNOTATION,
- "MinIntegerValidator", CommonTemplateIndexConstants.TEMPLATE_MIN_INTEGER_VALIDATOR_ANNOTATION);
+ "MinIntegerValidator", CommonTemplateIndexConstants.TEMPLATE_MIN_INTEGER_VALIDATOR_ANNOTATION);
fillTemplateCustom(filePathToSave, modelPackage, "MinDouble", CommonTemplateIndexConstants.TEMPLATE_MIN_DOUBLE_ANNOTATION,
- "MinDoubleValidator", CommonTemplateIndexConstants.TEMPLATE_MIN_DOUBLE_VALIDATOR_ANNOTATION);
+ "MinDoubleValidator", CommonTemplateIndexConstants.TEMPLATE_MIN_DOUBLE_VALIDATOR_ANNOTATION);
fillTemplateCustom(filePathToSave, modelPackage, "MinFloat", CommonTemplateIndexConstants.TEMPLATE_MIN_FLOAT_ANNOTATION,
- "MinFloatValidator", CommonTemplateIndexConstants.TEMPLATE_MIN_FLOAT_VALIDATOR_ANNOTATION);
+ "MinFloatValidator", CommonTemplateIndexConstants.TEMPLATE_MIN_FLOAT_VALIDATOR_ANNOTATION);
fillTemplateCustom(filePathToSave, modelPackage, "MinBigDecimal", CommonTemplateIndexConstants.TEMPLATE_MIN_BIG_DECIMAL_ANNOTATION,
- "MinBigDecimalValidator", CommonTemplateIndexConstants.TEMPLATE_MIN_BIG_DECIMAL_VALIDATOR_ANNOTATION);
+ "MinBigDecimalValidator", CommonTemplateIndexConstants.TEMPLATE_MIN_BIG_DECIMAL_VALIDATOR_ANNOTATION);
break;
case "MaxItems":
fillTemplateCustom(filePathToSave, modelPackage, "MaxItems", CommonTemplateIndexConstants.TEMPLATE_MAX_ITEMS_ANNOTATION,
- "MaxItemsValidator", CommonTemplateIndexConstants.TEMPLATE_MAX_ITEMS_VALIDATOR_ANNOTATION);
+ "MaxItemsValidator", CommonTemplateIndexConstants.TEMPLATE_MAX_ITEMS_VALIDATOR_ANNOTATION);
break;
case "MinItems":
fillTemplateCustom(filePathToSave, modelPackage, "MinItems", CommonTemplateIndexConstants.TEMPLATE_MIN_ITEMS_ANNOTATION,
- "MinItemsValidator", CommonTemplateIndexConstants.TEMPLATE_MIN_ITEMS_VALIDATOR_ANNOTATION);
+ "MinItemsValidator", CommonTemplateIndexConstants.TEMPLATE_MIN_ITEMS_VALIDATOR_ANNOTATION);
break;
case "NotNull":
fillTemplateCustom(filePathToSave, modelPackage, "NotNull", CommonTemplateIndexConstants.TEMPLATE_NOT_NULL_ANNOTATION,
- "NotNullValidator", CommonTemplateIndexConstants.TEMPLATE_NOT_NULL_VALIDATOR_ANNOTATION);
+ "NotNullValidator", CommonTemplateIndexConstants.TEMPLATE_NOT_NULL_VALIDATOR_ANNOTATION);
break;
case "UniqueItems":
fillTemplateCustom(filePathToSave, modelPackage, "UniqueItems", CommonTemplateIndexConstants.TEMPLATE_UNIQUE_ITEMS_ANNOTATION,
- "UniqueItemsValidator", CommonTemplateIndexConstants.TEMPLATE_UNIQUE_ITEMS_VALIDATOR_ANNOTATION);
+ "UniqueItemsValidator", CommonTemplateIndexConstants.TEMPLATE_UNIQUE_ITEMS_VALIDATOR_ANNOTATION);
break;
default:
break;
@@ -185,7 +180,7 @@ protected void fillTemplates(final Path filePathToSave, final String modelPackag
@SuppressWarnings("checkstyle:CyclomaticComplexity")
private Set fillTemplateSchema(final ClassTemplate classTemplate, final String exceptionPackage)
- throws IOException {
+ throws IOException {
final var propertiesSet = new HashSet();
final var schemaObject = classTemplate.getClassSchema();
final var filePath = classTemplate.getFilePath();
@@ -201,7 +196,7 @@ private Set fillTemplateSchema(final ClassTemplate classTemplate, final
fillTemplate(filePath.toString(), schemaObject.getClassName(), templateName);
for (SchemaFieldObject fieldObject : schemaObject.getFieldObjectList()) {
propertiesSet.addAll(fieldObject.getRestrictions().getProperties());
- if (fieldObject.isRequired() && Boolean.FALSE.equals(classTemplate.isUseLombok())) {
+ if (fieldObject.isRequired() && !classTemplate.isUseLombok()) {
propertiesSet.add("NotNull");
}
}
@@ -214,10 +209,6 @@ public final void fillTemplateModelClassException(final String modelPackage) thr
writeTemplateToFile(CommonTemplateIndexConstants.TEMPLATE_MODEL_EXCEPTION, MapperUtil.packageToFolder(modelPackage) + SLASH + "exception", "ModelClassException");
}
- public void setNotGenerateTemplate() {
- this.generateExceptionTemplate = false;
- }
-
private void fillTemplateCustom(
final Path filePathToSave, final String modelPackage, final String fileNameAnnotation, final String templateAnnotation,
final String fileNameValidator, final String templateValidator) throws IOException {
@@ -230,46 +221,20 @@ private void fillTemplateCustom(
writeTemplateToFile(templateValidator, pathToCustomValidatorPackage, fileNameValidator);
}
- protected void addToRoot(final String key, final Object value) {
- root.put(key, value);
- }
-
- protected void delFromRoot(final String key) {
- root.remove(key);
- }
-
- protected void addToRoot(final Map propertiesSet) {
- root.putAll(propertiesSet);
- }
-
- protected void cleanData() {
- clearRoot();
- addToRoot("checkBasicTypes", BASIC_DATA_TYPES);
- classTemplateList.clear();
- generateExceptionTemplate = false;
+ private static String getTemplateName(ClassTemplate classTemplate) {
+ String templateName;
+ if (classTemplate.getClassSchema().isEnum()) {
+ templateName = CommonTemplateIndexConstants.TEMPLATE_CONTENT_ENUM;
+ } else {
+ templateName = classTemplate.isUseLombok() ? CommonTemplateIndexConstants.TEMPLATE_CONTENT_SCHEMA_LOMBOK : CommonTemplateIndexConstants.TEMPLATE_CONTENT_SCHEMA;
+ }
+ return templateName;
}
- protected abstract void clearRoot();
-
- public final void addSchemaObject(final String modelPackage,
- final String keyClassName,
- final SchemaObject schemaObject,
- final String destinationPackage,
- final boolean useLombok) {
- final var filePath = processPath(getPath(destinationPackage));
- final var propertiesPath = processPath(getPath(modelPackage));
- final var builder = ClassTemplate
- .builder()
- .filePath(filePath)
- .modelPackage(modelPackage)
- .className(schemaObject.getClassName())
- .classSchema(schemaObject)
- .propertiesPath(propertiesPath)
- .useLombok(useLombok);
- if (Objects.nonNull(keyClassName)) {
- builder.keyClassName(keyClassName);
- }
- classTemplateList.add(builder.build());
+ protected void fillTemplate(final String filePathToSave, final String className, final String templateName) throws IOException {
+ final var fileToSave = Paths.get(filePathToSave);
+ fileToSave.toFile().mkdirs();
+ writeTemplateToFile(templateName, fileToSave, className);
}
protected void writeTemplateToFile(final String templateName, final String apiPackage, final String partialPath) throws IOException {
@@ -313,6 +278,53 @@ public Path processPath(final String packagePath) {
return path;
}
+ protected String getPath(final String pathName) {
+ return processedGeneratedSourcesFolder + SLASH + pathName.replace(PACKAGE_SEPARATOR_STR, SLASH);
+ }
+
+ public void setNotGenerateTemplate() {
+ this.generateExceptionTemplate = false;
+ }
+
+ protected void delFromRoot(final String key) {
+ root.remove(key);
+ }
+
+ protected void addToRoot(final Map propertiesSet) {
+ root.putAll(propertiesSet);
+ }
+
+ protected void cleanData() {
+ clearRoot();
+ addToRoot("checkBasicTypes", BASIC_DATA_TYPES);
+ classTemplateList.clear();
+ generateExceptionTemplate = false;
+ }
+
+ protected abstract void clearRoot();
+
+ public final void addSchemaObject(
+ final String modelPackage,
+ final String keyClassName,
+ final SchemaObject schemaObject,
+ final String destinationPackage,
+ final boolean useLombok) {
+ final var filePath = processPath(getPath(destinationPackage));
+ final var propertiesPath = processPath(getPath(modelPackage));
+ final var builder = ClassTemplate
+ .builder()
+ .filePath(filePath)
+ .modelPackage(modelPackage)
+ .className(schemaObject.getClassName())
+ .classSchema(schemaObject)
+ .propertiesPath(propertiesPath)
+ .useLombok(useLombok);
+ if (Objects.nonNull(keyClassName)) {
+ builder.keyClassName(keyClassName);
+ }
+ classTemplateList.add(builder.build());
+ }
+
protected String convertPackageToTargetPath(final OperationParameterObject operationParameter, final String defaultApiPackage) {
String path = null;
if (Objects.nonNull(operationParameter)) {
@@ -325,10 +337,6 @@ protected String convertPackageToTargetPath(final OperationParameterObject opera
return StringUtils.replace(path, "//", SLASH);
}
- protected String getPath(final String pathName) {
- return processedGeneratedSourcesFolder + SLASH + pathName.replace(PACKAGE_SEPARATOR_STR, SLASH);
- }
-
public void checkRequiredOrCombinatorExists(final SchemaObject schema, final boolean useLombok) {
if ("anyOf".equals(schema.getSchemaCombinator()) || "oneOf".equals(schema.getSchemaCombinator())) {
generateExceptionTemplate = true;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/template/CommonTemplateLoader.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/template/CommonTemplateLoader.java
index c92b96c5..5deb6de9 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/template/CommonTemplateLoader.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/template/CommonTemplateLoader.java
@@ -1,8 +1,5 @@
package com.sngular.api.generator.plugin.common.template;
-import com.sngular.api.generator.plugin.openapi.template.ClasspathTemplateLoader;
-import freemarker.cache.TemplateLoader;
-
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
@@ -11,37 +8,50 @@
import java.util.List;
import java.util.Map;
+import com.sngular.api.generator.plugin.openapi.template.ClasspathTemplateLoader;
+import freemarker.cache.TemplateLoader;
public abstract class CommonTemplateLoader implements TemplateLoader {
- private final Map templatesMap = new HashMap<>();
-
protected static final ClassLoader LOADER = ClasspathTemplateLoader.class.getClassLoader();
protected static final List TEMPLATE_MODEL_FILES = List.of(CommonTemplateIndexConstants.TEMPLATE_CONTENT_SCHEMA,
- CommonTemplateIndexConstants.TEMPLATE_CONTENT_ENUM, CommonTemplateIndexConstants.TEMPLATE_CONTENT_SCHEMA_LOMBOK, CommonTemplateIndexConstants.TEMPLATE_MODEL_EXCEPTION);
+ CommonTemplateIndexConstants.TEMPLATE_CONTENT_ENUM,
+ CommonTemplateIndexConstants.TEMPLATE_CONTENT_SCHEMA_LOMBOK,
+ CommonTemplateIndexConstants.TEMPLATE_MODEL_EXCEPTION);
protected static final List TEMPLATE_ANNOTATION_FILES = List.of(CommonTemplateIndexConstants.TEMPLATE_NOT_NULL_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_NOT_NULL_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MAX_INTEGER_ANNOTATION, CommonTemplateIndexConstants.TEMPLATE_MAX_INTEGER_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MAX_BIG_DECIMAL_ANNOTATION, CommonTemplateIndexConstants.TEMPLATE_MAX_BIG_DECIMAL_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MAX_DOUBLE_ANNOTATION, CommonTemplateIndexConstants.TEMPLATE_MAX_DOUBLE_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MAX_FLOAT_ANNOTATION, CommonTemplateIndexConstants.TEMPLATE_MAX_FLOAT_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MIN_INTEGER_ANNOTATION, CommonTemplateIndexConstants.TEMPLATE_MIN_INTEGER_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MIN_DOUBLE_ANNOTATION, CommonTemplateIndexConstants.TEMPLATE_MIN_DOUBLE_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MIN_FLOAT_ANNOTATION, CommonTemplateIndexConstants.TEMPLATE_MIN_FLOAT_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MIN_BIG_DECIMAL_ANNOTATION, CommonTemplateIndexConstants.TEMPLATE_MIN_BIG_DECIMAL_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_SIZE_ANNOTATION, CommonTemplateIndexConstants.TEMPLATE_SIZE_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_PATTERN_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_PATTERN_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MULTIPLEOF_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MULTIPLEOF_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MAX_ITEMS_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MAX_ITEMS_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MIN_ITEMS_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_MIN_ITEMS_VALIDATOR_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_UNIQUE_ITEMS_ANNOTATION,
- CommonTemplateIndexConstants.TEMPLATE_UNIQUE_ITEMS_VALIDATOR_ANNOTATION);
+ CommonTemplateIndexConstants.TEMPLATE_NOT_NULL_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MAX_INTEGER_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MAX_INTEGER_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MAX_BIG_DECIMAL_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MAX_BIG_DECIMAL_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MAX_DOUBLE_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MAX_DOUBLE_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MAX_FLOAT_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MAX_FLOAT_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MIN_INTEGER_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MIN_INTEGER_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MIN_DOUBLE_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MIN_DOUBLE_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MIN_FLOAT_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MIN_FLOAT_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MIN_BIG_DECIMAL_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MIN_BIG_DECIMAL_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_SIZE_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_SIZE_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_PATTERN_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_PATTERN_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MULTIPLEOF_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MULTIPLEOF_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MAX_ITEMS_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MAX_ITEMS_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MIN_ITEMS_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_MIN_ITEMS_VALIDATOR_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_UNIQUE_ITEMS_ANNOTATION,
+ CommonTemplateIndexConstants.TEMPLATE_UNIQUE_ITEMS_VALIDATOR_ANNOTATION);
+
+ private final Map templatesMap = new HashMap<>();
protected CommonTemplateLoader() {
@@ -55,7 +65,6 @@ protected void init(final Map resourceFiles) {
templatesMap.putAll(resourceFiles);
}
-
@Override
public final Object findTemplateSource(final String templateName) {
return templatesMap.get(templateName);
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ApiTool.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ApiTool.java
index 112544d6..11333ecf 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ApiTool.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ApiTool.java
@@ -1,5 +1,20 @@
package com.sngular.api.generator.plugin.common.tools;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
@@ -11,14 +26,6 @@
import org.apache.commons.collections4.Transformer;
import org.apache.commons.lang3.StringUtils;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.*;
-import java.util.Map.Entry;
-
public final class ApiTool {
public static final String FORMAT = "format";
@@ -28,6 +35,7 @@ public final class ApiTool {
public static final String ANY_OF = "anyOf";
public static final String ONE_OF = "oneOf";
+
public static final String COMPONENTS = "components";
public static final String SCHEMAS = "schemas";
@@ -45,14 +53,14 @@ public final class ApiTool {
private ApiTool() {
}
- public static String getType(final JsonNode schema) {
- return hasType(schema) ? StringUtils.defaultIfEmpty(getNodeAsString(schema, "type"), "") : "";
- }
-
public static Iterator> getProperties(final JsonNode schema) {
return getNode(schema, "properties").fields();
}
+ public static JsonNode getNode(final JsonNode schema, final String nodeName) {
+ return schema.get(nodeName);
+ }
+
public static String getRefValue(final JsonNode schema) {
return getNode(schema, "$ref").textValue();
}
@@ -65,6 +73,14 @@ public static String getFormat(final JsonNode schema) {
return getNodeAsString(schema, FORMAT);
}
+ public static String getNodeAsString(final JsonNode schema, final String nodeName) {
+ return hasNode(schema, nodeName) ? getNode(schema, nodeName).textValue() : null;
+ }
+
+ public static boolean hasNode(final JsonNode schema, final String nodeName) {
+ return Objects.nonNull(schema) && schema.has(nodeName);
+ }
+
public static JsonNode getAllOf(final JsonNode schema) {
return getNode(schema, ALL_OF);
}
@@ -77,10 +93,6 @@ public static JsonNode getOneOf(final JsonNode schema) {
return getNode(schema, ONE_OF);
}
- public static JsonNode getNode(final JsonNode schema, final String nodeName) {
- return schema.get(nodeName);
- }
-
public static boolean getNodeAsBoolean(final JsonNode schema, final String nodeName) {
return hasNode(schema, nodeName) && getNode(schema, nodeName).booleanValue();
}
@@ -89,8 +101,22 @@ public static Object getNodeAsObject(final JsonNode schema, final String nodeNam
return hasNode(schema, nodeName) ? getNodeAsType(getNode(schema, nodeName)) : null;
}
- public static String getNodeAsString(final JsonNode schema, final String nodeName) {
- return hasNode(schema, nodeName) ? getNode(schema, nodeName).textValue() : null;
+ private static Object getNodeAsType(final JsonNode node) {
+ final Object result;
+ if (node.isBigDecimal()) {
+ result = BigDecimal.valueOf(node.asDouble());
+ } else if (node.isBigInteger()) {
+ result = BigInteger.valueOf(node.asLong());
+ } else if (node.isBoolean()) {
+ result = node.asBoolean();
+ } else if (node.isFloat() || node.isDouble()) {
+ result = node.asDouble();
+ } else if (node.isInt() || node.isNumber()) {
+ result = node.asInt();
+ } else {
+ result = node.asText();
+ }
+ return result;
}
public static String getNodeAsString(final JsonNode schema) {
@@ -103,7 +129,7 @@ public static Iterator> getFieldIterator(final JsonNode
public static Iterator> getFieldIterator(final JsonNode schema, final String nodeName) {
return Objects.isNull(schema) || !hasNode(schema, nodeName) ?
- IteratorUtils.emptyIterator() : getNode(schema, nodeName).fields();
+ IteratorUtils.emptyIterator() : getNode(schema, nodeName).fields();
}
public static String getName(final JsonNode node) {
@@ -112,8 +138,12 @@ public static String getName(final JsonNode node) {
public static List getEnumValues(final JsonNode schema) {
return new ArrayList<>(CollectionUtils.collect(
- IteratorUtils.toList(schema.get("enum").elements()),
- getTextValue()));
+ IteratorUtils.toList(schema.get("enum").elements()),
+ getTextValue()));
+ }
+
+ private static Transformer getTextValue() {
+ return JsonNode::asText;
}
public static JsonNode getItems(final JsonNode schema) {
@@ -124,18 +154,6 @@ public static Map getComponentSchemas(final JsonNode openApi)
return getComponentSchemasByType(openApi, SCHEMAS);
}
- public static Map getParameterSchemas(final JsonNode openApi) {
- return getComponentSchemasByType(openApi, PARAMETERS);
- }
-
- public static Map getResponseSchemas(final JsonNode openApi) {
- return getComponentSchemasByType(openApi, RESPONSES);
- }
-
- public static Map getRequestBodySchemas(final JsonNode openApi) {
- return getComponentSchemasByType(openApi, REQUEST_BODIES);
- }
-
private static Map getComponentSchemasByType(final JsonNode openApi, final String schemaType) {
final var schemasMap = new HashMap();
@@ -144,14 +162,26 @@ private static Map getComponentSchemasByType(final JsonNode op
if (hasNode(components, schemaType)) {
final var schemas = getNode(components, schemaType);
final var schemasIt = schemas.fieldNames();
- schemasIt.forEachRemaining(name -> schemasMap.put(schemaType.toUpperCase() + "/"+ StringCaseUtils.titleToSnakeCase(name),
- getNode(schemas, name)));
+ schemasIt.forEachRemaining(name -> schemasMap.put(schemaType.toUpperCase() + "/" + StringCaseUtils.titleToSnakeCase(name),
+ getNode(schemas, name)));
}
}
return schemasMap;
}
+ public static Map getParameterSchemas(final JsonNode openApi) {
+ return getComponentSchemasByType(openApi, PARAMETERS);
+ }
+
+ public static Map getResponseSchemas(final JsonNode openApi) {
+ return getComponentSchemasByType(openApi, RESPONSES);
+ }
+
+ public static Map getRequestBodySchemas(final JsonNode openApi) {
+ return getComponentSchemasByType(openApi, REQUEST_BODIES);
+ }
+
public static Map getComponentSecuritySchemes(final JsonNode openApi) {
return getComponentSchemasByType(openApi, "securitySchemes");
}
@@ -185,17 +215,16 @@ public static String getNumberType(final JsonNode schema) {
return type;
}
- public static boolean hasItems(final JsonNode schema) {
- return hasNode(schema, "items");
+ public static boolean hasType(final JsonNode schema) {
+ return hasNode(schema, "type");
}
- public static boolean hasNode(final JsonNode schema, final String nodeName) {
- return Objects.nonNull(schema) && schema.has(nodeName);
+ public static String getType(final JsonNode schema) {
+ return hasType(schema) ? StringUtils.defaultIfEmpty(getNodeAsString(schema, "type"), "") : "";
}
- public static boolean hasField(final JsonNode schema, final String... fieldNameArray) {
- final var nodeNamesList = Arrays.asList(fieldNameArray);
- return StringUtils.isNotEmpty(IteratorUtils.find(schema.fieldNames(), nodeNamesList::contains));
+ public static boolean hasItems(final JsonNode schema) {
+ return hasNode(schema, "items");
}
public static boolean hasRequired(final JsonNode schema) {
@@ -206,10 +235,6 @@ public static boolean hasName(JsonNode message) {
return hasNode(message, "name");
}
- public static boolean hasType(final JsonNode schema) {
- return hasNode(schema, "type");
- }
-
public static boolean hasRef(final JsonNode schema) {
return (hasNode(schema, "$ref") || schema.fieldNames().hasNext()) && schema.fieldNames().next().equals("$ref");
}
@@ -238,6 +263,11 @@ public static boolean isComposed(final JsonNode schema) {
return ApiTool.hasField(schema, ANY_OF, ALL_OF, ONE_OF);
}
+ public static boolean hasField(final JsonNode schema, final String... fieldNameArray) {
+ final var nodeNamesList = Arrays.asList(fieldNameArray);
+ return StringUtils.isNotEmpty(IteratorUtils.find(schema.fieldNames(), nodeNamesList::contains));
+ }
+
public static boolean isString(final JsonNode schema) {
return hasType(schema) && TypeConstants.STRING.equalsIgnoreCase(getType(schema));
}
@@ -299,7 +329,6 @@ public static boolean isBinary(final JsonNode schema) {
return isMultipartFile;
}
-
public static List findContentSchemas(final JsonNode schema) {
return hasNode(schema, "content") ? schema.findValues("schema") : Collections.emptyList();
}
@@ -315,14 +344,6 @@ public static boolean checkIfRequired(final JsonNode schema, final String fieldN
return isRequired;
}
- private static Transformer getTextValue() {
- return JsonNode::asText;
- }
-
- public static boolean hasComponents(final JsonNode node) {
- return hasNode(node, COMPONENTS);
- }
-
public static Iterator> getComponent(final JsonNode node, final String componentType) {
Iterator> result = Collections.emptyIterator();
if (hasComponents(node) && hasNode(getNode(node, "components"), componentType)) {
@@ -331,15 +352,25 @@ public static Iterator> getComponent(final JsonNode node
return result;
}
+ public static boolean hasComponents(final JsonNode node) {
+ return hasNode(node, COMPONENTS);
+ }
+
public static JsonNode nodeFromFile(final FileLocation ymlParent, final String filePath, final FactoryTypeEnum factoryTypeEnum) throws IOException {
final InputStream file;
- if (filePath.startsWith(PACKAGE_SEPARATOR_STR) || filePath.matches("^\\w.*$")) {
+ // Check if path is absolute first
+ if (PathUtil.isAbsolutePath(filePath)) {
+ // For absolute paths, open directly
+ file = new FileInputStream(filePath);
+ } else if (filePath.startsWith(PACKAGE_SEPARATOR_STR) || filePath.matches("^\\w.*$")) {
+ // For relative paths starting with . or alphanumeric (package-like paths)
file = ymlParent.getFileAtLocation(filePath);
} else {
if (filePath.contains(".jar!")) {
var resource = filePath.substring(filePath.indexOf(".jar!") + 1);
file = ApiTool.class.getClassLoader().getResourceAsStream(resource);
} else {
+ // Other paths - try as file path
file = new FileInputStream(filePath);
}
}
@@ -354,24 +385,6 @@ public static JsonNode nodeFromFile(final FileLocation ymlParent, final String f
return om.readTree(file);
}
- private static Object getNodeAsType(final JsonNode node) {
- final Object result;
- if (node.isBigDecimal()) {
- result = BigDecimal.valueOf(node.asDouble());
- } else if (node.isBigInteger()) {
- result = BigInteger.valueOf(node.asLong());
- } else if (node.isBoolean()) {
- result = node.asBoolean();
- } else if (node.isFloat() || node.isDouble()) {
- result = node.asDouble();
- } else if (node.isInt() || node.isNumber()) {
- result = node.asInt();
- } else {
- result = node.asText();
- }
- return result;
- }
-
public static boolean hasConst(final JsonNode fieldBody) {
return hasNode(fieldBody, "const");
}
@@ -404,3 +417,4 @@ private static Object getValue(final JsonNode aConst) {
return value;
}
}
+
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperContentUtil.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperContentUtil.java
index bf119fcc..76a63b15 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperContentUtil.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperContentUtil.java
@@ -13,6 +13,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.sngular.api.generator.plugin.common.model.CommonSpecFile;
import com.sngular.api.generator.plugin.common.model.SchemaObject;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperUtil.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperUtil.java
index 7906d124..b7734089 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperUtil.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperUtil.java
@@ -15,6 +15,8 @@
public class MapperUtil {
+ public static final String JAVA_TIME = "java.time.";
+
private static final String REF = "$ref";
private static final String[] DIVISOR = {"/", "-", "_"};
@@ -22,9 +24,9 @@ public class MapperUtil {
private static final String SLASH = "/";
private static final String PACKAGE_SEPARATOR_STR = ".";
- public static final String JAVA_TIME = "java.time.";
- private MapperUtil() {}
+ private MapperUtil() {
+ }
public static String getSimpleType(final JsonNode schema, final CommonSpecFile specFile) {
final String type;
@@ -41,22 +43,38 @@ public static String getSimpleType(final JsonNode schema, final CommonSpecFile s
return type;
}
- public static String[] splitName(final String name) {
- return ArrayUtils.removeAllOccurrences(name.split("\\W+"), "");
+ private static boolean checkIfNumber(final String nodeType) {
+ return TypeConstants.NUMBER.equalsIgnoreCase(nodeType) || TypeConstants.INTEGER.equalsIgnoreCase(nodeType)
+ || TypeConstants.INT_32.equalsIgnoreCase(nodeType) || TypeConstants.INT_64.equalsIgnoreCase(nodeType);
}
- public static String[] splitReference(final String name) {
- if (0 < StringUtils.indexOf(name, "#")) {
- return StringUtils.split(name, "#");
- } else if (0 == StringUtils.indexOf(name, "#")) {
- return StringUtils.split(name, "#");
- } else {
- return ArrayUtils.addAll(new String[] {}, name, "");
+ private static String processNumber(final JsonNode schema) {
+
+ final var nodeType = schema.get("type").asText();
+ final var formatType = schema.has("format") ? schema.get("format").asText() : null;
+ String type = TypeConstants.INTEGER;
+ if (TypeConstants.NUMBER.equalsIgnoreCase(nodeType)) {
+ if (TypeConstants.FLOAT.equalsIgnoreCase(formatType)) {
+ type = TypeConstants.FLOAT;
+ } else if (TypeConstants.DOUBLE.equalsIgnoreCase(formatType)) {
+ type = TypeConstants.DOUBLE;
+ } else {
+ type = TypeConstants.BIG_DECIMAL;
+ }
+ } else if (TypeConstants.INTEGER.equalsIgnoreCase(nodeType)) {
+ if (TypeConstants.INT_64.equalsIgnoreCase(formatType)) {
+ type = TypeConstants.LONG;
+ } else {
+ type = TypeConstants.INTEGER;
+ }
}
+ return type;
}
- public static String packageToFolder(final String packageName) {
- return StringUtils.replace(packageName, ".", SLASH);
+ public static String getPojoName(final String namePojo, final CommonSpecFile specFile) {
+ return (StringUtils.isNotBlank(specFile.getModelNamePrefix()) ? specFile.getModelNamePrefix() : "")
+ + StringUtils.capitalize(namePojo)
+ + (StringUtils.isNotBlank(specFile.getModelNameSuffix()) ? specFile.getModelNameSuffix() : "");
}
public static String getRefSchemaName(final JsonNode parameter, String defaultSchemaName) {
@@ -72,6 +90,20 @@ public static String getRefSchemaName(final JsonNode parameter, String defaultSc
return schemaName;
}
+ public static String[] splitReference(final String name) {
+ if (0 < StringUtils.indexOf(name, "#")) {
+ return StringUtils.split(name, "#");
+ } else if (0 == StringUtils.indexOf(name, "#")) {
+ return StringUtils.split(name, "#");
+ } else {
+ return ArrayUtils.addAll(new String[]{}, name, "");
+ }
+ }
+
+ public static String packageToFolder(final String packageName) {
+ return StringUtils.replace(packageName, ".", SLASH);
+ }
+
public static String getRefSchemaKey(final JsonNode parameter) {
final String[] pathObjectRef = ApiTool.getRefValue(parameter).split("/");
return StringUtils.upperCase(pathObjectRef[pathObjectRef.length - 2] + "/" + StringCaseUtils.titleToSnakeCase(pathObjectRef[pathObjectRef.length - 1]));
@@ -82,6 +114,10 @@ public static String getRefSchemaKey(final String parameter) {
return StringUtils.upperCase(pathObjectRef[pathObjectRef.length - 2] + "/" + getSchemaKey(pathObjectRef[pathObjectRef.length - 1]));
}
+ public static String getSchemaKey(final String schemaName) {
+ return StringCaseUtils.titleToSnakeCase(schemaName);
+ }
+
public static String getKeySchemaName(final String parameter) {
return StringCaseUtils.toCamelCase(getKey(parameter));
}
@@ -91,38 +127,6 @@ public static String getKey(final String keyString) {
return pathObjectRef[pathObjectRef.length - 1];
}
- public static String getSchemaKey(final String schemaName) {
- return StringCaseUtils.titleToSnakeCase(schemaName);
- }
-
- private static boolean checkIfNumber(final String nodeType) {
- return TypeConstants.NUMBER.equalsIgnoreCase(nodeType) || TypeConstants.INTEGER.equalsIgnoreCase(nodeType)
- || TypeConstants.INT_32.equalsIgnoreCase(nodeType) || TypeConstants.INT_64.equalsIgnoreCase(nodeType);
- }
-
- private static String processNumber(final JsonNode schema) {
-
- final var nodeType = schema.get("type").asText();
- final var formatType = schema.has("format") ? schema.get("format").asText() : null;
- String type = TypeConstants.INTEGER;
- if (TypeConstants.NUMBER.equalsIgnoreCase(nodeType)) {
- if (TypeConstants.FLOAT.equalsIgnoreCase(formatType)) {
- type = TypeConstants.FLOAT;
- } else if (TypeConstants.DOUBLE.equalsIgnoreCase(formatType)) {
- type = TypeConstants.DOUBLE;
- } else {
- type = TypeConstants.BIG_DECIMAL;
- }
- } else if (TypeConstants.INTEGER.equalsIgnoreCase(nodeType)) {
- if (TypeConstants.INT_64.equalsIgnoreCase(formatType)) {
- type = TypeConstants.LONG;
- } else {
- type = TypeConstants.INTEGER;
- }
- }
- return type;
- }
-
public static String getTypeArray(final JsonNode array, final CommonSpecFile specFile) {
var typeArray = "";
if (ApiTool.isString(ApiTool.getItems(array))) {
@@ -135,15 +139,9 @@ public static String getTypeArray(final JsonNode array, final CommonSpecFile spe
return typeArray;
}
- public static String getPojoName(final String namePojo, final CommonSpecFile specFile) {
- return (StringUtils.isNotBlank(specFile.getModelNamePrefix()) ? specFile.getModelNamePrefix() : "")
- + StringUtils.capitalize(namePojo)
- + (StringUtils.isNotBlank(specFile.getModelNameSuffix()) ? specFile.getModelNameSuffix() : "");
- }
-
public static String calculatePrefixName(final String namePojo, final CommonSpecFile specFile) {
return (StringUtils.isNotBlank(specFile.getModelNamePrefix()) ? specFile.getModelNamePrefix() : "")
- + StringUtils.capitalize(namePojo);
+ + StringUtils.capitalize(namePojo);
}
public static String getPojoNameFromRef(final JsonNode schema, final CommonSpecFile specFile, String defaultPojoName) {
@@ -179,6 +177,10 @@ private static String[] getStrings(final JsonNode schema) {
return splitName(schema.get(REF).textValue());
}
+ public static String[] splitName(final String name) {
+ return ArrayUtils.removeAllOccurrences(name.split("\\W+"), "");
+ }
+
public static String getLongRefClass(final JsonNode schema) {
final String[] pathObjectRef = getStrings(schema);
return pathObjectRef[pathObjectRef.length - 2] + "/" + pathObjectRef[pathObjectRef.length - 1];
@@ -186,39 +188,39 @@ public static String getLongRefClass(final JsonNode schema) {
public static String getNameFromFile(final String filePath) {
return capitalizeFileName(StringUtils
- .removeStart(filePath, "./")
- .substring(0, filePath.lastIndexOf('.') - 2)
- .replace("\\/", "."));
+ .removeStart(filePath, "./")
+ .substring(0, filePath.lastIndexOf('.') - 2)
+ .replace("\\/", "."));
}
- public static String capitalizeWithPrefix(final String name) {
+ public static String capitalizeFileName(final String name) {
final StringBuilder response = new StringBuilder();
if (StringUtils.containsAny(name, DIVISOR)) {
final var splitPackage = MapperUtil.splitName(name);
- for (int i = 0; i < splitPackage.length; i++) {
- response.append(PACKAGE_SEPARATOR_STR).append(i < splitPackage.length - 1 ? splitPackage[i] : StringUtils.capitalize(splitPackage[i]));
+ for (String s : splitPackage) {
+ response.append(StringUtils.capitalize(s));
}
} else {
- response.append(PACKAGE_SEPARATOR_STR).append(StringUtils.capitalize(name));
+ response.append(StringUtils.capitalize(name));
}
return response.toString();
}
- public static String capitalizeFileName(final String name) {
+ public static String capitalizeWithPrefix(final String name) {
final StringBuilder response = new StringBuilder();
if (StringUtils.containsAny(name, DIVISOR)) {
final var splitPackage = MapperUtil.splitName(name);
- for (String s : splitPackage) {
- response.append(StringUtils.capitalize(s));
+ for (int i = 0; i < splitPackage.length; i++) {
+ response.append(PACKAGE_SEPARATOR_STR).append(i < splitPackage.length - 1 ? splitPackage[i] : StringUtils.capitalize(splitPackage[i]));
}
} else {
- response.append(StringUtils.capitalize(name));
+ response.append(PACKAGE_SEPARATOR_STR).append(StringUtils.capitalize(name));
}
return response.toString();
}
public static String getModel(String reference) {
- return reference.substring(reference.lastIndexOf("/")+1);
+ return reference.substring(reference.lastIndexOf("/") + 1);
}
public static String getPathToModel(String reference) {
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ModelBuilder.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ModelBuilder.java
index f7c88565..54e39ee7 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ModelBuilder.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/ModelBuilder.java
@@ -6,17 +6,29 @@
package com.sngular.api.generator.plugin.common.tools;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Consumer;
+
import com.fasterxml.jackson.databind.JsonNode;
-import com.sngular.api.generator.plugin.common.model.*;
+import com.sngular.api.generator.plugin.common.model.CommonSpecFile;
+import com.sngular.api.generator.plugin.common.model.SchemaFieldObject;
+import com.sngular.api.generator.plugin.common.model.SchemaFieldObjectType;
+import com.sngular.api.generator.plugin.common.model.SchemaObject;
+import com.sngular.api.generator.plugin.common.model.TypeConstants;
import com.sngular.api.generator.plugin.openapi.exception.BadDefinedEnumException;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.WordUtils;
-import java.nio.file.Path;
-import java.util.*;
-import java.util.function.Consumer;
-
public final class ModelBuilder {
private static final String ADDITIONAL_PROPERTY_NAME = "AdditionalProperty";
@@ -35,13 +47,13 @@ private ModelBuilder() {
}
public static SchemaObject buildSchemaObject(
- final Map totalSchemas, final String className, final JsonNode model,
- final Set antiLoopList, final Map compositedSchemas, final String parentPackage,
- final CommonSpecFile specFile, final Path baseDir) {
+ final Map totalSchemas, final String className, final JsonNode model,
+ final Set antiLoopList, final Map compositedSchemas, final String parentPackage,
+ final CommonSpecFile specFile, final Path baseDir) {
antiLoopList.add(WordUtils.capitalizeFully(className));
final var schemaBuilder = SchemaObject.builder()
- .schemaName(WordUtils.capitalizeFully(className));
+ .schemaName(WordUtils.capitalizeFully(className));
final var calculatedInlinePrefix = MapperUtil.calculatePrefixName("Inline", specFile);
if (!StringUtils.startsWith(className, calculatedInlinePrefix)) {
schemaBuilder.className(MapperUtil.getPojoName(className, specFile));
@@ -64,13 +76,13 @@ public static SchemaObject buildSchemaObject(
schemaBuilder.schemaCombinator("");
}
- schemaBuilder
- .fieldObjectList(listSchema)
- .parentPackage(parentPackage.toLowerCase());
+ schemaBuilder
+ .fieldObjectList(listSchema)
+ .parentPackage(parentPackage.toLowerCase());
} else {
schemaBuilder
- .isEnum(true)
- .fieldObject(processEnumField(className, model, specFile, ApiTool.getEnumValues(model), model));
+ .isEnum(true)
+ .fieldObject(processEnumField(className, model, specFile, ApiTool.getEnumValues(model), model));
}
cachedSchemas.putAll(compositedSchemas);
return schemaBuilder.build();
@@ -83,10 +95,10 @@ private static List getImportList(final Set fieldObje
for (final var fieldObject : fieldObjectList) {
getTypeImports(listHashMap, fieldObject);
if (StringUtils.isNotBlank(fieldObject.getImportClass())
- && !listHashMap.containsKey(fieldObject.getImportClass())
- && !fieldObject.getDataType().containsType("enum")) {
+ && !listHashMap.containsKey(fieldObject.getImportClass())
+ && !fieldObject.getDataType().containsType("enum")) {
listHashMap.put(StringUtils.capitalize(fieldObject.getImportClass()),
- List.of(modelPackage + "." + StringUtils.capitalize(fieldObject.getImportClass())));
+ List.of(modelPackage + "." + StringUtils.capitalize(fieldObject.getImportClass())));
}
}
if (!listHashMap.isEmpty()) {
@@ -96,8 +108,8 @@ private static List getImportList(final Set fieldObje
}
private static void getTypeImports(
- final HashMap> listHashMap,
- final SchemaFieldObject fieldObject) {
+ final HashMap> listHashMap,
+ final SchemaFieldObject fieldObject) {
final SchemaFieldObjectType type = fieldObject.getDataType();
if (type.containsType(TypeConstants.ARRAY)) {
listHashMap.computeIfAbsent(TypeConstants.ARRAY, key -> List.of("java.util.List", "java.util.ArrayList"));
@@ -140,27 +152,29 @@ private static void getTypeImports(
}
}
- private static Set getFields(final String buildingSchema,
- final Map totalSchemas, final JsonNode schema, final CommonSpecFile specFile,
- final Map compositedSchemas, final Set antiLoopList, final String nameSchema,
- final Path baseDir) {
+ private static Set getFields(
+ final String buildingSchema,
+ final Map totalSchemas, final JsonNode schema, final CommonSpecFile specFile,
+ final Map compositedSchemas, final Set antiLoopList, final String nameSchema,
+ final Path baseDir) {
final Set fieldObjectArrayList = new HashSet<>();
if (ApiTool.hasProperties(schema)) {
if (ApiTool.hasAdditionalProperties(schema)) {
ApiTool.getProperties(schema).forEachRemaining(processProperties(buildingSchema, totalSchemas, compositedSchemas, fieldObjectArrayList, specFile, schema, antiLoopList,
- baseDir));
+ baseDir));
fieldObjectArrayList.addAll(processAdditionalProperties(ADDITIONAL_PROPERTIES, schema, specFile, totalSchemas, compositedSchemas, antiLoopList, nameSchema, baseDir));
} else {
ApiTool.getProperties(schema).forEachRemaining(processProperties(nameSchema, totalSchemas, compositedSchemas, fieldObjectArrayList, specFile, schema, antiLoopList,
- baseDir));
+ baseDir));
}
} else if (TypeConstants.ARRAY.equalsIgnoreCase(ApiTool.getType(schema))) {
- final String itemType = ApiTool.hasRef(ApiTool.getItems(schema)) ? MapperUtil.getPojoNameFromRef(ApiTool.getItems(schema), specFile, null) : ApiTool.getType(ApiTool.getItems(schema));
+ final String itemType = ApiTool.hasRef(ApiTool.getItems(schema)) ? MapperUtil.getPojoNameFromRef(ApiTool.getItems(schema), specFile, null)
+ : ApiTool.getType(ApiTool.getItems(schema));
fieldObjectArrayList.add(SchemaFieldObject.builder()
- .baseName("items")
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, itemType))
- .build());
+ .baseName("items")
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, itemType))
+ .build());
} else if (ApiTool.isAllOf(schema)) {
fieldObjectArrayList.addAll(processAllOf(totalSchemas, ApiTool.getAllOf(schema), specFile, compositedSchemas, antiLoopList, baseDir));
} else if (ApiTool.isAnyOf(schema)) {
@@ -172,23 +186,23 @@ private static Set getFields(final String buildingSchema,
} else if (ApiTool.hasRef(schema)) {
final var refSchema = totalSchemas.get(MapperUtil.getRefSchemaKey(schema));
ApiTool.getProperties(refSchema).forEachRemaining(processProperties(buildingSchema, totalSchemas, compositedSchemas, fieldObjectArrayList, specFile, refSchema, antiLoopList,
- baseDir));
+ baseDir));
} else {
fieldObjectArrayList.add(SchemaFieldObject.builder()
- .baseName(ApiTool.getName(schema))
- .dataType(new SchemaFieldObjectType(MapperUtil.getSimpleType(schema, specFile)))
- .build());
+ .baseName(ApiTool.getName(schema))
+ .dataType(new SchemaFieldObjectType(MapperUtil.getSimpleType(schema, specFile)))
+ .build());
}
return fieldObjectArrayList;
}
-
@SuppressWarnings("checkstyle:CyclomaticComplexity")
- private static List processFieldObjectList(final String buildingSchema,
- final String fieldName, final String className, final JsonNode schema, final CommonSpecFile specFile,
- final Map totalSchemas, final Map compositedSchemas,
- final Set antiLoopList, final Path baseDir) {
+ private static List processFieldObjectList(
+ final String buildingSchema,
+ final String fieldName, final String className, final JsonNode schema, final CommonSpecFile specFile,
+ final Map totalSchemas, final Map compositedSchemas,
+ final Set antiLoopList, final Path baseDir) {
final var fieldObjectArrayList = new ArrayList();
if (TypeConstants.ARRAY.equalsIgnoreCase(ApiTool.getType(schema))) {
@@ -197,21 +211,21 @@ private static List processFieldObjectList(final String build
fieldObjectArrayList.addAll(processMap(fieldName, schema, specFile, totalSchemas, compositedSchemas, antiLoopList, baseDir));
} else if (ApiTool.hasRef(schema)) {
fieldObjectArrayList.add(
- processRef(fieldName, schema, new SchemaFieldObjectType(MapperUtil.getSimpleType(schema, specFile)), totalSchemas, compositedSchemas, antiLoopList, specFile, baseDir));
+ processRef(fieldName, schema, new SchemaFieldObjectType(MapperUtil.getSimpleType(schema, specFile)), totalSchemas, compositedSchemas, antiLoopList, specFile, baseDir));
} else if (ApiTool.isObject(schema) && !ApiTool.hasProperties(schema)) {
fieldObjectArrayList.add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(new SchemaFieldObjectType(TypeConstants.OBJECT))
- .build());
+ .builder()
+ .baseName(fieldName)
+ .dataType(new SchemaFieldObjectType(TypeConstants.OBJECT))
+ .build());
} else if (ApiTool.isEnum(schema)) {
fieldObjectArrayList.add(processEnumField(fieldName, schema, specFile, ApiTool.getEnumValues(schema), schema));
} else if (!ApiTool.hasProperties(schema) && !ApiTool.isComposed(schema)) {
fieldObjectArrayList.add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(new SchemaFieldObjectType(TypeConstants.OBJECT))
- .build());
+ .builder()
+ .baseName(fieldName)
+ .dataType(new SchemaFieldObjectType(TypeConstants.OBJECT))
+ .build());
} else if (ApiTool.isObject(schema)) {
fieldObjectArrayList.addAll(processObject(fieldName, className, schema, specFile, totalSchemas, compositedSchemas, antiLoopList, baseDir));
} else {
@@ -219,23 +233,24 @@ private static List processFieldObjectList(final String build
var schemaObjectComposed = compositedSchemas.get(composedSchemaName);
if (Objects.isNull(schemaObjectComposed)) {
schemaObjectComposed = createComposedSchema(buildingSchema, StringUtils.defaultIfBlank(className, fieldName), schema, specFile,
- totalSchemas, compositedSchemas, antiLoopList, baseDir);
+ totalSchemas, compositedSchemas, antiLoopList, baseDir);
compositedSchemas.put(composedSchemaName, schemaObjectComposed);
}
fieldObjectArrayList.add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(SchemaFieldObjectType.fromTypeList(schemaObjectComposed.getClassName(), schemaObjectComposed.getClassName()))
- .build());
+ .builder()
+ .baseName(fieldName)
+ .dataType(SchemaFieldObjectType.fromTypeList(schemaObjectComposed.getClassName(), schemaObjectComposed.getClassName()))
+ .build());
}
return fieldObjectArrayList;
}
- private static Consumer> processProperties(final String buildingSchema,
- final Map totalSchemas, final Map compositedSchemas, final Set fieldObjectArrayList, final CommonSpecFile specFile,
- final JsonNode schema, final Set antiLoopList, final Path baseDir) {
+ private static Consumer> processProperties(
+ final String buildingSchema,
+ final Map totalSchemas, final Map compositedSchemas, final Set fieldObjectArrayList, final CommonSpecFile specFile,
+ final JsonNode schema, final Set antiLoopList, final Path baseDir) {
return field -> {
final var nodeName = field.getKey();
final var nodeValue = field.getValue();
@@ -248,9 +263,10 @@ private static Consumer> processProperties(final Str
}
@SuppressWarnings({"checkstyle:CyclomaticComplexity", "checkstyle:ParameterNumber"})
- private static List processObjectProperty(final String buildingSchema,
- final Map totalSchemas, final String fieldName, final JsonNode fieldBody, final Map compositedSchemas, final CommonSpecFile specFile,
- final JsonNode schema, final Set antiLoopList, final Path baseDir) {
+ private static List processObjectProperty(
+ final String buildingSchema,
+ final Map totalSchemas, final String fieldName, final JsonNode fieldBody, final Map compositedSchemas, final CommonSpecFile specFile,
+ final JsonNode schema, final Set antiLoopList, final Path baseDir) {
final List fieldObjectArrayList = new LinkedList<>();
final var isRequired = ApiTool.checkIfRequired(fieldBody, fieldName);
final SchemaFieldObject field;
@@ -258,48 +274,48 @@ private static List processObjectProperty(final String buildi
final var typeName = MapperUtil.getRefSchemaName(fieldBody, fieldName);
final var refSchema = totalSchemas.get(MapperUtil.getRefSchemaKey(fieldBody));
if (!antiLoopList.contains(typeName) && Objects.nonNull(refSchema) && ApiTool.hasType(refSchema)
- && ApiTool.hasItems(refSchema) || ApiTool.getRefValue(fieldBody).contains(fieldName)) {
+ && ApiTool.hasItems(refSchema) || ApiTool.getRefValue(fieldBody).contains(fieldName)) {
if (antiLoopList.contains(typeName) && ApiTool.getRefValue(fieldBody).contains(fieldName)) {
fieldObjectArrayList.add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .required(ApiTool.checkIfRequired(schema, fieldName))
- .dataType(SchemaFieldObjectType.fromTypeList(MapperUtil.getSimpleType(refSchema, specFile),
- MapperUtil.getPojoName(typeName, specFile)))
- .build());
+ .builder()
+ .baseName(fieldName)
+ .required(ApiTool.checkIfRequired(schema, fieldName))
+ .dataType(SchemaFieldObjectType.fromTypeList(MapperUtil.getSimpleType(refSchema, specFile),
+ MapperUtil.getPojoName(typeName, specFile)))
+ .build());
} else {
- antiLoopList.add(typeName);
- fieldObjectArrayList.addAll(processFieldObjectList(buildingSchema, fieldName, typeName, refSchema, specFile, totalSchemas, compositedSchemas,
- antiLoopList, baseDir));
- }
+ antiLoopList.add(typeName);
+ fieldObjectArrayList.addAll(processFieldObjectList(buildingSchema, fieldName, typeName, refSchema, specFile, totalSchemas, compositedSchemas,
+ antiLoopList, baseDir));
+ }
} else if (ApiTool.isEnum(refSchema)) {
fieldObjectArrayList.add(processEnumField(fieldName, refSchema, specFile, ApiTool.getEnumValues(refSchema), schema));
} else if (ApiTool.isObject(refSchema) || ApiTool.isComposed(refSchema)) {
- compositedSchemas.put(typeName, buildSchemaObject(totalSchemas, typeName, refSchema, antiLoopList, compositedSchemas, "", specFile, baseDir ));
- fieldObjectArrayList.add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .required(ApiTool.checkIfRequired(schema, fieldName))
- .dataType(SchemaFieldObjectType.fromTypeList(MapperUtil.getSimpleType(refSchema, specFile),
- MapperUtil.getPojoName(typeName, specFile)))
- .build());
+ compositedSchemas.put(typeName, buildSchemaObject(totalSchemas, typeName, refSchema, antiLoopList, compositedSchemas, "", specFile, baseDir));
+ fieldObjectArrayList.add(SchemaFieldObject
+ .builder()
+ .baseName(fieldName)
+ .required(ApiTool.checkIfRequired(schema, fieldName))
+ .dataType(SchemaFieldObjectType.fromTypeList(MapperUtil.getSimpleType(refSchema, specFile),
+ MapperUtil.getPojoName(typeName, specFile)))
+ .build());
} else if (ApiTool.isBoolean(refSchema) || ApiTool.isString(refSchema) || ApiTool.isNumber(refSchema) || ApiTool.isDateTime(refSchema)) {
fieldObjectArrayList.add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .required(ApiTool.checkIfRequired(schema, fieldName))
- .dataType(new SchemaFieldObjectType(MapperUtil.getSimpleType(refSchema, specFile)))
- .constValue(ApiTool.getConst(refSchema))
- .build());
+ .builder()
+ .baseName(fieldName)
+ .required(ApiTool.checkIfRequired(schema, fieldName))
+ .dataType(new SchemaFieldObjectType(MapperUtil.getSimpleType(refSchema, specFile)))
+ .constValue(ApiTool.getConst(refSchema))
+ .build());
} else if (antiLoopList.contains(typeName) &&
- cachedSchemas.containsKey(typeName)) {
- fieldObjectArrayList.add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .required(ApiTool.checkIfRequired(schema, fieldName))
- .dataType(SchemaFieldObjectType.fromTypeList(MapperUtil.getSimpleType(refSchema, specFile),
- MapperUtil.getPojoName(typeName, specFile)))
- .build());
+ cachedSchemas.containsKey(typeName)) {
+ fieldObjectArrayList.add(SchemaFieldObject
+ .builder()
+ .baseName(fieldName)
+ .required(ApiTool.checkIfRequired(schema, fieldName))
+ .dataType(SchemaFieldObjectType.fromTypeList(MapperUtil.getSimpleType(refSchema, specFile),
+ MapperUtil.getPojoName(typeName, specFile)))
+ .build());
}
} else if (ApiTool.isEnum(fieldBody)) {
fieldObjectArrayList.add(processEnumField(fieldName, fieldBody, specFile, ApiTool.getEnumValues(fieldBody), fieldBody));
@@ -309,12 +325,12 @@ private static List processObjectProperty(final String buildi
fieldObjectArrayList.add(field);
} else if (isBasicType(fieldBody)) {
field = SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .required(isRequired || ApiTool.hasConst(fieldBody))
- .dataType(new SchemaFieldObjectType(MapperUtil.getSimpleType(fieldBody, specFile)))
- .constValue(ApiTool.getConst(fieldBody))
- .build();
+ .builder()
+ .baseName(fieldName)
+ .required(isRequired || ApiTool.hasConst(fieldBody))
+ .dataType(new SchemaFieldObjectType(MapperUtil.getSimpleType(fieldBody, specFile)))
+ .constValue(ApiTool.getConst(fieldBody))
+ .build();
addPropertiesToFieldObject(field, fieldBody);
setFieldType(field, fieldBody, schema, specFile, fieldName);
fieldObjectArrayList.add(field);
@@ -332,21 +348,19 @@ private static SchemaFieldObject processStringProperty(final String propertyName
String resultingType;
if (ApiTool.isDateTime(schema)) {
resultingType = MapperUtil.getDateType(schema, specFile);
- }
- else if (ApiTool.isBinary(schema)) {
+ } else if (ApiTool.isBinary(schema)) {
resultingType = TypeConstants.MULTIPART_FILE;
- }
- else {
+ } else {
resultingType = TypeConstants.STRING;
}
final SchemaFieldObject field = SchemaFieldObject
- .builder()
- .baseName(propertyName)
- .required(ApiTool.checkIfRequired(schema, propertyName) || ApiTool.hasConst(schema))
- .dataType(new SchemaFieldObjectType(resultingType))
- .constValue(ApiTool.getConst(schema))
- .build();
+ .builder()
+ .baseName(propertyName)
+ .required(ApiTool.checkIfRequired(schema, propertyName) || ApiTool.hasConst(schema))
+ .dataType(new SchemaFieldObjectType(resultingType))
+ .constValue(ApiTool.getConst(schema))
+ .build();
addPropertiesToFieldObject(field, schema);
return field;
}
@@ -408,51 +422,51 @@ private static void addPropertiesToFieldObject(final SchemaFieldObject fieldObje
@SuppressWarnings("checkstyle:ParameterNumber")
private static List processArray(
- final String fieldName, final String className, final JsonNode schema, final CommonSpecFile specFile, final Map totalSchemas,
- final Map compositedSchemas, final Set antiLoopList, final Path baseDir) {
+ final String fieldName, final String className, final JsonNode schema, final CommonSpecFile specFile, final Map totalSchemas,
+ final Map compositedSchemas, final Set antiLoopList, final Path baseDir) {
final List fieldObjectArrayList = new LinkedList<>();
if (!ApiTool.hasItems(schema)) {
fieldObjectArrayList.add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(new SchemaFieldObjectType(TypeConstants.OBJECT))
- .build());
+ .builder()
+ .baseName(fieldName)
+ .dataType(new SchemaFieldObjectType(TypeConstants.OBJECT))
+ .build());
} else {
final var items = ApiTool.getItems(schema);
if (ApiTool.hasRef(items)) {
fieldObjectArrayList.add(
- processRef(fieldName, items, SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, MapperUtil.getSimpleType(items, specFile)), totalSchemas, compositedSchemas,
- antiLoopList, specFile, baseDir));
+ processRef(fieldName, items, SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, MapperUtil.getSimpleType(items, specFile)), totalSchemas, compositedSchemas,
+ antiLoopList, specFile, baseDir));
} else if (ApiTool.isComposed(items)) {
final String composedSchemaName = StringUtils.defaultIfBlank(className, fieldName);
SchemaObject schemaObjectComposed = compositedSchemas.get(composedSchemaName);
if (Objects.isNull(schemaObjectComposed)) {
schemaObjectComposed = createComposedSchema("", StringUtils.defaultIfBlank(className, fieldName), items, specFile,
- totalSchemas, compositedSchemas, antiLoopList, baseDir);
+ totalSchemas, compositedSchemas, antiLoopList, baseDir);
compositedSchemas.put(composedSchemaName, schemaObjectComposed);
}
fieldObjectArrayList.add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, schemaObjectComposed.getClassName()))
- .importClass(schemaObjectComposed.getClassName())
- .build());
+ .builder()
+ .baseName(fieldName)
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, schemaObjectComposed.getClassName()))
+ .importClass(schemaObjectComposed.getClassName())
+ .build());
} else if (ApiTool.hasProperties(items)) {
final var itemsObject = buildSchemaObject(totalSchemas, className, items, antiLoopList, compositedSchemas, "", specFile, baseDir);
compositedSchemas.put(className, itemsObject);
fieldObjectArrayList.add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, MapperUtil.getPojoName(fieldName, specFile)))
- .build());
+ .builder()
+ .baseName(fieldName)
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, MapperUtil.getPojoName(fieldName, specFile)))
+ .build());
} else {
final SchemaFieldObject field = SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, MapperUtil.getSimpleType(items, specFile)))
- .build();
+ .builder()
+ .baseName(fieldName)
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, MapperUtil.getSimpleType(items, specFile)))
+ .build();
fieldObjectArrayList.add(field);
addPropertiesToFieldObject(field, schema);
}
@@ -463,109 +477,109 @@ private static List processArray(
@SuppressWarnings("checkstyle:ParameterNumber")
private static Set processObject(
- final String fieldName, final String className, final JsonNode schema, final CommonSpecFile specFile,
- final Map totalSchemas, final Map compositedSchemas,
- final Set antiLoopList, final Path baseDir) {
+ final String fieldName, final String className, final JsonNode schema, final CommonSpecFile specFile,
+ final Map totalSchemas, final Map compositedSchemas,
+ final Set antiLoopList, final Path baseDir) {
final Set fieldObjectArrayList = new HashSet<>();
if (ObjectUtils.allNull(className, fieldName)) {
ApiTool.getProperties(schema).forEachRemaining(
- processProperties("", totalSchemas, compositedSchemas, fieldObjectArrayList, specFile, schema, antiLoopList, baseDir));
+ processProperties("", totalSchemas, compositedSchemas, fieldObjectArrayList, specFile, schema, antiLoopList, baseDir));
} else if (antiLoopList.contains(className) && compositedSchemas.containsKey(className)) {
fieldObjectArrayList
- .add(SchemaFieldObject
- .builder()
- .baseName(className)
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.OBJECT, MapperUtil.getPojoName(className, specFile)))
- .build());
+ .add(SchemaFieldObject
+ .builder()
+ .baseName(className)
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.OBJECT, MapperUtil.getPojoName(className, specFile)))
+ .build());
} else if (antiLoopList.contains(fieldName) && compositedSchemas.containsKey(className)) {
fieldObjectArrayList
- .add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.OBJECT, MapperUtil.getPojoName(fieldName, specFile)))
- .build());
+ .add(SchemaFieldObject
+ .builder()
+ .baseName(fieldName)
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.OBJECT, MapperUtil.getPojoName(fieldName, specFile)))
+ .build());
} else {
final String name = StringUtils.defaultIfBlank(className, fieldName);
final var itemsObject = buildSchemaObject(totalSchemas, className, schema, antiLoopList, compositedSchemas, "", specFile, baseDir);
compositedSchemas.put(className, itemsObject);
fieldObjectArrayList
- .add(SchemaFieldObject
- .builder()
- .baseName(name)
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.OBJECT, MapperUtil.getPojoName(name, specFile)))
- .build());
+ .add(SchemaFieldObject
+ .builder()
+ .baseName(name)
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.OBJECT, MapperUtil.getPojoName(name, specFile)))
+ .build());
}
return fieldObjectArrayList;
}
private static Set processMap(
- final String fieldName, final JsonNode schema, final CommonSpecFile specFile, final Map totalSchemas,
- final Map compositedSchemas, final Set antiLoopList, final Path baseDir) {
+ final String fieldName, final JsonNode schema, final CommonSpecFile specFile, final Map totalSchemas,
+ final Map compositedSchemas, final Set antiLoopList, final Path baseDir) {
final Set fieldObjectArrayList = new HashSet<>();
if (TypeConstants.OBJECT.equalsIgnoreCase(ApiTool.getType(schema)) && ApiTool.hasProperties(schema)) {
ApiTool.getProperties(schema).forEachRemaining(
- processProperties("", totalSchemas, compositedSchemas, fieldObjectArrayList, specFile, schema, antiLoopList, baseDir));
+ processProperties("", totalSchemas, compositedSchemas, fieldObjectArrayList, specFile, schema, antiLoopList, baseDir));
}
if (ApiTool.hasAdditionalProperties(schema)) {
fieldObjectArrayList.addAll(processAdditionalProperties(fieldName, schema, specFile, totalSchemas, compositedSchemas,
- antiLoopList, ADDITIONAL_PROPERTIES, baseDir));
+ antiLoopList, ADDITIONAL_PROPERTIES, baseDir));
}
return fieldObjectArrayList;
}
private static List processAdditionalProperties(
- final String fieldName, final JsonNode schema, final CommonSpecFile specFile, final Map totalSchemas,
- final Map compositedSchemas, final Set antiLoopList, final String nameSchema,
- final Path baseDir) {
+ final String fieldName, final JsonNode schema, final CommonSpecFile specFile, final Map totalSchemas,
+ final Map compositedSchemas, final Set antiLoopList, final String nameSchema,
+ final Path baseDir) {
final var fieldObjectArrayList = new ArrayList();
final var addPropObj = ApiTool.getAdditionalProperties(schema);
if (TypeConstants.isBoolean(addPropObj.asText())) {
fieldObjectArrayList
- .add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, TypeConstants.OBJECT))
- .build());
+ .add(SchemaFieldObject
+ .builder()
+ .baseName(fieldName)
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, TypeConstants.OBJECT))
+ .build());
} else if (ApiTool.hasRef(addPropObj)) {
final String refSchemaName = MapperUtil.getPojoNameFromRef(addPropObj, specFile, null);
fieldObjectArrayList.add(processRef(fieldName, addPropObj,
- SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, refSchemaName), totalSchemas, compositedSchemas,
- antiLoopList, specFile, baseDir));
+ SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, refSchemaName), totalSchemas, compositedSchemas,
+ antiLoopList, specFile, baseDir));
} else if (ApiTool.hasItems(addPropObj)) {
fieldObjectArrayList
- .add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, TypeConstants.ARRAY,
- MapperUtil.getSimpleType(ApiTool.getItems(addPropObj), specFile)))
- .build());
+ .add(SchemaFieldObject
+ .builder()
+ .baseName(fieldName)
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, TypeConstants.ARRAY,
+ MapperUtil.getSimpleType(ApiTool.getItems(addPropObj), specFile)))
+ .build());
} else if (ApiTool.isObject(addPropObj)) {
final String className = nameSchema + "Value";
final var itemsObject = buildSchemaObject(totalSchemas, className, addPropObj, antiLoopList, compositedSchemas, "", specFile, baseDir);
compositedSchemas.put(className, itemsObject);
fieldObjectArrayList
- .add(SchemaFieldObject
- .builder()
- .baseName(ADDITIONAL_PROPERTIES)
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, MapperUtil.getPojoName(className, specFile)))
- .build());
+ .add(SchemaFieldObject
+ .builder()
+ .baseName(ADDITIONAL_PROPERTIES)
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, MapperUtil.getPojoName(className, specFile)))
+ .build());
} else {
final String type = isBasicType(addPropObj) ? MapperUtil.getSimpleType(addPropObj, specFile)
- : MapperUtil.getPojoName(ApiTool.getName(schema) + ADDITIONAL_PROPERTY_NAME, specFile);
+ : MapperUtil.getPojoName(ApiTool.getName(schema) + ADDITIONAL_PROPERTY_NAME, specFile);
fieldObjectArrayList
- .add(SchemaFieldObject
- .builder()
- .baseName(fieldName)
- .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, type))
- .constValue(getConst(addPropObj))
- .required(ApiTool.checkIfRequired(schema, fieldName) ||ApiTool.hasConst(addPropObj))
- .build());
+ .add(SchemaFieldObject
+ .builder()
+ .baseName(fieldName)
+ .dataType(SchemaFieldObjectType.fromTypeList(TypeConstants.MAP, type))
+ .constValue(getConst(addPropObj))
+ .required(ApiTool.checkIfRequired(schema, fieldName) || ApiTool.hasConst(addPropObj))
+ .build());
}
return fieldObjectArrayList;
@@ -573,40 +587,41 @@ private static List processAdditionalProperties(
private static boolean isBasicType(final JsonNode value) {
return !(ApiTool.isObject(value) || ApiTool.isArray(value) || ApiTool.isComposed(value)
- || ApiTool.hasAdditionalProperties(value));
+ || ApiTool.hasAdditionalProperties(value));
}
- private static SchemaObject createComposedSchema(final String buildingSchema,
- final String fieldName, final JsonNode schema, final CommonSpecFile specFile, final Map totalSchemas,
- final Map compositedSchemas, final Set antiLoopList, final Path baseDir) {
+ private static SchemaObject createComposedSchema(
+ final String buildingSchema,
+ final String fieldName, final JsonNode schema, final CommonSpecFile specFile, final Map totalSchemas,
+ final Map compositedSchemas, final Set antiLoopList, final Path baseDir) {
final Set fieldObjectArrayList = new HashSet<>();
String schemaCombinatorType = "";
if (ApiTool.isAllOf(schema)) {
fieldObjectArrayList.addAll(
- processAllOf(totalSchemas, ApiTool.getAllOf(schema), specFile, compositedSchemas, antiLoopList, baseDir));
+ processAllOf(totalSchemas, ApiTool.getAllOf(schema), specFile, compositedSchemas, antiLoopList, baseDir));
schemaCombinatorType = ALL_OF_COMBINATOR;
} else if (ApiTool.isAnyOf(schema)) {
fieldObjectArrayList.addAll(
- processAnyOfOneOf(fieldName, totalSchemas, ApiTool.getAnyOf(schema), specFile, compositedSchemas, antiLoopList, baseDir));
+ processAnyOfOneOf(fieldName, totalSchemas, ApiTool.getAnyOf(schema), specFile, compositedSchemas, antiLoopList, baseDir));
schemaCombinatorType = ANY_OF_COMBINATOR;
} else if (ApiTool.isOneOf(schema)) {
fieldObjectArrayList.addAll(
- processAnyOfOneOf(buildingSchema, totalSchemas, ApiTool.getOneOf(schema), specFile, compositedSchemas, antiLoopList, baseDir));
+ processAnyOfOneOf(buildingSchema, totalSchemas, ApiTool.getOneOf(schema), specFile, compositedSchemas, antiLoopList, baseDir));
schemaCombinatorType = ONE_OF_COMBINATOR;
}
return SchemaObject.builder()
- .schemaName(fieldName)
- .className(MapperUtil.getPojoName(fieldName, specFile))
- .importList(getImportList(fieldObjectArrayList, specFile.getModelPackage()))
- .schemaCombinator(schemaCombinatorType)
- .fieldObjectList(fieldObjectArrayList)
- .build();
+ .schemaName(fieldName)
+ .className(MapperUtil.getPojoName(fieldName, specFile))
+ .importList(getImportList(fieldObjectArrayList, specFile.getModelPackage()))
+ .schemaCombinator(schemaCombinatorType)
+ .fieldObjectList(fieldObjectArrayList)
+ .build();
}
private static void setFieldType(
- final SchemaFieldObject field, final JsonNode schemaProperty, final JsonNode schema,
- final CommonSpecFile specFile, final String key) {
+ final SchemaFieldObject field, final JsonNode schemaProperty, final JsonNode schema,
+ final CommonSpecFile specFile, final String key) {
field.setRequired(ApiTool.hasRequired(schema) && ApiTool.checkIfRequired(schema, key));
if (ApiTool.isArray(schemaProperty)) {
final String typeArray;
@@ -642,10 +657,10 @@ private static String getMapTypeObject(final JsonNode schema, final CommonSpecFi
type = MapperUtil.getPojoNameFromRef(additionalProperties, specFile, null);
} else if (ApiTool.isObject(schema)) {
final var additionalPropertiesField = SchemaFieldObject
- .builder()
- .baseName(ApiTool.getName(additionalProperties))
- .dataType(new SchemaFieldObjectType(MapperUtil.getSimpleType(additionalProperties, specFile)))
- .build();
+ .builder()
+ .baseName(ApiTool.getName(additionalProperties))
+ .dataType(new SchemaFieldObjectType(MapperUtil.getSimpleType(additionalProperties, specFile)))
+ .build();
setFieldType(additionalPropertiesField, additionalProperties, additionalProperties, specFile, "");
type = getMapFieldType(additionalPropertiesField);
} else {
@@ -667,8 +682,8 @@ private static String getMapFieldType(final SchemaFieldObject schemaFieldObject)
}
private static Set processAllOf(
- final Map totalSchemas, final JsonNode schemaList, final CommonSpecFile specFile,
- final Map compositedSchemas, final Set antiLoopList, final Path baseDir) {
+ final Map totalSchemas, final JsonNode schemaList, final CommonSpecFile specFile,
+ final Map compositedSchemas, final Set antiLoopList, final Path baseDir) {
final Set fieldObjectArrayList = new HashSet<>();
for (JsonNode ref : schemaList) {
@@ -683,9 +698,10 @@ private static Set processAllOf(
return fieldObjectArrayList;
}
- private static Set processAnyOfOneOf(final String buildingSchema,
- final Map totalSchemas, final JsonNode schemaList, final CommonSpecFile specFile,
- final Map compositedSchemas, final Set antiLoopList, final Path baseDir) {
+ private static Set processAnyOfOneOf(
+ final String buildingSchema,
+ final Map totalSchemas, final JsonNode schemaList, final CommonSpecFile specFile,
+ final Map compositedSchemas, final Set antiLoopList, final Path baseDir) {
final Set fieldObjectArrayList = new HashSet<>();
for (JsonNode internalSchema : schemaList) {
@@ -704,9 +720,9 @@ private static Set processAnyOfOneOf(final String buildingSch
fieldObjectArrayList.addAll(compositedSchemas.get(schemaName).getFieldObjectList());
} else if (!schemaName.equalsIgnoreCase(buildingSchema)) {
fieldObjectArrayList.add(SchemaFieldObject.builder()
- .baseName(schemaName)
- .dataType(new SchemaFieldObjectType(MapperUtil.getSimpleType(internalSchema, specFile)))
- .build());
+ .baseName(schemaName)
+ .dataType(new SchemaFieldObjectType(MapperUtil.getSimpleType(internalSchema, specFile)))
+ .build());
}
} else {
fieldObjectArrayList.addAll(getFields(buildingSchema, totalSchemas, internalSchema, specFile, compositedSchemas, antiLoopList, ApiTool.getName(internalSchema), baseDir));
@@ -721,13 +737,13 @@ private static Set processAnyOfOneOf(final String buildingSch
}
private static SchemaFieldObject processRef(
- final String fieldName, final JsonNode schema, final SchemaFieldObjectType dataType,
- final Map totalSchemas, final Map compositedSchemas,
- final Set antiLoopList, final CommonSpecFile specFile, final Path baseDir) {
+ final String fieldName, final JsonNode schema, final SchemaFieldObjectType dataType,
+ final Map totalSchemas, final Map compositedSchemas,
+ final Set antiLoopList, final CommonSpecFile specFile, final Path baseDir) {
final var field = SchemaFieldObject.builder()
- .baseName(fieldName)
- .dataType(dataType)
- .build();
+ .baseName(fieldName)
+ .dataType(dataType)
+ .build();
if (!antiLoopList.contains(MapperUtil.getRefSchemaName(schema, fieldName))) {
antiLoopList.add(MapperUtil.getRefSchemaName(schema, fieldName));
final String refSchemaName = MapperUtil.getPojoNameFromRef(schema, specFile, fieldName);
@@ -739,14 +755,14 @@ private static SchemaFieldObject processRef(
}
private static SchemaObject solveRef(
- final JsonNode schema, final Map totalSchemas,
- final Map compositedSchemas, final Set antiLoopList, final CommonSpecFile specFile,
- final Path baseDir) {
+ final JsonNode schema, final Map totalSchemas,
+ final Map compositedSchemas, final Set antiLoopList, final CommonSpecFile specFile,
+ final Path baseDir) {
final var referredSchema = SchemaUtil.solveRef(ApiTool.getRefValue(schema), totalSchemas, baseDir.resolve(specFile.getFilePath()).getParent().toUri());
final var schemaObject = buildSchemaObject(totalSchemas, MapperUtil.getRefSchemaName(schema, null), referredSchema,
- antiLoopList, compositedSchemas, MapperUtil.getRefSchemaName(schema, null), specFile, baseDir);
+ antiLoopList, compositedSchemas, MapperUtil.getRefSchemaName(schema, null), specFile, baseDir);
schemaObject.setEnum(ApiTool.isEnum(referredSchema));
compositedSchemas.put(MapperUtil.getRefSchemaName(schema, null), schemaObject);
@@ -754,43 +770,59 @@ private static SchemaObject solveRef(
}
private static SchemaFieldObject processEnumField(
- final String name, final JsonNode value,
- final CommonSpecFile specFile, final List enumValues, final JsonNode schema) {
+ final String name, final JsonNode value,
+ final CommonSpecFile specFile, final List enumValues, final JsonNode schema) {
final var field = SchemaFieldObject
- .builder()
- .baseName(name)
- .dataType(new SchemaFieldObjectType(TypeConstants.ENUM))
- .build();
+ .builder()
+ .baseName(name)
+ .dataType(new SchemaFieldObjectType(TypeConstants.ENUM))
+ .build();
field.setRequired(ApiTool.checkIfRequired(schema, name));
final var dataType = MapperUtil.getSimpleType(value, specFile);
field.getDataType().setDeepType(dataType);
final HashMap enumValuesMap = new HashMap<>();
+ final Set usedKeys = new HashSet<>();
for (final var enumValue : enumValues) {
- String valueName = enumValue;
- valueName = valueName.replace(".", "_DOT_");
+ String rawName = enumValue == null ? "" : enumValue;
+ // Build a normalized, collision-free enum constant name
+ final String keyBase = normalizeEnumKeyBase(rawName);
+ String key;
switch (dataType) {
case TypeConstants.INTEGER:
- enumValuesMap.put("INTEGER_" + valueName, enumValue);
+ key = ensureUnique(usedKeys, "INTEGER_" + keyBase);
+ enumValuesMap.put(key, enumValue);
break;
case TypeConstants.LONG:
- enumValuesMap.put("LONG_" + valueName, enumValue + "l");
+ key = ensureUnique(usedKeys, "LONG_" + keyBase);
+ enumValuesMap.put(key, enumValue + "l");
break;
case TypeConstants.DOUBLE:
- enumValuesMap.put("DOUBLE_" + valueName, enumValue);
+ key = ensureUnique(usedKeys, "DOUBLE_" + keyBase);
+ enumValuesMap.put(key, enumValue);
break;
case TypeConstants.FLOAT:
- enumValuesMap.put("FLOAT_" + valueName, enumValue + "f");
+ key = ensureUnique(usedKeys, "FLOAT_" + keyBase);
+ enumValuesMap.put(key, enumValue + "f");
break;
case TypeConstants.BIG_DECIMAL:
- enumValuesMap.put("BIG_DECIMAL_" + valueName, "new BigDecimal(\"" + enumValue + "\")");
+ key = ensureUnique(usedKeys, "BIG_DECIMAL_" + keyBase);
+ enumValuesMap.put(key, "new BigDecimal(\"" + enumValue + "\")");
break;
case TypeConstants.STRING:
default:
- enumValuesMap.put(StringUtils.replace(StringUtils.upperCase(valueName), " ", "_"),
- '"' + enumValue + '"');
+ // For string-based enums: uppercase and ensure it starts with a non-digit
+ String candidate = StringUtils.upperCase(keyBase);
+ if (candidate.isEmpty()) {
+ candidate = "EMPTY";
+ }
+ if (Character.isDigit(candidate.charAt(0))) {
+ candidate = "_" + candidate;
+ }
+ key = ensureUnique(usedKeys, candidate);
+ enumValuesMap.put(key, '"' + enumValue + '"');
break;
}
}
@@ -802,6 +834,44 @@ private static SchemaFieldObject processEnumField(
return field;
}
+ /**
+ * Normaliza una cadena para que pueda ser usada como parte de una constante Java:
+ * - reemplaza puntos por _DOT_
+ * - reemplaza cualquier caracter no alfanumérico por '_'
+ * - colapsa guiones bajos múltiples
+ * - recorta guiones bajos al inicio/fin
+ */
+ private static String normalizeEnumKeyBase(final String raw) {
+ if (raw == null) {
+ return "";
+ }
+ String s = raw.replace(".", "_DOT_");
+ // Reemplaza cualquier caracter que no sea letra o dígito por '_'
+ s = s.replaceAll("[^A-Za-z0-9]", "_");
+ // Colapsa múltiples '_' en uno solo
+ s = s.replaceAll("_+", "_");
+ // Elimina '_' iniciales o finales
+ s = s.replaceAll("^_+|_+$", "");
+ // Si queda vacío, devolver placeholder
+ if (s.isEmpty()) {
+ return "EMPTY";
+ }
+ return s;
+ }
+
+ /**
+ * Añade sufijo numérico si la clave ya existe para garantizar unicidad.
+ */
+ private static String ensureUnique(final Set usedKeys, final String base) {
+ String candidate = base;
+ int idx = 1;
+ while (usedKeys.contains(candidate)) {
+ candidate = base + "_" + idx++;
+ }
+ usedKeys.add(candidate);
+ return candidate;
+ }
+
private static String getImportClass(final String type) {
return StringUtils.isNotBlank(type) && !TypeConstants.NO_IMPORT_TYPE.contains(type) ? StringUtils.capitalize(type) : "";
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/PathUtil.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/PathUtil.java
new file mode 100644
index 00000000..2c8eee6c
--- /dev/null
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/PathUtil.java
@@ -0,0 +1,40 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ */
+
+package com.sngular.api.generator.plugin.common.tools;
+
+import java.nio.file.InvalidPathException;
+import java.nio.file.Paths;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * Utility class for path operations.
+ */
+public final class PathUtil {
+
+ private PathUtil() {
+ // Utility class
+ }
+
+ /**
+ * Checks if a file path is absolute. An absolute path is platform-dependent: - On Windows: C:\\path, D:\\path, \\\\server\\share (UNC) - On Unix/Linux: /path
+ *
+ * @param filePath the file path to check
+ * @return true if the path is absolute, false if relative or invalid
+ */
+ public static boolean isAbsolutePath(final String filePath) {
+ if (StringUtils.isEmpty(filePath)) {
+ return false;
+ }
+ try {
+ return Paths.get(filePath).isAbsolute();
+ } catch (final InvalidPathException e) {
+ // If the path is invalid, treat it as not absolute
+ return false;
+ }
+ }
+}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/SchemaUtil.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/SchemaUtil.java
index d685e99f..5b8fb69a 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/SchemaUtil.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/SchemaUtil.java
@@ -1,20 +1,23 @@
package com.sngular.api.generator.plugin.common.tools;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.sngular.api.generator.plugin.openapi.exception.FileParseException;
-import org.apache.commons.lang3.StringUtils;
-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Map;
import java.util.Objects;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.sngular.api.generator.plugin.openapi.exception.FileParseException;
+import org.apache.commons.lang3.StringUtils;
+
public class SchemaUtil {
static final ObjectMapper PARSER = new ObjectMapper(new YAMLFactory());
@@ -50,23 +53,40 @@ public static JsonNode getPojoFromRef(final URI rootFilePath, final String refPa
} catch (final IOException e) {
throw new FileParseException(refPath, e);
}
-
if (Objects.isNull(schemaFile)) {
throw new FileParseException("empty .yml");
}
-
return schemaFile;
}
-
private static String readFile(final URI rootFilePath, final String filePath) throws MalformedURLException {
if (Objects.isNull(filePath)) {
throw new IllegalArgumentException("File Path cannot be empty");
}
- URL fileURL = SchemaUtil.class.getClassLoader().getResource(filePath);
+
+ // Normalize the incoming filePath: remove leading './' and replace backslashes with forward slashes
+ final String cleaned = cleanUpPath(filePath).replace('\\', '/');
+
+ // First, try to find the file in the classpath using the cleaned path
+ URL fileURL = SchemaUtil.class.getClassLoader().getResource(cleaned);
if (Objects.isNull(fileURL)) {
- final var parentFolder = rootFilePath.resolve(cleanUpPath(filePath));
- fileURL = parentFolder.toURL();
+ // Check if the path is absolute (platform specific)
+ if (PathUtil.isAbsolutePath(cleaned)) {
+ // For absolute paths, convert directly to URL without resolving against rootFilePath
+ fileURL = Paths.get(cleaned).toUri().toURL();
+ } else {
+ try {
+ // Resolve against the root file path using Path to handle '..' properly
+ final Path rootPath = Paths.get(rootFilePath);
+ final Path base = Files.isDirectory(rootPath) ? rootPath : (rootPath.getParent() != null ? rootPath.getParent() : rootPath);
+ final Path resolved = base.resolve(Paths.get(cleaned)).normalize();
+ fileURL = resolved.toUri().toURL();
+ } catch (final Exception e) {
+ // Fallback: resolve the cleaned path against the rootFilePath URI
+ final URI resolvedUri = rootFilePath.resolve(cleaned);
+ fileURL = resolvedUri.toURL();
+ }
+ }
}
final var sb = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(fileURL.openStream()))) {
@@ -83,5 +103,4 @@ private static String readFile(final URI rootFilePath, final String filePath) th
private static String cleanUpPath(final String filePath) {
return StringUtils.startsWith(filePath, "./") ? filePath.substring(2) : filePath;
}
-
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/StringCaseUtils.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/StringCaseUtils.java
index 8107da85..b6d10e14 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/StringCaseUtils.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/StringCaseUtils.java
@@ -4,26 +4,26 @@
public class StringCaseUtils {
- public static String titleToSnakeCase(String titleCase) {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < titleCase.length(); i++) {
- char c = titleCase.charAt(i);
- if (Character.isUpperCase(c)) {
- if (i > 0) {
- sb.append("_");
- }
- sb.append(c);
- } else {
- sb.append(Character.toUpperCase(c));
- }
- }
- return sb.toString();
- }
+ private StringCaseUtils() {
+ }
- public static String toCamelCase(final String toCamelCase) {
- return CaseUtils.toCamelCase(toCamelCase, true, '_');
+ public static String titleToSnakeCase(String titleCase) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < titleCase.length(); i++) {
+ char c = titleCase.charAt(i);
+ if (Character.isUpperCase(c)) {
+ if (i > 0) {
+ sb.append("_");
+ }
+ sb.append(c);
+ } else {
+ sb.append(Character.toUpperCase(c));
+ }
}
+ return sb.toString();
+ }
- private StringCaseUtils() {
- }
+ public static String toCamelCase(final String toCamelCase) {
+ return CaseUtils.toCamelCase(toCamelCase, true, '_');
+ }
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/OpenApiGenerator.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/OpenApiGenerator.java
index 8f6831a5..9177c273 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/OpenApiGenerator.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/OpenApiGenerator.java
@@ -6,6 +6,16 @@
package com.sngular.api.generator.plugin.openapi;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.sngular.api.generator.plugin.PluginConstants;
import com.sngular.api.generator.plugin.common.model.SchemaObject;
@@ -26,11 +36,6 @@
import org.apache.commons.collections4.MultiValuedMap;
import org.apache.commons.lang3.StringUtils;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.*;
-
public class OpenApiGenerator {
private static final String SLASH = "/";
@@ -51,14 +56,14 @@ public class OpenApiGenerator {
private final Path baseDir;
- private Boolean isWebClient = false;
-
- private Boolean isRestClient = false;
-
private final List authentications = new ArrayList<>();
private final Integer springBootVersion;
+ private Boolean isWebClient = false;
+
+ private Boolean isRestClient = false;
+
public OpenApiGenerator(
final Integer springBootVersion,
final Boolean overwriteModel,
@@ -75,10 +80,18 @@ public OpenApiGenerator(
public final void processFileSpec(final List specsListFile) {
for (SpecFile specFile : specsListFile) {
- processPackage(specFile.getApiPackage());
- processFile(specFile);
- createClients(specFile);
- templateFactory.clearData();
+ processPackage(specFile.getApiPackage());
+ processFile(specFile);
+ createClients(specFile);
+ templateFactory.clearData();
+ }
+ }
+
+ private void processPackage(final String apiPackage) {
+ if (StringUtils.isNotBlank(apiPackage)) {
+ templateFactory.setPackageName(apiPackage.trim());
+ } else {
+ templateFactory.setPackageName(Objects.requireNonNullElse(groupId, DEFAULT_OPENAPI_API_PACKAGE));
}
}
@@ -120,20 +133,6 @@ private void createClients(final SpecFile specFile) {
}
}
- private void createAuthTemplates(final SpecFile specFile) throws IOException {
- final String clientPackage = specFile.getClientPackage();
- final var authFileRoot = (StringUtils.isNotBlank(clientPackage) ? clientPackage : DEFAULT_OPENAPI_CLIENT_PACKAGE) + ".auth";
-
- templateFactory.setAuthPackageName(authFileRoot);
- templateFactory.fillTemplateAuth(authFileRoot, "Authentication");
-
- if (!authentications.isEmpty()) {
- for (String authentication : authentications) {
- templateFactory.fillTemplateAuth(authFileRoot, authentication);
- }
- }
- }
-
private GlobalObject createApiTemplate(final SpecFile specFile, final JsonNode openAPI) {
final MultiValuedMap> apis = OpenApiUtil.mapApiGroups(openAPI, specFile.isUseTagsGroup());
final var authSchemaList = MapperAuthUtil.createAuthSchemaList(openAPI);
@@ -150,7 +149,7 @@ private GlobalObject createApiTemplate(final SpecFile specFile, final JsonNode o
throw new GeneratorTemplateException("Error filling the template", specFile.getFilePath(), e);
}
- if (Boolean.TRUE.equals(specFile.isCallMode())) {
+ if (specFile.isCallMode()) {
addAuthentications(authObject);
}
}
@@ -158,17 +157,6 @@ private GlobalObject createApiTemplate(final SpecFile specFile, final JsonNode o
return globalObject;
}
- private void addAuthentications(final AuthObject authObject) {
-
- if (null != authObject.getSecurityRequirements() && !authObject.getSecurityRequirements().isEmpty()) {
- authObject.getSecurityRequirements().forEach(authType -> {
- if (!authentications.contains(authType)) {
- authentications.add(authType);
- }
- });
- }
- }
-
private void createModelTemplate(final SpecFile specFile, final JsonNode openAPI, final GlobalObject globalObject) {
final var modelPackage = processModelPackage(specFile.getModelPackage());
@@ -177,11 +165,28 @@ private void createModelTemplate(final SpecFile specFile, final JsonNode openAPI
processModels(specFile, modelPackage, totalSchemas, overwriteModel);
}
- private void processPackage(final String apiPackage) {
- if (StringUtils.isNotBlank(apiPackage)) {
- templateFactory.setPackageName(apiPackage.trim());
- } else {
- templateFactory.setPackageName(Objects.requireNonNullElse(groupId, DEFAULT_OPENAPI_API_PACKAGE));
+ private void createAuthTemplates(final SpecFile specFile) throws IOException {
+ final String clientPackage = specFile.getClientPackage();
+ final var authFileRoot = (StringUtils.isNotBlank(clientPackage) ? clientPackage : DEFAULT_OPENAPI_CLIENT_PACKAGE) + ".auth";
+
+ templateFactory.setAuthPackageName(authFileRoot);
+ templateFactory.fillTemplateAuth(authFileRoot, "Authentication");
+
+ if (!authentications.isEmpty()) {
+ for (String authentication : authentications) {
+ templateFactory.fillTemplateAuth(authFileRoot, authentication);
+ }
+ }
+ }
+
+ private void addAuthentications(final AuthObject authObject) {
+
+ if (null != authObject.getSecurityRequirements() && !authObject.getSecurityRequirements().isEmpty()) {
+ authObject.getSecurityRequirements().forEach(authType -> {
+ if (!authentications.contains(authType)) {
+ authentications.add(authType);
+ }
+ });
}
}
@@ -211,14 +216,6 @@ private void processModels(
});
}
- private String chooseRightName(final String schemaName) {
- String rightName = schemaName;
- if (!StringUtils.startsWith(schemaName, "Inline")) {
- rightName = MapperUtil.getKeySchemaName(schemaName);
- }
- return rightName;
- }
-
private boolean validType(final String type) {
return !TypeConstants.NO_PROCESS_TYPE.contains(type);
}
@@ -238,12 +235,20 @@ private void processModel(
}
}
+ private String chooseRightName(final String schemaName) {
+ String rightName = schemaName;
+ if (!StringUtils.startsWith(schemaName, "Inline")) {
+ rightName = MapperUtil.getKeySchemaName(schemaName);
+ }
+ return rightName;
+ }
+
private void writeSchemaObject(
final SpecFile specFile, final String schemaName, final JsonNode model, final Map basicSchemaMap,
final String modelPackage) {
final String parentPackage = modelPackage.substring(modelPackage.lastIndexOf(".") + 1);
final var schemaObjectIt = MapperContentUtil
- .mapComponentToSchemaObject(basicSchemaMap, schemaName, model, parentPackage, specFile, this.baseDir).iterator();
+ .mapComponentToSchemaObject(basicSchemaMap, schemaName, model, parentPackage, specFile, this.baseDir).iterator();
if (schemaObjectIt.hasNext()) {
writeSchemaObject(specFile.isUseLombokModelAnnotation(), specFile.getModelPackage(), schemaName, schemaObjectIt.next());
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/AuthObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/AuthObject.java
index c479c801..a63b14b2 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/AuthObject.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/AuthObject.java
@@ -8,6 +8,7 @@
import java.util.ArrayList;
import java.util.List;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/GlobalObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/GlobalObject.java
index 8d12752a..a5109e00 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/GlobalObject.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/GlobalObject.java
@@ -11,6 +11,7 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
+
import com.fasterxml.jackson.databind.JsonNode;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/OperationObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/OperationObject.java
index 61158a40..9f20fb70 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/OperationObject.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/OperationObject.java
@@ -8,6 +8,7 @@
import java.util.ArrayList;
import java.util.List;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/PathObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/PathObject.java
index 6240c11e..a1921fc1 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/PathObject.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/PathObject.java
@@ -8,6 +8,7 @@
import java.util.ArrayList;
import java.util.List;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/RequestObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/RequestObject.java
index f635a035..98e8a6d3 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/RequestObject.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/RequestObject.java
@@ -8,6 +8,7 @@
import java.util.ArrayList;
import java.util.List;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/ResponseObject.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/ResponseObject.java
index 92b75b5d..156f8277 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/ResponseObject.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/model/ResponseObject.java
@@ -8,6 +8,7 @@
import java.util.ArrayList;
import java.util.List;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/template/ClasspathTemplateLoader.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/template/ClasspathTemplateLoader.java
index ab977b65..4a03255a 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/template/ClasspathTemplateLoader.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/template/ClasspathTemplateLoader.java
@@ -6,9 +6,6 @@
package com.sngular.api.generator.plugin.openapi.template;
-import com.sngular.api.generator.plugin.common.template.CommonTemplateLoader;
-import com.sngular.api.generator.plugin.exception.GeneratorTemplateException;
-
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
@@ -16,6 +13,9 @@
import java.util.Map;
import java.util.Objects;
+import com.sngular.api.generator.plugin.common.template.CommonTemplateLoader;
+import com.sngular.api.generator.plugin.exception.GeneratorTemplateException;
+
public class ClasspathTemplateLoader extends CommonTemplateLoader {
private static final List TEMPLATE_FILES = List.of(TemplateIndexConstants.TEMPLATE_INTERFACE_API, TemplateIndexConstants.TEMPLATE_CALL_WEB_API,
@@ -25,6 +25,7 @@ public class ClasspathTemplateLoader extends CommonTemplateLoader {
private static final List TEMPLATE_AUTH_FILES = List.of(TemplateIndexConstants.TEMPLATE_API_KEY, TemplateIndexConstants.TEMPLATE_AUTHENTICATION,
TemplateIndexConstants.TEMPLATE_HTTP_BASIC, TemplateIndexConstants.TEMPLATE_HTTP_BEARER,
TemplateIndexConstants.TEMPLATE_OAUTH, TemplateIndexConstants.TEMPLATE_OAUTH_FLOW);
+
public ClasspathTemplateLoader() {
super();
init(getResourceFolderFiles());
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/template/TemplateFactory.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/template/TemplateFactory.java
index 255ea19d..47905c32 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/template/TemplateFactory.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/template/TemplateFactory.java
@@ -10,6 +10,7 @@
import java.io.IOException;
import java.util.List;
import java.util.Objects;
+
import com.sngular.api.generator.plugin.common.template.CommonTemplateFactory;
import com.sngular.api.generator.plugin.openapi.model.AuthObject;
import com.sngular.api.generator.plugin.openapi.model.PathObject;
@@ -20,10 +21,11 @@ public class TemplateFactory extends CommonTemplateFactory {
private static final String DEFAULT_API_PACKAGE = "com.sngular.api";
- public TemplateFactory(boolean enableOverwrite,
- final File targetFolder,
- final String processedGeneratedSourcesFolder,
- final File baseDir) {
+ public TemplateFactory(
+ boolean enableOverwrite,
+ final File targetFolder,
+ final String processedGeneratedSourcesFolder,
+ final File baseDir) {
super(enableOverwrite, targetFolder, processedGeneratedSourcesFolder, baseDir, new ClasspathTemplateLoader());
}
@@ -59,7 +61,12 @@ public final void fillTemplateAuth(final String apiPackage, final String authNam
writeTemplateToFile(createNameTemplate(authName), apiPackage, authName);
}
- public final void fillTemplate(final SpecFile specFile, final String className,
+ private String createNameTemplate(final String classNameAuth) {
+ return "template" + classNameAuth + ".ftlh";
+ }
+
+ public final void fillTemplate(
+ final SpecFile specFile, final String className,
final List pathObjects, final AuthObject authObject) throws IOException {
addToRoot("className", className);
@@ -79,7 +86,15 @@ public final void fillTemplate(final SpecFile specFile, final String className,
}
writeTemplateToFile(specFile.isCallMode() ? getTemplateClientApi(specFile) : getTemplateApi(specFile),
- StringUtils.defaultIfEmpty(specFile.getApiPackage(), DEFAULT_API_PACKAGE), className + "Api");
+ StringUtils.defaultIfEmpty(specFile.getApiPackage(), DEFAULT_API_PACKAGE), className + "Api");
+ }
+
+ private String getTemplateClientApi(final SpecFile specFile) {
+ return specFile.isReactive() ? TemplateIndexConstants.TEMPLATE_CALL_WEB_API : TemplateIndexConstants.TEMPLATE_CALL_REST_API;
+ }
+
+ private String getTemplateApi(final SpecFile specFile) {
+ return specFile.isReactive() ? TemplateIndexConstants.TEMPLATE_REACTIVE_API : TemplateIndexConstants.TEMPLATE_INTERFACE_API;
}
public final void calculateJavaEEPackage(final Integer springBootVersion) {
@@ -106,16 +121,4 @@ public final void setAuthPackageName(final String packageName) {
addToRoot("packageAuth", packageName);
}
- private String createNameTemplate(final String classNameAuth) {
- return "template" + classNameAuth + ".ftlh";
- }
-
- private String getTemplateClientApi(final SpecFile specFile) {
- return specFile.isReactive() ? TemplateIndexConstants.TEMPLATE_CALL_WEB_API : TemplateIndexConstants.TEMPLATE_CALL_REST_API;
- }
-
- private String getTemplateApi(final SpecFile specFile) {
- return specFile.isReactive() ? TemplateIndexConstants.TEMPLATE_REACTIVE_API : TemplateIndexConstants.TEMPLATE_INTERFACE_API;
- }
-
}
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperAuthUtil.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperAuthUtil.java
index cefde8e2..3241f308 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperAuthUtil.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperAuthUtil.java
@@ -10,6 +10,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.sngular.api.generator.plugin.common.tools.ApiTool;
import com.sngular.api.generator.plugin.common.tools.MapperUtil;
@@ -24,7 +25,8 @@ public class MapperAuthUtil {
private static final String API_KEY = "apiKey";
- private MapperAuthUtil() {}
+ private MapperAuthUtil() {
+ }
public static List createAuthSchemaList(final JsonNode openAPI) {
final ArrayList authList = new ArrayList<>();
@@ -34,13 +36,13 @@ public static List createAuthSchemaList(final JsonNode openAPI
final var typeStr = ApiTool.getType(value);
final var isHttpBearer = "http".equalsIgnoreCase(typeStr) && "bearer".equalsIgnoreCase(ApiTool.getNodeAsString(value, "scheme"));
final var authSchema = AuthSchemaObject
- .builder()
- .name(StringCaseUtils.toCamelCase(MapperUtil.getKey(key)))
- .type(isHttpBearer ? "HttpBearerAuth" : getModelTypeAuth(value))
- .apiKeyParam(API_KEY.equalsIgnoreCase(typeStr) ? ApiTool.getName(value) : "")
- .apiKeyPlace(API_KEY.equalsIgnoreCase(typeStr) ? ApiTool.getNodeAsString(value, "in") : "")
- .bearerSchema(isHttpBearer ? ApiTool.getNodeAsString(value, "scheme") : "")
- .build();
+ .builder()
+ .name(StringCaseUtils.toCamelCase(MapperUtil.getKey(key)))
+ .type(isHttpBearer ? "HttpBearerAuth" : getModelTypeAuth(value))
+ .apiKeyParam(API_KEY.equalsIgnoreCase(typeStr) ? ApiTool.getName(value) : "")
+ .apiKeyPlace(API_KEY.equalsIgnoreCase(typeStr) ? ApiTool.getNodeAsString(value, "in") : "")
+ .bearerSchema(isHttpBearer ? ApiTool.getNodeAsString(value, "scheme") : "")
+ .build();
authList.add(authSchema);
}
return authList;
diff --git a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperPathUtil.java b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperPathUtil.java
index fefa109f..d1fa7daa 100644
--- a/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperPathUtil.java
+++ b/multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperPathUtil.java
@@ -6,24 +6,41 @@
package com.sngular.api.generator.plugin.openapi.utils;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.function.BiConsumer;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.sngular.api.generator.plugin.common.model.SchemaFieldObjectType;
import com.sngular.api.generator.plugin.common.model.SchemaObject;
import com.sngular.api.generator.plugin.common.model.TypeConstants;
-import com.sngular.api.generator.plugin.common.tools.*;
+import com.sngular.api.generator.plugin.common.tools.ApiTool;
+import com.sngular.api.generator.plugin.common.tools.MapperContentUtil;
+import com.sngular.api.generator.plugin.common.tools.MapperUtil;
+import com.sngular.api.generator.plugin.common.tools.SchemaUtil;
+import com.sngular.api.generator.plugin.common.tools.StringCaseUtils;
import com.sngular.api.generator.plugin.openapi.exception.DuplicatedOperationException;
import com.sngular.api.generator.plugin.openapi.exception.InvalidOpenAPIException;
-import com.sngular.api.generator.plugin.openapi.model.*;
+import com.sngular.api.generator.plugin.openapi.model.AuthSchemaObject;
+import com.sngular.api.generator.plugin.openapi.model.ContentObject;
+import com.sngular.api.generator.plugin.openapi.model.GlobalObject;
import com.sngular.api.generator.plugin.openapi.model.GlobalObject.GlobalObjectBuilder;
+import com.sngular.api.generator.plugin.openapi.model.OperationObject;
+import com.sngular.api.generator.plugin.openapi.model.ParameterObject;
+import com.sngular.api.generator.plugin.openapi.model.PathObject;
+import com.sngular.api.generator.plugin.openapi.model.RequestObject;
+import com.sngular.api.generator.plugin.openapi.model.ResponseObject;
import com.sngular.api.generator.plugin.openapi.parameter.SpecFile;
import org.apache.commons.collections4.IteratorUtils;
import org.apache.commons.lang3.StringUtils;
-import java.nio.file.Path;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.function.BiConsumer;
-
public class MapperPathUtil {
public static final String INLINE_PARAMETER = "InlineParameter";
@@ -38,7 +55,8 @@ public class MapperPathUtil {
public static final String SCHEMA = "schema";
- private MapperPathUtil() {}
+ private MapperPathUtil() {
+ }
public static GlobalObject mapOpenApiObjectToOurModels(final JsonNode openAPI, final List authSchemaList) {
final var authList = getSecurityRequirementList(ApiTool.getNode(openAPI, "security"), new ArrayList<>());
@@ -87,7 +105,7 @@ private static List mapOperationObject(final SpecFile specFile,
final List operationIdList = new ArrayList<>();
final var pathNode = path.getValue();
final var pathParameters = new ArrayList();
- for (final Iterator> it = pathNode.fields(); it.hasNext();) {
+ for (final Iterator> it = pathNode.fields(); it.hasNext(); ) {
final var field = it.next();
switch (field.getKey()) {
case "get":
@@ -176,10 +194,10 @@ private static List getResponseList(final JsonNode responses) {
if (Objects.nonNull(response.findValue(CONTENT))) {
response.get(CONTENT).fieldNames().forEachRemaining(
mediaType -> {
- if (!mediaType.equalsIgnoreCase("*/*") && !producesList.contains(mediaType)) {
- producesList.add(mediaType.replace("\"", "\\\""));
- }
- });
+ if (!mediaType.equalsIgnoreCase("*/*") && !producesList.contains(mediaType)) {
+ producesList.add(mediaType.replace("\"", "\\\""));
+ }
+ });
}
});
}
@@ -237,7 +255,7 @@ private static List mapParameterObjects(
}
private static ParameterObject buildParameterObject(
- final SpecFile specFile, final GlobalObject globalObject, final JsonNode refParameter, final Path baseDir) {
+ final SpecFile specFile, final GlobalObject globalObject, final JsonNode refParameter, final Path baseDir) {
final var dateType = getSchemaType(getContentOrSchema(refParameter), TypeConstants.OBJECT, specFile, globalObject, baseDir);
return ParameterObject.builder()
.name(ApiTool.getName(refParameter))
@@ -266,7 +284,7 @@ private static List