You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2024/09/13 17:28:34 UTC
(camel-karaf) branch essobedo/491/cxf-integration-tests created (now 0b5fa4b5)
This is an automated email from the ASF dual-hosted git repository.
nfilotto pushed a change to branch essobedo/491/cxf-integration-tests
in repository https://gitbox.apache.org/repos/asf/camel-karaf.git
at 0b5fa4b5 Ref #491: Add camel-cxf integration tests
This branch includes the following new commits:
new 0b5fa4b5 Ref #491: Add camel-cxf integration tests
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(camel-karaf) 01/01: Ref #491: Add camel-cxf integration tests
Posted by nf...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
nfilotto pushed a commit to branch essobedo/491/cxf-integration-tests
in repository https://gitbox.apache.org/repos/asf/camel-karaf.git
commit 0b5fa4b56a298668979517efa01ddca8b1cc9e8d
Author: Nicolas Filotto <ni...@qlik.com>
AuthorDate: Fri Sep 13 19:28:14 2024 +0200
Ref #491: Add camel-cxf integration tests
---
components/camel-cxf/camel-cxf-all/pom.xml | 20 +-
.../camel/component/cxf/osgi/MainActivator.java | 2 -
.../HTTPJettyTransportNamespaceHandler.java | 81 -----
.../JettyHTTPServerEngineFactoryHolder.java | 272 --------------
.../blueprint/JettyServerEngineFactoryParser.java | 133 -------
.../osgi/HTTPJettyDestinationFactory.java | 42 ---
.../osgi/HTTPJettyTransportActivator.java | 391 ---------------------
.../main/resources/META-INF/cxf/bus-extensions.txt | 2 -
features/src/main/feature/camel-features.xml | 1 -
tests/camel-integration-test/pom.xml | 1 +
tests/features/camel-cxf/pom.xml | 89 +++++
.../karaf/camel/test/CamelCxfRsRouteSupplier.java | 65 ++++
.../karaf/camel/test/CamelCxfWsRouteSupplier.java | 98 ++++++
.../apache/karaf/camel/test/beans/Customer.java | 65 ++++
.../karaf/camel/test/beans/CustomerService.java | 51 +++
.../karaf/camel/test/jaxws/HelloService.java | 21 +-
.../apache/karaf/camel/itest/CamelCxfITest.java | 199 +++++++++++
tests/features/pom.xml | 3 +-
18 files changed, 584 insertions(+), 952 deletions(-)
diff --git a/components/camel-cxf/camel-cxf-all/pom.xml b/components/camel-cxf/camel-cxf-all/pom.xml
index 9b357c13..cb6786ab 100644
--- a/components/camel-cxf/camel-cxf-all/pom.xml
+++ b/components/camel-cxf/camel-cxf-all/pom.xml
@@ -53,8 +53,6 @@
org.apache.camel.component.cxf.transport.http.osgi;version=${project.version},
org.apache.camel.component.cxf.transport.http.blueprint;version=${project.version},
org.apache.camel.component.cxf.servlet.blueprint;version=${project.version},
- org.apache.camel.component.cxf.transport.http_jetty.blueprint;version=${project.version},
- org.apache.camel.component.cxf.transport.http_jetty.osgi;version=${project.version},
org.apache.camel.component.cxf.ws.addressing.blueprint;version=${project.version},
org.apache.camel.component.cxf.ws.policy.blueprint;version=${project.version},
org.apache.camel.component.cxf.feature;version=${camel-version},
@@ -64,7 +62,7 @@
org.apache.camel.component.cxf.transport.header;version=${camel-version},
org.apache.camel.component.cxf.transport.message;version=${camel-version},
org.apache.camel.component.cxf.binding.soap.blueprint;version=${project.version},
- org.apache.cxf.*;version=${cxf-version},
+ org.apache.cxf*;version=${cxf-version},
</camel.osgi.export>
<camel.osgi.activator>org.apache.camel.component.cxf.osgi.MainActivator</camel.osgi.activator>
<camel-osgi-camel-import>
@@ -98,7 +96,6 @@
jakarta.ws.rs*;version="${camel-osgi-jakarta-ws-rs-version}",
jakarta.xml.soap*;version="${camel-osgi-saaj-version}",
jakarta.servlet*;version="${camel-osgi-jakarta-servlet-version}",
- org.eclipse.jetty*;version="${camel-osgi-jetty-version}",
org.glassfish.jaxb.runtime.v2;version="${camel-osgi-jakarta-bind-version}",
javax.cache*;resolution:=optional,
org.apache.cxf.tools*;resolution:=optional,
@@ -121,7 +118,7 @@
org.glassfish.hk2.osgiresourcelocator
</camel.osgi.import>
<camel.osgi.dynamicimport.pkg>
- org.apache.cxf.bus,org.apache.cxf.*,com.ctc.wstx.*,org.eclipse.jetty.jmx
+ org.apache.cxf.bus,org.apache.cxf.*,com.ctc.wstx.*
</camel.osgi.dynamicimport.pkg>
<camel.osgi.export.service>
org.apache.aries.blueprint.NamespaceHandler;osgi.service.blueprint.namespace="http://cxf.apache.org/blueprint/core",
@@ -135,7 +132,6 @@
org.apache.aries.blueprint.NamespaceHandler;osgi.service.blueprint.namespace="http://cxf.apache.org/blueprint/simple",
org.apache.aries.blueprint.NamespaceHandler;osgi.service.blueprint.namespace="http://cxf.apache.org/blueprint/jaxrs-client",
org.apache.aries.blueprint.NamespaceHandler;osgi.service.blueprint.namespace="http://cxf.apache.org/transports/http/configuration",
- org.apache.aries.blueprint.NamespaceHandler;osgi.service.blueprint.namespace="http://cxf.apache.org/transports/http-jetty/configuration",
org.apache.aries.blueprint.NamespaceHandler;osgi.service.blueprint.namespace="http://cxf.apache.org/ws/addressing",
org.apache.aries.blueprint.NamespaceHandler;osgi.service.blueprint.namespace="http://cxf.apache.org/policy",
org.apache.aries.blueprint.NamespaceHandler;osgi.service.blueprint.namespace="http://www.w3.org/ns/ws-policy",
@@ -270,17 +266,6 @@
</exclusion>
</exclusions>
</dependency>
- <dependency>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-rt-transports-http-jetty</artifactId>
- <version>${cxf-version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.cxf</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-addr</artifactId>
@@ -406,7 +391,6 @@
<include>org.apache.cxf:cxf-rt-frontend-jaxws</include>
<include>org.apache.cxf:cxf-rt-frontend-simple</include>
<include>org.apache.cxf:cxf-rt-transports-http</include>
- <include>org.apache.cxf:cxf-rt-transports-http-jetty</include>
<include>org.apache.cxf:cxf-rt-cxf-rt-security</include>
<include>org.apache.cxf:cxf-rt-cxf-rt-rs-client</include>
<include>org.apache.cxf:cxf-rt-ws-addr</include>
diff --git a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/osgi/MainActivator.java b/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/osgi/MainActivator.java
index bbce0aef..3d51575a 100644
--- a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/osgi/MainActivator.java
+++ b/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/osgi/MainActivator.java
@@ -21,7 +21,6 @@ import java.util.List;
import org.apache.camel.component.cxf.bus.osgi.CXFActivator;
import org.apache.camel.component.cxf.transport.http.osgi.HTTPTransportActivator;
-import org.apache.camel.component.cxf.transport.http_jetty.osgi.HTTPJettyTransportActivator;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
@@ -36,7 +35,6 @@ public class MainActivator implements BundleActivator {
new org.apache.camel.component.cxf.frontend.blueprint.Activator(),
new org.apache.camel.component.cxf.jaxrs.client.blueprint.Activator(),
new HTTPTransportActivator(),
- new HTTPJettyTransportActivator(),
new org.apache.camel.component.cxf.ws.addressing.blueprint.Activator(),
new org.apache.camel.component.cxf.ws.policy.blueprint.Activator());
diff --git a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/HTTPJettyTransportNamespaceHandler.java b/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/HTTPJettyTransportNamespaceHandler.java
deleted file mode 100644
index b2e02efe..00000000
--- a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/HTTPJettyTransportNamespaceHandler.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.component.cxf.transport.http_jetty.blueprint;
-
-import java.net.URL;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.apache.aries.blueprint.Namespaces;
-import org.apache.aries.blueprint.ParserContext;
-import org.apache.camel.component.cxf.helpers.BaseNamespaceHandler;
-import org.apache.cxf.common.logging.LogUtils;
-import org.osgi.service.blueprint.reflect.ComponentMetadata;
-import org.osgi.service.blueprint.reflect.Metadata;
-
-@Namespaces("http://cxf.apache.org/transports/http-jetty/configuration")
-public class HTTPJettyTransportNamespaceHandler extends BaseNamespaceHandler {
-
- public static final String JETTY_TRANSPORT = "http://cxf.apache.org/transports/http-jetty/configuration";
-
- private static final String JETTY_ENGINE = "engine";
-
- private static final String JETTY_ENGINE_FACTORY = "engine-factory";
-
- private static final Logger LOG = LogUtils.getL7dLogger(HTTPJettyTransportNamespaceHandler.class);
-
- public URL getSchemaLocation(String s) {
- if (JETTY_TRANSPORT.equals(s)) {
- return getClass().getClassLoader().
- getResource("schemas/configuration/http-jetty.xsd");
- }
- return super.findCoreSchemaLocation(s);
- }
-
- @SuppressWarnings("rawtypes")
- public Set<Class> getManagedClasses() {
- return null;
- }
-
- public Metadata parse(Element element, ParserContext parserContext) {
- if (LOG.isLoggable(Level.FINE)) {
- LOG.fine("Parsing element {{" + element.getNamespaceURI() + "}}{" + element.getLocalName() + "}");
- }
-
- if (JETTY_ENGINE.equals(element.getLocalName())) {
- //This doesn't hit normal configs.
- return new JettyServerEngineParser().parse(element, parserContext);
- } else if (JETTY_ENGINE_FACTORY.equals(element.getLocalName())) {
-
- return new JettyServerEngineFactoryParser().parse(element, parserContext);
- }
-
- return null;
- }
-
- public ComponentMetadata decorate(Node node,
- ComponentMetadata componentMetadata,
- ParserContext parserContext) {
- LOG.info("Decorating node " + node + " " + componentMetadata);
- return componentMetadata;
- }
-}
diff --git a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java b/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java
deleted file mode 100644
index 5745d88b..00000000
--- a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.component.cxf.transport.http_jetty.blueprint;
-
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.logging.Logger;
-
-import org.w3c.dom.Element;
-
-import jakarta.xml.bind.JAXBContext;
-import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.JAXBException;
-import org.apache.cxf.Bus;
-import org.apache.cxf.BusFactory;
-import org.apache.cxf.common.jaxb.JAXBContextCache;
-import org.apache.cxf.common.jaxb.JAXBUtils;
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.common.util.PackageUtils;
-import org.apache.cxf.common.util.StringUtils;
-import org.apache.cxf.configuration.jsse.TLSServerParameters;
-import org.apache.cxf.configuration.jsse.TLSServerParametersConfig;
-import org.apache.cxf.staxutils.StaxUtils;
-import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine;
-import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory;
-import org.apache.cxf.transport.http_jetty.ThreadingParameters;
-import org.apache.cxf.transports.http_jetty.configuration.JettyHTTPServerEngineConfigType;
-import org.apache.cxf.transports.http_jetty.configuration.JettyHTTPServerEngineFactoryConfigType;
-import org.apache.cxf.transports.http_jetty.configuration.TLSServerParametersIdentifiedType;
-import org.apache.cxf.transports.http_jetty.configuration.ThreadingParametersIdentifiedType;
-import org.apache.cxf.transports.http_jetty.configuration.ThreadingParametersType;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Handler;
-
-public class JettyHTTPServerEngineFactoryHolder {
-
- private static final Logger LOG = LogUtils.getL7dLogger(JettyHTTPServerEngineFactoryHolder.class);
-
- private String parsedElement;
- private JettyHTTPServerEngineFactory factory;
-
- private Map<String, Connector> connectorMap;
-
- private Map<String, List<Handler>> handlersMap;
-
- private JAXBContext jaxbContext;
- private Set<Class<?>> jaxbClasses;
-
- public JettyHTTPServerEngineFactoryHolder() {
- }
-
- public void init() {
- try {
- Element element = StaxUtils.read(new StringReader(parsedElement)).getDocumentElement();
-
- JettyHTTPServerEngineFactoryConfigType config
- = getJaxbObject(element,
- JettyHTTPServerEngineFactoryConfigType.class);
-
- Bus defaultBus = BusFactory.getDefaultBus();
- factory = new JettyHTTPServerEngineFactory(defaultBus);
-
- Map<String, ThreadingParameters> threadingParametersMap
- = new TreeMap<>();
-
- if (config.getIdentifiedThreadingParameters() != null) {
- for (ThreadingParametersIdentifiedType threads : config.getIdentifiedThreadingParameters()) {
- ThreadingParameters rThreads = new ThreadingParameters();
- String id = threads.getId();
- if (threads.getThreadingParameters().getMaxThreads() != null) {
- rThreads.setMaxThreads(threads.getThreadingParameters().getMaxThreads());
- }
- if (threads.getThreadingParameters().getMinThreads() != null) {
- rThreads.setMinThreads(threads.getThreadingParameters().getMinThreads());
- }
- rThreads.setThreadNamePrefix(threads.getThreadingParameters().getThreadNamePrefix());
- threadingParametersMap.put(id, rThreads);
- }
-
- factory.setThreadingParametersMap(threadingParametersMap);
- }
-
- //SSL
- Map<String, TLSServerParameters> sslMap = new TreeMap<>();
- if (config.getIdentifiedTLSServerParameters() != null) {
-
- for (TLSServerParametersIdentifiedType t : config.getIdentifiedTLSServerParameters()) {
- try {
- TLSServerParameters parameter
- = new TLSServerParametersConfig(t.getTlsServerParameters());
- sslMap.put(t.getId(), parameter);
- } catch (Exception e) {
- throw new RuntimeException("Could not configure TLS for id " + t.getId(), e);
- }
- }
- factory.setTlsServerParametersMap(sslMap);
- }
- //Engines
-
- List<JettyHTTPServerEngine> engineList = new ArrayList<>();
- for (JettyHTTPServerEngineConfigType engine : config.getEngine()) {
- JettyHTTPServerEngine eng = new JettyHTTPServerEngine(
- factory.getMBeanContainer(), engine.getHost(), engine.getPort());
- if (engine.getConnector() != null && connectorMap != null) {
- // we need to setup the Connector from the connectorMap
- Connector connector = connectorMap.get(engine.getPort().toString());
- if (connector != null) {
- eng.setConnector(connector);
- } else {
- throw new RuntimeException("Could not find the connector instance for engine with port"
- + engine.getPort().toString());
- }
- }
- if (engine.getHandlers() != null && handlersMap != null) {
- List<Handler> handlers = handlersMap.get(engine.getPort().toString());
- if (handlers != null) {
- eng.setHandlers(handlers);
- } else {
- throw new RuntimeException("Could not find the handlers instance for engine with port"
- + engine.getPort().toString());
- }
- }
-
- if (engine.isContinuationsEnabled() != null) {
- eng.setContinuationsEnabled(engine.isContinuationsEnabled());
- }
- if (engine.isSendServerVersion() != null) {
- eng.setSendServerVersion(engine.isSendServerVersion());
- }
- if (engine.getHost() != null && !StringUtils.isEmpty(engine.getHost())) {
- eng.setHost(engine.getHost());
- }
- if (engine.getMaxIdleTime() != null) {
- eng.setMaxIdleTime(engine.getMaxIdleTime());
- }
- if (engine.getPort() != null) {
- eng.setPort(engine.getPort());
- }
- if (engine.isReuseAddress() != null) {
- eng.setReuseAddress(engine.isReuseAddress());
- }
- if (engine.isSessionSupport() != null) {
- eng.setSessionSupport(engine.isSessionSupport());
- }
- if (engine.getSessionTimeout() != null) {
- eng.setSessionTimeout(engine.getSessionTimeout().intValue());
- }
- if (engine.getThreadingParameters() != null) {
- ThreadingParametersType threads = engine.getThreadingParameters();
- ThreadingParameters rThreads = new ThreadingParameters();
- if (threads.getMaxThreads() != null) {
- rThreads.setMaxThreads(threads.getMaxThreads());
- }
- if (threads.getMinThreads() != null) {
- rThreads.setMinThreads(threads.getMinThreads());
- }
-
- eng.setThreadingParameters(rThreads);
- }
-
- //eng.setServer(engine.getTlsServerParameters());
- if (engine.getTlsServerParameters() != null
- && (engine.getTlsServerParameters().getKeyManagers() != null
- || engine.getTlsServerParameters().getTrustManagers() != null)) {
- try {
- TLSServerParameters parameter =
- new TLSServerParametersConfig(engine.getTlsServerParameters());
- eng.setTlsServerParameters(parameter);
- } catch (Exception e) {
- throw new RuntimeException("Could not configure TLS for engine on "
- + eng.getHost() + ":" + eng.getPort(), e);
- }
- }
- eng.finalizeConfig();
-
- engineList.add(eng);
- }
- factory.setEnginesList(engineList);
- //Unravel this completely.
-
- factory.initComplete();
- } catch (Exception e) {
- throw new RuntimeException("Could not process configuration.", e);
- }
- }
-
- public void destroy() {
- // need to release the reference of the jaxb Classes
- factory.postShutdown();
- jaxbClasses.clear();
- jaxbContext = null;
- }
-
- public String getParsedElement() {
- return parsedElement;
- }
-
- public void setParsedElement(String parsedElement) {
- this.parsedElement = parsedElement;
- }
-
- public void setConnectorMap(Map<String, Connector> connectorMap) {
- this.connectorMap = connectorMap;
- }
-
- public void setHandlersMap(Map<String, List<Handler>> handlersMap) {
- this.handlersMap = handlersMap;
- }
-
- protected <T> T getJaxbObject(Element parent, Class<T> c) {
-
- try {
- JAXBElement<T> ele = JAXBUtils.unmarshall(getContext(c), parent, c);
- return ele.getValue();
- } catch (JAXBException e) {
- LOG.warning("Unable to parse property due to " + e);
- return null;
- }
- }
-
- protected synchronized JAXBContext getContext(Class<?> cls) {
- if (jaxbContext == null || jaxbClasses == null || !jaxbClasses.contains(cls)) {
- try {
- Set<Class<?>> tmp = new HashSet<>();
- if (jaxbClasses != null) {
- tmp.addAll(jaxbClasses);
- }
- JAXBContextCache.addPackage(tmp, PackageUtils.getPackageName(cls),
- cls == null ? getClass().getClassLoader() : cls.getClassLoader());
- if (cls != null) {
- boolean hasOf = false;
- for (Class<?> c : tmp) {
- if (c.getPackage() == cls.getPackage() && "ObjectFactory".equals(c.getSimpleName())) {
- hasOf = true;
- }
- }
- if (!hasOf) {
- tmp.add(cls);
- }
- }
- JAXBContextCache.scanPackages(tmp);
- JAXBContextCache.CachedContextAndSchemas ccs
- = JAXBContextCache.getCachedContextAndSchemas(tmp, null, null, null, false);
- jaxbClasses = ccs.getClasses();
- jaxbContext = ccs.getContext();
- } catch (JAXBException e) {
- throw new RuntimeException(e);
- }
- }
- return jaxbContext;
- }
-}
diff --git a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/JettyServerEngineFactoryParser.java b/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/JettyServerEngineFactoryParser.java
deleted file mode 100644
index 2980d014..00000000
--- a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/JettyServerEngineFactoryParser.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.component.cxf.transport.http_jetty.blueprint;
-
-import java.util.List;
-import java.util.StringTokenizer;
-import java.util.UUID;
-
-import org.w3c.dom.Element;
-
-import org.apache.aries.blueprint.ParserContext;
-import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
-import org.apache.aries.blueprint.mutable.MutableMapMetadata;
-import org.apache.camel.component.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser;
-import org.apache.cxf.common.util.StringUtils;
-import org.apache.cxf.helpers.DOMUtils;
-import org.apache.cxf.staxutils.StaxUtils;
-import org.osgi.service.blueprint.reflect.ComponentMetadata;
-import org.osgi.service.blueprint.reflect.Metadata;
-import org.osgi.service.blueprint.reflect.ValueMetadata;
-
-public class JettyServerEngineFactoryParser extends AbstractBPBeanDefinitionParser {
-
- public static final String JETTY_TRANSPORT = "http://cxf.apache.org/transports/http-jetty/configuration";
-
- public static final String JETTY_THREADING = "http://cxf.apache.org/configuration/parameterized-types";
-
- public static String getIdOrName(Element elem) {
- String id = elem.getAttribute("id");
-
- if (null == id || "".equals(id)) {
- String names = elem.getAttribute("name");
- if (null != names) {
- StringTokenizer st = new StringTokenizer(names, ",");
- if (st.countTokens() > 0) {
- id = st.nextToken();
- }
- }
- }
- return id;
- }
-
- public Metadata parse(Element element, ParserContext context) {
-
- //Endpoint definition
- MutableBeanMetadata ef = context.createMetadata(MutableBeanMetadata.class);
- if (!StringUtils.isEmpty(getIdOrName(element))) {
- ef.setId(getIdOrName(element));
- } else {
- ef.setId("jetty.engine.factory-holder-" + UUID.randomUUID().toString());
- }
- ef.setRuntimeClass(JettyHTTPServerEngineFactoryHolder.class);
-
- // setup the ConnectorMap and HandlersMap property for the JettyHTTPServerEngineFactoryHolder
-
- try {
- // Print the DOM node
- String xmlString = StaxUtils.toString(element);
- ef.addProperty("parsedElement", createValue(context, xmlString));
- ef.setInitMethod("init");
- ef.setActivation(ComponentMetadata.ACTIVATION_EAGER);
- ef.setDestroyMethod("destroy");
-
- // setup the EngineConnector
- List<Element> engines = DOMUtils
- .getChildrenWithName(element, HTTPJettyTransportNamespaceHandler.JETTY_TRANSPORT, "engine");
- ef.addProperty("connectorMap", parseEngineConnector(engines, ef, context));
- ef.addProperty("handlersMap", parseEngineHandlers(engines, ef, context));
- return ef;
- } catch (Exception e) {
- throw new RuntimeException("Could not process configuration.", e);
- }
- }
-
- protected Metadata parseEngineConnector(List<Element> engines, ComponentMetadata enclosingComponent,
- ParserContext context) {
- MutableMapMetadata map = context.createMetadata(MutableMapMetadata.class);
- map.setKeyType("java.lang.String");
- map.setValueType("org.eclipse.jetty.server.Connector");
-
- for (Element engine : engines) {
- String port = engine.getAttribute("port");
- ValueMetadata keyValue = createValue(context, port);
- Element connector = DOMUtils
- .getFirstChildWithName(engine, HTTPJettyTransportNamespaceHandler.JETTY_TRANSPORT,
- "connector");
- if (connector != null) {
- Element first = DOMUtils.getFirstElement(connector);
- Metadata valValue = context.parseElement(Metadata.class, enclosingComponent, first);
- map.addEntry(keyValue, valValue);
- }
- }
-
- return map;
- }
-
- protected Metadata parseEngineHandlers(List<Element> engines, ComponentMetadata enclosingComponent,
- ParserContext context) {
- MutableMapMetadata map = context.createMetadata(MutableMapMetadata.class);
- map.setKeyType("java.lang.String");
- map.setValueType("java.util.List");
-
- for (Element engine : engines) {
- String port = engine.getAttribute("port");
- ValueMetadata keyValue = createValue(context, port);
- Element handlers = DOMUtils
- .getFirstChildWithName(engine, HTTPJettyTransportNamespaceHandler.JETTY_TRANSPORT,
- "handlers");
- if (handlers != null) {
- Metadata valValue = parseListData(context, enclosingComponent, handlers);
- map.addEntry(keyValue, valValue);
- }
- }
- return map;
- }
-
-
-}
diff --git a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/osgi/HTTPJettyDestinationFactory.java b/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/osgi/HTTPJettyDestinationFactory.java
deleted file mode 100644
index 61fa21f4..00000000
--- a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/osgi/HTTPJettyDestinationFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.component.cxf.transport.http_jetty.osgi;
-
-import java.io.IOException;
-
-import org.apache.cxf.Bus;
-import org.apache.cxf.common.injection.NoJSR250Annotations;
-import org.apache.cxf.service.model.EndpointInfo;
-import org.apache.cxf.transport.http.AbstractHTTPDestination;
-import org.apache.cxf.transport.http.DestinationRegistry;
-import org.apache.cxf.transport.http.HttpDestinationFactory;
-import org.apache.cxf.transport.http_jetty.JettyHTTPDestination;
-import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory;
-
-@NoJSR250Annotations()
-public class HTTPJettyDestinationFactory implements HttpDestinationFactory {
-
- @Override
- public AbstractHTTPDestination createDestination(EndpointInfo endpointInfo, Bus bus, DestinationRegistry registry)
- throws IOException {
- if (bus.getExtension(ClassLoader.class) == null) {
- bus.setExtension(HTTPJettyDestinationFactory.class.getClassLoader(), ClassLoader.class);
- }
- return new JettyHTTPDestination(bus, registry, endpointInfo, bus.getExtension(JettyHTTPServerEngineFactory.class));
- }
-}
diff --git a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java b/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java
deleted file mode 100644
index 9ff3f17a..00000000
--- a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.component.cxf.transport.http_jetty.osgi;
-
-import java.io.IOException;
-import java.security.GeneralSecurityException;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import javax.management.MBeanServer;
-
-import org.apache.camel.component.cxf.bus.blueprint.BlueprintNameSpaceHandlerFactory;
-import org.apache.camel.component.cxf.bus.blueprint.NamespaceHandlerRegisterer;
-import org.apache.camel.component.cxf.transport.http_jetty.blueprint.HTTPJettyTransportNamespaceHandler;
-import org.apache.cxf.common.util.CollectionUtils;
-import org.apache.cxf.configuration.jsse.TLSParameterJaxBUtils;
-import org.apache.cxf.configuration.jsse.TLSServerParameters;
-import org.apache.cxf.configuration.security.CertStoreType;
-import org.apache.cxf.configuration.security.CertificateConstraintsType;
-import org.apache.cxf.configuration.security.ClientAuthentication;
-import org.apache.cxf.configuration.security.CombinatorType;
-import org.apache.cxf.configuration.security.DNConstraintsType;
-import org.apache.cxf.configuration.security.FiltersType;
-import org.apache.cxf.configuration.security.KeyManagersType;
-import org.apache.cxf.configuration.security.KeyStoreType;
-import org.apache.cxf.configuration.security.SecureRandomParameters;
-import org.apache.cxf.configuration.security.TrustManagersType;
-import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine;
-import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory;
-import org.apache.cxf.transport.http_jetty.ThreadingParameters;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.cm.ConfigurationException;
-import org.osgi.service.cm.ManagedServiceFactory;
-import org.osgi.util.tracker.ServiceTracker;
-
-public class HTTPJettyTransportActivator
- implements BundleActivator, ManagedServiceFactory {
- public static final String FACTORY_PID = "org.apache.cxf.http.jetty";
-
- BundleContext context;
- MBeanServer mbeans;
- ServiceTracker<MBeanServer, ?> mbeanServerTracker;
- ServiceRegistration<ManagedServiceFactory> reg;
-
- JettyHTTPServerEngineFactory factory = new JettyHTTPServerEngineFactory() {
- public MBeanServer getMBeanServer() {
- return (MBeanServer)mbeanServerTracker.getService();
- }
- };
-
- public void start(BundleContext ctx) throws Exception {
- this.context = ctx;
- mbeanServerTracker = new ServiceTracker<>(ctx, MBeanServer.class, null);
- try {
- BlueprintNameSpaceHandlerFactory nsHandlerFactory = new BlueprintNameSpaceHandlerFactory() {
-
- @Override
- public Object createNamespaceHandler() {
- return new HTTPJettyTransportNamespaceHandler();
- }
- };
- NamespaceHandlerRegisterer.register(context, nsHandlerFactory,
- "http://cxf.apache.org/transports/http-jetty/configuration");
- } catch (NoClassDefFoundError e) {
- // Blueprint not available, ignore
- }
- reg = context.registerService(ManagedServiceFactory.class,
- this,
- CollectionUtils.singletonDictionary(Constants.SERVICE_PID, FACTORY_PID));
-
- }
-
- public void stop(BundleContext ctx) throws Exception {
- mbeanServerTracker.close();
- reg.unregister();
- }
-
- public String getName() {
- return FACTORY_PID;
- }
-
- public void updated(String pid, Dictionary<String, ?> properties)
- throws ConfigurationException {
- if (pid == null) {
- return;
- }
- int port = Integer.parseInt((String)properties.get("port"));
-
- String host = (String)properties.get("host");
- try {
- TLSServerParameters tls = createTlsServerParameters(properties);
- if (tls != null) {
- factory.setTLSServerParametersForPort(host, port, tls);
- } else {
- factory.createJettyHTTPServerEngine(host, port, "http");
- }
-
- JettyHTTPServerEngine e = factory.retrieveJettyHTTPServerEngine(port);
- configure(e, properties);
- } catch (GeneralSecurityException | IOException e) {
- throw new ConfigurationException(null, null, e);
- }
- }
-
-
- private void configure(JettyHTTPServerEngine e, Dictionary<String, ?> properties) {
- ThreadingParameters threading = createThreadingParameters(properties);
- if (threading != null) {
- e.setThreadingParameters(threading);
- }
- Enumeration<String> keys = properties.keys();
- while (keys.hasMoreElements()) {
- String k = keys.nextElement();
- if ("sessionSupport".equals(k)) {
- e.setSessionSupport(Boolean.parseBoolean((String)properties.get(k)));
- } else if ("continuationsEnabled".equals(k)) {
- e.setContinuationsEnabled(Boolean.parseBoolean((String)properties.get(k)));
- } else if ("sendServerVersion".equals(k)) {
- e.setSendServerVersion(Boolean.parseBoolean((String)properties.get(k)));
- } else if ("reuseAddress".equals(k)) {
- e.setReuseAddress(Boolean.parseBoolean((String)properties.get(k)));
- } else if ("maxIdleTime".equals(k)) {
- e.setMaxIdleTime(Integer.parseInt((String)properties.get(k)));
- } else if ("sessionTimeout".equals(k)) {
- e.setSessionTimeout(Integer.parseInt((String)properties.get(k)));
- }
- }
- }
-
- public void deleted(String pid) {
- }
-
- private ThreadingParameters createThreadingParameters(Dictionary<String, ?> d) {
- Enumeration<String> keys = d.keys();
- ThreadingParameters p = null;
- while (keys.hasMoreElements()) {
- String k = keys.nextElement();
- if (k.startsWith("threadingParameters.")) {
- if (p == null) {
- p = new ThreadingParameters();
- }
- String v = (String)d.get(k);
- k = k.substring("threadingParameters.".length());
- if ("minThreads".equals(k)) {
- p.setMinThreads(Integer.parseInt(v));
- } else if ("maxThreads".equals(k)) {
- p.setMaxThreads(Integer.parseInt(v));
- } else if ("threadNamePrefix".equals(k)) {
- p.setThreadNamePrefix(k);
- }
- }
- }
- return p;
- }
-
- private TLSServerParameters createTlsServerParameters(Dictionary<String, ?> d) {
- Enumeration<String> keys = d.keys();
- TLSServerParameters p = null;
- SecureRandomParameters srp = null;
- KeyManagersType kmt = null;
- TrustManagersType tmt = null;
- boolean enableRevocation = false;
- while (keys.hasMoreElements()) {
- String k = keys.nextElement();
- if (k.startsWith("tlsServerParameters.")) {
- if (p == null) {
- p = new TLSServerParameters();
- }
- String v = (String)d.get(k);
- k = k.substring("tlsServerParameters.".length());
-
- if ("secureSocketProtocol".equals(k)) {
- p.setSecureSocketProtocol(v);
- } else if ("jsseProvider".equals(k)) {
- p.setJsseProvider(v);
- } else if ("certAlias".equals(k)) {
- p.setCertAlias(v);
- } else if ("clientAuthentication.want".equals(k)) {
- if (p.getClientAuthentication() == null) {
- p.setClientAuthentication(new ClientAuthentication());
- }
- p.getClientAuthentication().setWant(Boolean.parseBoolean(v));
- } else if ("clientAuthentication.required".equals(k)) {
- if (p.getClientAuthentication() == null) {
- p.setClientAuthentication(new ClientAuthentication());
- }
- p.getClientAuthentication().setRequired(Boolean.parseBoolean(v));
- } else if ("enableRevocation".equals(k)) {
- enableRevocation = Boolean.parseBoolean(v);
- } else if (k.startsWith("certConstraints.")) {
- configureCertConstraints(p, k, v);
- } else if (k.startsWith("secureRandomParameters.")) {
- srp = configureSecureRandom(srp, k, v);
- } else if (k.startsWith("cipherSuitesFilter.")) {
- configureCipherSuitesFilter(p, k, v);
- } else if (k.startsWith("cipherSuites")) {
- StringTokenizer st = new StringTokenizer(v, ",");
- while (st.hasMoreTokens()) {
- p.getCipherSuites().add(st.nextToken());
- }
- } else if (k.startsWith("excludeProtocols")) {
- StringTokenizer st = new StringTokenizer(v, ",");
- while (st.hasMoreTokens()) {
- p.getExcludeProtocols().add(st.nextToken());
- }
- } else if (k.startsWith("trustManagers.")) {
- tmt = getTrustManagers(tmt,
- k.substring("trustManagers.".length()),
- v);
- } else if (k.startsWith("keyManagers.")) {
- kmt = getKeyManagers(kmt,
- k.substring("keyManagers.".length()),
- v);
- }
- }
- }
-
- try {
- if (srp != null) {
- p.setSecureRandom(TLSParameterJaxBUtils.getSecureRandom(srp));
- }
- if (kmt != null) {
- p.setKeyManagers(TLSParameterJaxBUtils.getKeyManagers(kmt));
- }
- if (tmt != null) {
- p.setTrustManagers(TLSParameterJaxBUtils.getTrustManagers(tmt, enableRevocation));
- }
- } catch (RuntimeException e) {
- throw e;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- return p;
- }
-
- private void configureCipherSuitesFilter(TLSServerParameters p, String k, String v) {
- k = k.substring("cipherSuitesFilter.".length());
- StringTokenizer st = new StringTokenizer(v, ",");
- FiltersType ft = p.getCipherSuitesFilter();
- if (ft == null) {
- ft = new FiltersType();
- p.setCipherSuitesFilter(ft);
- }
- List<String> lst = "include".equals(k) ? ft.getInclude() : ft.getExclude();
- while (st.hasMoreTokens()) {
- lst.add(st.nextToken());
- }
- }
-
- private SecureRandomParameters configureSecureRandom(SecureRandomParameters srp, String k, String v) {
- k = k.substring("secureRandomParameters.".length());
- if (srp == null) {
- srp = new SecureRandomParameters();
- }
- if ("algorithm".equals(k)) {
- srp.setAlgorithm(v);
- } else if ("provider".equals(k)) {
- srp.setProvider(v);
- }
- return srp;
- }
-
- private void configureCertConstraints(TLSServerParameters p, String k, String v) {
- k = k.substring("certConstraints.".length());
- CertificateConstraintsType cct = p.getCertConstraints();
- if (cct == null) {
- cct = new CertificateConstraintsType();
- p.setCertConstraints(cct);
- }
- DNConstraintsType dnct = null;
- if (k.startsWith("SubjectDNConstraints.")) {
- dnct = cct.getSubjectDNConstraints();
- if (dnct == null) {
- dnct = new DNConstraintsType();
- cct.setSubjectDNConstraints(dnct);
- }
- k = k.substring("SubjectDNConstraints.".length());
- } else if (k.startsWith("IssuerDNConstraints.")) {
- dnct = cct.getIssuerDNConstraints();
- if (dnct == null) {
- dnct = new DNConstraintsType();
- cct.setIssuerDNConstraints(dnct);
- }
- k = k.substring("IssuerDNConstraints.".length());
- }
- if (dnct != null) {
- if ("combinator".equals(k)) {
- dnct.setCombinator(CombinatorType.fromValue(v));
- } else if ("RegularExpression".equals(k)) {
- dnct.getRegularExpression().add(k);
- }
- }
- }
-
- private KeyManagersType getKeyManagers(KeyManagersType keyManagers, String k, String v) {
- if (keyManagers == null) {
- keyManagers = new KeyManagersType();
- }
- if ("factoryAlgorithm".equals(k)) {
- keyManagers.setFactoryAlgorithm(v);
- } else if ("provider".equals(k)) {
- keyManagers.setProvider(v);
- } else if ("keyPassword".equals(k)) {
- keyManagers.setKeyPassword(v);
- } else if (k.startsWith("keyStore.")) {
- keyManagers.setKeyStore(getKeyStore(keyManagers.getKeyStore(),
- k.substring("keyStore.".length()),
- v));
- }
- return keyManagers;
- }
-
- private KeyStoreType getKeyStore(KeyStoreType ks, String k, String v) {
- if (ks == null) {
- ks = new KeyStoreType();
- }
- if ("type".equals(k)) {
- ks.setType(v);
- } else if ("password".equals(k)) {
- ks.setPassword(v);
- } else if ("provider".equals(k)) {
- ks.setProvider(v);
- } else if ("url".equals(k)) {
- ks.setUrl(v);
- } else if ("file".equals(k)) {
- ks.setFile(v);
- } else if ("resource".equals(k)) {
- ks.setResource(v);
- }
- return ks;
- }
-
- private TrustManagersType getTrustManagers(TrustManagersType tmt, String k, String v) {
- if (tmt == null) {
- tmt = new TrustManagersType();
- }
- if ("provider".equals(k)) {
- tmt.setProvider(v);
- } else if ("factoryAlgorithm".equals(k)) {
- tmt.setFactoryAlgorithm(v);
- } else if (k.startsWith("keyStore.")) {
- tmt.setKeyStore(getKeyStore(tmt.getKeyStore(),
- k.substring("keyStore.".length()),
- v));
- } else if (k.startsWith("certStore")) {
- tmt.setCertStore(getCertStore(tmt.getCertStore(),
- k.substring("certStore.".length()),
- v));
- }
- return tmt;
- }
-
- private CertStoreType getCertStore(CertStoreType cs, String k, String v) {
- if (cs == null) {
- cs = new CertStoreType();
- }
- if ("file".equals(k)) {
- cs.setFile(v);
- } else if ("url".equals(k)) {
- cs.setUrl(v);
- } else if ("resource".equals(k)) {
- cs.setResource(v);
- }
- return cs;
- }
-
-
-
-
-
-}
diff --git a/components/camel-cxf/camel-cxf-all/src/main/resources/META-INF/cxf/bus-extensions.txt b/components/camel-cxf/camel-cxf-all/src/main/resources/META-INF/cxf/bus-extensions.txt
index 8fd23f73..7ad7d9c7 100644
--- a/components/camel-cxf/camel-cxf-all/src/main/resources/META-INF/cxf/bus-extensions.txt
+++ b/components/camel-cxf/camel-cxf-all/src/main/resources/META-INF/cxf/bus-extensions.txt
@@ -29,8 +29,6 @@ org.apache.cxf.transport.http.HTTPWSDLExtensionLoader::true:true
org.apache.cxf.transport.http.policy.HTTPClientAssertionBuilder::true:true
org.apache.cxf.transport.http.policy.HTTPServerAssertionBuilder::true:true
org.apache.cxf.transport.http.policy.NoOpPolicyInterceptorProvider::true:true
-org.apache.camel.component.cxf.transport.http_jetty.osgi.HTTPJettyDestinationFactory::true
-org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory::true
org.apache.cxf.ws.addressing.policy.AddressingAssertionBuilder::true:true
org.apache.cxf.ws.addressing.policy.UsingAddressingAssertionBuilder::true:true
org.apache.cxf.ws.addressing.policy.AddressingPolicyInterceptorProvider::true:true
diff --git a/features/src/main/feature/camel-features.xml b/features/src/main/feature/camel-features.xml
index 59087f61..db9e8473 100644
--- a/features/src/main/feature/camel-features.xml
+++ b/features/src/main/feature/camel-features.xml
@@ -890,7 +890,6 @@
<feature version="[6,7)">jakarta-servlet</feature>
<feature version="${camel-osgi-jakarta-jws-version}">jakarta-jws</feature>
<feature version="[3,4)">jakarta-validation</feature>
- <feature version="[11,12)">jetty</feature>
<bundle dependency="true">mvn:org.glassfish.hk2/osgi-resource-locator/${osgi-resource-locator-version}</bundle>
<bundle dependency="true">mvn:org.apache.neethi/neethi/${auto-detect-version}</bundle>
<bundle dependency="true">mvn:org.apache.ws.xmlschema/xmlschema-core/${auto-detect-version}</bundle>
diff --git a/tests/camel-integration-test/pom.xml b/tests/camel-integration-test/pom.xml
index efc453cb..a8bf5e25 100644
--- a/tests/camel-integration-test/pom.xml
+++ b/tests/camel-integration-test/pom.xml
@@ -85,6 +85,7 @@
org.awaitility*,
org.slf4j
</Import-Package>
+ <DynamicImport-Package>*</DynamicImport-Package>
</instructions>
<excludeDependencies>geronimo-atinject_1.0_spec</excludeDependencies>
</configuration>
diff --git a/tests/features/camel-cxf/pom.xml b/tests/features/camel-cxf/pom.xml
new file mode 100644
index 00000000..4e7ed9ea
--- /dev/null
+++ b/tests/features/camel-cxf/pom.xml
@@ -0,0 +1,89 @@
+<?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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.camel.karaf</groupId>
+ <artifactId>camel-karaf-features-test</artifactId>
+ <version>4.7.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-cxf-test</artifactId>
+ <name>Apache Camel :: Karaf :: Tests :: Features :: CXF</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>jakarta.ws.rs</groupId>
+ <artifactId>jakarta.ws.rs-api</artifactId>
+ <version>${jakarta-ws-rs-api-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>jakarta.xml.bind</groupId>
+ <artifactId>jakarta.xml.bind-api</artifactId>
+ <version>${jakarta-xml-bind-api-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-cxf-common</artifactId>
+ <version>${camel-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-frontend-jaxws</artifactId>
+ <version>${cxf-version}</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>default-test</id>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ <phase>integration-test</phase>
+ <configuration>
+ <excludes>
+ <exclude>none</exclude>
+ </excludes>
+ <includes>
+ <include>**/*Test.java</include>
+ </includes>
+ <systemPropertyVariables>
+ <camel.karaf.version>${project.version}</camel.karaf.version>
+ <project.version>${project.version}</project.version>
+ <project.target>${project.build.directory}</project.target>
+ <users.file.location>${users.file.location}</users.file.location>
+ <org.ops4j.pax.logging.DefaultServiceLog.level>WARN</org.ops4j.pax.logging.DefaultServiceLog.level>
+ <cxf.version>${cxf-version}</cxf.version>
+ </systemPropertyVariables>
+ <forkedProcessExitTimeoutInSeconds>5</forkedProcessExitTimeoutInSeconds>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
diff --git a/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/CamelCxfRsRouteSupplier.java b/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/CamelCxfRsRouteSupplier.java
new file mode 100644
index 00000000..02a7be9b
--- /dev/null
+++ b/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/CamelCxfRsRouteSupplier.java
@@ -0,0 +1,65 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.karaf.camel.test;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.karaf.camel.itests.CamelRouteSupplier;
+import org.apache.karaf.camel.test.beans.Customer;
+import org.osgi.service.component.annotations.Component;
+
+@Component(
+ name = "karaf-camel-cxf-rs-test",
+ immediate = true,
+ service = CamelRouteSupplier.class
+)
+public class CamelCxfRsRouteSupplier implements CamelRouteSupplier {
+ private static final String PORT_RS_PATH = System.getProperty("cxf.rs.port") + "/CamelCxfRsRouteSupplier";
+ private static final String CXF_RS_ENDPOINT_URI = "cxfrs://http://localhost:" + PORT_RS_PATH
+ + "/rest?resourceClasses=org.apache.karaf.camel.test.beans.CustomerService&bindingStyle=SimpleConsumer";
+
+
+ @Override
+ public void createRoutes(RouteBuilder builder) {
+ builder.from(CXF_RS_ENDPOINT_URI)
+ .recipientList(builder.simple("direct:${header.operationName}"));
+
+ builder.from("direct:getCustomer").process(exchange -> {
+ Object id = exchange.getIn().getHeader("id");
+ if (!"123".equals(id)) {
+ throw new RuntimeException("The expected id is 123 but was " + id);
+ }
+ exchange.getMessage().setBody(new Customer(123, "Raul"));
+ exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, 200);
+ });
+
+ builder.from("direct:newCustomer").process(exchange -> {
+ Customer c = exchange.getIn().getBody(Customer.class);
+ if (c == null) {
+ throw new RuntimeException("The customer should not be null");
+ } else if (123 != c.getId()) {
+ throw new RuntimeException("The expected id is 123 but was " + c.getId());
+ }
+ Object age = exchange.getIn().getHeader("age");
+ if (!Integer.valueOf(12).equals(age)) {
+ throw new RuntimeException("The expected age is 12 but was ");
+ }
+ exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, 200);
+ });
+ }
+}
diff --git a/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/CamelCxfWsRouteSupplier.java b/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/CamelCxfWsRouteSupplier.java
new file mode 100644
index 00000000..5c519325
--- /dev/null
+++ b/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/CamelCxfWsRouteSupplier.java
@@ -0,0 +1,98 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.karaf.camel.test;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import jakarta.servlet.ServletRequest;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.cxf.endpoint.Client;
+import org.apache.karaf.camel.itests.CamelRouteSupplier;
+import org.osgi.service.component.annotations.Component;
+
+import static org.apache.camel.builder.Builder.header;
+
+@Component(
+ name = "karaf-camel-cxf-ws-test",
+ immediate = true,
+ service = CamelRouteSupplier.class
+)
+public class CamelCxfWsRouteSupplier implements CamelRouteSupplier {
+ private static final String PORT_WS_PATH = System.getProperty("cxf.ws.port") + "/CamelCxfWsRouteSupplier";
+ private static final String CXF_WS_ENDPOINT_URI = "cxf://http://localhost:" + PORT_WS_PATH
+ + "/test?serviceClass=org.apache.karaf.camel.test.jaxws.HelloService"
+ + "&publishedEndpointUrl=http://www.simple.com/services/test";
+
+ private static final String ECHO_OPERATION = "echo";
+ private static final String ECHO_BOOLEAN_OPERATION = "echoBoolean";
+
+ @Override
+ public void createRoutes(RouteBuilder builder) {
+ builder.from(CXF_WS_ENDPOINT_URI).choice().when(header(CxfConstants.OPERATION_NAME).isEqualTo(ECHO_OPERATION))
+ .process(exchange -> {
+ DataFormat dataFormat = exchange.getProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.class);
+ if (!DataFormat.POJO.equals(dataFormat)) {
+ throw new RuntimeException("The expected data format is POJO but was " + dataFormat);
+ }
+ Message in = exchange.getIn();
+ // check the remote IP from the cxfMessage
+ org.apache.cxf.message.Message cxfMessage
+ = in.getHeader(CxfConstants.CAMEL_CXF_MESSAGE, org.apache.cxf.message.Message.class);
+ if (cxfMessage == null) {
+ throw new RuntimeException("Should get the cxfMessage instance from message header");
+ }
+ ServletRequest request = (ServletRequest) cxfMessage.get("HTTP.REQUEST");
+ if (request == null) {
+ throw new RuntimeException("Should get the ServletRequest");
+ } else if (request.getRemoteAddr() == null) {
+ throw new RuntimeException("Should get the RemoteAddress");
+ }
+ // Could verify the HttpRequest
+ String contentType = in.getHeader(Exchange.CONTENT_TYPE, String.class);
+ if (contentType == null) {
+ throw new RuntimeException("Should get the contentType.");
+ }
+
+ // Get the parameter list
+ List<?> parameter = in.getBody(List.class);
+ // Get the operation name
+ String operation = (String) in.getHeader(CxfConstants.OPERATION_NAME);
+ Object result = operation + " " + parameter.get(0);
+ // Put the result back
+ exchange.getMessage().setBody(result);
+ // set up the response context which force start document
+ Map<String, Object> map = new HashMap<>();
+ map.put("org.apache.cxf.stax.force-start-document", Boolean.TRUE);
+ exchange.getMessage().setHeader(Client.RESPONSE_CONTEXT, map);
+ })
+ .when(header(CxfConstants.OPERATION_NAME).isEqualTo(ECHO_BOOLEAN_OPERATION)).process(exchange -> {
+ Message in = exchange.getIn();
+ // Get the parameter list
+ List<?> parameter = in.getBody(List.class);
+ // Put the result back
+ exchange.getMessage().setBody(parameter.get(0));
+ });
+ }
+}
diff --git a/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/beans/Customer.java b/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/beans/Customer.java
new file mode 100644
index 00000000..a57866b6
--- /dev/null
+++ b/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/beans/Customer.java
@@ -0,0 +1,65 @@
+/**
+ * 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.karaf.camel.test.beans;
+
+import java.util.Objects;
+
+import jakarta.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "Customer")
+public class Customer {
+ private long id;
+ private String name;
+
+ public Customer() {
+ }
+
+ public Customer(long id, String name) {
+ setId(id);
+ setName(name);
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Customer customer = (Customer) o;
+ return id == customer.id && Objects.equals(name, customer.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, name);
+ }
+}
diff --git a/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/beans/CustomerService.java b/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/beans/CustomerService.java
new file mode 100644
index 00000000..5caf0823
--- /dev/null
+++ b/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/beans/CustomerService.java
@@ -0,0 +1,51 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.karaf.camel.test.beans;
+
+
+import java.io.InputStream;
+
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.PUT;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.Response;
+
+@Path("/customerservice/")
+public interface CustomerService {
+
+ @GET
+ @Path("/customers/{id}/")
+ Customer getCustomer(@PathParam("id") String id, @QueryParam("test") String test);
+
+ @PUT
+ @Path("/customers/{id}")
+ Response updateCustomer(Customer customer, @PathParam("id") String id);
+
+ @POST
+ @Path("/customers/")
+ Response newCustomer(Customer customer, @QueryParam("age") int age);
+
+ @Consumes("image/jpeg")
+ @POST
+ @Path("/customers/{id}/image_inputstream")
+ Response uploadImageInputStream(InputStream is);
+
+}
diff --git a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/JettyServerEngineParser.java b/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/jaxws/HelloService.java
similarity index 63%
rename from components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/JettyServerEngineParser.java
rename to tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/jaxws/HelloService.java
index a021b5a3..1a2c348b 100644
--- a/components/camel-cxf/camel-cxf-all/src/main/java/org/apache/camel/component/cxf/transport/http_jetty/blueprint/JettyServerEngineParser.java
+++ b/tests/features/camel-cxf/src/main/java/org/apache/karaf/camel/test/jaxws/HelloService.java
@@ -14,18 +14,21 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package org.apache.karaf.camel.test.jaxws;
-package org.apache.camel.component.cxf.transport.http_jetty.blueprint;
+import java.util.List;
-import org.w3c.dom.Element;
+public interface HelloService {
+ String sayHello();
-import org.apache.aries.blueprint.ParserContext;
-import org.apache.camel.component.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser;
-import org.osgi.service.blueprint.reflect.Metadata;
+ void ping();
-public class JettyServerEngineParser extends AbstractBPBeanDefinitionParser {
+ int getInvocationCount();
+
+ String echo(String text) throws Exception;
+
+ Boolean echoBoolean(Boolean bool);
+
+ String complexParameters(List<String> par1, List<String> par2);
- public Metadata parse(Element element, ParserContext context) {
- return null;
- }
}
diff --git a/tests/features/camel-cxf/src/test/java/org/apache/karaf/camel/itest/CamelCxfITest.java b/tests/features/camel-cxf/src/test/java/org/apache/karaf/camel/itest/CamelCxfITest.java
new file mode 100644
index 00000000..27c8afb9
--- /dev/null
+++ b/tests/features/camel-cxf/src/test/java/org/apache/karaf/camel/itest/CamelCxfITest.java
@@ -0,0 +1,199 @@
+/*
+ * Licensed 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.karaf.camel.itest;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.JAXBException;
+
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.frontend.ClientProxyFactoryBean;
+import org.apache.karaf.camel.itests.AbstractCamelSingleFeatureRouteITest;
+import org.apache.karaf.camel.itests.AvailablePortProvider;
+import org.apache.karaf.camel.itests.CamelKarafTestHint;
+import org.apache.karaf.camel.itests.PaxExamWithExternalResource;
+import org.apache.karaf.camel.test.beans.Customer;
+import org.apache.karaf.camel.test.jaxws.HelloService;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.CoreOptions;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.ops4j.pax.exam.OptionUtils.combine;
+
+@CamelKarafTestHint(externalResourceProvider = CamelCxfITest.ExternalResourceProviders.class,
+ additionalRequiredFeatures = "camel-undertow")
+@RunWith(PaxExamWithExternalResource.class)
+@ExamReactorStrategy(PerClass.class)
+public class CamelCxfITest extends AbstractCamelSingleFeatureRouteITest {
+
+ private static final String ECHO_REQUEST = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ + "<soap:Body><ns1:echo xmlns:ns1=\"http://jaxws.test.camel.karaf.apache.org/\">"
+ + "<arg0 xmlns=\"http://jaxws.test.camel.karaf.apache.org/\">Hello World!</arg0></ns1:echo></soap:Body></soap:Envelope>";
+ private static final String TEST_MESSAGE = "Hello World!";
+
+ private JAXBContext jaxb;
+ private final HttpClient client = HttpClient.newHttpClient();
+
+ @Before
+ public void initCtx() throws JAXBException {
+ this.jaxb = JAXBContext.newInstance(Customer.class);
+ }
+
+ @Test
+ public void testCxfWs() throws Exception {
+ testInvokingServiceFromCXFClient();
+ testXmlDeclaration();
+ testPublishEndpointUrl();
+ }
+
+ @Test
+ public void testCxfRs() throws Exception {
+ testGetCustomerOnlyHeaders();
+ testNewCustomerWithQueryParam();
+ }
+
+ private String getPortPathRs() {
+ return ExternalResourceProviders.getCxfRsPort() + "/CamelCxfRsRouteSupplier";
+ }
+
+ private String getWsEndpointAddress() {
+ return "http://localhost:" + ExternalResourceProviders.getCxfWsPort() + "/CamelCxfWsRouteSupplier/test";
+ }
+
+ @Override
+ protected List<String> installRequiredBundles() throws Exception {
+ List<String> bundles = new ArrayList<>();
+ // Using the wrap protocol to install the bundle with Import-Package=* to avoid the issue with the bad
+ // jakarta.xml.bind and jakarta.servlet import version ranges
+ installBundle("wrap:mvn:org.apache.cxf/cxf-rt-transports-http-undertow/%s$overwrite=merge&Import-Package=*".formatted(System.getProperty("cxf-version")), true);
+ String undertowTransport = "org.apache.cxf.cxf-rt-transports-http-undertow";
+ assertBundleInstalledAndRunning(undertowTransport);
+ bundles.add(undertowTransport);
+ bundles.addAll(super.installRequiredBundles());
+ return bundles;
+ }
+
+ @Override
+ protected Option[] getAdditionalOptions() {
+ return combine(
+ super.getAdditionalOptions(), CoreOptions.systemProperty("cxf-version").value(System.getProperty("cxf.version"))
+ );
+ }
+
+ private void testGetCustomerOnlyHeaders() throws Exception {
+ URI uri = URI.create("http://localhost:%s/rest/customerservice/customers/123".formatted(getPortPathRs()));
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(uri)
+ .header("Accept", "text/xml")
+ .build();
+
+ HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ assertEquals(200, response.statusCode());
+ Customer entity = (Customer) jaxb.createUnmarshaller().unmarshal(new StringReader(response.body()));
+ assertEquals(123, entity.getId());
+ }
+
+ private void testNewCustomerWithQueryParam() throws Exception {
+ URI uri = URI.create("http://localhost:%s/rest/customerservice/customers?age=12".formatted(getPortPathRs()));
+ StringWriter sw = new StringWriter();
+ jaxb.createMarshaller().marshal(new Customer(123, "Raul"), sw);
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(uri)
+ .header("Content-Type", "text/xml")
+ .header("Accept", "text/xml")
+ .POST(HttpRequest.BodyPublishers.ofString(sw.toString()))
+ .build();
+
+ HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ assertEquals(200, response.statusCode());
+ }
+
+
+ private void testInvokingServiceFromCXFClient() throws Exception {
+ ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean();
+ ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+ clientBean.setAddress(getWsEndpointAddress());
+ clientBean.setServiceClass(HelloService.class);
+ clientBean.setBus(BusFactory.newInstance().createBus());
+
+ HelloService helloService = (HelloService) proxyFactory.create();
+
+ String result = helloService.echo(TEST_MESSAGE);
+ assertEquals("We should get the echo string result from router", result, "echo " + TEST_MESSAGE);
+
+ Boolean bool = helloService.echoBoolean(Boolean.TRUE);
+ assertNotNull("The result should not be null", bool);
+ assertEquals("We should get the echo boolean result from router", "true", bool.toString());
+ }
+
+ private void testXmlDeclaration() throws Exception {
+ URI uri = URI.create(getWsEndpointAddress());
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(uri)
+ .header("Content-Type", "text/xml; charset=UTF-8")
+ .header("Accept", "text/xml")
+ .POST(HttpRequest.BodyPublishers.ofString(ECHO_REQUEST))
+ .build();
+ HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ assertEquals(200, response.statusCode());
+ String body = response.body();
+ assertTrue("Can't find the xml declaration.", body.startsWith("<?xml version=\"1.0\" encoding="));
+ assertTrue("The response content is incorrect.", body.contains("echo Hello World!"));
+ }
+
+ private void testPublishEndpointUrl() throws Exception {
+ URI uri = URI.create(getWsEndpointAddress()+ "?wsdl");
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(uri)
+ .header("Accept", "text/xml")
+ .build();
+ HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ assertEquals(200, response.statusCode());
+ assertTrue("Can't find the right service location.", response.body().contains("http://www.simple.com/services/test"));
+ }
+
+ public static final class ExternalResourceProviders {
+ public static final String CXF_RS_PORT = "cxf.rs.port";
+ public static final String CXF_WS_PORT = "cxf.ws.port";
+
+ public static AvailablePortProvider createAvailablePortProvider() {
+ return new AvailablePortProvider(List.of(CXF_RS_PORT, CXF_WS_PORT));
+ }
+
+ static String getCxfRsPort() {
+ return System.getProperty(CXF_RS_PORT);
+ }
+
+ static String getCxfWsPort() {
+ return System.getProperty(CXF_WS_PORT);
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/features/pom.xml b/tests/features/pom.xml
index 1c7dfe1f..38c18a94 100644
--- a/tests/features/pom.xml
+++ b/tests/features/pom.xml
@@ -65,6 +65,7 @@
<module>camel-couchdb</module>
<module>camel-crypto</module>
<module>camel-csv</module>
+ <module>camel-cxf</module>
<module>camel-disruptor</module>
<module>camel-dns</module>
<!-- TODO: Fix the integration test and re-add it https://github.com/apache/camel-karaf/issues/438 -->
@@ -238,7 +239,7 @@
<configuration>
<instructions>
<Export-Package>
- org.apache.karaf.camel.test;version=${project.version}
+ org.apache.karaf.camel.test*;version=${project.version}
</Export-Package>
<Import-Package>
org.apache.camel*;${camel-osgi-import-camel-version},