RE: [picocontainer-dev] comments on injection

"Putrycz, Erik" <[email protected]>
Newsgroups gmane.comp.java.picocontainer.devel
Message-ID <[email protected]>
Ok I think I figured it out now how to include the new files in the
patch... Getting too used to the one click synchronization.

 

Erik.

________________________________

From: Paul Hammant [mailto:[email protected]] 
Sent: June 1, 2007 0:56
To: dev-qxt/[email protected]
Subject: Re: [picocontainer-dev] comments on injection

 

Erik,

 

You left off new classes :-)

 

Most particularly - DynamicRegistrationLocator.java

 

- Paul

 

On May 31, 2007, at 4:09 PM, Putrycz, Erik wrote:





Ok here we go! 

The locator interface can allow to easily implement things like
@ImplementedBy (no need to panic, it's not in the patch) and also
dynamic registration (a component not found is directly added to the
container). I find this very handy. This doesn't affect pico's behavior
by default. 

 

                        MutablePicoContainer pico = new
DefaultPicoContainer();

                        pico.addLocator(new
DynamicRegistrationLocator());

                        LinkedList<String> list =
pico.getComponent(LinkedList.class);

                        assertNotNull(list);

 

I have in my code also a @NonInstantiable annotation so that pico can
throw an exception if it tries to create one of these annotated classes.

Another small change, I updated junit to 4 so that you can use the
annotations.

 

Erik Putrycz, Ph.D - Research Associate / [email protected]
<mailto:[email protected]>  / (613) 990 0681

Institute for Information Technology - Software Engineering Group

National Research Council, Canada - Building M-50, 1200 Montreal Road

Ottawa, Ontario, CANADA K1A 0R6

________________________________

From: Paul Hammant [mailto:[email protected]] 
Sent: May 31, 2007 16:24
To: dev-qxt/[email protected]
Subject: Re: [picocontainer-dev] comments on injection

 

Give us patches dude, for both member injection and hooks - you mean
@implementedBy(...) right ?

 

-ph

 

ps - be aware there are renames going on presently.

 

For one, I'm killing org.picocontainer.defaults.* class by class. Either
moving them to elsewhere or deleting them as they've proven after four
years to not be need at the current level of type-safety (exceptions)

 

 

On May 31, 2007, at 11:48 AM, Putrycz, Erik wrote:

 

I moved most of my project to pico 2 and was hoping to use the new
injection but currently the only injection available is on methods...

I'm not very keen on the method injection, it creates IMO often too much
verbose code whereas a member injection is quicker to write. Often I
don't even need a getter and setter...

However I think both would be nice to have.

Any objection on adding member injection?

I also think I figured out a way to inject members of an existing object
without modifying the container. I'll see how that turns out.

 

Last comment... I know this is very unpopular here but I'd be nice if
there was some kind of hook in Pico to be able to setup auto
registration of classes. Somekind of callback on getComponent - when not
found - would be nice.

 

<Pico2-locator.patch>

---------------------------------------------------------------------

To unsubscribe from this list please visit:

 

    http://xircles.codehaus.org/manage_email

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

    http://xircles.codehaus.org/manage_email
Pico2-locator.patch (application/octet-stream, 19.6 KB)
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/container/pom.xml
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/container/pom.xml	(revision 3459)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/container/pom.xml	(working copy)
@@ -26,6 +26,7 @@
             <plugin>
                 <groupId>com.thoughtworks.paranamer</groupId>
                 <artifactId>paranamer-maven-plugin</artifactId>
+                
                 <configuration>
                     <sourceDirectory>src/test</sourceDirectory>
                     <outputDirectory>target/test-classes</outputDirectory>
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/ComponentLocator.java
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/ComponentLocator.java	(revision 0)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/ComponentLocator.java	(revision 0)
@@ -0,0 +1,21 @@
+/*****************************************************************************
+ * Copyright (C) PicoContainer 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.picocontainer;
+
+/**
+ * This enables to locate and handle non registered components
+ * @author putrycze
+ *
+ */
+public interface ComponentLocator {
+	
+	public abstract boolean locateComponentType(Class cl, MutablePicoContainer container);
+
+}
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/containers/AbstractDelegatingMutablePicoContainer.java
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/containers/AbstractDelegatingMutablePicoContainer.java	(revision 3459)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/containers/AbstractDelegatingMutablePicoContainer.java	(working copy)
@@ -11,6 +11,7 @@
 
 import org.picocontainer.ComponentAdapter;
 import org.picocontainer.ComponentCharacteristic;
+import org.picocontainer.ComponentLocator;
 import org.picocontainer.MutablePicoContainer;
 import org.picocontainer.Parameter;
 import org.picocontainer.PicoContainer;
@@ -28,7 +29,7 @@
  */
 public abstract class AbstractDelegatingMutablePicoContainer implements MutablePicoContainer, Serializable {
 
-    private MutablePicoContainer delegate;
+	private MutablePicoContainer delegate;
 
     public AbstractDelegatingMutablePicoContainer(MutablePicoContainer delegate) {
         this.delegate = delegate;
@@ -137,4 +138,9 @@
     public MutablePicoContainer as(ComponentCharacteristic... characteristics) {
         return delegate.as(characteristics);
     }
+    
+    public void addLocator(ComponentLocator locator) {
+    	delegate.addLocator(locator);
+	}
+    
 }
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/defaults/DefaultPicoContainer.java
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/defaults/DefaultPicoContainer.java	(revision 3459)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/defaults/DefaultPicoContainer.java	(working copy)
@@ -12,6 +12,7 @@
 import org.picocontainer.ComponentAdapter;
 import org.picocontainer.ComponentCharacteristic;
 import org.picocontainer.ComponentFactory;
+import org.picocontainer.ComponentLocator;
 import org.picocontainer.ComponentMonitor;
 import org.picocontainer.ComponentMonitorStrategy;
 import org.picocontainer.Disposable;
@@ -90,6 +91,8 @@
     private boolean disposed = false;
     // Keeps track of child containers started status
     private Set<Integer> childrenStarted = new HashSet<Integer>();
+    
+    private List<ComponentLocator> locators = new ArrayList<ComponentLocator>();
 
     private LifecycleManager lifecycleManager = new OrderedComponentAdapterLifecycleManager();
     private LifecycleStrategy lifecycleStrategy;
@@ -278,6 +281,7 @@
         if (componentType == null) {
             return Collections.emptyList();
         }
+        
         List<ComponentAdapter<T>> found = new ArrayList<ComponentAdapter<T>>();
         for (ComponentAdapter<?> componentAdapter : getComponentAdapters()) {
             if (componentType.isAssignableFrom(componentAdapter.getComponentImplementation())) {
@@ -285,6 +289,18 @@
                 found.add(typedComponentAdapter);
             }
         }
+        if (found.size() == 0) {
+        // try to process the locator
+        for (ComponentLocator locator:locators) {
+        	if (locator.locateComponentType(componentType, this))
+                for (ComponentAdapter<?> componentAdapter : getComponentAdapters()) {
+                    if (componentType.isAssignableFrom(componentAdapter.getComponentImplementation())) {
+                        ComponentAdapter<T> typedComponentAdapter = typeComponentAdapter(componentAdapter);
+                        found.add(typedComponentAdapter);
+                    }
+                }        		
+        }        
+        }
         return found;
     }
 
@@ -804,5 +820,10 @@
         }
     }
 
