You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sl...@apache.org on 2008/03/07 18:51:54 UTC

svn commit: r634757 - in /incubator/tuscany/java/sca/modules/workspace-admin: ./ src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ src/main/resources/

Author: slaws
Date: Fri Mar  7 09:51:52 2008
New Revision: 634757

URL: http://svn.apache.org/viewvc?rev=634757&view=rev
Log:
Add code to configure default binding URIs, based on the cloud configuration, when a deployable composite is requested

Modified:
    incubator/tuscany/java/sca/modules/workspace-admin/pom.xml
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite

Modified: incubator/tuscany/java/sca/modules/workspace-admin/pom.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/pom.xml?rev=634757&r1=634756&r2=634757&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/pom.xml (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/pom.xml Fri Mar  7 09:51:52 2008
@@ -137,6 +137,27 @@
             <version>1.2-incubating-SNAPSHOT</version>
             <scope>runtime</scope>
         </dependency>
+        
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-binding-ws</artifactId>
+            <version>1.2-incubating-SNAPSHOT</version>
+            <scope>runtime</scope>
+        </dependency> 
+        
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-binding-ws-axis2</artifactId>
+            <version>1.2-incubating-SNAPSHOT</version>
+            <scope>runtime</scope>
+        </dependency>  
+        
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-binding-ws-xml</artifactId>
+            <version>1.2-incubating-SNAPSHOT</version>
+            <scope>runtime</scope>
+        </dependency>          
 
     </dependencies>
 </project>

Modified: incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java?rev=634757&r1=634756&r2=634757&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java Fri Mar  7 09:51:52 2008
@@ -68,8 +68,8 @@
  * @version $Rev: 632617 $ $Date: 2008-03-01 08:24:33 -0800 (Sat, 01 Mar 2008) $
  */
 @Scope("COMPOSITE")
-@Service(CompositeCollection.class)
-public class CompositeCollectionImpl implements CompositeCollection {
+@Service(interfaces={CompositeCollection.class,LocalCompositeCollection.class})
+public class CompositeCollectionImpl implements CompositeCollection, LocalCompositeCollection {
     
     @Property
     public String compositeFileName;

Modified: incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java?rev=634757&r1=634756&r2=634757&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java Fri Mar  7 09:51:52 2008
@@ -29,6 +29,8 @@
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.servlet.Servlet;
 import javax.servlet.ServletException;
@@ -45,14 +47,20 @@
 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.Composite;
 import org.apache.tuscany.sca.assembly.SCABindingFactory;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilderMonitor;
+import org.apache.tuscany.sca.assembly.builder.Problem;
+import org.apache.tuscany.sca.assembly.builder.Problem.Severity;
 import org.apache.tuscany.sca.assembly.builder.impl.CompositeBuilderImpl;
+import org.apache.tuscany.sca.assembly.builder.impl.CompositeConfigurationBuilderImpl;
 import org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor;
 import org.apache.tuscany.sca.assembly.xml.CompositeProcessor;
+import org.apache.tuscany.sca.contribution.Artifact;
 import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.contribution.ContributionFactory;
 import org.apache.tuscany.sca.contribution.DefaultModelFactoryExtensionPoint;
@@ -76,8 +84,29 @@
 import org.apache.tuscany.sca.implementation.data.collection.Entry;
 import org.apache.tuscany.sca.implementation.data.collection.Item;
 import org.apache.tuscany.sca.implementation.data.collection.NotFoundException;
+import org.apache.tuscany.sca.implementation.java.JavaImplementationFactory;
+import org.apache.tuscany.sca.implementation.java.introspect.JavaClassVisitor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.AllowsPassByReferenceProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.BaseJavaClassVisitor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.ComponentNameProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.ConstructorProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.ContextProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.ConversationIDProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.ConversationProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.DestroyProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.EagerInitProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.HeuristicPojoProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.InitProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.PolicyProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.PropertyProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.ReferenceProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.ResourceProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.ScopeProcessor;
+import org.apache.tuscany.sca.implementation.java.introspect.impl.ServiceProcessor;
+import org.apache.tuscany.sca.implementation.node.NodeImplementation;
 import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
 import org.apache.tuscany.sca.interfacedef.impl.InterfaceContractMapperImpl;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
 import org.apache.tuscany.sca.policy.IntentAttachPointTypeFactory;
 import org.apache.tuscany.sca.policy.PolicyFactory;
 import org.apache.tuscany.sca.policy.PolicySet;
@@ -103,9 +132,16 @@
 @Service(interfaces={CompositeCollection.class, LocalCompositeCollection.class, Servlet.class})
 public class DeployableCompositeCollectionImpl extends HttpServlet implements CompositeCollection, LocalCompositeCollection {
     private static final long serialVersionUID = -8809641932774129151L;
+    private final static Logger logger = Logger.getLogger(DeployableCompositeCollectionImpl.class.getName());    
 
     @Reference
     public LocalContributionCollection contributionCollection;
+    
+    @Reference 
+    public LocalContributionCollection domainCompositeCollection;
+    
+    @Reference 
+    public LocalContributionCollection cloudCollection;    
 
     private ModelFactoryExtensionPoint modelFactories;
     private ModelResolverExtensionPoint modelResolvers;
@@ -114,6 +150,7 @@
     private StAXArtifactProcessor<Composite> compositeProcessor;
     private XMLOutputFactory outputFactory;
     private CompositeBuilder compositeBuilder;
+    private CompositeConfigurationBuilderImpl compositeConfiguationBuilder;
     
     /**
      * Initialize the component.
@@ -129,6 +166,32 @@
         outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
         ContributionFactory contributionFactory = modelFactories.getFactory(ContributionFactory.class);
         PolicyFactory policyFactory = modelFactories.getFactory(PolicyFactory.class);
+        
+        // TODO - This doesn't really belong here but this method seems to be building another
+        //        runtime in parallel to the one runing this component and the composite
+        //        needs to resolve implementation types so that it can be built. 
+        //        If we want to do this parallel thing we should create a new extension 
+        //        registry so that existing initialization methods can be called. 
+        JavaInterfaceFactory javaFactory = modelFactories.getFactory(JavaInterfaceFactory.class);
+        JavaImplementationFactory javaImplementationFactory = modelFactories.getFactory(JavaImplementationFactory.class);
+
+        BaseJavaClassVisitor[] extensions =
+            new BaseJavaClassVisitor[] {new ConstructorProcessor(assemblyFactory),
+                                        new AllowsPassByReferenceProcessor(assemblyFactory),
+                                        new ComponentNameProcessor(assemblyFactory),
+                                        new ContextProcessor(assemblyFactory),
+                                        new ConversationIDProcessor(assemblyFactory),
+                                        new ConversationProcessor(assemblyFactory),
+                                        new DestroyProcessor(assemblyFactory), new EagerInitProcessor(assemblyFactory),
+                                        new InitProcessor(assemblyFactory), new PropertyProcessor(assemblyFactory),
+                                        new ReferenceProcessor(assemblyFactory, javaFactory),
+                                        new ResourceProcessor(assemblyFactory), new ScopeProcessor(assemblyFactory),
+                                        new ServiceProcessor(assemblyFactory, javaFactory),
+                                        new HeuristicPojoProcessor(assemblyFactory, javaFactory),
+                                        new PolicyProcessor(assemblyFactory, policyFactory)};
+        for (JavaClassVisitor extension : extensions) {
+            javaImplementationFactory.addClassVisitor(extension);
+        }        
 
         // Create artifact processors
         StAXArtifactProcessorExtensionPoint staxProcessors = new DefaultStAXArtifactProcessorExtensionPoint(modelFactories);
@@ -152,8 +215,34 @@
         IntentAttachPointTypeFactory intentAttachPointTypeFactory = modelFactories.getFactory(IntentAttachPointTypeFactory.class);
         InterfaceContractMapper contractMapper = new InterfaceContractMapperImpl();
         List<PolicySet> domainPolicySets = new ArrayList<PolicySet>();
+        
+        // TODO need to get these messages back to the browser
+        CompositeBuilderMonitor monitor = new CompositeBuilderMonitor() {
+            public void problem(Problem problem) {
+                if (problem.getSeverity() == Severity.INFO) {
+                    logger.info(problem.toString());
+                } else if (problem.getSeverity() == Severity.WARNING) {
+                    logger.warning(problem.toString());
+                } else if (problem.getSeverity() == Severity.ERROR) {
+                    if (problem.getCause() != null) {
+                        logger.log(Level.SEVERE, problem.toString(), problem.getCause());
+                    } else {
+                        logger.severe(problem.toString());
+                    }
+                }
+            }
+        };
+        
         compositeBuilder = new CompositeBuilderImpl(assemblyFactory, scaBindingFactory, intentAttachPointTypeFactory,
-                                                                                            contractMapper, domainPolicySets, null);
+                                                    contractMapper, domainPolicySets, monitor);
+        
+        compositeConfiguationBuilder = new CompositeConfigurationBuilderImpl(assemblyFactory, 
+                                                                             scaBindingFactory, 
+                                                                             intentAttachPointTypeFactory,
+                                                                             contractMapper,
+                                                                             monitor);
+        
+        
     }
     
     public Entry<String, Item>[] getAll() {
@@ -274,39 +363,124 @@
         
         // Expecting a key in the form:
         // composite:contributionURI;namespace;localName
+        QName keyQName = qname(key);
+        
+        // somewhere to store the composite we expect to write out at the end
+        Composite deployableComposite = null;
 
-        // Get the specified contribution info 
-        String contributionURI = uri(key);
-        Item contributionItem;
-        try {
-            contributionItem = contributionCollection.get(contributionURI);
-        } catch (NotFoundException e) {
-            response.sendError(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
+        // create a local domain composite
+        Composite domainComposite = assemblyFactory.createComposite();
+            
+        // Get the domain composite items
+        Entry<String, Item>[] domainComposites = domainCompositeCollection.getAll();
         
-        // Read the contribution
-        Contribution contribution = contribution(contributionURI, contributionItem.getLink());
+        // create the domain composite
+        for (int i=0; i < domainComposites.length; i++){
+            // load the contribution
+            String contributionURI = uri(domainComposites[i].getKey());
+            Item contributionItem;
+            try {
+                contributionItem = contributionCollection.get(contributionURI);
+            } catch (NotFoundException e) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                return;
+            }
+            
+            // Read the contribution
+            Contribution contribution = contribution(contributionURI, contributionItem.getLink());
 
-        // Find the specified deployable composite
-        Composite deployable = null;
-        QName qname = qname(key);
-        for (Composite d: contribution.getDeployables()) {
-            if (qname.equals(d.getName())) {
-                deployable = d;
-                break;
+            // Find the specified deployable composite in the contribution
+            Composite deployable = null;
+            QName qname = qname(domainComposites[i].getKey());
+            for (Composite d: contribution.getDeployables()) {
+                if (qname.equals(d.getName())) {
+                    deployable = d;
+                    break;
+                }
+            }
+            if (deployable == null) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                return;
+            }
+            
+            // store away the composite we are generating the deployable XML for. 
+            if (keyQName.equals(deployable.getName())){
+                deployableComposite = deployable;
             }
+            
+            // add the deployable composite to the domain composite
+            domainComposite.getIncludes().add(deployable);
         }
-        if (deployable == null) {
-            response.sendError(HttpServletResponse.SC_NOT_FOUND);
-            return;
+        
+        // get all the node clouds
+        Entry<String, Item>[] cloudComposites = cloudCollection.getAll();
+        List<Composite> nodeCloudComposites = new ArrayList<Composite>();
+        
+        // extract all of the node cloud composites
+        for (int i=0; i < cloudComposites.length; i++){
+            // load the contribution
+            String contributionURI = uri(cloudComposites[i].getKey());
+            Item contributionItem;
+            try {
+                contributionItem = contributionCollection.get(contributionURI);
+            } catch (NotFoundException e) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                return;
+            }
+            
+            // Read the contribution
+            Contribution contribution = contribution(contributionURI, contributionItem.getLink());
+            
+            // extract the node cloud composites and store them for later
+            for (Artifact artifact : contribution.getArtifacts()) {
+                if (artifact.getModel() instanceof Composite) {
+                    Composite composite = (Composite)artifact.getModel();
+                    nodeCloudComposites.add(composite);
+                }
+            } 
+        }
+
+        // configure the endpoints for each composite in the domain
+        for (Composite composite : domainComposite.getIncludes()){
+            List<Binding> defaultBindings = null;
+            
+            // find the node that will run this composite
+            for(Composite nodeCloudComposite : nodeCloudComposites){
+                for(Component node : nodeCloudComposite.getComponents()){
+                    NodeImplementation nodeImplementation = (NodeImplementation)node.getImplementation();
+                    if (nodeImplementation.getComposite().getName().equals(composite.getName())){
+                        defaultBindings = node.getServices().get(0).getBindings();
+                    }
+                }
+            }
+           
+            try {
+                compositeConfiguationBuilder.calculateBindingURIs(defaultBindings, composite, null);
+            } catch (CompositeBuilderException e) {
+                throw new ServletException(e);
+            }
         }
         
-        // Build the composite
+        // build the domain composite
         try {
-            compositeBuilder.build(deployable);
+            compositeBuilder.build(domainComposite);
         } catch (CompositeBuilderException e) {
             throw new ServletException(e);
+        }        
+        
+        // rebuild the requested composite from the domian composite
+        // we have to reverse the falttening that went on when the domain
+        // composite was built
+        List<Component> tempComponentList = new ArrayList<Component>();
+        tempComponentList.addAll(deployableComposite.getComponents());
+        deployableComposite.getComponents().clear();
+        
+        for (Component inputComponent : tempComponentList){
+            for (Component deployComponent : domainComposite.getComponents()){
+                if (deployComponent.getName().equals(inputComponent.getName())){
+                    deployableComposite.getComponents().add(deployComponent);
+                }
+            }
         }
         
         // Write the deployable composite back to XML
@@ -314,7 +488,7 @@
             // First write to a byte stream
             ByteArrayOutputStream bos = new ByteArrayOutputStream();
             XMLStreamWriter writer = outputFactory.createXMLStreamWriter(bos);
-            compositeProcessor.write(deployable, writer);
+            compositeProcessor.write(deployableComposite, writer);
             
             // Parse again to pretty format the document
             DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
@@ -330,6 +504,7 @@
         } catch (Exception e) {
             throw new ServletException(e);
         }
+               
     }
 
     /**

Modified: incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite?rev=634757&r1=634756&r2=634757&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite Fri Mar  7 09:51:52 2008
@@ -111,6 +111,8 @@
    	 		<t:binding.http uri="http://localhost:9990/resolved/composite/"/>
    		</service>
    		<reference name="contributionCollection" target="ContributionCollectionComponent/LocalContributionCollection"/>
+   		<reference name="domainCompositeCollection" target="DomainCompositeCollectionComponent/LocalCompositeCollection"/>
+   		<reference name="cloudCollection" target="CloudCollectionComponent/LocalCompositeCollection"/>
     </component>
 
     <component name="CloudCollectionComponent">



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org