[picocontainer-scm] [5799] java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors: race condition eliminated, also duplicate method situation from super classes (setter injection)

paul-yCVjj/[email protected] Tue, 25 Oct 2011 03:43:36 -0500 (CDT)
Newsgroups gmane.comp.java.picocontainer.cvs
Message-ID <[email protected]>
Revision 5799
Author paul
Date 2011-10-25 03:43:36 -0500 (Tue, 25 Oct 2011)

Log Message

race condition eliminated, also duplicate method situation from super classes (setter injection)

Modified Paths

- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjector.java

- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java

- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/TypedFieldInjector.java

- java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java

Diff

Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjector.java (5798 => 5799)

--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjector.java 2011-07-07 17:14:35 UTC (rev 5798)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjector.java 2011-10-25 08:43:36 UTC (rev 5799)
@@ -12,6 +12,7 @@
import org.picocontainer.ComponentMonitor;
import org.picocontainer.NameBinding;
import org.picocontainer.Parameter;
+import org.picocontainer.PicoContainer;
import org.picocontainer.annotations.Bind;

import java.lang.annotation.Annotation;
@@ -23,13 +24,14 @@
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;

/**
* Injection happens after instantiation, and through fields marked as injection points via an Annotation.
* The default annotation of org.picocontainer.annotations.@Inject can be overridden.
*/
@SuppressWarnings("serial")
-public class AnnotatedFieldInjector extends IterativeInjector {
+public class AnnotatedFieldInjector<T> extends IterativeInjector<T> {

private final Class<? extends Annotation> injectionAnnotation;

Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java (5798 => 5799)

--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java 2011-07-07 17:14:35 UTC (rev 5798)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java 2011-10-25 08:43:36 UTC (rev 5799)
@@ -40,6 +40,7 @@
protected transient Annotation[] bindings;

private transient Paranamer paranamer;
+ private transient boolean initialized;

/**
* Constructs a IterativeInjector
@@ -78,9 +79,9 @@
}

private Parameter[] getMatchingParameterListForSetters(PicoContainer container) throws PicoCompositionException {
- if (injectionMembers == null) {
+ if (initialized == false) {
synchronized (this) {
- if (injectionMembers == null) {
+ if (initialized == false) {
initializeInjectionMembersAndTypeLists();
}
}
@@ -257,6 +258,7 @@

protected void initializeInjectionMembersAndTypeLists() {
injectionMembers = new ArrayList<AccessibleObject>();
+ Set<String> injectionMemberNames = new HashSet<String>();
List<Annotation> bingingIds = new ArrayList<Annotation>();
final List<String> nameList = new ArrayList<String>();
final List<Type> typeList = new ArrayList<Type>();
@@ -265,11 +267,16 @@
final Type[] parameterTypes = method.getGenericParameterTypes();
fixGenericParameterTypes(method, parameterTypes);

- // We're only interested if there is only one parameter and the method name is bean-style.
+ String methodSignature = crudeMethodSignature(method);
+
+ // We're only interested if there is only one parameter ...
if (parameterTypes.length == 1) {
boolean isInjector = isInjectorMethod(method);
- if (isInjector) {
+ // ... and the method name is bean-style.
+ // We're also not interested in dupes from parent classes (not all JDK impls)
+ if (isInjector && !injectionMemberNames.contains(methodSignature)) {
injectionMembers.add(method);
+ injectionMemberNames.add(methodSignature);
nameList.add(getName(method));
typeList.add(box(parameterTypes[0]));
bingingIds.add(getBindings(method, 0));
@@ -278,8 +285,19 @@
}
injectionTypes = typeList.toArray(new Type[0]);
bindings = bingingIds.toArray(new Annotation[0]);
+ initialized = true;
}

+ public static String crudeMethodSignature(Method method) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(method.getReturnType().getName());
+ sb.append(method.getName());
+ for (Class<?> pType : method.getParameterTypes()) {
+ sb.append(pType.getName());
+ }
+ return sb.toString();
+ }
+
protected String getName(Method method) {
return null;
}

Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/TypedFieldInjector.java (5798 => 5799)

--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/TypedFieldInjector.java 2011-07-07 17:14:35 UTC (rev 5798)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/TypedFieldInjector.java 2011-10-25 08:43:36 UTC (rev 5799)
@@ -12,6 +12,8 @@
import org.picocontainer.ComponentMonitor;
import org.picocontainer.NameBinding;
import org.picocontainer.Parameter;
+import org.picocontainer.PicoCompositionException;
+import org.picocontainer.PicoContainer;
import org.picocontainer.annotations.Bind;

import java.lang.annotation.Annotation;
@@ -31,7 +33,7 @@
* injection points via a field type.
*/
@SuppressWarnings("serial")
-public class TypedFieldInjector extends IterativeInjector {
+public class TypedFieldInjector<T> extends IterativeInjector<T> {

private final List<String> classes;

Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java (5798 => 5799)

--- java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java 2011-07-07 17:14:35 UTC (rev 5798)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java 2011-10-25 08:43:36 UTC (rev 5799)
@@ -22,11 +22,13 @@
private PogoStick pogo;
}

-
public static class PogoStick {
}

- @Test public void testFieldInjectionByType() {
+ //public static class Hulahoop {
+ //}
+
+ @Test public void testFieldInjectionByTypeWhereMatch() {
MutablePicoContainer pico = new DefaultPicoContainer();
pico.addAdapter(new TypedFieldInjector(Helicopter.class, Helicopter.class, null,
new NullComponentMonitor(),
@@ -37,5 +39,15 @@
assertNotNull(chopper.pogo);
}

+// @Test public void testFieldInjectionByTypeWhereNoMatch() {
+// MutablePicoContainer pico = new DefaultPicoContainer();
+// pico.addAdapter(new TypedFieldInjector(Helicopter.class, Helicopter.class, null,
+// new NullComponentMonitor(),
+// Integer.class.getName() + " " + PogoStick.class.getName() + " " + Float.class.getName()));
+// pico.addComponent(Hulahoop.class, new Hulahoop());
+// Helicopter chopper = pico.getComponent(Helicopter.class);
+// assertNotNull(chopper);
+// assertNotNull(chopper.pogo);
+// }

}
\ No newline at end of file

----------

To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email