Author: jsdelfino
Date: Mon Mar  7 01:05:00 2011
New Revision: 1078641

URL: http://svn.apache.org/viewvc?rev=1078641&view=rev
Log:
Show how NodeFactory and Node can be replaced by finer grain deploy, build, 
activate and start methods. This would enable an SCA runtime virtual hosting 
environment to build a composite model, cache it, and only activate / start its 
components on demand when a request hits them.

Modified:
    
tuscany/sandbox/sebastien/java/vhost/samples/extending-tuscany/implementation-sample/src/main/java/sample/impl/EmbedUtil.java
    
tuscany/sandbox/sebastien/java/vhost/samples/extending-tuscany/implementation-sample/src/test/java/sample/impl/EmbedTestCase.java

Modified: 
tuscany/sandbox/sebastien/java/vhost/samples/extending-tuscany/implementation-sample/src/main/java/sample/impl/EmbedUtil.java
URL: 
http://svn.apache.org/viewvc/tuscany/sandbox/sebastien/java/vhost/samples/extending-tuscany/implementation-sample/src/main/java/sample/impl/EmbedUtil.java?rev=1078641&r1=1078640&r2=1078641&view=diff
==============================================================================
--- 
tuscany/sandbox/sebastien/java/vhost/samples/extending-tuscany/implementation-sample/src/main/java/sample/impl/EmbedUtil.java
 (original)
+++ 
tuscany/sandbox/sebastien/java/vhost/samples/extending-tuscany/implementation-sample/src/main/java/sample/impl/EmbedUtil.java
 Mon Mar  7 01:05:00 2011
@@ -21,7 +21,15 @@ package sample.impl;
 
 import java.net.URI;
 import java.net.URL;
-import java.util.Arrays;
+
+import org.oasisopen.sca.ServiceReference;
+import org.oasisopen.sca.ServiceRuntimeException;
+import org.oasisopen.sca.ServiceUnavailableException;
+
+import java.util.Collections;
+import java.util.Properties;
+import java.util.HashMap;
+import java.util.List;
 
 import javax.wsdl.PortType;
 import javax.xml.namespace.QName;
@@ -35,6 +43,8 @@ import org.apache.tuscany.sca.assembly.C
 import org.apache.tuscany.sca.assembly.Implementation;
 import org.apache.tuscany.sca.assembly.Reference;
 import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
+import org.apache.tuscany.sca.core.assembly.RuntimeAssemblyFactory;
 import org.apache.tuscany.sca.contribution.Artifact;
 import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.contribution.ContributionFactory;
@@ -44,8 +54,14 @@ import org.apache.tuscany.sca.contributi
 import 
org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
 import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
 import 
org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
+import org.apache.tuscany.sca.context.CompositeContext;
 import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry;
 import org.apache.tuscany.sca.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.core.ModuleActivatorExtensionPoint;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
+import org.apache.tuscany.sca.core.invocation.ProxyFactory;
+import org.apache.tuscany.sca.deployment.Deployer;
 import org.apache.tuscany.sca.databinding.xml.DOMDataBinding;
 import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
@@ -53,9 +69,18 @@ import org.apache.tuscany.sca.interfaced
 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.NodeFactory;
+import org.apache.tuscany.sca.monitor.MonitorFactory;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.Problem;
 import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint;
