From 5e04cf7908c2be7a07b15e8ffa0f8bd5caf2cff0 Mon Sep 17 00:00:00 2001 From: jsdelfino Date: Mon, 30 Aug 2010 17:18:15 +0000 Subject: Add a test case showing how to register a ProviderFactory instance. Minor cleanup, add a createNode method that takes a list of contributions and remove reference to NodeFactory implementation class. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@990870 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/tuscany/sca/node/NodeFactory.java | 7 + .../tuscany/sca/node/impl/NodeFactoryImpl.java | 8 ++ .../src/main/java/sample/impl/EmbedUtil.java | 75 +++++++---- .../src/test/java/sample/Client.java | 5 + .../src/test/java/sample/ClientTest.java | 2 +- .../src/test/java/sample/Hello.java | 5 + .../src/test/java/sample/JelloTest.java | 2 +- .../src/test/java/sample/Upper.java | 5 + .../src/test/java/sample/UpperTest.java | 2 +- .../src/test/java/sample/WelloTest.java | 2 +- .../src/test/java/sample/impl/EmbedTestCase.java | 5 +- .../test/java/sample/impl/InControlTestCase.java | 147 +++++++++++++++++++++ .../test/java/sample/impl/ReadWriteTestCase.java | 2 +- .../src/test/java/sample/impl/RunTestCase.java | 3 +- 14 files changed, 236 insertions(+), 34 deletions(-) create mode 100644 sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/InControlTestCase.java diff --git a/sandbox/sebastien/java/embed/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java b/sandbox/sebastien/java/embed/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java index 2d2df84f42..95d1adc92e 100644 --- a/sandbox/sebastien/java/embed/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java +++ b/sandbox/sebastien/java/embed/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java @@ -609,6 +609,13 @@ public abstract class NodeFactory extends DefaultNodeConfigurationFactory { * @return The SCA node */ public abstract Node createNode(NodeConfiguration configuration); + + /** + * Create an SCA node from a list of pre-built o.a.t.sca.contribution.Contribution objects. + * Pass java.lang.Objects for now as this class doesn't have direct dependencies on + * o.a.t.sca.contribution.Contribution. + */ + public abstract Node createNode(List contributions); /** * Create the node configuration from the XML document diff --git a/sandbox/sebastien/java/embed/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java b/sandbox/sebastien/java/embed/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java index fc975c0072..f7a439699e 100644 --- a/sandbox/sebastien/java/embed/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java +++ b/sandbox/sebastien/java/embed/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeFactoryImpl.java @@ -33,6 +33,7 @@ import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -77,6 +78,7 @@ import org.apache.tuscany.sca.node.configuration.BindingConfiguration; import org.apache.tuscany.sca.node.configuration.ContributionConfiguration; import org.apache.tuscany.sca.node.configuration.DeploymentComposite; import org.apache.tuscany.sca.node.configuration.NodeConfiguration; +import org.apache.tuscany.sca.node.configuration.impl.NodeConfigurationImpl; import org.apache.tuscany.sca.runtime.DomainRegistryFactory; import org.apache.tuscany.sca.runtime.EndpointReferenceBinder; import org.apache.tuscany.sca.runtime.EndpointRegistry; @@ -123,6 +125,12 @@ public class NodeFactoryImpl extends NodeFactory { return node; } + @SuppressWarnings("unchecked") + @Override + public Node createNode(List contributions) { + return new NodeImpl(this, new NodeConfigurationImpl(), new ArrayList((List)contributions)); + } + protected void addNode(NodeConfiguration configuration, Node node) { nodes.put(getNodeKey(configuration), node); } diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/main/java/sample/impl/EmbedUtil.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/main/java/sample/impl/EmbedUtil.java index 079df6b15e..1db0e9a717 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/main/java/sample/impl/EmbedUtil.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/main/java/sample/impl/EmbedUtil.java @@ -57,17 +57,20 @@ import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory; import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; import org.apache.tuscany.sca.interfacedef.wsdl.WSDLObject; import org.apache.tuscany.sca.node.Node; -import org.apache.tuscany.sca.node.configuration.NodeConfiguration; -import org.apache.tuscany.sca.node.configuration.impl.NodeConfigurationImpl; -import org.apache.tuscany.sca.node.impl.NodeFactoryImpl; -import org.apache.tuscany.sca.node.impl.NodeImpl; +import org.apache.tuscany.sca.node.NodeFactory; +import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint; /** - * Simple DSL functions to help assemble and run SCDL. + * A few utility functions to help embed a Tuscany runtime, and a simple DSL + * to help assemble and run SCDL. */ public class EmbedUtil { - static final NodeFactoryImpl nf; + /** + * Initialize a Node factory and get the various registries, factories and + * extension points we need. + */ + static final NodeFactory nf; static final ExtensionPointRegistry epr; static final FactoryExtensionPoint fep; static final ContributionFactory cf; @@ -77,8 +80,9 @@ public class EmbedUtil { static final URLArtifactProcessorExtensionPoint apep; static final ExtensibleURLArtifactProcessor aproc; static final ModelResolverExtensionPoint mrep; + static final ProviderFactoryExtensionPoint pfep; static { - nf = new NodeFactoryImpl(); + nf = NodeFactory.newInstance(); epr = nf.getExtensionPointRegistry(); fep = epr.getExtensionPoint(FactoryExtensionPoint.class); cf = fep.getFactory(ContributionFactory.class); @@ -88,8 +92,12 @@ public class EmbedUtil { apep = epr.getExtensionPoint(URLArtifactProcessorExtensionPoint.class); aproc = new ExtensibleURLArtifactProcessor(apep); mrep = epr.getExtensionPoint(ModelResolverExtensionPoint.class); + pfep = epr.getExtensionPoint(ProviderFactoryExtensionPoint.class); } + /** + * A mini DSL to help build and assemble contributions and SCDL composites. + */ static Contribution contrib(final String uri, final String loc, final Artifact... artifacts) { final Contribution c = cf.createContribution(); c.setURI(uri); @@ -137,20 +145,6 @@ public class EmbedUtil { return impl; } - static WSDLInterface wsdli(final String uri, final String ns, final String name, final Contribution c) throws InvalidInterfaceException, ContributionException, IOException, URISyntaxException { - final ProcessorContext ctx = new ProcessorContext(); - final WSDLDefinition wd = aproc.read(null, new URI(uri), new URL(new URL(c.getLocation()), uri), ctx, WSDLDefinition.class); - c.getModelResolver().addModel(wd, ctx); - c.getModelResolver().resolveModel(WSDLDefinition.class, wd, ctx); - final WSDLObject pt = wd.getWSDLObject(PortType.class, new QName(ns, name)); - if(pt == null) - throw new ContributionResolveException("Couldn't find " + name); - final WSDLInterface nwi = wif.createWSDLInterface(pt.getElement(), wd, c.getModelResolver(), null); - nwi.setWsdlDefinition(wd); - nwi.resetDataBinding(DOMDataBinding.NAME); - return nwi; - } - static Reference reference(final String name, final Class c) throws InvalidInterfaceException { return ImplUtil.reference(name, c, jif, af); } @@ -177,6 +171,37 @@ public class EmbedUtil { return ImplUtil.service(c, wif, af); } + /** + * Load a WSDL into a contribution. + */ + static WSDLInterface wsdli(final String uri, final String ns, final String name, final Contribution c) throws InvalidInterfaceException, ContributionException, IOException, URISyntaxException { + final ProcessorContext ctx = new ProcessorContext(); + final WSDLDefinition wd = aproc.read(null, new URI(uri), new URL(new URL(c.getLocation()), uri), ctx, WSDLDefinition.class); + c.getModelResolver().addModel(wd, ctx); + c.getModelResolver().resolveModel(WSDLDefinition.class, wd, ctx); + final WSDLObject pt = wd.getWSDLObject(PortType.class, new QName(ns, name)); + if(pt == null) + throw new ContributionResolveException("Couldn't find " + name); + final WSDLInterface nwi = wif.createWSDLInterface(pt.getElement(), wd, c.getModelResolver(), null); + nwi.setWsdlDefinition(wd); + nwi.resetDataBinding(DOMDataBinding.NAME); + return nwi; + } + + /** + * Return the extension point registry used by our nodes. + */ + static ExtensionPointRegistry extensionPoints() { + return epr; + } + + /** + * Return the provider factory extension point used by our nodes. + */ + static ProviderFactoryExtensionPoint providerFactories() { + return pfep; + } + /** * Add a deployable composite to a contribution. */ @@ -185,14 +210,12 @@ public class EmbedUtil { contrib.getDeployables().add(c); return contrib; } - + /** * Configure a node with a list of contributions. */ - static Node node(final String uri, final Contribution... contributions) { - final NodeConfiguration cfg = new NodeConfigurationImpl(); - cfg.setURI(uri); - return new NodeImpl(nf, cfg, Arrays.asList(contributions)); + static Node node(final Contribution... contributions) { + return nf.createNode(Arrays.asList(contributions)); } } diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Client.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Client.java index 4c473c987f..1b7e11c786 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Client.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Client.java @@ -21,6 +21,11 @@ package sample; import org.oasisopen.sca.annotation.Remotable; +/** + * Sample service interface. + * + * @version $Rev$ $Date$ + */ @Remotable public interface Client { diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/ClientTest.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/ClientTest.java index 6b5c3983d1..3b635708ec 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/ClientTest.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/ClientTest.java @@ -36,7 +36,7 @@ import sample.api.WSDL; import sample.api.WSDLReference; /** - * Sample component implementation. + * Sample component implementation that uses a mix of Java and WSDL interfaces. * * @version $Rev$ $Date$ */ diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Hello.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Hello.java index f6e02591e5..247fc8aa78 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Hello.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Hello.java @@ -21,6 +21,11 @@ package sample; import org.oasisopen.sca.annotation.Remotable; +/** + * Sample service interface. + * + * @version $Rev$ $Date$ + */ @Remotable public interface Hello { diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/JelloTest.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/JelloTest.java index 53ed006132..5c999a6c80 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/JelloTest.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/JelloTest.java @@ -23,7 +23,7 @@ import static java.lang.System.out; import sample.api.Java; /** - * Sample component implementation. + * Sample component implementation that uses Java interfaces. * * @version $Rev$ $Date$ */ diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Upper.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Upper.java index 04e929ade7..9c772b3487 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Upper.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/Upper.java @@ -21,6 +21,11 @@ package sample; import org.oasisopen.sca.annotation.Remotable; +/** + * Sample service interface. + * + * @version $Rev$ $Date$ + */ @Remotable public interface Upper { diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/UpperTest.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/UpperTest.java index fe90097efa..5399e4410d 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/UpperTest.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/UpperTest.java @@ -23,7 +23,7 @@ import static java.lang.System.out; import sample.api.Java; /** - * Sample component implementation. + * Sample component implementation that uses Java interfaces. * * @version $Rev$ $Date$ */ diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/WelloTest.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/WelloTest.java index 9da5083dda..3b3a6a4566 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/WelloTest.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/WelloTest.java @@ -36,7 +36,7 @@ import sample.api.WSDL; import sample.api.WSDLReference; /** - * Sample component implementation. + * Sample component implementation that uses WSDL interfaces. * * @version $Rev$ $Date$ */ diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/EmbedTestCase.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/EmbedTestCase.java index 98057bf34e..41f6d95f3c 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/EmbedTestCase.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/EmbedTestCase.java @@ -49,7 +49,8 @@ import sample.UpperTest; import sample.WelloTest; /** - * Test assemble and run SCDL. + * Test how to assemble a contribution, a SCDL composite and run it on an embedded + * Tuscany runtime node. * * @version $Rev$ $Date$ */ @@ -93,7 +94,7 @@ public class EmbedTestCase { service(Upper.class)))); // Run with it - node = node("test", deploy(contrib, comp)); + node = node(deploy(contrib, comp)); node.start(); } diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/InControlTestCase.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/InControlTestCase.java new file mode 100644 index 0000000000..6523e0b233 --- /dev/null +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/InControlTestCase.java @@ -0,0 +1,147 @@ +/* + * 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.impl; + +import static java.lang.System.out; +import static org.junit.Assert.assertEquals; +import static sample.impl.EmbedUtil.component; +import static sample.impl.EmbedUtil.composite; +import static sample.impl.EmbedUtil.contrib; +import static sample.impl.EmbedUtil.deploy; +import static sample.impl.EmbedUtil.extensionPoints; +import static sample.impl.EmbedUtil.implementation; +import static sample.impl.EmbedUtil.node; +import static sample.impl.EmbedUtil.providerFactories; +import static sample.impl.EmbedUtil.reference; +import static sample.impl.EmbedUtil.service; +import static sample.impl.EmbedUtil.wsdli; +import static sample.impl.TestUtil.here; + +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.contribution.Contribution; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; +import org.apache.tuscany.sca.node.Node; +import org.apache.tuscany.sca.provider.ImplementationProvider; +import org.apache.tuscany.sca.provider.ProviderFactory; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import sample.Client; +import sample.ClientTest; +import sample.Hello; +import sample.JelloTest; +import sample.Upper; +import sample.UpperTest; +import sample.WelloTest; + +/** + * Test how to assemble a contribution, a SCDL composite and run it on an embedded + * Tuscany runtime node. Same as EmbedTestCase but shows how stay in control and + * pass in a ProviderFactory instead of having it loaded and constructed by the + * runtime node. + * + * @version $Rev$ $Date$ + */ +public class InControlTestCase { + static Node node; + + @BeforeClass + public static void setUp() throws Exception { + + // Load the test WSDL definitions (could also construct + // the WSDL and XSD models in code but that'd be quite + // painful, so just load them from XML for now) + final Contribution contrib = contrib("test", here()); + WSDLInterface Hello_wsdl = wsdli("Hello.wsdl", "http://sample", "Hello", contrib); + WSDLInterface Upper_wsdl = wsdli("Upper.wsdl", "http://sample", "Upper", contrib); + + // Assemble a test composite model (see EmbedUtil + // for the little DSL used here, much more concise + // than using the assembly model interfaces) + final Composite comp = + composite("http://sample", "test", + component("client-test", + implementation(ClientTest.class, + service(Client.class), + reference("jello", Hello.class), + reference("wello", Hello_wsdl)), + reference("jello", "jello-test"), + reference("wello", "wello-test")), + component("wello-test", + implementation(WelloTest.class, + service(Hello_wsdl), + reference("upper", Upper_wsdl)), + reference("upper", "upper-test")), + component("jello-test", + implementation(JelloTest.class, + service(Hello.class), + reference("upper", Upper.class)), + reference("upper", "upper-test")), + component("upper-test", + implementation(UpperTest.class, + service(Upper.class)))); + + // Register a test instance of our sample implementation ProviderFactory + providerFactories().addProviderFactory(testProviderFactory()); + + // Run with it + node = node(deploy(contrib, comp)); + node.start(); + } + + static ProviderFactory testProviderFactory() { + // This shows that the embedder can take control and get called + // when a provider is created, and return whatever provider, then + // invoker, implementation instance etc + return new SampleProviderFactory(extensionPoints()) { + public ImplementationProvider createImplementationProvider(RuntimeComponent comp, SampleImplementation impl) { + out.println("Creating a provider for component " + comp.getName()); + return super.createImplementationProvider(comp, impl); + } + }; + } + + @AfterClass + public static void tearDown() throws Exception { + node.stop(); + } + + @Test + public void jello() { + out.println("RunTestCase.jello"); + final String r = client().jello("Java"); + out.println(r); + assertEquals("HELLO JAVA", r); + } + + @Test + public void wello() { + out.println("RunTestCase.wello"); + final String r = client().wello("WSDL"); + out.println(r); + assertEquals("HELLO WSDL", r); + } + + static Client client() { + return node.getService(Client.class, "client-test/Client"); + } +} diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/ReadWriteTestCase.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/ReadWriteTestCase.java index ad507f80ac..8a4768cd9e 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/ReadWriteTestCase.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/ReadWriteTestCase.java @@ -43,7 +43,7 @@ import org.junit.BeforeClass; import org.junit.Test; /** - * Test reading/writing Sample implementations. + * Test read/write Sample SCDL implementation elements. * * @version $Rev$ $Date$ */ diff --git a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/RunTestCase.java b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/RunTestCase.java index a2e1f9ed45..29bf02d26b 100644 --- a/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/RunTestCase.java +++ b/sandbox/sebastien/java/embed/samples/implementation-extension/src/test/java/sample/impl/RunTestCase.java @@ -33,7 +33,8 @@ import org.junit.Test; import sample.Client; /** - * Test run. + * Test how to run an SCA contribution containing a test composite on a + * Tuscany runtime node. * * @version $Rev$ $Date$ */ -- cgit v1.2.3