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/08/20 13:15:59 UTC

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

Author: slaws
Date: Thu Aug 20 11:15:59 2009
New Revision: 806124

URL: http://svn.apache.org/viewvc?rev=806124&view=rev
Log:
Correct the reference multiplicity validation algorithm to match what OASIS is expecting

Modified:
    tuscany/java/sca/itest/references/src/main/java/org/apache/tuscany/sca/itest/references/AComponentImpl.java
    tuscany/java/sca/itest/references/src/main/resources/AutoWiredReferencesTest.composite
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceEndpointReferenceBuilderImpl.java
    tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ReferenceConfigurationUtil.java

Modified: tuscany/java/sca/itest/references/src/main/java/org/apache/tuscany/sca/itest/references/AComponentImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/itest/references/src/main/java/org/apache/tuscany/sca/itest/references/AComponentImpl.java?rev=806124&r1=806123&r2=806124&view=diff
==============================================================================
--- tuscany/java/sca/itest/references/src/main/java/org/apache/tuscany/sca/itest/references/AComponentImpl.java (original)
+++ tuscany/java/sca/itest/references/src/main/java/org/apache/tuscany/sca/itest/references/AComponentImpl.java Thu Aug 20 11:15:59 2009
@@ -48,7 +48,7 @@
 
     private DComponent dReference2;
 
-    @Reference(name = "dReference1")
+    @Reference(name = "dReference1", required = false)
     public void setDReference(DComponent dReference) {
         this.dReference1 = dReference;
     }

Modified: tuscany/java/sca/itest/references/src/main/resources/AutoWiredReferencesTest.composite
URL: http://svn.apache.org/viewvc/tuscany/java/sca/itest/references/src/main/resources/AutoWiredReferencesTest.composite?rev=806124&r1=806123&r2=806124&view=diff
==============================================================================
--- tuscany/java/sca/itest/references/src/main/resources/AutoWiredReferencesTest.composite (original)
+++ tuscany/java/sca/itest/references/src/main/resources/AutoWiredReferencesTest.composite Thu Aug 20 11:15:59 2009
@@ -23,7 +23,7 @@
         <implementation.java class="org.apache.tuscany.sca.itest.references.AComponentImpl" />
         <reference name="bReference" target="BComponent" />
         <reference name="cReference" autowire="true" />
-        <reference name="dReference1" />
+        <reference name="dReference1" multiplicity="0..1"/>
         <!-- 
             <reference name="dReference1" target="DComponent" />
         -->

Modified: tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceEndpointReferenceBuilderImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceEndpointReferenceBuilderImpl.java?rev=806124&r1=806123&r2=806124&view=diff
==============================================================================
--- tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceEndpointReferenceBuilderImpl.java (original)
+++ tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ComponentReferenceEndpointReferenceBuilderImpl.java Thu Aug 20 11:15:59 2009
@@ -35,6 +35,7 @@
 import org.apache.tuscany.sca.assembly.EndpointReference;
 import org.apache.tuscany.sca.assembly.Implementation;
 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.builder.CompositeBuilder;
 import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
@@ -81,7 +82,6 @@
     private void processComponentReferences(Composite composite) {
 
         monitor.pushContext("Composite: " + composite.getName().toString());
-        
         try {
             // index all of the components in the composite
             Map<String, Component> components = new HashMap<String, Component>();
@@ -128,14 +128,20 @@
                             } // end if
                         } // end for
                     } // end for
+                    
+                    // Validate that references are wired or promoted, according
+                    // to their multiplicity   
+                    validateReferenceMultiplicity(composite, component);
                 
                 } finally {
                     monitor.popContext();
                 }
             } // end for
+        
         } finally {
             monitor.popContext();
         }
+
     } // end method processCompoenntReferences
 
     private void createReferenceEndpointReferences(Composite composite,
@@ -154,6 +160,13 @@
             // autowired reference
             Multiplicity multiplicity = reference.getMultiplicity();
             for (Component targetComponent : composite.getComponents()) {
+                
+                // Tuscany specific selection of the first autowire reference
+                // when there are more than one (ASM_60025)
+                if ((multiplicity == Multiplicity.ZERO_ONE || multiplicity == Multiplicity.ONE_ONE) &&
+                    (reference.getEndpointReferences().size() != 0) ) {
+                    break;
+                }
 
                 // Prevent autowire connecting to self
                 if (targetComponent == component)
@@ -393,6 +406,48 @@
         
     } // end method
     
+    private void validateReferenceMultiplicity(Composite composite, Component component){
+        for (ComponentReference componentReference : component.getReferences()) {
+            if (!ReferenceConfigurationUtil.validateMultiplicityAndTargets(componentReference.getMultiplicity(),
+                                                                           componentReference.getEndpointReferences())) {
+                if (componentReference.getEndpointReferences().isEmpty()) {
+
+                    // No error 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 && !componentReference.isForCallback()) {
+                        Monitor.error(monitor,
+                                      this,
+                                      "assembly-validation-messages",
+                                      "ReferenceWithoutTargets",
+                                      composite.getName().toString(),
+                                      componentReference.getName());
+                    }
+                } else {             
+                    // no error if reference is autowire and more targets
+                    // than multiplicity have been found 
+                    if (componentReference.getAutowire() == true){
+                        break;
+                    }
+                    
+                    // TUSCANY-3132  first example of updated error handling                  
+                    Monitor.error(monitor,
+                                  this,
+                                  "assembly-validation-messages",
+                                  "TooManyReferenceTargets", 
+                                  componentReference.getName());                  
+                }
+            }
+        }
+
+    }
+    
     /**
      * Create Endpoint References for a component reference inside a given composite
      * @param composite - the composite

Modified: tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ReferenceConfigurationUtil.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ReferenceConfigurationUtil.java?rev=806124&r1=806123&r2=806124&view=diff
==============================================================================
--- tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ReferenceConfigurationUtil.java (original)
+++ tuscany/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/impl/ReferenceConfigurationUtil.java Thu Aug 20 11:15:59 2009
@@ -79,16 +79,15 @@
         }
     }
 
-    static boolean validateMultiplicityAndTargets(Multiplicity multiplicity, List<?> targets, List<Binding> bindings) {
+    static boolean validateMultiplicityAndTargets(Multiplicity multiplicity, List<EndpointReference> endpointReferences) {
 
-        // Count targets
-        int count = targets.size();
-
-        //FIXME workaround, this validation is sometimes invoked too early
-        // before we get a chance to init the multiplicity attribute
-        if (multiplicity == null) {
+        // In some tests multiplicity is not set
+        if (multiplicity == null){
             return true;
         }
+        
+        // Count targets
+        int count = endpointReferences.size();
 
         switch (multiplicity) {
             case ZERO_N:
@@ -100,25 +99,11 @@
                 break;
             case ONE_ONE:
                 if (count != 1) {
-                    if (count == 0) {
-                        for (Binding binding : bindings) {
-                            if (!(binding instanceof OptimizableBinding) || binding.getURI() != null) {
-                                return true;
-                            }
-                        }
-                    }
                     return false;
                 }
                 break;
             case ONE_N:
                 if (count < 1) {
-                    if (count == 0) {
-                        for (Binding binding : bindings) {
-                            if (!(binding instanceof OptimizableBinding) || binding.getURI() != null) {
-                                return true;
-                            }
-                        }
-                    }
                     return false;
                 }
                 break;