+import org.apache.tuscany.sca.runtime.ActivationException;
+import org.apache.tuscany.sca.runtime.CompositeActivator;
+import org.apache.tuscany.sca.runtime.DomainRegistryFactory;
+import org.apache.tuscany.sca.runtime.ExtensibleDomainRegistryFactory;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeProperties;
+import org.apache.tuscany.sca.runtime.EndpointRegistry;
+import org.apache.tuscany.sca.work.WorkScheduler;
 
 /**
  * A few utility functions to help embed a Tuscany runtime, and a simple DSL
@@ -64,39 +89,63 @@ import org.apache.tuscany.sca.provider.P
 public class EmbedUtil {
 
     /**
-     * A runtime embedder context, which conveniently initializes a Node 
factory
-     * and gets the various registries, factories and extension points we need.
+     * A runtime embedder context, which conveniently gathers the various
+     * runtime registries, factories and extension points we need.
      */
     static class Context {
-        final NodeFactory nf;
         final ExtensionPointRegistry epr;
+        final UtilityExtensionPoint uep;
         final FactoryExtensionPoint fep;
         final ContributionFactory cf;
         final AssemblyFactory af;
         final JavaInterfaceFactory jif;
         final WSDLFactory wif;
+        final MonitorFactory mf;
         final URLArtifactProcessorExtensionPoint apep;
         final ExtensibleURLArtifactProcessor aproc;
         final ModelResolverExtensionPoint mrep;
         final ProviderFactoryExtensionPoint pfep;
+        final Deployer depl;
+        final ModuleActivatorExtensionPoint maep;
+        final WorkScheduler ws;
+        final ProxyFactory pf;
+        final CompositeActivator ca;
+        final Monitor mon;
+        final ProcessorContext pc;
+        final DomainRegistryFactory drf;
         
-        Context(final NodeFactory nf) {
-            this.nf = nf;
-            epr = nf.getExtensionPointRegistry();
+        Context() {
+            epr = new DefaultExtensionPointRegistry();
+            uep = epr.getExtensionPoint(UtilityExtensionPoint.class);
+            mf = uep.getUtility(MonitorFactory.class);
             fep = epr.getExtensionPoint(FactoryExtensionPoint.class);
             cf = fep.getFactory(ContributionFactory.class);
-            af = fep.getFactory(AssemblyFactory.class);
+            af = new RuntimeAssemblyFactory(epr);
+            fep.addFactory(af);
             jif = fep.getFactory(JavaInterfaceFactory.class);
             wif = fep.getFactory(WSDLFactory.class);
             apep = 
epr.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
             aproc = new ExtensibleURLArtifactProcessor(apep);
             mrep = epr.getExtensionPoint(ModelResolverExtensionPoint.class);
             pfep = epr.getExtensionPoint(ProviderFactoryExtensionPoint.class);
+            Properties props = new Properties();
+            props.setProperty("defaultScheme", "vm");
+            props.setProperty("defaultDomainName", "default");
+            uep.getUtility(RuntimeProperties.class).setProperties(props);
+            depl = uep.getUtility(Deployer.class);
+            maep = epr.getExtensionPoint(ModuleActivatorExtensionPoint.class);
+            ws = uep.getUtility(WorkScheduler.class);
+            pf = uep.getUtility(ProxyFactory.class);
+            ca = uep.getUtility(CompositeActivator.class);
+            mon = mf.createMonitor();
+            pc = new ProcessorContext(mon);
+            drf = ExtensibleDomainRegistryFactory.getInstance(epr);
+            drf.getEndpointRegistry(null, "default");
         }
     }
     
-    static Context embedContext(NodeFactory nf) {
-        return new Context(nf);
+    static Context embedContext() {
+        return new Context();
     }
     
     /**
@@ -295,17 +344,94 @@ public class EmbedUtil {
     /**
      * Add a deployable composite to a contribution.
      */
-    static Contribution deploy(final Contribution contrib, final Composite... 
comps) {
-        for(Composite c: comps)
-            contrib.getDeployables().add(c);
+    static Contribution deploy(final Contribution contrib, final Composite 
comp) {
+        contrib.getDeployables().add(comp);
         return contrib;
     }
     
     /**
-     * Configure a node with a list of contributions.
+     * Build a domain composite from a contribution.
+     */
+    static Contribution build(final Contribution contrib, final Context ec) 
throws ContributionResolveException, CompositeBuilderException {
+        final Monitor cmon = ec.mf.setContextMonitor(ec.mon);
+        try {
+               final List<Contribution> contribs = 
Collections.singletonList(contrib);
+            Composite comp = ec.depl.build(contribs, contribs, new 
HashMap<QName, List<String>>(), ec.mon);
+            contrib.getDeployables().set(0, comp);
+            return contrib;
+        } finally {
+            ec.mf.setContextMonitor(cmon);
+        }
+    }
+
+    /**
+     * Report the first error found in a monitor, and reset the monitor.
+     */
+    static Context report(final Context ec) throws Throwable {
+        for (final Problem p : ec.mon.getProblems()) {
+            if ((p.getSeverity() == Problem.Severity.ERROR)) {
+                ec.mon.reset();
+                if (p.getCause() != null)
+                    throw p.getCause();
+                throw new ServiceRuntimeException(p.toString());
+            }
+        }
+        return ec;
+    }
+
+    /**
+     * Activate the components in a composite.
+     */
+    static CompositeContext activate(final Contribution contrib, final Context 
ec) throws ActivationException {
+        EndpointRegistry endpr = ec.drf.getEndpointRegistry("default", 
"default");
+        final CompositeContext cc = new CompositeContext(ec.epr, endpr, 
contrib.getDeployables().get(0), "default", "default", null);
+        ec.ca.activate(cc, cc.getDomainComposite());
+        return cc;
+    }
+
+    /**
+     * Deactivate the components in a composite.
+     */
+    static CompositeContext deactivate(final CompositeContext cc, final 
Context ec) throws ActivationException {
+        ec.ca.deactivate(cc.getDomainComposite());
+        return cc;
+    }
+
+    /**
+     * Start the components in a composite.
+     */
+    static CompositeContext start(final CompositeContext cc, final Context ec) 
throws ActivationException {
+        ec.ca.start(cc, cc.getDomainComposite());
+        return cc;
+    }
+
+    /**
+     * Stop the components in a composite.
+     */
+    static CompositeContext stop(final CompositeContext cc, final Context ec) 
throws ActivationException {
+        ec.ca.stop(cc, cc.getDomainComposite());
+        return cc;
+    }
+    
+    /**
+     * Return a callable service.
      */
-    static Node node(final NodeFactory nf, final Contribution... 
contributions) {
-        return nf.createNode(Arrays.asList(contributions));
+    static <B> B service(final Class<B> i, final String s, final 
CompositeContext cc) {
+        ServiceReference<B> sr = serviceReference(i, s, cc);
+        if (sr == null)
+            throw new ServiceRuntimeException("Service not found: " + s);
+        return sr.getService();
     }
 
+    /**
+     * Return a service reference.
+     */
+    static <B> ServiceReference<B> serviceReference(Class<B> i, String s, 
CompositeContext cc) {
+       final String[] sn = s.split("/");
+        for (Component c : cc.getDomainComposite().getComponents()) {
+            if (c.getName().equals(sn[0]))
+                return ((RuntimeComponent)c).getServiceReference(i, sn[1]);
+        }
+        throw new ServiceUnavailableException("Service has not been 
contributed to the domain: " + s);
+    }
 }

Modified: 
tuscany/sandbox/sebastien/java/vhost/samples/extending-tuscany/implementation-sample/src/test/java/sample/impl/EmbedTestCase.java
URL: 
http://svn.apache.org/viewvc/tuscany/sandbox/sebastien/java/vhost/samples/extending-tuscany/implementation-sample/src/test/java/sample/impl/EmbedTestCase.java?rev=1078641&r1=1078640&r2=1078641&view=diff
==============================================================================
--- 
tuscany/sandbox/sebastien/java/vhost/samples/extending-tuscany/implementation-sample/src/test/java/sample/impl/EmbedTestCase.java
 (original)
+++ 
tuscany/sandbox/sebastien/java/vhost/samples/extending-tuscany/implementation-sample/src/test/java/sample/impl/EmbedTestCase.java
 Mon Mar  7 01:05:00 2011
@@ -21,26 +21,28 @@ package sample.impl;
 
 import static java.lang.System.out;
 import static org.junit.Assert.assertEquals;
+import static sample.impl.EmbedUtil.activate;
 import static sample.impl.EmbedUtil.build;
 import static sample.impl.EmbedUtil.component;
 import static sample.impl.EmbedUtil.composite;
 import static sample.impl.EmbedUtil.contrib;
+import static sample.impl.EmbedUtil.deactivate;
 import static sample.impl.EmbedUtil.deploy;
 import static sample.impl.EmbedUtil.embedContext;
 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.start;
+import static sample.impl.EmbedUtil.stop;
 import static sample.impl.EmbedUtil.wsdli;
 import static sample.impl.TestUtil.here;
 
 import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.context.CompositeContext;
 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.node.NodeFactory;
 import org.apache.tuscany.sca.provider.ImplementationProvider;
 import org.apache.tuscany.sca.provider.ProviderFactory;
 import org.apache.tuscany.sca.runtime.RuntimeComponent;
@@ -64,15 +66,13 @@ import sample.WelloTest;
  * @version $Rev$ $Date$
  */
 public class EmbedTestCase {
-    static NodeFactory nf;
     static EmbedUtil.Context ec;
-    static Node node;
+    static CompositeContext cc;
 
     @SuppressWarnings("unchecked")
     @BeforeClass
     public static void setUp() throws Exception {
-        nf = NodeFactory.newInstance();
-        ec = embedContext(nf);
+        ec = embedContext();
         
         // Load the test WSDL definitions (could also construct the WSDL
         // and XSD models in code but that'd be quite painful, so just
@@ -114,8 +114,7 @@ public class EmbedTestCase {
         providerFactories(ec).addProviderFactory(testProviderFactory());
 
         // Run with it
-        node = node(nf, deploy(contrib, comp));
-        node.start();
+        cc = start(activate(build(deploy(contrib, comp), ec), ec), ec);
     }
     
     static ProviderFactory<SampleImplementation> testProviderFactory() {
@@ -129,7 +128,7 @@ public class EmbedTestCase {
 
     @AfterClass
     public static void tearDown() throws Exception {
-        node.stop();
+       deactivate(stop(cc, ec), ec);
     }
 
     @Test
@@ -149,6 +148,6 @@ public class EmbedTestCase {
     }
 
     static Client client() {
-        return node.getService(Client.class, "client-test/Client");
+        return service(Client.class, "client-test/Client", cc);
     }
 }


Reply via email to