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 2018/11/08 15:00:17 UTC
[camel] 03/08: Cache the JAXBContext in ModelJAXBContextFactory
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch sandbox/camel-3.x
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 121fe1dfc88f64dde4c5b7ced88f76e8004db169
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Wed Nov 7 16:43:14 2018 +0100
Cache the JAXBContext in ModelJAXBContextFactory
---
.../camel/impl/DefaultModelJAXBContextFactory.java | 11 ++++++++++-
.../java/org/apache/camel/model/ModelHelper.java | 22 ++++++++++++----------
.../BlueprintModelJAXBContextFactory.java | 19 +++++++++----------
.../spring/SpringModelJAXBContextFactory.java | 4 ----
.../commands/AbstractLocalCamelController.java | 4 ++--
5 files changed, 33 insertions(+), 27 deletions(-)
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultModelJAXBContextFactory.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultModelJAXBContextFactory.java
index c830241..348bda2 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultModelJAXBContextFactory.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultModelJAXBContextFactory.java
@@ -27,8 +27,17 @@ import org.apache.camel.spi.ModelJAXBContextFactory;
*/
public class DefaultModelJAXBContextFactory implements ModelJAXBContextFactory {
+ private volatile JAXBContext context;
+
public JAXBContext newJAXBContext() throws JAXBException {
- return JAXBContext.newInstance(getPackages(), getClassLoader());
+ if (context == null) {
+ synchronized (this) {
+ if (context == null) {
+ context = JAXBContext.newInstance(getPackages(), getClassLoader());
+ }
+ }
+ }
+ return context;
}
protected String getPackages() {
diff --git a/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java b/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
index 476f15f..dbc95f6 100644
--- a/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
@@ -41,7 +41,9 @@ import org.apache.camel.Expression;
import org.apache.camel.NamedNode;
import org.apache.camel.TypeConversionException;
import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.impl.DefaultModelJAXBContextFactory;
import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.spi.ModelJAXBContextFactory;
import org.apache.camel.spi.NamespaceAware;
import org.apache.camel.spi.TypeConverterRegistry;
import org.apache.camel.util.ObjectHelper;
@@ -237,13 +239,10 @@ public final class ModelHelper {
}
private static JAXBContext getJAXBContext(CamelContext context) throws JAXBException {
- JAXBContext jaxbContext;
- if (context == null) {
- jaxbContext = createJAXBContext();
- } else {
- jaxbContext = context.getModelJAXBContextFactory().newJAXBContext();
- }
- return jaxbContext;
+ ModelJAXBContextFactory factory = context != null
+ ? context.getModelJAXBContextFactory()
+ : getDefaultModelJAXBContextFactory();
+ return factory.newJAXBContext();
}
private static void applyNamespaces(RouteDefinition route, Map<String, String> namespaces) {
@@ -270,9 +269,12 @@ public final class ModelHelper {
return na;
}
- private static JAXBContext createJAXBContext() throws JAXBException {
- // must use classloader from CamelContext to have JAXB working
- return JAXBContext.newInstance(Constants.JAXB_CONTEXT_PACKAGES, CamelContext.class.getClassLoader());
+ private static class ModelJAXBContextFactoryHolder {
+ private static ModelJAXBContextFactory INSTANCE = new DefaultModelJAXBContextFactory();
+ }
+
+ private static ModelJAXBContextFactory getDefaultModelJAXBContextFactory() {
+ return ModelJAXBContextFactoryHolder.INSTANCE;
}
/**
diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintModelJAXBContextFactory.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintModelJAXBContextFactory.java
index 1ea5153f..0fed087 100644
--- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintModelJAXBContextFactory.java
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintModelJAXBContextFactory.java
@@ -18,14 +18,12 @@ package org.apache.camel.blueprint;
import java.util.LinkedHashSet;
import java.util.Set;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
import org.apache.camel.core.xml.AbstractCamelContextFactoryBean;
-import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.impl.DefaultModelJAXBContextFactory;
import org.apache.camel.util.blueprint.SSLContextParametersFactoryBean;
-public class BlueprintModelJAXBContextFactory implements ModelJAXBContextFactory {
+public class BlueprintModelJAXBContextFactory extends DefaultModelJAXBContextFactory {
private final ClassLoader classLoader;
@@ -33,7 +31,12 @@ public class BlueprintModelJAXBContextFactory implements ModelJAXBContextFactory
this.classLoader = classLoader;
}
- private String getPackages() {
+ @Override
+ protected ClassLoader getClassLoader() {
+ return classLoader;
+ }
+
+ protected String getPackages() {
// we nedd to have a class from each different package with jaxb models
// and we must use the .class for the classloader to work in OSGi
Set<Class<?>> classes = new LinkedHashSet<>();
@@ -54,13 +57,9 @@ public class BlueprintModelJAXBContextFactory implements ModelJAXBContextFactory
if (packages.length() > 0) {
packages.append(":");
}
- packages.append(cl.getName().substring(0, cl.getName().lastIndexOf('.')));
+ packages.append(cl.getName(), 0, cl.getName().lastIndexOf('.'));
}
return packages.toString();
}
- @Override
- public JAXBContext newJAXBContext() throws JAXBException {
- return JAXBContext.newInstance(getPackages(), classLoader);
- }
}
\ No newline at end of file
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/SpringModelJAXBContextFactory.java b/components/camel-spring/src/main/java/org/apache/camel/spring/SpringModelJAXBContextFactory.java
index 37b04ba..2fc3097 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/SpringModelJAXBContextFactory.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/SpringModelJAXBContextFactory.java
@@ -26,10 +26,6 @@ public class SpringModelJAXBContextFactory extends DefaultModelJAXBContextFactor
+ "org.apache.camel.spring:"
+ "org.apache.camel.util.spring:";
- protected ClassLoader getClassLoader() {
- return getClass().getClassLoader();
- }
-
protected String getPackages() {
return super.getPackages() + ADDITIONAL_JAXB_CONTEXT_PACKAGES;
}
diff --git a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
index 7144478..a07cf12 100644
--- a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
+++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
@@ -379,7 +379,7 @@ public abstract class AbstractLocalCamelController extends AbstractCamelControll
return null;
}
- return ModelHelper.dumpModelAsXml(null, route);
+ return ModelHelper.dumpModelAsXml(context, route);
}
@Override
@@ -421,7 +421,7 @@ public abstract class AbstractLocalCamelController extends AbstractCamelControll
// use a rests definition to dump the rests
RestsDefinition def = new RestsDefinition();
def.setRests(rests);
- return ModelHelper.dumpModelAsXml(null, def);
+ return ModelHelper.dumpModelAsXml(context, def);
}
public String getRestApiDocAsJson(String camelContextName) throws Exception {