[picocontainer-scm] [5611] java/2.x/trunk/pico/distribution/src/site/content: builder can do implict composite injection too

paul-yCVjj/[email protected]
Newsgroups gmane.comp.java.picocontainer.cvs
Message-ID <[email protected]>
Revision 5611
Author paul
Date 2010-02-15 07:52:20 -0600 (Mon, 15 Feb 2010)

Log Message

builder can do implict composite injection too

Modified Paths

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

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

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

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

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

- java/2.x/trunk/pico/distribution/src/site/content/news.html

Diff

Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/PicoBuilder.java (5610 => 5611)

--- java/2.x/trunk/pico/container/src/java/org/picocontainer/PicoBuilder.java 2010-02-13 01:00:02 UTC (rev 5610)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/PicoBuilder.java 2010-02-15 13:52:20 UTC (rev 5611)
@@ -15,6 +15,7 @@
import org.picocontainer.behaviors.Synchronizing;
import org.picocontainer.containers.EmptyPicoContainer;
import org.picocontainer.containers.TransientPicoContainer;
+import org.picocontainer.injectors.CompositeInjection;
import org.picocontainer.injectors.MethodInjection;
import org.picocontainer.lifecycle.JavaEE5LifecycleStrategy;
import org.picocontainer.lifecycle.NullLifecycleStrategy;
@@ -56,14 +57,18 @@
private List<Object> containerComps = new ArrayList<Object>();
private boolean addChildToParent;
private LifecycleStrategy lifecycleStrategy;
- private final Stack<Object> componentFactories = new Stack<Object>();
- private InjectionFactory injectionType;
+ private final Stack<Object> behaviors = new Stack<Object>();
+ private final List<InjectionFactory> injectors = new ArrayList<InjectionFactory>();
private Class<? extends ComponentMonitor> componentMonitorClass = NullComponentMonitor.class;
private Class<? extends LifecycleStrategy> lifecycleStrategyClass = NullLifecycleStrategy.class;

public PicoBuilder(PicoContainer parentContainer, InjectionFactory injectionType) {
- this.injectionType = injectionType;
+ this(parentContainer);
+ injectors.add(injectionType);
+ }
+
+ public PicoBuilder(PicoContainer parentContainer) {
if (parentContainer != null) {
this.parentContainer = parentContainer;
} else {
@@ -71,16 +76,12 @@
}
}

- public PicoBuilder(PicoContainer parentContainer) {
- this(parentContainer, adaptiveDI());
- }
-
public PicoBuilder(InjectionFactory injectionType) {
this(new EmptyPicoContainer(), injectionType);
}

public PicoBuilder() {
- this(new EmptyPicoContainer(), adaptiveDI());
+ this(new EmptyPicoContainer());
}

