This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new b6f65ecacdb Camel 20567 make it possible to define restconfiguration
in xml-io-dsl and xml-jaxb-dsl (#13488)
b6f65ecacdb is described below
commit b6f65ecacdbc48ea90f0e9695704cb26ccf839ae
Author: John Poth <[email protected]>
AuthorDate: Mon Mar 18 11:25:42 2024 +0100
Camel 20567 make it possible to define restconfiguration in xml-io-dsl and
xml-jaxb-dsl (#13488)
* CAMEL-20257: make it possible to define restConfiguration ins xml-io-dsl
* CAMEL-20257: make it possible to define restConfiguration ins xml-jaxb-dsl
---
.../java/org/apache/camel/xml/jaxb/JaxbHelper.java | 24 +++++++++
.../camel/dsl/xml/io/XmlRoutesBuilderLoader.java | 13 +++++
.../apache/camel/dsl/xml/io/XmlLoadAppTest.java | 35 +++++++++++++
.../org/apache/camel/dsl/xml/io/camel-app12.xml | 26 +++++++++
.../LoadRestConfigurationFromXmlTest.java | 61 ++++++++++++++++++++++
.../dsl/xml/jaxb/definition/restConfiguration.xml | 24 +++++++++
.../dsl/xml/jaxb/JaxbXmlRoutesBuilderLoader.java | 9 ++++
7 files changed, 192 insertions(+)
diff --git
a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java
b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java
index 41099653e46..712f2d6d4be 100644
---
a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java
+++
b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java
@@ -57,6 +57,7 @@ import org.apache.camel.model.TemplatedRouteDefinition;
import org.apache.camel.model.TemplatedRoutesDefinition;
import org.apache.camel.model.ToDynamicDefinition;
import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.rest.RestConfigurationDefinition;
import org.apache.camel.model.rest.RestDefinition;
import org.apache.camel.model.rest.RestsDefinition;
import org.apache.camel.spi.NamespaceAware;
@@ -549,6 +550,29 @@ public final class JaxbHelper {
return answer;
}
+ public static RestConfigurationDefinition
loadRestConfigurationDefinition(CamelContext context, InputStream inputStream)
+ throws Exception {
+ // load rest configuration using JAXB
+ Document dom = newXmlConverter(context).toDOMDocument(inputStream,
null);
+
+ if (!CAMEL_NS.equals(dom.getDocumentElement().getNamespaceURI())) {
+ addNamespaceToDom(dom);
+ }
+ Unmarshaller unmarshaller =
getJAXBContext(context).createUnmarshaller();
+ Object result = unmarshaller.unmarshal(dom);
+
+ if (result == null) {
+ throw new IOException("Cannot unmarshal to rest configuration
using JAXB from input stream: " + inputStream);
+ }
+
+ if (result instanceof RestConfigurationDefinition) {
+ return (RestConfigurationDefinition) result;
+ } else {
+ // ignore not supported type
+ return null;
+ }
+ }
+
private static void removeNoiseFromUris(Element element) {
final NamedNodeMap attrs = element.getAttributes();
diff --git
a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
index e19fb750a58..d8e0e8e8e0d 100644
---
a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
+++
b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
@@ -51,6 +51,7 @@ import org.apache.camel.model.TemplatedRouteDefinition;
import org.apache.camel.model.TemplatedRoutesDefinition;
import org.apache.camel.model.app.BeansDefinition;
import org.apache.camel.model.app.RegistryBeanDefinition;
+import org.apache.camel.model.rest.RestConfigurationDefinition;
import org.apache.camel.model.rest.RestDefinition;
import org.apache.camel.model.rest.RestsDefinition;
import org.apache.camel.spi.ExchangeFactory;
@@ -195,6 +196,18 @@ public class XmlRoutesBuilderLoader extends
RouteBuilderLoaderSupport {
//
org.apache.camel.main.BaseMainSupport.postProcessCamelRegistry() (if given Main
implementation
// decides to do so)
+ if (app.getRestConfigurations().size() > 1) {
+ throw new RuntimeException("There should only be one
<restConfiguration>");
+ }
+ if (app.getRestConfigurations().size() == 1) {
+ RestConfigurationDefinition config =
app.getRestConfigurations().get(0);
+ try {
+ config.asRestConfiguration(getCamelContext(),
getCamelContext().getRestConfiguration());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
app.getRests().forEach(r -> {
r.setResource(getResource());
List<RestDefinition> list = new ArrayList<>();
diff --git
a/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlLoadAppTest.java
b/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlLoadAppTest.java
index 2422651160e..c93a55aa48d 100644
---
a/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlLoadAppTest.java
+++
b/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlLoadAppTest.java
@@ -16,11 +16,16 @@
*/
package org.apache.camel.dsl.xml.io;
+import java.util.Map;
+
import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.rest.DummyRestConsumerFactory;
+import org.apache.camel.component.rest.DummyRestProcessorFactory;
import org.apache.camel.dsl.xml.io.beans.GreeterMessage;
import org.apache.camel.dsl.xml.io.beans.MyDestroyBean;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.spi.Resource;
+import org.apache.camel.spi.RestConfiguration;
import org.apache.camel.spi.RoutesLoader;
import org.apache.camel.support.PluginHelper;
import org.junit.jupiter.api.Test;
@@ -301,4 +306,34 @@ public class XmlLoadAppTest {
context.stop();
}
}
+
+ @Test
+ public void testLoadCamelAppRestConfiguration() throws Exception {
+ try (DefaultCamelContext context = new DefaultCamelContext()) {
+
context.getCamelContextExtension().getRegistry().bind("dummy-rest", new
DummyRestConsumerFactory());
+
context.getCamelContextExtension().getRegistry().bind("dummy-rest", new
DummyRestProcessorFactory());
+
+ context.start();
+
+ Resource resource =
PluginHelper.getResourceLoader(context).resolveResource(
+ "/org/apache/camel/dsl/xml/io/camel-app12.xml");
+
+ RoutesLoader routesLoader = PluginHelper.getRoutesLoader(context);
+ routesLoader.preParseRoute(resource, false);
+ routesLoader.loadRoutes(resource);
+
+ RestConfiguration restConfiguration =
context.getRestConfiguration();
+ assertNotNull(restConfiguration, "There should be a rest
configuration");
+ assertEquals("dummy-rest", restConfiguration.getApiComponent());
+ assertEquals("dummy-rest", restConfiguration.getComponent());
+ assertEquals("api", restConfiguration.getContextPath());
+ assertEquals("api-doc", restConfiguration.getApiContextPath());
+
+ Map<String, Object> apiProperties =
restConfiguration.getApiProperties();
+ assertEquals("test", apiProperties.get("api.title"));
+ assertEquals("3.0", apiProperties.get("openapi.version"));
+
+ context.stop();
+ }
+ }
}
diff --git
a/dsl/camel-xml-io-dsl/src/test/resources/org/apache/camel/dsl/xml/io/camel-app12.xml
b/dsl/camel-xml-io-dsl/src/test/resources/org/apache/camel/dsl/xml/io/camel-app12.xml
new file mode 100644
index 00000000000..37392431201
--- /dev/null
+++
b/dsl/camel-xml-io-dsl/src/test/resources/org/apache/camel/dsl/xml/io/camel-app12.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<camel xmlns="http://camel.apache.org/schema/spring">
+ <restConfiguration contextPath="api" apiContextPath="api-doc"
+ apiComponent="dummy-rest" component="dummy-rest"
bindingMode="auto">
+ <apiProperty key="api.title" value="test"/>
+ <apiProperty key="openapi.version" value="3.0"/>
+ </restConfiguration>
+</camel>
diff --git
a/dsl/camel-xml-jaxb-dsl-test/definition/src/test/java/org/apache/camel/dsl/xml/jaxb/definition/LoadRestConfigurationFromXmlTest.java
b/dsl/camel-xml-jaxb-dsl-test/definition/src/test/java/org/apache/camel/dsl/xml/jaxb/definition/LoadRestConfigurationFromXmlTest.java
new file mode 100644
index 00000000000..36a281bc0e3
--- /dev/null
+++
b/dsl/camel-xml-jaxb-dsl-test/definition/src/test/java/org/apache/camel/dsl/xml/jaxb/definition/LoadRestConfigurationFromXmlTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.xml.jaxb.definition;
+
+import java.util.Map;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.component.rest.DummyRestConsumerFactory;
+import org.apache.camel.component.rest.DummyRestProcessorFactory;
+import org.apache.camel.spi.Registry;
+import org.apache.camel.spi.Resource;
+import org.apache.camel.spi.RestConfiguration;
+import org.apache.camel.support.PluginHelper;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class LoadRestConfigurationFromXmlTest extends ContextTestSupport {
+
+ @Override
+ protected Registry createCamelRegistry() throws Exception {
+ Registry jndi = super.createCamelRegistry();
+ jndi.bind("dummy-rest", new DummyRestConsumerFactory());
+ jndi.bind("dummy-rest-api", new DummyRestProcessorFactory());
+ return jndi;
+ }
+
+ @Test
+ public void testLoadRestsDefinitionFromXml() throws Exception {
+ // load rest configuration from XML and add it to the existing camel
context
+ Resource resource = PluginHelper.getResourceLoader(context)
+
.resolveResource("org/apache/camel/dsl/xml/jaxb/definition/restConfiguration.xml");
+ PluginHelper.getRoutesLoader(context).loadRoutes(resource);
+
+ RestConfiguration restConfiguration = context.getRestConfiguration();
+ assertNotNull(restConfiguration, "There should be a rest
configuration");
+ assertEquals("dummy-rest", restConfiguration.getApiComponent());
+ assertEquals("dummy-rest", restConfiguration.getComponent());
+ assertEquals("api", restConfiguration.getContextPath());
+ assertEquals("api-doc", restConfiguration.getApiContextPath());
+
+ Map<String, Object> apiProperties =
restConfiguration.getApiProperties();
+ assertEquals("test", apiProperties.get("api.title"));
+ assertEquals("3.0", apiProperties.get("openapi.version"));
+ }
+}
diff --git
a/dsl/camel-xml-jaxb-dsl-test/definition/src/test/resources/org/apache/camel/dsl/xml/jaxb/definition/restConfiguration.xml
b/dsl/camel-xml-jaxb-dsl-test/definition/src/test/resources/org/apache/camel/dsl/xml/jaxb/definition/restConfiguration.xml
new file mode 100644
index 00000000000..70a8e1cc416
--- /dev/null
+++
b/dsl/camel-xml-jaxb-dsl-test/definition/src/test/resources/org/apache/camel/dsl/xml/jaxb/definition/restConfiguration.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<restConfiguration contextPath="api" apiContextPath="api-doc"
+ apiComponent="dummy-rest" component="dummy-rest"
bindingMode="auto">
+ <apiProperty key="api.title" value="test"/>
+ <apiProperty key="openapi.version" value="3.0"/>
+</restConfiguration>
diff --git
a/dsl/camel-xml-jaxb-dsl/src/main/java/org/apache/camel/dsl/xml/jaxb/JaxbXmlRoutesBuilderLoader.java
b/dsl/camel-xml-jaxb-dsl/src/main/java/org/apache/camel/dsl/xml/jaxb/JaxbXmlRoutesBuilderLoader.java
index ae9ccc5adf0..639a8ff0ed8 100644
---
a/dsl/camel-xml-jaxb-dsl/src/main/java/org/apache/camel/dsl/xml/jaxb/JaxbXmlRoutesBuilderLoader.java
+++
b/dsl/camel-xml-jaxb-dsl/src/main/java/org/apache/camel/dsl/xml/jaxb/JaxbXmlRoutesBuilderLoader.java
@@ -29,10 +29,12 @@ import org.apache.camel.model.RouteDefinition;
import org.apache.camel.model.RouteTemplatesDefinition;
import org.apache.camel.model.RoutesDefinition;
import org.apache.camel.model.TemplatedRoutesDefinition;
+import org.apache.camel.model.rest.RestConfigurationDefinition;
import org.apache.camel.model.rest.RestsDefinition;
import org.apache.camel.spi.Resource;
import org.apache.camel.spi.annotations.RoutesLoader;
+import static
org.apache.camel.xml.jaxb.JaxbHelper.loadRestConfigurationDefinition;
import static org.apache.camel.xml.jaxb.JaxbHelper.loadRestsDefinition;
import static
org.apache.camel.xml.jaxb.JaxbHelper.loadRouteConfigurationsDefinition;
import static
org.apache.camel.xml.jaxb.JaxbHelper.loadRouteTemplatesDefinition;
@@ -90,6 +92,13 @@ public class JaxbXmlRoutesBuilderLoader extends
RouteBuilderLoaderSupport {
}
}
}
+
+ try (InputStream is = resourceInputStream(resource)) {
+ RestConfigurationDefinition config =
loadRestConfigurationDefinition(getCamelContext(), is);
+ if (config != null) {
+ config.asRestConfiguration(getCamelContext(),
getCamelContext().getRestConfiguration());
+ }
+ }
}
@Override