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/05 15:07:52 UTC

svn commit: r493036 - in /incubator/tuscany/java/sca/kernel: core/src/main/java/org/apache/tuscany/core/builder/ core/src/main/java/org/apache/tuscany/core/implementation/ core/src/main/java/org/apache/tuscany/core/implementation/system/component/ core...

Author: jmarino
Date: Fri Jan  5 06:07:51 2007
New Revision: 493036

URL: http://svn.apache.org/viewvc?view=rev&rev=493036
Log:
avoid optimizations when target is a stateless component and has a destroy callback

Added:
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java   (with props)
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/implementation/PojoAtomicComponent.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemSingletonAtomicComponent.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/builder/ConnectorImplTestCase.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/AtomicComponent.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.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=493036&r1=493035&r2=493036
==============================================================================
--- 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 Fri Jan  5 06:07:51 2007
@@ -116,11 +116,15 @@
             // run wire post-processors
             postProcessorRegistry.process(sourceWire, targetWire);
         }
-        // perform optimization, if possible
+        // perform optimization, if possible. Atomic component's do not have outbound target wires, but keep the check
+        // perform optimization, if possible. Note that optimizations on stateless targets are not performed if they
+        // receive destroy events since a destruction notification must be given through a proxy
         if (optimizable
             && WireUtils.isOptimizable(sourceWire)
             && WireUtils.isOptimizable(targetWire)
-            && targetWire.getContainer() instanceof AtomicComponent) {
+            && targetWire.getContainer() instanceof AtomicComponent
+            && targetWire.getContainer().getScope() == Scope.STATELESS
+            && !((AtomicComponent) targetWire.getContainer()).isDestroyable()) {
             sourceWire.setTargetWire(targetWire);
         }
     }
@@ -285,11 +289,14 @@
             // run wire post-processors
             postProcessorRegistry.process(sourceWire, targetWire);
         }
-        // perform optimization, if possible
+        // perform optimization, if possible. Note that optimizations on stateless targets are not performed if they
+        // receive destroy events since a destruction notification must be given through a proxy
         if (optimizable
             && WireUtils.isOptimizable(sourceWire)
             && WireUtils.isOptimizable(targetWire)
-            && targetWire.getContainer() instanceof AtomicComponent) {
+            && targetWire.getContainer() instanceof AtomicComponent
+            && targetWire.getContainer().getScope() == Scope.STATELESS
+            && !((AtomicComponent) targetWire.getContainer()).isDestroyable()) {
             sourceWire.setOptimizable(true);
             sourceWire.setTargetWire(targetWire);
         }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java?view=diff&rev=493036&r1=493035&r2=493036
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java Fri Jan  5 06:07:51 2007
@@ -93,6 +93,11 @@
         implementationClass = configuration.getImplementationClass();
     }
 
