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 2014/02/24 07:25:32 UTC

[1/3] git commit: CAMEL-7238 Added OSGi integration for camel-base64 with thanks to Filippo

Repository: camel
Updated Branches:
  refs/heads/camel-2.11.x d2fb2296b -> 06734f1d3
  refs/heads/camel-2.12.x 4862a5fe9 -> 6de2fba64


CAMEL-7238 Added OSGi integration for camel-base64 with thanks to Filippo


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

Branch: refs/heads/camel-2.12.x
Commit: 87af7ccc24ee43999149e5c8d119662d4758e61f
Parents: 4862a5f
Author: Willem Jiang <wi...@gmail.com>
Authored: Mon Feb 24 11:59:44 2014 +0800
Committer: Willem Jiang <wi...@gmail.com>
Committed: Mon Feb 24 14:18:50 2014 +0800

----------------------------------------------------------------------
 tests/camel-itest-osgi/pom.xml                  |  15 +-
 .../camel/itest/osgi/base64/Base64Test.java     | 187 +++++++++++++++++++
 2 files changed, 197 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/87af7ccc/tests/camel-itest-osgi/pom.xml
----------------------------------------------------------------------
diff --git a/tests/camel-itest-osgi/pom.xml b/tests/camel-itest-osgi/pom.xml
index f662aa2..bddeb8c 100644
--- a/tests/camel-itest-osgi/pom.xml
+++ b/tests/camel-itest-osgi/pom.xml
@@ -251,12 +251,17 @@
       <artifactId>camel-xmljson</artifactId>
       <scope>test</scope>
     </dependency>
-	<dependency>
-	  <groupId>org.apache.camel.tests</groupId>
-	  <artifactId>org.apache.camel.tests.mock-javamail_1.7</artifactId>
-	  <scope>test</scope>
+    <dependency>
+      <groupId>org.apache.camel.tests</groupId>
+      <artifactId>org.apache.camel.tests.mock-javamail_1.7</artifactId>
+      <scope>test</scope>
     </dependency>
-	<dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-base64</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context-support</artifactId>      
       <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/camel/blob/87af7ccc/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/base64/Base64Test.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/base64/Base64Test.java b/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/base64/Base64Test.java