+	public void addLocator(ComponentLocator locator) {
+		locators.add(locator);
+		
+	}
+
 
 }
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/defaults/DynamicRegistrationLocator.java
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/defaults/DynamicRegistrationLocator.java	(revision 0)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/defaults/DynamicRegistrationLocator.java	(revision 0)
@@ -0,0 +1,16 @@
+package org.picocontainer.defaults;
+
+import java.lang.reflect.Modifier;
+
+import org.picocontainer.ComponentLocator;
+import org.picocontainer.MutablePicoContainer;
+
+public class DynamicRegistrationLocator implements ComponentLocator {
+
+	public boolean locateComponentType(Class cl, MutablePicoContainer container) {
+		if (!cl.isInterface() && !Modifier.isAbstract(cl.getModifiers()) && !cl.getName().startsWith("java.lang"))
+			container.addComponent(cl);
+		return true;
+	}
+
+}
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/Inject.java
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/Inject.java	(revision 3459)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/Inject.java	(working copy)
@@ -6,6 +6,6 @@
 import java.lang.annotation.RetentionPolicy;
 
 @Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
+@Target(value={ElementType.METHOD,ElementType.FIELD})
 public @interface Inject {
 }
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/MutablePicoContainer.java
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/MutablePicoContainer.java	(revision 3459)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/java/org/picocontainer/MutablePicoContainer.java	(working copy)
@@ -170,4 +170,11 @@
      */
     MutablePicoContainer as(ComponentCharacteristic... characteristics);
 
