Wanted to try some concurrent calls to an COMPOSITE scoped component to make sure it runs OK so though it may be useful to start a test for it. Don't think we have one already. If someone can point me at one I can just ditch this. Not in the build yet.  

git-svn-id: https://svn.apache.org/repos/asf/tuscany/sca-java-1.x/trunk@1029756 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/itest/concurrency/pom.xml b/itest/concurrency/pom.xml
new file mode 100644
index 0000000..0036810
--- /dev/null
+++ b/itest/concurrency/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+    * 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.    

+-->

+<project>

+    <modelVersion>4.0.0</modelVersion>

+    <parent>

+        <groupId>org.apache.tuscany.sca</groupId>

+        <artifactId>tuscany-itest</artifactId>

+        <version>1.7-SNAPSHOT</version>

+        <relativePath>../pom.xml</relativePath>

+    </parent>

+    <artifactId>itest-concurrency</artifactId>

+    <name>Apache Tuscany SCA iTest Concurrency</name>

+

+    <dependencies>

+        <dependency>

+            <groupId>org.apache.tuscany.sca</groupId>

+            <artifactId>tuscany-node-api</artifactId>

+            <version>1.7-SNAPSHOT</version>

+        </dependency>

+

+        <dependency>

+            <groupId>org.apache.tuscany.sca</groupId>

+            <artifactId>tuscany-node-impl</artifactId>

+            <version>1.7-SNAPSHOT</version>

+            <scope>runtime</scope>

+        </dependency>

+        

+        <dependency>

+            <groupId>org.apache.tuscany.sca</groupId>

+            <artifactId>tuscany-implementation-java-runtime</artifactId>

+            <version>1.7-SNAPSHOT</version>

+            <scope>runtime</scope>

+        </dependency> 

+

+        <dependency>

+            <groupId>junit</groupId>

+            <artifactId>junit</artifactId>

+            <version>4.5</version>

+            <scope>test</scope>

+        </dependency>     

+

+    </dependencies>

+</project>

diff --git a/itest/concurrency/src/main/java/helloworld/HelloWorldClientImpl.java b/itest/concurrency/src/main/java/helloworld/HelloWorldClientImpl.java
new file mode 100644
index 0000000..9d243b8
--- /dev/null
+++ b/itest/concurrency/src/main/java/helloworld/HelloWorldClientImpl.java
@@ -0,0 +1,78 @@
+/*

+ * 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 helloworld;

+

+import java.util.concurrent.CountDownLatch;

+

+import org.osoa.sca.annotations.Reference;

+import org.osoa.sca.annotations.Service;

+

+/**

+ * This class implements the HelloWorld service.

+ */

+@Service(HelloWorldService.class)

+public class HelloWorldClientImpl implements HelloWorldService {

+    

+    @Reference

+    protected HelloWorldService helloworld;

+    

+    CountDownLatch resultsReceivedCountdown;

+    

+    private static int threadCount = 1000;

+

+    public String getGreetings(String name) {

+    	resultsReceivedCountdown = new CountDownLatch(threadCount);

+

+        SendRequest[] requests = new SendRequest[threadCount];

+        for (int i=0; i < threadCount; i++){

+        	requests[i] = new SendRequest(name+i);

+        }

+        

+        long start = System.currentTimeMillis();

+        

+        for (int i=0; i < threadCount; i++){

+        	new Thread(requests[i]).start();

+        }

+        

+        try {

+            resultsReceivedCountdown.await();

+        } catch (InterruptedException ex) {

+        }

+        

+        long stop = System.currentTimeMillis();

+        

+    	return "Time = " + (stop - start);

+    }

+    

+    public class SendRequest implements Runnable {

+    	String name;

+    	

+    	public SendRequest(String name){

+    		this.name = name;

+    	}

+    	

+    	public void run() {

+    		String response = "Client Hello " + helloworld.getGreetings(name);

+    		System.out.println(response);

+    		resultsReceivedCountdown.countDown();

+    	}

+    	

+    }

+

+}

diff --git a/itest/concurrency/src/main/java/helloworld/HelloWorldService.java b/itest/concurrency/src/main/java/helloworld/HelloWorldService.java
new file mode 100644
index 0000000..74d22ed
--- /dev/null
+++ b/itest/concurrency/src/main/java/helloworld/HelloWorldService.java
@@ -0,0 +1,30 @@
+/*

+ * 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 helloworld;

+

+import org.osoa.sca.annotations.Remotable;

+

+/**

+ * This is the business interface of the HelloWorld greetings service.

+ */

