[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;
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.