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