Author: jsdelfino
Date: Fri Apr 25 11:28:33 2008
New Revision: 651678

URL: http://svn.apache.org/viewvc?rev=651678&view=rev
Log:
Added a sample that shows how to distribute and run components on a set of SCA 
nodes.

Added:
    
incubator/tuscany/java/sca/samples/domain-management/src/main/java/manager/DistributeAndRunComponents.java
   (with props)
Modified:
    incubator/tuscany/java/sca/samples/domain-management/pom.xml

Modified: incubator/tuscany/java/sca/samples/domain-management/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/domain-management/pom.xml?rev=651678&r1=651677&r2=651678&view=diff
==============================================================================
--- incubator/tuscany/java/sca/samples/domain-management/pom.xml (original)
+++ incubator/tuscany/java/sca/samples/domain-management/pom.xml Fri Apr 25 
11:28:33 2008
@@ -86,12 +86,18 @@
 
         <dependency>
             <groupId>org.apache.tuscany.sca</groupId>
-            <artifactId>tuscany-implementation-node-xml</artifactId>
+            <artifactId>tuscany-node2-launcher</artifactId>
             <version>2.0-incubating-SNAPSHOT</version>
         </dependency>
 
         <dependency>
             <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-node2-api</artifactId>
+            <version>2.0-incubating-SNAPSHOT</version>
+        </dependency>    
+        
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
             <artifactId>tuscany-extensibility</artifactId>
             <version>2.0-incubating-SNAPSHOT</version>
         </dependency>        
@@ -108,6 +114,13 @@
             <version>2.0-incubating-SNAPSHOT</version>
             <scope>runtime</scope>
         </dependency>        
+
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-implementation-node-xml</artifactId>
+            <version>2.0-incubating-SNAPSHOT</version>
+            <scope>runtime</scope>
+        </dependency>
 
         <dependency>
             <groupId>xerces</groupId>

Added: 
incubator/tuscany/java/sca/samples/domain-management/src/main/java/manager/DistributeAndRunComponents.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/domain-management/src/main/java/manager/DistributeAndRunComponents.java?rev=651678&view=auto
==============================================================================
--- 
incubator/tuscany/java/sca/samples/domain-management/src/main/java/manager/DistributeAndRunComponents.java
 (added)
+++ 
incubator/tuscany/java/sca/samples/domain-management/src/main/java/manager/DistributeAndRunComponents.java
 Fri Apr 25 11:28:33 2008