+
+    public boolean isDestroyable() {
+        return destroyInvoker != null;
+    }
+
     public void init(Object instance) throws TargetInitializationException {
         if (initInvoker != null) {
             try {

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemSingletonAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemSingletonAtomicComponent.java?view=diff&rev=493036&r1=493035&r2=493036
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemSingletonAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/component/SystemSingletonAtomicComponent.java Fri Jan  5 06:07:51 2007
@@ -82,6 +82,10 @@
         return false;
     }
 
+    public boolean isDestroyable() {
+        return false;
+    }
+
     public int getInitLevel() {
         return 0;
     }

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=493036&r1=493035&r2=493036
==============================================================================
--- 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 Fri Jan  5 06:07:51 2007
@@ -82,7 +82,7 @@
 
         // create the target
         AtomicComponent target = EasyMock.createMock(AtomicComponent.class);
-        EasyMock.expect(target.getScope()).andReturn(Scope.COMPOSITE);
+        EasyMock.expect(target.getScope()).andReturn(Scope.COMPOSITE).atLeastOnce();
         EasyMock.expect(target.isSystem()).andReturn(false).atLeastOnce();
         target.getInboundWire(EasyMock.eq(TARGET_SERVICE));
         EasyMock.expectLastCall().andReturn(targetWire).atLeastOnce();

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorImplTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorImplTestCase.java?view=diff&rev=493036&r1=493035&r2=493036
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorImplTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorImplTestCase.java Fri Jan  5 06:07:51 2007
@@ -79,6 +79,31 @@
         EasyMock.verify(outboundWire);
     }
 
+    /**
+     * Verifies that stateless targets with a destructor are not optimized as the destructor callback event must be
+     * issued by the TargetInvoker after it dispatches to the target
+     */
+    public void testOutboundToInboundNoOptimizationBecauseStatelessDestructor() throws Exception {
+        AtomicComponent container = EasyMock.createNiceMock(AtomicComponent.class);
+        EasyMock.expect(container.isSystem()).andReturn(false);
+        EasyMock.expect(container.getScope()).andReturn(Scope.STATELESS);
+        EasyMock.expect(container.isDestroyable()).andReturn(true);
+        EasyMock.replay(container);
+        InboundWire inboundWire = new InboundWireImpl();
+        inboundWire.setContainer(container);
+        OutboundWire outboundWire = EasyMock.createMock(OutboundWire.class);
+        EasyMock.expect(outboundWire.getServiceContract()).andReturn(contract);
+        outboundWire.getInvocationChains();
+        EasyMock.expectLastCall().andReturn(Collections.emptyMap()).atLeastOnce();
+        outboundWire.getTargetCallbackInvocationChains();
+        EasyMock.expectLastCall().andReturn(Collections.emptyMap()).atLeastOnce();
+        EasyMock.expect(outboundWire.getContainer()).andReturn(container).atLeastOnce();
+        EasyMock.replay(outboundWire);
+
+        connector.connect(outboundWire, inboundWire, true);
+        EasyMock.verify(outboundWire);
+    }
+
     public void testOutboundToInboundNoOptimizationNonAtomicTarget() throws Exception {
         ReferenceBinding container = EasyMock.createNiceMock(ReferenceBinding.class);
         EasyMock.expect(container.isSystem()).andReturn(false);
@@ -91,7 +116,6 @@
         EasyMock.expectLastCall().andReturn(Collections.emptyMap()).atLeastOnce();
         outboundWire.getTargetCallbackInvocationChains();
         EasyMock.expectLastCall().andReturn(Collections.emptyMap()).atLeastOnce();
-
         EasyMock.expect(outboundWire.getContainer()).andReturn(container).atLeastOnce();
         EasyMock.replay(outboundWire);
 

Added: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java?view=auto&rev=493036
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java Fri Jan  5 06:07:51 2007
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.core.implementation;
+
+import org.apache.tuscany.spi.ObjectFactory;
+import org.apache.tuscany.spi.component.AtomicComponent;
+import org.apache.tuscany.spi.component.TargetInvokerCreationException;
+import org.apache.tuscany.spi.model.Operation;
+import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.OutboundWire;
+import org.apache.tuscany.spi.wire.TargetInvoker;
+
+import junit.framework.TestCase;
+import org.apache.tuscany.core.injection.EventInvoker;
+import org.apache.tuscany.core.injection.PojoObjectFactory;
+import org.easymock.EasyMock;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class PojoAtomicComponentTestCase extends TestCase {
+    private PojoObjectFactory<Foo> factory;
+
+    @SuppressWarnings({"unchecked"})
+    public void testDestroy() throws Exception {
+        PojoConfiguration config = new PojoConfiguration();
+        config.setInstanceFactory(factory);
+        EventInvoker<Object> invoker = EasyMock.createMock(EventInvoker.class);
+        invoker.invokeEvent(EasyMock.notNull());
+        EasyMock.replay(invoker);
+        config.setDestroyInvoker(invoker);
+        AtomicComponent component = new TestAtomicComponent(config);
+        assertTrue(component.isDestroyable());
+        component.destroy(new Object());
+        EasyMock.verify(invoker);
+    }
+
+    @SuppressWarnings({"unchecked"})
+    public void testInit() throws Exception {
+        PojoConfiguration config = new PojoConfiguration();
+        config.setInstanceFactory(factory);
+        EventInvoker<Object> invoker = EasyMock.createMock(EventInvoker.class);
+        invoker.invokeEvent(EasyMock.notNull());
+        EasyMock.replay(invoker);
+        config.setInitInvoker(invoker);
+        AtomicComponent component = new TestAtomicComponent(config);
+        component.init(new Object());
+        EasyMock.verify(invoker);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        factory = new PojoObjectFactory<Foo>(Foo.class.getConstructor());
+    }
+
+    private class TestAtomicComponent extends PojoAtomicComponent {
+
+        public TestAtomicComponent(PojoConfiguration configuration) {
+            super(configuration);
+        }
+
+        protected ObjectFactory<?> createWireFactory(Class<?> interfaze, OutboundWire wire) {
+            return null;
+        }
+
+        public TargetInvoker createTargetInvoker(String targetName, Operation operation, InboundWire callbackWire)
+            throws TargetInvokerCreationException {
+            return null;
+        }
+    }
+
+    private static class Foo {
+        public Foo() {
+        }
+    }
+
+}
+
+

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/AtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/AtomicComponent.java?view=diff&rev=493036&r1=493035&r2=493036
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/AtomicComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/AtomicComponent.java Fri Jan  5 06:07:51 2007
@@ -36,6 +36,13 @@
     boolean isEagerInit();
 
     /**
+     * Returns true if component instances receive destroy events.
+     *
+     * @return true if component instances receive destroy events
+     */
+    boolean isDestroyable();
+
+    /**
      * Returns the initialization level for this component.
      *
      * @return the initialization level for this component

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.java?view=diff&rev=493036&r1=493035&r2=493036
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.java Fri Jan  5 06:07:51 2007
@@ -45,7 +45,6 @@
  * @version $$Rev$$ $$Date$$
  */
 public abstract class AtomicComponentExtension extends AbstractComponentExtension implements AtomicComponent {
-
     protected ScopeContainer scopeContainer;
     protected Scope scope;
     protected Map<String, InboundWire> serviceWires = new HashMap<String, InboundWire>();
@@ -103,6 +102,10 @@
 
     public boolean isEagerInit() {
         return initLevel > 0;
+    }
+
+    public boolean isDestroyable() {
+        return false;
     }
 
     public long getMaxIdleTime() {



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