You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jm...@apache.org on 2007/01/03 23:14:27 UTC
svn commit: r492321 - in /incubator/tuscany/java/sca/kernel:
core/src/main/java/org/apache/tuscany/core/builder/
core/src/main/java/org/apache/tuscany/core/launcher/
core/src/main/java/org/apache/tuscany/core/wire/
core/src/test/java/org/apache/tuscany...
Author: jmarino
Date: Wed Jan 3 14:14:26 2007
New Revision: 492321
URL: http://svn.apache.org/viewvc?view=rev&rev=492321
Log:
add support for wire and proxy optimization
Modified:
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/launcher/CompositeContextImpl.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/OutboundWireImpl.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireObjectFactory.java
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireUtils.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/AbstractConnectorImplTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderReferenceTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaReferenceWireTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/OutboundWireToJavaTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/launcher/CompositeContextImplTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireObjectFactoryTestCase.java
incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireOptimizationTestCase.java
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/Wire.java
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java Wed Jan 3 14:14:26 2007
@@ -57,6 +57,7 @@
import org.apache.tuscany.core.wire.LoopBackWire;
import org.apache.tuscany.core.wire.NonBlockingBridgingInterceptor;
import org.apache.tuscany.core.wire.SynchronousBridgingInterceptor;
+import org.apache.tuscany.core.wire.WireUtils;
/**
* The default connector implmentation
@@ -68,10 +69,20 @@
private WireService wireService;
private WorkContext workContext;
private WorkScheduler scheduler;
+ private boolean optimizeWires = true;
public ConnectorImpl() {
}
+ /**
+ * Constructor for testing
+ *
+ * @param optimizeWires if false, turns wire optimizations off
+ */
+ public ConnectorImpl(boolean optimizeWires) {
+ this.optimizeWires = optimizeWires;
+ }
+
@Constructor
public ConnectorImpl(@Autowire WireService wireService,
@Autowire WirePostProcessorRegistry processorRegistry,
@@ -101,15 +112,20 @@
// perform optimization, if possible
if (sourceWire.getContainer() != null && sourceWire.getContainer().isSystem()) {
sourceWire.setTargetWire(targetWire);
+ // system services do not need to have their chains processed, return
return;
- } else if (optimizable && sourceWire.isOptimizable() && targetWire.isOptimizable()) {
+ } else if (optimizeWires
+ && optimizable
+ && WireUtils.isOptimizable(sourceWire)
+ && WireUtils.isOptimizable(targetWire)) {
if (postProcessorRegistry != null) {
// run wire post-processors
postProcessorRegistry.process(sourceWire, targetWire);
}
- if (sourceWire.isOptimizable() && targetWire.isOptimizable()) {
+ if (WireUtils.isOptimizable(sourceWire) && WireUtils.isOptimizable(targetWire)) {
sourceWire.setTargetWire(targetWire);
}
+ // don not return yet, as invocation chains still need to be processed
}
for (InboundInvocationChain inboundChain : sourceWire.getInvocationChains().values()) {
// match invocation chains
@@ -145,15 +161,20 @@
// perform optimization, if possible
if (sourceWire.getContainer() != null && sourceWire.getContainer().isSystem()) {
sourceWire.setTargetWire(targetWire);
+ // system services do not need to have their chains processed, return
return;
- } else if (optimizable && sourceWire.isOptimizable() && targetWire.isOptimizable()) {
+ } else if (optimizeWires
+ && optimizable
+ && WireUtils.isOptimizable(sourceWire)
+ && WireUtils.isOptimizable(targetWire)) {
if (postProcessorRegistry != null) {
// run wire post-processors
postProcessorRegistry.process(sourceWire, targetWire);
}
- if (sourceWire.isOptimizable() && targetWire.isOptimizable()) {
- // JFM FIXME test this
+ if (WireUtils.isOptimizable(sourceWire) && WireUtils.isOptimizable(targetWire)) {
+ sourceWire.setOptimizable(true);
sourceWire.setTargetWire(targetWire);
+ // don not return yet, as invocation chains still need to be processed
}
}
// match outbound to inbound chains
@@ -371,7 +392,6 @@
InboundWire inboundWire = binding.getInboundWire();
Map<Operation<?>, InboundInvocationChain> inboundChains = inboundWire.getInvocationChains();
for (InboundInvocationChain chain : inboundChains.values()) {
- //TODO handle async
// add target invoker on inbound side
ServiceContract contract = inboundWire.getServiceContract();
Operation operation = chain.getOperation();
@@ -475,7 +495,7 @@
}
/**
- * Connects an outbound wire to its target in a composite. Valid targets are services and references.
+ * Connects an outbound wire to its target in a composite.
*
* @param sourceWire the source wire to connect
* @throws WiringException
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/launcher/CompositeContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/launcher/CompositeContextImpl.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/launcher/CompositeContextImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/launcher/CompositeContextImpl.java Wed Jan 3 14:14:26 2007
@@ -31,6 +31,7 @@
import org.apache.tuscany.spi.component.SCAObject;
import org.apache.tuscany.spi.component.Service;
import org.apache.tuscany.spi.component.ServiceBinding;
+import org.apache.tuscany.spi.component.TargetResolutionException;
import org.apache.tuscany.spi.wire.InboundWire;
import org.apache.tuscany.spi.wire.Wire;
import org.apache.tuscany.spi.wire.WireService;
@@ -81,14 +82,15 @@
} else {
wire = getInboundWire(child, name, qName.getPortName());
}
- // TODO JFM enable
-// if (wire.isOptimizable()) {
-// try {
-// return serviceInterface.cast(wire.getTargetService());
-// } catch (TargetResolutionException e) {
-// throw new ServiceRuntimeException(e);
-// }
-// }
+ if (wire.isOptimizable()
+ && wire.getServiceContract().getInterfaceClass() != null
+ && serviceInterface.isAssignableFrom(wire.getServiceContract().getInterfaceClass())) {
+ try {
+ return serviceInterface.cast(wire.getTargetService());
+ } catch (TargetResolutionException e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
return wireService.createProxy(serviceInterface, wire);
}
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InboundWireImpl.java Wed Jan 3 14:14:26 2007
@@ -29,7 +29,6 @@
import org.apache.tuscany.spi.model.ServiceContract;
import org.apache.tuscany.spi.wire.InboundInvocationChain;
import org.apache.tuscany.spi.wire.InboundWire;
-import org.apache.tuscany.spi.wire.Interceptor;
import org.apache.tuscany.spi.wire.OutboundInvocationChain;
import org.apache.tuscany.spi.wire.OutboundWire;
@@ -49,6 +48,7 @@
new HashMap<Object, Map<Operation<?>, OutboundInvocationChain>>();
private SCAObject container;
private AtomicComponent targetComponent;
+ private boolean optimizable;
public QName getBindingType() {
return bindingType;
@@ -133,21 +133,11 @@
}
public boolean isOptimizable() {
- for (InboundInvocationChain chain : chains.values()) {
- if (chain.getTargetInvoker() != null && !chain.getTargetInvoker().isOptimizable()) {
- return false;
- }
- if (chain.getHeadInterceptor() != null) {
- Interceptor current = chain.getHeadInterceptor();
- while (current != null) {
- if (!current.isOptimizable()) {
- return false;
- }
- current = current.getNext();
- }
- }
- }
- return true;
+ return optimizable;
+ }
+
+ public void setOptimizable(boolean optimizable) {
+ this.optimizable = optimizable;
}
public SCAObject getContainer() {
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/OutboundWireImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/OutboundWireImpl.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/OutboundWireImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/OutboundWireImpl.java Wed Jan 3 14:14:26 2007
@@ -29,7 +29,6 @@
import org.apache.tuscany.spi.model.ServiceContract;
import org.apache.tuscany.spi.wire.InboundInvocationChain;
import org.apache.tuscany.spi.wire.InboundWire;
-import org.apache.tuscany.spi.wire.Interceptor;
import org.apache.tuscany.spi.wire.OutboundInvocationChain;
import org.apache.tuscany.spi.wire.OutboundWire;
@@ -50,6 +49,14 @@
private InboundWire targetWire;
private SCAObject container;
private boolean autowire;
+ private boolean optimizable;
+
+ public OutboundWireImpl() {
+ }
+
+ public void setOptimizable(boolean optimizable) {
+ this.optimizable = optimizable;
+ }
public QName getBindingType() {
return bindingType;
@@ -146,22 +153,23 @@
}
public boolean isOptimizable() {
- for (OutboundInvocationChain chain : chains.values()) {
- if (chain.getHeadInterceptor() != null) {
- Interceptor current = chain.getHeadInterceptor();
- if (current == null) {
- break;
- }
- while (current != null) {
- if (!current.isOptimizable()) {
- return false;
- }
- current = current.getNext();
- }
- }
- }
- // if there is a callback, the wire is never optimizable since the callback target needs to be disambiguated
- return callbackTargetChains.isEmpty();
+ return optimizable;
+// for (OutboundInvocationChain chain : chains.values()) {
+// if (chain.getHeadInterceptor() != null) {
+// Interceptor current = chain.getHeadInterceptor();
+// if (current == null) {
+// break;
+// }
+// while (current != null) {
+// if (!current.isOptimizable()) {
+// return false;
+// }
+// current = current.getNext();
+// }
+// }
+// }
+// // if there is a callback, the wire is never optimizable since the callback target needs to be disambiguated
+// return callbackTargetChains.isEmpty();
}
public SCAObject getContainer() {
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireObjectFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireObjectFactory.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireObjectFactory.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireObjectFactory.java Wed Jan 3 14:14:26 2007
@@ -24,6 +24,7 @@
import org.apache.tuscany.spi.ObjectCreationException;
import org.apache.tuscany.spi.ObjectFactory;
+import org.apache.tuscany.spi.component.TargetResolutionException;
import org.apache.tuscany.spi.wire.OutboundChainHolder;
import org.apache.tuscany.spi.wire.OutboundWire;
import org.apache.tuscany.spi.wire.WireService;
@@ -39,7 +40,7 @@
private WireService wireService;
// the cache of proxy interface method to operation mappings
private Map<Method, OutboundChainHolder> mappings;
- //private boolean optimizable;
+ private boolean optimizable;
/**
* Constructor.
@@ -58,15 +59,19 @@
}
public T getInstance() throws ObjectCreationException {
-// JFM TODO enable
-// if (optimizable || wire.isOptimizable()) {
-// optimizable = true;
-// try {
-// return interfaze.cast(wire.getTargetService());
-// } catch (TargetResolutionException e) {
-// throw new ObjectCreationException(e);
-// }
-// }
+ // note optimization must be done lazily as wire object factories are created during the build phase prior
+ // to the outbound and inbound wires being connected
+ if ((optimizable
+ || wire.isOptimizable())
+ && wire.getServiceContract().getInterfaceClass() != null
+ && interfaze.isAssignableFrom(wire.getServiceContract().getInterfaceClass())) {
+ optimizable = true;
+ try {
+ return interfaze.cast(wire.getTargetService());
+ } catch (TargetResolutionException e) {
+ throw new ObjectCreationException(e);
+ }
+ }
// clone the cached mappings
Map<Method, OutboundChainHolder> newChains = new HashMap<Method, OutboundChainHolder>(mappings.size());
for (Map.Entry<Method, OutboundChainHolder> entry : mappings.entrySet()) {
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireUtils.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireUtils.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireUtils.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/WireUtils.java Wed Jan 3 14:14:26 2007
@@ -26,6 +26,7 @@
import org.apache.tuscany.spi.model.Operation;
import org.apache.tuscany.spi.wire.InboundInvocationChain;
import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.Interceptor;
import org.apache.tuscany.spi.wire.OutboundChainHolder;
import org.apache.tuscany.spi.wire.OutboundInvocationChain;
import org.apache.tuscany.spi.wire.OutboundWire;
@@ -86,6 +87,55 @@
chains.put(method, new OutboundChainHolder(entry.getValue()));
}
return chains;
+ }
+
+ /**
+ * Determines if the given wire is optimizable, i.e. its invocation chains may be bypassed during an invocation.
+ * This is typically calculated during the connect phase to optimize away invocation chains.
+ *
+ * @param wire the wire
+ * @return true if the wire is optimizable
+ */
+ public static boolean isOptimizable(OutboundWire wire) {
+
+ for (OutboundInvocationChain chain : wire.getInvocationChains().values()) {
+ if (chain.getHeadInterceptor() != null) {
+ Interceptor current = chain.getHeadInterceptor();
+ if (current == null) {
+ break;
+ }
+ while (current != null) {
+ if (!current.isOptimizable()) {
+ return false;
+ }
+ current = current.getNext();
+ }
+ }
+ }
+ // if there is a callback, the wire is never optimizable since the callback target needs to be disambiguated
+ return wire.getTargetCallbackInvocationChains().isEmpty();
+ }
+
+ /**
+ * Determines if the given wire is optimizable, i.e. its invocation chains may be bypassed during an invocation.
+ * This is typically calculated during the connect phase to optimize away invocation chains.
+ *
+ * @param wire the wire
+ * @return true if the wire is optimizable
+ */
+ public static boolean isOptimizable(InboundWire wire) {
+ for (InboundInvocationChain chain : wire.getInvocationChains().values()) {
+ if (chain.getHeadInterceptor() != null) {
+ Interceptor current = chain.getHeadInterceptor();
+ while (current != null) {
+ if (!current.isOptimizable()) {
+ return false;
+ }
+ current = current.getNext();
+ }
+ }
+ }
+ return true;
}
}
Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/AbstractConnectorImplTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/AbstractConnectorImplTestCase.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/AbstractConnectorImplTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/AbstractConnectorImplTestCase.java Wed Jan 3 14:14:26 2007
@@ -59,7 +59,7 @@
protected void setUp() throws Exception {
super.setUp();
- connector = new ConnectorImpl();
+ connector = new ConnectorImpl(false);
contract = new JavaServiceContract(AbstractConnectorImplTestCase.Foo.class);
operation = new Operation<Type>("bar", null, null, null);
}
Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderReferenceTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderReferenceTestCase.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderReferenceTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaComponentBuilderReferenceTestCase.java Wed Jan 3 14:14:26 2007
@@ -137,6 +137,7 @@
wire = EasyMock.createMock(OutboundWire.class);
EasyMock.expect(wire.getReferenceName()).andReturn("target").atLeastOnce();
EasyMock.expect(wire.getInvocationChains()).andReturn(chains).atLeastOnce();
+ EasyMock.expect(wire.isOptimizable()).andReturn(false);
JavaServiceContract targetContract = new JavaServiceContract(Target.class);
targetContract.setInteractionScope(InteractionScope.NONCONVERSATIONAL);
EasyMock.expect(wire.getServiceContract()).andReturn(targetContract).atLeastOnce();
Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaReferenceWireTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaReferenceWireTestCase.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaReferenceWireTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/JavaReferenceWireTestCase.java Wed Jan 3 14:14:26 2007
@@ -58,6 +58,7 @@
wire.getInvocationChains();
EasyMock.expectLastCall().andReturn(new HashMap<Operation<?>, OutboundInvocationChain>()).atLeastOnce();
EasyMock.expect(wire.getReferenceName()).andReturn("target").atLeastOnce();
+ EasyMock.expect(wire.isOptimizable()).andReturn(false);
EasyMock.replay(wire);
WireService service = EasyMock.createMock(WireService.class);
EasyMock.expect(service.createProxy(EasyMock.eq(Target.class), EasyMock.eq(wire), EasyMock.isA(Map.class)))
Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/OutboundWireToJavaTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/OutboundWireToJavaTestCase.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/OutboundWireToJavaTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/java/integration/OutboundWireToJavaTestCase.java Wed Jan 3 14:14:26 2007
@@ -177,7 +177,7 @@
private OutboundWire getWire(ScopeContainer scope) throws NoSuchMethodException,
InvalidServiceContractException, WiringException {
- ConnectorImpl connector = new ConnectorImpl();
+ ConnectorImpl connector = new ConnectorImpl(false);
CompositeComponent parent = EasyMock.createMock(CompositeComponent.class);
PojoConfiguration configuration = new PojoConfiguration();
configuration.setScopeContainer(scope);
Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/launcher/CompositeContextImplTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/launcher/CompositeContextImplTestCase.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/launcher/CompositeContextImplTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/launcher/CompositeContextImplTestCase.java Wed Jan 3 14:14:26 2007
@@ -25,6 +25,8 @@
import org.apache.tuscany.spi.component.ServiceBinding;
import org.apache.tuscany.spi.wire.InboundWire;
import org.apache.tuscany.spi.wire.WireService;
+import org.apache.tuscany.spi.model.ServiceContract;
+import org.apache.tuscany.spi.idl.java.JavaServiceContract;
import junit.framework.TestCase;
import org.apache.tuscany.core.implementation.composite.ServiceImpl;
@@ -45,6 +47,7 @@
public void testAtomicLocate() throws Exception {
InboundWire wire = EasyMock.createMock(InboundWire.class);
+ EasyMock.expect(wire.isOptimizable()).andReturn(false);
EasyMock.replay(wire);
AtomicComponent child = EasyMock.createMock(AtomicComponent.class);
EasyMock.expect(child.getInboundWire(FooService.class.getName())).andReturn(wire);
@@ -66,9 +69,91 @@
EasyMock.verify(child);
}
+ /**
+ * Verifies the locateService checks for wire optimizations and if possible, avoids proxying the target instance
+ */
+ public void testOptimizedAtomicLocate() throws Exception {
+ ServiceContract<?> contract = new JavaServiceContract(FooService.class);
+ InboundWire wire = EasyMock.createMock(InboundWire.class);
+ EasyMock.expect(wire.isOptimizable()).andReturn(true);
+ EasyMock.expect(wire.getTargetService()).andReturn(new FooService());
+ EasyMock.expect(wire.getServiceContract()).andReturn(contract).atLeastOnce();
+ EasyMock.replay(wire);
+ AtomicComponent child = EasyMock.createMock(AtomicComponent.class);
+ EasyMock.expect(child.getInboundWire(FooService.class.getName())).andReturn(wire);
+ EasyMock.replay(child);
+ CompositeComponent composite = EasyMock.createMock(CompositeComponent.class);
+ EasyMock.expect(composite.getChild("Foo")).andReturn(child);
+ EasyMock.replay(composite);
+
+ WireService service = EasyMock.createMock(WireService.class);
+ EasyMock.replay(service);
+ CompositeContextImpl context = new CompositeContextImpl(composite, service);
+ context.locateService(FooService.class, "Foo");
+ EasyMock.verify(service);
+ EasyMock.verify(composite);
+ EasyMock.verify(wire);
+ EasyMock.verify(child);
+ }
+
+ public void testCannotOptimizeAtomicLocate() throws Exception {
+ ServiceContract<?> contract = new JavaServiceContract(Object.class);
+ InboundWire wire = EasyMock.createMock(InboundWire.class);
+ EasyMock.expect(wire.isOptimizable()).andReturn(true);
+ EasyMock.expect(wire.getServiceContract()).andReturn(contract).atLeastOnce();
+ EasyMock.replay(wire);
+ AtomicComponent child = EasyMock.createMock(AtomicComponent.class);
+ EasyMock.expect(child.getInboundWire(FooService.class.getName())).andReturn(wire);
+ EasyMock.replay(child);
+ CompositeComponent composite = EasyMock.createMock(CompositeComponent.class);
+ EasyMock.expect(composite.getChild("Foo")).andReturn(child);
+ EasyMock.replay(composite);
+
+ WireService service = EasyMock.createMock(WireService.class);
+ EasyMock.expect(service.createProxy(EasyMock.eq(FooService.class), EasyMock.eq(wire)))
+ .andReturn(new FooService() {
+ });
+ EasyMock.replay(service);
+
+ CompositeContextImpl context = new CompositeContextImpl(composite, service);
+ context.locateService(FooService.class, "Foo");
+ EasyMock.verify(service);
+ EasyMock.verify(composite);
+ EasyMock.verify(wire);
+ EasyMock.verify(child);
+ }
+
+ public void testNoWireJavaInterfaceAtomicLocate() throws Exception {
+ ServiceContract<?> contract = new JavaServiceContract();
+ InboundWire wire = EasyMock.createMock(InboundWire.class);
+ EasyMock.expect(wire.isOptimizable()).andReturn(true);
+ EasyMock.expect(wire.getServiceContract()).andReturn(contract);
+ EasyMock.replay(wire);
+ AtomicComponent child = EasyMock.createMock(AtomicComponent.class);
+ EasyMock.expect(child.getInboundWire(FooService.class.getName())).andReturn(wire);
+ EasyMock.replay(child);
+ CompositeComponent composite = EasyMock.createMock(CompositeComponent.class);
+ EasyMock.expect(composite.getChild("Foo")).andReturn(child);
+ EasyMock.replay(composite);
+
+ WireService service = EasyMock.createMock(WireService.class);
+ EasyMock.expect(service.createProxy(EasyMock.eq(FooService.class), EasyMock.eq(wire)))
+ .andReturn(new FooService() {
+ });
+ EasyMock.replay(service);
+
+ CompositeContextImpl context = new CompositeContextImpl(composite, service);
+ context.locateService(FooService.class, "Foo");
+ EasyMock.verify(service);
+ EasyMock.verify(composite);
+ EasyMock.verify(wire);
+ EasyMock.verify(child);
+ }
+
public void testServiceLocate() throws Exception {
InboundWire wire = EasyMock.createMock(InboundWire.class);
EasyMock.expect(wire.getBindingType()).andReturn(InboundWire.LOCAL_BINDING);
+ EasyMock.expect(wire.isOptimizable()).andReturn(false);
EasyMock.replay(wire);
ServiceBinding binding = EasyMock.createMock(ServiceBinding.class);
binding.setService(EasyMock.isA(Service.class));
@@ -95,6 +180,7 @@
public void testReferenceLocate() throws Exception {
InboundWire wire = EasyMock.createMock(InboundWire.class);
+ EasyMock.expect(wire.isOptimizable()).andReturn(false);
EasyMock.replay(wire);
ReferenceBinding child = EasyMock.createMock(ReferenceBinding.class);
EasyMock.expect(child.getInboundWire()).andReturn(wire);
@@ -116,10 +202,10 @@
EasyMock.verify(child);
}
-
public void testCompositeLocate() throws Exception {
InboundWire wire = EasyMock.createMock(InboundWire.class);
EasyMock.expect(wire.getBindingType()).andReturn(InboundWire.LOCAL_BINDING);
+ EasyMock.expect(wire.isOptimizable()).andReturn(false);
EasyMock.replay(wire);
ServiceBinding serviceBinding = EasyMock.createMock(ServiceBinding.class);
serviceBinding.setService(EasyMock.isA(Service.class));
Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireObjectFactoryTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireObjectFactoryTestCase.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireObjectFactoryTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireObjectFactoryTestCase.java Wed Jan 3 14:14:26 2007
@@ -19,9 +19,13 @@
package org.apache.tuscany.core.wire;
import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.Map;
+import org.apache.tuscany.spi.idl.java.JavaServiceContract;
import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.model.ServiceContract;
import org.apache.tuscany.spi.wire.OutboundInvocationChain;
import org.apache.tuscany.spi.wire.OutboundWire;
import org.apache.tuscany.spi.wire.WireService;
@@ -36,11 +40,58 @@
@SuppressWarnings({"unchecked"})
public void testCreateInstance() throws Exception {
- OutboundWire wire = new OutboundWireImpl();
Operation<Type> op = new Operation<Type>("hello", null, null, null);
OutboundInvocationChain chain = new OutboundInvocationChainImpl(op);
- wire.addInvocationChain(op, chain);
+ OutboundWire wire = EasyMock.createMock(OutboundWire.class);
+ Map<Operation<?>, OutboundInvocationChain> chains = new HashMap<Operation<?>, OutboundInvocationChain>();
+ chains.put(op, chain);
+ EasyMock.expect(wire.getInvocationChains()).andReturn(chains);
+ EasyMock.expect(wire.isOptimizable()).andReturn(false);
+ EasyMock.replay(wire);
+ WireService service = EasyMock.createMock(WireService.class);
+ service.createProxy(EasyMock.eq(Foo.class), EasyMock.eq(wire), EasyMock.isA(Map.class));
+ EasyMock.expectLastCall().andReturn(new Foo() {
+ public void hello() {
+
+ }
+ });
+ EasyMock.replay(service);
+
+ WireObjectFactory<Foo> factory = new WireObjectFactory<Foo>(Foo.class, wire, service);
+ factory.getInstance();
+ EasyMock.verify(service);
+ EasyMock.verify(wire);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testOptimizedCreateInstance() throws Exception {
+ ServiceContract<?> contract = new JavaServiceContract(Foo.class);
+ OutboundWire wire = EasyMock.createMock(OutboundWire.class);
+ EasyMock.expect(wire.isOptimizable()).andReturn(true);
+ EasyMock.expect(wire.getServiceContract()).andReturn(contract).atLeastOnce();
+ EasyMock.expect(wire.getInvocationChains()).andReturn((Map) Collections.emptyMap());
+ EasyMock.expect(wire.getTargetService()).andReturn(new Foo() {
+ public void hello() {
+ }
+ });
+ EasyMock.replay(wire);
+ WireObjectFactory<Foo> factory = new WireObjectFactory<Foo>(Foo.class, wire, null);
+ factory.getInstance();
+ EasyMock.verify(wire);
+
+ }
+ /**
+ * Verifies that a proxy is created when the required client contract is different than the wire contract
+ */
+ @SuppressWarnings("unchecked")
+ public void testCannotOptimizeDifferentContractsCreateInstance() throws Exception {
+ ServiceContract<?> contract = new JavaServiceContract(Object.class);
+ OutboundWire wire = EasyMock.createMock(OutboundWire.class);
+ EasyMock.expect(wire.isOptimizable()).andReturn(true);
+ EasyMock.expect(wire.getServiceContract()).andReturn(contract).atLeastOnce();
+ EasyMock.expect(wire.getInvocationChains()).andReturn((Map) Collections.emptyMap());
+ EasyMock.replay(wire);
WireService service = EasyMock.createMock(WireService.class);
service.createProxy(EasyMock.eq(Foo.class), EasyMock.eq(wire), EasyMock.isA(Map.class));
EasyMock.expectLastCall().andReturn(new Foo() {
@@ -53,11 +104,35 @@
WireObjectFactory<Foo> factory = new WireObjectFactory<Foo>(Foo.class, wire, service);
factory.getInstance();
EasyMock.verify(service);
+ EasyMock.verify(wire);
}
+ @SuppressWarnings("unchecked")
+ public void testNoJavaInterfaceCreateInstance() throws Exception {
+ ServiceContract<?> contract = new JavaServiceContract();
+ OutboundWire wire = EasyMock.createMock(OutboundWire.class);
+ EasyMock.expect(wire.isOptimizable()).andReturn(true);
+ EasyMock.expect(wire.getServiceContract()).andReturn(contract).atLeastOnce();
+ EasyMock.expect(wire.getInvocationChains()).andReturn((Map) Collections.emptyMap());
+ EasyMock.replay(wire);
+ WireService service = EasyMock.createMock(WireService.class);
+ service.createProxy(EasyMock.eq(Foo.class), EasyMock.eq(wire), EasyMock.isA(Map.class));
+ EasyMock.expectLastCall().andReturn(new Foo() {
+ public void hello() {
+
+ }
+ });
+ EasyMock.replay(service);
+
+ WireObjectFactory<Foo> factory = new WireObjectFactory<Foo>(Foo.class, wire, service);
+ factory.getInstance();
+ EasyMock.verify(service);
+ EasyMock.verify(wire);
+ }
private interface Foo {
void hello();
}
+
}
Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireOptimizationTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireOptimizationTestCase.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireOptimizationTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/wire/WireOptimizationTestCase.java Wed Jan 3 14:14:26 2007
@@ -18,21 +18,18 @@
*/
package org.apache.tuscany.core.wire;
-import static org.apache.tuscany.spi.model.Operation.NO_CONVERSATION;
-
import java.lang.reflect.Type;
import org.apache.tuscany.spi.model.Operation;
+import static org.apache.tuscany.spi.model.Operation.NO_CONVERSATION;
import org.apache.tuscany.spi.wire.InboundInvocationChain;
import org.apache.tuscany.spi.wire.InboundWire;
import org.apache.tuscany.spi.wire.Interceptor;
import org.apache.tuscany.spi.wire.Message;
import org.apache.tuscany.spi.wire.OutboundInvocationChain;
import org.apache.tuscany.spi.wire.OutboundWire;
-import org.apache.tuscany.spi.wire.TargetInvoker;
import junit.framework.TestCase;
-import org.easymock.EasyMock;
/**
* Verifies wire optimization analysis
@@ -51,7 +48,7 @@
OutboundInvocationChain chain = new OutboundInvocationChainImpl(operation);
chain.addInterceptor(new OptimizableInterceptor());
wire.addInvocationChain(operation, chain);
- assertTrue(wire.isOptimizable());
+ assertTrue(WireUtils.isOptimizable(wire));
}
public void testSourceWireNonInterceptorOptimization() throws Exception {
@@ -59,7 +56,7 @@
OutboundInvocationChain chain = new OutboundInvocationChainImpl(operation);
chain.addInterceptor(new NonOptimizableInterceptor());
wire.addInvocationChain(operation, chain);
- assertFalse(wire.isOptimizable());
+ assertFalse(WireUtils.isOptimizable(wire));
}
public void testTargetWireInterceptorOptimization() throws Exception {
@@ -67,7 +64,7 @@
InboundInvocationChain chain = new InboundInvocationChainImpl(operation);
chain.addInterceptor(new OptimizableInterceptor());
wire.addInvocationChain(operation, chain);
- assertTrue(wire.isOptimizable());
+ assertTrue(WireUtils.isOptimizable(wire));
}
public void testTargetWireNonInterceptorOptimization() throws Exception {
@@ -75,18 +72,7 @@
InboundInvocationChain chain = new InboundInvocationChainImpl(operation);
chain.addInterceptor(new NonOptimizableInterceptor());
wire.addInvocationChain(operation, chain);
- assertFalse(wire.isOptimizable());
- }
-
- public void testTargetWireNonTargetInvokerOptimization() throws Exception {
- InboundWire wire = new InboundWireImpl();
- InboundInvocationChain chain = new InboundInvocationChainImpl(operation);
- TargetInvoker invoker = EasyMock.createNiceMock(TargetInvoker.class);
- EasyMock.replay(invoker);
- invoker.setCacheable(false);
- chain.setTargetInvoker(invoker);
- wire.addInvocationChain(operation, chain);
- assertFalse(wire.isOptimizable());
+ assertFalse(WireUtils.isOptimizable(wire));
}
protected void tearDown() throws Exception {
Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/Wire.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/Wire.java?view=diff&rev=492321&r1=492320&r2=492321
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/Wire.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/Wire.java Wed Jan 3 14:14:26 2007
@@ -60,9 +60,16 @@
void addInterface(Class<?> claz);
/**
- * Returns true if the wire and all of its interceptors and handlers can be optimized
+ * Returns true if its invocation chains may be bypassed
*/
boolean isOptimizable();
+
+ /**
+ * Determines if the wire may be optimized
+ *
+ * @param optimizable true if the wire is optimizable
+ */
+ void setOptimizable(boolean optimizable);
/**
* Returns the SCAObject that contains this wire
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org