This is an automated email from the ASF dual-hosted git repository. zregvart pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 9529789dd2de8e57c66b580f9a7daa5f441e41ec Author: Zoran Regvart <zregv...@apache.org> AuthorDate: Tue Mar 10 23:02:11 2020 +0100 CAMEL-14691: Code cleanup - makes sure that autocloseable resources are used with try-with-resources - parameter names reflect their use - resources are not loaded outside of the `src` directory - methods that can be static are declared as static - methods are not named `get...` - referenced values are used instead of fetched again (e.g. repeated getServers()) - URL class is not used - when possible early exits are taken - doesn't rely on non-standard base path resolution from `basePath` variable (used in example, no bearing on the base path) - removes trailing whitespace - use final where possible - corrects AssertJ usage - adds tests for refactored code --- .../generator/openapi/AppendableGenerator.java | 4 +- .../camel/generator/openapi/FilerGenerator.java | 4 +- .../openapi/MethodBodySourceCodeEmitter.java | 64 +++--- .../camel/generator/openapi/OperationFilter.java | 9 +- .../camel/generator/openapi/OperationVisitor.java | 59 +++--- .../camel/generator/openapi/PathGenerator.java | 4 +- .../camel/generator/openapi/PathVisitor.java | 41 ++-- .../generator/openapi/RestDefinitionEmitter.java | 10 +- .../openapi/RestDslDefinitionGenerator.java | 8 +- .../camel/generator/openapi/RestDslGenerator.java | 230 +++++++++++---------- .../openapi/RestDslSourceCodeGenerator.java | 33 ++- .../generator/openapi/RestDslXmlGenerator.java | 10 +- .../SpringBootProjectSourceCodeGenerator.java | 48 ++--- .../PathSpringBootProjectSourceGeneratorTest.java | 5 +- .../openapi/RestDefinitionEmitterTest.java | 60 +++--- .../generator/openapi/RestDslGeneratorTest.java | 163 ++++++++++++--- .../generator/openapi/RestDslGeneratorV3Test.java | 85 ++++---- .../openapi/RestDslSourceCodeGeneratorTest.java | 13 +- .../openapi/RestDslSourceCodeGeneratorV3Test.java | 19 +- .../generator/openapi/RestDslXmlGeneratorTest.java | 84 ++++---- .../openapi/RestDslXmlGeneratorV3Test.java | 86 ++++---- .../camel/generator/openapi}/openapi-spec.json | 0 .../camel/generator/openapi}/openapi-v2.json | 0 23 files changed, 583 insertions(+), 456 deletions(-) diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/AppendableGenerator.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/AppendableGenerator.java index 3e51540..b76a2ac 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/AppendableGenerator.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/AppendableGenerator.java @@ -23,8 +23,8 @@ import io.apicurio.datamodels.openapi.models.OasDocument; final class AppendableGenerator extends RestDslSourceCodeGenerator<Appendable> { - AppendableGenerator(final OasDocument openapi) { - super(openapi); + AppendableGenerator(final OasDocument document) { + super(document); } @Override diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/FilerGenerator.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/FilerGenerator.java index 093b373..c376842 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/FilerGenerator.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/FilerGenerator.java @@ -25,8 +25,8 @@ import io.apicurio.datamodels.openapi.models.OasDocument; final class FilerGenerator extends RestDslSourceCodeGenerator<Filer> { - FilerGenerator(final OasDocument openapi) { - super(openapi); + FilerGenerator(final OasDocument document) { + super(document); } @Override diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/MethodBodySourceCodeEmitter.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/MethodBodySourceCodeEmitter.java index 34e70bf..dbbe3cd 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/MethodBodySourceCodeEmitter.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/MethodBodySourceCodeEmitter.java @@ -81,38 +81,6 @@ class MethodBodySourceCodeEmitter implements CodeEmitter<MethodSpec> { return builder.build(); } - Object[] argumentsFor(final Object[] args) { - final List<Object> arguments = new ArrayList<>(args.length); - - for (final Object arg : args) { - if (isPrimitiveOrWrapper(arg.getClass())) { - arguments.add(arg); - } else if (arg instanceof String) { - arguments.add(arg); - } else if (arg instanceof Enum) { - arguments.add(arg.getClass()); - arguments.add(arg); - } else if (arg instanceof String[]) { - arguments.add(Arrays.stream((String[]) arg).collect(Collectors.joining(","))); - } - } - - return arguments.toArray(new Object[arguments.size()]); - } - - Object[] extend(final Object first, final Object... others) { - if (others == null || others.length == 0) { - return new Object[] {first}; - } - - final Object[] ret = new Object[1 + others.length]; - - ret[0] = first; - System.arraycopy(others, 0, ret, 1, others.length); - - return ret; - } - int indentLevelOf(final String method) { switch (method) { case "rest": @@ -163,4 +131,36 @@ class MethodBodySourceCodeEmitter implements CodeEmitter<MethodSpec> { return literals.toString(); } + static Object[] argumentsFor(final Object[] args) { + final List<Object> arguments = new ArrayList<>(args.length); + + for (final Object arg : args) { + if (isPrimitiveOrWrapper(arg.getClass())) { + arguments.add(arg); + } else if (arg instanceof String) { + arguments.add(arg); + } else if (arg instanceof Enum) { + arguments.add(arg.getClass()); + arguments.add(arg); + } else if (arg instanceof String[]) { + arguments.add(Arrays.stream((String[]) arg).collect(Collectors.joining(","))); + } + } + + return arguments.toArray(new Object[arguments.size()]); + } + + static Object[] extend(final Object first, final Object... others) { + if (others == null || others.length == 0) { + return new Object[] {first}; + } + + final Object[] ret = new Object[1 + others.length]; + + ret[0] = first; + System.arraycopy(others, 0, ret, 1, others.length); + + return ret; + } + } diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationFilter.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationFilter.java index 82371f6..ad74141 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationFilter.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationFilter.java @@ -22,22 +22,23 @@ import org.apache.camel.support.PatternHelper; class OperationFilter { - // operation names to include separated by comma (wildcards can be used, eg find*) + // operation names to include separated by comma (wildcards can be used, eg + // find*) private String includes; public String getIncludes() { return includes; } - public void setIncludes(String includes) { + public void setIncludes(final String includes) { this.includes = includes; } - boolean accept(String name) { + boolean accept(final String name) { boolean match = true; if (includes != null) { - String[] patterns = includes.split(","); + final String[] patterns = includes.split(","); match = Arrays.stream(patterns).anyMatch(pattern -> PatternHelper.matchPattern(name, pattern)); } return match; diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationVisitor.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationVisitor.java index d905f78..98e7d82 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationVisitor.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationVisitor.java @@ -76,7 +76,7 @@ class OperationVisitor<T> { } if (!parameterType.equals("body")) { if (parameter instanceof Oas20Parameter) { - final Oas20Parameter serializableParameter = (Oas20Parameter)parameter; + final Oas20Parameter serializableParameter = (Oas20Parameter) parameter; final String dataType = serializableParameter.type; emit("dataType", dataType); @@ -86,7 +86,7 @@ class OperationVisitor<T> { emit("collectionFormat", CollectionFormat.valueOf(collectionFormat)); } if (ObjectHelper.isNotEmpty(serializableParameter.default_)) { - String value = serializableParameter.default_.toString(); + final String value = serializableParameter.default_.toString(); emit("defaultValue", value); } @@ -95,8 +95,8 @@ class OperationVisitor<T> { emit("arrayType", items.type); } } else if (parameter instanceof Oas30Parameter) { - final Oas30Parameter serializableParameter = (Oas30Parameter)parameter; - Oas30Schema schema = (Oas30Schema)serializableParameter.schema; + final Oas30Parameter serializableParameter = (Oas30Parameter) parameter; + final Oas30Schema schema = (Oas30Schema) serializableParameter.schema; if (schema != null) { final String dataType = schema.type; if (ObjectHelper.isNotEmpty(dataType)) { @@ -114,13 +114,13 @@ class OperationVisitor<T> { } } if (ObjectHelper.isNotEmpty(schema.default_)) { - String value = schema.default_.toString(); + final String value = schema.default_.toString(); emit("defaultValue", value); } if ("array".equals(dataType) && schema.items != null && schema.items instanceof Oas30ItemsSchema) { - emit("arrayType", ((Oas30ItemsSchema)schema.items).type); + emit("arrayType", ((Oas30ItemsSchema) schema.items).type); } } } @@ -159,59 +159,58 @@ class OperationVisitor<T> { emit("id", operation.operationId); emit("description", operation.description); - List<String> operationLevelConsumes = new ArrayList<String>(); + List<String> operationLevelConsumes = new ArrayList<>(); if (operation instanceof Oas20Operation) { - operationLevelConsumes = ((Oas20Operation)operation).consumes; + operationLevelConsumes = ((Oas20Operation) operation).consumes; } else if (operation instanceof Oas30Operation) { - Oas30Operation oas30Operation = (Oas30Operation)operation; - if (oas30Operation.requestBody != null - && oas30Operation.requestBody.content != null) { - for (String ct : oas30Operation.requestBody.content.keySet()) { + final Oas30Operation oas30Operation = (Oas30Operation) operation; + if (oas30Operation.requestBody != null + && oas30Operation.requestBody.content != null) { + for (final String ct : oas30Operation.requestBody.content.keySet()) { operationLevelConsumes.add(ct); } } - + } emit("consumes", operationLevelConsumes); - List<String> operationLevelProduces = new ArrayList<String>(); + List<String> operationLevelProduces = new ArrayList<>(); if (operation instanceof Oas20Operation) { - operationLevelProduces = ((Oas20Operation)operation).produces; + operationLevelProduces = ((Oas20Operation) operation).produces; } else if (operation instanceof Oas30Operation) { - Oas30Operation oas30Operation = (Oas30Operation)operation; + final Oas30Operation oas30Operation = (Oas30Operation) operation; if (oas30Operation.responses != null) { - for (OasResponse response : oas30Operation.responses.getResponses()) { - Oas30Response oas30Response = (Oas30Response)response; - for (String ct : oas30Response.content.keySet()) { + for (final OasResponse response : oas30Operation.responses.getResponses()) { + final Oas30Response oas30Response = (Oas30Response) response; + for (final String ct : oas30Response.content.keySet()) { operationLevelProduces.add(ct); } } } } emit("produces", operationLevelProduces); - + if (operation.getParameters() != null) { operation.getParameters().forEach(parameter -> { emit(parameter); }); } if (operation instanceof Oas30Operation) { - emitOas30Operation((Oas30Operation)operation); + emitOas30Operation((Oas30Operation) operation); } emitter.emit("to", destinationGenerator.generateDestinationFor(operation)); } } - private CodeEmitter<T> emitOas30Operation(Oas30Operation operation) { - + private CodeEmitter<T> emitOas30Operation(final Oas30Operation operation) { if (operation.requestBody != null) { boolean foundForm = false; - Oas30RequestBody requestBody = operation.requestBody; - for (Entry<String, Oas30MediaType> entry : requestBody.content.entrySet()) { - String ct = entry.getKey(); - Oas30MediaType mediaType = entry.getValue(); + final Oas30RequestBody requestBody = operation.requestBody; + for (final Entry<String, Oas30MediaType> entry : requestBody.content.entrySet()) { + final String ct = entry.getKey(); + final Oas30MediaType mediaType = entry.getValue(); if (ct.contains("form") && mediaType.schema.properties != null) { - for (Entry<String, OasSchema> entrySchema : mediaType.schema.properties.entrySet()) { + for (final Entry<String, OasSchema> entrySchema : mediaType.schema.properties.entrySet()) { foundForm = true; emitter.emit("param"); emit("name", entrySchema.getKey()); @@ -232,8 +231,8 @@ class OperationVisitor<T> { emitter.emit("endParam"); } } - + return emitter; - + } } diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/PathGenerator.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/PathGenerator.java index f89aba8..148e449 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/PathGenerator.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/PathGenerator.java @@ -24,8 +24,8 @@ import io.apicurio.datamodels.openapi.models.OasDocument; final class PathGenerator extends RestDslSourceCodeGenerator<Path> { - PathGenerator(final OasDocument openapi) { - super(openapi); + PathGenerator(final OasDocument document) { + super(document); } @Override diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/PathVisitor.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/PathVisitor.java index ca3c0bc..a6cac93 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/PathVisitor.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/PathVisitor.java @@ -28,9 +28,20 @@ class PathVisitor<T> { private final DestinationGenerator destinationGenerator; private final CodeEmitter<T> emitter; + private final OperationFilter filter; - PathVisitor(final String basePath, final CodeEmitter<T> emitter, OperationFilter filter, final DestinationGenerator destinationGenerator) { + public enum HttpMethod { + DELETE, + GET, + HEAD, + OPTIONS, + PATCH, + POST, + PUT + } + + PathVisitor(final String basePath, final CodeEmitter<T> emitter, final OperationFilter filter, final DestinationGenerator destinationGenerator) { this.emitter = emitter; this.filter = filter; this.destinationGenerator = destinationGenerator; @@ -42,20 +53,20 @@ class PathVisitor<T> { } } + void visit(final OasPathItem definition) { + final OperationVisitor<T> restDslOperation = new OperationVisitor<>(emitter, filter, definition.getPath(), destinationGenerator); + + operationMapFrom(definition).forEach(restDslOperation::visit); + } + void visit(final String path, final OasPathItem definition) { final OperationVisitor<T> restDslOperation = new OperationVisitor<>(emitter, filter, path, destinationGenerator); - getOperationMap(definition).forEach(restDslOperation::visit); + operationMapFrom(definition).forEach(restDslOperation::visit); } - - void visit(final OasPathItem definition) { - final OperationVisitor<T> restDslOperation = new OperationVisitor<>(emitter, filter, definition.getPath(), destinationGenerator); - getOperationMap(definition).forEach(restDslOperation::visit); - } - - private Map<HttpMethod, OasOperation> getOperationMap(OasPathItem path) { - Map<HttpMethod, OasOperation> result = new LinkedHashMap<HttpMethod, OasOperation>(); + private static Map<HttpMethod, OasOperation> operationMapFrom(final OasPathItem path) { + final Map<HttpMethod, OasOperation> result = new LinkedHashMap<>(); if (path.get != null) { result.put(HttpMethod.GET, path.get); @@ -81,15 +92,5 @@ class PathVisitor<T> { return result; } - - public enum HttpMethod { - POST, - GET, - PUT, - PATCH, - DELETE, - HEAD, - OPTIONS - } } diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDefinitionEmitter.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDefinitionEmitter.java index 955647b..bcad4fe 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDefinitionEmitter.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDefinitionEmitter.java @@ -49,9 +49,9 @@ class RestDefinitionEmitter implements CodeEmitter<RestsDefinition> { } catch (final Throwable e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; - } else { - throw new IllegalStateException(e); } + + throw new IllegalStateException(e); } return this; @@ -62,7 +62,7 @@ class RestDefinitionEmitter implements CodeEmitter<RestsDefinition> { return definition; } - Object[] argumentsFor(final Object[] args) { + static Object[] argumentsFor(final Object[] args) { final List<Object> arguments = new ArrayList<>(args.length); for (final Object arg : args) { @@ -76,7 +76,7 @@ class RestDefinitionEmitter implements CodeEmitter<RestsDefinition> { return arguments.toArray(new Object[arguments.size()]); } - Class<?>[] parameterTypesOf(final Object[] args) { + static Class<?>[] parameterTypesOf(final Object[] args) { final Class<?>[] parameterTypes = new Class<?>[args.length]; for (int i = 0; i < args.length; i++) { @@ -86,7 +86,7 @@ class RestDefinitionEmitter implements CodeEmitter<RestsDefinition> { return parameterTypes; } - Class<?>[] typesOf(final Object[] args) { + static Class<?>[] typesOf(final Object[] args) { final Class<?>[] types = new Class<?>[args.length]; for (int i = 0; i < types.length; i++) { diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslDefinitionGenerator.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslDefinitionGenerator.java index 27ae620..3fdb374 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslDefinitionGenerator.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslDefinitionGenerator.java @@ -22,16 +22,16 @@ import org.apache.camel.model.rest.RestsDefinition; public final class RestDslDefinitionGenerator extends RestDslGenerator<RestDslDefinitionGenerator> { - RestDslDefinitionGenerator(final OasDocument openapi) { - super(openapi); + RestDslDefinitionGenerator(final OasDocument document) { + super(document); } public RestsDefinition generate(final CamelContext context) { final RestDefinitionEmitter emitter = new RestDefinitionEmitter(context); - String basePath = RestDslGenerator.getBasePathFromOasDocument(openapi); + final String basePath = RestDslGenerator.determineBasePathFrom(document); final PathVisitor<RestsDefinition> restDslStatement = new PathVisitor<>(basePath, emitter, filter, destinationGenerator()); - openapi.paths.getPathItems().forEach(restDslStatement::visit); + document.paths.getPathItems().forEach(restDslStatement::visit); return emitter.result(); } diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslGenerator.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslGenerator.java index 90d243f..b2b7c48 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslGenerator.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslGenerator.java @@ -16,21 +16,20 @@ */ package org.apache.camel.generator.openapi; -import java.net.MalformedURLException; -import java.net.URL; +import java.net.URI; import java.nio.file.Path; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.util.List; +import java.util.Objects; import javax.annotation.processing.Filer; +import io.apicurio.datamodels.core.models.common.Server; +import io.apicurio.datamodels.core.models.common.ServerVariable; import io.apicurio.datamodels.openapi.models.OasDocument; import io.apicurio.datamodels.openapi.v2.models.Oas20Document; import io.apicurio.datamodels.openapi.v3.models.Oas30Document; import io.apicurio.datamodels.openapi.v3.models.Oas30Server; import org.apache.camel.model.rest.RestsDefinition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import static org.apache.camel.util.ObjectHelper.notNull; @@ -40,25 +39,28 @@ import static org.apache.camel.util.ObjectHelper.notNull; */ public abstract class RestDslGenerator<G> { - private static final Logger LOG = LoggerFactory.getLogger(RestDslGenerator.class); - final OasDocument openapi; + String apiContextPath; - DestinationGenerator destinationGenerator = new DirectToOperationId(); + + final OasDocument document; + OperationFilter filter = new OperationFilter(); + String restComponent; + String restContextPath; - String apiContextPath; - boolean springComponent; + boolean springBootProject; - RestDslGenerator(final OasDocument openapi) { - this.openapi = notNull(openapi, "openapi"); + boolean springComponent; + + RestDslGenerator(final OasDocument document) { + this.document = notNull(document, "document"); } - public G withDestinationGenerator(final DestinationGenerator directRouteGenerator) { - notNull(directRouteGenerator, "directRouteGenerator"); - this.destinationGenerator = directRouteGenerator; + public G asSpringBootProject() { + this.springBootProject = true; @SuppressWarnings("unchecked") final G that = (G) this; @@ -66,12 +68,8 @@ public abstract class RestDslGenerator<G> { return that; } - DestinationGenerator destinationGenerator() { - return destinationGenerator; - } - - public G withOperationFilter(OperationFilter filter) { - this.filter = filter; + public G asSpringComponent() { + this.springComponent = true; @SuppressWarnings("unchecked") final G that = (G) this; @@ -79,8 +77,8 @@ public abstract class RestDslGenerator<G> { return that; } - public G withOperationFilter(String include) { - this.filter.setIncludes(include); + public G withApiContextPath(final String contextPath) { + this.apiContextPath = contextPath; @SuppressWarnings("unchecked") final G that = (G) this; @@ -88,8 +86,9 @@ public abstract class RestDslGenerator<G> { return that; } - public G withRestComponent(String restComponent) { - this.restComponent = restComponent; + public G withDestinationGenerator(final DestinationGenerator directRouteGenerator) { + notNull(directRouteGenerator, "directRouteGenerator"); + this.destinationGenerator = directRouteGenerator; @SuppressWarnings("unchecked") final G that = (G) this; @@ -97,17 +96,17 @@ public abstract class RestDslGenerator<G> { return that; } - public G withRestContextPath(String contextPath) { - this.restContextPath = contextPath; + public G withOperationFilter(final OperationFilter filter) { + this.filter = filter; @SuppressWarnings("unchecked") final G that = (G) this; return that; } - - public G withApiContextPath(String contextPath) { - this.apiContextPath = contextPath; + + public G withOperationFilter(final String include) { + this.filter.setIncludes(include); @SuppressWarnings("unchecked") final G that = (G) this; @@ -115,8 +114,8 @@ public abstract class RestDslGenerator<G> { return that; } - public G asSpringComponent() { - this.springComponent = true; + public G withRestComponent(final String restComponent) { + this.restComponent = restComponent; @SuppressWarnings("unchecked") final G that = (G) this; @@ -124,8 +123,8 @@ public abstract class RestDslGenerator<G> { return that; } - public G asSpringBootProject() { - this.springBootProject = true; + public G withRestContextPath(final String contextPath) { + this.restContextPath = contextPath; @SuppressWarnings("unchecked") final G that = (G) this; @@ -133,93 +132,98 @@ public abstract class RestDslGenerator<G> { return that; } - public static RestDslSourceCodeGenerator<Appendable> toAppendable(final OasDocument openapi) { - return new AppendableGenerator(openapi); + DestinationGenerator destinationGenerator() { + return destinationGenerator; } - public static RestDslDefinitionGenerator toDefinition(final OasDocument openapi) { - return new RestDslDefinitionGenerator(openapi); - } + public static String determineBasePathFrom(final OasDocument document) { + Objects.requireNonNull(document, "document"); - public static RestDslXmlGenerator toXml(final OasDocument openapi) { - return new RestDslXmlGenerator(openapi); - } + if (document instanceof Oas20Document) { + return ((Oas20Document) document).basePath; + } else if (document instanceof Oas30Document) { + final Oas30Document oas30Document = (Oas30Document) document; + final List<Server> servers = oas30Document.getServers(); - public static RestDslSourceCodeGenerator<Filer> toFiler(final OasDocument openapi) { - return new FilerGenerator(openapi); - } + if (servers == null || servers.get(0) == null) { + return ""; + } - public static RestDslSourceCodeGenerator<Path> toPath(final OasDocument openapi) { - return new PathGenerator(openapi); - } - - public static String getHostFromOasDocument(final OasDocument openapi) { - String host = null; - if (openapi instanceof Oas20Document) { - host = ((Oas20Document)openapi).host; - } else if (openapi instanceof Oas30Document) { - if (((Oas30Document)openapi).getServers() != null - && ((Oas30Document)openapi).getServers().get(0) != null) { - try { - URL serverUrl = new URL(parseVariables(((Oas30Document)openapi).getServers().get(0).url, (Oas30Server)((Oas30Document)openapi).getServers().get(0))); - host = serverUrl.getHost(); - - } catch (MalformedURLException e) { - LOG.info("error when parsing OpenApi 3.0 doc server url", e); - } + final Oas30Server firstServer = (Oas30Server) servers.get(0); + final URI serverUrl = URI.create(resolveVariablesIn(firstServer.url, firstServer)); + String basePath = serverUrl.getPath(); + if (basePath == null || basePath.length() == 0) { + return ""; } - } - return host; - - } - - public static String getBasePathFromOasDocument(final OasDocument openapi) { - String basePath = null; - if (openapi instanceof Oas20Document) { - basePath = ((Oas20Document)openapi).basePath; - } else if (openapi instanceof Oas30Document) { - if (((Oas30Document)openapi).getServers() != null - && ((Oas30Document)openapi).getServers().get(0) != null) { - try { - Oas30Server server = (Oas30Server)((Oas30Document)openapi).getServers().get(0); - if (server.variables != null && server.variables.get("basePath") != null) { - basePath = server.variables.get("basePath").default_; - } - if (basePath == null) { - // parse server url as fallback - URL serverUrl = new URL(parseVariables(((Oas30Document)openapi).getServers().get(0).url, server)); - basePath = serverUrl.getPath(); - if (basePath.indexOf("//") == 0) { - // strip off the first "/" if double "/" exists - basePath = basePath.substring(1); - } - if ("/".equals(basePath)) { - basePath = ""; - } - } - - } catch (MalformedURLException e) { - //not a valid whole url, just the basePath - basePath = ((Oas30Document)openapi).getServers().get(0).url; - } + + if (basePath.charAt(0) != '/') { + basePath = "/" + basePath; } - + + if (basePath.indexOf("//") == 0) { + // strip off the first "/" if double "/" exists + basePath = basePath.substring(1); + } + + if ("/".equals(basePath)) { + basePath = ""; + } + + return basePath; } - return basePath; - - } - - public static String parseVariables(String url, Oas30Server server) { - Pattern p = Pattern.compile("\\{(.*?)\\}"); - Matcher m = p.matcher(url); - while (m.find()) { - - String var = m.group(1); - if (server != null && server.variables != null && server.variables.get(var) != null) { - String varValue = server.variables.get(var).default_; - url = url.replace("{" + var + "}", varValue); + + throw new IllegalArgumentException("Unsupported document type: " + document.getClass().getName()); + } + + public static String determineHostFrom(final OasDocument document) { + if (document instanceof Oas20Document) { + return ((Oas20Document) document).host; + } else if (document instanceof Oas30Document) { + final Oas30Document oas30Document = (Oas30Document) document; + final List<Server> servers = oas30Document.getServers(); + + if (servers == null || servers.get(0) == null) { + return ""; } + + final Oas30Server firstServer = (Oas30Server) servers.get(0); + + final URI serverUrl = URI.create(resolveVariablesIn(firstServer.url, firstServer)); + + return serverUrl.getHost(); } - return url; + + throw new IllegalArgumentException("Unsupported document type: " + document.getClass().getName()); + } + + public static String resolveVariablesIn(final String url, final Oas30Server server) { + final List<ServerVariable> variables = Objects.requireNonNull(server, "server").getServerVariables(); + String withoutPlaceholders = url; + for (final ServerVariable variable : variables) { + final String name = "{" + variable.getName() + "}"; + withoutPlaceholders = withoutPlaceholders.replace(name, variable.default_); + } + + return withoutPlaceholders; + } + + public static RestDslSourceCodeGenerator<Appendable> toAppendable(final OasDocument document) { + return new AppendableGenerator(document); + } + + public static RestDslDefinitionGenerator toDefinition(final OasDocument document) { + return new RestDslDefinitionGenerator(document); + } + + public static RestDslSourceCodeGenerator<Filer> toFiler(final OasDocument document) { + return new FilerGenerator(document); + } + + public static RestDslSourceCodeGenerator<Path> toPath(final OasDocument document) { + return new PathGenerator(document); + } + + public static RestDslXmlGenerator toXml(final OasDocument document) { + return new RestDslXmlGenerator(document); } } diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslSourceCodeGenerator.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslSourceCodeGenerator.java index 70d9aa7..5750954 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslSourceCodeGenerator.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslSourceCodeGenerator.java @@ -43,7 +43,7 @@ public abstract class RestDslSourceCodeGenerator<T> extends RestDslGenerator<Res static final String DEFAULT_CLASS_NAME = "RestDslRoute"; static final String DEFAULT_PACKAGE_NAME = "rest.dsl.generated"; - + private static final String DEFAULT_INDENT = " "; private Function<OasDocument, String> classNameGenerator = RestDslSourceCodeGenerator::generateClassName; @@ -56,8 +56,8 @@ public abstract class RestDslSourceCodeGenerator<T> extends RestDslGenerator<Res private boolean sourceCodeTimestamps; - RestDslSourceCodeGenerator(final OasDocument openapi) { - super(openapi); + RestDslSourceCodeGenerator(final OasDocument document) { + super(document); } public abstract void generate(T destination) throws IOException; @@ -94,7 +94,7 @@ public abstract class RestDslSourceCodeGenerator<T> extends RestDslGenerator<Res return this; } - MethodSpec generateConfigureMethod(final OasDocument openapi) { + MethodSpec generateConfigureMethod(final OasDocument document) { final MethodSpec.Builder configure = MethodSpec.methodBuilder("configure").addModifiers(Modifier.PUBLIC) .returns(void.class).addJavadoc("Defines Apache Camel routes using REST DSL fluent API.\n"); @@ -112,10 +112,10 @@ public abstract class RestDslSourceCodeGenerator<T> extends RestDslGenerator<Res configure.addCode(";\n\n"); } - String basePath = RestDslGenerator.getBasePathFromOasDocument(openapi); - + final String basePath = RestDslGenerator.determineBasePathFrom(document); + final PathVisitor<MethodSpec> restDslStatement = new PathVisitor<>(basePath, emitter, filter, destinationGenerator()); - openapi.paths.getItems().forEach(restDslStatement::visit); + document.paths.getItems().forEach(restDslStatement::visit); return emitter.result(); } @@ -124,9 +124,9 @@ public abstract class RestDslSourceCodeGenerator<T> extends RestDslGenerator<Res } JavaFile generateSourceCode() { - final MethodSpec methodSpec = generateConfigureMethod(openapi); + final MethodSpec methodSpec = generateConfigureMethod(document); - final String classNameToUse = classNameGenerator.apply(openapi); + final String classNameToUse = classNameGenerator.apply(document); final AnnotationSpec.Builder generatedAnnotation = AnnotationSpec.builder(Generated.class).addMember("value", "$S", getClass().getName()); @@ -134,7 +134,7 @@ public abstract class RestDslSourceCodeGenerator<T> extends RestDslGenerator<Res generatedAnnotation.addMember("date", "$S", generated()); } - TypeSpec.Builder builder = TypeSpec.classBuilder(classNameToUse).superclass(RouteBuilder.class) + final TypeSpec.Builder builder = TypeSpec.classBuilder(classNameToUse).superclass(RouteBuilder.class) .addModifiers(Modifier.PUBLIC, Modifier.FINAL).addMethod(methodSpec) .addAnnotation(generatedAnnotation.build()) .addJavadoc("Generated from OpenApi specification by Camel REST DSL generator.\n"); @@ -142,9 +142,9 @@ public abstract class RestDslSourceCodeGenerator<T> extends RestDslGenerator<Res final AnnotationSpec.Builder springAnnotation = AnnotationSpec.builder(ClassName.bestGuess("org.springframework.stereotype.Component")); builder.addAnnotation(springAnnotation.build()); } - TypeSpec generatedRouteBuilder = builder.build(); + final TypeSpec generatedRouteBuilder = builder.build(); - final String packageNameToUse = packageNameGenerator.apply(openapi); + final String packageNameToUse = packageNameGenerator.apply(document); return JavaFile.builder(packageNameToUse, generatedRouteBuilder).indent(indent).build(); } @@ -155,8 +155,8 @@ public abstract class RestDslSourceCodeGenerator<T> extends RestDslGenerator<Res return this; } - static String generateClassName(final OasDocument openapi) { - final OasInfo info = (OasInfo)openapi.info; + static String generateClassName(final OasDocument document) { + final OasInfo info = (OasInfo) document.info; if (info == null) { return DEFAULT_CLASS_NAME; } @@ -177,9 +177,8 @@ public abstract class RestDslSourceCodeGenerator<T> extends RestDslGenerator<Res return className; } - static String generatePackageName(final OasDocument openapi) { - String host = RestDslGenerator.getHostFromOasDocument(openapi); - + static String generatePackageName(final OasDocument document) { + final String host = RestDslGenerator.determineHostFrom(document); if (ObjectHelper.isNotEmpty(host)) { final StringBuilder packageName = new StringBuilder(); diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslXmlGenerator.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslXmlGenerator.java index a1ce847..a0a4718 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslXmlGenerator.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslXmlGenerator.java @@ -43,20 +43,20 @@ public class RestDslXmlGenerator extends RestDslGenerator<RestDslXmlGenerator> { private boolean blueprint; - RestDslXmlGenerator(final OasDocument openapi) { - super(openapi); + RestDslXmlGenerator(final OasDocument document) { + super(document); } public String generate(final CamelContext context) throws Exception { final RestDefinitionEmitter emitter = new RestDefinitionEmitter(context); - String basePath = RestDslGenerator.getBasePathFromOasDocument(openapi); + final String basePath = RestDslGenerator.determineBasePathFrom(document); final PathVisitor<RestsDefinition> restDslStatement = new PathVisitor<>(basePath, emitter, filter, destinationGenerator()); - openapi.paths.getPathItems().forEach(restDslStatement::visit); + document.paths.getPathItems().forEach(restDslStatement::visit); final RestsDefinition rests = emitter.result(); - ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class); + final ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class); final String xml = ecc.getModelToXMLDumper().dumpModelAsXml(context, rests); final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/SpringBootProjectSourceCodeGenerator.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/SpringBootProjectSourceCodeGenerator.java index dfd2604..4cf536d 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/SpringBootProjectSourceCodeGenerator.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/SpringBootProjectSourceCodeGenerator.java @@ -39,7 +39,7 @@ public class SpringBootProjectSourceCodeGenerator { private String packageName; - public void generate(Path destination) throws IOException { + public void generate(final Path destination) throws IOException { final JavaFile javaFile = generateSourceCode(); javaFile.writeTo(destination); @@ -56,30 +56,9 @@ public class SpringBootProjectSourceCodeGenerator { return this; } - JavaFile generateSourceCode() { - notEmpty(packageName, "packageName"); - - final MethodSpec methodSpec = generateRestMethod(); - - final String classNameToUse = "CamelRestController"; - - final AnnotationSpec.Builder generatedAnnotation = AnnotationSpec.builder(Generated.class).addMember("value", - "$S", getClass().getName()); - final AnnotationSpec.Builder restAnnotation = AnnotationSpec.builder(ClassName.bestGuess("org.springframework.web.bind.annotation.RestController")); - - TypeSpec.Builder builder = TypeSpec.classBuilder(classNameToUse) - .addModifiers(Modifier.PUBLIC, Modifier.FINAL).addMethod(methodSpec) - .addAnnotation(generatedAnnotation.build()) - .addAnnotation(restAnnotation.build()) - .addJavadoc("Forward requests to the Camel servlet so it can service REST requests.\n"); - TypeSpec generatedRestController = builder.build(); - - return JavaFile.builder(packageName, generatedRestController).indent(indent).build(); - } - MethodSpec generateRestMethod() { - ClassName req = ClassName.bestGuess("javax.servlet.http.HttpServletRequest"); - ClassName res = ClassName.bestGuess("javax.servlet.http.HttpServletResponse"); + final ClassName req = ClassName.bestGuess("javax.servlet.http.HttpServletRequest"); + final ClassName res = ClassName.bestGuess("javax.servlet.http.HttpServletResponse"); final AnnotationSpec.Builder reqAnnotation = AnnotationSpec.builder(ClassName.bestGuess("org.springframework.web.bind.annotation.RequestMapping")) .addMember("value", "\"/**\""); @@ -100,6 +79,27 @@ public class SpringBootProjectSourceCodeGenerator { return forward.build(); } + JavaFile generateSourceCode() { + notEmpty(packageName, "packageName"); + + final MethodSpec methodSpec = generateRestMethod(); + + final String classNameToUse = "CamelRestController"; + + final AnnotationSpec.Builder generatedAnnotation = AnnotationSpec.builder(Generated.class).addMember("value", + "$S", getClass().getName()); + final AnnotationSpec.Builder restAnnotation = AnnotationSpec.builder(ClassName.bestGuess("org.springframework.web.bind.annotation.RestController")); + + final TypeSpec.Builder builder = TypeSpec.classBuilder(classNameToUse) + .addModifiers(Modifier.PUBLIC, Modifier.FINAL).addMethod(methodSpec) + .addAnnotation(generatedAnnotation.build()) + .addAnnotation(restAnnotation.build()) + .addJavadoc("Forward requests to the Camel servlet so it can service REST requests.\n"); + final TypeSpec generatedRestController = builder.build(); + + return JavaFile.builder(packageName, generatedRestController).indent(indent).build(); + } + public static SpringBootProjectSourceCodeGenerator generator() { return new SpringBootProjectSourceCodeGenerator(); } diff --git a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/PathSpringBootProjectSourceGeneratorTest.java b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/PathSpringBootProjectSourceGeneratorTest.java index e7d6a46..3c3e973 100644 --- a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/PathSpringBootProjectSourceGeneratorTest.java +++ b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/PathSpringBootProjectSourceGeneratorTest.java @@ -33,9 +33,10 @@ public class PathSpringBootProjectSourceGeneratorTest { @Test public void shouldGenerateSourceCodeWithDefaults() throws IOException, URISyntaxException { - Path path = new File("target/generated-sources").toPath(); + final Path path = new File("target/generated-sources").toPath(); SpringBootProjectSourceCodeGenerator.generator().withPackageName("com.foo").generate(path); - final String generatedContent = new String(Files.readAllBytes(Paths.get("target/generated-sources/com/foo/CamelRestController.java")), StandardCharsets.UTF_8); + final String generatedContent = new String(Files.readAllBytes(Paths.get("target/generated-sources/com/foo/CamelRestController.java")), + StandardCharsets.UTF_8); final URI file = PathSpringBootProjectSourceGeneratorTest.class.getResource("/SpringBootRestController.txt").toURI(); final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); diff --git a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDefinitionEmitterTest.java b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDefinitionEmitterTest.java index 132c218..a863bb9 100644 --- a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDefinitionEmitterTest.java +++ b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDefinitionEmitterTest.java @@ -16,6 +16,7 @@ */ package org.apache.camel.generator.openapi; +import java.io.IOException; import java.util.List; import org.apache.camel.impl.DefaultCamelContext; @@ -30,41 +31,42 @@ import static org.assertj.core.api.Assertions.assertThat; public class RestDefinitionEmitterTest { @Test - public void shouldGenerateObjects() { - final DefaultCamelContext context = new DefaultCamelContext(); + public void shouldGenerateObjects() throws IOException { + try (DefaultCamelContext context = new DefaultCamelContext()) { - final RestDefinitionEmitter emitter = new RestDefinitionEmitter(context); + final RestDefinitionEmitter emitter = new RestDefinitionEmitter(context); - emitter.emit("rest"); - emitter.emit("put", "/pet"); - emitter.emit("consumes", new Object[] {new String[] {"application/json", "application/xml"}}); - emitter.emit("produces", new Object[] {new String[] {"application/xml", "application/json"}}); - emitter.emit("param"); - emitter.emit("name", "body"); - emitter.emit("type", RestParamType.body); - emitter.emit("required", true); - emitter.emit("endParam"); + emitter.emit("rest"); + emitter.emit("put", "/pet"); + emitter.emit("consumes", new Object[] {new String[] {"application/json", "application/xml"}}); + emitter.emit("produces", new Object[] {new String[] {"application/xml", "application/json"}}); + emitter.emit("param"); + emitter.emit("name", "body"); + emitter.emit("type", RestParamType.body); + emitter.emit("required", true); + emitter.emit("endParam"); - final RestsDefinition result = emitter.result(); - final List<RestDefinition> rests = result.getRests(); - assertThat(rests).hasSize(1); + final RestsDefinition result = emitter.result(); + final List<RestDefinition> rests = result.getRests(); + assertThat(rests).hasSize(1); - final RestDefinition rest = rests.get(0); - final List<VerbDefinition> verbs = rest.getVerbs(); - assertThat(verbs).hasSize(1); + final RestDefinition rest = rests.get(0); + final List<VerbDefinition> verbs = rest.getVerbs(); + assertThat(verbs).hasSize(1); - final VerbDefinition definition = verbs.get(0); - assertThat(definition.asVerb()).isEqualTo("put"); - assertThat(definition.getUri()).isEqualTo("/pet"); - assertThat(definition.getConsumes()).isEqualTo("application/json,application/xml"); - assertThat(definition.getProduces()).isEqualTo("application/xml,application/json"); + final VerbDefinition definition = verbs.get(0); + assertThat(definition.asVerb()).isEqualTo("put"); + assertThat(definition.getUri()).isEqualTo("/pet"); + assertThat(definition.getConsumes()).isEqualTo("application/json,application/xml"); + assertThat(definition.getProduces()).isEqualTo("application/xml,application/json"); - final List<RestOperationParamDefinition> params = definition.getParams(); - assertThat(params).hasSize(1); + final List<RestOperationParamDefinition> params = definition.getParams(); + assertThat(params).hasSize(1); - final RestOperationParamDefinition param = params.get(0); - assertThat(param.getName()).isEqualTo("body"); - assertThat(param.getType()).isEqualTo(RestParamType.body); - assertThat(param.getRequired()).isEqualTo(true); + final RestOperationParamDefinition param = params.get(0); + assertThat(param.getName()).isEqualTo("body"); + assertThat(param.getType()).isEqualTo(RestParamType.body); + assertThat(param.getRequired()).isEqualTo(true); + } } } diff --git a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslGeneratorTest.java b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslGeneratorTest.java index 9dcde26..1b84880 100644 --- a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslGeneratorTest.java +++ b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslGeneratorTest.java @@ -16,20 +16,24 @@ */ package org.apache.camel.generator.openapi; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.time.Instant; +import java.util.Collections; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import io.apicurio.datamodels.Library; import io.apicurio.datamodels.openapi.models.OasDocument; +import io.apicurio.datamodels.openapi.v2.models.Oas20Document; +import io.apicurio.datamodels.openapi.v3.models.Oas30Document; +import io.apicurio.datamodels.openapi.v3.models.Oas30Server; +import io.apicurio.datamodels.openapi.v3.models.Oas30ServerVariable; import org.apache.camel.CamelContext; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.model.rest.RestsDefinition; @@ -40,36 +44,74 @@ import static org.assertj.core.api.Assertions.assertThat; public class RestDslGeneratorTest { - static OasDocument openapi; - + static OasDocument document; + final Instant generated = Instant.parse("2017-10-17T00:00:00.000Z"); - - @BeforeClass - public static void readOpenApiDoc() throws Exception { - ObjectMapper mapper = new ObjectMapper(); - FileInputStream fis = new FileInputStream(new File("openapi-v2.json")); - JsonNode node = mapper.readTree(fis); - openapi = (OasDocument)Library.readDocument(node); + @Test + public void shouldCreateDefinitions() throws IOException { + try (CamelContext context = new DefaultCamelContext()) { + final RestsDefinition definition = RestDslGenerator.toDefinition(document).generate(context); + assertThat(definition).isNotNull(); + assertThat(definition.getRests()).hasSize(1); + assertThat(definition.getRests().get(0).getPath()).isEqualTo("/v2"); + } + } + + @Test + public void shouldDetermineBasePathFromV2Document() { + final Oas20Document oas20Document = new Oas20Document(); + oas20Document.basePath = "/api"; + assertThat(RestDslGenerator.determineBasePathFrom(oas20Document)).isEqualTo("/api"); } @Test - public void shouldCreateDefinitions() { - final CamelContext context = new DefaultCamelContext(); + public void shouldDetermineBasePathFromV3DocumentsServerUrl() { + final Oas30Document oas30Document = new Oas30Document(); + final Oas30Server server = new Oas30Server(); + server.url = "https://example.com/api"; - final RestsDefinition definition = RestDslGenerator.toDefinition(openapi).generate(context); - assertThat(definition).isNotNull(); - assertThat(definition.getRests()).hasSize(1); - assertThat(definition.getRests().get(0).getPath()).isEqualTo("/v2"); - - + oas30Document.servers = Collections.singletonList(server); + assertThat(RestDslGenerator.determineBasePathFrom(oas30Document)).isEqualTo("/api"); + } + + @Test + public void shouldDetermineBasePathFromV3DocumentsServerUrlWithTemplateVariables() { + final Oas30Document oas30Document = new Oas30Document(); + final Oas30Server server = new Oas30Server(); + addVariableTo(server, "base", "api"); + addVariableTo(server, "path", "v3"); + server.url = "https://example.com/{base}/{path}"; + + oas30Document.servers = Collections.singletonList(server); + assertThat(RestDslGenerator.determineBasePathFrom(oas30Document)).isEqualTo("/api/v3"); + } + + @Test + public void shouldDetermineBasePathFromV3DocumentsWhenServerUrlIsRelative() { + final Oas30Document oas30Document = new Oas30Document(); + final Oas30Server server = new Oas30Server(); + server.url = "/api/v3"; + + oas30Document.servers = Collections.singletonList(server); + assertThat(RestDslGenerator.determineBasePathFrom(oas30Document)).isEqualTo("/api/v3"); + } + + @Test + public void shouldDetermineBasePathFromV3DocumentsWhenServerUrlIsRelativeWithoutStartingSlash() { + final Oas30Document oas30Document = new Oas30Document(); + final Oas30Server server = new Oas30Server(); + server.url = "api/v3"; + + oas30Document.servers = Collections.singletonList(server); + assertThat(RestDslGenerator.determineBasePathFrom(oas30Document)).isEqualTo("/api/v3"); } @Test public void shouldGenerateSourceCodeWithDefaults() throws IOException, URISyntaxException { final StringBuilder code = new StringBuilder(); - RestDslGenerator.toAppendable(openapi).withGeneratedTime(generated).generate(code); + RestDslGenerator.toAppendable(document).withGeneratedTime(generated).generate(code); final URI file = RestDslGeneratorTest.class.getResource("/OpenApiPetstore.txt").toURI(); final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); @@ -78,12 +120,20 @@ public class RestDslGeneratorTest { } @Test - public void shouldGenerateSourceCodeWithRestComponent() throws IOException, URISyntaxException { + public void shouldGenerateSourceCodeWithFilter() throws IOException, URISyntaxException { final StringBuilder code = new StringBuilder(); - RestDslGenerator.toAppendable(openapi).withGeneratedTime(generated).withRestComponent("servlet").withRestContextPath("/").generate(code); + RestDslGenerator.toAppendable(document) + .withGeneratedTime(generated) + .withClassName("MyRestRoute") + .withPackageName("com.example") + .withIndent("\t") + .withSourceCodeTimestamps() + .withOperationFilter("find*,deletePet,updatePet") + .withDestinationGenerator(o -> "direct:rest-" + o.operationId) + .generate(code); - final URI file = RestDslGeneratorTest.class.getResource("/OpenApiPetstoreWithRestComponent.txt").toURI(); + final URI file = RestDslGeneratorTest.class.getResource("/MyRestRouteFilter.txt").toURI(); final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); assertThat(code.toString()).isEqualTo(expectedContent); @@ -93,8 +143,12 @@ public class RestDslGeneratorTest { public void shouldGenerateSourceCodeWithOptions() throws IOException, URISyntaxException { final StringBuilder code = new StringBuilder(); - RestDslGenerator.toAppendable(openapi).withGeneratedTime(generated).withClassName("MyRestRoute") - .withPackageName("com.example").withIndent("\t").withSourceCodeTimestamps() + RestDslGenerator.toAppendable(document) + .withGeneratedTime(generated) + .withClassName("MyRestRoute") + .withPackageName("com.example") + .withIndent("\t") + .withSourceCodeTimestamps() .withDestinationGenerator(o -> "direct:rest-" + o.operationId).generate(code); final URI file = RestDslGeneratorTest.class.getResource("/MyRestRoute.txt").toURI(); @@ -104,17 +158,64 @@ public class RestDslGeneratorTest { } @Test - public void shouldGenerateSourceCodeWithFilter() throws IOException, URISyntaxException { + public void shouldGenerateSourceCodeWithRestComponent() throws IOException, URISyntaxException { final StringBuilder code = new StringBuilder(); - RestDslGenerator.toAppendable(openapi).withGeneratedTime(generated).withClassName("MyRestRoute") - .withPackageName("com.example").withIndent("\t").withSourceCodeTimestamps() - .withOperationFilter("find*,deletePet,updatePet") - .withDestinationGenerator(o -> "direct:rest-" + o.operationId).generate(code); + RestDslGenerator.toAppendable(document) + .withGeneratedTime(generated) + .withRestComponent("servlet") + .withRestContextPath("/") + .generate(code); - final URI file = RestDslGeneratorTest.class.getResource("/MyRestRouteFilter.txt").toURI(); + final URI file = RestDslGeneratorTest.class.getResource("/OpenApiPetstoreWithRestComponent.txt").toURI(); final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); assertThat(code.toString()).isEqualTo(expectedContent); } + + @Test + public void shouldResolveEmptyVariables() { + assertThat(RestDslGenerator.resolveVariablesIn("", new Oas30Server())).isEmpty(); + } + + @Test + public void shouldResolveMultipleOccurancesOfVariables() { + final Oas30Server server = new Oas30Server(); + addVariableTo(server, "var1", "value1"); + addVariableTo(server, "var2", "value2"); + + assertThat(RestDslGenerator.resolveVariablesIn("{var2} before {var1} after {var2}", server)).isEqualTo("value2 before value1 after value2"); + } + + @Test + public void shouldResolveMultipleVariables() { + final Oas30Server server = new Oas30Server(); + addVariableTo(server, "var1", "value1"); + addVariableTo(server, "var2", "value2"); + + assertThat(RestDslGenerator.resolveVariablesIn("before {var1} after {var2}", server)).isEqualTo("before value1 after value2"); + } + + @Test + public void shouldResolveSingleVariable() { + final Oas30Server server = new Oas30Server(); + addVariableTo(server, "var", "value"); + assertThat(RestDslGenerator.resolveVariablesIn("before {var} after", server)).isEqualTo("before value after"); + } + + @BeforeClass + public static void readOpenApiDoc() throws Exception { + final ObjectMapper mapper = new ObjectMapper(); + try (InputStream is = RestDslGeneratorTest.class.getResourceAsStream("openapi-v2.json")) { + final JsonNode node = mapper.readTree(is); + document = (OasDocument) Library.readDocument(node); + } + } + + private static void addVariableTo(final Oas30Server server, final String name, final String value) { + final Oas30ServerVariable variable = new Oas30ServerVariable(name); + variable.default_ = value; + + server.addServerVariable(name, variable); + } } diff --git a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslGeneratorV3Test.java b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslGeneratorV3Test.java index 645d0ad..6908cee 100644 --- a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslGeneratorV3Test.java +++ b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslGeneratorV3Test.java @@ -16,9 +16,8 @@ */ package org.apache.camel.generator.openapi; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; @@ -40,50 +39,50 @@ import static org.assertj.core.api.Assertions.assertThat; public class RestDslGeneratorV3Test { - static OasDocument openapi; - - final Instant generated = Instant.parse("2017-10-17T00:00:00.000Z"); + static OasDocument document; - - @BeforeClass - public static void readOpenApiDoc() throws Exception { - ObjectMapper mapper = new ObjectMapper(); - FileInputStream fis = new FileInputStream(new File("openapi-spec.json")); - JsonNode node = mapper.readTree(fis); - openapi = (OasDocument)Library.readDocument(node); - } + final Instant generated = Instant.parse("2017-10-17T00:00:00.000Z"); @Test - public void shouldCreateDefinitions() { - final CamelContext context = new DefaultCamelContext(); - final RestsDefinition definition = RestDslGenerator.toDefinition(openapi).generate(context); - assertThat(definition).isNotNull(); - assertThat(definition.getRests()).hasSize(1); - assertThat(definition.getRests().get(0).getPath()).isEqualTo("/api/v3"); - + public void shouldCreateDefinitions() throws IOException { + try (CamelContext context = new DefaultCamelContext()) { + final RestsDefinition definition = RestDslGenerator.toDefinition(document).generate(context); + assertThat(definition).isNotNull(); + assertThat(definition.getRests()).hasSize(1); + assertThat(definition.getRests().get(0).getPath()).isEqualTo("/api/v3"); + } } @Test public void shouldGenerateSourceCodeWithDefaults() throws IOException, URISyntaxException { final StringBuilder code = new StringBuilder(); - RestDslGenerator.toAppendable(openapi).withGeneratedTime(generated).generate(code); + RestDslGenerator.toAppendable(document) + .withGeneratedTime(generated) + .generate(code); final URI file = RestDslGeneratorV3Test.class.getResource("/OpenApiV3Petstore.txt").toURI(); final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); assertThat(code.toString()).isEqualTo(expectedContent); - + } @Test - public void shouldGenerateSourceCodeWithRestComponent() throws IOException, URISyntaxException { + public void shouldGenerateSourceCodeWithFilter() throws IOException, URISyntaxException { final StringBuilder code = new StringBuilder(); - RestDslGenerator.toAppendable(openapi).withGeneratedTime(generated).withRestComponent("servlet").withRestContextPath("/").generate(code); + RestDslGenerator.toAppendable(document) + .withGeneratedTime(generated) + .withClassName("MyRestRoute") + .withPackageName("com.example") + .withIndent("\t") + .withSourceCodeTimestamps() + .withOperationFilter("find*,deletePet,updatePet") + .withDestinationGenerator(o -> "direct:rest-" + o.operationId) + .generate(code); - final URI file = RestDslGeneratorV3Test.class.getResource("/OpenApiV3PetstoreWithRestComponent.txt").toURI(); + final URI file = RestDslGeneratorV3Test.class.getResource("/MyRestRouteFilterV3.txt").toURI(); final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); - assertThat(code.toString()).isEqualTo(expectedContent); } @@ -91,9 +90,14 @@ public class RestDslGeneratorV3Test { public void shouldGenerateSourceCodeWithOptions() throws IOException, URISyntaxException { final StringBuilder code = new StringBuilder(); - RestDslGenerator.toAppendable(openapi).withGeneratedTime(generated).withClassName("MyRestRoute") - .withPackageName("com.example").withIndent("\t").withSourceCodeTimestamps() - .withDestinationGenerator(o -> "direct:rest-" + o.operationId).generate(code); + RestDslGenerator.toAppendable(document) + .withGeneratedTime(generated) + .withClassName("MyRestRoute") + .withPackageName("com.example") + .withIndent("\t") + .withSourceCodeTimestamps() + .withDestinationGenerator(o -> "direct:rest-" + o.operationId) + .generate(code); final URI file = RestDslGeneratorV3Test.class.getResource("/MyRestRouteV3.txt").toURI(); final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); @@ -101,16 +105,27 @@ public class RestDslGeneratorV3Test { } @Test - public void shouldGenerateSourceCodeWithFilter() throws IOException, URISyntaxException { + public void shouldGenerateSourceCodeWithRestComponent() throws IOException, URISyntaxException { final StringBuilder code = new StringBuilder(); - RestDslGenerator.toAppendable(openapi).withGeneratedTime(generated).withClassName("MyRestRoute") - .withPackageName("com.example").withIndent("\t").withSourceCodeTimestamps() - .withOperationFilter("find*,deletePet,updatePet") - .withDestinationGenerator(o -> "direct:rest-" + o.operationId).generate(code); + RestDslGenerator.toAppendable(document) + .withGeneratedTime(generated) + .withRestComponent("servlet") + .withRestContextPath("/") + .generate(code); - final URI file = RestDslGeneratorV3Test.class.getResource("/MyRestRouteFilterV3.txt").toURI(); + final URI file = RestDslGeneratorV3Test.class.getResource("/OpenApiV3PetstoreWithRestComponent.txt").toURI(); final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); + assertThat(code.toString()).isEqualTo(expectedContent); } + + @BeforeClass + public static void readOpenApiDoc() throws Exception { + final ObjectMapper mapper = new ObjectMapper(); + try (InputStream is = RestDslGeneratorTest.class.getResourceAsStream("openapi-spec.json")) { + final JsonNode node = mapper.readTree(is); + document = (OasDocument) Library.readDocument(node); + } + } } diff --git a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslSourceCodeGeneratorTest.java b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslSourceCodeGeneratorTest.java index 77530cc..d2ba094 100644 --- a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslSourceCodeGeneratorTest.java +++ b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslSourceCodeGeneratorTest.java @@ -44,7 +44,7 @@ public class RestDslSourceCodeGeneratorTest { @Test public void shouldGenerateClassNameFromTitle() { final Oas20Document openapi = new Oas20Document(); - OasInfo info = new Oas20Info(); + final OasInfo info = new Oas20Info(); info.title = "Example API"; openapi.info = info; assertThat(RestDslSourceCodeGenerator.generateClassName(openapi)).isEqualTo("ExampleAPI"); @@ -53,7 +53,7 @@ public class RestDslSourceCodeGeneratorTest { @Test public void shouldGenerateClassNameFromTitleWithNonValidJavaIdentifiers() { final Oas20Document openapi = new Oas20Document(); - OasInfo info = new Oas20Info(); + final OasInfo info = new Oas20Info(); info.title = "Example-API 2.0"; openapi.info = info; assertThat(RestDslSourceCodeGenerator.generateClassName(openapi)).isEqualTo("ExampleAPI20"); @@ -65,6 +65,7 @@ public class RestDslSourceCodeGeneratorTest { assertThat(RestDslSourceCodeGenerator.generateClassName(openapi)) .isEqualTo(RestDslSourceCodeGenerator.DEFAULT_CLASS_NAME); + openapi.info = new Oas20Info(); assertThat(RestDslSourceCodeGenerator.generateClassName(openapi)) .isEqualTo(RestDslSourceCodeGenerator.DEFAULT_CLASS_NAME); @@ -73,10 +74,10 @@ public class RestDslSourceCodeGeneratorTest { @Test public void shouldUseDefaultClassNameIfTitleContainsOnlyNonValidJavaIdentifiers() { final Oas20Document openapi = new Oas20Document(); - OasInfo info = new Oas20Info(); + final OasInfo info = new Oas20Info(); info.title = "\\%/4"; openapi.info = info; - + assertThat(RestDslSourceCodeGenerator.generateClassName(openapi)) .isEqualTo(RestDslSourceCodeGenerator.DEFAULT_CLASS_NAME); } @@ -85,7 +86,7 @@ public class RestDslSourceCodeGeneratorTest { public void shouldUseDefaultPackageNameForLocalhost() { final Oas20Document openapi = new Oas20Document(); openapi.host = "localhost"; - + assertThat(RestDslSourceCodeGenerator.generatePackageName(openapi)) .isEqualTo(RestDslSourceCodeGenerator.DEFAULT_PACKAGE_NAME); } @@ -94,7 +95,7 @@ public class RestDslSourceCodeGeneratorTest { public void shouldUseDefaultPackageNameForLocalhostWithPort() { final Oas20Document openapi = new Oas20Document(); openapi.host = "localhost:8080"; - + assertThat(RestDslSourceCodeGenerator.generatePackageName(openapi)) .isEqualTo(RestDslSourceCodeGenerator.DEFAULT_PACKAGE_NAME); } diff --git a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslSourceCodeGeneratorV3Test.java b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslSourceCodeGeneratorV3Test.java index dee70d5..4b9707c 100644 --- a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslSourceCodeGeneratorV3Test.java +++ b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslSourceCodeGeneratorV3Test.java @@ -29,7 +29,7 @@ public class RestDslSourceCodeGeneratorV3Test { public void shouldCreatePackageNamesFromHostnames() { final Oas30Document openapi = new Oas30Document(); openapi.addServer("http://api.example.org/", "test server url"); - + assertThat(RestDslSourceCodeGenerator.generatePackageName(openapi)).isEqualTo("org.example.api"); } @@ -37,25 +37,27 @@ public class RestDslSourceCodeGeneratorV3Test { public void shouldCreatePackageNamesFromHostnamesWithPorts() { final Oas30Document openapi = new Oas30Document(); openapi.addServer("http://api.example.org:8080/", "test server url"); - + assertThat(RestDslSourceCodeGenerator.generatePackageName(openapi)).isEqualTo("org.example.api"); } @Test public void shouldGenerateClassNameFromTitle() { final Oas30Document openapi = new Oas30Document(); - OasInfo info = new Oas30Info(); + final OasInfo info = new Oas30Info(); info.title = "Example API"; openapi.info = info; + assertThat(RestDslSourceCodeGenerator.generateClassName(openapi)).isEqualTo("ExampleAPI"); } @Test public void shouldGenerateClassNameFromTitleWithNonValidJavaIdentifiers() { final Oas30Document openapi = new Oas30Document(); - OasInfo info = new Oas30Info(); + final OasInfo info = new Oas30Info(); info.title = "Example-API 2.0"; openapi.info = info; + assertThat(RestDslSourceCodeGenerator.generateClassName(openapi)).isEqualTo("ExampleAPI20"); } @@ -65,6 +67,7 @@ public class RestDslSourceCodeGeneratorV3Test { assertThat(RestDslSourceCodeGenerator.generateClassName(openapi)) .isEqualTo(RestDslSourceCodeGenerator.DEFAULT_CLASS_NAME); + openapi.info = new Oas30Info(); assertThat(RestDslSourceCodeGenerator.generateClassName(openapi)) .isEqualTo(RestDslSourceCodeGenerator.DEFAULT_CLASS_NAME); @@ -73,10 +76,10 @@ public class RestDslSourceCodeGeneratorV3Test { @Test public void shouldUseDefaultClassNameIfTitleContainsOnlyNonValidJavaIdentifiers() { final Oas30Document openapi = new Oas30Document(); - OasInfo info = new Oas30Info(); + final OasInfo info = new Oas30Info(); info.title = "\\%/4"; openapi.info = info; - + assertThat(RestDslSourceCodeGenerator.generateClassName(openapi)) .isEqualTo(RestDslSourceCodeGenerator.DEFAULT_CLASS_NAME); } @@ -85,7 +88,7 @@ public class RestDslSourceCodeGeneratorV3Test { public void shouldUseDefaultPackageNameForLocalhost() { final Oas30Document openapi = new Oas30Document(); openapi.addServer("http://localhost", "test server url"); - + assertThat(RestDslSourceCodeGenerator.generatePackageName(openapi)) .isEqualTo(RestDslSourceCodeGenerator.DEFAULT_PACKAGE_NAME); } @@ -94,7 +97,7 @@ public class RestDslSourceCodeGeneratorV3Test { public void shouldUseDefaultPackageNameForLocalhostWithPort() { final Oas30Document openapi = new Oas30Document(); openapi.addServer("http://localhost:8080", "test server url"); - + assertThat(RestDslSourceCodeGenerator.generatePackageName(openapi)) .isEqualTo(RestDslSourceCodeGenerator.DEFAULT_PACKAGE_NAME); } diff --git a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslXmlGeneratorTest.java b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslXmlGeneratorTest.java index 397b849..891d3db 100644 --- a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslXmlGeneratorTest.java +++ b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslXmlGeneratorTest.java @@ -16,8 +16,7 @@ */ package org.apache.camel.generator.openapi; -import java.io.File; -import java.io.FileInputStream; +import java.io.InputStream; import java.io.StringReader; import java.net.URI; import java.nio.charset.StandardCharsets; @@ -44,73 +43,74 @@ import static org.assertj.core.api.Assertions.assertThat; public class RestDslXmlGeneratorTest { - static OasDocument openapi; - - @BeforeClass - public static void readOpenApiDoc() throws Exception { - ObjectMapper mapper = new ObjectMapper(); - FileInputStream fis = new FileInputStream(new File("openapi-v2.json")); - JsonNode node = mapper.readTree(fis); - openapi = (OasDocument)Library.readDocument(node); - } + static OasDocument document; @Test public void shouldGenerateBlueprintXml() throws Exception { - final CamelContext context = new DefaultCamelContext(); - - final String xml = RestDslGenerator.toXml(openapi).withBlueprint().generate(context); - assertThat(xml).isNotEmpty(); - assertThat(xml.contains("http://camel.apache.org/schema/blueprint")); + try (CamelContext context = new DefaultCamelContext()) { + final String xml = RestDslGenerator.toXml(document).withBlueprint().generate(context); + assertThat(xml).contains("http://camel.apache.org/schema/blueprint"); + } } @Test - public void shouldGenerateXml() throws Exception { - final CamelContext context = new DefaultCamelContext(); - - final String xml = RestDslGenerator.toXml(openapi).generate(context); - assertThat(xml).isNotEmpty(); - assertThat(xml.contains("http://camel.apache.org/schema/spring")); + public void shouldGenerateSpringXml() throws Exception { + try (CamelContext context = new DefaultCamelContext()) { + final String xml = RestDslGenerator.toXml(document).generate(context); + assertThat(xml).contains("http://camel.apache.org/schema/spring"); + } } @Test public void shouldGenerateXmlWithDefaultnamespace() throws Exception { - final CamelContext context = new DefaultCamelContext(); + try (CamelContext context = new DefaultCamelContext()) { + final String xml = RestDslGenerator.toXml(document).generate(context); - final String xml = RestDslGenerator.toXml(openapi).generate(context); + final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); + builderFactory.setNamespaceAware(true); - final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); - builderFactory.setNamespaceAware(true); + final DocumentBuilder builder = builderFactory.newDocumentBuilder(); - final DocumentBuilder builder = builderFactory.newDocumentBuilder(); + final Document document = builder.parse(new InputSource(new StringReader(xml))); - final Document document = builder.parse(new InputSource(new StringReader(xml))); - - assertThat(document.isDefaultNamespace("http://camel.apache.org/schema/spring")).isTrue(); + assertThat(document.isDefaultNamespace("http://camel.apache.org/schema/spring")).isTrue(); + } } @Test public void shouldGenerateXmlWithDefaults() throws Exception { - final CamelContext context = new DefaultCamelContext(); - - final String xml = RestDslGenerator.toXml(openapi).generate(context); + try (CamelContext context = new DefaultCamelContext()) { + final String xml = RestDslGenerator.toXml(document).generate(context); - final URI file = RestDslGeneratorTest.class.getResource("/OpenApiPetstoreXml.txt").toURI(); - final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); + final URI file = RestDslGeneratorTest.class.getResource("/OpenApiPetstoreXml.txt").toURI(); + final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); - assertThat(xml).isXmlEqualTo(expectedContent); + assertThat(xml).isXmlEqualTo(expectedContent); + } } @Test public void shouldGenerateXmlWithRestComponent() throws Exception { - final CamelContext context = new DefaultCamelContext(); + try (CamelContext context = new DefaultCamelContext()) { + final String xml = RestDslGenerator.toXml(document) + .withRestComponent("servlet") + .withRestContextPath("/foo") + .generate(context); - final String xml = RestDslGenerator.toXml(openapi).withRestComponent("servlet").withRestContextPath("/foo") - .generate(context); + final URI file = RestDslGeneratorTest.class.getResource("/OpenApiPetstoreWithRestComponentXml.txt").toURI(); + final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); - final URI file = RestDslGeneratorTest.class.getResource("/OpenApiPetstoreWithRestComponentXml.txt").toURI(); - final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); + assertThat(xml).isXmlEqualTo(expectedContent); + } + } - assertThat(xml).isXmlEqualTo(expectedContent); + @BeforeClass + public static void readOpenApiDoc() throws Exception { + final ObjectMapper mapper = new ObjectMapper(); + try (InputStream is = RestDslXmlGeneratorTest.class.getResourceAsStream("openapi-v2.json")) { + final JsonNode node = mapper.readTree(is); + document = (OasDocument) Library.readDocument(node); + } } } diff --git a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslXmlGeneratorV3Test.java b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslXmlGeneratorV3Test.java index c3fa886..1a187ed 100644 --- a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslXmlGeneratorV3Test.java +++ b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/RestDslXmlGeneratorV3Test.java @@ -16,8 +16,7 @@ */ package org.apache.camel.generator.openapi; -import java.io.File; -import java.io.FileInputStream; +import java.io.InputStream; import java.io.StringReader; import java.net.URI; import java.nio.charset.StandardCharsets; @@ -44,72 +43,73 @@ import static org.assertj.core.api.Assertions.assertThat; public class RestDslXmlGeneratorV3Test { - static OasDocument openapi; - - @BeforeClass - public static void readOpenApiDoc() throws Exception { - ObjectMapper mapper = new ObjectMapper(); - FileInputStream fis = new FileInputStream(new File("openapi-spec.json")); - JsonNode node = mapper.readTree(fis); - openapi = (OasDocument)Library.readDocument(node); - } + static OasDocument document; @Test public void shouldGenerateBlueprintXml() throws Exception { - final CamelContext context = new DefaultCamelContext(); - - final String xml = RestDslGenerator.toXml(openapi).withBlueprint().generate(context); - assertThat(xml).isNotEmpty(); - assertThat(xml.contains("http://camel.apache.org/schema/blueprint")); + try (CamelContext context = new DefaultCamelContext()) { + final String xml = RestDslGenerator.toXml(document).withBlueprint().generate(context); + assertThat(xml).contains("http://camel.apache.org/schema/blueprint"); + } } @Test - public void shouldGenerateXml() throws Exception { - final CamelContext context = new DefaultCamelContext(); - - final String xml = RestDslGenerator.toXml(openapi).generate(context); - assertThat(xml).isNotEmpty(); - assertThat(xml.contains("http://camel.apache.org/schema/spring")); + public void shouldGenerateSpringXml() throws Exception { + try (CamelContext context = new DefaultCamelContext()) { + final String xml = RestDslGenerator.toXml(document).generate(context); + assertThat(xml).contains("http://camel.apache.org/schema/spring"); + } } @Test public void shouldGenerateXmlWithDefaultnamespace() throws Exception { - final CamelContext context = new DefaultCamelContext(); + try (CamelContext context = new DefaultCamelContext()) { + final String xml = RestDslGenerator.toXml(document).generate(context); - final String xml = RestDslGenerator.toXml(openapi).generate(context); + final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); + builderFactory.setNamespaceAware(true); - final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); - builderFactory.setNamespaceAware(true); + final DocumentBuilder builder = builderFactory.newDocumentBuilder(); - final DocumentBuilder builder = builderFactory.newDocumentBuilder(); + final Document document = builder.parse(new InputSource(new StringReader(xml))); - final Document document = builder.parse(new InputSource(new StringReader(xml))); - - assertThat(document.isDefaultNamespace("http://camel.apache.org/schema/spring")).isTrue(); + assertThat(document.isDefaultNamespace("http://camel.apache.org/schema/spring")).isTrue(); + } } @Test public void shouldGenerateXmlWithDefaults() throws Exception { - final CamelContext context = new DefaultCamelContext(); + try (CamelContext context = new DefaultCamelContext()) { + final String xml = RestDslGenerator.toXml(document).generate(context); - final String xml = RestDslGenerator.toXml(openapi).generate(context); + final URI file = RestDslGeneratorTest.class.getResource("/OpenApiV3PetstoreXml.txt").toURI(); + final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); - final URI file = RestDslGeneratorTest.class.getResource("/OpenApiV3PetstoreXml.txt").toURI(); - final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); - - assertThat(xml).isXmlEqualTo(expectedContent); + assertThat(xml).isXmlEqualTo(expectedContent); + } } @Test public void shouldGenerateXmlWithRestComponent() throws Exception { - final CamelContext context = new DefaultCamelContext(); - - final String xml = RestDslGenerator.toXml(openapi).withRestComponent("servlet").withRestContextPath("/foo") - .generate(context); + try (CamelContext context = new DefaultCamelContext()) { + final String xml = RestDslGenerator.toXml(document) + .withRestComponent("servlet") + .withRestContextPath("/foo") + .generate(context); + + final URI file = RestDslGeneratorTest.class.getResource("/OpenApiV3PetstoreWithRestComponentXml.txt").toURI(); + final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); + assertThat(xml).isXmlEqualTo(expectedContent); + } + } - final URI file = RestDslGeneratorTest.class.getResource("/OpenApiV3PetstoreWithRestComponentXml.txt").toURI(); - final String expectedContent = new String(Files.readAllBytes(Paths.get(file)), StandardCharsets.UTF_8); - assertThat(xml).isXmlEqualTo(expectedContent); + @BeforeClass + public static void readOpenApiDoc() throws Exception { + final ObjectMapper mapper = new ObjectMapper(); + try (InputStream is = RestDslXmlGeneratorV3Test.class.getResourceAsStream("openapi-spec.json")) { + final JsonNode node = mapper.readTree(is); + document = (OasDocument) Library.readDocument(node); + } } } diff --git a/tooling/openapi-rest-dsl-generator/openapi-spec.json b/tooling/openapi-rest-dsl-generator/src/test/resources/org/apache/camel/generator/openapi/openapi-spec.json similarity index 100% rename from tooling/openapi-rest-dsl-generator/openapi-spec.json rename to tooling/openapi-rest-dsl-generator/src/test/resources/org/apache/camel/generator/openapi/openapi-spec.json diff --git a/tooling/openapi-rest-dsl-generator/openapi-v2.json b/tooling/openapi-rest-dsl-generator/src/test/resources/org/apache/camel/generator/openapi/openapi-v2.json similarity index 100% rename from tooling/openapi-rest-dsl-generator/openapi-v2.json rename to tooling/openapi-rest-dsl-generator/src/test/resources/org/apache/camel/generator/openapi/openapi-v2.json