new file mode 100644
index 0000000..3aeb53c
--- /dev/null
+++ b/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/base64/Base64Test.java
@@ -0,0 +1,187 @@
+/**
+ * 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.itest.osgi.base64;
+
+import static org.ops4j.pax.exam.OptionUtils.combine;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.dataformat.base64.Base64DataFormat;
+import org.apache.camel.itest.osgi.OSGiIntegrationTestSupport;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+
+@RunWith(JUnit4TestRunner.class)
+public class Base64Test extends OSGiIntegrationTestSupport {
+
+	private static final String ENCODED = "IrRWhNZNjFxQ6WXJEIsehbnFdurtgacAq+t6Zh3uYlyclF3HAx995mbIydQlymM8V3yA+Yb1p3Ij\r\n"
+			+ "7AS1VQaUNHAljNpHUqrWR6EmASZV/EQvR5Gk8XDvRrrtkoDm+jdZ/XKfest2OIzhixZF1mcqyi1P\r\n"
+			+ "Hep/rFnVPclO9WOWtCCRhz+U2soBzNBtvTc6x1pz1gOZcoOEFKHSf2kmkq1/7hHFl5Cb9nbSBgyp\r\n"
+			+ "lFzsInVBfCkRxXAFixwbC3B+LB8e15zSMvoG6okyDs7C8QShIZCXGHlsuUiH96izUbfB8qpTQK80\r\n"
+			+ "PPAisxYhF/gb678wvO5e/03AmFmYbBqzwoNQ6PoZKFI8a4PUrLoCLrUnKQgwOXueb1y8d4bsVGrX\r\n"
+			+ "H5QUFgAE3yZEn2ZQtVv6bZnm3lvBe/LLRD4xIU2Pcm5e+DJUZhHcl/8MaioDWFgYPLftDKvEUwLB\r\n"
+			+ "3IFWLSKMKFoeXn2nkwxsCHrzhajhbkKl1+H9I7Gkd19DyAoPIriWOJScog+mcP0iqG9iMqYFko2n\r\n"
+			+ "rh2rr+jcyKFBhrRUuNw3W8+h+FOwZDLcBmuTv2lEOvUdaPgD+1e6fXpuxhiih4wf/zlakeVa031T\r\n"
+			+ "9c0/HN02z0cAhLT1vtEA0zDn6OzzhY//Mh332ZmC+xro+e9o2a6+dnwamDtLuRgDDd+EcoUQpfEL\r\n"
+			+ "XobX3ZSX7OQw1ZXxWiJLtSOc5yLRkdbxdLK/C6fkcY4cqc/RwBGYtXN7Z1ENG/s/LnrZnRU/ErMW\r\n"
+			+ "RtbRwehA/0a2KSbNOMwK8BpzDruXufLXZcGaDKRUektQfdX4XhhYESt1drewlQLVaEWrZBR8JOd5\r\n"
+			+ "mckulPhwHp2Q00YyoScEj6Rs/9siyv49/FSaRCbnfzl3CRnNvCOD1cvF4OneYbVJCMOY49ucFmN/\r\n"
+			+ "mBCyxLOtJ4Zz8EG1FC81QTg3Scw+FdFDsCgr7DqVrmPOLikqq6wJdLBjyHXuMiVP9Fq/aAxvXEgj\r\n"
+			+ "RuVnN20wn2tUOXeaN4XqziQ66M229HsY0BX5riJ00yXArDxd+I9mFDpw/UDnGBAE2P//1fU1ns1A\r\n"
+			+ "6zQ6hTv7axdlw3/FnOAdymEKqED9CPfbiDvJygcAcxv2fyORHQ+TiprMGxckAlnLZ2pGl+gOzbtZ\r\n"
+			+ "zJgecyFJHBbhtkubGD4zzQhuJJw8ypqppSxqDs8SAW2frj42UT9qRMeCBGXLa1wyISt4GI6iOnfw\r\n"
+			+ "TCRJ/SE7CVrEfmdmROlJpAJHfUlQIJq1aW3mTE5zTmAygypxRUDCmA+eY9wdCicFp6YptdCEK3P2\r\n"
+			+ "7QzZsSASAByd5jxHMiIBkdwGzj1501xZ7hFLJDXDTQ==\r\n";
+
+	private static final byte[] DECODED = { 34, -76, 86, -124, -42, 77, -116,
+			92, 80, -23, 101, -55, 16, -117, 30, -123, -71, -59, 118, -22, -19,
+			-127, -89, 0, -85, -21, 122, 102, 29, -18, 98, 92, -100, -108, 93,
+			-57, 3, 31, 125, -26, 102, -56, -55, -44, 37, -54, 99, 60, 87, 124,
+			-128, -7, -122, -11, -89, 114, 35, -20, 4, -75, 85, 6, -108, 52,
+			112, 37, -116, -38, 71, 82, -86, -42, 71, -95, 38, 1, 38, 85, -4,
+			68, 47, 71, -111, -92, -15, 112, -17, 70, -70, -19, -110, -128,
+			-26, -6, 55, 89, -3, 114, -97, 122, -53, 118, 56, -116, -31, -117,
+			22, 69, -42, 103, 42, -54, 45, 79, 29, -22, 127, -84, 89, -43, 61,
+			-55, 78, -11, 99, -106, -76, 32, -111, -121, 63, -108, -38, -54, 1,
+			-52, -48, 109, -67, 55, 58, -57, 90, 115, -42, 3, -103, 114, -125,
+			-124, 20, -95, -46, 127, 105, 38, -110, -83, 127, -18, 17, -59,
+			-105, -112, -101, -10, 118, -46, 6, 12, -87, -108, 92, -20, 34,
+			117, 65, 124, 41, 17, -59, 112, 5, -117, 28, 27, 11, 112, 126, 44,
+			31, 30, -41, -100, -46, 50, -6, 6, -22, -119, 50, 14, -50, -62,
+			-15, 4, -95, 33, -112, -105, 24, 121, 108, -71, 72, -121, -9, -88,
+			-77, 81, -73, -63, -14, -86, 83, 64, -81, 52, 60, -16, 34, -77, 22,
+			33, 23, -8, 27, -21, -65, 48, -68, -18, 94, -1, 77, -64, -104, 89,
+			-104, 108, 26, -77, -62, -125, 80, -24, -6, 25, 40, 82, 60, 107,
+			-125, -44, -84, -70, 2, 46, -75, 39, 41, 8, 48, 57, 123, -98, 111,
+			92, -68, 119, -122, -20, 84, 106, -41, 31, -108, 20, 22, 0, 4, -33,
+			38, 68, -97, 102, 80, -75, 91, -6, 109, -103, -26, -34, 91, -63,
+			123, -14, -53, 68, 62, 49, 33, 77, -113, 114, 110, 94, -8, 50, 84,
+			102, 17, -36, -105, -1, 12, 106, 42, 3, 88, 88, 24, 60, -73, -19,
+			12, -85, -60, 83, 2, -63, -36, -127, 86, 45, 34, -116, 40, 90, 30,
+			94, 125, -89, -109, 12, 108, 8, 122, -13, -123, -88, -31, 110, 66,
+			-91, -41, -31, -3, 35, -79, -92, 119, 95, 67, -56, 10, 15, 34, -72,
+			-106, 56, -108, -100, -94, 15, -90, 112, -3, 34, -88, 111, 98, 50,
+			-90, 5, -110, -115, -89, -82, 29, -85, -81, -24, -36, -56, -95, 65,
+			-122, -76, 84, -72, -36, 55, 91, -49, -95, -8, 83, -80, 100, 50,
+			-36, 6, 107, -109, -65, 105, 68, 58, -11, 29, 104, -8, 3, -5, 87,
+			-70, 125, 122, 110, -58, 24, -94, -121, -116, 31, -1, 57, 90, -111,
+			-27, 90, -45, 125, 83, -11, -51, 63, 28, -35, 54, -49, 71, 0, -124,
+			-76, -11, -66, -47, 0, -45, 48, -25, -24, -20, -13, -123, -113, -1,
+			50, 29, -9, -39, -103, -126, -5, 26, -24, -7, -17, 104, -39, -82,
+			-66, 118, 124, 26, -104, 59, 75, -71, 24, 3, 13, -33, -124, 114,
+			-123, 16, -91, -15, 11, 94, -122, -41, -35, -108, -105, -20, -28,
+			48, -43, -107, -15, 90, 34, 75, -75, 35, -100, -25, 34, -47, -111,
+			-42, -15, 116, -78, -65, 11, -89, -28, 113, -114, 28, -87, -49,
+			-47, -64, 17, -104, -75, 115, 123, 103, 81, 13, 27, -5, 63, 46,
+			122, -39, -99, 21, 63, 18, -77, 22, 70, -42, -47, -63, -24, 64, -1,
+			70, -74, 41, 38, -51, 56, -52, 10, -16, 26, 115, 14, -69, -105,
+			-71, -14, -41, 101, -63, -102, 12, -92, 84, 122, 75, 80, 125, -43,
+			-8, 94, 24, 88, 17, 43, 117, 118, -73, -80, -107, 2, -43, 104, 69,
+			-85, 100, 20, 124, 36, -25, 121, -103, -55, 46, -108, -8, 112, 30,
+			-99, -112, -45, 70, 50, -95, 39, 4, -113, -92, 108, -1, -37, 34,
+			-54, -2, 61, -4, 84, -102, 68, 38, -25, 127, 57, 119, 9, 25, -51,
+			-68, 35, -125, -43, -53, -59, -32, -23, -34, 97, -75, 73, 8, -61,
+			-104, -29, -37, -100, 22, 99, 127, -104, 16, -78, -60, -77, -83,
+			39, -122, 115, -16, 65, -75, 20, 47, 53, 65, 56, 55, 73, -52, 62,
+			21, -47, 67, -80, 40, 43, -20, 58, -107, -82, 99, -50, 46, 41, 42,
+			-85, -84, 9, 116, -80, 99, -56, 117, -18, 50, 37, 79, -12, 90, -65,
+			104, 12, 111, 92, 72, 35, 70, -27, 103, 55, 109, 48, -97, 107, 84,
+			57, 119, -102, 55, -123, -22, -50, 36, 58, -24, -51, -74, -12, 123,
+			24, -48, 21, -7, -82, 34, 116, -45, 37, -64, -84, 60, 93, -8, -113,
+			102, 20, 58, 112, -3, 64, -25, 24, 16, 4, -40, -1, -1, -43, -11,
+			53, -98, -51, 64, -21, 52, 58, -123, 59, -5, 107, 23, 101, -61,
+			127, -59, -100, -32, 29, -54, 97, 10, -88, 64, -3, 8, -9, -37,
+			-120, 59, -55, -54, 7, 0, 115, 27, -10, 127, 35, -111, 29, 15,
+			-109, -118, -102, -52, 27, 23, 36, 2, 89, -53, 103, 106, 70, -105,
+			-24, 14, -51, -69, 89, -52, -104, 30, 115, 33, 73, 28, 22, -31,
+			-74, 75, -101, 24, 62, 51, -51, 8, 110, 36, -100, 60, -54, -102,
+			-87, -91, 44, 106, 14, -49, 18, 1, 109, -97, -82, 62, 54, 81, 63,
+			106, 68, -57, -126, 4, 101, -53, 107, 92, 50, 33, 43, 120, 24,
+			-114, -94, 58, 119, -16, 76, 36, 73, -3, 33, 59, 9, 90, -60, 126,
+			103, 102, 68, -23, 73, -92, 2, 71, 125, 73, 80, 32, -102, -75, 105,
+			109, -26, 76, 78, 115, 78, 96, 50, -125, 42, 113, 69, 64, -62,
+			-104, 15, -98, 99, -36, 29, 10, 39, 5, -89, -90, 41, -75, -48,
+			-124, 43, 115, -10, -19, 12, -39, -79, 32, 18, 0, 28, -99, -26, 60,
+			71, 50, 34, 1, -111, -36, 6, -50, 61, 121, -45, 92, 89, -18, 17,
+			75, 36, 53, -61, 77 };
+
+	public Base64DataFormat format = new Base64DataFormat();
+
+	@EndpointInject(uri = "mock:result")
+	private MockEndpoint result;
+
+	public void runEncoderTest(byte[] raw, byte[] expected) throws Exception {
+		result.setExpectedMessageCount(1);
+
+		template.sendBody("direct:startEncode", raw);
+
+		assertMockEndpointsSatisfied();
+
+		byte[] encoded = result.getReceivedExchanges().get(0).getIn()
+				.getBody(byte[].class);
+		assertArrayEquals(expected, encoded);
+	}
+
+	public void runDecoderTest(byte[] encoded, byte[] expected)
+			throws Exception {
+		result.setExpectedMessageCount(1);
+
+		template.sendBody("direct:startDecode", encoded);
+
+		assertMockEndpointsSatisfied();
+
+		byte[] decoded = result.getReceivedExchanges().get(0).getIn()
+				.getBody(byte[].class);
+		assertArrayEquals(expected, decoded);
+	}
+
+	@Test
+	public void testEncode() throws Exception {
+		runEncoderTest(DECODED, ENCODED.getBytes());
+	}
+
+	@Test
+	public void testDecode() throws Exception {
+		runDecoderTest(ENCODED.getBytes(), DECODED);
+	}
+
+	@Override
+	protected RouteBuilder createRouteBuilder() throws Exception {
+		return new RouteBuilder() {
+
+			@Override
+			public void configure() throws Exception {
+				from("direct:startEncode").marshal(format).to("mock:result");
+
+				from("direct:startDecode").unmarshal(format).to("mock:result");
+			}
+		};
+	}
+
+	@Configuration
+	public static Option[] configure() {
+		Option[] options = combine(getDefaultCamelKarafOptions(),
+				loadCamelFeatures("camel-base64"));
+
+		return options;
+	}
+
+}


[3/3] git commit: CAMEL-7239 Address the SchemaFactory thread safe issue.

Posted by ni...@apache.org.
CAMEL-7239 Address the SchemaFactory thread safe issue.


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

Branch: refs/heads/camel-2.11.x
Commit: 06734f1d3ce1f780f3648e5f93719fa4516e9bd1
Parents: d2fb229
Author: Willem Jiang <wi...@gmail.com>
Authored: Mon Feb 24 12:46:32 2014 +0800
Committer: Willem Jiang <wi...@gmail.com>
Committed: Mon Feb 24 14:23:15 2014 +0800

----------------------------------------------------------------------
 .../validation/ValidatingProcessor.java         | 35 +++++++++++++++-----
 .../component/validator/ValidatorRouteTest.java | 30 +++++++++++++++++
 2 files changed, 57 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/06734f1d/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
index ee15fb4..243206b 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
@@ -23,6 +23,7 @@ import java.io.InputStream;
 import java.io.StringWriter;
 import java.net.URL;
 import java.util.Collections;
+
 import javax.xml.XMLConstants;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.Result;
@@ -40,6 +41,7 @@ import javax.xml.validation.Validator;
 
 import org.w3c.dom.Node;
 import org.w3c.dom.ls.LSResourceResolver;
+
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 
@@ -53,6 +55,7 @@ import org.apache.camel.util.IOHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+
 /**
  * A processor which validates the XML version of the inbound message body
  * against some schema either in XSD or RelaxNG
@@ -61,9 +64,9 @@ public class ValidatingProcessor implements Processor {
     private static final Logger LOG = LoggerFactory.getLogger(ValidatingProcessor.class);
     private XmlConverter converter = new XmlConverter();
     private String schemaLanguage = XMLConstants.W3C_XML_SCHEMA_NS_URI;
-    private Schema schema;
+    private volatile Schema schema;
     private Source schemaSource;
-    private SchemaFactory schemaFactory;
+    private volatile SchemaFactory schemaFactory;
     private URL schemaUrl;
     private File schemaFile;
     private byte[] schemaAsByteArray;
@@ -175,7 +178,11 @@ public class ValidatingProcessor implements Processor {
 
     public Schema getSchema() throws IOException, SAXException {
         if (schema == null) {
-            schema = createSchema();
+            synchronized (this) {
+                if (schema == null) {
+                    schema = createSchema();
+                }
+            }
         }
         return schema;
     }
@@ -229,7 +236,11 @@ public class ValidatingProcessor implements Processor {
 
     public SchemaFactory getSchemaFactory() {
         if (schemaFactory == null) {
-            schemaFactory = createSchemaFactory();
+            synchronized (this) {
+                if (schemaFactory == null) {
+                    schemaFactory = createSchemaFactory();
+                }
+            }
         }
         return schemaFactory;
     }
@@ -321,21 +332,29 @@ public class ValidatingProcessor implements Processor {
 
         URL url = getSchemaUrl();
         if (url != null) {
-            return factory.newSchema(url);
+            synchronized (this) {
+                return factory.newSchema(url);
+            }
         }
 
         File file = getSchemaFile();
         if (file != null) {
-            return factory.newSchema(file);
+            synchronized (this) {
+                return factory.newSchema(file);
+            }
         }
 
         byte[] bytes = getSchemaAsByteArray();
         if (bytes != null) {
-            return factory.newSchema(new StreamSource(new ByteArrayInputStream(schemaAsByteArray)));
+            synchronized (this) {
+                return factory.newSchema(new StreamSource(new ByteArrayInputStream(schemaAsByteArray)));
+            }
         }
 
         Source source = getSchemaSource();
-        return factory.newSchema(source);
+        synchronized (this) {
+            return factory.newSchema(source);
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/camel/blob/06734f1d/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java b/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
index 036704f..aa78644 100644
--- a/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
+++ b/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
@@ -16,6 +16,11 @@
  */
 package org.apache.camel.component.validator;
 
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
@@ -129,6 +134,31 @@ public class ValidatorRouteTest extends ContextTestSupport {
 
         MockEndpoint.assertIsSatisfied(validEndpoint, invalidEndpoint, finallyEndpoint);
     }