@@ -0,0 +1,352 @@
+/*
+ * 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 manager;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.ComponentService;
+import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.SCABindingFactory;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
+import org.apache.tuscany.sca.assembly.builder.impl.CompositeBuilderImpl;
+import org.apache.tuscany.sca.assembly.xml.ComponentTypeDocumentProcessor;
+import org.apache.tuscany.sca.assembly.xml.ComponentTypeProcessor;
+import org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor;
+import org.apache.tuscany.sca.assembly.xml.CompositeProcessor;
+import org.apache.tuscany.sca.assembly.xml.ConstrainingTypeDocumentProcessor;
+import org.apache.tuscany.sca.assembly.xml.ConstrainingTypeProcessor;
+import org.apache.tuscany.sca.binding.atom.AtomBindingFactory;
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import 
org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor;
+import 
org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import 
org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
+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.contribution.service.ContributionWriteException;
+import 
org.apache.tuscany.sca.contribution.xml.ContributionGeneratedMetadataDocumentProcessor;
+import 
org.apache.tuscany.sca.contribution.xml.ContributionMetadataDocumentProcessor;
+import org.apache.tuscany.sca.contribution.xml.ContributionMetadataProcessor;
+import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.ModuleActivator;
+import org.apache.tuscany.sca.core.ModuleActivatorExtensionPoint;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
+import org.apache.tuscany.sca.implementation.node.NodeImplementation;
+import org.apache.tuscany.sca.implementation.node.NodeImplementationFactory;
+import 
org.apache.tuscany.sca.implementation.node.builder.impl.NodeCompositeBuilderImpl;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.MonitorFactory;
+import org.apache.tuscany.sca.node.SCANode2;
+import org.apache.tuscany.sca.node.launcher.NodeLauncher;
+import org.apache.tuscany.sca.policy.IntentAttachPointTypeFactory;
+import org.apache.tuscany.sca.policy.PolicyFactory;
+import org.apache.tuscany.sca.workspace.Workspace;
+import org.apache.tuscany.sca.workspace.WorkspaceFactory;
+import org.apache.tuscany.sca.workspace.builder.ContributionDependencyBuilder;
+import 
org.apache.tuscany.sca.workspace.builder.impl.ContributionDependencyBuilderImpl;
+import 
org.apache.tuscany.sca.workspace.processor.impl.ContributionContentProcessor;
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.XMLSerializer;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+/**
+ * Sample RunComponents task
+ *
+ * Under construction... This sample is similar to the DistributeComponents 
sample,
+ * with extra steps to configure SCA runtime nodes with the models, start and 
stop
+ * them.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DistributeAndRunComponents {
+    
+    private static URLArtifactProcessor<Contribution> 
contributionContentProcessor;
+    private static ModelResolverExtensionPoint modelResolvers;
+    private static ModelFactoryExtensionPoint modelFactories;
+    private static WorkspaceFactory workspaceFactory;
+    private static AssemblyFactory assemblyFactory;
+    private static XMLOutputFactory outputFactory;
+    private static StAXArtifactProcessor<Object> xmlProcessor; 
+    private static ContributionDependencyBuilder contributionDependencyBuilder;
+    private static CompositeBuilder domainCompositeBuilder;
+    private static CompositeBuilder nodeCompositeBuilder;
+    private static NodeImplementationFactory nodeFactory;
+    private static AtomBindingFactory atomBindingFactory;
+
+    private static void init() {
+        
+        // Create extension point registry 
+        ExtensionPointRegistry extensionPoints = new 
DefaultExtensionPointRegistry();
+        
+        // Initialize the Tuscany module activators
+        ModuleActivatorExtensionPoint moduleActivators = 
extensionPoints.getExtensionPoint(ModuleActivatorExtensionPoint.class);
+        for (ModuleActivator activator: 
moduleActivators.getModuleActivators()) {
+            activator.start(extensionPoints);
+        }
+
+        // Get XML input/output factories
+        modelFactories = 
extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
+        XMLInputFactory inputFactory = 
modelFactories.getFactory(XMLInputFactory.class);
+        outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+        
+        // Get contribution, workspace, assembly and policy model factories
+        ContributionFactory contributionFactory = 
modelFactories.getFactory(ContributionFactory.class);
+        workspaceFactory = modelFactories.getFactory(WorkspaceFactory.class); 
+        assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+        PolicyFactory policyFactory = 
modelFactories.getFactory(PolicyFactory.class);
+        nodeFactory = 
modelFactories.getFactory(NodeImplementationFactory.class);
+        atomBindingFactory = 
modelFactories.getFactory(AtomBindingFactory.class);
+        
+        // Create XML and document artifact processors
+        StAXArtifactProcessorExtensionPoint xmlProcessorExtensions = 
extensionPoints.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+        xmlProcessor = new 
ExtensibleStAXArtifactProcessor(xmlProcessorExtensions, inputFactory, 
outputFactory);
+        URLArtifactProcessorExtensionPoint docProcessorExtensions = 
extensionPoints.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
+        URLArtifactProcessor<Object> urlExtensionProcessor = new 
ExtensibleURLArtifactProcessor(docProcessorExtensions);
+        
+        // Create and register XML artifact processor extensions for 
sca-contribution XML and
+        // SCDL <composite>, <componentType> and <constrainingType>
+        xmlProcessorExtensions.addArtifactProcessor(new 
ContributionMetadataProcessor(assemblyFactory, contributionFactory, 
xmlProcessor));
+        xmlProcessorExtensions.addArtifactProcessor(new 
CompositeProcessor(contributionFactory, assemblyFactory, policyFactory, 
xmlProcessor));
+        xmlProcessorExtensions.addArtifactProcessor(new 
ComponentTypeProcessor(assemblyFactory, policyFactory, xmlProcessor));
+        xmlProcessorExtensions.addArtifactProcessor(new 
ConstrainingTypeProcessor(assemblyFactory, policyFactory, xmlProcessor));
+        
+        // Create and register document processor extensions for 
sca-contribution.xml, 
+        // sca-contribution-generated.xml, .composite, .componentType and
+        // .constrainingType documents 
+        docProcessorExtensions.addArtifactProcessor(new 
ContributionMetadataDocumentProcessor(xmlProcessor, inputFactory));
+        docProcessorExtensions.addArtifactProcessor(new 
ContributionGeneratedMetadataDocumentProcessor(xmlProcessor, inputFactory));
+        docProcessorExtensions.addArtifactProcessor(new 
CompositeDocumentProcessor(xmlProcessor, inputFactory, null));
+        docProcessorExtensions.addArtifactProcessor(new 
ComponentTypeDocumentProcessor(xmlProcessor, inputFactory));
+        docProcessorExtensions.addArtifactProcessor(new 
ConstrainingTypeDocumentProcessor(xmlProcessor, inputFactory));
+        
+        // Create contribution content processor
+        modelResolvers = 
extensionPoints.getExtensionPoint(ModelResolverExtensionPoint.class);
+        contributionContentProcessor = new 
ContributionContentProcessor(modelFactories, modelResolvers, 
urlExtensionProcessor);
+        
+        // Create a monitor
+        UtilityExtensionPoint utilities = 
extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+        MonitorFactory monitorFactory = 
utilities.getUtility(MonitorFactory.class);
+        Monitor monitor = monitorFactory.createMonitor();
+        
+        // Create a contribution dependency builder
+        contributionDependencyBuilder = new 
ContributionDependencyBuilderImpl(monitor);
+        
+        // Create a composite builder
+        SCABindingFactory scaBindingFactory = 
modelFactories.getFactory(SCABindingFactory.class);
+        IntentAttachPointTypeFactory attachPointTypeFactory = 
modelFactories.getFactory(IntentAttachPointTypeFactory.class);
+        InterfaceContractMapper contractMapper = 
utilities.getUtility(InterfaceContractMapper.class);
+        domainCompositeBuilder = new CompositeBuilderImpl(assemblyFactory, 
scaBindingFactory, attachPointTypeFactory, contractMapper, monitor);
+        
+        // Create a node composite builder
+        nodeCompositeBuilder = new NodeCompositeBuilderImpl(assemblyFactory, 
scaBindingFactory, contractMapper, null, monitor);
+    }
+    
+
+    public static void main(String[] args) throws Exception {
+        init();
+
+        // Create workspace model
+        Workspace workspace = workspaceFactory.createWorkspace();
+        workspace.setModelResolver(new ExtensibleModelResolver(workspace, 
modelResolvers, modelFactories));
+
+        // Read the sample store contribution
+        URI storeURI = URI.create("store");
+        URL storeURL = new 
File("./target/sample-domain-management-store.jar").toURI().toURL();
+        Contribution storeContribution = 
(Contribution)contributionContentProcessor.read(null, storeURI, storeURL);
+        workspace.getContributions().add(storeContribution);
+
+        // Read the sample assets contribution
+        URI assetsURI = URI.create("assets");
+        URL assetsURL = new 
File("./target/sample-domain-management-assets.jar").toURI().toURL();
+        Contribution assetsContribution = 
(Contribution)contributionContentProcessor.read(null, assetsURI, assetsURL);
+        workspace.getContributions().add(assetsContribution);
+
+        // Read the sample client contribution
+        URI clientURI = URI.create("client");
+        URL clientURL = new 
File("./target/sample-domain-management-client.jar").toURI().toURL();
+        Contribution clientContribution = 
(Contribution)contributionContentProcessor.read(null, clientURI, clientURL);
+        workspace.getContributions().add(clientContribution);
+
+        // Build the contribution dependencies
+        Map<Contribution, List<Contribution>> contributionDependencies = new 
HashMap<Contribution, List<Contribution>>();
+        Set<Contribution> resolved = new HashSet<Contribution>();
+        for (Contribution contribution: workspace.getContributions()) {
+            List<Contribution> dependencies = 
contributionDependencyBuilder.buildContributionDependencies(contribution, 
workspace);
+            
+            // Resolve contributions
+            for (Contribution dependency: dependencies) {
+                if (!resolved.contains(dependency)) {
+                    resolved.add(dependency);
+                    contributionContentProcessor.resolve(contribution, 
workspace.getModelResolver());
+                }
+            }
+            
+            contributionDependencies.put(contribution, dependencies);
+        }
+        
+        // Create a set of nodes, and assign the sample deployables to them
+        Map<Component, List<Contribution>> nodeDependencies = new 
HashMap<Component, List<Contribution>>();
+        Composite cloudComposite = assemblyFactory.createComposite();
+        cloudComposite.setName(new QName("http://sample";, "cloud"));
+        int nodeID = 8100;
+        for (Contribution contribution: workspace.getContributions()) {
+            for (Composite deployable: contribution.getDeployables()) {
+                
+                // Create a node
+                Component node = assemblyFactory.createComponent();
+                node.setName("Node" + nodeID);
+                cloudComposite.getComponents().add(node);
+                
+                // Add default binding configuration to the node, our samples 
use
+                // Atom bindings so here we're just creating default Atom 
binding
+                // configurations, but all the other binding types can be 
configured
+                // like that too
+                ComponentService nodeService = 
assemblyFactory.createComponentService();
+                Binding binding = atomBindingFactory.createAtomBinding();
+                binding.setURI("http://localhost:"; + (8100 + nodeID));
+                nodeService.getBindings().add(binding);
+                node.getServices().add(nodeService);
+
+                // Assign a deployable to the node
+                NodeImplementation nodeImplementation = 
nodeFactory.createNodeImplementation();
+                nodeImplementation.setComposite(deployable);
+                node.setImplementation(nodeImplementation);
+                
+                // Keep track of what contributions will be needed by the node
+                nodeDependencies.put(node, 
contributionDependencies.get(contribution));
+                
+                nodeID++;
+            }
+        }
+        
+        // Print the model describing the nodes that we just built
+        System.out.println("cloud.composite");
+        System.out.println(print(cloudComposite));
+        
+        // Build the nodes, this will apply their default binding 
configuration to the
+        // composites assigned to them
+        nodeCompositeBuilder.build(cloudComposite);
+        
+        // Create a composite model for the domain
+        Composite domainComposite = assemblyFactory.createComposite();
+        domainComposite.setName(new QName("http://sample";, "domain"));
+        
+        // Add all deployables to it, normally the domain administrator would 
select
+        // the deployables to include
+        domainComposite.getIncludes().addAll(workspace.getDeployables());
+        
+        // Build the domain composite and wire the components included
+        // in it
+        domainCompositeBuilder.build(domainComposite);
+
+        // Print out the resulting domain composite
+        System.out.println("domain.composite");
+        System.out.println(print(domainComposite));
+        
+        // Now start our SCA nodes
+        List<SCANode2> runtimeNodes = new ArrayList<SCANode2>();
+        NodeLauncher launcher = NodeLauncher.newInstance();
+        for (Component node: cloudComposite.getComponents()) {
+            
+            // Create a composite containing the components that we want to run
+            // on the node
+            Composite runnable = assemblyFactory.createComposite();
+            runnable.setName(new QName("http://sample";, node.getName()));
+            NodeImplementation nodeImplementation = 
(NodeImplementation)node.getImplementation();
+            for (Component component: 
nodeImplementation.getComposite().getComponents()) {
+                for (Component configured: domainComposite.getComponents()) {
+                    if (configured.getName().equals(component.getName())) {
+                        runnable.getComponents().add(configured);
+                        break;
+                    }
+                }
+            }
+
+            // Create the SCA node, give it the composite and the list of 
contributions
+            // to use
+            List<Contribution> dependencies = nodeDependencies.get(node);
+            org.apache.tuscany.sca.node.launcher.NodeLauncher.Contribution[] 
contributions = new 
org.apache.tuscany.sca.node.launcher.NodeLauncher.Contribution[dependencies.size()];
+            for (int c =0, n = dependencies.size(); c < n; c++) {
+                Contribution dependency = dependencies.get(c);
+                contributions[c] = new 
org.apache.tuscany.sca.node.launcher.NodeLauncher.Contribution(dependency.getURI(),
 dependency.getLocation());
+            }
+            SCANode2 runtimeNode = launcher.createNode("http://sample/"; + 
node.getName(), print(runnable), contributions);
+            
+            // Start the node
+            runtimeNode.start();
+            runtimeNodes.add(runtimeNode);
+        }
+        
+        System.out.println("Nodes are running, press enter to stop...");
+        System.in.read();
+        
+        for (SCANode2 runtimeNode: runtimeNodes) {
+            runtimeNode.stop();
+        }
+    }
+
+    private static String print(Composite composite) throws 
XMLStreamException, ContributionWriteException, ParserConfigurationException, 
SAXException, IOException {
+
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        XMLStreamWriter writer = outputFactory.createXMLStreamWriter(bos);
+        xmlProcessor.write(composite, writer);
+        
+        // Parse and write again to pretty format it
+        DocumentBuilder documentBuilder = 
DocumentBuilderFactory.newInstance().newDocumentBuilder();
+        Document document = documentBuilder.parse(new 
ByteArrayInputStream(bos.toByteArray()));
+        OutputFormat format = new OutputFormat();
+        format.setIndenting(true);
+        format.setIndent(2);
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        XMLSerializer serializer = new XMLSerializer(out, format);
+        serializer.serialize(document);
+        return out.toString();
+    }
+}

Propchange: 
incubator/tuscany/java/sca/samples/domain-management/src/main/java/manager/DistributeAndRunComponents.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/samples/domain-management/src/main/java/manager/DistributeAndRunComponents.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: 
incubator/tuscany/java/sca/samples/domain-management/src/main/java/manager/DistributeAndRunComponents.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to