You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2007/01/25 08:35:53 UTC

svn commit: r499694 - in /incubator/tuscany/java/sca/kernel/core/src: main/java/org/apache/tuscany/core/loader/ main/java/org/apache/tuscany/core/wire/ test/java/org/apache/tuscany/core/loader/ test/java/org/apache/tuscany/core/wire/

Author: rfeng
Date: Wed Jan 24 23:35:52 2007
New Revision: 499694

URL: http://svn.apache.org/viewvc?view=rev&rev=499694
Log:
Add multiplicity support for component references during loading and wiring

Modified:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireServiceExtension.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderValidationTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireServiceExtensionTestCase.java

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java?view=diff&rev=499694&r1=499693&r2=499694
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java Wed Jan 24 23:35:52 2007
@@ -18,22 +18,24 @@
  */
 package org.apache.tuscany.core.loader;
 
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
+
 import java.lang.reflect.Type;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Map;
+
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.ParserConfigurationException;
-import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
-import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
-import org.w3c.dom.Document;
-import static org.osoa.sca.Version.XML_NAMESPACE_1_0;
-import org.osoa.sca.annotations.Constructor;
-
+import org.apache.tuscany.core.binding.local.LocalBindingDefinition;
+import org.apache.tuscany.core.implementation.system.model.SystemImplementation;
+import org.apache.tuscany.core.property.SimplePropertyObjectFactory;
 import org.apache.tuscany.spi.ObjectFactory;
 import org.apache.tuscany.spi.annotation.Autowire;
 import org.apache.tuscany.spi.component.CompositeComponent;
@@ -59,16 +61,15 @@
 import org.apache.tuscany.spi.model.CompositeComponentType;
 import org.apache.tuscany.spi.model.Implementation;
 import org.apache.tuscany.spi.model.ModelObject;
+import org.apache.tuscany.spi.model.Multiplicity;
 import org.apache.tuscany.spi.model.OverrideOptions;
 import org.apache.tuscany.spi.model.Property;
 import org.apache.tuscany.spi.model.PropertyValue;
 import org.apache.tuscany.spi.model.ReferenceDefinition;
 import org.apache.tuscany.spi.model.ReferenceTarget;
 import org.apache.tuscany.spi.model.ServiceDefinition;
-
-import org.apache.tuscany.core.binding.local.LocalBindingDefinition;
-import org.apache.tuscany.core.implementation.system.model.SystemImplementation;
-import org.apache.tuscany.core.property.SimplePropertyObjectFactory;
+import org.osoa.sca.annotations.Constructor;
+import org.w3c.dom.Document;
 
 /**
  * Loads a component definition from an XML-based assembly file
@@ -253,14 +254,17 @@
                 }
             }
         } else {
-            ReferenceTarget referenceTarget = new ReferenceTarget();
-            referenceTarget.setReferenceName(name);
+            ReferenceTarget referenceTarget = componentDefinition.getReferenceTargets().get(name);
+            if (referenceTarget == null) {
+                referenceTarget = new ReferenceTarget();
+                referenceTarget.setReferenceName(name);
+                componentDefinition.add(referenceTarget);
+            }
             try {
                 referenceTarget.addTarget(new URI(target));
             } catch (URISyntaxException e) {
                 throw new InvalidReferenceException(e);
             }
-            componentDefinition.add(referenceTarget);
         }
     }
 
@@ -304,9 +308,38 @@
                 continue;
             }
             String name = referenceDef.getName();
-            if (!definition.getReferenceTargets().containsKey(name)) {
+            ReferenceTarget target = definition.getReferenceTargets().get(name);
+            if (target == null) {
                 throw new MissingReferenceException(name);
             }
+            int count = target.getTargets().size();
+            Multiplicity multiplicity = referenceDef.getMultiplicity();
+            switch (multiplicity) {
+                case ZERO_N:
+                    break;
+                case ZERO_ONE:
+                    if (count > 1) {
+                        throw new InvalidReferenceException("Reference " + name
+                            + " violates the multiplicity: "
+                            + multiplicity);
+                    }
+                    break;
+                case ONE_ONE:
+                    if (count != 1) {
+                        throw new InvalidReferenceException("Reference " + name
+                            + " violates the multiplicity: "
+                            + multiplicity);
+                    }
+                    break;
+                case ONE_N:
+                    if (count < 1) {
+                        throw new InvalidReferenceException("Reference " + name
+                            + " violates the multiplicity: "
+                            + multiplicity);
+                    }
+                    break;
+            }
+
         }
     }
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireServiceExtension.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireServiceExtension.java?view=diff&rev=499694&r1=499693&r2=499694
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireServiceExtension.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireServiceExtension.java Wed Jan 24 23:35:52 2007
@@ -18,8 +18,12 @@
  */
 package org.apache.tuscany.core.wire;
 
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
+import org.apache.tuscany.core.binding.local.LocalReferenceBinding;
 import org.apache.tuscany.spi.QualifiedName;
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.spi.component.ReferenceBinding;
@@ -28,6 +32,7 @@
 import org.apache.tuscany.spi.model.ComponentDefinition;
 import org.apache.tuscany.spi.model.ComponentType;
 import org.apache.tuscany.spi.model.Implementation;
