[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