Repository: camel
Updated Branches:
  refs/heads/master cbc1718af -> 35527c18e


[CAMEL-9921] Use Glassfish EL when available with fallback to default


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/35527c18
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/35527c18
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/35527c18

Branch: refs/heads/master
Commit: 35527c18e8d5f6f4b7121c05a03ca8eb7aa85307
Parents: cbc1718
Author: Thomas Diesler <thomas.dies...@jboss.com>
Authored: Mon May 9 13:28:00 2016 +0200
Committer: Andrea Cosentino <anco...@gmail.com>
Committed: Mon May 9 14:22:16 2016 +0200

----------------------------------------------------------------------
 .../camel/component/dozer/DozerEndpoint.java    | 54 ++++++++++++--------
 1 file changed, 34 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/35527c18/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java
----------------------------------------------------------------------
diff --git 
a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java
 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java
index 8c0f3db..190d1cc 100644
--- 
a/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java
+++ 
b/components/camel-dozer/src/main/java/org/apache/camel/component/dozer/DozerEndpoint.java
@@ -21,12 +21,15 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.el.ExpressionFactory;
+
 import com.sun.el.ExpressionFactoryImpl;
 
 import org.apache.camel.Component;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.converter.dozer.DozerThreadContextClassLoader;
 import org.apache.camel.converter.dozer.DozerTypeConverterLoader;
 import org.apache.camel.impl.DefaultEndpoint;
 import org.apache.camel.spi.UriEndpoint;
@@ -123,29 +126,12 @@ public class DozerEndpoint extends DefaultEndpoint {
     }
 
     protected void initDozerBeanContainerAndMapper() throws Exception {
-        LOG.info("Configuring DozerBeanContainer and DozerBeanMapper");
-
-        // must setup dozer to be able to load the EL factory we are using 
which is from glashfish
-        ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
 
-        ExpressionFactoryImpl factory = new ExpressionFactoryImpl();
-        ClassLoader cl = factory.getClass().getClassLoader();
-        Thread.currentThread().setContextClassLoader(cl);
+        LOG.info("Configuring DozerBeanContainer and DozerBeanMapper");
 
-        System.setProperty("javax.el.ExpressionFactory", 
"com.sun.el.ExpressionFactoryImpl");
-        try {
-            ELEngine engine = new ELEngine();
-            engine.init();
-            BeanContainer.getInstance().setElEngine(engine);
-            ElementReader reader = new ExpressionElementReader(engine);
-            BeanContainer.getInstance().setElementReader(reader);
 
-        } catch (Throwable e) {
-            throw new IllegalStateException("Error configuring 
DozerBeanContainer/DozerBeanMapper due " + e.getMessage(), e);
-        } finally {
-            System.clearProperty("javax.el.ExpressionFactory");
-            Thread.currentThread().setContextClassLoader(oldCl);
-        }
+        // init the expression engine with a fallback to the impl from glasfish
+        initELEngine();
 
         // configure mapper as well
         if (mapper == null) {
@@ -160,6 +146,34 @@ public class DozerEndpoint extends DefaultEndpoint {
 
     }
 
+    public void initELEngine() {
+        String elprop = System.getProperty("javax.el.ExpressionFactory");
+        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+        try {
+            ClassLoader appcl = 
getCamelContext().getApplicationContextClassLoader();
+            ClassLoader auxcl = appcl != null ? appcl : 
DozerEndpoint.class.getClassLoader();
+            Thread.currentThread().setContextClassLoader(auxcl);
+            try {
+                Class<?> clazz = 
auxcl.loadClass("com.sun.el.ExpressionFactoryImpl");
+                ExpressionFactory factory = (ExpressionFactory) 
clazz.newInstance();
+                System.setProperty("javax.el.ExpressionFactory", 
factory.getClass().getName());
+            } catch (ClassNotFoundException | InstantiationException | 
IllegalAccessException ex) {
+                LOG.debug("Cannot load glasfish expression engine, using 
default");
+            }
+            ELEngine engine = new ELEngine();
+            engine.init();
+            BeanContainer.getInstance().setElEngine(engine);
+            ElementReader reader = new ExpressionElementReader(engine);
+            BeanContainer.getInstance().setElementReader(reader);
+        } finally {
+            Thread.currentThread().setContextClassLoader(tccl);
+            if (elprop != null)
+                System.setProperty("javax.el.ExpressionFactory", elprop);
+            else
+                System.clearProperty("javax.el.ExpressionFactory");
+        }
+    }
+
     private DozerBeanMapper createDozerBeanMapper() throws Exception {
         DozerBeanMapper answer = 
DozerComponent.createDozerBeanMapper(Collections.<String>emptyList());
         InputStream mapStream = null;

Reply via email to