[picocontainer-dev] new ComponentMonitor method ...
Paul Hammant <[email protected]>
| Newsgroups | gmane.comp.java.picocontainer.devel |
|---|---|
| Message-ID | <[email protected]> |
AbstractInjector newInjectionFactory(AbstractInjector
abstractInjector);
Implementations return what is passed in by default (see patch)
Useful for unit (integration) testing. You might have a large tree of
containers and components, but want to swap out something crucial for
a Stub or a Mock so that you integration testing is not going to bring
up the whole app (just a subset of the components). This on
ComponentMonitor will allow that, as long at the CM instance is passed
into the root container.
Thoughts?
- Paul
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email
new-monitor-method.patch
(application/octet-stream, 13.6 KB)
Index: pico/container/src/test/org/picocontainer/defaults/issues/Issue0265TestCase.java
===================================================================
--- pico/container/src/test/org/picocontainer/defaults/issues/Issue0265TestCase.java (revision 4207)
+++ pico/container/src/test/org/picocontainer/defaults/issues/Issue0265TestCase.java (working copy)
@@ -17,16 +17,14 @@
import org.jmock.Expectations;
import org.jmock.Mockery;
+import org.jmock.api.Invocation;
+import org.jmock.api.Action;
import org.jmock.integration.junit4.JMock;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.picocontainer.Characteristics;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.ComponentMonitor;
-import org.picocontainer.DefaultPicoContainer;
-import org.picocontainer.DefaultPicoContainerTestCase;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.Startable;
+import org.picocontainer.*;
+import org.picocontainer.injectors.AbstractInjector;
+import org.hamcrest.Description;
@RunWith(JMock.class)
public class Issue0265TestCase {
@@ -39,8 +37,9 @@
final ComponentMonitor monitor1 = mockery.mock(ComponentMonitor.class, "Monitor1");
final ComponentMonitor monitor2 = mockery.mock(ComponentMonitor.class, "Monitor2");
DefaultPicoContainer pico = new DefaultPicoContainer(monitor1);
- pico.as(Characteristics.CACHE).addComponent(DefaultPicoContainerTestCase.MyStartable.class);
mockery.checking(new Expectations(){{
+ one(monitor1).newInjectionFactory(with(any(AbstractInjector.class)));
+ will(new returnParameterAction(0));
one(monitor1).instantiating(with(any(PicoContainer.class)), with(any(ComponentAdapter.class)), with(any(Constructor.class)));
will(returnValue(DefaultPicoContainerTestCase.MyStartable.class.getConstructor()));
one(monitor1).instantiated(with(any(PicoContainer.class)), with(any(ComponentAdapter.class)), with(any(Constructor.class)),
@@ -54,6 +53,7 @@
one(monitor1).invoked(with(any(PicoContainer.class)), with(any(ComponentAdapter.class)), with(equal(stop)),
with(any(Object.class)), with(any(Long.class)));
}});
+ pico.as(Characteristics.CACHE).addComponent(DefaultPicoContainerTestCase.MyStartable.class);
pico.start();
pico.stop();
Startable startable = pico.getComponent(DefaultPicoContainerTestCase.MyStartable.class);
@@ -73,4 +73,23 @@
pico.stop();
}
+ public static class returnParameterAction implements Action {
+ private final int parameter;
+
+ public returnParameterAction(int parameter) {
+ this.parameter = parameter;
+ }
+
+ public void describeTo(Description description) {
+ description.appendText("returns param[")
+ .appendValue(parameter)
+ .appendText("]");
+ }
+
+ public Object invoke(Invocation invocation) {
+ return invocation.getParameter(parameter);
+ }
+ }
+
+
}
Index: pico/container/src/java/org/picocontainer/monitors/NullComponentMonitor.java
===================================================================
--- pico/container/src/java/org/picocontainer/monitors/NullComponentMonitor.java (revision 4207)
+++ pico/container/src/java/org/picocontainer/monitors/NullComponentMonitor.java (working copy)
@@ -14,13 +14,9 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
-import java.lang.reflect.AccessibleObject;
-import org.picocontainer.ComponentMonitor;
-import org.picocontainer.PicoLifecycleException;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.PicoContainer;
+import org.picocontainer.*;
+import org.picocontainer.injectors.AbstractInjector;
/**
* A {@link ComponentMonitor} which does nothing.
@@ -76,4 +72,8 @@
return null;
}
+ public AbstractInjector newInjectionFactory(AbstractInjector abstractInjector) {
+ return abstractInjector;
+ }
+
}
Index: pico/container/src/java/org/picocontainer/monitors/WriterComponentMonitor.java
===================================================================
--- pico/container/src/java/org/picocontainer/monitors/WriterComponentMonitor.java (revision 4207)
+++ pico/container/src/java/org/picocontainer/monitors/WriterComponentMonitor.java (working copy)
@@ -22,10 +22,8 @@
import java.lang.reflect.Method;
import java.lang.reflect.Member;
-import org.picocontainer.ComponentMonitor;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.PicoContainer;
+import org.picocontainer.*;
+import org.picocontainer.injectors.AbstractInjector;
/**
* A {@link ComponentMonitor} which writes to a {@link Writer}.
@@ -105,4 +103,8 @@
out.println(format(ComponentMonitorHelper.NO_COMPONENT, componentKey));
return delegate.noComponentFound(container, componentKey);
}
+
+ public AbstractInjector newInjectionFactory(AbstractInjector abstractInjector) {
+ return delegate.newInjectionFactory(abstractInjector);
+ }
}
Index: pico/container/src/java/org/picocontainer/monitors/LifecycleComponentMonitor.java
===================================================================
--- pico/container/src/java/org/picocontainer/monitors/LifecycleComponentMonitor.java (revision 4207)
+++ pico/container/src/java/org/picocontainer/monitors/LifecycleComponentMonitor.java (working copy)
@@ -16,12 +16,8 @@
import java.util.Collection;
import java.util.List;
-import org.picocontainer.ComponentMonitor;
-import org.picocontainer.PicoException;
-import org.picocontainer.PicoLifecycleException;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.PicoContainer;
+import org.picocontainer.*;
+import org.picocontainer.injectors.AbstractInjector;
/**
* A {@link ComponentMonitor} which collects lifecycle failures
@@ -102,7 +98,11 @@
return delegate.noComponentFound(container, componentKey);
}
+ public AbstractInjector newInjectionFactory(AbstractInjector abstractInjector) {
+ return delegate.newInjectionFactory(abstractInjector);
+ }
+
public void rethrowLifecycleFailuresException() {
throw new LifecycleFailuresException(lifecycleFailures);
}
Index: pico/container/src/java/org/picocontainer/monitors/ConsoleComponentMonitor.java
===================================================================
--- pico/container/src/java/org/picocontainer/monitors/ConsoleComponentMonitor.java (revision 4207)
+++ pico/container/src/java/org/picocontainer/monitors/ConsoleComponentMonitor.java (working copy)
@@ -23,10 +23,8 @@
import java.lang.reflect.Method;
import java.lang.reflect.Member;
-import org.picocontainer.ComponentMonitor;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.PicoContainer;
+import org.picocontainer.*;
+import org.picocontainer.injectors.AbstractInjector;
/**
* A {@link ComponentMonitor} which writes to a {@link OutputStream}.
@@ -141,4 +139,8 @@
return delegate.noComponentFound(container, componentKey);
}
+ public AbstractInjector newInjectionFactory(AbstractInjector abstractInjector) {
+ return delegate.newInjectionFactory(abstractInjector);
+ }
+
}
Index: pico/container/src/java/org/picocontainer/monitors/AbstractComponentMonitor.java
===================================================================
--- pico/container/src/java/org/picocontainer/monitors/AbstractComponentMonitor.java (revision 4207)
+++ pico/container/src/java/org/picocontainer/monitors/AbstractComponentMonitor.java (working copy)
@@ -15,11 +15,8 @@
import java.lang.reflect.Method;
import java.lang.reflect.Member;
-import org.picocontainer.ComponentMonitor;
-import org.picocontainer.ComponentMonitorStrategy;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.PicoContainer;
+import org.picocontainer.*;
+import org.picocontainer.injectors.AbstractInjector;
import org.picocontainer.monitors.NullComponentMonitor;
/**
@@ -115,6 +112,10 @@
return delegate.noComponentFound(container, componentKey);
}
+ public AbstractInjector newInjectionFactory(AbstractInjector abstractInjector) {
+ return abstractInjector;
+ }
+
/**
* If the delegate supports a {@link ComponentMonitorStrategy monitor strategy},
* this is used to changed the monitor while keeping the same delegate.
Index: pico/container/src/java/org/picocontainer/DefaultPicoContainer.java
===================================================================
--- pico/container/src/java/org/picocontainer/DefaultPicoContainer.java (revision 4207)
+++ pico/container/src/java/org/picocontainer/DefaultPicoContainer.java (working copy)
@@ -341,7 +341,7 @@
return found;
}
- protected MutablePicoContainer addAdapterInternal(final ComponentAdapter<?> componentAdapter) {
+ protected MutablePicoContainer addAdapterInternal(ComponentAdapter<?> componentAdapter) {
Object componentKey = componentAdapter.getComponentKey();
if (getComponentKeyToAdapterCache().containsKey(componentKey)) {
throw new PicoCompositionException("Duplicate Keys not allowed. Duplicate for '" + componentKey + "'");
Index: pico/container/src/java/org/picocontainer/ComponentMonitor.java
===================================================================
--- pico/container/src/java/org/picocontainer/ComponentMonitor.java (revision 4207)
+++ pico/container/src/java/org/picocontainer/ComponentMonitor.java (working copy)
@@ -10,6 +10,8 @@
package org.picocontainer;
+import org.picocontainer.injectors.AbstractInjector;
+
import java.lang.reflect.Constructor;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
@@ -123,4 +125,6 @@
* @param componentKey
*/
Object noComponentFound(MutablePicoContainer container, Object componentKey);
+
+ AbstractInjector newInjectionFactory(AbstractInjector abstractInjector);
}
Index: pico/container/src/java/org/picocontainer/injectors/ConstructorInjection.java
===================================================================
--- pico/container/src/java/org/picocontainer/injectors/ConstructorInjection.java (revision 4207)
+++ pico/container/src/java/org/picocontainer/injectors/ConstructorInjection.java (working copy)
@@ -31,10 +31,9 @@
*/
public class ConstructorInjection implements InjectionFactory, Serializable {
-
public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor componentMonitor, LifecycleStrategy lifecycleStrategy, Properties properties, Object componentKey,
Class<T> componentImplementation, Parameter... parameters) throws PicoCompositionException {
boolean useNames = AbstractBehaviorFactory.removePropertiesIfPresent(properties, Characteristics.USE_NAMES);
- return new ConstructorInjector(componentKey, componentImplementation, parameters, componentMonitor, lifecycleStrategy, useNames);
+ return componentMonitor.newInjectionFactory(new ConstructorInjector(componentKey, componentImplementation, parameters, componentMonitor, lifecycleStrategy, useNames));
}
}
Index: pico/gems/src/java/org/picocontainer/gems/monitors/Log4JComponentMonitor.java
===================================================================
--- pico/gems/src/java/org/picocontainer/gems/monitors/Log4JComponentMonitor.java (revision 4207)
+++ pico/gems/src/java/org/picocontainer/gems/monitors/Log4JComponentMonitor.java (working copy)
@@ -26,10 +26,8 @@
import org.apache.log4j.Priority;
import org.picocontainer.monitors.ComponentMonitorHelper;
import org.picocontainer.monitors.NullComponentMonitor;
-import org.picocontainer.ComponentMonitor;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.PicoContainer;
+import org.picocontainer.*;
+import org.picocontainer.injectors.AbstractInjector;
/**
@@ -214,6 +212,10 @@
}
+ public AbstractInjector newInjectionFactory(AbstractInjector abstractInjector) {
+ return delegate.newInjectionFactory(abstractInjector);
+ }
+
protected Logger getLogger(Member member) {
if ( logger != null ){
return logger;
Index: pico/gems/src/java/org/picocontainer/gems/monitors/CommonsLoggingComponentMonitor.java
===================================================================
--- pico/gems/src/java/org/picocontainer/gems/monitors/CommonsLoggingComponentMonitor.java (revision 4207)
+++ pico/gems/src/java/org/picocontainer/gems/monitors/CommonsLoggingComponentMonitor.java (working copy)
@@ -22,10 +22,8 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.picocontainer.ComponentMonitor;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.PicoContainer;
+import org.picocontainer.*;
+import org.picocontainer.injectors.AbstractInjector;
import org.picocontainer.monitors.ComponentMonitorHelper;
import org.picocontainer.monitors.NullComponentMonitor;
@@ -211,6 +209,10 @@
return delegate.noComponentFound(container, componentKey);
}
+ public AbstractInjector newInjectionFactory(AbstractInjector abstractInjector) {
+ return delegate.newInjectionFactory(abstractInjector);
+ }
+
protected Log getLog(Member member) {
if ( log != null ){
return log;