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 2009/09/18 12:49:33 UTC

svn commit: r816581 - in /tuscany/java/sca/modules/assembly/src/main: java/org/apache/tuscany/sca/assembly/builder/impl/ resources/

Author: slaws
Date: Fri Sep 18 10:49:33 2009
New Revision: 816581

URL: http://svn.apache.org/viewvc?rev=816581&view=rev
Log:
Some more incremental changes to the new builders. committing to create a backup at this stage. still doesn't work. 

Modified:
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentTypeBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/resources/assembly-validation-messages.properties

Modified: tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentBuilderImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentBuilderImpl.java?rev=816581&r1=816580&r2=816581&view=diff
==============================================================================
--- tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentBuilderImpl.java (original)
+++ tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentBuilderImpl.java Fri Sep 18 10:49:33 2009
@@ -84,6 +84,7 @@
     }
 
     /**
+     * Configure the component based on its component type using OASIS rules
      * 
      * @param component
      */
@@ -107,7 +108,7 @@
         configureServices(component);
         
         // references
-        //configureReferences(component);
+        configureReferences(component);
         
         // properties
         //configureProperties(component);
@@ -115,6 +116,8 @@
     }
        
     /**
+     * Use the component type builder to build the component type for 
+     * this component. 
      * 
      * @param component
      */
@@ -126,7 +129,9 @@
     }
     
     /**
-     *
+     * Configure this component's services based on the services in its 
+     * component type and the configuration from the composite file
+     * 
      * @param component
      */
     private void configureServices(Component component){
@@ -158,19 +163,65 @@
                                     componentService);
             
             
-            // intents - done in CompositePolicyBuilder
-            //           discuss with RF
+            // intents - done later in CompositePolicyBuilder - discuss with RF
             //calculateIntents(componentService,
             //                 componentTypeService);
 
-            // policy sets - done in CompositePolicyBuilder
-            //               discuss with RF
+            // policy sets - done later in CompositePolicyBuilder - discuss with RF
             // calculatePolicySets(componentService,
             //                     componentTypeService);
 
         }
     }
     
+    /**
+     * Configure this component's references based on the references in its 
+     * component type and the configuration from the composite file
+     * 
+     * @param component
+     */
+    private void configureReferences(Component component){
+        
+        // If the component type has references that are not described in this
+        // component then create references for this component
+        addReferencesFromComponentType(component);
+        
+        // Connect this component's references to the 
+        // references from its component type
+        connectReferencesToComponentType(component);
+        
+        // look at each component reference in turn and calculate its 
+        // configuration based on OASIS rules
+        for (ComponentReference componentReference : component.getReferences()) {
+            Reference componentTypeReference = componentReference.getReference();
+
+            // interface contracts
+            calculateInterfaceContract(componentReference,
+                                       componentTypeReference);
+            
+            // bindings
+            // We don've to do anything with reference bindings. You've either 
+            // specified one or you haven't
+            //calculateBindings(componentService,
+            //                  componentTypeService);
+            
+            
+            // add callback service model objects
+            //createCallbackService(component,
+            //                     componentReference);
+            
+            
+            // intents - done later in CompositePolicyBuilder - discuss with RF
+            //calculateIntents(componentService,
+            //                 componentTypeService);
+
+            // policy sets - done later in CompositePolicyBuilder - discuss with RF
+            // calculatePolicySets(componentService,
+            //                     componentTypeService);
+
+        }
+    }    
+    
     private void addServicesFromComponentType(Component component){
         
         // Create a component service for each service
@@ -190,6 +241,27 @@
                 }
             }
         }
+    }  
+    
+    private void addReferencesFromComponentType(Component component){
+        
+        // Create a component reference for each reference
+        if (component.getImplementation() != null) {
+            for (Reference reference : component.getImplementation().getReferences()) {
+                ComponentReference componentReference = 
+                    (ComponentReference)component.getReference(reference.getName());
+                
+                // if the component doesn't have a reference with the same name as the 
+                // component type reference then create one
+                if (componentReference == null) {
+                    componentReference = assemblyFactory.createComponentReference();
+                    componentReference.setForCallback(reference.isForCallback());
+                    componentReference.setName(reference.getName());
+                    componentReference.setReference(reference);
+                    component.getReferences().add(componentReference);
+                }
+            }
+        }
     }    
     
     private void connectServicesToComponentType(Component component){
@@ -214,36 +286,66 @@
             }
         }
     }
