You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2013/07/26 10:49:22 UTC

[1/2] git commit: CAMEL-6572 Fixed the Validator component schema loading issue

Updated Branches:
  refs/heads/master 22177229c -> f66375e91


CAMEL-6572 Fixed the Validator component schema loading issue


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

Branch: refs/heads/master
Commit: f4782177796f4e766a4fbad17a48a07387aced01
Parents: 2217722
Author: Willem Jiang <ni...@apache.org>
Authored: Fri Jul 26 15:57:02 2013 +0800
Committer: Willem Jiang <ni...@apache.org>
Committed: Fri Jul 26 16:48:38 2013 +0800

----------------------------------------------------------------------
 .../camel/component/validator/DefaultLSResourceResolver.java      | 3 ++-
 .../org/apache/camel/component/validator/xsds/person.xsd          | 2 ++
 2 files changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/f4782177/camel-core/src/main/java/org/apache/camel/component/validator/DefaultLSResourceResolver.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/validator/DefaultLSResourceResolver.java b/camel-core/src/main/java/org/apache/camel/component/validator/DefaultLSResourceResolver.java
index a8048a5..86db2e8 100644
--- a/camel-core/src/main/java/org/apache/camel/component/validator/DefaultLSResourceResolver.java
+++ b/camel-core/src/main/java/org/apache/camel/component/validator/DefaultLSResourceResolver.java
@@ -77,8 +77,9 @@ public class DefaultLSResourceResolver implements LSResourceResolver {
                 relatedURI = FileUtil.onlyPath(relatedURI) + "/" + systemId;
                 resourceURI = relatedURI;
                 relatedURIMap.put(baseURI, relatedPath);
-            } else { 
+            } else {
                 resourceURI = relatedPath + "/" + systemId;
+                relatedURI = resourceURI;
             }
         }
         return new DefaultLSInput(publicId, systemId, baseURI, resourceURI);

http://git-wip-us.apache.org/repos/asf/camel/blob/f4782177/camel-core/src/test/resources/org/apache/camel/component/validator/xsds/person.xsd
----------------------------------------------------------------------
diff --git a/camel-core/src/test/resources/org/apache/camel/component/validator/xsds/person.xsd b/camel-core/src/test/resources/org/apache/camel/component/validator/xsds/person.xsd
index 99455c7..3eb767a 100644
--- a/camel-core/src/test/resources/org/apache/camel/component/validator/xsds/person.xsd
+++ b/camel-core/src/test/resources/org/apache/camel/component/validator/xsds/person.xsd
@@ -22,6 +22,8 @@
            targetNamespace="org.person"
            xmlns:h="org.health.check.person">
     <xs:import schemaLocation="health/health.xsd" namespace="org.health.check.person"/>
+    <xs:import schemaLocation="health/common/common.xsd" namespace="org.health.check.common"/>
+    <xs:import schemaLocation="health/type1.xsd" namespace="org.health.check.type1" />
     <xs:element name="person" type="p:personType">
 </xs:element>
 <xs:complexType name="personType">


[2/2] git commit: CAMEL-6559 fixed the script builder synchronized the operation of evaluateScript issue

Posted by ni...@apache.org.
CAMEL-6559 fixed the script builder synchronized the operation of evaluateScript issue


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

Branch: refs/heads/master
Commit: f66375e91e2755e956c1527752c255aa2d0f8c42
Parents: f478217
Author: Willem Jiang <ni...@apache.org>
Authored: Fri Jul 26 16:46:50 2013 +0800
Committer: Willem Jiang <ni...@apache.org>
Committed: Fri Jul 26 16:48:39 2013 +0800

----------------------------------------------------------------------
 .../camel/builder/script/ScriptBuilder.java     | 61 ++++++++++++++++----
 .../camel/builder/script/ScriptLanguage.java    | 17 +++++-
 .../script/JavaScriptExpressionTest.java        | 35 ++++++++++-
 3 files changed, 99 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/f66375e9/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java
