From fe7888c5ac3ebecff32c939af9c5da7197d5fb26 Mon Sep 17 00:00:00 2001 From: Timon Borter Date: Wed, 25 Oct 2023 20:23:36 +0200 Subject: [PATCH] feat: citrus 4.0.0 release --- pom.xml | 10 +-- .../simulator/sample/Simulator.java | 4 +- .../simulator/SimulatorSwaggerIT.java | 10 +-- .../simulator/sample/Simulator.java | 4 +- .../src/main/resources/application.properties | 4 - .../simulator/SimulatorAutoConfiguration.java | 13 ++-- .../dictionary/InboundXmlDataDictionary.java | 26 ++++--- .../dictionary/OutboundXmlDataDictionary.java | 14 +++- .../simulator/dictionary/XmlUtils.java | 44 +++++++++++ .../simulator/http/HttpScenarioGenerator.java | 77 +++++++++---------- .../scenario/AbstractScenarioStarter.java | 2 +- .../simulator/template/TemplateHelper.java | 26 ++++--- .../simulator/ws/WsdlScenarioGenerator.java | 28 +++---- .../http/HttpScenarioGeneratorTest.java | 4 +- .../template/TemplateHelperTest.java | 2 +- .../ws/WsdlScenarioGeneratorTest.java | 4 +- 16 files changed, 171 insertions(+), 101 deletions(-) create mode 100644 simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/XmlUtils.java diff --git a/pom.xml b/pom.xml index 0dd55d2e1..fc9af4529 100644 --- a/pom.xml +++ b/pom.xml @@ -23,10 +23,10 @@ 3.11.0 1.18.20 - 4.0.0-M2 - 3.1.2 - 6.0.9 - 3.1.3 + 4.0.0 + 3.1.5 + 6.0.13 + 4.0.7 7.5.1 1.6.3 2.12.1 @@ -34,7 +34,7 @@ 2.20.0 - 1.4.8 + 1.4.11 v18.18.0 9.8.1 diff --git a/simulator-samples/sample-swagger/src/main/java/org/citrusframework/simulator/sample/Simulator.java b/simulator-samples/sample-swagger/src/main/java/org/citrusframework/simulator/sample/Simulator.java index dc1b03d56..4c04c57d8 100644 --- a/simulator-samples/sample-swagger/src/main/java/org/citrusframework/simulator/sample/Simulator.java +++ b/simulator-samples/sample-swagger/src/main/java/org/citrusframework/simulator/sample/Simulator.java @@ -27,10 +27,10 @@ import org.citrusframework.simulator.http.HttpScenarioGenerator; import org.citrusframework.simulator.http.SimulatorRestAdapter; import org.citrusframework.simulator.http.SimulatorRestConfigurationProperties; +import org.citrusframework.spi.Resources; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; -import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpStatus; /** @@ -66,7 +66,7 @@ protected Message handleMessageInternal(Message message) { @Bean public static HttpScenarioGenerator scenarioGenerator() { - HttpScenarioGenerator generator = new HttpScenarioGenerator(new ClassPathResource("swagger/petstore-api.json")); + HttpScenarioGenerator generator = new HttpScenarioGenerator(new Resources.ClasspathResource("swagger/petstore-api.json")); generator.setContextPath("/petstore"); return generator; } diff --git a/simulator-samples/sample-swagger/src/test/java/org/citrusframework/simulator/SimulatorSwaggerIT.java b/simulator-samples/sample-swagger/src/test/java/org/citrusframework/simulator/SimulatorSwaggerIT.java index fcbbeb190..9b12c5ce1 100644 --- a/simulator-samples/sample-swagger/src/test/java/org/citrusframework/simulator/SimulatorSwaggerIT.java +++ b/simulator-samples/sample-swagger/src/test/java/org/citrusframework/simulator/SimulatorSwaggerIT.java @@ -23,6 +23,7 @@ import org.citrusframework.http.client.HttpClient; import org.citrusframework.message.MessageType; import org.citrusframework.simulator.sample.Simulator; +import org.citrusframework.spi.Resources; import org.citrusframework.testng.spring.TestNGCitrusSpringSupport; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -30,7 +31,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; @@ -92,7 +92,7 @@ public void testAddPet() { .message() .accept(MediaType.APPLICATION_JSON_VALUE) .contentType(MediaType.APPLICATION_JSON_VALUE) - .body(new ClassPathResource("templates/pet.json"))); + .body(new Resources.ClasspathResource("templates/pet.json"))); $(http().client(petstoreClient) .receive() @@ -127,7 +127,7 @@ public void testGetPetById() { .response(HttpStatus.OK) .message() .contentType(MediaType.APPLICATION_JSON_VALUE) - .body(new ClassPathResource("templates/pet-control.json"))); + .body(new Resources.ClasspathResource("templates/pet-control.json"))); } @CitrusTest @@ -143,7 +143,7 @@ public void testUpdatePet() { .message() .accept(MediaType.APPLICATION_JSON_VALUE) .contentType(MediaType.APPLICATION_JSON_VALUE) - .body(new ClassPathResource("templates/pet.json"))); + .body(new Resources.ClasspathResource("templates/pet.json"))); $(http().client(petstoreClient) .receive() @@ -205,7 +205,7 @@ public void testPlaceOrder() { .message() .accept(MediaType.APPLICATION_JSON_VALUE) .contentType(MediaType.APPLICATION_JSON_VALUE) - .body(new ClassPathResource("templates/order.json"))); + .body(new Resources.ClasspathResource("templates/order.json"))); $(http().client(petstoreClient) .receive() diff --git a/simulator-samples/sample-wsdl/src/main/java/org/citrusframework/simulator/sample/Simulator.java b/simulator-samples/sample-wsdl/src/main/java/org/citrusframework/simulator/sample/Simulator.java index 05fe874da..1bf3f859e 100644 --- a/simulator-samples/sample-wsdl/src/main/java/org/citrusframework/simulator/sample/Simulator.java +++ b/simulator-samples/sample-wsdl/src/main/java/org/citrusframework/simulator/sample/Simulator.java @@ -19,6 +19,7 @@ import org.citrusframework.endpoint.EndpointAdapter; import org.citrusframework.endpoint.adapter.StaticEndpointAdapter; import org.citrusframework.message.Message; +import org.citrusframework.spi.Resources; import org.citrusframework.ws.message.SoapFault; import org.citrusframework.simulator.ws.SimulatorWebServiceAdapter; import org.citrusframework.simulator.ws.SimulatorWebServiceConfigurationProperties; @@ -26,7 +27,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; -import org.springframework.core.io.ClassPathResource; /** * @author Christoph Deppisch @@ -58,7 +58,7 @@ protected Message handleMessageInternal(Message message) { @Bean public static WsdlScenarioGenerator scenarioGenerator() { - WsdlScenarioGenerator generator = new WsdlScenarioGenerator(new ClassPathResource("xsd/Hello.wsdl")); + WsdlScenarioGenerator generator = new WsdlScenarioGenerator(new Resources.ClasspathResource("xsd/Hello.wsdl")); return generator; } } diff --git a/simulator-samples/sample-wsdl/src/main/resources/application.properties b/simulator-samples/sample-wsdl/src/main/resources/application.properties index d1aaf978d..83a11b72f 100644 --- a/simulator-samples/sample-wsdl/src/main/resources/application.properties +++ b/simulator-samples/sample-wsdl/src/main/resources/application.properties @@ -21,7 +21,3 @@ citrus.simulator.defaultScenario=Default # Should Citrus validate incoming messages on syntax and semantics citrus.simulator.templateValidation=true - - -logging.level.root=DEBUG -logging.level.web=TRACE diff --git a/simulator-starter/src/main/java/org/citrusframework/simulator/SimulatorAutoConfiguration.java b/simulator-starter/src/main/java/org/citrusframework/simulator/SimulatorAutoConfiguration.java index 91214686e..68daa3b86 100644 --- a/simulator-starter/src/main/java/org/citrusframework/simulator/SimulatorAutoConfiguration.java +++ b/simulator-starter/src/main/java/org/citrusframework/simulator/SimulatorAutoConfiguration.java @@ -31,6 +31,7 @@ import org.citrusframework.simulator.dictionary.OutboundXmlDataDictionary; import org.citrusframework.simulator.repository.RepositoryConfig; import org.citrusframework.simulator.scenario.ScenarioBeanNameGenerator; +import org.citrusframework.spi.CitrusResourceWrapper; import org.citrusframework.variable.dictionary.json.JsonPathMappingDataDictionary; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,8 +76,10 @@ @ConditionalOnProperty(prefix = "citrus.simulator", value = "enabled", havingValue = "true", matchIfMissing = true) public class SimulatorAutoConfiguration { - /** Logger */ - private static Logger log = LoggerFactory.getLogger(SimulatorAutoConfiguration.class); + /** + * Logger + */ + private static final Logger logger = LoggerFactory.getLogger(SimulatorAutoConfiguration.class); /** Application version */ private static String version; @@ -91,7 +94,7 @@ public class SimulatorAutoConfiguration { versionProperties.load(in); version = versionProperties.get("app.version").toString(); } catch (IOException e) { - log.warn("Unable to read application version information", e); + logger.warn("Unable to read application version information", e); version = ""; } } @@ -143,7 +146,7 @@ public JsonPathMappingDataDictionary inboundJsonDataDictionary() { Resource mappingFile = new PathMatchingResourcePatternResolver().getResource(simulatorConfiguration.getInboundJsonDictionary()); if (mappingFile.exists()) { - inboundJsonDataDictionary.setMappingFile(mappingFile); + inboundJsonDataDictionary.setMappingFile(new CitrusResourceWrapper(mappingFile)); } return inboundJsonDataDictionary; @@ -159,7 +162,7 @@ public JsonPathMappingDataDictionary outboundJsonDataDictionary() { Resource mappingFile = new PathMatchingResourcePatternResolver().getResource(simulatorConfiguration.getOutboundJsonDictionary()); if (mappingFile.exists()) { - outboundJsonDataDictionary.setMappingFile(mappingFile); + outboundJsonDataDictionary.setMappingFile(new CitrusResourceWrapper(mappingFile)); } return outboundJsonDataDictionary; diff --git a/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/InboundXmlDataDictionary.java b/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/InboundXmlDataDictionary.java index 8a8cdf945..95fc025c6 100644 --- a/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/InboundXmlDataDictionary.java +++ b/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/InboundXmlDataDictionary.java @@ -1,9 +1,14 @@ package org.citrusframework.simulator.dictionary; +import static org.citrusframework.simulator.dictionary.XmlUtils.loadXMLMappingFile; + import org.citrusframework.context.TestContext; import org.citrusframework.simulator.config.SimulatorConfigurationProperties; +import org.citrusframework.spi.CitrusResourceWrapper; import org.citrusframework.variable.dictionary.xml.XpathMappingDataDictionary; import org.citrusframework.xml.xpath.XPathUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; @@ -20,6 +25,8 @@ */ public class InboundXmlDataDictionary extends XpathMappingDataDictionary { + private static final Logger logger = LoggerFactory.getLogger(InboundXmlDataDictionary.class); + /** * Default constructor setting default mappings and mappings file. */ @@ -29,10 +36,18 @@ public InboundXmlDataDictionary(SimulatorConfigurationProperties simulatorConfig Resource inboundMappingFile = new PathMatchingResourcePatternResolver().getResource(simulatorConfiguration.getInboundXmlDictionary()); if (inboundMappingFile.exists()) { - mappingFile = inboundMappingFile; + mappingFile = new CitrusResourceWrapper(inboundMappingFile); } } + @Override + public void initialize() { + loadXMLMappingFile(logger, mappingFile, mappings); + + mappings.put("//*[string-length(normalize-space(text())) > 0]", "@ignore@"); + mappings.put("//@*", "@ignore@"); + } + @Override public T translate(Node node, T value, TestContext context) { for (Map.Entry expressionEntry : mappings.entrySet()) { @@ -53,6 +68,7 @@ public T translate(Node node, T value, TestContext context) { /** * Checks if given node set contains node. + * * @param findings * @param node * @return @@ -66,12 +82,4 @@ private boolean containsNode(NodeList findings, Node node) { return false; } - - @Override - public void initialize() { - super.initialize(); - - mappings.put("//*[string-length(normalize-space(text())) > 0]", "@ignore@"); - mappings.put("//@*", "@ignore@"); - } } diff --git a/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/OutboundXmlDataDictionary.java b/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/OutboundXmlDataDictionary.java index 9e4bf508f..4fe7df55d 100644 --- a/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/OutboundXmlDataDictionary.java +++ b/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/OutboundXmlDataDictionary.java @@ -1,8 +1,13 @@ package org.citrusframework.simulator.dictionary; +import static org.citrusframework.simulator.dictionary.XmlUtils.loadXMLMappingFile; + import org.citrusframework.context.TestContext; import org.citrusframework.simulator.config.SimulatorConfigurationProperties; +import org.citrusframework.spi.CitrusResourceWrapper; import org.citrusframework.variable.dictionary.xml.XpathMappingDataDictionary; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; @@ -13,6 +18,8 @@ */ public class OutboundXmlDataDictionary extends XpathMappingDataDictionary { + private static final Logger logger = LoggerFactory.getLogger(OutboundXmlDataDictionary.class); + /** * Default constructor setting default mappings and mappings file. */ @@ -20,10 +27,15 @@ public class OutboundXmlDataDictionary extends XpathMappingDataDictionary { public OutboundXmlDataDictionary(SimulatorConfigurationProperties simulatorConfiguration) { Resource outboundMappingFile = new PathMatchingResourcePatternResolver().getResource(simulatorConfiguration.getOutboundXmlDictionary()); if (outboundMappingFile.exists()) { - mappingFile = outboundMappingFile; + mappingFile = new CitrusResourceWrapper(outboundMappingFile); } } + @Override + public void initialize() { + loadXMLMappingFile(logger, mappingFile, mappings); + } + @Override public T translate(Node node, T value, TestContext context) { if (value instanceof String) { diff --git a/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/XmlUtils.java b/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/XmlUtils.java new file mode 100644 index 000000000..53b311723 --- /dev/null +++ b/simulator-starter/src/main/java/org/citrusframework/simulator/dictionary/XmlUtils.java @@ -0,0 +1,44 @@ +package org.citrusframework.simulator.dictionary; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.Properties; +import org.citrusframework.exceptions.CitrusRuntimeException; +import org.citrusframework.spi.Resource; +import org.slf4j.Logger; + +class XmlUtils { + + private XmlUtils(){ + // Temporary utility class + } + + // TODO: Remove if PR has been resolved and released: https://github.com/citrusframework/citrus/pull/1044 + static void loadXMLMappingFile(Logger logger, Resource mappingFile, Map mappings) { + if (mappingFile != null) { + logger.debug("Reading data dictionary mapping: {}", mappingFile.getLocation()); + + Properties props = new Properties(); + try (InputStream inputStream = mappingFile.getInputStream()) { + props.loadFromXML(inputStream); + } catch (IOException e) { + throw new CitrusRuntimeException(e); + } + + for (Map.Entry entry : props.entrySet()) { + String key = entry.getKey().toString(); + + logger.debug("Loading data dictionary mapping: {}={}", key, props.getProperty(key)); + + if (logger.isDebugEnabled() && mappings.containsKey(key)) { + logger.warn("Overwriting data dictionary mapping '{}'; old value: {} new value: {}", key, mappings.get(key), props.getProperty(key)); + } + + mappings.put(key, props.getProperty(key)); + } + + logger.info("Loaded data dictionary mapping: {}", mappingFile.getLocation()); + } + } +} diff --git a/simulator-starter/src/main/java/org/citrusframework/simulator/http/HttpScenarioGenerator.java b/simulator-starter/src/main/java/org/citrusframework/simulator/http/HttpScenarioGenerator.java index d06c6bf01..fa05fc883 100644 --- a/simulator-starter/src/main/java/org/citrusframework/simulator/http/HttpScenarioGenerator.java +++ b/simulator-starter/src/main/java/org/citrusframework/simulator/http/HttpScenarioGenerator.java @@ -1,14 +1,13 @@ package org.citrusframework.simulator.http; -import java.io.IOException; -import java.util.Map; - import io.swagger.models.Model; import io.swagger.models.Operation; import io.swagger.models.Path; import io.swagger.models.Swagger; import io.swagger.parser.SwaggerParser; import org.citrusframework.simulator.exception.SimulatorException; +import org.citrusframework.spi.CitrusResourceWrapper; +import org.citrusframework.spi.Resource; import org.citrusframework.util.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,42 +17,51 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.core.env.Environment; -import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.RequestMethod; +import java.io.IOException; +import java.util.Map; + /** * @author Christoph Deppisch */ public class HttpScenarioGenerator implements BeanFactoryPostProcessor { - /** Logger */ - private static Logger log = LoggerFactory.getLogger(HttpScenarioGenerator.class); - - /** Target swagger API to generate scenarios from */ - private final Resource swaggerResource; - - /** Optional context path */ - private String contextPath = ""; - - /** Optional Swagger api file location system property for auto generated scenarios */ + /** + * Logger + */ + private static final Logger logger = LoggerFactory.getLogger(HttpScenarioGenerator.class); + /** + * Optional Swagger api file location system property for auto generated scenarios + */ private static final String SIMULATOR_SWAGGER_API_PROPERTY = "citrus.simulator.rest.swagger.api"; private static final String SIMULATOR_SWAGGER_API_ENV = "CITRUS_SIMULATOR_REST_SWAGGER_API"; - private static final String SIMULATOR_SWAGGER_CONTEXT_PATH_PROPERTY = "citrus.simulator.rest.swagger.contextPath"; private static final String SIMULATOR_SWAGGER_CONTEXT_PATH_ENV = "CITRUS_SIMULATOR_REST_SWAGGER_CONTEXT_PATH"; + /** + * Target swagger API to generate scenarios from + */ + private final Resource swaggerResource; + /** + * Optional context path + */ + private String contextPath = ""; /** * Constructor using Spring environment. */ public HttpScenarioGenerator(Environment environment) { - swaggerResource = new PathMatchingResourcePatternResolver().getResource(environment.getProperty(SIMULATOR_SWAGGER_API_PROPERTY, environment.getProperty(SIMULATOR_SWAGGER_API_ENV, ""))); + org.springframework.core.io.Resource springResource = new PathMatchingResourcePatternResolver().getResource(environment.getProperty(SIMULATOR_SWAGGER_API_PROPERTY, environment.getProperty(SIMULATOR_SWAGGER_API_ENV, ""))); + swaggerResource = new CitrusResourceWrapper(springResource); + contextPath = environment.getProperty(SIMULATOR_SWAGGER_CONTEXT_PATH_PROPERTY, environment.getProperty(SIMULATOR_SWAGGER_CONTEXT_PATH_ENV, contextPath)); } /** * Constructor using swagger API file resource. + * * @param swaggerResource */ public HttpScenarioGenerator(Resource swaggerResource) { @@ -64,7 +72,7 @@ public HttpScenarioGenerator(Resource swaggerResource) { public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { try { Assert.notNull(swaggerResource, - "Missing either swagger api system property setting or explicit swagger api resource for scenario auto generation"); + "Missing either swagger api system property setting or explicit swagger api resource for scenario auto generation"); Swagger swagger = new SwaggerParser().parse(FileUtils.readToString(swaggerResource)); @@ -72,12 +80,12 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) for (Map.Entry operation : path.getValue().getOperationMap().entrySet()) { if (beanFactory instanceof BeanDefinitionRegistry) { - log.info("Register auto generated scenario as bean definition: " + operation.getValue().getOperationId()); + logger.info("Register auto generated scenario as bean definition: " + operation.getValue().getOperationId()); BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(HttpOperationScenario.class) - .addConstructorArgValue((contextPath + (swagger.getBasePath() != null ? swagger.getBasePath() : "")) + path.getKey()) - .addConstructorArgValue(RequestMethod.valueOf(operation.getKey().name())) - .addConstructorArgValue(operation.getValue()) - .addConstructorArgValue(swagger.getDefinitions()); + .addConstructorArgValue((contextPath + (swagger.getBasePath() != null ? swagger.getBasePath() : "")) + path.getKey()) + .addConstructorArgValue(RequestMethod.valueOf(operation.getKey().name())) + .addConstructorArgValue(operation.getValue()) + .addConstructorArgValue(swagger.getDefinitions()); if (beanFactory.containsBeanDefinition("inboundJsonDataDictionary")) { beanDefinitionBuilder.addPropertyReference("inboundDataDictionary", "inboundJsonDataDictionary"); @@ -89,7 +97,7 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) ((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(operation.getValue().getOperationId(), beanDefinitionBuilder.getBeanDefinition()); } else { - log.info("Register auto generated scenario as singleton: " + operation.getValue().getOperationId()); + logger.info("Register auto generated scenario as singleton: " + operation.getValue().getOperationId()); beanFactory.registerSingleton(operation.getValue().getOperationId(), createScenario((contextPath + (swagger.getBasePath() != null ? swagger.getBasePath() : "")) + path.getKey(), RequestMethod.valueOf(operation.getKey().name()), operation.getValue(), swagger.getDefinitions())); } } @@ -100,31 +108,22 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) } /** - * Creates the scenario with given swagger path and operation information. - * @param path - * @param method - * @param operation - * @param definitions - * @return + * Creates an HTTP scenario based on the given swagger path and operation information. + * + * @param path Request path + * @param method Request method + * @param operation Swagger operation + * @param definitions Additional definitions + * @return a matching HTTP scenario */ protected HttpOperationScenario createScenario(String path, RequestMethod method, Operation operation, Map definitions) { return new HttpOperationScenario(path, method, operation, definitions); } - /** - * Gets the contextPath. - * - * @return - */ public String getContextPath() { return contextPath; } - /** - * Sets the contextPath. - * - * @param contextPath - */ public void setContextPath(String contextPath) { this.contextPath = contextPath; } diff --git a/simulator-starter/src/main/java/org/citrusframework/simulator/scenario/AbstractScenarioStarter.java b/simulator-starter/src/main/java/org/citrusframework/simulator/scenario/AbstractScenarioStarter.java index 41ae73eee..8506f4567 100644 --- a/simulator-starter/src/main/java/org/citrusframework/simulator/scenario/AbstractScenarioStarter.java +++ b/simulator-starter/src/main/java/org/citrusframework/simulator/scenario/AbstractScenarioStarter.java @@ -18,9 +18,9 @@ import org.citrusframework.simulator.config.SimulatorConfigurationProperties; import org.citrusframework.simulator.template.TemplateHelper; +import org.citrusframework.spi.Resource; import org.citrusframework.util.FileUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; import jakarta.annotation.PostConstruct; diff --git a/simulator-starter/src/main/java/org/citrusframework/simulator/template/TemplateHelper.java b/simulator-starter/src/main/java/org/citrusframework/simulator/template/TemplateHelper.java index 9e5400ec8..50407acef 100644 --- a/simulator-starter/src/main/java/org/citrusframework/simulator/template/TemplateHelper.java +++ b/simulator-starter/src/main/java/org/citrusframework/simulator/template/TemplateHelper.java @@ -1,10 +1,9 @@ package org.citrusframework.simulator.template; import org.citrusframework.exceptions.CitrusRuntimeException; +import org.citrusframework.spi.Resource; +import org.citrusframework.spi.Resources; import org.citrusframework.util.FileUtils; -import lombok.Getter; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; import java.io.IOException; @@ -14,12 +13,16 @@ /** * Helper class for loading templates from the classpath, in particular XML and JSON templates. */ -@Getter public class TemplateHelper { private final String basePath; private final Charset charset; + private TemplateHelper(String basePath, Charset charset) { + this.basePath = adaptBasePath(basePath); + this.charset = charset; + } + /** * Creates a new {@link TemplateHelper} * @@ -41,9 +44,8 @@ public static TemplateHelper instance(String basePath) { return instance(basePath, StandardCharsets.UTF_8); } - private TemplateHelper(String basePath, Charset charset) { - this.basePath = adaptBasePath(basePath); - this.charset = charset; + private static String adaptBasePath(String basePath) { + return StringUtils.endsWithIgnoreCase(basePath, "/") ? basePath : basePath + "/"; } /** @@ -96,10 +98,14 @@ public Resource getFileResource(String resourcePath, String resourceExtension) { if (StringUtils.hasLength(resourceExtension) && !StringUtils.startsWithIgnoreCase(resourceExtension, ".")) { adaptedFileExtension = "." + resourceExtension; } - return new ClassPathResource(basePath + resourcePath + adaptedFileExtension); + return new Resources.ClasspathResource(basePath + resourcePath + adaptedFileExtension); } - private static String adaptBasePath(String basePath) { - return StringUtils.endsWithIgnoreCase(basePath, "/") ? basePath : basePath + "/"; + public String getBasePath() { + return basePath; + } + + public Charset getCharset() { + return charset; } } diff --git a/simulator-starter/src/main/java/org/citrusframework/simulator/ws/WsdlScenarioGenerator.java b/simulator-starter/src/main/java/org/citrusframework/simulator/ws/WsdlScenarioGenerator.java index c7e7c5088..d8c97b227 100644 --- a/simulator-starter/src/main/java/org/citrusframework/simulator/ws/WsdlScenarioGenerator.java +++ b/simulator-starter/src/main/java/org/citrusframework/simulator/ws/WsdlScenarioGenerator.java @@ -10,6 +10,8 @@ import org.apache.xmlbeans.impl.xsd2inst.SampleXmlUtil; import org.citrusframework.exceptions.CitrusRuntimeException; import org.citrusframework.simulator.exception.SimulatorException; +import org.citrusframework.spi.CitrusResourceWrapper; +import org.citrusframework.spi.Resource; import org.citrusframework.xml.schema.locator.JarWSDLLocator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,7 +21,6 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.core.env.Environment; -import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -41,19 +42,22 @@ */ public class WsdlScenarioGenerator implements BeanFactoryPostProcessor { + /** + * Logger + */ + private static final Logger logger = LoggerFactory.getLogger(WsdlScenarioGenerator.class); + /** * Optional WSDL file location system property for auto generated scenarios */ private static final String SIMULATOR_WSDL_LOCATION_PROPERTY = "citrus.simulator.ws.wsdl.location"; private static final String SIMULATOR_WSDL_LOCATION_ENV = "CITRUS_SIMULATOR_WS_WSDL_LOCATION"; - /** - * Logger - */ - private static final Logger log = LoggerFactory.getLogger(WsdlScenarioGenerator.class); + /** * Target wsdl to generate scenarios from */ private final Resource wsdlResource; + /** * Naming strategy for generated scenarios */ @@ -63,7 +67,8 @@ public class WsdlScenarioGenerator implements BeanFactoryPostProcessor { * Default constructor. */ public WsdlScenarioGenerator(Environment environment) { - wsdlResource = new PathMatchingResourcePatternResolver().getResource(environment.getProperty(SIMULATOR_WSDL_LOCATION_PROPERTY, environment.getProperty(SIMULATOR_WSDL_LOCATION_ENV, ""))); + org.springframework.core.io.Resource springResource = new PathMatchingResourcePatternResolver().getResource(environment.getProperty(SIMULATOR_WSDL_LOCATION_PROPERTY, environment.getProperty(SIMULATOR_WSDL_LOCATION_ENV, ""))); + wsdlResource = new CitrusResourceWrapper(springResource); } /** @@ -115,7 +120,7 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) }; if (beanFactory instanceof BeanDefinitionRegistry) { - log.info("Register auto generated scenario as bean definition: " + scenarioName); + logger.info("Register auto generated scenario as bean definition: " + scenarioName); BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(WsdlOperationScenario.class) .addConstructorArgValue(operation) .addPropertyValue("soapAction", soapAction) @@ -132,7 +137,7 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) ((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(scenarioName, beanDefinitionBuilder.getBeanDefinition()); } else { - log.info("Register auto generated scenario as singleton: " + scenarioName); + logger.info("Register auto generated scenario as singleton: " + scenarioName); WsdlOperationScenario scenario = createScenario(operation, soapAction, generateRequest(operation, SampleXmlUtil.createSampleForType(requestElem)), generateResponse(operation, SampleXmlUtil.createSampleForType(responseElem))); beanFactory.registerSingleton(scenarioName, scenario); } @@ -214,8 +219,6 @@ private Definition getWsdlDefinition(Resource wsdl) { } return definition; - } catch (IOException e) { - throw new CitrusRuntimeException("Failed to read wsdl file resource", e); } catch (WSDLException e) { throw new CitrusRuntimeException("Failed to create wsdl schema instance", e); } @@ -232,7 +235,7 @@ private XmlObject compileWsdl(Resource wsdlResource) { return XmlObject.Factory.parse(wsdlResource.getInputStream(), (new XmlOptions()).setLoadLineNumbers().setLoadMessageDigest().setCompileDownloadUrls()); } catch (XmlException e) { for (Object error : e.getErrors()) { - log.error(((XmlError) error).getLine() + String.valueOf(error)); + logger.error(((XmlError) error).getLine() + String.valueOf(error)); } throw new SimulatorException("WSDL could not be parsed", e); } catch (Exception e) { @@ -267,7 +270,7 @@ private SchemaTypeSystem compileXsd(XmlObject wsdl) { schemaTypeSystem = XmlBeans.compileXsd(xsd, XmlBeans.getContextTypeLoader(), new XmlOptions()); } catch (XmlException e) { for (Object error : e.getErrors()) { - log.error("Line " + ((XmlError) error).getLine() + ": " + error); + logger.error("Line " + ((XmlError) error).getLine() + ": " + error); } throw new SimulatorException("Failed to compile XSD schema", e); } catch (Exception e) { @@ -379,5 +382,4 @@ public enum WsdlScenarioNamingStrategy { OPERATION, SOAP_ACTION } - } diff --git a/simulator-starter/src/test/java/org/citrusframework/simulator/http/HttpScenarioGeneratorTest.java b/simulator-starter/src/test/java/org/citrusframework/simulator/http/HttpScenarioGeneratorTest.java index f93147d31..a0593f443 100644 --- a/simulator-starter/src/test/java/org/citrusframework/simulator/http/HttpScenarioGeneratorTest.java +++ b/simulator-starter/src/test/java/org/citrusframework/simulator/http/HttpScenarioGeneratorTest.java @@ -1,6 +1,7 @@ package org.citrusframework.simulator.http; import io.swagger.models.Operation; +import org.citrusframework.spi.Resources; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -9,7 +10,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.core.io.ClassPathResource; import org.springframework.web.bind.annotation.RequestMethod; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -37,7 +37,7 @@ class HttpScenarioGeneratorTest { @BeforeEach void beforeEachSetup() { - fixture = new HttpScenarioGenerator(new ClassPathResource("swagger/swagger-api.json")); + fixture = new HttpScenarioGenerator(new Resources.ClasspathResource("swagger/swagger-api.json")); } @Test diff --git a/simulator-starter/src/test/java/org/citrusframework/simulator/template/TemplateHelperTest.java b/simulator-starter/src/test/java/org/citrusframework/simulator/template/TemplateHelperTest.java index 152e53924..547e5685b 100644 --- a/simulator-starter/src/test/java/org/citrusframework/simulator/template/TemplateHelperTest.java +++ b/simulator-starter/src/test/java/org/citrusframework/simulator/template/TemplateHelperTest.java @@ -1,9 +1,9 @@ package org.citrusframework.simulator.template; +import org.citrusframework.spi.Resource; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.core.io.Resource; import java.util.stream.Stream; diff --git a/simulator-starter/src/test/java/org/citrusframework/simulator/ws/WsdlScenarioGeneratorTest.java b/simulator-starter/src/test/java/org/citrusframework/simulator/ws/WsdlScenarioGeneratorTest.java index 527d3c05e..4511a7036 100644 --- a/simulator-starter/src/test/java/org/citrusframework/simulator/ws/WsdlScenarioGeneratorTest.java +++ b/simulator-starter/src/test/java/org/citrusframework/simulator/ws/WsdlScenarioGeneratorTest.java @@ -1,5 +1,6 @@ package org.citrusframework.simulator.ws; +import org.citrusframework.spi.Resources; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -11,7 +12,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.core.io.ClassPathResource; import java.util.stream.Stream; @@ -71,7 +71,7 @@ static Stream data() { @BeforeEach void beforeEachSetup() { - fixture = new WsdlScenarioGenerator(new ClassPathResource("schema/TestService.wsdl")); + fixture = new WsdlScenarioGenerator(new Resources.ClasspathResource("schema/TestService.wsdl")); } @MethodSource