You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2007/07/23 16:25:23 UTC

svn commit: r558740 - in /incubator/tuscany/java/sca/modules: assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/ assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ core/src/main/java/org/apache/tuscany/sca/core/runtime/ h...

Author: jsdelfino
Date: Mon Jul 23 07:25:22 2007
New Revision: 558740

URL: http://svn.apache.org/viewvc?view=rev&rev=558740
Log:
Partial fix for TUSCANY-1346. Added initial support for incremental build of a domain, allowing a domain to be rebuilt/rewired after composites have been added to it.

Modified:
    incubator/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/CompositeBuilder.java
    incubator/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java
    incubator/tuscany/java/sca/modules/host-embedded/src/test/java/org/apache/tuscany/sca/host/embedded/impl/DefaultSCADomainTestCase.java

Modified: incubator/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/CompositeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/CompositeBuilder.java?view=diff&rev=558740&r1=558739&r2=558740
==============================================================================
--- incubator/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/CompositeBuilder.java (original)
+++ incubator/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/CompositeBuilder.java Mon Jul 23 07:25:22 2007
@@ -37,4 +37,12 @@
      */
     void build(Composite composite) throws CompositeBuilderException;
     
+    /**
+     * Incrementally build, configure and wire a composite within a domain composite.
+     * 
+     * @param composite
+     * @throws CompositeBuilderException
+     */
+    void incrementalBuild(Composite composite) throws CompositeBuilderException;
+    
 }

Modified: incubator/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java?view=diff&rev=558740&r1=558739&r2=558740
==============================================================================
--- incubator/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java (original)
+++ incubator/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java Mon Jul 23 07:25:22 2007
@@ -27,7 +27,6 @@
 
 import org.apache.tuscany.sca.assembly.AssemblyFactory;
 import org.apache.tuscany.sca.assembly.Binding;
-import org.apache.tuscany.sca.assembly.WireableBinding;
 import org.apache.tuscany.sca.assembly.Component;
 import org.apache.tuscany.sca.assembly.ComponentProperty;
 import org.apache.tuscany.sca.assembly.ComponentReference;
@@ -43,6 +42,7 @@
 import org.apache.tuscany.sca.assembly.SCABindingFactory;
 import org.apache.tuscany.sca.assembly.Service;
 import org.apache.tuscany.sca.assembly.Wire;
+import org.apache.tuscany.sca.assembly.WireableBinding;
 import org.apache.tuscany.sca.assembly.builder.ComponentPreProcessor;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
@@ -111,6 +111,33 @@
         wireCompositeReferences(composite);
     }
 
