summaryrefslogtreecommitdiffstats
path: root/java/sca/modules/assembly
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-09-24 23:22:13 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-09-24 23:22:13 +0000
commit4d1c0a9df577f64e240978520acfdec432f7d5be (patch)
tree726f03660dd9c35e71aa3b712e94d220fcbcb664 /java/sca/modules/assembly
parent8032feb211841df8a32e629896facb1947530415 (diff)
Improve CompositeImpl.clone so that it clones both included and nested composites
Move the CompositeCloneBuilder to be called before the compositeIncludeBuilder so that the include builder doesn't have to mix with clone git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@818657 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/sca/modules/assembly')
-rw-r--r--java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java6
-rw-r--r--java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeCloneBuilderImpl.java75
-rw-r--r--java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeIncludeBuilderImpl.java175
-rw-r--r--java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ModelBuilderImpl.java7
-rw-r--r--java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/ComponentImpl.java11
-rw-r--r--java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/CompositeImpl.java6
6 files changed, 93 insertions, 187 deletions
diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java
index 0e5bd2edb7..5fa9c9db17 100644
--- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java
+++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderImpl.java
@@ -115,12 +115,12 @@ public class CompositeBuilderImpl implements CompositeBuilder, DeployedComposite
try {
+ // Clone nested and included composites
+ composite = compositeCloneBuilder.build(composite, definitions, monitor);
+
// Collect and fuse includes
composite = compositeIncludeBuilder.build(composite, definitions, monitor);
- // Expand nested composites
- composite = compositeCloneBuilder.build(composite, definitions, monitor);
-
// Configure all components
composite = componentConfigurationBuilder.build(composite, definitions, monitor);
diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeCloneBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeCloneBuilderImpl.java
index 07c1c0c7fc..808ecf1993 100644
--- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeCloneBuilderImpl.java
+++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeCloneBuilderImpl.java
@@ -20,7 +20,6 @@
package org.apache.tuscany.sca.assembly.builder.impl;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import org.apache.tuscany.sca.assembly.Component;
@@ -43,7 +42,19 @@ public class CompositeCloneBuilderImpl implements CompositeBuilder {
public Composite build(Composite composite, Definitions definitions, Monitor monitor)
throws CompositeBuilderException {
- expandCompositeImplementations(composite);
+ // Clone the includes
+ List<Composite> includes = new ArrayList<Composite>();
+ for (Composite included : composite.getIncludes()) {
+ try {
+ includes.add((Composite)included.clone());
+ } catch (CloneNotSupportedException e) {
+ throw new UnsupportedOperationException(e);
+ }
+ }
+ composite.getIncludes().clear();
+ composite.getIncludes().addAll(includes);
+
+ cloneCompositeImplementations(composite);
return composite;
}
@@ -52,74 +63,26 @@ public class CompositeCloneBuilderImpl implements CompositeBuilder {
}
/**
- * Expand composite component implementations.
+ * Clone composite component implementations
*
* @param composite
* @param problems
*/
- private void expandCompositeImplementations(Composite composite) {
+ private void cloneCompositeImplementations(Composite composite) {
for (Component component : composite.getComponents()) {
Implementation implementation = component.getImplementation();
if (implementation instanceof Composite) {
Composite compositeImplementation = (Composite)implementation;
- Composite clone;
try {
- clone = (Composite)compositeImplementation.clone();
+ // Please note the clone method is recursive
+ Composite clone = (Composite)compositeImplementation.clone();
+ component.setImplementation(clone);
} catch (CloneNotSupportedException e) {
- throw new RuntimeException(e);
- }
- component.setImplementation(clone);
- expandCompositeImplementations(clone);
- }
- }
- }
-
- /**
- * Collect all nested composite implementations in a graph of composites.
- *
- * @param composite
- * @param nested
- */
- private void collectNestedComposites(Composite composite, List<Composite> nested) {
- for (Component component : composite.getComponents()) {
- Implementation implementation = component.getImplementation();
- if (implementation instanceof Composite) {
- Composite nestedComposite = (Composite)implementation;
- nested.add(nestedComposite);
- collectNestedComposites(nestedComposite, nested);
- }
- }
- }
-
- /**
- * Fuse nested composites into a top level composite.
- *
- * @param composite
- */
- private void fuseCompositeImplementations(Composite composite) {
-
- // First collect all nested composites
- List<Composite> nested = new ArrayList<Composite>();
- collectNestedComposites(composite, nested);
-
- // Then add all the non-composite components they contain
- for (Composite nestedComposite : nested) {
- for (Component component : nestedComposite.getComponents()) {
- Implementation implementation = component.getImplementation();
- if (!(implementation instanceof Composite)) {
- composite.getComponents().add(component);
+ throw new UnsupportedOperationException(e);
}
}
}
-
- // Clear the initial list of composite components
- for (Iterator<Component> i = composite.getComponents().iterator(); i.hasNext();) {
- Component component = i.next();
- if (component.getImplementation() instanceof Composite) {
- i.remove();
- }
- }
}
}
diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeIncludeBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeIncludeBuilderImpl.java
index 52dd769f8a..2a28c48905 100644
--- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeIncludeBuilderImpl.java
+++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeIncludeBuilderImpl.java
@@ -19,9 +19,6 @@
package org.apache.tuscany.sca.assembly.builder.impl;
-import java.util.HashSet;
-import java.util.Set;
-
import org.apache.tuscany.sca.assembly.Component;
import org.apache.tuscany.sca.assembly.Composite;
import org.apache.tuscany.sca.assembly.Implementation;
@@ -48,151 +45,81 @@ public class CompositeIncludeBuilderImpl implements CompositeBuilder {
public Composite build(Composite composite, Definitions definitions, Monitor monitor)
throws CompositeBuilderException {
- fuseIncludes(composite, monitor);
- return composite;
+ return processIncludes(composite, monitor);
}
/**
- * Copy a list of includes into a composite.
- *
+ * Merge the elements from the included composites into the including composite
* @param composite
+ * @param monitor
+ * @return
*/
- private void fuseIncludes(Composite composite, Monitor monitor) {
-
+ private Composite processIncludes(Composite composite, Monitor monitor) {
monitor.pushContext("Composite: " + composite.getName().toString());
try {
- Set<Composite> visited = new HashSet<Composite>();
- visited.add(composite);
+ // process any composites referenced through implementation.composite
+ for (Component component : composite.getComponents()) {
+
+ // recurse for composite implementations
+ Implementation implementation = component.getImplementation();
+ if (implementation instanceof Composite) {
+ processIncludes((Composite)implementation, monitor);
+ }
+ }
+ // get the components etc. from any included composites
for (Composite included : composite.getIncludes()) {
if (included.isLocal() && !composite.isLocal()) {
// ASM60041
Monitor.error(monitor, this, "assembly-validation-messages", "IllegalCompositeIncusion", composite
.getName().toString(), included.getName().toString());
+ return null;
}
- Composite fusedComposite = fuseInclude(included, visited, monitor);
- if (fusedComposite != null) {
- composite.getComponents().addAll(fusedComposite.getComponents());
- composite.getServices().addAll(fusedComposite.getServices());
- composite.getReferences().addAll(fusedComposite.getReferences());
- composite.getProperties().addAll(fusedComposite.getProperties());
- composite.getWires().addAll(fusedComposite.getWires());
- }
- }
- // Clear the list of includes as all of the included components
- // have now been added into the top level composite
- composite.getIncludes().clear();
+ // The included has been cloned during composite.clone()
+ Composite merged = processIncludes(included, monitor);
+ if (merged != null) {
+ for (Component component : merged.getComponents()) {
+ // apply the autowire flag on this composite to any inline
+ // components - Assembly 5.6 point 4
+ if (component.getAutowire() == null && merged.getAutowire() == Boolean.TRUE) {
+ component.setAutowire(Boolean.TRUE);
+ }
+ // Merge the intents and policySets from the included composite into
+ // component/service/reference elements under the composite
+ component.getRequiredIntents().addAll(merged.getRequiredIntents());
+ component.getPolicySets().addAll(merged.getPolicySets());
+ }
- // process any composites referenced through implementation.composite
- for (Component component : composite.getComponents()) {
- monitor.pushContext("Component: " + component.getName());
+ for (Service service : merged.getServices()) {
+ service.getRequiredIntents().addAll(merged.getRequiredIntents());
+ service.getPolicySets().addAll(merged.getPolicySets());
+ }
- try {
- // recurse for composite implementations
- Implementation implementation = component.getImplementation();
- if (implementation instanceof Composite) {
- fuseIncludes((Composite)implementation, monitor);
+ for (Reference reference : merged.getReferences()) {
+ reference.getRequiredIntents().addAll(merged.getRequiredIntents());
+ reference.getPolicySets().addAll(merged.getPolicySets());
}
- } finally {
- monitor.popContext();
+ composite.getComponents().addAll(merged.getComponents());
+ composite.getServices().addAll(merged.getServices());
+ composite.getReferences().addAll(merged.getReferences());
+ composite.getProperties().addAll(merged.getProperties());
+ composite.getWires().addAll(merged.getWires());
+ // FIXME: What should we do for the extensions
+ /*
+ clone.getExtensions().addAll(fusedComposite.getExtensions());
+ clone.getAttributeExtensions().addAll(fusedComposite.getAttributeExtensions());
+ */
}
}
+ composite.getIncludes().clear();
+
+ // return the fused composite we have built up so far
+ return composite;
} finally {
monitor.popContext();
}
}
-
- private Composite fuseInclude(Composite include, Set<Composite> visited, Monitor monitor) {
-
- if (visited.contains(include)) {
- // FIXME: [rfeng] Do we need to have a warning? I think it is fine to have Composite A
- // include B and C while both B and C include D.
- Monitor.warning(monitor, this, "assembly-validation-messages", "CompositeAlreadyIncluded", include
- .getName().toString());
- return null;
- }
-
- visited.add(include);
-
- Composite clone;
- try {
- clone = (Composite)include.clone();
- } catch (CloneNotSupportedException e) {
- throw new RuntimeException(e);
- }
-
- // get the components etc. from any included composites
- for (Composite included : include.getIncludes()) {
- if (included.isLocal() && !include.isLocal()) {
- // ASM60041
- Monitor.error(monitor, this, "assembly-validation-messages", "IllegalCompositeIncusion", include
- .getName().toString(), included.getName().toString());
- return null;
- }
-
- Composite fusedComposite = fuseInclude(included, visited, monitor);
- if (fusedComposite != null) {
- clone.getComponents().addAll(fusedComposite.getComponents());
- clone.getServices().addAll(fusedComposite.getServices());
- clone.getReferences().addAll(fusedComposite.getReferences());
- clone.getProperties().addAll(fusedComposite.getProperties());
- clone.getWires().addAll(fusedComposite.getWires());
- // FIXME: What should we do for the extensions
- /*
- clone.getExtensions().addAll(fusedComposite.getExtensions());
- clone.getAttributeExtensions().addAll(fusedComposite.getAttributeExtensions());
- */
- }
- }
-
- // apply the autowire flag on this composite to any inline
- // components - Assembly 5.6 point 4
- if (include.getAutowire() == Boolean.TRUE) {
- for (Component component : clone.getComponents()) {
- if (component.getAutowire() == null) {
- component.setAutowire(Boolean.TRUE);
- }
- }
- }
-
- // Merge the intents and policySets from the included composite into
- // component/service/reference elements under the composite
- for (Component component : clone.getComponents()) {
- component.getRequiredIntents().addAll(include.getRequiredIntents());
- component.getPolicySets().addAll(include.getPolicySets());
- }
-
- for (Service service : clone.getServices()) {
- service.getRequiredIntents().addAll(include.getRequiredIntents());
- service.getPolicySets().addAll(include.getPolicySets());
- }
-
- for (Reference reference : clone.getReferences()) {
- reference.getRequiredIntents().addAll(include.getRequiredIntents());
- reference.getPolicySets().addAll(include.getPolicySets());
- }
-
- // process any composites referenced through implementation.composite
- for (Component component : clone.getComponents()) {
-
- // recurse for composite implementations
- Implementation implementation = component.getImplementation();
- if (implementation instanceof Composite) {
- try {
- monitor.pushContext("Component: " + component.getName());
- fuseIncludes((Composite)implementation, monitor);
- } finally {
- monitor.popContext();
- }
- }
- }
-
- clone.getIncludes().clear();
-
- // return the fused composite we have built up so far
- return clone;
- }
}
diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ModelBuilderImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ModelBuilderImpl.java
index c7693e135e..99c5947ab3 100644
--- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ModelBuilderImpl.java
+++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ModelBuilderImpl.java
@@ -88,6 +88,9 @@ public class ModelBuilderImpl implements CompositeBuilder, DeployedCompositeBuil
Monitor monitor) throws CompositeBuilderException {
try {
+ // Clone the composites that are included or referenced in implementation.composite
+ composite = compositeCloneBuilder.build(composite, definitions, monitor);
+
// Collect and fuse includes. Copy all of the components
// out of the included composite into the including composite
// and discards the included composite
@@ -95,10 +98,6 @@ public class ModelBuilderImpl implements CompositeBuilder, DeployedCompositeBuil
// need to apply policy external attachment
- // Expand nested composites. Clone any composite model that
- // is acting as a component implementation and connects the cloned
- // model to the component implementation in question
- composite = compositeCloneBuilder.build(composite, definitions, monitor);
// Process the implementation hierarchy by calculating the component type
// for the top level implementation (composite). This has the effect of
diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/ComponentImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/ComponentImpl.java
index 9b4db8a8e0..0227ab3c65 100644
--- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/ComponentImpl.java
+++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/ComponentImpl.java
@@ -25,6 +25,7 @@ import org.apache.tuscany.sca.assembly.Component;
import org.apache.tuscany.sca.assembly.ComponentProperty;
import org.apache.tuscany.sca.assembly.ComponentReference;
import org.apache.tuscany.sca.assembly.ComponentService;
+import org.apache.tuscany.sca.assembly.Composite;
import org.apache.tuscany.sca.assembly.ConstrainingType;
import org.apache.tuscany.sca.assembly.Implementation;
import org.apache.tuscany.sca.assembly.Property;
@@ -74,6 +75,16 @@ public class ComponentImpl extends ExtensibleImpl implements Component, Cloneabl
for (ComponentService service : getServices()) {
clone.services.add((ComponentService)service.clone());
}
+
+ // Clone the implementation.composite
+ if(implementation instanceof Composite) {
+ clone.implementation = (Composite) ((Composite) implementation).clone();
+ }
+
+ // Clone the Lists for intents and policySets
+ clone.requiredIntents = new ArrayList<Intent>(getRequiredIntents());
+ clone.policySets = new ArrayList<PolicySet>(getPolicySets());
+
return clone;
}
diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/CompositeImpl.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/CompositeImpl.java
index e93d5ebc25..440bd340fc 100644
--- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/CompositeImpl.java
+++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/CompositeImpl.java
@@ -89,6 +89,12 @@ public class CompositeImpl extends ImplementationImpl implements Composite, Clon
for (Wire wire : getWires()) {
clone.wires.add((Wire)wire.clone());
}
+
+ // Clone the includes
+ clone.includes = new ArrayList<Composite>(includes);
+ for (Composite included : getIncludes()) {
+ clone.includes.add((Composite)included.clone());
+ }
return clone;
}