[picocontainer-dev] Trying an experiment to kill off ContainerRecorder (Nano)

Paul Hammant <[email protected]>
Newsgroups gmane.comp.java.picocontainer.devel
Message-ID <[email protected]>


I'm still going through it ... this patch wont even compile.

It's proving 'intricate' around changing ...

     public interface ContainerComposer  {
         void composeContainer(org.picocontainer.MutablePicoContainer  
mutablePicoContainer, java.lang.Object o);
     }

.. to ...

     public interface ContainerComposer  {
         void composeContainer(java.lang.Object o);
     }

If anyone else wants to take a look, they are welcome to do so.

The way I'm doing it is to copy the style of http://svn.codehaus.org/picocontainer/java/2.x/trunk/nanoextras/struts2/picocontainer-struts2/src/main/java/org/picocontainer/struts2/PicoStruts2Filter.java 
  to the relevant web-framework bindings in NanoExtras which were the  
only things using ContainerRecorder the old way.

- Paul

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email
lastmile.patch (application/octet-stream, 26.5 KB)
Index: nanoextras/nanowar/nanowar/src/test/org/nanocontainer/nanowar/ScopedContainerComposerTestCase.java
===================================================================
--- nanoextras/nanowar/nanowar/src/test/org/nanocontainer/nanowar/ScopedContainerComposerTestCase.java	(revision 4401)
+++ nanoextras/nanowar/nanowar/src/test/org/nanocontainer/nanowar/ScopedContainerComposerTestCase.java	(working copy)
@@ -20,6 +20,7 @@
 import javax.servlet.http.HttpSession;
 
 import org.jmock.Mockery;
+import org.jmock.Expectations;
 import org.jmock.integration.junit4.JMock;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -80,27 +81,30 @@
     }
     
     private void assertComposedHierarchy(ScopedContainerComposer composer) {
-        MutablePicoContainer applicationContainer = new DefaultPicoContainer();
         ServletContext servletContext = mockery.mock(ServletContext.class);
 
-        composer.composeContainer(applicationContainer, servletContext);
-        assertNotNull(applicationContainer.getComponent("applicationScopedInstance"));
-        assertNotNull(applicationContainer.getComponent("testFoo"));
+        mockery.checking(new Expectations(){{
+            one(servletContext).getAttribute(with(equal("PICO-SESSION-STORE")));
+            will(returnValue(?????));
+        }});
 
-        MutablePicoContainer sessionContainer = new DefaultPicoContainer(applicationContainer);
 
+        PicoContainer pico = composer.getRequestContainer();
+        composer.composeContainer(null, servletContext);
+        assertNotNull(pico.getComponent("applicationScopedInstance"));
+        assertNotNull(pico.getComponent("testFoo"));
+
         HttpSession httpSession = mockery.mock(HttpSession.class);
-        composer.composeContainer(sessionContainer, httpSession);
-        assertNotNull(sessionContainer.getComponent("applicationScopedInstance"));
-        assertNotNull(sessionContainer.getComponent("sessionScopedInstance"));
+        composer.composeContainer(null, httpSession);
+        assertNotNull(pico.getComponent("applicationScopedInstance"));
+        assertNotNull(pico.getComponent("sessionScopedInstance"));
 
-        MutablePicoContainer requestContainer = new DefaultPicoContainer(sessionContainer);
         HttpServletRequest httpRequest = mockery.mock(HttpServletRequest.class);
-        composer.composeContainer(requestContainer, httpRequest);
-        assertNotNull(requestContainer.getComponent("applicationScopedInstance"));
-        assertNotNull(requestContainer.getComponent("sessionScopedInstance"));
-        assertNotNull(requestContainer.getComponent("requestScopedInstance"));
-        assertNotNull(requestContainer.getComponent("testFooHierarchy"));
+        composer.composeContainer(null, httpRequest);
+        assertNotNull(pico.getComponent("applicationScopedInstance"));
+        assertNotNull(pico.getComponent("sessionScopedInstance"));
+        assertNotNull(pico.getComponent("requestScopedInstance"));
+        assertNotNull(pico.getComponent("testFooHierarchy"));
     }
     
 