+import org.apache.tuscany.spi.model.Multiplicity;
 import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.model.ReferenceDefinition;
 import org.apache.tuscany.spi.model.ReferenceTarget;
@@ -41,8 +46,6 @@
 import org.apache.tuscany.spi.wire.OutboundWire;
 import org.apache.tuscany.spi.wire.WireService;
 
-import org.apache.tuscany.core.binding.local.LocalReferenceBinding;
-
 /**
  * Base class for wire service extensions
  *
@@ -96,9 +99,21 @@
             Map<String, ? extends ReferenceDefinition> references = componentType.getReferences();
             ReferenceDefinition mappedReference = references.get(referenceTarget.getReferenceName());
             assert mappedReference != null;
-            OutboundWire wire = createWire(referenceTarget, mappedReference);
-            wire.setContainer(component);
-            component.addOutboundWire(wire);
+            List<OutboundWire> wires = createWire(referenceTarget, mappedReference);
+            Multiplicity multiplicity = mappedReference.getMultiplicity();
+            if (multiplicity == Multiplicity.ZERO_ONE || multiplicity == Multiplicity.ONE_ONE) {
+                // 0..1 or 1..1
+                for (OutboundWire wire : wires) {
+                    wire.setContainer(component);
+                    component.addOutboundWire(wire);
+                }
+            } else {
+                // 0..N or 1..N
+                for (OutboundWire wire : wires) {
+                    wire.setContainer(component);
+                }
+                component.addOutboundWires(wires);
+            }
         }
     }
 
@@ -251,37 +266,55 @@
      * @param definition the reference target configuration
      * @return the wire the outbound wire
      */
