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