+    
+    private void connectReferencesToComponentType(Component component){
+        
+        // Connect each component reference to the corresponding component type reference
+        for (ComponentReference componentReference : component.getReferences()) {
+            if (componentReference.getReference() != null || componentReference.isForCallback()) {
+                continue;
+            }
+            
+            Reference reference = component.getImplementation().getReference(componentReference.getName());
+
+            if (reference != null) {
+                componentReference.setReference(reference);
+            } else {
+                Monitor.error(monitor, 
+                              this, 
+                              "assembly-validation-messages", 
+                              "ReferenceNotFoundForComponentReference", 
+                              component.getName(),
+                              componentReference.getName());
+            }
+        }        
+    }    
        
     /**
-     * OASIS RULE: Interface contract from higher in the hierarchy takes precedence
+     * OASIS RULE: Interface contract from higher in the implementation hierarchy takes precedence
      * 
-     * @param componentService the top service 
-     * @param componentTypeService the bottom service
-     */
-    private void calculateInterfaceContract(Service componentService,
-                                            Service componentTypeService){
-        // Use the interface contract from the higher level service (1) if
-        // none is specified on the lower level service (2)
-        InterfaceContract componentServiceInterfaceContract = componentService.getInterfaceContract();
-        InterfaceContract componentTypeServiceInterfaceContract = componentTypeService.getInterfaceContract();
-        
-        if (componentServiceInterfaceContract == null) {
-            componentService.setInterfaceContract(componentTypeServiceInterfaceContract);
-        } else if (componentTypeServiceInterfaceContract != null) {
-            // Check that the two interface contracts are compatible
-            boolean isCompatible =
-                interfaceContractMapper.isCompatible(componentServiceInterfaceContract,
-                                                     componentTypeServiceInterfaceContract);
+     * @param topContract the top contract 
+     * @param bottomContract the bottom contract
+     */   
+    private void calculateInterfaceContract(Contract topContract,
+                                            Contract bottomContract) {
+        // Use the interface contract from the bottom level contract if
+        // none is specified on the top level contract
+        InterfaceContract topInterfaceContract = topContract.getInterfaceContract();
+        InterfaceContract bottomInterfaceContract = bottomContract.getInterfaceContract();
+        
+        if (topInterfaceContract == null) {
+            topContract.setInterfaceContract(bottomInterfaceContract);
+        } else if (bottomInterfaceContract != null) {
+            // Check that the top and bottom interface contracts are compatible
+            boolean isCompatible = interfaceContractMapper.isCompatible(topInterfaceContract,
+                                                                        bottomInterfaceContract);
             if (!isCompatible) {
-                Monitor.error(monitor, 
-                              this, 
-                              "assembly-validation-messages", 
-                              "ServiceInterfaceNotSubSet", 
-                              componentService.getName());
+                if (topContract instanceof Reference) {
+                    Monitor.error(monitor, 
+                                  this,
+                                  "assembly-validation-messages",
+                                  "ReferenceInterfaceNotSubSet",
+                                  topContract.getName());
+                } else {
+                    Monitor.error(monitor, 
+                                  this,
+                                  "assembly-validation-messages",
+                                  "ServiceInterfaceNotSubSet",
+                                  topContract.getName());
+                }
             }
-        }         
-    }  
+        }
+    }    
     
     /**
      * OASIS RULE: Bindings from higher in the hierarchy take precedence
@@ -378,4 +480,4 @@
         contract.setOverridingBindings(false);
     }    
 
-} //end class
+}

Modified: tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentTypeBuilderImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentTypeBuilderImpl.java?rev=816581&r1=816580&r2=816581&view=diff
==============================================================================
--- tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentTypeBuilderImpl.java (original)
+++ tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentTypeBuilderImpl.java Fri Sep 18 10:49:33 2009
@@ -19,6 +19,7 @@
 package org.apache.tuscany.sca.assembly.builder.impl;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.logging.Logger;
 
@@ -31,9 +32,11 @@
 import org.apache.tuscany.sca.assembly.ComponentService;
 import org.apache.tuscany.sca.assembly.ComponentType;
 import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.CompositeReference;
 import org.apache.tuscany.sca.assembly.CompositeService;
 import org.apache.tuscany.sca.assembly.Contract;
 import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.assembly.Reference;
 import org.apache.tuscany.sca.assembly.SCABinding;
 import org.apache.tuscany.sca.assembly.SCABindingFactory;
 import org.apache.tuscany.sca.assembly.Service;
@@ -52,6 +55,9 @@
 /**
  * @version $Rev$ $Date$
  */
+
+// TODO - really implementation.composite component type builder
+
 public class ComponentTypeBuilderImpl {
     private static final Logger logger = Logger.getLogger(ComponentTypeBuilderImpl.class.getName());
     
@@ -114,19 +120,12 @@
                               component.getName());
             } 
             