+@Remotable

+public interface HelloWorldService {

+

+    public String getGreetings(String name);

+}

diff --git a/itest/concurrency/src/main/java/helloworld/HelloWorldServiceImpl.java b/itest/concurrency/src/main/java/helloworld/HelloWorldServiceImpl.java
new file mode 100644
index 0000000..f5b17c0
--- /dev/null
+++ b/itest/concurrency/src/main/java/helloworld/HelloWorldServiceImpl.java
@@ -0,0 +1,43 @@
+/*

+ * 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 helloworld;

+

+import org.osoa.sca.annotations.Scope;

+import org.osoa.sca.annotations.Service;

+

+/**

+ * This class implements the HelloWorld service.

+ */

+@Scope("COMPOSITE")

+@Service(HelloWorldService.class)

+public class HelloWorldServiceImpl implements HelloWorldService {

+    

+    public String getGreetings(String name) {

+    	String response = "Hello " + name;

+    	System.out.println("start" + response);

+    	try{

+    		Thread.currentThread().sleep(5000);

+    	} catch (Exception ex){

+    		ex.printStackTrace();

+    	}

+    	System.out.println("start" + response);

+    	return response;

+    }

+

+}

diff --git a/itest/concurrency/src/main/resources/helloworld.composite b/itest/concurrency/src/main/resources/helloworld.composite
new file mode 100644
index 0000000..f766dd4
--- /dev/null
+++ b/itest/concurrency/src/main/resources/helloworld.composite
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+    * 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.    

+-->

+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" 

+           targetNamespace="http://itest/policy"

+           xmlns:sca="http://www.osoa.org/xmlns/sca/1.0"

+           xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"

+           xmlns:ip="http://itest/policy"

+           name="Helloworld">

+           

+    <component name="HelloWorldClientComponent">

+        <implementation.java class="helloworld.HelloWorldClientImpl" />

+        <reference name="helloworld" target="HelloWorldServiceComponent"/>

+    </component>           

+

+    <component name="HelloWorldServiceComponent">

+        <implementation.java class="helloworld.HelloWorldServiceImpl"/>

+    </component>

+    

+</composite>

diff --git a/itest/concurrency/src/test/java/org/apache/tuscany/sca/itest/ConcurrencyTestCase.java b/itest/concurrency/src/test/java/org/apache/tuscany/sca/itest/ConcurrencyTestCase.java
new file mode 100644
index 0000000..3f28ce6
--- /dev/null
+++ b/itest/concurrency/src/test/java/org/apache/tuscany/sca/itest/ConcurrencyTestCase.java
@@ -0,0 +1,63 @@
+/*

+ * 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.tuscany.sca.itest;

+

+import java.io.ByteArrayInputStream;

+

+import junit.framework.Assert;

+import helloworld.HelloWorldService;

+

+import org.apache.tuscany.sca.node.SCAClient;

+import org.apache.tuscany.sca.node.SCANode;

+import org.apache.tuscany.sca.node.SCANodeFactory;

+import org.junit.AfterClass;

+import org.junit.BeforeClass;

+import org.junit.Ignore;

+import org.junit.Test;

+

+public class ConcurrencyTestCase {

+    private static SCANode node;

+    private static HelloWorldService service;

+

+    @BeforeClass

+    public static void init() throws Exception {

+        try {

+            SCANodeFactory factory = SCANodeFactory.newInstance();

+            node = factory.createSCANodeFromClassLoader("helloworld.composite", 

+                                                        ConcurrencyTestCase.class.getClassLoader());

+            node.start();

+            

+            service = ((SCAClient)node).getService(HelloWorldService.class, "HelloWorldClientComponent");

+        } catch (Exception ex) {

+            ex.printStackTrace();

+        }

+    }

+

+    @AfterClass

+    public static void destroy() throws Exception {

+        node.stop();

+    }

+    

+    @Test

+    public void testConcurrency() {

+        String greetings = service.getGreetings("Simon");

+        System.out.println(">>>" + greetings);

+    } 

+}