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 2010/03/05 13:59:57 UTC

svn commit: r919398 - in /tuscany/sca-java-2.x/trunk/modules: assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/ builder/src/main/java/org/apache/tuscany/sca/builder/impl/

Author: slaws
Date: Fri Mar  5 12:59:57 2010
New Revision: 919398

URL: http://svn.apache.org/viewvc?rev=919398&view=rev
Log:
TUSCANY-3486 - add the composite reference multiplicy resolution algorithm as per the spec

Modified:
    tuscany/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties
    tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/CompositeComponentTypeBuilderImpl.java

Modified: tuscany/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties?rev=919398&r1=919397&r2=919398&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties (original)
+++ tuscany/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties Fri Mar  5 12:59:57 2010
@@ -32,6 +32,7 @@
 PropertyMustSupplyNull = [ASM40011,ASM60034] No value configured on a mustSupply property: Component = {0} Property = {1}
 PropertyOverrideManyAttribute = Component property many attribute incompatible with property: Component = {0} Property = {1}
 ReferenceNotFoundForComponentReference = [ASM50008] Component type reference not found for component reference: Component = {0} Reference = {1}
+CompositeReferenceIncompatibleMultiplicity = [ASM60011] Composite reference multiplicity incompatible with component reference multiplicity: Composite = {0} Composite reference = {1} Component reference = {2}
 ReferenceIncompatibleMultiplicity = [ASM50009] 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}

Modified: tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/CompositeComponentTypeBuilderImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/CompositeComponentTypeBuilderImpl.java?rev=919398&r1=919397&r2=919398&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/CompositeComponentTypeBuilderImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/CompositeComponentTypeBuilderImpl.java Fri Mar  5 12:59:57 2010
@@ -35,6 +35,7 @@
 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.Multiplicity;
 import org.apache.tuscany.sca.assembly.Reference;
 import org.apache.tuscany.sca.assembly.SCABinding;
 import org.apache.tuscany.sca.assembly.SCABindingFactory;
@@ -263,6 +264,9 @@
             List<ComponentReference> promotedReferences = compositeReference.getPromotedReferences();
 
             for (ComponentReference promotedComponentReference : promotedReferences) {
+                
+                // promote multiplicity
+                reconcileReferenceMultiplicity(componentType, compositeReference, promotedComponentReference, monitor);
 
                 // promote interface contracts
                 calculatePromotedReferenceInterfaceContract(compositeReference, promotedComponentReference, monitor);
@@ -520,5 +524,68 @@
             }
         }
     }
+    
+    private void reconcileReferenceMultiplicity(ComponentType componentType,
+                                                Reference compositeReference, 
+                                                Reference promotedComponentReference,
+                                                Monitor monitor) {
+        if (compositeReference.getMultiplicity() != null) {
+            if (!isValidMultiplicityOverride(promotedComponentReference.getTargets().size() > 0,
+                                             promotedComponentReference.getMultiplicity(), 
+                                             compositeReference.getMultiplicity())) {
+                Monitor.error(monitor, 
+                              this, 
+                              Messages.ASSEMBLY_VALIDATION,
+                              "CompositeReferenceIncompatibleMultiplicity", 
+                              componentType.getURI(), 
+                              compositeReference.getName(),
+                              promotedComponentReference.getName());
+            }
+        } else {
+            compositeReference.setMultiplicity(promotedComponentReference.getMultiplicity());
+        }
+    }    
+    
+    private boolean isValidMultiplicityOverride(boolean componentRefHasTarget,
+                                                Multiplicity componentRefMul, 
+                                                Multiplicity compositeRefMul) {
+        if ((componentRefMul != null) && 
+            (compositeRefMul != null) &&
+             componentRefMul != compositeRefMul) {
+            if (componentRefHasTarget){
+                switch (componentRefMul) {
+                    case ZERO_ONE:
+                        return compositeRefMul == Multiplicity.ZERO_ONE || 
+                               compositeRefMul == Multiplicity.ONE_ONE;
+                    case ONE_ONE:
+                        return compositeRefMul == Multiplicity.ZERO_ONE || 
+                               compositeRefMul == Multiplicity.ONE_ONE;                      
+                    case ZERO_N:
+                        return true;
+                    case ONE_N:
+                        return true;
+                    default:
+                        return false;
+                }
+            } else {
+                switch (componentRefMul) {
+                    case ZERO_ONE:
+                        return compositeRefMul == Multiplicity.ONE_ONE;
+                    case ONE_ONE:
+                        return compositeRefMul == Multiplicity.ONE_ONE;                      
+                    case ZERO_N:
+                        return true;
+                    case ONE_N:
+                        return compositeRefMul == Multiplicity.ONE_ONE || 
+                               compositeRefMul == Multiplicity.ONE_N;
+
+                    default:
+                        return false;
+                }
+            }
+        } else {
+            return true;
+        }
+    }    
 
 } //end class