You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2019/09/05 15:39:38 UTC
[camel-quarkus] 03/04: Make xml and jaxb disabled by default and
opt-in when depending on camel
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 00cd326bd076a68b2be64d4bee92d4bd87335850
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu Sep 5 17:27:11 2019 +0200
Make xml and jaxb disabled by default and opt-in when depending on camel
---
.../quarkus/core/deployment/BuildProcessor.java | 4 +
.../quarkus/core/deployment/XmlProcessor.java | 48 -----
.../camel/quarkus/core/runtime/CamelConfig.java | 22 ---
..._org_apache_camel_reifier_ValidateReifier.java} | 29 ++--
.../core/runtime/support/FastCamelContext.java | 26 ++-
.../core/runtime/support/FastCamelRuntime.java | 12 --
.../quarkus/core/runtime/support/FastModel.java | 6 +
.../camel/reifier/rest/RestBindingReifier.java | 193 +++++++++++++++++++++
.../validation/PredicateValidatingProcessor.java | 81 +++++++++
.../validation/PredicateValidationException.java | 50 ++++++
.../xml/deployment/ModelFactoryProcessor.java} | 35 ++--
.../component/xml/deployment/XmlProcessor.java | 23 ++-
extensions/xml-common/runtime/pom.xml | 5 +
.../component/xml/runtime/SupportRecorder.java} | 27 +--
...mel_quarkus_core_runtime_support_FastModel.java | 45 +++++
...ache_camel_reifier_rest_RestBindingReifier.java | 68 ++++++++
.../aws/src/main/resources/application.properties | 2 -
.../bean/src/main/resources/application.properties | 2 -
.../src/main/resources/application.properties | 2 -
.../src/main/resources/application.properties | 2 -
.../test/src/main/resources/application.properties | 2 -
.../jdbc/src/main/resources/application.properties | 2 -
.../src/main/resources/application.properties | 2 -
.../src/main/resources/application.properties | 2 -
.../src/main/resources/application.properties | 2 -
.../src/main/resources/application.properties | 2 -
poms/bom/pom.xml | 6 +
27 files changed, 538 insertions(+), 162 deletions(-)
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
index b0c3bed..305cd66 100644
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
@@ -41,6 +41,10 @@ import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
+import io.quarkus.deployment.builditem.substrate.ServiceProviderBuildItem;
+import io.quarkus.deployment.builditem.substrate.SubstrateSystemPropertyBuildItem;
+import io.quarkus.jaxb.deployment.JaxbEnabledBuildItem;
+import io.quarkus.jaxb.deployment.JaxbFileRootBuildItem;
import io.quarkus.runtime.RuntimeValue;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.AdviceWithRouteBuilder;
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/XmlProcessor.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/XmlProcessor.java
deleted file mode 100644
index df6dd15..0000000
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/XmlProcessor.java
+++ /dev/null
@@ -1,48 +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
- *
- * 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.quarkus.core.deployment;
-
-import io.quarkus.deployment.annotations.BuildProducer;
-import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.builditem.substrate.ReflectiveClassBuildItem;
-import io.quarkus.jaxb.deployment.JaxbEnabledBuildItem;
-import io.quarkus.jaxb.deployment.JaxbFileRootBuildItem;
-import org.apache.camel.quarkus.core.runtime.support.Flags;
-
-class XmlProcessor {
- @BuildStep
- JaxbFileRootBuildItem fileRoot() {
- return new JaxbFileRootBuildItem(CamelSupport.CAMEL_ROOT_PACKAGE_DIRECTORY);
- }
-
- @BuildStep(onlyIfNot = Flags.JaxbDisabled.class)
- JaxbEnabledBuildItem handleJaxbSupport() {
- return new JaxbEnabledBuildItem();
- }
-
- @BuildStep(onlyIfNot = Flags.JaxbDisabled.class)
- void registerReflectiveClasses(BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
- reflectiveClass.produce(
- new ReflectiveClassBuildItem(
- false,
- false,
- "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl",
- "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl",
- "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl")
- );
- }
-}
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/CamelConfig.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/CamelConfig.java
index a5bb9b4..3d4d65c 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/CamelConfig.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/CamelConfig.java
@@ -21,7 +21,6 @@ import java.util.List;
import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;
-import org.apache.camel.quarkus.core.runtime.support.Flags;
public class CamelConfig {
@@ -34,27 +33,6 @@ public class CamelConfig {
@ConfigItem
public List<String> routesUris;
- /**
- * Camel jaxb support is enabled by default, but in order to trim
- * down the size of applications, it is possible to disable jaxb support
- * at runtime. This is useful when routes at loaded at build time and
- * thus the camel route model is not used at runtime anymore.
- *
- * @see Flags.JaxbDisabled
- */
- @ConfigItem(defaultValue = "false")
- public boolean disableJaxb;
-
- /**
- * Disable XML support in various parts of Camel.
- * Because xml parsing using xerces/xalan libraries can consume
- * a lot of code space in the native binary (and a lot of cpu resources
- * when building), this allows to disable both libraries.
- *
- * @see Flags.XmlDisabled
- */
- @ConfigItem(defaultValue = "false")
- public boolean disableXml;
}
@ConfigRoot(name = "camel", phase = ConfigPhase.RUN_TIME)
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/Flags.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/graal/Target_org_apache_camel_reifier_ValidateReifier.java
similarity index 51%
copy from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/Flags.java
copy to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/graal/Target_org_apache_camel_reifier_ValidateReifier.java
index 69247e2..b52923b 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/Flags.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/graal/Target_org_apache_camel_reifier_ValidateReifier.java
@@ -14,28 +14,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.quarkus.core.runtime.support;
+package org.apache.camel.quarkus.core.runtime.graal;
-import java.util.function.BooleanSupplier;
+import com.oracle.svm.core.annotate.Substitute;
+import com.oracle.svm.core.annotate.TargetClass;
+import org.apache.camel.spi.RouteContext;
+import org.apache.camel.support.processor.validation.PredicateValidatingProcessor;
-import org.eclipse.microprofile.config.ConfigProvider;
+@TargetClass(className = "org.apache.camel.reifier.ValidateReifier")
+final class Target_org_apache_camel_reifier_ValidateReifier {
-public final class Flags {
- private Flags() {
- }
-
- public static final class JaxbDisabled implements BooleanSupplier {
- @Override
- public boolean getAsBoolean() {
- return ConfigProvider.getConfig().getOptionalValue("quarkus.camel.disable-jaxb", Boolean.class).orElse(Boolean.FALSE);
- }
- }
-
- public static final class XmlDisabled implements BooleanSupplier {
- @Override
- public boolean getAsBoolean() {
- return ConfigProvider.getConfig().getOptionalValue("quarkus.camel.disable-xml", Boolean.class).orElse(Boolean.FALSE);
- }
+ @Substitute
+ public PredicateValidatingProcessor createProcessor(RouteContext routeContext) throws Exception {
+ throw new UnsupportedOperationException();
}
}
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastCamelContext.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastCamelContext.java
index 8bc1476..6659792 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastCamelContext.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastCamelContext.java
@@ -19,8 +19,12 @@ package org.apache.camel.quarkus.core.runtime.support;
import java.util.Collection;
import java.util.Map;
import java.util.Properties;
+import java.util.Set;
import java.util.concurrent.ExecutorService;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+
import org.apache.camel.AsyncProcessor;
import org.apache.camel.CamelContext;
import org.apache.camel.CamelContextAware;
@@ -29,6 +33,7 @@ import org.apache.camel.Endpoint;
import org.apache.camel.PollingConsumer;
import org.apache.camel.Processor;
import org.apache.camel.Producer;
+import org.apache.camel.RuntimeCamelException;
import org.apache.camel.TypeConverter;
import org.apache.camel.impl.DefaultExecutorServiceManager;
import org.apache.camel.impl.DefaultModelJAXBContextFactory;
@@ -103,6 +108,7 @@ import org.apache.camel.spi.UnitOfWorkFactory;
import org.apache.camel.spi.UuidGenerator;
import org.apache.camel.spi.ValidatorRegistry;
import org.apache.camel.support.PropertyBindingSupport;
+import org.graalvm.nativeimage.ImageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -212,7 +218,25 @@ public class FastCamelContext extends AbstractCamelContext {
@Override
protected ModelJAXBContextFactory createModelJAXBContextFactory() {
- return new DefaultModelJAXBContextFactory();
+ Set<ModelJAXBContextFactory> cfs = getRegistry().findByType(ModelJAXBContextFactory.class);
+ if (cfs.size() == 1) {
+ ModelJAXBContextFactory cf = cfs.iterator().next();
+ // The creation of the JAXB context is very time consuming, so always prepare it
+ // when running in native mode, but lazy create it in java mode so that we don't
+ // waste time if using java routes
+ if (ImageInfo.inImageBuildtimeCode()) {
+ try {
+ cf.newJAXBContext();
+ } catch (JAXBException e) {
+ throw RuntimeCamelException.wrapRuntimeCamelException(e);
+ }
+ }
+ return cf;
+ } else {
+ return () -> {
+ throw new UnsupportedOperationException();
+ };
+ }
}
@Override
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastCamelRuntime.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastCamelRuntime.java
index 0858de4..c5655b0 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastCamelRuntime.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastCamelRuntime.java
@@ -84,18 +84,6 @@ public class FastCamelRuntime implements CamelRuntime {
context.getTypeConverterRegistry().setInjector(context.getInjector());
fireEvent(InitializingEvent.class, new InitializingEvent());
- if (buildTimeConfig.disableJaxb) {
- context.adapt(ExtendedCamelContext.class).setModelJAXBContextFactory(() -> {
- throw new UnsupportedOperationException();
- });
- } else {
- // The creation of the JAXB context is very time consuming, so always prepare it
- // when running in native mode, but lazy create it in java mode so that we don't
- // waste time if using java routes
- if (ImageInfo.inImageBuildtimeCode()) {
- context.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory().newJAXBContext();
- }
- }
context.init();
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastModel.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastModel.java
index ae03794..1270c37 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastModel.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/FastModel.java
@@ -16,6 +16,7 @@
*/
package org.apache.camel.quarkus.core.runtime.support;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
@@ -46,6 +47,11 @@ public class FastModel extends DefaultModel {
super(camelContext);
}
+ @Override
+ public void addRouteDefinitions(InputStream is) throws Exception {
+ throw new UnsupportedOperationException();
+ }
+
protected void start(RouteDefinition routeDefinition) throws Exception {
// indicate we are staring the route using this thread so
// we are able to query this if needed
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java b/extensions/core/runtime/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
new file mode 100644
index 0000000..e88320e
--- /dev/null
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/reifier/rest/RestBindingReifier.java
@@ -0,0 +1,193 @@
+/*
+ * 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.reifier.rest;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.model.rest.RestBindingDefinition;
+import org.apache.camel.processor.RestBindingAdvice;
+import org.apache.camel.spi.DataFormat;
+import org.apache.camel.spi.RestConfiguration;
+import org.apache.camel.spi.RouteContext;
+import org.apache.camel.support.PropertyBindingSupport;
+
+public class RestBindingReifier {
+
+ private final RestBindingDefinition definition;
+
+ public RestBindingReifier(RestBindingDefinition definition) {
+ this.definition = definition;
+ }
+
+ public RestBindingAdvice createRestBindingAdvice(RouteContext routeContext) throws Exception {
+
+ CamelContext context = routeContext.getCamelContext();
+ RestConfiguration config = context.getRestConfiguration(definition.getComponent(), true);
+
+ // these options can be overridden per rest verb
+ String mode = config.getBindingMode().name();
+ if (definition.getBindingMode() != null) {
+ mode = definition.getBindingMode().name();
+ }
+ boolean cors = config.isEnableCORS();
+ if (definition.getEnableCORS() != null) {
+ cors = definition.getEnableCORS();
+ }
+ boolean skip = config.isSkipBindingOnErrorCode();
+ if (definition.getSkipBindingOnErrorCode() != null) {
+ skip = definition.getSkipBindingOnErrorCode();
+ }
+ boolean validation = config.isClientRequestValidation();
+ if (definition.getClientRequestValidation() != null) {
+ validation = definition.getClientRequestValidation();
+ }
+
+ // cors headers
+ Map<String, String> corsHeaders = config.getCorsHeaders();
+
+ if (mode == null || "off".equals(mode)) {
+ // binding mode is off, so create a off mode binding processor
+ return new RestBindingAdvice(context, null, null, null, null, definition.getConsumes(), definition.getProduces(), mode, skip, validation, cors, corsHeaders,
+ definition.getDefaultValues(), definition.getRequiredBody() != null ? definition.getRequiredBody() : false,
+ definition.getRequiredQueryParameters(), definition.getRequiredHeaders());
+ }
+
+ // setup json data format
+ DataFormat json = null;
+ DataFormat outJson = null;
+ if (mode.contains("json") || "auto".equals(mode)) {
+ String name = config.getJsonDataFormat();
+ if (name != null) {
+ // must only be a name, not refer to an existing instance
+ Object instance = context.getRegistry().lookupByName(name);
+ if (instance != null) {
+ throw new IllegalArgumentException("JsonDataFormat name: " + name + " must not be an existing bean instance from the registry");
+ }
+ } else {
+ name = "json-jackson";
+ }
+ // this will create a new instance as the name was not already
+ // pre-created
+ json = context.resolveDataFormat(name);
+ outJson = context.resolveDataFormat(name);
+
+ if (json != null) {
+ setupJson(context, config, definition.getType(), definition.getOutType(), json, outJson);
+ }
+ }
+
+ // setup xml data format
+ DataFormat jaxb = null;
+ DataFormat outJaxb = null;
+ if (mode.contains("xml") || "auto".equals(mode)) {
+ String name = config.getXmlDataFormat();
+ if (name != null) {
+ // must only be a name, not refer to an existing instance
+ Object instance = context.getRegistry().lookupByName(name);
+ if (instance != null) {
+ throw new IllegalArgumentException("XmlDataFormat name: " + name + " must not be an existing bean instance from the registry");
+ }
+ } else {
+ name = "jaxb";
+ }
+ // this will create a new instance as the name was not already
+ // pre-created
+ jaxb = context.resolveDataFormat(name);
+ outJaxb = context.resolveDataFormat(name);
+
+ // is xml binding required?
+ if (mode.contains("xml") && jaxb == null) {
+ throw new IllegalArgumentException("XML DataFormat " + name + " not found.");
+ }
+
+ if (jaxb != null) {
+ setupJaxb(context, config, definition.getType(), definition.getOutType(), jaxb, outJaxb);
+ }
+ }
+
+ return new RestBindingAdvice(context, json, jaxb, outJson, outJaxb, definition.getConsumes(), definition.getProduces(), mode, skip, validation, cors, corsHeaders,
+ definition.getDefaultValues(), definition.getRequiredBody() != null ? definition.getRequiredBody() : false,
+ definition.getRequiredQueryParameters(), definition.getRequiredHeaders());
+ }
+
+ protected void setupJson(CamelContext context, RestConfiguration config, String type, String outType, DataFormat json, DataFormat outJson) throws Exception {
+ Class<?> clazz = null;
+ if (type != null) {
+ String typeName = type.endsWith("[]") ? type.substring(0, type.length() - 2) : type;
+ clazz = context.getClassResolver().resolveMandatoryClass(typeName);
+ }
+ if (clazz != null) {
+ context.adapt(ExtendedCamelContext.class).getBeanIntrospection().setProperty(context, json, "unmarshalType", clazz);
+ context.adapt(ExtendedCamelContext.class).getBeanIntrospection().setProperty(context, json, "useList", type.endsWith("[]"));
+ }
+ setAdditionalConfiguration(config, context, json, "json.in.");
+
+ Class<?> outClazz = null;
+ if (outType != null) {
+ String typeName = outType.endsWith("[]") ? outType.substring(0, outType.length() - 2) : outType;
+ outClazz = context.getClassResolver().resolveMandatoryClass(typeName);
+ }
+ if (outClazz != null) {
+ context.adapt(ExtendedCamelContext.class).getBeanIntrospection().setProperty(context, outJson, "unmarshalType", outClazz);
+ context.adapt(ExtendedCamelContext.class).getBeanIntrospection().setProperty(context, outJson, "useList", outType.endsWith("[]"));
+ }
+ setAdditionalConfiguration(config, context, outJson, "json.out.");
+ }
+
+ protected void setupJaxb(CamelContext context, RestConfiguration config, String type, String outType, DataFormat jaxb, DataFormat outJaxb) throws Exception {
+ throw new UnsupportedOperationException("Add a dependency to camel-quarkus-xml-common to add xml support");
+ }
+
+ private void setAdditionalConfiguration(RestConfiguration config, CamelContext context, DataFormat dataFormat, String prefix) throws Exception {
+ if (config.getDataFormatProperties() != null && !config.getDataFormatProperties().isEmpty()) {
+ // must use a copy as otherwise the options gets removed during
+ // introspection setProperties
+ Map<String, Object> copy = new HashMap<>();
+
+ // filter keys on prefix
+ // - either its a known prefix and must match the prefix parameter
+ // - or its a common configuration that we should always use
+ for (Map.Entry<String, Object> entry : config.getDataFormatProperties().entrySet()) {
+ String key = entry.getKey();
+ String copyKey;
+ boolean known = isKeyKnownPrefix(key);
+ if (known) {
+ // remove the prefix from the key to use
+ copyKey = key.substring(prefix.length());
+ } else {
+ // use the key as is
+ copyKey = key;
+ }
+ if (!known || key.startsWith(prefix)) {
+ copy.put(copyKey, entry.getValue());
+ }
+ }
+
+ PropertyBindingSupport.build().bind(context, dataFormat, copy);
+ }
+ }
+
+ private boolean isKeyKnownPrefix(String key) {
+ return key.startsWith("json.in.") || key.startsWith("json.out.") || key.startsWith("xml.in.") || key.startsWith("xml.out.");
+ }
+
+}
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/support/processor/validation/PredicateValidatingProcessor.java b/extensions/core/runtime/src/main/java/org/apache/camel/support/processor/validation/PredicateValidatingProcessor.java
new file mode 100644
index 0000000..72870fb
--- /dev/null
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/support/processor/validation/PredicateValidatingProcessor.java
@@ -0,0 +1,81 @@
+/*
+ * 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.support.processor.validation;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.Processor;
+import org.apache.camel.Traceable;
+import org.apache.camel.support.service.ServiceSupport;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A processor which validates the content of the inbound message body against a {@link Predicate}.
+ *
+ * TODO: QUARKUS: this class is a copy of the original camel one because it resides in camel-jaxp
+ * but that should not be the case
+ */
+public class PredicateValidatingProcessor extends ServiceSupport implements Processor, Traceable {
+
+ private static final Logger LOG = LoggerFactory.getLogger(org.apache.camel.support.processor.validation.PredicateValidatingProcessor.class);
+
+ private final Predicate predicate;
+
+ public PredicateValidatingProcessor(Predicate predicate) {
+ ObjectHelper.notNull(predicate, "predicate", this);
+ this.predicate = predicate;
+ }
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ boolean matches = predicate.matches(exchange);
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Validation {} for {} with Predicate[{}]", matches ? "succeed" : "failed", exchange, predicate);
+ }
+
+ if (!matches) {
+ throw new PredicateValidationException(exchange, predicate);
+ }
+ }
+
+ public Predicate getPredicate() {
+ return predicate;
+ }
+
+ @Override
+ public String toString() {
+ return "validate(" + predicate + ")";
+ }
+
+ @Override
+ public String getTraceLabel() {
+ return "validate[" + predicate + "]";
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ // noop
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ // noop
+ }
+}
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/support/processor/validation/PredicateValidationException.java b/extensions/core/runtime/src/main/java/org/apache/camel/support/processor/validation/PredicateValidationException.java
new file mode 100644
index 0000000..327770d
--- /dev/null
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/support/processor/validation/PredicateValidationException.java
@@ -0,0 +1,50 @@
+/*
+ * 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.support.processor.validation;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.ValidationException;
+
+/**
+ * A predicate validation exception occurred
+ *
+ * TODO: QUARKUS: this class is a copy of the original camel one because it resides in camel-jaxp
+ * but that should not be the case
+ */
+public class PredicateValidationException extends ValidationException {
+
+ private static final long serialVersionUID = 5767438583860347105L;
+
+ private final Predicate predicate;
+
+ public PredicateValidationException(Exchange exchange, Predicate predicate) {
+ super(exchange, buildMessage(predicate, exchange));
+ this.predicate = predicate;
+ }
+
+ protected static String buildMessage(Predicate predicate, Exchange exchange) {
+ StringBuilder builder = new StringBuilder("Validation failed for Predicate[");
+ builder.append(predicate.toString());
+ builder.append("]");
+ return builder.toString();
+ }
+
+ public Predicate getPredicate() {
+ return predicate;
+ }
+}
\ No newline at end of file
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/Flags.java b/extensions/xml-common/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/ModelFactoryProcessor.java
similarity index 51%
copy from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/Flags.java
copy to extensions/xml-common/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/ModelFactoryProcessor.java
index 69247e2..8153675 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/Flags.java
+++ b/extensions/xml-common/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/ModelFactoryProcessor.java
@@ -14,28 +14,25 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.quarkus.core.runtime.support;
+package org.apache.camel.quarkus.component.xml.deployment;
-import java.util.function.BooleanSupplier;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import org.apache.camel.quarkus.component.xml.runtime.SupportRecorder;
+import org.apache.camel.quarkus.core.deployment.CamelRegistryBuildItem;
+import org.apache.camel.spi.ModelJAXBContextFactory;
-import org.eclipse.microprofile.config.ConfigProvider;
+public class ModelFactoryProcessor {
-public final class Flags {
- private Flags() {
- }
-
- public static final class JaxbDisabled implements BooleanSupplier {
- @Override
- public boolean getAsBoolean() {
- return ConfigProvider.getConfig().getOptionalValue("quarkus.camel.disable-jaxb", Boolean.class).orElse(Boolean.FALSE);
- }
- }
-
- public static final class XmlDisabled implements BooleanSupplier {
- @Override
- public boolean getAsBoolean() {
- return ConfigProvider.getConfig().getOptionalValue("quarkus.camel.disable-xml", Boolean.class).orElse(Boolean.FALSE);
- }
+ @Record(ExecutionTime.STATIC_INIT)
+ @BuildStep
+ CamelRegistryBuildItem jaxbContextFactory(SupportRecorder recorder) {
+ return new CamelRegistryBuildItem(
+ "log",
+ ModelJAXBContextFactory.class,
+ recorder.jaxbContextFactory()
+ );
}
}
diff --git a/extensions/xml-common/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java b/extensions/xml-common/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
index ffc44d2..d9490b5 100644
--- a/extensions/xml-common/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
+++ b/extensions/xml-common/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
@@ -16,11 +16,17 @@
*/
package org.apache.camel.quarkus.component.xml.deployment;
+import javax.enterprise.inject.Produces;
+
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.substrate.ReflectiveClassBuildItem;
+import io.quarkus.jaxb.deployment.JaxbEnabledBuildItem;
+import io.quarkus.jaxb.deployment.JaxbFileRootBuildItem;
import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.quarkus.core.deployment.CamelSupport;
+import org.apache.camel.spi.ModelJAXBContextFactory;
class XmlProcessor {
@@ -32,12 +38,25 @@ class XmlProcessor {
}
@BuildStep
+ JaxbFileRootBuildItem fileRoot() {
+ return new JaxbFileRootBuildItem(CamelSupport.CAMEL_ROOT_PACKAGE_DIRECTORY);
+ }
+
+ @BuildStep
+ JaxbEnabledBuildItem handleJaxbSupport() {
+ return new JaxbEnabledBuildItem();
+ }
+
+ @BuildStep
void reflective(BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
reflectiveClass.produce(new ReflectiveClassBuildItem(false, false,
"com.sun.xml.internal.stream.XMLInputFactoryImpl",
"com.sun.org.apache.xerces.internal.parsers.SAXParser",
- XmlConverter.class.getCanonicalName()));
-
+ XmlConverter.class.getCanonicalName(),
+ "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl",
+ "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl",
+ "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl")
+ );
// javax.xml.namespace.QName is needed as it is used as part of the processor
// definitions in the DSL and parsers like Jackson (used in camel-k YAML DSL)
// fails if this class is cannot be instantiated reflectively.
diff --git a/extensions/xml-common/runtime/pom.xml b/extensions/xml-common/runtime/pom.xml
index d688b6d..2d7e2ea 100644
--- a/extensions/xml-common/runtime/pom.xml
+++ b/extensions/xml-common/runtime/pom.xml
@@ -56,6 +56,11 @@
<groupId>org.apache.camel</groupId>
<artifactId>camel-jaxp</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>com.oracle.substratevm</groupId>
+ <artifactId>svm</artifactId>
+ </dependency>
</dependencies>
<build>
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/Flags.java b/extensions/xml-common/runtime/src/main/java/org/apache/camel/quarkus/component/xml/runtime/SupportRecorder.java
similarity index 51%
rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/Flags.java
rename to extensions/xml-common/runtime/src/main/java/org/apache/camel/quarkus/component/xml/runtime/SupportRecorder.java
index 69247e2..9c14a6f 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/Flags.java
+++ b/extensions/xml-common/runtime/src/main/java/org/apache/camel/quarkus/component/xml/runtime/SupportRecorder.java
@@ -14,28 +14,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.quarkus.core.runtime.support;
+package org.apache.camel.quarkus.component.xml.runtime;
-import java.util.function.BooleanSupplier;
+import io.quarkus.runtime.annotations.Recorder;
+import org.apache.camel.impl.DefaultModelJAXBContextFactory;
+import org.apache.camel.spi.ModelJAXBContextFactory;
-import org.eclipse.microprofile.config.ConfigProvider;
+@Recorder
+public class SupportRecorder {
-public final class Flags {
- private Flags() {
- }
-
- public static final class JaxbDisabled implements BooleanSupplier {
- @Override
- public boolean getAsBoolean() {
- return ConfigProvider.getConfig().getOptionalValue("quarkus.camel.disable-jaxb", Boolean.class).orElse(Boolean.FALSE);
- }
- }
-
- public static final class XmlDisabled implements BooleanSupplier {
- @Override
- public boolean getAsBoolean() {
- return ConfigProvider.getConfig().getOptionalValue("quarkus.camel.disable-xml", Boolean.class).orElse(Boolean.FALSE);
- }
+ public ModelJAXBContextFactory jaxbContextFactory() {
+ return new DefaultModelJAXBContextFactory();
}
}
diff --git a/extensions/xml-common/runtime/src/main/java/org/apache/camel/quarkus/component/xml/runtime/graal/Target_org_apache_camel_quarkus_core_runtime_support_FastModel.java b/extensions/xml-common/runtime/src/main/java/org/apache/camel/quarkus/component/xml/runtime/graal/Target_org_apache_camel_quarkus_core_runtime_support_FastModel.java
new file mode 100644
index 0000000..4322970
--- /dev/null
+++ b/extensions/xml-common/runtime/src/main/java/org/apache/camel/quarkus/component/xml/runtime/graal/Target_org_apache_camel_quarkus_core_runtime_support_FastModel.java
@@ -0,0 +1,45 @@
+/*
+ * 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.quarkus.component.xml.runtime.graal;
+
+import java.io.InputStream;
+
+import com.oracle.svm.core.annotate.Substitute;
+import com.oracle.svm.core.annotate.TargetClass;
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultModel;
+import org.apache.camel.model.ModelHelper;
+import org.apache.camel.model.RoutesDefinition;
+
+@TargetClass(className = "org.apache.camel.quarkus.core.runtime.support.FastModel")
+@Substitute
+public class Target_org_apache_camel_quarkus_core_runtime_support_FastModel extends DefaultModel {
+
+ public Target_org_apache_camel_quarkus_core_runtime_support_FastModel(CamelContext camelContext) {
+ super(camelContext);
+ }
+
+ @Substitute
+ public void addRouteDefinitions(InputStream is) throws Exception {
+ RoutesDefinition def = ModelHelper.loadRoutesDefinition(getCamelContext(), is);
+ if (def != null) {
+ this.addRouteDefinitions(def.getRoutes());
+ }
+
+ }
+
+}
diff --git a/extensions/xml-common/runtime/src/main/java/org/apache/camel/quarkus/component/xml/runtime/graal/Target_org_apache_camel_reifier_rest_RestBindingReifier.java b/extensions/xml-common/runtime/src/main/java/org/apache/camel/quarkus/component/xml/runtime/graal/Target_org_apache_camel_reifier_rest_RestBindingReifier.java
new file mode 100644
index 0000000..a649623
--- /dev/null
+++ b/extensions/xml-common/runtime/src/main/java/org/apache/camel/quarkus/component/xml/runtime/graal/Target_org_apache_camel_reifier_rest_RestBindingReifier.java
@@ -0,0 +1,68 @@
+/*
+ * 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.quarkus.component.xml.runtime.graal;
+
+import javax.xml.bind.JAXBContext;
+
+import com.oracle.svm.core.annotate.KeepOriginal;
+import com.oracle.svm.core.annotate.Substitute;
+import com.oracle.svm.core.annotate.TargetClass;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.model.rest.RestBindingDefinition;
+import org.apache.camel.spi.DataFormat;
+import org.apache.camel.spi.RestConfiguration;
+import org.apache.camel.spi.RouteContext;
+import org.apache.camel.support.processor.validation.PredicateValidatingProcessor;
+
+@TargetClass(className = "org.apache.camel.reifier.rest.RestBindingReifier")
+final class Target_org_apache_camel_reifier_rest_RestBindingReifier {
+
+ @Substitute
+ protected void setupJaxb(CamelContext context, RestConfiguration config, String type, String outType, DataFormat jaxb, DataFormat outJaxb) throws Exception {
+ Class<?> clazz = null;
+ if (type != null) {
+ String typeName = type.endsWith("[]") ? type.substring(0, type.length() - 2) : type;
+ clazz = context.getClassResolver().resolveMandatoryClass(typeName);
+ }
+ if (clazz != null) {
+ JAXBContext jc = JAXBContext.newInstance(clazz);
+ context.adapt(ExtendedCamelContext.class).getBeanIntrospection().setProperty(context, jaxb, "context", jc);
+ }
+ setAdditionalConfiguration(config, context, jaxb, "xml.in.");
+
+ Class<?> outClazz = null;
+ if (outType != null) {
+ String typeName = outType.endsWith("[]") ? outType.substring(0, outType.length() - 2) : outType;
+ outClazz = context.getClassResolver().resolveMandatoryClass(typeName);
+ }
+ if (outClazz != null) {
+ JAXBContext jc = JAXBContext.newInstance(outClazz);
+ context.adapt(ExtendedCamelContext.class).getBeanIntrospection().setProperty(context, outJaxb, "context", jc);
+ } else if (clazz != null) {
+ // fallback and use the context from the input
+ JAXBContext jc = JAXBContext.newInstance(clazz);
+ context.adapt(ExtendedCamelContext.class).getBeanIntrospection().setProperty(context, outJaxb, "context", jc);
+ }
+ setAdditionalConfiguration(config, context, outJaxb, "xml.out.");
+ }
+
+ @KeepOriginal
+ private void setAdditionalConfiguration(RestConfiguration config, CamelContext context, DataFormat dataFormat, String prefix) throws Exception {
+ }
+
+}
diff --git a/integration-tests/aws/src/main/resources/application.properties b/integration-tests/aws/src/main/resources/application.properties
index 936ed0f..3ca2a3a 100644
--- a/integration-tests/aws/src/main/resources/application.properties
+++ b/integration-tests/aws/src/main/resources/application.properties
@@ -23,8 +23,6 @@ quarkus.log.file.enable = false
#
# Quarkus :: Camel
#
-quarkus.camel.disable-xml=true
-quarkus.camel.disable-jaxb=true
quarkus.camel.dump-routes=true
#
# Camel
diff --git a/integration-tests/bean/src/main/resources/application.properties b/integration-tests/bean/src/main/resources/application.properties
index fe14ab2..dba6223 100644
--- a/integration-tests/bean/src/main/resources/application.properties
+++ b/integration-tests/bean/src/main/resources/application.properties
@@ -23,8 +23,6 @@ quarkus.log.file.enable = false
#
# Quarkus :: Camel
#
-quarkus.camel.disable-xml=true
-quarkus.camel.disable-jaxb=true
quarkus.camel.dump-routes=true
#
# Camel
diff --git a/integration-tests/core-cdi/src/main/resources/application.properties b/integration-tests/core-cdi/src/main/resources/application.properties
index f258d12..eb108f4 100644
--- a/integration-tests/core-cdi/src/main/resources/application.properties
+++ b/integration-tests/core-cdi/src/main/resources/application.properties
@@ -22,8 +22,6 @@ quarkus.log.file.enable = false
#
# Quarkus :: Camel
#
-quarkus.camel.disable-xml=false
-quarkus.camel.disable-jaxb=false
quarkus.camel.dump-routes=true
#
# Camel
diff --git a/integration-tests/core-impl/src/main/resources/application.properties b/integration-tests/core-impl/src/main/resources/application.properties
index 775072e..4f9279c 100644
--- a/integration-tests/core-impl/src/main/resources/application.properties
+++ b/integration-tests/core-impl/src/main/resources/application.properties
@@ -22,8 +22,6 @@ quarkus.log.file.enable = false
#
# Quarkus :: Camel
#
-quarkus.camel.disable-xml=true
-quarkus.camel.disable-jaxb=true
quarkus.camel.dump-routes=true
#
# Camel
diff --git a/integration-tests/core/test/src/main/resources/application.properties b/integration-tests/core/test/src/main/resources/application.properties
index b441636..3e6e7bb 100644
--- a/integration-tests/core/test/src/main/resources/application.properties
+++ b/integration-tests/core/test/src/main/resources/application.properties
@@ -22,8 +22,6 @@ quarkus.log.file.enable = false
#
# Quarkus :: Camel
#
-quarkus.camel.disable-xml=true
-quarkus.camel.disable-jaxb=true
quarkus.camel.dump-routes=true
#
diff --git a/integration-tests/jdbc/src/main/resources/application.properties b/integration-tests/jdbc/src/main/resources/application.properties
index f1e4300..f4fa33e 100644
--- a/integration-tests/jdbc/src/main/resources/application.properties
+++ b/integration-tests/jdbc/src/main/resources/application.properties
@@ -22,8 +22,6 @@ quarkus.log.file.enable = false
#
# Quarkus :: Camel
#
-quarkus.camel.disable-xml=true
-quarkus.camel.disable-jaxb=true
quarkus.camel.dump-routes=true
#
diff --git a/integration-tests/netty-http/src/main/resources/application.properties b/integration-tests/netty-http/src/main/resources/application.properties
index 603d5f3..708319c 100644
--- a/integration-tests/netty-http/src/main/resources/application.properties
+++ b/integration-tests/netty-http/src/main/resources/application.properties
@@ -22,8 +22,6 @@ quarkus.log.file.enable = false
#
# Quarkus :: Camel
#
-quarkus.camel.disable-xml=true
-quarkus.camel.disable-jaxb=true
quarkus.camel.dump-routes=true
#
# Camel
diff --git a/integration-tests/salesforce/src/main/resources/application.properties b/integration-tests/salesforce/src/main/resources/application.properties
index 1b8f25e..66fbe0a 100644
--- a/integration-tests/salesforce/src/main/resources/application.properties
+++ b/integration-tests/salesforce/src/main/resources/application.properties
@@ -19,8 +19,6 @@
# Quarkus
#
quarkus.ssl.native=true
-quarkus.camel.disable-xml=true
-quarkus.camel.disable-jaxb=true
quarkus.camel.dump-routes=true
#
# Camel
diff --git a/integration-tests/servlet/src/main/resources/application.properties b/integration-tests/servlet/src/main/resources/application.properties
index 387415e..fe4921f 100644
--- a/integration-tests/servlet/src/main/resources/application.properties
+++ b/integration-tests/servlet/src/main/resources/application.properties
@@ -23,8 +23,6 @@ quarkus.ssl.native=true
#
# Quarkus :: Camel
#
-quarkus.camel.disable-xml=true
-quarkus.camel.disable-jaxb=true
quarkus.camel.dump-routes=true
#
# Quarkus :: Camel :: Servlet
diff --git a/integration-tests/twitter/src/main/resources/application.properties b/integration-tests/twitter/src/main/resources/application.properties
index c0f95bf..06bb262 100644
--- a/integration-tests/twitter/src/main/resources/application.properties
+++ b/integration-tests/twitter/src/main/resources/application.properties
@@ -23,8 +23,6 @@ quarkus.log.file.enable = false
#
# Quarkus :: Camel
#
-quarkus.camel.disable-xml=true
-quarkus.camel.disable-jaxb=true
quarkus.camel.dump-routes=true
#
# Camel
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index 2594b8a..62a6225 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -93,6 +93,12 @@
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>${camel.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-jaxp</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>