+    /**
+     * If a component has not been found, then locators have a chance to provide mecanisms to locate it
+     * 
+     * @param locator
+     */
+	void addLocator(ComponentLocator locator);
+
 }
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/test/org/picocontainer/defaults/LocatorTestCase.java
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/test/org/picocontainer/defaults/LocatorTestCase.java	(revision 0)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/test/org/picocontainer/defaults/LocatorTestCase.java	(revision 0)
@@ -0,0 +1,20 @@
+package org.picocontainer.defaults;
+
+import java.util.LinkedList;
+
+import org.junit.Test;
+import org.picocontainer.ComponentLocator;
+import org.picocontainer.MutablePicoContainer;
+import static org.junit.Assert.*;
+
+public class LocatorTestCase {
+
+	@Test
+	public void testDynamicRegistration() {
+		MutablePicoContainer pico = new DefaultPicoContainer();
+		ComponentLocator dynamicReg = new DynamicRegistrationLocator();
+		pico.addLocator(dynamicReg);
+		LinkedList<String> list = pico.getComponent(LinkedList.class);
+		assertNotNull(list);
+	}
+}
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/test/org/picocontainer/PicoBuilderTestCase.java
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/test/org/picocontainer/PicoBuilderTestCase.java	(revision 3459)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/container/src/test/org/picocontainer/PicoBuilderTestCase.java	(working copy)
@@ -58,6 +58,7 @@
                 "    cdiDelegate\n" +
                 "    sdiDelegate\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -71,6 +72,7 @@
                 "    cdiDelegate\n" +
                 "    sdiDelegate\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.StartableLifecycleStrategy\n" +
                 "    componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "  lifecycleStrategy\n" +
@@ -86,6 +88,7 @@
                 "    cdiDelegate\n" +
                 "    sdiDelegate\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.ReflectionLifecycleStrategy\n" +
                 "    methodNames\n" +
                 "      stringstartstring\n" +
@@ -107,6 +110,7 @@
                 "    cdiDelegate\n" +
                 "    sdiDelegate\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.ConsoleComponentMonitor\n" +
                 "    delegate=org.picocontainer.monitors.NullComponentMonitor\n" +
@@ -122,6 +126,7 @@
                 "    cdiDelegate\n" +
                 "    sdiDelegate\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.ConsoleComponentMonitor\n" +
                 "    delegate=org.picocontainer.monitors.NullComponentMonitor\n" +