Index: nanoextras/nanowar/nanowar/src/java/org/nanocontainer/nanowar/chain/ServletChainBuilder.java
===================================================================
--- nanoextras/nanowar/nanowar/src/java/org/nanocontainer/nanowar/chain/ServletChainBuilder.java	(revision 4401)
+++ nanoextras/nanowar/nanowar/src/java/org/nanocontainer/nanowar/chain/ServletChainBuilder.java	(working copy)
@@ -25,8 +25,6 @@
 import org.nanocontainer.ClassName;
 import org.nanocontainer.integrationkit.ContainerBuilder;
 import org.nanocontainer.integrationkit.ContainerPopulator;
-import org.nanocontainer.integrationkit.ContainerRecorder;
-import org.nanocontainer.reflection.DefaultContainerRecorder;
 import org.picocontainer.MutablePicoContainer;
 import org.picocontainer.Parameter;
 import org.picocontainer.PicoContainer;
@@ -44,7 +42,7 @@
  */
 public final class ServletChainBuilder {
 
-	private final Map recorderCache;
+	private final Map containerCache;
 	private final ServletContext context;
     private final String containerBuilderClassName;
     private final String containerScriptName;
@@ -63,7 +61,7 @@
         this.containerBuilderClassName = containerBuilderClassName;
         this.containerScriptName = containerScriptName;
         this.emptyContainerScript = emptyContainerScript;
-        this.recorderCache = new HashMap();
+        this.containerCache = new HashMap();
 	}
 
 	/**
@@ -72,20 +70,15 @@
 	 * @param container the MutablePicoContainer used by the recorder
 	 * @param path the String representing the servlet path used as key for the recorder cache
 	 */