-    protected OutboundWire createWire(ReferenceTarget target, ReferenceDefinition definition) {
-        if (!definition.isAutowire() && target.getTargets().size() != 1) {
-            //TODO multiplicity
-            throw new UnsupportedOperationException();
-        }
+    protected List<OutboundWire> createWire(ReferenceTarget target, ReferenceDefinition definition) {
         ServiceContract<?> contract = definition.getServiceContract();
-        OutboundWire wire = new OutboundWireImpl();
-        if (!definition.isAutowire()) {
-            QualifiedName qName = new QualifiedName(target.getTargets().get(0).toString());
-            wire.setTargetName(qName);
-        } else {
+        List<OutboundWire> outboundWires = new ArrayList<OutboundWire>();
+        if (definition.isAutowire()) {
+            OutboundWire wire = new OutboundWireImpl();
             wire.setAutowire(true);
-        }
-        wire.setServiceContract(contract);
-        wire.setReferenceName(target.getReferenceName());
-        for (Operation<?> operation : contract.getOperations().values()) {
-            //TODO handle policy
-            OutboundInvocationChain chain = createOutboundChain(operation);
-            wire.addInvocationChain(operation, chain);
-
-        }
-        if (contract.getCallbackName() != null) {
-            wire.setCallbackInterface(contract.getCallbackClass());
-            for (Operation<?> operation : contract.getCallbackOperations().values()) {
-                InboundInvocationChain callbackTargetChain = createInboundChain(operation);
+            wire.setServiceContract(contract);
+            wire.setReferenceName(target.getReferenceName());
+            for (Operation<?> operation : contract.getOperations().values()) {
                 // TODO handle policy
-                callbackTargetChain.addInterceptor(new InvokerInterceptor());
-                wire.addTargetCallbackInvocationChain(operation, callbackTargetChain);
+                OutboundInvocationChain chain = createOutboundChain(operation);
+                wire.addInvocationChain(operation, chain);
+            }
+            if (contract.getCallbackName() != null) {
+                wire.setCallbackInterface(contract.getCallbackClass());
+                for (Operation<?> operation : contract.getCallbackOperations().values()) {
+                    InboundInvocationChain callbackTargetChain = createInboundChain(operation);
+                    // TODO handle policy
+                    callbackTargetChain.addInterceptor(new InvokerInterceptor());
+                    wire.addTargetCallbackInvocationChain(operation, callbackTargetChain);
+                }
+            }
+            outboundWires.add(wire);
+        } else {
+            for (URI uri : target.getTargets()) {
+                OutboundWire wire = new OutboundWireImpl();
+                QualifiedName qName = new QualifiedName(uri.toString());
+                wire.setTargetName(qName);
+                wire.setServiceContract(contract);
+                wire.setReferenceName(target.getReferenceName());
+                for (Operation<?> operation : contract.getOperations().values()) {
+                    // TODO handle policy
+                    OutboundInvocationChain chain = createOutboundChain(operation);
+                    wire.addInvocationChain(operation, chain);
+
+                }
+                if (contract.getCallbackName() != null) {
+                    wire.setCallbackInterface(contract.getCallbackClass());
+                    for (Operation<?> operation : contract.getCallbackOperations().values()) {
+                        InboundInvocationChain callbackTargetChain = createInboundChain(operation);
+                        // TODO handle policy
+                        callbackTargetChain.addInterceptor(new InvokerInterceptor());
+                        wire.addTargetCallbackInvocationChain(operation, callbackTargetChain);
+                    }
+                }
+                outboundWires.add(wire);
             }
         }
-        return wire;
+        return outboundWires;
     }
 
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderValidationTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderValidationTestCase.java?view=diff&rev=499694&r1=499693&r2=499694
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderValidationTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/loader/ComponentLoaderValidationTestCase.java Wed Jan 24 23:35:52 2007
@@ -1,14 +1,18 @@
 package org.apache.tuscany.core.loader;
 
+import java.net.URI;
+
 import javax.xml.stream.XMLStreamException;
 
 import org.apache.tuscany.spi.implementation.java.PojoComponentType;
+import org.apache.tuscany.spi.loader.InvalidReferenceException;
 import org.apache.tuscany.spi.loader.LoaderException;
 import org.apache.tuscany.spi.loader.LoaderRegistry;
 import org.apache.tuscany.spi.loader.MissingReferenceException;
 import org.apache.tuscany.spi.loader.PropertyObjectFactory;
 import org.apache.tuscany.spi.model.ComponentDefinition;
 import org.apache.tuscany.spi.model.Implementation;
+import org.apache.tuscany.spi.model.Multiplicity;
 import org.apache.tuscany.spi.model.Property;
 import org.apache.tuscany.spi.model.ReferenceDefinition;
 import org.apache.tuscany.spi.model.ServiceDefinition;
@@ -71,6 +75,64 @@
         loader.validate(defn);
     }
 
+    public void testReferenceMultiplicity() throws LoaderException, XMLStreamException {
+        PojoComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> type =
+            new PojoComponentType<ServiceDefinition, ReferenceDefinition, Property<?>>();
+        ReferenceDefinition refDefinition = new ReferenceDefinition();
+        refDefinition.setName("r1");
+        refDefinition.setRequired(true);
+        refDefinition.setMultiplicity(Multiplicity.ONE_N);
+        type.add(refDefinition);
+        JavaImplementation impl = new JavaImplementation();
+        impl.setComponentType(type);
+        ComponentDefinition<Implementation<?>> defn = new ComponentDefinition<Implementation<?>>(impl);
+        ReferenceTarget target = new ReferenceTarget();
+        target.setReferenceName("r1");
+        target.addTarget(URI.create("c1"));
+        target.addTarget(URI.create("c2"));
+        defn.add(target);
+        loader.validate(defn);
+
+        refDefinition.setMultiplicity(Multiplicity.ZERO_ONE);
+        try {
+            loader.validate(defn);
+            fail();
+        } catch (InvalidReferenceException e) {
+            // Expected
+        }
+
+        refDefinition.setMultiplicity(Multiplicity.ZERO_N);
+        loader.validate(defn);
+
+        refDefinition.setMultiplicity(Multiplicity.ONE_ONE);
+        try {
+            loader.validate(defn);
+            fail();
+        } catch (InvalidReferenceException e) {
+            // Expected
+        }
+
+        target.getTargets().clear();
+        refDefinition.setMultiplicity(Multiplicity.ONE_ONE);
+        try {
+            loader.validate(defn);
+            fail();
+        } catch (InvalidReferenceException e) {
+            // Expected
+        }
+        refDefinition.setMultiplicity(Multiplicity.ONE_N);
+        try {
+            loader.validate(defn);
+            fail();
+        } catch (InvalidReferenceException e) {
+            // Expected
+        }
+        refDefinition.setMultiplicity(Multiplicity.ZERO_N);
+        loader.validate(defn);
+        refDefinition.setMultiplicity(Multiplicity.ZERO_ONE);
+        loader.validate(defn);
+
+    }    
     public void testAutowire() throws LoaderException, XMLStreamException {
         PojoComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> type =
             new PojoComponentType<ServiceDefinition, ReferenceDefinition, Property<?>>();

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireServiceExtensionTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireServiceExtensionTestCase.java?view=diff&rev=499694&r1=499693&r2=499694
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireServiceExtensionTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireServiceExtensionTestCase.java Wed Jan 24 23:35:52 2007
@@ -22,6 +22,7 @@
 import java.lang.reflect.Type;
 import java.net.URI;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.xml.namespace.QName;
@@ -37,6 +38,7 @@
 import org.apache.tuscany.spi.model.ComponentDefinition;
 import org.apache.tuscany.spi.model.ComponentType;
 import org.apache.tuscany.spi.model.Implementation;
+import org.apache.tuscany.spi.model.Multiplicity;
 import org.apache.tuscany.spi.model.Operation;
 import org.apache.tuscany.spi.model.Property;
 import org.apache.tuscany.spi.model.ReferenceDefinition;
@@ -105,7 +107,7 @@
         target.addTarget(new URI("bar"));
         target.setReferenceName("refName");
 
-        OutboundWire wire = wireService.createWire(target, definition);
+        OutboundWire wire = wireService.createWire(target, definition).get(0);
         assertEquals("refName", wire.getReferenceName());
         assertEquals("bar", wire.getTargetName().toString());
         assertFalse(wire.isAutowire());
@@ -135,12 +137,24 @@
         definition.setAutowire(true);
         ReferenceTarget target = new ReferenceTarget();
         target.setReferenceName("refName");
-        OutboundWire wire = wireService.createWire(target, definition);
+        OutboundWire wire = wireService.createWire(target, definition).get(0);
         assertTrue(wire.isAutowire());
         assertEquals("refName", wire.getReferenceName());
         assertEquals(contract, wire.getServiceContract());
         assertEquals(Callback.class, wire.getCallbackInterface());
     }
+    
+    public void testCreateReferenceMultipleWire() throws Exception {
+        ReferenceDefinition definition = new ReferenceDefinition("foo", contract);
+        definition.setMultiplicity(Multiplicity.ONE_N);
+        ReferenceTarget target = new ReferenceTarget();
+        target.addTarget(new URI("bar"));
+        target.addTarget(new URI("bar2"));
+        target.setReferenceName("refName");
+
+        List<OutboundWire> wires = wireService.createWire(target, definition);
+        assertEquals(2, wires.size());
+    }    
 
     public void testCreateComponentWires() throws Exception {
         ComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> type =
@@ -251,7 +265,7 @@
         }
 
 
-        public OutboundWire createWire(ReferenceTarget reference, ReferenceDefinition def) {
+        public List<OutboundWire> createWire(ReferenceTarget reference, ReferenceDefinition def) {
             return super.createWire(reference, def);
         }
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org