public PicoBuilder withLifecycle() {
@@ -139,12 +140,19 @@

addContainerComponents(tempContainer);

- ComponentFactory lastCaf = injectionType;
- while (!componentFactories.empty()) {
- lastCaf = buildComponentFactory(tempContainer, lastCaf);
+ ComponentFactory componentFactory;
+ if (injectors.size() == 1) {
+ componentFactory = injectors.get(0);
+ } else if (injectors.size() == 0) {
+ componentFactory = adaptiveDI();
+ } else {
+ componentFactory = new CompositeInjection(injectors.toArray(new InjectionFactory[injectors.size()]));
}
+ while (!behaviors.empty()) {
+ componentFactory = buildComponentFactory(tempContainer, componentFactory);
+ }

- tempContainer.addComponent(ComponentFactory.class, lastCaf);
+ tempContainer.addComponent(ComponentFactory.class, componentFactory);

buildComponentMonitor(tempContainer);

@@ -187,7 +195,7 @@
}

private ComponentFactory buildComponentFactory(DefaultPicoContainer container, final ComponentFactory lastCaf) {
- Object componentFactory = componentFactories.pop();
+ Object componentFactory = behaviors.pop();
DefaultPicoContainer tmpContainer = new TransientPicoContainer(container);
tmpContainer.addComponent("componentFactory", componentFactory);
if (lastCaf != null) {
@@ -201,44 +209,44 @@
}

public PicoBuilder withHiddenImplementations() {
- componentFactories.push(implementationHiding());
+ behaviors.push(implementationHiding());
return this;
}

public PicoBuilder withSetterInjection() {
- injectionType = SDI();
+ injectors.add(SDI());
return this;
}

public PicoBuilder withAnnotatedMethodInjection() {
- injectionType = annotatedMethodDI();
+ injectors.add(annotatedMethodDI());
return this;
}

public PicoBuilder withAnnotatedFieldInjection() {
- injectionType = annotatedFieldDI();
+ injectors.add(annotatedFieldDI());
return this;
}

public PicoBuilder withConstructorInjection() {
- injectionType = CDI();
+ injectors.add(CDI());
return this;
}

public PicoBuilder withNamedMethodInjection() {
- injectionType = namedMethod();
+ injectors.add(namedMethod());
return this;
}

public PicoBuilder withNamedFieldInjection() {
- injectionType = namedField();
+ injectors.add(namedField());
return this;
}

public PicoBuilder withCaching() {
- componentFactories.push(caching());
+ behaviors.push(caching());
return this;
}

@@ -246,23 +254,23 @@
if (componentFactory == null) {
throw new NullPointerException("CAF cannot be null");
}
- componentFactories.push(componentFactory);
+ behaviors.push(componentFactory);
return this;
}

public PicoBuilder withSynchronizing() {
- componentFactories.push(Synchronizing.class);
+ behaviors.push(new Synchronizing());
return this;
}

public PicoBuilder withLocking() {
- componentFactories.push(Locking.class);
+ behaviors.push(new Locking());
return this;
}

public PicoBuilder withBehaviors(BehaviorFactory... factories) {
- for (ComponentFactory componentFactory : factories) {
- componentFactories.push(componentFactory);
+ for (BehaviorFactory componentFactory : factories) {
+ behaviors.push(componentFactory);
}
return this;
}
@@ -279,7 +287,7 @@
}

public PicoBuilder withComponentFactory(Class<? extends ComponentFactory> componentFactoryClass) {
- componentFactories.push(componentFactoryClass);
+ behaviors.push(componentFactoryClass);
return this;
}

@@ -289,17 +297,17 @@
}

public PicoBuilder withPropertyApplier() {
- componentFactories.push(PropertyApplying.class);
+ behaviors.push(new PropertyApplying());
return this;
}

public PicoBuilder withAutomatic() {
- componentFactories.push(Automating.class);
+ behaviors.push(new Automating());
return this;
}

public PicoBuilder withMethodInjection() {
- componentFactories.push(new MethodInjection());
+ injectors.add(new MethodInjection());
return this;
}

Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/Injector.java (5610 => 5611)

--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/Injector.java 2010-02-13 01:00:02 UTC (rev 5610)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/Injector.java 2010-02-15 13:52:20 UTC (rev 5611)
@@ -189,7 +189,7 @@
* @param componentImplementation
* @param parameters
* @param monitor
- * @param setterMethodPrefix
+ * @param prefix
* @param useNames
* @return setter injector instance.
* @throws AbstractInjector.NotConcreteRegistrationException
@@ -199,8 +199,8 @@
final Class componentImplementation,
Parameter[] parameters,
ComponentMonitor monitor,
- String setterMethodPrefix, boolean useNames) throws AbstractInjector.NotConcreteRegistrationException {
- return monitor.newInjector(new SetterInjector(componentKey, componentImplementation, parameters, monitor, setterMethodPrefix, useNames));
+ String prefix, boolean useNames) throws AbstractInjector.NotConcreteRegistrationException {
+ return monitor.newInjector(new SetterInjector(componentKey, componentImplementation, parameters, monitor, prefix, useNames));
}

