You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/03/24 12:11:27 UTC
[camel-karaf] 01/02: CAMEL-14775: camel-cxf - Move OSGi blueprint
out into camel-cxf-blueprint
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-karaf.git
commit 6e53e99e334f02fb398327cf36df0771750a387a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Mar 24 12:17:04 2020 +0100
CAMEL-14775: camel-cxf - Move OSGi blueprint out into camel-cxf-blueprint
---
components/camel-cxf-blueprint/pom.xml | 96 +++++++++++
.../services/org/apache/camel/other.properties | 7 +
.../src/generated/resources/cxf-blueprint.json | 12 ++
.../blueprint/AbstractBeanDefinitionParser.java | 62 +++++++
.../component/cxf/blueprint/BlueprintSupport.java | 32 ++++
.../cxf/blueprint/CxfBlueprintEndpoint.java | 80 +++++++++
.../cxf/blueprint/CxfNamespaceHandler.java | 75 +++++++++
.../cxf/blueprint/EndpointDefinitionParser.java | 107 ++++++++++++
.../cxf/blueprint/RsClientBlueprintBean.java | 95 +++++++++++
.../cxf/blueprint/RsClientDefinitionParser.java | 93 +++++++++++
.../cxf/blueprint/RsServerBlueprintBean.java | 101 ++++++++++++
.../cxf/blueprint/RsServerDefinitionParser.java | 95 +++++++++++
.../jaxrs/blueprint/CxfRsBlueprintEndpoint.java | 95 +++++++++++
.../CxfRsBlueprintEndpointFactoryBean.java | 30 ++++
.../resources/OSGI-INF/blueprint/camel-cxf.xml | 31 ++++
.../main/resources/schema/blueprint/camel-cxf.xsd | 179 +++++++++++++++++++++
components/pom.xml | 1 +
.../karaf/features/src/main/resources/features.xml | 1 +
18 files changed, 1192 insertions(+)
diff --git a/components/camel-cxf-blueprint/pom.xml b/components/camel-cxf-blueprint/pom.xml
new file mode 100644
index 0000000..6231554
--- /dev/null
+++ b/components/camel-cxf-blueprint/pom.xml
@@ -0,0 +1,96 @@
+<?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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel.karaf</groupId>
+ <artifactId>components</artifactId>
+ <version>3.2.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-cxf-blueprint</artifactId>
+ <packaging>jar</packaging>
+ <name>Camel Karaf :: CXF Blueprint</name>
+ <description>Camel CXF for OSGi Blueprint</description>
+
+ <properties>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-cxf</artifactId>
+ </dependency>
+
+ <!-- OSGi, Blueprint -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-blueprint</artifactId>
+ <scope>provided</scope>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>osgi.cmpn</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.aries.blueprint</groupId>
+ <artifactId>org.apache.aries.blueprint.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-artifacts</id>
+ <phase>package</phase>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>./src/main/resources/schema/blueprint/camel-cxf.xsd</file>
+ <classifier>blueprint</classifier>
+ <type>xsd</type>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/components/camel-cxf-blueprint/src/generated/resources/META-INF/services/org/apache/camel/other.properties b/components/camel-cxf-blueprint/src/generated/resources/META-INF/services/org/apache/camel/other.properties
new file mode 100644
index 0000000..c1b4fc4
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/generated/resources/META-INF/services/org/apache/camel/other.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+name=cxf-blueprint
+groupId=org.apache.camel.karaf
+artifactId=camel-cxf-blueprint
+version=3.2.0-SNAPSHOT
+projectName=Camel Karaf :: CXF Blueprint
+projectDescription=Camel CXF for OSGi Blueprint
diff --git a/components/camel-cxf-blueprint/src/generated/resources/cxf-blueprint.json b/components/camel-cxf-blueprint/src/generated/resources/cxf-blueprint.json
new file mode 100644
index 0000000..1037ab4
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/generated/resources/cxf-blueprint.json
@@ -0,0 +1,12 @@
+{
+ "other": {
+ "kind": "other",
+ "name": "cxf-blueprint",
+ "title": "Cxf Blueprint",
+ "description": "Camel CXF for OSGi Blueprint",
+ "deprecated": false,
+ "groupId": "org.apache.camel.karaf",
+ "artifactId": "camel-cxf-blueprint",
+ "version": "3.2.0-SNAPSHOT"
+ }
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/AbstractBeanDefinitionParser.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/AbstractBeanDefinitionParser.java
new file mode 100644
index 0000000..84c857b
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/AbstractBeanDefinitionParser.java
@@ -0,0 +1,62 @@
+/*
+ * 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.component.cxf.blueprint;
+
+import java.util.StringTokenizer;
+
+import org.w3c.dom.Element;
+
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
+import org.apache.cxf.common.util.StringUtils;
+import org.apache.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser;
+import org.osgi.service.blueprint.reflect.BeanMetadata;
+
+public class AbstractBeanDefinitionParser extends AbstractBPBeanDefinitionParser {
+ 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 MutableBeanMetadata createBeanMetadata(Element element, ParserContext context, Class<?> runtimeClass) {
+ MutableBeanMetadata answer = context.createMetadata(MutableBeanMetadata.class);
+ answer.setRuntimeClass(runtimeClass);
+ answer.addProperty("blueprintContainer", createRef(context, "blueprintContainer"));
+ answer.addProperty("bundleContext", createRef(context, "blueprintBundleContext"));
+ // set the Bean scope to be prototype, so we can get a new instance per looking up
+ answer.setScope(BeanMetadata.SCOPE_PROTOTYPE);
+
+ if (!StringUtils.isEmpty(getIdOrName(element))) {
+ answer.setId(getIdOrName(element));
+ } else {
+ // TODO we may need to throw exception for it
+ answer.setId("camel.cxf.endpoint." + runtimeClass.getSimpleName() + "." + context.generateId());
+ }
+ return answer;
+ }
+
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/BlueprintSupport.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/BlueprintSupport.java
new file mode 100644
index 0000000..c6118d6
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/BlueprintSupport.java
@@ -0,0 +1,32 @@
+/*
+ * 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.component.cxf.blueprint;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+
+public interface BlueprintSupport {
+
+ void setBlueprintContainer(BlueprintContainer blueprintContainer);
+
+ BlueprintContainer getBlueprintContainer();
+
+ BundleContext getBundleContext();
+
+ void setBundleContext(BundleContext bundleContext);
+
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/CxfBlueprintEndpoint.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/CxfBlueprintEndpoint.java
new file mode 100644
index 0000000..205b879
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/CxfBlueprintEndpoint.java
@@ -0,0 +1,80 @@
+/*
+ * 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.component.cxf.blueprint;
+
+import org.apache.camel.blueprint.BlueprintCamelContext;
+import org.apache.camel.component.cxf.CxfComponent;
+import org.apache.camel.component.cxf.CxfEndpoint;
+import org.apache.cxf.BusFactory;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+
+public class CxfBlueprintEndpoint extends CxfEndpoint {
+
+ private BlueprintContainer blueprintContainer;
+ private BundleContext bundleContext;
+ private BlueprintCamelContext blueprintCamelContext;
+
+ public CxfBlueprintEndpoint(String address, BundleContext context) {
+ super(address, (CxfComponent)null);
+ bundleContext = context;
+ }
+
+ public void destroy() {
+ // Clean up the BusFactory's defaultBus
+ // This method is not called magically, blueprint
+ // needs you to set the destroy-method.
+ BusFactory.setDefaultBus(null);
+ BusFactory.setThreadDefaultBus(null);
+ }
+
+ @Override
+ public void setServiceClass(String n) throws ClassNotFoundException {
+ setServiceClass(bundleContext.getBundle().loadClass(n));
+ }
+
+ // Package private methods
+ // -------------------------------------------------------------------------
+
+ public BlueprintContainer getBlueprintContainer() {
+ return blueprintContainer;
+ }
+
+ public void setBlueprintContainer(BlueprintContainer blueprintContainer) {
+ this.blueprintContainer = blueprintContainer;
+ }
+
+ public BundleContext getBundleContext() {
+ return bundleContext;
+ }
+
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+
+ public BlueprintCamelContext getBlueprintCamelContext() {
+ return blueprintCamelContext;
+ }
+
+ public void setBlueprintCamelContext(BlueprintCamelContext blueprintCamelContext) {
+ this.blueprintCamelContext = blueprintCamelContext;
+ }
+
+ public CxfBlueprintEndpoint getBean() {
+ return this;
+ }
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/CxfNamespaceHandler.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/CxfNamespaceHandler.java
new file mode 100644
index 0000000..daf240a
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/CxfNamespaceHandler.java
@@ -0,0 +1,75 @@
+/*
+ * 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.component.cxf.blueprint;
+
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.cxf.helpers.BaseNamespaceHandler;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+import org.osgi.service.blueprint.reflect.Metadata;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CxfNamespaceHandler extends BaseNamespaceHandler {
+ private static final Logger LOG = LoggerFactory.getLogger(CxfNamespaceHandler.class);
+
+ @Override
+ public URL getSchemaLocation(String s) {
+ if ("http://camel.apache.org/schema/blueprint/cxf".equals(s)) {
+ return getClass().getClassLoader().getResource("schema/blueprint/camel-cxf.xsd");
+ }
+ return super.findCoreSchemaLocation(s);
+ }
+
+ @Override
+ @SuppressWarnings({"rawtypes"})
+ public Set<Class> getManagedClasses() {
+ return new HashSet<>(Arrays.asList(CxfNamespaceHandler.class));
+ }
+
+ @Override
+ public Metadata parse(Element element, ParserContext context) {
+ Metadata answer = null;
+ String s = element.getLocalName();
+ if ("cxfEndpoint".equals(s)) {
+ LOG.debug("parsing the cxfEndpoint element");
+ answer = new EndpointDefinitionParser().parse(element, context);
+ }
+ if ("rsClient".equals(s)) {
+ LOG.debug("parsing the rsClient element");
+ answer = new RsClientDefinitionParser().parse(element, context);
+ }
+ if ("rsServer".equals(s)) {
+ LOG.debug("parsing the rsServer element");
+ answer = new RsServerDefinitionParser().parse(element, context);
+ }
+
+ return answer;
+ }
+
+ @Override
+ public ComponentMetadata decorate(Node node, ComponentMetadata componentMetadata, ParserContext parserContext) {
+ return null;
+ }
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/EndpointDefinitionParser.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/EndpointDefinitionParser.java
new file mode 100644
index 0000000..d288f0b
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/EndpointDefinitionParser.java
@@ -0,0 +1,107 @@
+/*
+ * 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.component.cxf.blueprint;
+
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
+import org.apache.cxf.common.util.StringUtils;
+import org.apache.cxf.helpers.DOMUtils;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.blueprint.reflect.Metadata;
+
+public class EndpointDefinitionParser extends AbstractBeanDefinitionParser {
+
+ public Metadata parse(Element element, ParserContext context) {
+ MutableBeanMetadata endpointConfig = createBeanMetadata(element, context, CxfBlueprintEndpoint.class);
+
+ NamedNodeMap atts = element.getAttributes();
+
+ String bus = null;
+ String address = null;
+
+ for (int i = 0; i < atts.getLength(); i++) {
+ Attr node = (Attr) atts.item(i);
+ String val = node.getValue();
+ String pre = node.getPrefix();
+ String name = node.getLocalName();
+ if ("bus".equals(name)) {
+ bus = val;
+ } else if ("address".equals(name)) {
+ address = val;
+ } else if (isAttribute(pre, name)) {
+ if ("endpointName".equals(name) || "serviceName".equals(name)) {
+ if (isPlaceHolder(val)) {
+ endpointConfig.addProperty(name + "String", createValue(context, val));
+ } else {
+ QName q = parseQName(element, val);
+ endpointConfig.addProperty(name, createValue(context, q));
+ }
+ } else if ("depends-on".equals(name)) {
+ endpointConfig.addDependsOn(val);
+ } else if (!"name".equals(name)) {
+ endpointConfig.addProperty(name, createValue(context, val));
+ }
+ }
+ }
+
+ Element elem = DOMUtils.getFirstElement(element);
+ while (elem != null) {
+ String name = elem.getLocalName();
+ if ("properties".equals(name)) {
+ Metadata map = parseMapData(context, endpointConfig, elem);
+ endpointConfig.addProperty(name, map);
+ } else if ("binding".equals(name)) {
+ setFirstChildAsProperty(elem, context, endpointConfig, "bindingConfig");
+ } else if ("inInterceptors".equals(name) || "inFaultInterceptors".equals(name) || "outInterceptors".equals(name)
+ || "outFaultInterceptors".equals(name) || "features".equals(name) || "schemaLocations".equals(name) || "handlers".equals(name)) {
+ Metadata list = parseListData(context, endpointConfig, elem);
+ endpointConfig.addProperty(name, list);
+ } else {
+ setFirstChildAsProperty(elem, context, endpointConfig, name);
+ }
+
+ elem = DOMUtils.getNextElement(elem);
+ }
+ if (StringUtils.isEmpty(bus)) {
+ bus = "cxf";
+ }
+ //Will create a bus if needed...
+
+ endpointConfig.addProperty("bus", getBusRef(context, bus));
+ endpointConfig.setDestroyMethod("destroy");
+ endpointConfig.addArgument(createValue(context, address), String.class.getName(), 0);
+ endpointConfig.addArgument(createRef(context, "blueprintBundleContext"),
+ BundleContext.class.getName(), 1);
+
+ return endpointConfig;
+ }
+
+ private static boolean isPlaceHolder(String value) {
+ if (value != null && (value.startsWith("${") && value.endsWith("}")
+ || value.startsWith("{{") && value.endsWith("}}"))) {
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsClientBlueprintBean.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsClientBlueprintBean.java
new file mode 100644
index 0000000..5b00526
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsClientBlueprintBean.java
@@ -0,0 +1,95 @@
+/*
+ * 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.component.cxf.blueprint;
+
+import java.util.HashMap;
+
+import org.apache.camel.component.cxf.NullFaultListener;
+import org.apache.cxf.ext.logging.LoggingFeature;
+import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
+import org.apache.cxf.logging.FaultListener;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+
+public class RsClientBlueprintBean extends JAXRSClientFactoryBean implements BlueprintSupport, Cloneable {
+ private BlueprintContainer blueprintContainer;
+ private BundleContext bundleContext;
+ private int loggingSizeLimit;
+ private LoggingFeature loggingFeature;
+
+ @Override
+ public BlueprintContainer getBlueprintContainer() {
+ return blueprintContainer;
+ }
+
+ @Override
+ public void setBlueprintContainer(BlueprintContainer blueprintContainer) {
+ this.blueprintContainer = blueprintContainer;
+ }
+
+ @Override
+ public BundleContext getBundleContext() {
+ return bundleContext;
+ }
+
+ @Override
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+
+ public boolean isLoggingFeatureEnabled() {
+ return loggingFeature != null;
+ }
+
+ public void setLoggingFeatureEnabled(boolean loggingFeatureEnabled) {
+ if (loggingFeature != null) {
+ getFeatures().remove(loggingFeature);
+ loggingFeature = null;
+ }
+ if (loggingFeatureEnabled) {
+ loggingFeature = new LoggingFeature();
+ if (getLoggingSizeLimit() > 0) {
+ loggingFeature.setLimit(getLoggingSizeLimit());
+ }
+ getFeatures().add(loggingFeature);
+ }
+
+ }
+
+ public int getLoggingSizeLimit() {
+ return loggingSizeLimit;
+ }
+
+ public void setLoggingSizeLimit(int loggingSizeLimit) {
+ this.loggingSizeLimit = loggingSizeLimit;
+ if (loggingFeature != null) {
+ if (loggingSizeLimit > 0) {
+ loggingFeature.setLimit(loggingSizeLimit);
+ }
+ }
+ }
+
+ public void setSkipFaultLogging(boolean skipFaultLogging) {
+ if (skipFaultLogging) {
+ if (this.getProperties() == null) {
+ this.setProperties(new HashMap<String, Object>());
+ }
+ this.getProperties().put(FaultListener.class.getName(), new NullFaultListener());
+ }
+ }
+
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsClientDefinitionParser.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsClientDefinitionParser.java
new file mode 100644
index 0000000..52351bc
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsClientDefinitionParser.java
@@ -0,0 +1,93 @@
+/*
+ * 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.component.cxf.blueprint;
+
+import java.util.List;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
+import org.apache.aries.blueprint.mutable.MutablePassThroughMetadata;
+import org.apache.cxf.common.util.StringUtils;
+import org.apache.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser;
+import org.apache.cxf.helpers.DOMUtils;
+import org.apache.cxf.jaxrs.model.UserResource;
+import org.apache.cxf.jaxrs.utils.ResourceUtils;
+import org.osgi.service.blueprint.reflect.Metadata;
+
+public class RsClientDefinitionParser extends AbstractBeanDefinitionParser {
+
+ public Metadata parse(Element element, ParserContext context) {
+ MutableBeanMetadata beanMetadata = createBeanMetadata(element, context, RsClientBlueprintBean.class);
+ NamedNodeMap atts = element.getAttributes();
+
+ String bus = null;
+ for (int i = 0; i < atts.getLength(); i++) {
+ Attr node = (Attr) atts.item(i);
+ String val = node.getValue();
+ String pre = node.getPrefix();
+ String name = node.getLocalName();
+ if ("bus".equals(name)) {
+ bus = val;
+ } else if (isAttribute(pre, name)) {
+ if ("depends-on".equals(name)) {
+ beanMetadata.addDependsOn(val);
+ } else if (!"name".equals(name)) {
+ beanMetadata.addProperty(name, AbstractBPBeanDefinitionParser.createValue(context, val));
+ }
+ }
+ }
+
+ for (Element elem = DOMUtils.getFirstElement(element); elem != null; elem = DOMUtils.getNextElement(elem)) {
+ String name = elem.getLocalName();
+ if ("properties".equals(name) || "headers".equals(name)) {
+ Metadata map = parseMapData(context, beanMetadata, elem);
+ beanMetadata.addProperty(name, map);
+ } else if ("binding".equals(name)) {
+ setFirstChildAsProperty(elem, context, beanMetadata, "bindingConfig");
+ } else if ("inInterceptors".equals(name) || "inFaultInterceptors".equals(name) || "outInterceptors".equals(name)
+ || "outFaultInterceptors".equals(name) || "features".equals(name) || "schemaLocations".equals(name) || "handlers".equals(name)) {
+ Metadata list = parseListData(context, beanMetadata, elem);
+ beanMetadata.addProperty(name, list);
+ } else if ("features".equals(name) || "providers".equals(name)
+ || "schemaLocations".equals(name) || "modelBeans".equals(name)) {
+ Metadata list = parseListData(context, beanMetadata, elem);
+ beanMetadata.addProperty(name, list);
+ } else if ("model".equals(name)) {
+ List<UserResource> resources = ResourceUtils.getResourcesFromElement(elem);
+ MutablePassThroughMetadata value = context.createMetadata(MutablePassThroughMetadata.class);
+ value.setObject(resources);
+ beanMetadata.addProperty(name, value);
+ } else {
+ setFirstChildAsProperty(elem, context, beanMetadata, name);
+ }
+ }
+
+ if (StringUtils.isEmpty(bus)) {
+ bus = "cxf";
+ }
+ //Will create a bus if needed...
+
+ beanMetadata.addProperty("bus", getBusRef(context, bus));
+ return beanMetadata;
+ }
+
+
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsServerBlueprintBean.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsServerBlueprintBean.java
new file mode 100644
index 0000000..64fb07a
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsServerBlueprintBean.java
@@ -0,0 +1,101 @@
+/*
+ * 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.component.cxf.blueprint;
+
+import java.util.HashMap;
+
+import org.apache.camel.component.cxf.NullFaultListener;
+import org.apache.cxf.feature.LoggingFeature;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.logging.FaultListener;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+
+public class RsServerBlueprintBean extends JAXRSServerFactoryBean implements BlueprintSupport, Cloneable {
+
+ private BlueprintContainer blueprintContainer;
+ private BundleContext bundleContext;
+ private LoggingFeature loggingFeature;
+ private int loggingSizeLimit;
+
+ @Override
+ public BlueprintContainer getBlueprintContainer() {
+ return blueprintContainer;
+ }
+
+ @Override
+ public void setBlueprintContainer(BlueprintContainer blueprintContainer) {
+ this.blueprintContainer = blueprintContainer;
+ }
+
+ @Override
+ public BundleContext getBundleContext() {
+ return bundleContext;
+ }
+
+ @Override
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+
+ public boolean isLoggingFeatureEnabled() {
+ return loggingFeature != null;
+ }
+
+ public void setLoggingFeatureEnabled(boolean loggingFeatureEnabled) {
+ if (loggingFeature != null) {
+ getFeatures().remove(loggingFeature);
+ loggingFeature = null;
+ }
+ if (loggingFeatureEnabled) {
+ if (getLoggingSizeLimit() > 0) {
+ loggingFeature = new LoggingFeature(getLoggingSizeLimit());
+ } else {
+ loggingFeature = new LoggingFeature();
+ }
+ getFeatures().add(loggingFeature);
+ }
+
+ }
+
+ public int getLoggingSizeLimit() {
+ return loggingSizeLimit;
+ }
+
+ public void setLoggingSizeLimit(int loggingSizeLimit) {
+ this.loggingSizeLimit = loggingSizeLimit;
+ if (loggingFeature != null) {
+ getFeatures().remove(loggingFeature);
+ if (loggingSizeLimit > 0) {
+ loggingFeature = new LoggingFeature(loggingSizeLimit);
+ } else {
+ loggingFeature = new LoggingFeature();
+ }
+ getFeatures().add(loggingFeature);
+ }
+ }
+
+ public void setSkipFaultLogging(boolean skipFaultLogging) {
+ if (skipFaultLogging) {
+ if (this.getProperties() == null) {
+ this.setProperties(new HashMap<String, Object>());
+ }
+ this.getProperties().put(FaultListener.class.getName(), new NullFaultListener());
+ }
+ }
+
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsServerDefinitionParser.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsServerDefinitionParser.java
new file mode 100644
index 0000000..acbc086
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/blueprint/RsServerDefinitionParser.java
@@ -0,0 +1,95 @@
+/*
+ * 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.component.cxf.blueprint;
+
+import java.util.List;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
+import org.apache.aries.blueprint.mutable.MutablePassThroughMetadata;
+import org.apache.cxf.common.util.StringUtils;
+import org.apache.cxf.configuration.blueprint.AbstractBPBeanDefinitionParser;
+import org.apache.cxf.helpers.DOMUtils;
+import org.apache.cxf.jaxrs.model.UserResource;
+import org.apache.cxf.jaxrs.utils.ResourceUtils;
+import org.osgi.service.blueprint.reflect.Metadata;
+
+public class RsServerDefinitionParser extends AbstractBeanDefinitionParser {
+
+ public Metadata parse(Element element, ParserContext context) {
+ MutableBeanMetadata beanMetadata = createBeanMetadata(element, context, RsServerBlueprintBean.class);
+ NamedNodeMap atts = element.getAttributes();
+
+ String bus = null;
+ for (int i = 0; i < atts.getLength(); i++) {
+ Attr node = (Attr) atts.item(i);
+ String val = node.getValue();
+ String pre = node.getPrefix();
+ String name = node.getLocalName();
+ if ("bus".equals(name)) {
+ bus = val;
+ } else if (isAttribute(pre, name)) {
+ if ("depends-on".equals(name)) {
+ beanMetadata.addDependsOn(val);
+ } else if (!"name".equals(name)) {
+ beanMetadata.addProperty(name, AbstractBPBeanDefinitionParser.createValue(context, val));
+ }
+ }
+ }
+
+ for (Element elem = DOMUtils.getFirstElement(element); elem != null; elem = DOMUtils.getNextElement(elem)) {
+ String name = elem.getLocalName();
+ if ("properties".equals(name)
+ || "extensionMappings".equals(name)
+ || "languageMappings".equals(name)) {
+ Metadata map = parseMapData(context, beanMetadata, elem);
+ beanMetadata.addProperty(name, map);
+ } else if ("binding".equals(name)) {
+ setFirstChildAsProperty(elem, context, beanMetadata, "bindingConfig");
+ } else if ("inInterceptors".equals(name) || "inFaultInterceptors".equals(name) || "outInterceptors".equals(name)
+ || "outFaultInterceptors".equals(name) || "features".equals(name) || "schemaLocations".equals(name) || "handlers".equals(name)) {
+ Metadata list = parseListData(context, beanMetadata, elem);
+ beanMetadata.addProperty(name, list);
+ } else if ("features".equals(name) || "providers".equals(name)
+ || "schemaLocations".equals(name) || "modelBeans".equals(name)
+ || "serviceBeans".equals(name)) {
+ Metadata list = parseListData(context, beanMetadata, elem);
+ beanMetadata.addProperty(name, list);
+ } else if ("model".equals(name)) {
+ List<UserResource> resources = ResourceUtils.getResourcesFromElement(elem);
+ MutablePassThroughMetadata value = context.createMetadata(MutablePassThroughMetadata.class);
+ value.setObject(resources);
+ beanMetadata.addProperty(name, value);
+ } else {
+ setFirstChildAsProperty(elem, context, beanMetadata, name);
+ }
+ }
+
+ if (StringUtils.isEmpty(bus)) {
+ bus = "cxf";
+ }
+ //Will create a bus if needed...
+
+ beanMetadata.addProperty("bus", getBusRef(context, bus));
+ return beanMetadata;
+ }
+
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/jaxrs/blueprint/CxfRsBlueprintEndpoint.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/jaxrs/blueprint/CxfRsBlueprintEndpoint.java
new file mode 100644
index 0000000..3ad2478
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/jaxrs/blueprint/CxfRsBlueprintEndpoint.java
@@ -0,0 +1,95 @@
+/*
+ * 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.component.cxf.jaxrs.blueprint;
+
+import org.apache.camel.Component;
+import org.apache.camel.blueprint.BlueprintCamelContext;
+import org.apache.camel.component.cxf.blueprint.BlueprintSupport;
+import org.apache.camel.component.cxf.blueprint.RsClientBlueprintBean;
+import org.apache.camel.component.cxf.blueprint.RsServerBlueprintBean;
+import org.apache.camel.component.cxf.jaxrs.CxfRsEndpoint;
+import org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.springframework.util.ReflectionUtils;
+
+public class CxfRsBlueprintEndpoint extends CxfRsEndpoint {
+ private AbstractJAXRSFactoryBean bean;
+ private BlueprintContainer blueprintContainer;
+ private BundleContext bundleContext;
+ private BlueprintCamelContext blueprintCamelContext;
+
+ public CxfRsBlueprintEndpoint(Component comp, String uri, AbstractJAXRSFactoryBean bean) {
+ super(uri, comp);
+ this.bean = bean;
+ setAddress(bean.getAddress());
+ // update the sfb address by resolving the properties
+ bean.setAddress(getAddress());
+ BlueprintSupport support = (BlueprintSupport)bean;
+ setBlueprintContainer(support.getBlueprintContainer());
+ setBundleContext(support.getBundleContext());
+ }
+
+ public BlueprintContainer getBlueprintContainer() {
+ return blueprintContainer;
+ }
+
+ public void setBlueprintContainer(BlueprintContainer blueprintContainer) {
+ this.blueprintContainer = blueprintContainer;
+ }
+
+ public BundleContext getBundleContext() {
+ return bundleContext;
+ }
+
+ public void setBundleContext(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ }
+
+ public BlueprintCamelContext getBlueprintCamelContext() {
+ return blueprintCamelContext;
+ }
+
+ public void setBlueprintCamelContext(BlueprintCamelContext blueprintCamelContext) {
+ this.blueprintCamelContext = blueprintCamelContext;
+ }
+
+ @Override
+ protected JAXRSServerFactoryBean newJAXRSServerFactoryBean() {
+ checkBeanType(bean, JAXRSServerFactoryBean.class);
+ return (RsServerBlueprintBean)bean;
+ }
+
+ @Override
+ protected JAXRSClientFactoryBean newJAXRSClientFactoryBean() {
+ checkBeanType(bean, JAXRSClientFactoryBean.class);
+ return newInstanceWithCommonProperties();
+ }
+
+ private RsClientBlueprintBean newInstanceWithCommonProperties() {
+ RsClientBlueprintBean cfb = new RsClientBlueprintBean();
+
+ if (bean instanceof RsClientBlueprintBean) {
+ ReflectionUtils.shallowCopyFieldState(bean, cfb);
+ }
+
+ return cfb;
+ }
+
+}
diff --git a/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/jaxrs/blueprint/CxfRsBlueprintEndpointFactoryBean.java b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/jaxrs/blueprint/CxfRsBlueprintEndpointFactoryBean.java
new file mode 100644
index 0000000..d29cdd8
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/java/org/apache/camel/component/cxf/jaxrs/blueprint/CxfRsBlueprintEndpointFactoryBean.java
@@ -0,0 +1,30 @@
+/*
+ * 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.component.cxf.jaxrs.blueprint;
+
+import org.apache.camel.Component;
+import org.apache.camel.component.cxf.jaxrs.CxfRsEndpoint;
+import org.apache.camel.component.cxf.jaxrs.CxfRsEndpointFactoryBean;
+import org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean;
+
+public class CxfRsBlueprintEndpointFactoryBean implements CxfRsEndpointFactoryBean {
+
+ @Override
+ public CxfRsEndpoint createEndpoint(Component component, String uri, AbstractJAXRSFactoryBean bean) throws Exception {
+ return new CxfRsBlueprintEndpoint(component, uri, bean);
+ }
+}
diff --git a/components/camel-cxf-blueprint/src/main/resources/OSGI-INF/blueprint/camel-cxf.xml b/components/camel-cxf-blueprint/src/main/resources/OSGI-INF/blueprint/camel-cxf.xml
new file mode 100644
index 0000000..ab14595
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/resources/OSGI-INF/blueprint/camel-cxf.xml
@@ -0,0 +1,31 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
+ xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
+
+ <service interface="org.apache.aries.blueprint.NamespaceHandler">
+ <service-properties>
+ <entry key="osgi.service.blueprint.namespace" value="http://camel.apache.org/schema/blueprint/cxf"/>
+ </service-properties>
+ <bean class="org.apache.camel.component.cxf.blueprint.CxfNamespaceHandler"/>
+ </service>
+</blueprint>
diff --git a/components/camel-cxf-blueprint/src/main/resources/schema/blueprint/camel-cxf.xsd b/components/camel-cxf-blueprint/src/main/resources/schema/blueprint/camel-cxf.xsd
new file mode 100644
index 0000000..fe9d99b
--- /dev/null
+++ b/components/camel-cxf-blueprint/src/main/resources/schema/blueprint/camel-cxf.xsd
@@ -0,0 +1,179 @@
+<?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.
+
+-->
+<xsd:schema xmlns="http://camel.apache.org/schema/blueprint/cxf"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:beans="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:cxf-beans="http://cxf.apache.org/configuration/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ targetNamespace="http://camel.apache.org/schema/blueprint/cxf"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
+
+ <xsd:import namespace="http://www.osgi.org/xmlns/blueprint/v1.0.0" schemaLocation="https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"/>
+ <xsd:import namespace="http://cxf.apache.org/configuration/beans" schemaLocation="http://cxf.apache.org/schemas/configuration/cxf-beans.xsd"/>
+
+ <xsd:element name="cxfEndpoint">
+ <xsd:complexType>
+ <xsd:complexContent>
+ <xsd:extension base="beans:Tcomponent">
+ <xsd:all>
+ <xsd:element name="binding" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="dataBinding" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="features" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="inInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="inFaultInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="outInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="outFaultInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="handlers" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="properties" type="beans:Tmap" minOccurs="0"/>
+ <xsd:element name="schemaLocations" type="schemasType" minOccurs="0"/>
+ <xsd:element name="serviceBean" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="serviceFactory" type="xsd:anyType" minOccurs="0"/>
+ </xsd:all>
+ <!-- xsd:attributeGroup ref="cxf-beans:beanAttributes"/-->
+ <xsd:attribute name="address" type="xsd:string"/>
+ <xsd:attribute name="bindingId" type="xsd:string"/>
+ <xsd:attribute name="bus" type="xsd:string"/>
+ <xsd:attribute name="serviceClass" type="xsd:string"/>
+ <xsd:attribute name="transportId" type="xsd:string"/>
+ <xsd:attribute name="wsdlURL" type="xsd:string"/>
+ <xsd:attribute name="endpointName" type="xsd:QName"/>
+ <xsd:attribute name="serviceName" type="xsd:QName"/>
+ <xsd:attribute name="loggingFeatureEnabled" type="xsd:boolean"/>
+ <xsd:attribute name="loggingSizeLimit" type="xsd:integer" />
+ <xsd:attribute name="continuationTimeout" type="xsd:long" />
+ <xsd:attribute name="publishedEndpointUrl" type="xsd:string" />
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="rsServer">
+ <xsd:complexType>
+ <xsd:complexContent>
+ <xsd:extension base="beans:Tcomponent">
+ <xsd:all>
+ <xsd:element name="executor" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="features" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="binding" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="inInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="inFaultInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="invoker" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="outInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="outFaultInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="properties" type="beans:Tmap" minOccurs="0"/>
+ <xsd:element name="serviceBeans" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="modelBeans" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="model" type="model" minOccurs="0"/>
+ <xsd:element name="providers" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="extensionMappings" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="languageMappings" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="schemaLocations" type="schemasType" minOccurs="0"/>
+ </xsd:all>
+ <!-- xsd:attributeGroup ref="cxf-beans:beanAttributes"/-->
+ <xsd:attribute name="address" type="xsd:string"/>
+ <xsd:attribute name="bus" type="xsd:string"/>
+ <xsd:attribute name="serviceClass" type="xsd:string"/>
+ <xsd:attribute name="transportId" type="xsd:string"/>
+ <xsd:attribute name="modelRef" type="xsd:string"/>
+ <xsd:attribute name="bindingId" type="xsd:string"/>
+ <xsd:attribute name="staticSubresourceResolution" type="xsd:boolean"/>
+ <xsd:attribute name="loggingFeatureEnabled" type="xsd:boolean"/>
+ <xsd:attribute name="loggingSizeLimit" type="xsd:integer" />
+ <xsd:attribute name="publishedEndpointUrl" type="xsd:string" />
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="rsClient">
+ <xsd:complexType>
+ <xsd:complexContent>
+ <xsd:extension base="beans:Tcomponent">
+ <xsd:all>
+ <xsd:element name="executor" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="features" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="binding" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="inInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="inFaultInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="outInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="outFaultInterceptors" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="properties" type="beans:Tmap" minOccurs="0"/>
+ <xsd:element name="providers" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="modelBeans" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="model" type="model" minOccurs="0"/>
+ <xsd:element name="headers" type="xsd:anyType" minOccurs="0"/>
+ <xsd:element name="schemaLocations" type="schemasType" minOccurs="0"/>
+ </xsd:all>
+ <!-- xsd:attributeGroup ref="cxf-beans:beanAttributes"/-->
+ <xsd:attribute name="address" type="xsd:string"/>
+ <xsd:attribute name="serviceClass" type="xsd:string"/>
+ <xsd:attribute name="inheritHeaders" type="xsd:boolean"/>
+ <xsd:attribute name="bus" type="xsd:string"/>
+ <xsd:attribute name="transportId" type="xsd:string"/>
+ <xsd:attribute name="bindingId" type="xsd:string"/>
+ <xsd:attribute name="modelRef" type="xsd:string"/>
+ <xsd:attribute name="username" type="xsd:string"/>
+ <xsd:attribute name="password" type="xsd:string"/>
+ <xsd:attribute name="loggingFeatureEnabled" type="xsd:boolean"/>
+ <xsd:attribute name="loggingSizeLimit" type="xsd:integer" />
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="schemasType">
+ <xsd:sequence>
+ <xsd:element name="schemaLocation" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="model">
+ <xsd:sequence>
+ <xsd:element name="resource" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="operation" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="param" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="type" type="xsd:string"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="path" type="xsd:string"/>
+ <xsd:attribute name="verb" type="xsd:string"/>
+ <xsd:attribute name="consumes" type="xsd:string"/>
+ <xsd:attribute name="produces" type="xsd:string"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="path" type="xsd:string"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="id" type="xsd:string"/>
+ </xsd:complexType>
+</xsd:schema>
diff --git a/components/pom.xml b/components/pom.xml
index db54e3e..fd4477e 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -33,6 +33,7 @@
<modules>
<module>camel-blueprint</module>
+ <module>camel-cxf-blueprint</module>
<module>camel-kura</module>
<module>camel-paxlogging</module>
<module>camel-test-blueprint</module>
diff --git a/platforms/karaf/features/src/main/resources/features.xml b/platforms/karaf/features/src/main/resources/features.xml
index 227f0f3..dbaa535 100644
--- a/platforms/karaf/features/src/main/resources/features.xml
+++ b/platforms/karaf/features/src/main/resources/features.xml
@@ -798,6 +798,7 @@
<feature version='${cxf-version-range}'>cxf-features-logging</feature>
<bundle>mvn:org.apache.camel/camel-attachments/${project.version}</bundle>
<bundle>mvn:org.apache.camel/camel-http-base/${project.version}</bundle>
+ <bundle>mvn:org.apache.camel.karaf/camel-cxf-blueprint/${project.version}</bundle>
<bundle>mvn:org.apache.camel/camel-cxf-transport/${project.version}</bundle>
<bundle>mvn:org.apache.camel/camel-cxf/${project.version}</bundle>
</feature>