-            /* process structural hierarchy
-             * replace by structuralParent links and associated processing
             // Push down the autowire flag from the composite to components
+            // TODO - Is this the right place to do this structural inheritance 
             if (component.getAutowire() == null) {
                 component.setAutowire(composite.getAutowire());
             }
-            
-            // what else needs pushing down? 
-            //  intents
-            //  policySets
-             
-            */
-            
+
             // configure the component from its component type
             componentBuilder.configureComponentFromComponentType(component);
         }
@@ -145,7 +144,7 @@
         calculateServices(composite, components, componentServices);
         
         // references
-        //calculateReferences(composite);
+        calculateReferences(composite, components, componentReferences);
         
         // properties
         //calculateProperties(composite);
@@ -229,7 +228,6 @@
         // calculate its configuration based on OASIS rules
         for (Service service : componentType.getServices()) {
             CompositeService compositeService = (CompositeService)service;
-            Component promotedComponent = compositeService.getPromotedComponent();
             ComponentService promotedComponentService = compositeService.getPromotedService();
             
             // promote interface contracts
@@ -238,15 +236,55 @@
             // promote bindings
             calculatePromotedBindings(compositeService, promotedComponentService);
             
-            // promote intents
+            // promote intents - done later in CompositePolicyBuilder - discuss with RF
             // calculatePromotedIntents(compositeService, promotedComponentService);
             
-            // promote policy sets
+            // promote policy sets - done later in CompositePolicyBuilder - discuss with RF
             // calculatePromotedPolicySets(compositeService, promotedComponentService);
+        }        
+    }
+    
+    /**
+     * Connect the references in the component type to the component references that
+     * they promote
+     * 
+     * @param componentType
+     * @param component
+     */
+    private void calculateReferences(ComponentType componentType,
+                                     Map<String, Component> components,
+                                     Map<String, ComponentReference> componentReferences){
+
+        // Connect this component type's references to the 
+        // references from child components which it promotes
+        connectPromotedReferences(componentType,
+                                  components,
+                                  componentReferences);
         
-        }
+        // look at each component type reference in turn and 
+        // calculate its configuration based on OASIS rules
+        for (Reference reference : componentType.getReferences()) {
+            CompositeReference compositeReference = (CompositeReference)reference;
+            List<ComponentReference> promotedReferences = compositeReference.getPromotedReferences();
+            
+            for(ComponentReference promotedComponentReference : promotedReferences){
+                
+                // promote interface contracts
+                calculatePromotedInterfaceContract(compositeReference, promotedComponentReference);
                
-    }
+                // promote bindings
+                // Don't need to promote reference bindings as any lower level binding will
+                // already be targeting the correct service without need for promotion
+                //calculatePromotedBindings(compositeReference, promotedComponentReference);
+                
+                // promote intents - done later in CompositePolicyBuilder - discuss with RF
+                // calculatePromotedIntents(compositeService, promotedComponentService);
+                
+                // promote policy sets - done later in CompositePolicyBuilder - discuss with RF
+                // calculatePromotedPolicySets(compositeService, promotedComponentService);
+            }
+        }        
+    }    
     
     /**
      * Connect the services in the component type to the component services that
@@ -300,39 +338,89 @@
                 }                
             }
         }      
-    }  
+    } 
     
     /**
-     * OASIS RULE: Interface contracts from higher in the implementation hierarchy takes precedence
+     * Connect the references in the component type to the component references that
+     * they promote
      * 
-     * @param compositeService
-     * @param promotedComponentService
+     * @param componentType
+     * @param component
      */