/**

Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjection.java (5610 => 5611)

--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjection.java 2010-02-13 01:00:02 UTC (rev 5610)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjection.java 2010-02-15 13:52:20 UTC (rev 5611)
@@ -13,8 +13,8 @@
private final String prefix;
private final boolean optional;

- public NamedMethodInjection(String setterMethodPrefix) {
- this(setterMethodPrefix, true);
+ public NamedMethodInjection(String prefix) {
+ this(prefix, true);
}

public NamedMethodInjection() {
@@ -25,8 +25,8 @@
this("set", optional);
}

- public NamedMethodInjection(String setterMethodPrefix, boolean optional) {
- this.prefix = setterMethodPrefix;
+ public NamedMethodInjection(String prefix, boolean optional) {
+ this.prefix = prefix;
this.optional = optional;
}

Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/SetterInjection.java (5610 => 5611)

--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/SetterInjection.java 2010-02-13 01:00:02 UTC (rev 5610)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/SetterInjection.java 2010-02-15 13:52:20 UTC (rev 5611)
@@ -10,12 +10,17 @@

package org.picocontainer.injectors;

+import org.picocontainer.Characteristics;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.ComponentMonitor;
+import org.picocontainer.LifecycleStrategy;
+import org.picocontainer.Parameter;
+import org.picocontainer.PicoCompositionException;
+import org.picocontainer.behaviors.AbstractBehaviorFactory;
+
import java.util.Properties;

-import org.picocontainer.*;
-import org.picocontainer.behaviors.AbstractBehaviorFactory;

-
/**
* A {@link org.picocontainer.InjectionFactory} for JavaBeans.
* The factory creates {@link SetterInjector}.
@@ -25,10 +30,10 @@
@SuppressWarnings("serial")
public class SetterInjection extends AbstractInjectionFactory {

- private final String setterMethodPrefix;
+ private final String prefix;

- public SetterInjection(String setterMethodPrefix) {
- this.setterMethodPrefix = setterMethodPrefix;
+ public SetterInjection(String prefix) {
+ this.prefix = prefix;
}

public SetterInjection() {
@@ -54,7 +59,7 @@
public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor monitor, LifecycleStrategy lifecycleStrategy, Properties componentProperties, Object componentKey, Class<T> componentImplementation, Parameter... parameters)
throws PicoCompositionException {
boolean useNames = AbstractBehaviorFactory.arePropertiesPresent(componentProperties, Characteristics.USE_NAMES, true);
- return wrapLifeCycle(monitor.newInjector(new SetterInjector(componentKey, componentImplementation, parameters, monitor, setterMethodPrefix, useNames)), lifecycleStrategy);
+ return wrapLifeCycle(monitor.newInjector(new SetterInjector(componentKey, componentImplementation, parameters, monitor, prefix, useNames)), lifecycleStrategy);
}

}

Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/PicoBuilderTestCase.java (5610 => 5611)

--- java/2.x/trunk/pico/container/src/test/org/picocontainer/PicoBuilderTestCase.java 2010-02-13 01:00:02 UTC (rev 5610)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/PicoBuilderTestCase.java 2010-02-15 13:52:20 UTC (rev 5611)
@@ -21,6 +21,7 @@
import org.picocontainer.injectors.AdaptingInjection;
import org.picocontainer.injectors.AnnotatedFieldInjection;
import org.picocontainer.injectors.AnnotatedMethodInjection;
+import org.picocontainer.injectors.CompositeInjection;
import org.picocontainer.injectors.ConstructorInjection;
import org.picocontainer.injectors.NamedFieldInjection;
import org.picocontainer.injectors.NamedMethodInjection;
@@ -223,13 +224,21 @@
}
}

- @Test public void testWithSetterDI() {
+ @Test public void testWithSetterInjection() {
MutablePicoContainer actual = new PicoBuilder().withSetterInjection().build();
MutablePicoContainer expected = new DefaultPicoContainer(new SetterInjection(),
new NullLifecycleStrategy(), new EmptyPicoContainer(), new NullComponentMonitor());
assertEquals(xs.toXML(expected), xs.toXML(actual));
}

+ @Test public void testWithConstructorAndSetterInjectionMakesHiddenCompositeInjection() {
+ MutablePicoContainer actual = new PicoBuilder().withConstructorInjection().withSetterInjection().build();
+ MutablePicoContainer expected = new DefaultPicoContainer(
+ new CompositeInjection(new ConstructorInjection(), new SetterInjection()),
+ new NullLifecycleStrategy(), new EmptyPicoContainer(), new NullComponentMonitor());
+ assertEquals(xs.toXML(expected), xs.toXML(actual));
+ }
+
@Test public void testWithAnnotatedMethodDI() {
MutablePicoContainer actual = new PicoBuilder().withAnnotatedMethodInjection().build();
MutablePicoContainer expected = new DefaultPicoContainer(new AnnotatedMethodInjection(),

Modified: java/2.x/trunk/pico/distribution/src/site/content/news.html (5610 => 5611)

--- java/2.x/trunk/pico/distribution/src/site/content/news.html 2010-02-13 01:00:02 UTC (rev 5610)
+++ java/2.x/trunk/pico/distribution/src/site/content/news.html 2010-02-15 13:52:20 UTC (rev 5611)
@@ -6,7 +6,7 @@
</head>
<body>

- <p><strong>Feb 14, 2010 - PicoContainer 2.10 released (311K jar)</strong></p>
+ <p><strong>Feb 14, 2010 - PicoContainer 2.10 released (307K jar)</strong></p>

<p>New (since 2.9):</p>
<ul>

----------

To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email
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.