@@ -147,6 +152,7 @@
                 "      cdiDelegate\n" +
                 "      sdiDelegate\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -161,6 +167,7 @@
                 "      cdiDelegate\n" +
                 "      sdiDelegate\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -175,6 +182,7 @@
                 "      delegate=org.picocontainer.adapters.ImplementationHidingBehaviorFactory\n" +
                 "        delegate=org.picocontainer.adapters.SetterInjectionFactory\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -191,6 +199,7 @@
                 "    cdiDelegate\n" +
                 "    sdiDelegate\n" +
                 "  parent=org.picocontainer.PicoBuilderTestCase_CustomParentcontainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -212,6 +221,7 @@
         assertEquals("PICO\n" +
                 "  componentAdapterFactory=org.picocontainer.adapters.SetterInjectionFactory\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -223,6 +233,7 @@
         assertEquals("PICO\n" +
                 "  componentAdapterFactory=org.picocontainer.adapters.AnnotationInjectionFactory\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -234,6 +245,7 @@
         assertEquals("PICO\n" +
                 "  componentAdapterFactory=org.picocontainer.adapters.ConstructorInjectionFactory\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -246,6 +258,7 @@
                 "  componentAdapterFactory=org.picocontainer.adapters.ImplementationHidingBehaviorFactory\n" +
                 "    delegate=org.picocontainer.adapters.SetterInjectionFactory\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -259,6 +272,7 @@
                 "    delegate=org.picocontainer.adapters.ImplementationHidingBehaviorFactory\n" +
                 "      delegate=org.picocontainer.adapters.SetterInjectionFactory\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -273,6 +287,7 @@
                 "      cdiDelegate\n" +
                 "      sdiDelegate\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "PICO",foo);
@@ -286,6 +301,7 @@
                 "    cdiDelegate\n" +
                 "    sdiDelegate\n" +
                 "  parent=org.picocontainer.containers.EmptyPicoContainer\n" +
+                "  locators\n" +
                 "  lifecycleStrategy=org.picocontainer.lifecycle.NullLifecycleStrategy\n" +
                 "  componentMonitor=org.picocontainer.monitors.NullComponentMonitor\n" +
                 "org.picocontainer.PicoBuilderTestCase_-TestPicoContainer",foo);
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/gems/src/java/org/picocontainer/gems/containers/CommonsLoggingTracingContainerDecorator.java
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/gems/src/java/org/picocontainer/gems/containers/CommonsLoggingTracingContainerDecorator.java	(revision 3459)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/gems/src/java/org/picocontainer/gems/containers/CommonsLoggingTracingContainerDecorator.java	(working copy)
@@ -2,6 +2,7 @@
 
 import org.picocontainer.ComponentAdapter;
 import org.picocontainer.ComponentCharacteristic;
+import org.picocontainer.ComponentLocator;
 import org.picocontainer.MutablePicoContainer;
 import org.picocontainer.Parameter;
 import org.picocontainer.PicoContainer;
@@ -462,4 +463,9 @@
     public MutablePicoContainer as(ComponentCharacteristic... characteristics) {
         return delegate.as(characteristics);
     }
+
+
+	public void addLocator(ComponentLocator locator) {
+		delegate.addLocator(locator);
+	}
 }
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/gems/src/java/org/picocontainer/gems/containers/Log4jTracingContainerDecorator.java
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/gems/src/java/org/picocontainer/gems/containers/Log4jTracingContainerDecorator.java	(revision 3459)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/gems/src/java/org/picocontainer/gems/containers/Log4jTracingContainerDecorator.java	(working copy)
@@ -12,6 +12,7 @@
 
 import org.picocontainer.ComponentAdapter;
 import org.picocontainer.ComponentCharacteristic;
+import org.picocontainer.ComponentLocator;
 import org.picocontainer.MutablePicoContainer;
 import org.picocontainer.Parameter;
 import org.picocontainer.PicoContainer;
@@ -523,4 +524,8 @@
     public MutablePicoContainer as(ComponentCharacteristic... characteristics) {
         return delegate.as(characteristics);
     }
+
+	public void addLocator(ComponentLocator locator) {
+		delegate.addLocator(locator);
+	}
 }
Index: /home/putrycze/workspaces/workspace-cobol/Pico2/pom.xml
===================================================================
--- /home/putrycze/workspaces/workspace-cobol/Pico2/pom.xml	(revision 3459)
+++ /home/putrycze/workspaces/workspace-cobol/Pico2/pom.xml	(working copy)
@@ -141,7 +141,7 @@
             <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
-                <version>3.8.1</version>
+                <version>4.0</version>
             </dependency>
             <dependency>
                 <groupId>jmock</groupId>
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.