[picocontainer-scm] [5778] java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors: add back opening of public constructors

paul-yCVjj/[email protected] Mon, 11 Apr 2011 12:17:10 -0500 (CDT)
Newsgroups gmane.comp.java.picocontainer.cvs
Message-ID <[email protected]>
Revision 5778
Author paul
Date 2011-04-11 12:17:09 -0500 (Mon, 11 Apr 2011)

Log Message

add back opening of public constructors

Modified Paths

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

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

Added Paths

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

Diff

Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/ConstructorInjector.java (5777 => 5778)

--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/ConstructorInjector.java 2011-03-11 19:14:33 UTC (rev 5777)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/ConstructorInjector.java 2011-04-11 17:17:09 UTC (rev 5778)
@@ -55,6 +55,7 @@
private boolean rememberChosenConstructor = true;
private transient CtorAndAdapters<T> chosenConstructor;
private boolean enableEmjection = false;
+ private boolean allowNonPublicClasses = false;

/**
* Constructor injector that uses no monitor and no lifecycle adapter. This is a more
@@ -207,6 +208,12 @@
this.enableEmjection = enableEmjection;
}

+
+ public ConstructorInjector<T> withNonPublicConstructors() {
+ allowNonPublicClasses = true;
+ return this;
+ }
+
private static final class ResolverKey {
private final Type expectedType;
private final String pName;
@@ -360,7 +367,12 @@
Constructor<T>[] allConstructors = getConstructors();
// filter out all constructors that will definately not match
for (Constructor<T> constructor : allConstructors) {
- if ((parameters == null || constructor.getParameterTypes().length == parameters.length) && (constructor.getModifiers() & Modifier.PUBLIC) != 0) {
+ int modifiers = constructor.getModifiers();
+ if ((parameters == null || constructor.getParameterTypes().length == parameters.length)
+ && (allowNonPublicClasses || (modifiers & Modifier.PUBLIC) != 0)) {
+ if ((modifiers & Modifier.PUBLIC) == 0) {
+ constructor.setAccessible(true);
+ }
matchingConstructors.add(constructor);
}
}

Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/AdaptingInjectionTestCase.java (5777 => 5778)

--- java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/AdaptingInjectionTestCase.java 2011-03-11 19:14:33 UTC (rev 5777)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/AdaptingInjectionTestCase.java 2011-04-11 17:17:09 UTC (rev 5778)
@@ -124,6 +124,7 @@
" <useNames>false</useNames>\n" +
" <rememberChosenConstructor>true</rememberChosenConstructor>\n" +
" <enableEmjection>false</enableEmjection>\n" +
+ " <allowNonPublicClasses>false</allowNonPublicClasses>\n" +
"</Constructor-Injection>", foo);

Added: java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NonPublicConstructorsTestCase.java (0 => 5778)

--- java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NonPublicConstructorsTestCase.java (rev 0)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NonPublicConstructorsTestCase.java 2011-04-11 17:17:09 UTC (rev 5778)
@@ -0,0 +1,87 @@
+/*****************************************************************************
+ * 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.injectors;
+
+import org.junit.Test;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.DefaultPicoContainer;
+import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.Parameter;
+import org.picocontainer.injectors.ConstructorInjector;
+import org.picocontainer.monitors.NullComponentMonitor;
+
+import static junit.framework.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+public final class NonPublicConstructorsTestCase {
+
+ @Test
+ public void doFirstSampleWithNotPublicConstructor() {
+ MutablePicoContainer container = new DefaultPicoContainer();
+
+ ComponentAdapter<DummyNotPublicConstructor> dummyComponentAdapter =
+ new ConstructorInjector<DummyNotPublicConstructor>(
+ DummyNotPublicConstructor.class,
+ DummyNotPublicConstructor.class, null, new NullComponentMonitor(), false)
+ .withNonPublicConstructors();
+
+ container.addAdapter(dummyComponentAdapter);
+
+ DummyNotPublicConstructor dummy = container.getComponent(DummyNotPublicConstructor.class);
+ assertNotNull(dummy);
+ }
+
+ @Test
+ public void doSecondSampleWithNotPublicClass() {
+ MutablePicoContainer container = new DefaultPicoContainer();
+
+ ComponentAdapter<DummyNotPublicClass> dummyComponentAdapter =
+ new ConstructorInjector<DummyNotPublicClass>(
+ DummyNotPublicClass.class.getCanonicalName(),
+ DummyNotPublicClass.class, null, new NullComponentMonitor(), false)
+ .withNonPublicConstructors();
+
+ container.addAdapter(dummyComponentAdapter);
+
+ Object item = container.getComponent(DummyNotPublicClass.class);
+ assertNotNull(item);
+ }
+
+ @Test
+ public void doThirdSampleWithProtectedConstructor() {
+ MutablePicoContainer container = new DefaultPicoContainer();
+
+ ComponentAdapter<DummyProtectedConstructor> dummyComponentAdapter =
+ new ConstructorInjector<DummyProtectedConstructor>(
+ DummyProtectedConstructor.class,
+ DummyProtectedConstructor.class, null, new NullComponentMonitor(), false)
+ .withNonPublicConstructors();
+
+
+ container.addAdapter(dummyComponentAdapter);
+
+ DummyProtectedConstructor dummy = container.getComponent(DummyProtectedConstructor.class);
+ assertNotNull(dummy);
+
+ }
+
+ public static class DummyProtectedConstructor {
+ protected DummyProtectedConstructor() {
+ }
+ }
+
+ public static class DummyNotPublicConstructor {
+ DummyNotPublicConstructor() {
+ }
+ }
+
+ static class DummyNotPublicClass {
+ }
+
+}

----------

To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email