----------------------------------------------------------------------
diff --git a/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java b/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java
index 710be36..7477673 100644
--- a/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java
+++ b/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptBuilder.java
@@ -22,6 +22,8 @@ import java.io.InputStreamReader;
 import java.io.Reader;
 import java.lang.reflect.Method;
 import java.util.Map;
+import java.util.WeakHashMap;
+
 import javax.script.Compilable;
 import javax.script.CompiledScript;
 import javax.script.ScriptContext;
@@ -35,6 +37,7 @@ import org.apache.camel.Message;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.converter.ObjectConverter;
+import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.ResourceHelper;
@@ -47,7 +50,7 @@ import org.slf4j.LoggerFactory;
  *
  * @version 
  */
-public class ScriptBuilder implements Expression, Predicate, Processor {
+public class ScriptBuilder extends ServiceSupport implements Expression, Predicate, Processor {
 
     /**
      * Additional arguments to {@link ScriptEngine} provided as a header on the IN {@link org.apache.camel.Message}
@@ -60,8 +63,9 @@ public class ScriptBuilder implements Expression, Predicate, Processor {
     private String scriptEngineName;
     private String scriptResource;
     private String scriptText;
-    private ScriptEngine engine;
     private CompiledScript compiledScript;
+    private Map<Thread, ScriptEngineHolder> engineHolders = new WeakHashMap<Thread, ScriptEngineHolder>();
+    private ThreadLocal<ScriptEngineHolder> engineHolder = new ThreadLocal<ScriptEngineHolder>();
 
     /**
      * Constructor.
@@ -194,13 +198,22 @@ public class ScriptBuilder implements Expression, Predicate, Processor {
     // -------------------------------------------------------------------------
 
     public ScriptEngine getEngine() {
-        if (engine == null) {
-            engine = createScriptEngine();
+        if (engineHolder.get() == null) {
+            ScriptEngineHolder holder = new ScriptEngineHolder();
+           
+            engineHolder.set(holder);
+            engineHolders.put(Thread.currentThread(), holder);
         }
-        if (engine == null) {
+        if (engineHolder.get()  == null) {
             throw new IllegalArgumentException("No script engine could be created for: " + getScriptEngineName());
         }
-        return engine;
+        ScriptEngineHolder holder  = engineHolder.get();
+        if (holder.engine == null) {
+            holder.engine = createScriptEngine();
+            engineHolders.put(Thread.currentThread(), holder);
+        }
+        
+        return holder.engine;
     }
 
     public CompiledScript getCompiledScript() {
@@ -258,13 +271,20 @@ public class ScriptBuilder implements Expression, Predicate, Processor {
         if (scriptText == null && scriptResource == null) {
             throw new IllegalArgumentException("Neither scriptText or scriptResource are specified");
         }
-        if (engine == null) {
-            engine = createScriptEngine();
+        ScriptEngineHolder holder = engineHolder.get();
+        if (holder  == null) {
+            holder = new ScriptEngineHolder();
+            engineHolder.set(holder);
+        }
+        holder = engineHolder.get();
+        if (holder.engine == null) {
+            holder.engine = createScriptEngine();
+            engineHolders.put(Thread.currentThread(), holder);
         }
         if (compiledScript == null) {
             // BeanShell implements Compilable but throws an exception if you call compile
-            if (engine instanceof Compilable && !isBeanShell()) { 
-                compileScript((Compilable)engine, exchange);
+            if (holder.engine instanceof Compilable && !isBeanShell()) { 
+                compileScript((Compilable)holder.engine, exchange);
             }
         }
     }
@@ -275,6 +295,7 @@ public class ScriptBuilder implements Expression, Predicate, Processor {
 
     protected ScriptEngine createScriptEngine() {
         ScriptEngineManager manager = new ScriptEngineManager();
+        ScriptEngine engine = null;
         try {
             engine = manager.getEngineByName(scriptEngineName);
         } catch (NoClassDefFoundError ex) {
@@ -333,7 +354,7 @@ public class ScriptBuilder implements Expression, Predicate, Processor {
         }
     }
 
-    protected synchronized Object evaluateScript(Exchange exchange) {
+    protected Object evaluateScript(Exchange exchange) {
         try {
             getScriptContext();
             populateBindings(getEngine(), exchange);
@@ -438,4 +459,22 @@ public class ScriptBuilder implements Expression, Predicate, Processor {
     protected boolean isBeanShell() {
         return "beanshell".equals(scriptEngineName) || "bsh".equals(scriptEngineName);
     }
+
+    @Override
+    protected void doStart() throws Exception {
+        // do nothing here
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        // we need to clean up the engines map
+        for (ScriptEngineHolder holder : engineHolders.values()) {
+            holder.engine = null;
+        }
+        engineHolders.clear();
+    }
+    
+    static class ScriptEngineHolder {
+        ScriptEngine engine;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/f66375e9/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptLanguage.java
----------------------------------------------------------------------
diff --git a/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptLanguage.java b/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptLanguage.java
index c463cb8..171b63a 100644
--- a/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptLanguage.java
+++ b/components/camel-script/src/main/java/org/apache/camel/builder/script/ScriptLanguage.java
@@ -18,6 +18,7 @@ package org.apache.camel.builder.script;
 
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.support.LanguageSupport;
 
 /**
@@ -32,12 +33,24 @@ public class ScriptLanguage extends LanguageSupport {
 
     public Predicate createPredicate(String expression) {
         expression = loadResource(expression);
-        return new ScriptBuilder(language, expression);
+        ScriptBuilder builder = new ScriptBuilder(language, expression);
+        try {
+            getCamelContext().addService(builder);
+        } catch (Exception ex) {
+            throw new RuntimeCamelException(ex);
+        }
+        return builder;
     }
 
     public Expression createExpression(String expression) {
         expression = loadResource(expression);
-        return new ScriptBuilder(language, expression);
+        ScriptBuilder builder = new ScriptBuilder(language, expression);
+        try {
+            getCamelContext().addService(builder);
+        } catch (Exception ex) {
+            throw new RuntimeCamelException(ex);
+        }
+        return builder;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/f66375e9/components/camel-script/src/test/java/org/apache/camel/builder/script/JavaScriptExpressionTest.java
----------------------------------------------------------------------
diff --git a/components/camel-script/src/test/java/org/apache/camel/builder/script/JavaScriptExpressionTest.java b/components/camel-script/src/test/java/org/apache/camel/builder/script/JavaScriptExpressionTest.java
index 9581c6f..d02b1c2 100644
--- a/components/camel-script/src/test/java/org/apache/camel/builder/script/JavaScriptExpressionTest.java
+++ b/components/camel-script/src/test/java/org/apache/camel/builder/script/JavaScriptExpressionTest.java
@@ -18,6 +18,8 @@ package org.apache.camel.builder.script;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 import org.apache.camel.ScriptTestHelper;
 import org.apache.camel.builder.RouteBuilder;
@@ -146,7 +148,38 @@ public class JavaScriptExpressionTest extends CamelTestSupport {
 
         assertMockEndpointsSatisfied();
     }
-
+    
+    @Test
+    public void testSendingRequestInMutipleThreads() throws Exception {
+        if (!ScriptTestHelper.canRunTestOnThisPlatform()) {
+            return;
+        }
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+        getMockEndpoint("mock:unmatched").expectedMessageCount(100);
+        long start = System.currentTimeMillis();
+        ExecutorService executorService = Executors.newFixedThreadPool(100);
+        for (int i = 0; i < 100; i++) {
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    Map<String, Object> headers = new HashMap<String, Object>();
+                    String arguments = "foo";
+                    headers.put(ScriptBuilder.ARGUMENTS, arguments);
+    
+                    sendBody("direct:start", "hello", headers);
+                    
+                }
+                
+            });
+        }
+            
+        assertMockEndpointsSatisfied();
+        long delta = System.currentTimeMillis() - start;
+        log.info("Processing the 100 request tooks: " + delta + " ms");
+        executorService.shutdown();
+        
+    }
+    
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {