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