+    public void incrementalBuild(Composite domainComposite) throws CompositeBuilderException {
+
+        // Collect and fuse includes
+        List<Composite> includes = new ArrayList<Composite>(domainComposite.getIncludes());
+        for (Composite composite: includes) {
+            fuseIncludes(composite);
+            
+            // Expand nested composites
+            expandComposites(composite);
+    
+            // Configure all components
+            configureComponents(composite);
+    
+            // Wire the composite
+            wireComposite(composite, domainComposite);
+    
+            // Activate composite services
+            activateCompositeServices(composite);
+    
+            // Wire composite references
+            wireCompositeReferences(composite);
+            
+            // Merge the composite into the domain composite
+            fuseIncludedComposite(composite, domainComposite);
+        }
+    }
+    
     /**
      * Collect all includes in a graph of includes.
      * 
@@ -158,6 +185,26 @@
     }
 
     /**
+     * Merge the contents of a composite into a domain composite.
+     * 
+     * @param composite
+     * @param includes
+     */
+    protected void fuseIncludedComposite(Composite composite, Composite domainComposite) {
+
+        domainComposite.getComponents().addAll(composite.getComponents());
+        domainComposite.getServices().addAll(composite.getServices());
+        domainComposite.getReferences().addAll(composite.getReferences());
+        domainComposite.getProperties().addAll(composite.getProperties());
+        domainComposite.getWires().addAll(composite.getWires());
+        domainComposite.getPolicySets().addAll(composite.getPolicySets());
+        domainComposite.getRequiredIntents().addAll(composite.getRequiredIntents());
+
+        // Clear the list of includes
+        domainComposite.getIncludes().clear();
+    }
+
+    /**
      * Reconcile component services and services defined on the component type.
      * 
      * @param component
@@ -1489,6 +1536,93 @@
         }
     }
 
+    /**
+     * Wire component references to component services and connect promoted
+     * services/references to component services/references inside a composite.
+     * 
+     * @param composite
+     * @param problems
+     */
+    protected void wireComposite(Composite composite, Composite domainComposite) {
+
+        // Wire nested composites recursively
+        for (Component component : composite.getComponents()) {
+            Implementation implementation = component.getImplementation();
+            if (implementation instanceof Composite) {
+                wireComposite((Composite)implementation);
+            }
+        }
+
+        // Index and bind all component services and references
+        Map<String, ComponentService> componentServices = new HashMap<String, ComponentService>();
+        Map<String, ComponentReference> componentReferences = new HashMap<String, ComponentReference>();
+
+        // Create SCA bindings on all component services and references
+        createSCABindings(composite, componentServices, componentReferences);
+
+        // Connect composite services and references to the component
+        // services and references that they promote
+        connectCompositeServices(composite, componentServices);
+        connectCompositeReferences(composite, componentReferences);
+        
+        // Add component services from the domain to the map of component services
+        // as they are possible targets for references
+        indexComponentServices(domainComposite, componentServices);
+
+        // Connect component references to their targets
+        connectComponentReferences(composite, componentServices, componentReferences);
+
+        // Connect component references as described in wires
+        connectWires(composite, componentServices, componentReferences);
+
+        // Resolve sourced properties
+        resolveSourcedProperties(composite, null);
+
+        // Validate that references are wired or promoted, according
+        // to their multiplicity
+        for (ComponentReference componentReference : componentReferences.values()) {
+            if (!ReferenceUtil.validateMultiplicityAndTargets(componentReference.getMultiplicity(), componentReference
+                .getTargets(), componentReference.getBindings())) {
+                if (componentReference.getTargets().isEmpty()) {
+
+                    // No warning if the reference is promoted out of the current composite
+                    boolean promoted = false;
+                    for (Reference reference : composite.getReferences()) {
+                        CompositeReference compositeReference = (CompositeReference)reference;
+                        if (compositeReference.getPromotedReferences().contains(componentReference)) {
+                            promoted = true;
+                            break;
+                        }
+                    }
+                    if (!promoted) {
+                        warning("No targets for reference: " + componentReference.getName(), composite);
+                    }
+                } else {
+                    warning("Too many targets on reference: " + componentReference.getName(), composite);
+                }
+            }
+        }
+    }
+
+    /**
+     * Index all component services inside a composite by component service URI.
+     * @param composite
+     * @param componentServices
+     */
+    private void indexComponentServices(Composite composite, Map<String, ComponentService> componentServices) {
+        for (Component component : composite.getComponents()) {
+            int i = 0;
+            for (ComponentService componentService : component.getServices()) {
+                String uri = component.getName() + '/' + componentService.getName();
+                componentServices.put(uri, componentService);
+                if (i == 0) {
+                    componentServices.put(component.getName(), componentService);
+                }
+                i++;
+            }
+        }
+    }
+    
     private ComponentProperty getComponentPropertyByName(String propertyName, List<ComponentProperty> properties) {
         if (properties != null) {
             for (ComponentProperty aProperty : properties) {

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java?view=diff&rev=558740&r1=558739&r2=558740
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java Mon Jul 23 07:25:22 2007
@@ -780,7 +780,7 @@
         CompositeBuilderImpl builder =
             new CompositeBuilderImpl(assemblyFactory, scaBindingFactory, interfaceContractMapper, monitor);
 
-        builder.build(composite);
+        builder.incrementalBuild(composite);
 
         // if (!problems.isEmpty()) {
         // throw new VariantRuntimeException(new RuntimeException("Problems in

Modified: incubator/tuscany/java/sca/modules/host-embedded/src/test/java/org/apache/tuscany/sca/host/embedded/impl/DefaultSCADomainTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-embedded/src/test/java/org/apache/tuscany/sca/host/embedded/impl/DefaultSCADomainTestCase.java?view=diff&rev=558740&r1=558739&r2=558740
==============================================================================
--- incubator/tuscany/java/sca/modules/host-embedded/src/test/java/org/apache/tuscany/sca/host/embedded/impl/DefaultSCADomainTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/host-embedded/src/test/java/org/apache/tuscany/sca/host/embedded/impl/DefaultSCADomainTestCase.java Mon Jul 23 07:25:22 2007
@@ -49,8 +49,12 @@
         assertEquals("CRUDServiceComponent", componentManager.getComponentNames().iterator().next());
         assertNotNull(componentManager.getComponent("CRUDServiceComponent"));
         
-        assertFalse(componentManager.isComponentStarted("CRUDServiceComponent"));
-        componentManager.startComponent("CRUDServiceComponent");
+        //FIXME this used to work because of a bug in the compositebuilder/activator, causing componentManager
+        // to use a duplicate instance of the component, the original instance having already been started by
+        // new DefaultSCADomain()...
+        
+        //assertFalse(componentManager.isComponentStarted("CRUDServiceComponent"));
+        //componentManager.startComponent("CRUDServiceComponent");
         assertTrue(componentManager.isComponentStarted("CRUDServiceComponent"));
         componentManager.stopComponent("CRUDServiceComponent");
         assertFalse(componentManager.isComponentStarted("CRUDServiceComponent"));



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