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


Reply via email to