Add start of an itest to show dynamically creating SCA artifacts programatically

git-svn-id: https://svn.apache.org/repos/asf/tuscany/sca-java-2.x/trunk@1367910 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/testing/itest/dynamic/pom.xml b/testing/itest/dynamic/pom.xml
new file mode 100644
index 0000000..d44be9a
--- /dev/null
+++ b/testing/itest/dynamic/pom.xml
@@ -0,0 +1,43 @@
+<?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>2.5-SNAPSHOT</version>

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

+    </parent>

+    <artifactId>itest-dynamic</artifactId>

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

+

+    <dependencies>

+        <dependency>

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

+            <artifactId>tuscany-base-runtime</artifactId>

+            <version>2.5-SNAPSHOT</version>

+        </dependency>

+        <dependency>

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

+            <artifactId>tuscany-binding-ws-runtime-axis2</artifactId>

+            <version>2.5-SNAPSHOT</version>

+        </dependency>

+    </dependencies>

+</project>

diff --git a/testing/itest/dynamic/src/test/java/sample/Helloworld.java b/testing/itest/dynamic/src/test/java/sample/Helloworld.java
new file mode 100644
index 0000000..f4e8c50
--- /dev/null
+++ b/testing/itest/dynamic/src/test/java/sample/Helloworld.java
@@ -0,0 +1,28 @@
+/*

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

+

+import org.oasisopen.sca.annotation.Remotable;

+

+@Remotable

+public interface Helloworld {

+

+    String sayHello(String name);

+

+}

diff --git a/testing/itest/dynamic/src/test/java/sample/HelloworldImpl.java b/testing/itest/dynamic/src/test/java/sample/HelloworldImpl.java
new file mode 100644
index 0000000..d5430fb
--- /dev/null
+++ b/testing/itest/dynamic/src/test/java/sample/HelloworldImpl.java
@@ -0,0 +1,29 @@
+/*

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

+

+

+public class HelloworldImpl implements Helloworld {

+

+    public String sayHello(String name) {

+        return "Hello " + name;

+    }

+    

+

+}

diff --git a/testing/itest/dynamic/src/test/java/test/ComponentTestCase.java b/testing/itest/dynamic/src/test/java/test/ComponentTestCase.java
new file mode 100644
index 0000000..096317e
--- /dev/null
+++ b/testing/itest/dynamic/src/test/java/test/ComponentTestCase.java
@@ -0,0 +1,113 @@
+/*

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

+

+import javax.xml.namespace.QName;

+

+import junit.framework.Assert;

+import junit.framework.TestCase;

+

+import org.apache.tuscany.sca.Node;

+import org.apache.tuscany.sca.TuscanyRuntime;

+import org.apache.tuscany.sca.assembly.AssemblyFactory;

+import org.apache.tuscany.sca.assembly.Component;

+import org.apache.tuscany.sca.assembly.Composite;

+import org.apache.tuscany.sca.contribution.Contribution;

+import org.apache.tuscany.sca.contribution.ContributionFactory;

+import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;

+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;

+import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;

+import org.apache.tuscany.sca.core.ExtensionPointRegistry;

+import org.apache.tuscany.sca.core.FactoryExtensionPoint;

+import org.apache.tuscany.sca.implementation.java.JavaImplementation;

+import org.apache.tuscany.sca.implementation.java.JavaImplementationFactory;

+import org.junit.Test;

+

+import sample.Helloworld;

+import sample.HelloworldImpl;

+

+/**

+ * Shows programatically creating a contribution, composite and component, starting the composite and

+ * then test invoking the components service.  

+ */

+public class ComponentTestCase extends TestCase {

+

+    private TuscanyRuntime tuscanyRuntime;

+    private ExtensionPointRegistry extensionPoints;

+    private FactoryExtensionPoint modelFactories;

+    private Node node;

+

+    @Override

+    protected void setUp() throws Exception {

+        tuscanyRuntime = TuscanyRuntime.newInstance();

+        extensionPoints = tuscanyRuntime.getExtensionPointRegistry();

+        modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);

+        node = tuscanyRuntime.createNode();

+    }

+

+    @Test

+    public void testInvoke() throws Exception {

+

+        // Create a contribution

+        ContributionFactory contributionFactory = modelFactories.getFactory(ContributionFactory.class);

+        Contribution contribution = contributionFactory.createContribution();

+        contribution.setURI("testContribution");

+        ModelResolverExtensionPoint modelResolvers = extensionPoints.getExtensionPoint(ModelResolverExtensionPoint.class);

+        ModelResolver modelResolver = new ExtensibleModelResolver(contribution, modelResolvers, modelFactories);

+        contribution.setModelResolver(modelResolver);

+        contribution.setClassLoader(Helloworld.class.getClassLoader());

+

+        // Create a composite

+        AssemblyFactory assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);

+        Composite composite = assemblyFactory.createComposite();

+        composite.setURI("testComposite");

+        composite.setName(new QName("testComposite"));

+

+        // create a component

+        Component component = assemblyFactory.createComponent();

+        component.setName("testComponent");        

+        

+        // create an implementation and set it on the component

+        JavaImplementationFactory javaImplementationFactory = modelFactories.getFactory(JavaImplementationFactory.class);

+        JavaImplementation javaImplementation = javaImplementationFactory.createJavaImplementation(HelloworldImpl.class);

+        javaImplementation.setJavaClass(HelloworldImpl.class);

+        component.setImplementation(javaImplementation);

+

+        // add the component to the composite

+        composite.getComponents().add(component);

+

+        // add the composite to the contribution

+        contribution.addComposite(composite);

+

+        // Now install the contribution and start the composite

+        node.installContribution(contribution, null);

+        node.startComposite(contribution.getURI(), composite.getURI());

+

+        // test that the service has started and can be invoked

+        Helloworld service = node.getService(Helloworld.class, "testComponent/Helloworld");

+        Assert.assertEquals("Hello Ariana", service.sayHello("Ariana"));

+    }

+

+    @Override

+    protected void tearDown() throws Exception {

+        node.stop();

+        tuscanyRuntime.stop();

+    }

+

+}