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