-    private void calculatePromotedInterfaceContract(CompositeService compositeService,
-                                                    ComponentService promotedComponentService){
-        // Use the interface contract from the promoted component service if
-        // none is specified on the composite service
-        InterfaceContract compositeServiceInterfaceContract = compositeService.getInterfaceContract();
-        InterfaceContract promotedServiceInterfaceContract = promotedComponentService.getInterfaceContract();
-        if (compositeServiceInterfaceContract == null) {
-            compositeService.setInterfaceContract(promotedServiceInterfaceContract);
-        } else if (promotedServiceInterfaceContract != null) {
-            // Check that the compositeServiceInterfaceContract and promotedServiceInterfaceContract
-            // are compatible
-            boolean isCompatible =
-                interfaceContractMapper.isCompatible(compositeServiceInterfaceContract,
-                                                     promotedServiceInterfaceContract);
-            if (!isCompatible) {
-                Monitor.error(monitor, 
-                              this, 
-                              "assembly-validation-messages", 
-                              "ServiceInterfaceNotSubSet", 
-                              promotedComponentService.getName());
+    private void connectPromotedReferences(ComponentType componentType,
+                                           Map<String, Component> components,
+                                           Map<String, ComponentReference> componentReferences){
+        
+        // Connect composite (component type) references to the component references that they promote
+        for (Reference reference : componentType.getReferences()) {
+            CompositeReference compositeReference = (CompositeReference)reference;
+            List<ComponentReference> promotedReferences = compositeReference.getPromotedReferences();
+            for (int i = 0, n = promotedReferences.size(); i < n; i++) {
+                ComponentReference componentReference = promotedReferences.get(i);
+                if (componentReference.isUnresolved()) {
+                    String componentReferenceName = componentReference.getName();
+                    componentReference = componentReferences.get(componentReferenceName);
+                    if (componentReference != null) {
+                        // Set the promoted component
+                        Component promotedComponent = compositeReference.getPromotedComponents().get(i);
+                        promotedComponent = components.get(promotedComponent.getName());
+                        compositeReference.getPromotedComponents().set(i, promotedComponent);
+
+                        componentReference.setPromoted(true);
+
+                        // Point to the resolved component reference
+                        promotedReferences.set(i, componentReference);                        
+                    } else {
+                        Monitor.error(monitor,
+                                      this,
+                                      "assembly-validation-messages",
+                                      "PromotedReferenceNotFound",
+                                      ((Composite)componentType).getName().toString(),
+                                      componentReferenceName);
+                    }
+                }
             }
-        }         
+        }        
     }
     
     /**
+     * OASIS RULE: Interface contract from higher in the implementation hierarchy takes precedence
+     * 
+     * @param topContract the top contract 
+     * @param bottomContract the bottom contract
+     */   
+    private void calculatePromotedInterfaceContract(Contract topContract,
+                                                    Contract bottomContract) {
+        // Use the interface contract from the bottom level contract if
+        // none is specified on the top level contract
+        InterfaceContract topInterfaceContract = topContract.getInterfaceContract();
+        InterfaceContract bottomInterfaceContract = bottomContract.getInterfaceContract();
+        
+        if (topInterfaceContract == null) {
+            topContract.setInterfaceContract(bottomInterfaceContract);
+        } else if (bottomInterfaceContract != null) {
+            // Check that the top and bottom interface contracts are compatible
+            boolean isCompatible = interfaceContractMapper.isCompatible(topInterfaceContract,
+                                                                        bottomInterfaceContract);
+            if (!isCompatible) {
+                if (topContract instanceof Reference) {
+                    Monitor.error(monitor, 
+                                  this,
+                                  "assembly-validation-messages",
+                                  "ReferenceInterfaceNotSubSet",
+                                  topContract.getName());
+                } else {
+                    Monitor.error(monitor, 
+                                  this,
+                                  "assembly-validation-messages",
+                                  "ServiceInterfaceNotSubSet",
+                                  topContract.getName());
+                }
+            }
+        }
+    } 
+    
+    /**
      * OASIS RULE: Bindings from higher in the implementation hierarchy take precedence
      * 
      * @param compositeService

Modified: tuscany/java/sca/modules/assembly/src/main/resources/assembly-validation-messages.properties
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/assembly/src/main/resources/assembly-validation-messages.properties?rev=816581&r1=816580&r2=816581&view=diff
==============================================================================
--- tuscany/java/sca/modules/assembly/src/main/resources/assembly-validation-messages.properties (original)
+++ tuscany/java/sca/modules/assembly/src/main/resources/assembly-validation-messages.properties Fri Sep 18 10:49:33 2009
@@ -32,7 +32,7 @@
 PropertyMustSupplyIncompatible = Component property mustSupply attribute incompatible with property: Component = {0} Property = {1}
 PropertyMustSupplyNull = [ASM_4008] No value configured on a mustSupply property: Component = {0} Property = {1}
 PropertyOverrideManyAttribute = Component property many attribute incompatible with property: Component = {0} Property = {1}
-ReferenceNotFound = Reference not found for component reference: Component = {0} Reference = {1}
+ReferenceNotFoundForComponentReference = Reference not found for component reference: Component = {0} Reference = {1}
 ReferenceIncompatibleMultiplicity = Component reference multiplicity incompatible with reference multiplicity: Component = {0} Reference = {1}
 ReferenceIncompatibleInterface = Incompatible interfaces on component reference and target: Composite = {0} Reference = {1} Service = {2}
 ReferencePromotionIncompatibleInterface = Promoted reference interface incompatible with promoting reference: Promoting interface = {0} Promoted = {1}