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.git
The following commit(s) were added to refs/heads/master by this push:
new e2e8367 CAMEL-14828: camel-core - Remove multiple camel context
support for restContextRef which removes JAXB API dependency
e2e8367 is described below
commit e2e8367ceddb19c1b5a8bc6c7812fa5610ff33ea
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Apr 2 09:31:38 2020 +0200
CAMEL-14828: camel-core - Remove multiple camel context support for
restContextRef which removes JAXB API dependency
---
.../model/RestContextRefDefinitionHelper.java | 117 +--------------------
.../model/RouteContextRefDefinitionHelper.java | 99 +----------------
2 files changed, 6 insertions(+), 210 deletions(-)
diff --git
a/core/camel-core-engine/src/main/java/org/apache/camel/model/RestContextRefDefinitionHelper.java
b/core/camel-core-engine/src/main/java/org/apache/camel/model/RestContextRefDefinitionHelper.java
index b9ec262..06cb0b6 100644
---
a/core/camel-core-engine/src/main/java/org/apache/camel/model/RestContextRefDefinitionHelper.java
+++
b/core/camel-core-engine/src/main/java/org/apache/camel/model/RestContextRefDefinitionHelper.java
@@ -16,25 +16,10 @@
*/
package org.apache.camel.model;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
import org.apache.camel.CamelContext;
-import org.apache.camel.ExtendedCamelContext;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.model.language.NamespaceAwareExpression;
import org.apache.camel.model.rest.RestDefinition;
-import org.apache.camel.model.rest.VerbDefinition;
import org.apache.camel.support.CamelContextHelper;
import org.apache.camel.util.ObjectHelper;
@@ -43,33 +28,18 @@ import org.apache.camel.util.ObjectHelper;
*/
public final class RestContextRefDefinitionHelper {
- private static JAXBContext jaxbContext;
-
private RestContextRefDefinitionHelper() {
}
/**
* Lookup the rests from the
* {@link org.apache.camel.model.RestContextRefDefinition}.
- * <p/>
- * This implementation must be used to lookup the rests as it performs a
- * deep clone of the rests as a
- * {@link org.apache.camel.model.RestContextRefDefinition} can be re-used
- * with multiple {@link org.apache.camel.model.ModelCamelContext} and each
- * context should have their own instances of the routes. This is to ensure
- * no side-effects and sharing of instances between the contexts. For
- * example such as property placeholders may be context specific so the
- * routes should not use placeholders from another
- * {@link org.apache.camel.CamelContext}.
*
* @param camelContext the CamelContext
- * @param ref the id of the
- * {@link org.apache.camel.model.RestContextRefDefinition} to
- * lookup and get the routes.
+ * @param ref the id of the {@link
org.apache.camel.model.RestContextRefDefinition} to lookup and get the routes.
* @return the rests.
*/
- @SuppressWarnings("unchecked")
- public static synchronized List<RestDefinition> lookupRests(CamelContext
camelContext, String ref) {
+ public static List<RestDefinition> lookupRests(CamelContext camelContext,
String ref) {
ObjectHelper.notNull(camelContext, "camelContext");
ObjectHelper.notNull(ref, "ref");
@@ -77,88 +47,7 @@ public final class RestContextRefDefinitionHelper {
if (answer == null) {
throw new IllegalArgumentException("Cannot find RestContext with
id " + ref);
}
-
- // must clone the rest definitions as they can be reused with multiple
- // CamelContexts
- // and they would need their own instances of the definitions to not
- // have side effects among
- // the CamelContext - for example property placeholder resolutions etc.
- List<RestDefinition> clones = new ArrayList<>(answer.size());
- try {
- JAXBContext jaxb = getOrCreateJAXBContext(camelContext);
- for (RestDefinition def : answer) {
- RestDefinition clone = cloneRestDefinition(jaxb, def);
- if (clone != null) {
- clones.add(clone);
- }
- }
- } catch (Exception e) {
- throw RuntimeCamelException.wrapRuntimeCamelException(e);
- }
-
- return clones;
- }
-
- private static synchronized JAXBContext getOrCreateJAXBContext(final
CamelContext camelContext) throws JAXBException {
- if (jaxbContext == null) {
- // must use classloader from CamelContext to have JAXB working
- jaxbContext =
camelContext.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory().newJAXBContext();
- }
- return jaxbContext;
- }
-
- private static RestDefinition cloneRestDefinition(JAXBContext jaxbContext,
RestDefinition def) throws JAXBException {
- Marshaller marshal = jaxbContext.createMarshaller();
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- marshal.marshal(def, bos);
-
- ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- Object clone = unmarshaller.unmarshal(bis);
-
- if (clone instanceof RestDefinition) {
- RestDefinition def2 = (RestDefinition)clone;
-
- Iterator<VerbDefinition> verbit1 = def.getVerbs().iterator();
- Iterator<VerbDefinition> verbit2 = def2.getVerbs().iterator();
-
- while (verbit1.hasNext() && verbit2.hasNext()) {
- VerbDefinition verb1 = verbit1.next();
- VerbDefinition verb2 = verbit2.next();
-
- if (verb1.getToOrRoute() instanceof RouteDefinition &&
verb2.getToOrRoute() instanceof RouteDefinition) {
- RouteDefinition route1 =
(RouteDefinition)verb1.getToOrRoute();
- RouteDefinition route2 =
(RouteDefinition)verb2.getToOrRoute();
-
- // need to clone the namespaces also as they are not JAXB
- // marshalled (as they are transient)
- Iterator<ExpressionNode> it =
ProcessorDefinitionHelper.filterTypeInOutputs(route1.getOutputs(),
ExpressionNode.class);
- Iterator<ExpressionNode> it2 =
ProcessorDefinitionHelper.filterTypeInOutputs(route2.getOutputs(),
ExpressionNode.class);
- while (it.hasNext() && it2.hasNext()) {
- ExpressionNode node = it.next();
- ExpressionNode node2 = it2.next();
-
- NamespaceAwareExpression name = null;
- NamespaceAwareExpression name2 = null;
- if (node.getExpression() instanceof
NamespaceAwareExpression) {
- name =
(NamespaceAwareExpression)node.getExpression();
- }
- if (node2.getExpression() instanceof
NamespaceAwareExpression) {
- name2 =
(NamespaceAwareExpression)node2.getExpression();
- }
-
- if (name != null && name2 != null &&
name.getNamespaces() != null && !name.getNamespaces().isEmpty()) {
- Map<String, String> map = new HashMap<>();
- map.putAll(name.getNamespaces());
- name2.setNamespaces(map);
- }
- }
- }
- }
- return def2;
- }
-
- return null;
+ return answer;
}
}
diff --git
a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteContextRefDefinitionHelper.java
b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteContextRefDefinitionHelper.java
index 66cea9b..5cf4e46 100644
---
a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteContextRefDefinitionHelper.java
+++
b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteContextRefDefinitionHelper.java
@@ -16,23 +16,9 @@
*/
package org.apache.camel.model;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
import org.apache.camel.CamelContext;
-import org.apache.camel.ExtendedCamelContext;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.model.language.NamespaceAwareExpression;
import org.apache.camel.support.CamelContextHelper;
import org.apache.camel.util.ObjectHelper;
@@ -41,29 +27,18 @@ import org.apache.camel.util.ObjectHelper;
*/
public final class RouteContextRefDefinitionHelper {
- private static JAXBContext jaxbContext;
-
private RouteContextRefDefinitionHelper() {
}
/**
* Lookup the routes from the {@link RouteContextRefDefinition}.
- * <p/>
- * This implementation must be used to lookup the routes as it performs a
- * deep clone of the routes as a {@link RouteContextRefDefinition} can be
- * re-used with multiple {@link ModelCamelContext} and each context should
- * have their own instances of the routes. This is to ensure no
side-effects
- * and sharing of instances between the contexts. For example such as
- * property placeholders may be context specific so the routes should not
- * use placeholders from another {@link ModelCamelContext}.
*
* @param camelContext the CamelContext
- * @param ref the id of the {@link RouteContextRefDefinition} to lookup and
- * get the routes.
+ * @param ref the id of the {@link RouteContextRefDefinition} to lookup
and get the routes.
* @return the routes.
*/
@SuppressWarnings("unchecked")
- public static synchronized List<RouteDefinition> lookupRoutes(CamelContext
camelContext, String ref) {
+ public static List<RouteDefinition> lookupRoutes(CamelContext
camelContext, String ref) {
ObjectHelper.notNull(camelContext, "camelContext");
ObjectHelper.notNull(ref, "ref");
@@ -71,75 +46,7 @@ public final class RouteContextRefDefinitionHelper {
if (answer == null) {
throw new IllegalArgumentException("Cannot find RouteContext with
id " + ref);
}
-
- // must clone the route definitions as they can be reused with multiple
- // CamelContexts
- // and they would need their own instances of the definitions to not
- // have side effects among
- // the CamelContext - for example property placeholder resolutions etc.
- List<RouteDefinition> clones = new ArrayList<>(answer.size());
- try {
- JAXBContext jaxb = getOrCreateJAXBContext(camelContext);
- for (RouteDefinition def : answer) {
- RouteDefinition clone = cloneRouteDefinition(jaxb, def);
- if (clone != null) {
- clones.add(clone);
- }
- }
- } catch (Exception e) {
- throw RuntimeCamelException.wrapRuntimeCamelException(e);
- }
-
- return clones;
- }
-
- private static synchronized JAXBContext getOrCreateJAXBContext(final
CamelContext camelContext) throws JAXBException {
- if (jaxbContext == null) {
- jaxbContext =
camelContext.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory().newJAXBContext();
- }
- return jaxbContext;
- }
-
- private static RouteDefinition cloneRouteDefinition(JAXBContext
jaxbContext, RouteDefinition def) throws JAXBException {
- Marshaller marshal = jaxbContext.createMarshaller();
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- marshal.marshal(def, bos);
-
- ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- Object clone = unmarshaller.unmarshal(bis);
-
- if (clone instanceof RouteDefinition) {
- RouteDefinition def2 = (RouteDefinition)clone;
-
- // need to clone the namespaces also as they are not JAXB
marshalled
- // (as they are transient)
- Iterator<ExpressionNode> it =
ProcessorDefinitionHelper.filterTypeInOutputs(def.getOutputs(),
ExpressionNode.class);
- Iterator<ExpressionNode> it2 =
ProcessorDefinitionHelper.filterTypeInOutputs(def2.getOutputs(),
ExpressionNode.class);
- while (it.hasNext() && it2.hasNext()) {
- ExpressionNode node = it.next();
- ExpressionNode node2 = it2.next();
-
- NamespaceAwareExpression name = null;
- NamespaceAwareExpression name2 = null;
- if (node.getExpression() instanceof NamespaceAwareExpression) {
- name = (NamespaceAwareExpression)node.getExpression();
- }
- if (node2.getExpression() instanceof NamespaceAwareExpression)
{
- name2 = (NamespaceAwareExpression)node2.getExpression();
- }
-
- if (name != null && name2 != null && name.getNamespaces() !=
null && !name.getNamespaces().isEmpty()) {
- Map<String, String> map = new HashMap<>();
- map.putAll(name.getNamespaces());
- name2.setNamespaces(map);
- }
- }
-
- return def2;
- }
-
- return null;
+ return answer;
}
}