-	public void populateContainerForPath(MutablePicoContainer container,
-			String path) {
-		ContainerRecorder recorder;
-		synchronized (recorderCache) {
-			recorder = (ContainerRecorder) recorderCache.get(path);
-			if (recorder == null) {
-				recorder = new DefaultContainerRecorder(new DefaultPicoContainer());
-				recorderCache.put(path, recorder);
-				ContainerPopulator populator = createContainerPopulator(containerBuilderClassName,
-                                    obtainReader(path), Thread.currentThread().getContextClassLoader());
-				populator.populateContainer(recorder.getContainerProxy());
+	public void populateContainerForPath(MutablePicoContainer container, String path) {
+		synchronized (containerCache) {
+			if (!containerCache.containsKey(path)) {
+				containerCache.put(path, container);
+                createContainerPopulator(containerBuilderClassName,
+                                    obtainReader(path), Thread.currentThread().getContextClassLoader())
+                        .populateContainer(container);
 			}
 		}
-		recorder.replay(container);
 	}
 
 	/**
Index: nanoextras/nanowar/nanowar/src/java/org/nanocontainer/nanowar/ScopedContainerComposer.java
===================================================================
--- nanoextras/nanowar/nanowar/src/java/org/nanocontainer/nanowar/ScopedContainerComposer.java	(revision 4401)
+++ nanoextras/nanowar/nanowar/src/java/org/nanocontainer/nanowar/ScopedContainerComposer.java	(working copy)
@@ -25,15 +25,16 @@
 import org.nanocontainer.integrationkit.ContainerBuilder;
 import org.nanocontainer.integrationkit.ContainerComposer;
 import org.nanocontainer.integrationkit.ContainerPopulator;
-import org.nanocontainer.integrationkit.ContainerRecorder;
-import org.nanocontainer.reflection.DefaultContainerRecorder;
 import org.picocontainer.DefaultPicoContainer;
 import org.picocontainer.MutablePicoContainer;
 import org.picocontainer.ObjectReference;
 import org.picocontainer.Parameter;
 import org.picocontainer.PicoContainer;
+import org.picocontainer.behaviors.Caching;
+import org.picocontainer.behaviors.Storing;
 import org.picocontainer.references.SimpleReference;
 import org.picocontainer.parameters.ConstantParameter;
+import apple.laf.TrackClient;
 
 /**
  * <p>
@@ -66,10 +67,15 @@
     
     // ContainerBuilder class name
 	private final String containerBuilderClassName;
+
+    private MutablePicoContainer applicationContainer;
+    private MutablePicoContainer sessionContainer;
+    private MutablePicoContainer requestContainer;
+
+    private Storing requestStoring;
+    private Storing sessionStoring;
+    private static final String SESSION_STORE = "PICO-SESSION-STORE";
     // scoped container recorders
-	private final ContainerRecorder applicationRecorder;
-    private ContainerRecorder requestRecorder;
-    private ContainerRecorder sessionRecorder;
 
     /**
      * Creates a default ScopedContainerComposer
@@ -86,26 +92,32 @@
 	    ScopedContainerConfigurator config = getConfigurator(configuration);
 	    containerBuilderClassName = config.getContainerBuilder();
 
-        MutablePicoContainer applicationContainerPrototype = new DefaultPicoContainer();
-        applicationRecorder = new DefaultContainerRecorder(applicationContainerPrototype);
-        populateContainer(config.getApplicationConfig(), applicationRecorder, null);
+        applicationContainer = new DefaultPicoContainer(new Caching());
+        populateContainer(config.getApplicationConfig(), applicationContainer, null);
 
-        MutablePicoContainer sessionContainerPrototype = new DefaultPicoContainer(applicationContainerPrototype);
-        sessionRecorder = new DefaultContainerRecorder(sessionContainerPrototype);
-        populateContainer(config.getSessionConfig(), sessionRecorder, applicationContainerPrototype);
+        sessionStoring = new Storing();
+        sessionContainer = new DefaultPicoContainer(sessionStoring, applicationContainer);
+        populateContainer(config.getSessionConfig(), sessionContainer, applicationContainer);
 
-        MutablePicoContainer requestContainerPrototype = new DefaultPicoContainer(sessionContainerPrototype);
-        requestRecorder = new DefaultContainerRecorder(requestContainerPrototype);
-        populateContainer(config.getRequestConfig(), requestRecorder, sessionContainerPrototype);
+        requestStoring = new Storing();
+        requestContainer = new DefaultPicoContainer(requestStoring, sessionContainer);
+        populateContainer(config.getRequestConfig(), requestContainer, sessionContainer);
 	}    
 
     public void composeContainer(MutablePicoContainer container, Object scope) {
         if (scope instanceof ServletContext) {
-            applicationRecorder.replay(container);
         } else if (scope instanceof HttpSession) {
-            sessionRecorder.replay(container);
+            HttpSession session = (HttpSession) scope;
+            synchronized (this) {
+                Storing.StoreWrapper sr = (Storing.StoreWrapper) session.getAttribute(SESSION_STORE);
+                if (sr != null) {
+                    sessionStoring.putCacheForThread(sr);
+                } else {
+                    session.setAttribute(SESSION_STORE, sessionStoring.resetCacheForThread());
+                }
+            }
         } else if (scope instanceof HttpServletRequest) {
-            requestRecorder.replay(container);
+            requestStoring.resetCacheForThread();
         }
     }
 
@@ -117,8 +129,7 @@
         return configurator;
     }
     
-	private void populateContainer(String resources, ContainerRecorder recorder, MutablePicoContainer parent) {
-	    MutablePicoContainer container = recorder.getContainerProxy();
+	private void populateContainer(String resources, MutablePicoContainer container, MutablePicoContainer parent) {
 	    String[] resourcePaths = toCSV(resources);
         for (String resourcePath : resourcePaths) {
             ContainerPopulator populator = createContainerPopulator(getResource(resourcePath), parent);
@@ -157,5 +168,8 @@
 	private ClassLoader getClassLoader() {
 		return Thread.currentThread().getContextClassLoader();
 	}
-    
+
+    public PicoContainer getRequestContainer() {
+        return requestContainer;
+    }
 }
\ No newline at end of file
Index: nanoextras/nanowar/nanowar/src/java/org/nanocontainer/nanowar/XStreamContainerComposer.java
===================================================================
--- nanoextras/nanowar/nanowar/src/java/org/nanocontainer/nanowar/XStreamContainerComposer.java	(revision 4401)
+++ nanoextras/nanowar/nanowar/src/java/org/nanocontainer/nanowar/XStreamContainerComposer.java	(working copy)
@@ -10,11 +10,10 @@
 package org.nanocontainer.nanowar;
 
 import org.nanocontainer.integrationkit.ContainerComposer;
-import org.nanocontainer.integrationkit.ContainerRecorder;
-import org.nanocontainer.reflection.DefaultContainerRecorder;
 import org.nanocontainer.script.xml.XStreamContainerBuilder;
 import org.picocontainer.MutablePicoContainer;
 import org.picocontainer.DefaultPicoContainer;
+import org.picocontainer.behaviors.Storing;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
@@ -39,26 +38,31 @@
 
     // request and session level container recorders.
     // we do not need one for application scope - this happens really seldom
-    private final ContainerRecorder requestRecorder;
-    private final ContainerRecorder sessionRecorder;
+    private final Storing requestStoring = new Storing();
+    private final Storing sessionStoring = new Storing();
 
+    private final MutablePicoContainer sessionContainer;
+    private final MutablePicoContainer requestContainer;
+    private static final String PICO_SESSION_STORE = "PICO-SESSION-STORE";
+
     /**
      * Constructor for the ContainerAssembler object
      */
     public XStreamContainerComposer() {
 
-        requestRecorder = new DefaultContainerRecorder(new DefaultPicoContainer());
-        sessionRecorder = new DefaultContainerRecorder(new DefaultPicoContainer());
-		
+        sessionContainer = new DefaultPicoContainer(sessionStoring);
+        requestContainer = new DefaultPicoContainer(requestStoring, sessionContainer);
+
+
         // create and populate request scope
         InputStreamReader requestScopeScript = new InputStreamReader(Thread.currentThread().getContextClassLoader().getResourceAsStream(REQUEST_CONFIG));
         XStreamContainerBuilder requestPopulator = new XStreamContainerBuilder(requestScopeScript, Thread.currentThread().getContextClassLoader());
-        requestPopulator.populateContainer(requestRecorder.getContainerProxy());
+        requestPopulator.populateContainer(requestContainer);
 
         // create and populate session scope
         InputStreamReader sessionScopeScript = new InputStreamReader(Thread.currentThread().getContextClassLoader().getResourceAsStream(SESSION_CONFIG));
         XStreamContainerBuilder sessionPopulator = new XStreamContainerBuilder(sessionScopeScript, Thread.currentThread().getContextClassLoader());
-        sessionPopulator.populateContainer(sessionRecorder.getContainerProxy());
+        sessionPopulator.populateContainer(sessionContainer);
 
     }
 
@@ -74,9 +78,17 @@
             XStreamContainerBuilder applicationPopulator = new XStreamContainerBuilder(applicationScopeScript, Thread.currentThread().getContextClassLoader());
             applicationPopulator.populateContainer(container);
         } else if (scope instanceof HttpSession) {
-            sessionRecorder.replay(container);
+            synchronized (sessionStoring) {
+                HttpSession session = (HttpSession) scope;
+                Storing.StoreWrapper sr = (Storing.StoreWrapper) session.getAttribute(PICO_SESSION_STORE);
+                if (sr != null) {
+                    sessionStoring.putCacheForThread(sr);
+                } else {
+                    session.setAttribute(PICO_SESSION_STORE, sessionStoring.resetCacheForThread());
+                }
+            }
         } else if (scope instanceof HttpServletRequest) {
-            requestRecorder.replay(container);
+            requestStoring.resetCacheForThread();
         }
     }
 }