+    
+    public void testConcurrentUseNotASharedSchema() throws Exception {
+        validEndpoint.expectedMessageCount(10);
+        // latch for the 10 exchanges we expect
+        final CountDownLatch latch = new CountDownLatch(10);
+        // setup a task executor to be able send the messages in parallel
+        ExecutorService executor = Executors.newCachedThreadPool();
+        for (int i = 0; i < 10; i++) {
+            executor.execute(new Runnable() {
+                public void run() {
+                    template.requestBody("direct:useNotASharedSchema", "<mail xmlns='http://foo.com/bar'><subject>Hey</subject><body>Hello world!</body></mail>");
+                    latch.countDown();
+                }
+            });
+        }
+
+        try {
+            // wait for test completion, timeout after 30 sec to let other unit test run to not wait forever
+            assertTrue(latch.await(30000L, TimeUnit.MILLISECONDS));
+            assertEquals("Latch should be zero", 0, latch.getCount());
+        } finally {
+            executor.shutdown();
+        }
+        MockEndpoint.assertIsSatisfied(validEndpoint, invalidEndpoint, finallyEndpoint);
+    }
 
     @Override
     protected void setUp() throws Exception {


[2/3] git commit: CAMEL-7239 Address the SchemaFactory thread safe issue.

Posted by ni...@apache.org.
CAMEL-7239 Address the SchemaFactory thread safe issue.


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

Branch: refs/heads/camel-2.12.x
Commit: 6de2fba644c5dfcc4fdc953e2331cb5ab05ba747
Parents: 87af7cc
Author: Willem Jiang <wi...@gmail.com>
Authored: Mon Feb 24 12:46:32 2014 +0800
Committer: Willem Jiang <wi...@gmail.com>
Committed: Mon Feb 24 14:18:57 2014 +0800

----------------------------------------------------------------------
 .../validation/ValidatingProcessor.java         | 36 +++++++++++++++-----
 .../component/validator/ValidatorRouteTest.java | 30 ++++++++++++++++
 2 files changed, 57 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/6de2fba6/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
index 200d0fe..a730915 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
@@ -23,6 +23,7 @@ import java.io.InputStream;
 import java.io.StringWriter;
 import java.net.URL;
 import java.util.Collections;
+
 import javax.xml.XMLConstants;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.Result;
@@ -40,6 +41,7 @@ import javax.xml.validation.Validator;
 
 import org.w3c.dom.Node;
 import org.w3c.dom.ls.LSResourceResolver;
+
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 
@@ -52,10 +54,10 @@ import org.apache.camel.TypeConverter;
 import org.apache.camel.converter.jaxp.XmlConverter;
 import org.apache.camel.util.AsyncProcessorHelper;
 import org.apache.camel.util.IOHelper;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+
 /**
  * A processor which validates the XML version of the inbound message body
  * against some schema either in XSD or RelaxNG
@@ -64,9 +66,9 @@ public class ValidatingProcessor implements AsyncProcessor {
     private static final Logger LOG = LoggerFactory.getLogger(ValidatingProcessor.class);
     private XmlConverter converter = new XmlConverter();
     private String schemaLanguage = XMLConstants.W3C_XML_SCHEMA_NS_URI;
-    private Schema schema;
+    private volatile Schema schema;
     private Source schemaSource;
-    private SchemaFactory schemaFactory;
+    private volatile SchemaFactory schemaFactory;
     private URL schemaUrl;
     private File schemaFile;
     private byte[] schemaAsByteArray;
@@ -192,7 +194,11 @@ public class ValidatingProcessor implements AsyncProcessor {
 
     public Schema getSchema() throws IOException, SAXException {
         if (schema == null) {
-            schema = createSchema();
+            synchronized (this) {
+                if (schema == null) {
+                    schema = createSchema();
+                }
+            }
         }
         return schema;
     }
@@ -246,7 +252,11 @@ public class ValidatingProcessor implements AsyncProcessor {
 
     public SchemaFactory getSchemaFactory() {
         if (schemaFactory == null) {
-            schemaFactory = createSchemaFactory();
+            synchronized (this) {
+                if (schemaFactory == null) {
+                    schemaFactory = createSchemaFactory();
+                }
+            }
         }
         return schemaFactory;
     }
@@ -338,21 +348,29 @@ public class ValidatingProcessor implements AsyncProcessor {
 
         URL url = getSchemaUrl();
         if (url != null) {
-            return factory.newSchema(url);
+            synchronized (this) {
+                return factory.newSchema(url);
+            }
         }
 
         File file = getSchemaFile();
         if (file != null) {
-            return factory.newSchema(file);
+            synchronized (this) {
+                return factory.newSchema(file);
+            }
         }
 
         byte[] bytes = getSchemaAsByteArray();
         if (bytes != null) {
-            return factory.newSchema(new StreamSource(new ByteArrayInputStream(schemaAsByteArray)));
+            synchronized (this) {
+                return factory.newSchema(new StreamSource(new ByteArrayInputStream(schemaAsByteArray)));
+            }
         }
 
         Source source = getSchemaSource();
-        return factory.newSchema(source);
+        synchronized (this) {
+            return factory.newSchema(source);
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/camel/blob/6de2fba6/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java b/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
index 036704f..aa78644 100644
--- a/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
+++ b/camel-core/src/test/java/org/apache/camel/component/validator/ValidatorRouteTest.java
@@ -16,6 +16,11 @@
  */
 package org.apache.camel.component.validator;
 
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
@@ -129,6 +134,31 @@ public class ValidatorRouteTest extends ContextTestSupport {
 
         MockEndpoint.assertIsSatisfied(validEndpoint, invalidEndpoint, finallyEndpoint);
     }
+    
+    public void testConcurrentUseNotASharedSchema() throws Exception {
+        validEndpoint.expectedMessageCount(10);
+        // latch for the 10 exchanges we expect
+        final CountDownLatch latch = new CountDownLatch(10);
+        // setup a task executor to be able send the messages in parallel
+        ExecutorService executor = Executors.newCachedThreadPool();
+        for (int i = 0; i < 10; i++) {
+            executor.execute(new Runnable() {
+                public void run() {
+                    template.requestBody("direct:useNotASharedSchema", "<mail xmlns='http://foo.com/bar'><subject>Hey</subject><body>Hello world!</body></mail>");
+                    latch.countDown();
+                }
+            });
+        }
+
+        try {
+            // wait for test completion, timeout after 30 sec to let other unit test run to not wait forever
+            assertTrue(latch.await(30000L, TimeUnit.MILLISECONDS));
+            assertEquals("Latch should be zero", 0, latch.getCount());
+        } finally {
+            executor.shutdown();
+        }
+        MockEndpoint.assertIsSatisfied(validEndpoint, invalidEndpoint, finallyEndpoint);
+    }
 
     @Override
     protected void setUp() throws Exception {