[picocontainer-scm] [5686] java/2.x/trunk/pico/container/src/test/org/picocontainer/behaviors: fix HiddenImplementation to cache delegate per instance not per invocation reported by Chris Floersch

paul-yCVjj/[email protected]
Newsgroups gmane.comp.java.picocontainer.cvs
Message-ID <[email protected]>
Revision 5686
Author paul
Date 2010-06-27 11:18:54 -0500 (Sun, 27 Jun 2010)

Log Message

fix HiddenImplementation to cache delegate per instance not per invocation reported by Chris Floersch

Modified Paths

- java/2.x/trunk/pico/container/src/java/org/picocontainer/behaviors/HiddenImplementation.java

- java/2.x/trunk/pico/container/src/test/org/picocontainer/behaviors/ImplementationHidingTestCase.java

Diff

Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/behaviors/HiddenImplementation.java (5685 => 5686)

--- java/2.x/trunk/pico/container/src/java/org/picocontainer/behaviors/HiddenImplementation.java 2010-06-24 21:54:20 UTC (rev 5685)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/behaviors/HiddenImplementation.java 2010-06-27 16:18:54 UTC (rev 5686)
@@ -19,7 +19,6 @@
import org.picocontainer.ComponentMonitor;
import org.picocontainer.PicoContainer;
import org.picocontainer.PicoCompositionException;
-import org.picocontainer.behaviors.AbstractBehavior;

/**
* This component adapter makes it possible to hide the implementation
@@ -64,12 +63,17 @@
return "Hidden";
}

-
@SuppressWarnings("unchecked")
- protected T createProxy(Class[] interfaces, final PicoContainer container, final ClassLoader classLoader) {
+ protected T createProxy(Class[] interfaces, final PicoContainer container, final ClassLoader classLoader) {
+ final PicoContainer container1 = container;
return (T) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
+ private final PicoContainer container = container1;
+ private Object instance;
public synchronized Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
- return invokeMethod(getDelegate().getComponentInstance(container, NOTHING.class), method, args, container);
+ if (instance == null) {
+ instance = getDelegate().getComponentInstance(container, NOTHING.class);
+ }
+ return invokeMethod(instance, method, args, container);
}
});
}

Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/behaviors/ImplementationHidingTestCase.java (5685 => 5686)

--- java/2.x/trunk/pico/container/src/test/org/picocontainer/behaviors/ImplementationHidingTestCase.java 2010-06-24 21:54:20 UTC (rev 5685)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/behaviors/ImplementationHidingTestCase.java 2010-06-27 16:18:54 UTC (rev 5686)
@@ -10,9 +10,6 @@
package org.picocontainer.behaviors;

-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
import org.junit.Test;
import org.picocontainer.Characteristics;
import org.picocontainer.ComponentAdapter;
@@ -27,7 +24,10 @@
import org.picocontainer.monitors.NullComponentMonitor;
import org.picocontainer.tck.AbstractComponentFactoryTest;

+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;

+
public class ImplementationHidingTestCase extends AbstractComponentFactoryTest{

@Test public void testAddComponentUsesImplementationHidingBehavior() {
@@ -131,22 +131,24 @@
assertEquals("<init>foo()", sb.toString()); // instantiated
}

- //@Test public void shouldNotInstantiateForEveryMethodCall() {
- // ...
- //}
+ @Test public void shouldInstantiateForEveryGetComponentCall() {
+ DefaultPicoContainer parent = new DefaultPicoContainer(new Caching());
+ parent.addComponent(StringBuilder.class);
+ DefaultPicoContainer pico =
+ new DefaultPicoContainer(new ImplementationHiding(), parent);
+ pico.addComponent(NeedsStringBuilder.class, NeedsStringBuilderImpl.class);
+ NeedsStringBuilder nsb = pico.getComponent(NeedsStringBuilder.class);
+ nsb.foo();
+ nsb = pico.getComponent(NeedsStringBuilder.class);
+ nsb.foo();
+ StringBuilder sb = pico.getComponent(StringBuilder.class);
+ assertEquals("<init>foo()<init>foo()", sb.toString());
+ }

@Test public void shouldInstantiateForEveryMethodCall() {
- cachingTestBody("<init>foo()<init>foo()", new ImplementationHiding());
+ cachingTestBody("<init>foo()foo()", new ImplementationHiding());
}

- @Test public void shouldNotInstantiateForEveryMethodCallIfCaching() {
- cachingTestBody("<init>foo()foo()", new ImplementationHiding().wrap(new Caching()));
- }
-
- @Test public void shouldInstantiateForEveryMethodCallIfCachingWrapsImplementationHidingWhichIsFutile() {
- cachingTestBody("<init>foo()<init>foo()", new Caching().wrap(new ImplementationHiding()));
- }
-
private void cachingTestBody(String expectation, ComponentFactory compFactory) {
DefaultPicoContainer parent = new DefaultPicoContainer(new Caching());
parent.addComponent(StringBuilder.class);

----------

To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.