Index: nano/container/src/test/org/nanocontainer/reflection/DefaultContainerRecorderTestCase.java
===================================================================
--- nano/container/src/test/org/nanocontainer/reflection/DefaultContainerRecorderTestCase.java	(revision 4401)
+++ nano/container/src/test/org/nanocontainer/reflection/DefaultContainerRecorderTestCase.java	(working copy)
@@ -1,106 +0,0 @@
-package org.nanocontainer.reflection;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.StringReader;
-import java.lang.reflect.InvocationTargetException;
-
-import org.junit.Test;
-import org.nanocontainer.DefaultNanoContainer;
-import org.nanocontainer.integrationkit.ContainerRecorder;
-import org.nanocontainer.script.xml.XMLContainerBuilder;
-import org.nanocontainer.testmodel.FredImpl;
-import org.nanocontainer.testmodel.ThingThatTakesParamsInConstructor;
-import org.nanocontainer.testmodel.WilmaImpl;
-import org.picocontainer.DefaultPicoContainer;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.behaviors.Caching;
-import org.picocontainer.parameters.ComponentParameter;
-
-/**
- * @author Konstantin Pribluda ( konstantin.pribluda(at)infodesire.com )
- * @author Aslak Helles&oslash;y
- */
-public class DefaultContainerRecorderTestCase {
-    @Test public void testInvocationsCanBeRecordedAndReplayedOnADifferentContainerInstance() throws Exception {
-        ContainerRecorder recorder = new DefaultContainerRecorder(new DefaultNanoContainer());
-        MutablePicoContainer recorded = recorder.getContainerProxy();
-
-        recorded.addComponent("fruit", "apple");
-        recorded.addComponent("int", 239);
-        recorded.addComponent("thing",
-                ThingThatTakesParamsInConstructor.class,
-                ComponentParameter.DEFAULT,
-                ComponentParameter.DEFAULT);
-
-        MutablePicoContainer slave = new DefaultPicoContainer();
-        recorder.replay(slave);
-        assertEquals("apple", slave.getComponent("fruit"));
-        assertEquals("apple239", ((ThingThatTakesParamsInConstructor) slave.getComponent("thing")).getValue());
-
-        // test that we can replay once more
-        MutablePicoContainer anotherSlave = new DefaultPicoContainer();
-        recorder.replay(anotherSlave);
-        assertEquals("apple", anotherSlave.getComponent("fruit"));
-        assertEquals("apple239", ((ThingThatTakesParamsInConstructor) anotherSlave.getComponent("thing")).getValue());
-    }
-
-    @Test public void testRecorderWorksAfterSerialization() throws IOException, ClassNotFoundException, IllegalAccessException, InvocationTargetException {
-        ContainerRecorder recorder = new DefaultContainerRecorder(new DefaultPicoContainer());
-        MutablePicoContainer recorded = recorder.getContainerProxy();
-        recorded.addComponent("fruit", "apple");
-
-        ContainerRecorder serializedRecorder = (ContainerRecorder) serializeAndDeserialize(recorder);
-        MutablePicoContainer slave = new DefaultPicoContainer();
-        serializedRecorder.replay(slave);
-        assertEquals("apple", slave.getComponent("fruit"));
-    }
-
-    private Object serializeAndDeserialize(Object o) throws IOException, ClassNotFoundException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ObjectOutputStream oos = new ObjectOutputStream(baos);
-
-        oos.writeObject(o);
-        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
-
-        return ois.readObject();
-    }
-
-
-    @Test public void testXMLRecorderHierarchy() {
-        
-        MutablePicoContainer parent = new DefaultPicoContainer(new Caching());
-
-        new XMLContainerBuilder(new StringReader(""
-                + "<container>"
-                + "  <component-implementation key='wilma' class='"+WilmaImpl.class.getName()+"'/>"
-                + "</container>"
-                ), Thread.currentThread().getContextClassLoader()).populateContainer(parent);
-
-
-        assertNull(parent.getComponent("fred"));
-        assertNotNull(parent.getComponent("wilma"));
-
-        MutablePicoContainer child = new DefaultPicoContainer(parent);
-
-        new XMLContainerBuilder(new StringReader(
-                  "<container>"
-                + "  <component-implementation key='fred' class='"+FredImpl.class.getName()+"'>"
-                + "     <parameter key='wilma'/>"
-               + "  </component-implementation>"
-                + "</container>"
-                ), Thread.currentThread().getContextClassLoader()).populateContainer(child);
-
-        FredImpl fred = (FredImpl) child.getComponent("fred");
-        assertSame(parent.getComponent("wilma"), fred.wilma());
-    }
-
-}
Index: nano/container/src/java/org/nanocontainer/reflection/DefaultContainerRecorder.java
===================================================================
--- nano/container/src/java/org/nanocontainer/reflection/DefaultContainerRecorder.java	(revision 4401)
+++ nano/container/src/java/org/nanocontainer/reflection/DefaultContainerRecorder.java	(working copy)
@@ -1,117 +0,0 @@
-/*****************************************************************************
- * Copyright (C) NanoContainer Organization. All rights reserved.            *
- * ------------------------------------------------------------------------- *
- * The software in this package is published under the terms of the BSD      *
- * style license a copy of which has been included with this distribution in *
- * the LICENSE.txt file.                                                     *
- *                                                                           *
- *****************************************************************************/
-package org.nanocontainer.reflection;
-
-import org.nanocontainer.integrationkit.ContainerRecorder;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.PicoException;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class is serializable. The original container will not be serialized
- * (for performance reasons), but the invocations will, so they can be replayed at the
- * other end of the wire.
- *
- * @author Konstantin Pribluda ( konstantin.pribluda(at)infodesire.com )
- * @author Aslak Helles&oslash;y
- * @author Mauro Talevi
- */
-public final class DefaultContainerRecorder implements Serializable, ContainerRecorder {
-
-    private final List<Invocation> invocations = new ArrayList<Invocation>();
-    private final transient MutablePicoContainer container;
-
-    private final InvocationHandler invocationRecorder = new InvocationRecorder();
-
-    public DefaultContainerRecorder(MutablePicoContainer container) {
-        this.container = container;
-    }
-
-    public MutablePicoContainer getContainerProxy() {
-        return (MutablePicoContainer) Proxy.newProxyInstance(getClass().getClassLoader(),
-                new Class[]{MutablePicoContainer.class}, invocationRecorder);
-    }
-
-    public void replay(MutablePicoContainer target) {
-        for (Object invocation1 : invocations) {
-            Invocation invocation = (Invocation) invocation1;
-            try {
-                invocation.invoke(target);
-            } catch (IllegalAccessException e) {
-                throw new PicoException(e) {
-                };
-            } catch (InvocationTargetException e) {
-                throw new PicoException(e) {
-                };
-            }
-        }
-    }
-
-    private final class Invocation implements Serializable {
-        private transient Method method;
-        private final Object[] args;
-
-        Invocation(Method method, Object[] args) {
-            this.method = method;
-            this.args = args;
-        }
-
-        private void writeObject(ObjectOutputStream out) throws IOException {
-            out.defaultWriteObject();
-            out.writeUTF(method.getName());
-            out.writeObject(method.getDeclaringClass());
-            Class[] parameterTypes = method.getParameterTypes();
-            out.writeInt(parameterTypes.length);
-            for (Class parameterType : parameterTypes) {
-                out.writeObject(parameterType);
-            }
-        }
-
-        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-            in.defaultReadObject();
-            String methodName = in.readUTF();
-            Class declaringClass = (Class) in.readObject();
-            int n = in.readInt();
-            Class[] parameterTypes = new Class[n];
-            for (int i = 0; i < n; i++) {
-                parameterTypes[i] = (Class) in.readObject();
-            }
-            try {
-                method = declaringClass.getMethod(methodName, parameterTypes);
-            } catch (NoSuchMethodException e) {
-                throw new IOException("Couldn't load method " + methodName);
-            }
-        }
-
-        public void invoke(MutablePicoContainer target) throws IllegalAccessException, InvocationTargetException {
-            method.invoke(target, args);
-        }
-    }
-
-    private class InvocationRecorder implements InvocationHandler, Serializable {
-        /**
-         * Record invocation and invoke on underlying container
-         */
-        public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException, InvocationTargetException {
-            invocations.add(new Invocation(method, args));
-            return method.invoke(container, args);
-        }
-    }
-
-}
Index: nano/container/src/java/org/nanocontainer/integrationkit/ContainerRecorder.java
===================================================================
--- nano/container/src/java/org/nanocontainer/integrationkit/ContainerRecorder.java	(revision 4401)
+++ nano/container/src/java/org/nanocontainer/integrationkit/ContainerRecorder.java	(working copy)
@@ -1,39 +0,0 @@
-/*****************************************************************************
- * Copyright (C) NanoContainer Organization. All rights reserved.            *
- * ------------------------------------------------------------------------- *
- * The software in this package is published under the terms of the BSD      *
- * style license a copy of which has been included with this distribution in *
- * the LICENSE.txt file.                                                     *
- *                                                                           *
- *****************************************************************************/
-package org.nanocontainer.integrationkit;
-
-import org.picocontainer.MutablePicoContainer;
-
-/**
- * Records method calls on a {@link MutablePicoContainer}.
- * This allows to replay all invocations on a different container instance.
- *
- * @author Konstantin Pribluda ( konstantin.pribluda(at)infodesire.com )
- * @author Aslak Helles&oslash;y
- * @author Mauro Talevi
- */
-public interface ContainerRecorder {
-
-    /**
-     * Creates a new proxy that will forward all method invocations to the container passed to
-     * the constructor. All method invocations are recorded so that they can be replayed on a
-     * different container.
-     *
-     * @return a recording container proxy
-     * @see #replay
-     */
-    public MutablePicoContainer getContainerProxy();
-
-    /**
-     * Replay recorded invocations on target container
-     *
-     * @param target container where the invocations should be replayed.
-     */
-    public void replay(MutablePicoContainer target);
-}
\ No newline at end of file
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.