[picocontainer-scm] [5574] java/2.x/trunk/pico/container/src/test/org/picocontainer: move converting logic from static/final to instance based and overridable/inheritable
paul-yCVjj/[email protected]
| Newsgroups | gmane.comp.java.picocontainer.cvs |
|---|---|
| Message-ID | <[email protected]> |
Revision 5574
Author paul
Date 2010-01-28 06:04:59 -0600 (Thu, 28 Jan 2010)
Log Message
move converting logic from static/final to instance based and overridable/inheritable
Modified Paths
- java/2.x/trunk/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/PicoContainer.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/AbstractDelegatingPicoContainer.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/CompositePicoContainer.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/EmptyPicoContainer.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/ImmutablePicoContainer.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/parameters/BasicComponentParameter.java
- java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/containers/CommonsLoggingTracingContainerDecorator.java
- java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/containers/Log4jTracingContainerDecorator.java
Added Paths
- java/2.x/trunk/pico/container/src/java/org/picocontainer/Converting.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/BooleanConverter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/BuiltInConverter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/ByteConverter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/CharacterConverter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/DoubleConverter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/FileConverter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/FloatConverter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/IntegerConverter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/LongConverter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/NewInstanceConverter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/ShortConverter.java
- java/2.x/trunk/pico/container/src/test/org/picocontainer/converters/
- java/2.x/trunk/pico/container/src/test/org/picocontainer/converters/BuiltInConverterTestCase.java
- java/2.x/trunk/pico/container/src/test/org/picocontainer/converters/ConverterTestCase.java
Diff
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/Converting.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/Converting.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/Converting.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,14 @@
+package org.picocontainer;
+
+import java.lang.reflect.Type;
+
+public interface Converting {
+
+ Converter getConverter();
+
+ public static interface Converter {
+ boolean canConvert(Type type);
+ Object convert(String paramValue, Type type);
+ }
+
+}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java (5573 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java 2010-01-25 19:15:33 UTC (rev 5573)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -24,6 +24,7 @@
import java.util.Properties;
import java.util.Set;
+import org.picocontainer.converters.BuiltInConverter;
import org.picocontainer.adapters.InstanceAdapter;
import org.picocontainer.adapters.AbstractAdapter;
import org.picocontainer.behaviors.AbstractBehaviorFactory;
@@ -38,7 +39,6 @@
import org.picocontainer.injectors.AbstractInjector;
import org.picocontainer.injectors.AdaptingInjection;
import org.picocontainer.injectors.FactoryInjector;
-import org.picocontainer.injectors.InjectInto;
import org.picocontainer.lifecycle.DefaultLifecycleState;
import org.picocontainer.lifecycle.LifecycleState;
import org.picocontainer.lifecycle.StartableLifecycleStrategy;
@@ -76,7 +76,7 @@
* @author Mauro Talevi
*/
@SuppressWarnings("serial")
-public class DefaultPicoContainer implements MutablePicoContainer, ComponentMonitorStrategy, Serializable {
+public class DefaultPicoContainer implements MutablePicoContainer, Converting, ComponentMonitorStrategy, Serializable {
private String name;
@@ -133,6 +133,7 @@
private transient IntoThreadLocal intoThreadLocal = new IntoThreadLocal();
+ private Converting.Converter converter;
/**
@@ -1076,6 +1077,16 @@
return String.format("%s:%d<%s", (name != null ? name : super.toString()), this.componentAdapters.size(), (parent != null ? parent.toString() : "|"));
}
+ public synchronized Converting.Converter getConverter() {
+ if (converter == null) {
+ if (parent == null || (parent instanceof Converting && ((Converting) parent).getConverter() instanceof EmptyPicoContainer.NullConverter)) {
+ converter = new BuiltInConverter();
+ } else {
+ return ((Converting) parent).getConverter();
+ }
+ }
+ return converter;
+ }
private class AsPropertiesPicoContainer extends AbstractDelegatingMutablePicoContainer {
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/PicoContainer.java (5573 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/PicoContainer.java 2010-01-25 19:15:33 UTC (rev 5573)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/PicoContainer.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -14,7 +14,6 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
-
/**
* This is the core interface for PicoContainer. It is used to retrieve component instances from the container; it only
* has accessor methods (in addition to the {@link #accept(PicoVisitor)} method). In order to register components in a
@@ -42,12 +41,17 @@
/**
* Retrieve a component keyed by the component type.
- * @param <T> the type of the component.
* @param componentType the type of the component
* @return the typed resulting object instance or null if the object does not exist.
*/
<T> T getComponent(Class<T> componentType);
+ /**
+ * Retrieve a component keyed by the component type and binding type.
+ * @param componentType the type of the component
+ * @param binding the binding type of the component
+ * @return the typed resulting object instance or null if the object does not exist.
+ */
<T> T getComponent(Class<T> componentType, Class<? extends Annotation> binding);
/**
@@ -77,17 +81,25 @@
ComponentAdapter<?> getComponentAdapter(Object componentKey);
/**
- * Find a component adapter associated with the specified type. If a component adapter cannot be found in this
+ * Find a component adapter associated with the specified type and binding name. If a component adapter cannot be found in this
* container, the parent container (if one exists) will be searched.
*
* @param componentType the type of the component.
* @return the component adapter associated with this class, or <code>null</code> if no component has been
* registered for the specified key.
- * @param componentNameBinding
+ * @param componentNameBinding the name binding to use
*/
-
<T> ComponentAdapter<T> getComponentAdapter(Class<T> componentType, NameBinding componentNameBinding);
+ /**
+ * Find a component adapter associated with the specified type and binding type. If a component adapter cannot be found in this
+ * container, the parent container (if one exists) will be searched.
+ *
+ * @param componentType the type of the component.
+ * @return the component adapter associated with this class, or <code>null</code> if no component has been
+ * registered for the specified key.
+ * @param binding the typed binding to use
+ */
<T> ComponentAdapter<T> getComponentAdapter(Class<T> componentType, Class<? extends Annotation> binding);
/**
@@ -111,6 +123,15 @@
*/
<T> List<ComponentAdapter<T>> getComponentAdapters(Class<T> componentType);
+ /**
+ * Retrieve all component adapters inside this container that are associated with the specified type and binding type. The addComponent
+ * adapters from the parent container are not returned.
+ *
+ * @param componentType the type of the components.
+ * @param binding the typed binding to use
+ * @return a collection containing all the {@link ComponentAdapter}s inside this container that are associated with
+ * the specified type. Changes to this collection will not be reflected in the container itself.
+ */
<T> List<ComponentAdapter<T>> getComponentAdapters(Class<T> componentType, Class<? extends Annotation> binding);
/**
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java (5573 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java 2010-01-25 19:15:33 UTC (rev 5573)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/classname/DefaultClassLoadingPicoContainer.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -7,21 +7,8 @@
******************************************************************************/
package org.picocontainer.classname;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.ComponentFactory;
-import org.picocontainer.ComponentMonitor;
-import org.picocontainer.ComponentMonitorStrategy;
-import org.picocontainer.LifecycleStrategy;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.Parameter;
-import org.picocontainer.PicoClassNotFoundException;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoException;
+import org.picocontainer.*;
import org.picocontainer.security.CustomPermissionsURLClassLoader;
-import org.picocontainer.DefaultPicoContainer;
-import org.picocontainer.PicoCompositionException;
-import org.picocontainer.NameBinding;
-import org.picocontainer.PicoVisitor;
import org.picocontainer.lifecycle.LifecycleState;
import org.picocontainer.classname.ClassPathElement;
import org.picocontainer.classname.ClassLoadingPicoContainer;
@@ -54,7 +41,7 @@
ClassLoadingPicoContainer, ComponentMonitorStrategy {
/**
- * Conversion Map to allow for primitives to be boxed to Object types.
+ * Converting Map to allow for primitives to be boxed to Object types.
*/
private static final transient Map<String, String> primitiveNameToBoxedName = new HashMap<String, String>();
@@ -526,6 +513,10 @@
public void setLifecycleState(LifecycleState lifecycleState) {
DefaultClassLoadingPicoContainer.this.setLifecycleState(lifecycleState);
}
+
+ public Converting.Converter getConverter() {
+ return DefaultClassLoadingPicoContainer.this.getConverter();
+ }
}
}
\ No newline at end of file
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/AbstractDelegatingPicoContainer.java (5573 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/AbstractDelegatingPicoContainer.java 2010-01-25 19:15:33 UTC (rev 5573)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/AbstractDelegatingPicoContainer.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -6,11 +6,7 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.NameBinding;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoException;
-import org.picocontainer.PicoVisitor;
+import org.picocontainer.*;
/**
* abstract base class for immutable delegation to pico
@@ -18,7 +14,7 @@
* @author k.pribluda
*
*/
-public abstract class AbstractDelegatingPicoContainer implements PicoContainer, Serializable{
+public abstract class AbstractDelegatingPicoContainer implements PicoContainer, Converting, Serializable{
private PicoContainer delegate;
@@ -104,4 +100,12 @@
public String toString() {
return "D<" + delegate.toString();
}
+
+ public Converter getConverter() {
+ if (delegate instanceof Converting) {
+ return ((Converting) delegate).getConverter();
+ } else {
+ return null;
+ }
+ }
}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/CompositePicoContainer.java (5573 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/CompositePicoContainer.java 2010-01-25 19:15:33 UTC (rev 5573)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/CompositePicoContainer.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -9,11 +9,7 @@
*****************************************************************************/
package org.picocontainer.containers;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.DefaultPicoContainer;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.NameBinding;
-import org.picocontainer.PicoVisitor;
+import org.picocontainer.*;
import java.lang.reflect.Type;
import java.lang.annotation.Annotation;
@@ -27,10 +23,34 @@
* in turn for getComponent(*) and getComponentAdapter(*) requests. Methods returning
* lists and getParent/accept will not function.
*/
-public class CompositePicoContainer implements PicoContainer, Serializable {
+public class CompositePicoContainer implements PicoContainer, Converting, Serializable {
private final PicoContainer[] containers;
+ private CompositeConverter compositeConverter = new CompositeConverter();
+ public class CompositeConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ for (PicoContainer container : containers) {
+ if (container instanceof Converting && ((Converting) container).getConverter().canConvert(type)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ for (PicoContainer container : containers) {
+ if (container instanceof Converting) {
+ Converting.Converter converter = ((Converting) container).getConverter();
+ if (converter.canConvert(type)) {
+ return converter.convert(paramValue, type);
+ }
+ }
+ }
+ return null;
+ }
+ }
+
public CompositePicoContainer(PicoContainer... containers) {
this.containers = containers;
}
@@ -125,4 +145,8 @@
public void accept(PicoVisitor visitor) {
}
+
+ public Converting.Converter getConverter() {
+ return compositeConverter;
+ }
}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/EmptyPicoContainer.java (5573 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/EmptyPicoContainer.java 2010-01-25 19:15:33 UTC (rev 5573)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/EmptyPicoContainer.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -9,10 +9,7 @@
*****************************************************************************/
package org.picocontainer.containers;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoVisitor;
-import org.picocontainer.NameBinding;
+import org.picocontainer.*;
import java.io.Serializable;
import java.util.Collection;
@@ -29,7 +26,7 @@
* @author Konstantin Pribluda
*/
@SuppressWarnings("serial")
-public class EmptyPicoContainer implements PicoContainer, Serializable {
+public class EmptyPicoContainer implements PicoContainer, Converting, Serializable {
public Object getComponent(Object componentKeyOrType) {
return null;
@@ -92,4 +89,18 @@
public String toString() {
return "(empty)";
}
+
+ public Converting.Converter getConverter() {
+ return new NullConverter();
+ }
+
+ public static class NullConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return false;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return null;
+ }
+ }
}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/ImmutablePicoContainer.java (5573 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/ImmutablePicoContainer.java 2010-01-25 19:15:33 UTC (rev 5573)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/containers/ImmutablePicoContainer.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -9,10 +9,7 @@
*****************************************************************************/
package org.picocontainer.containers;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.PicoVisitor;
-import org.picocontainer.NameBinding;
+import org.picocontainer.*;
import java.util.List;
import java.util.Collection;
@@ -27,7 +24,7 @@
* @author Konstantin Pribluda
*/
@SuppressWarnings("serial")
-public final class ImmutablePicoContainer implements PicoContainer, Serializable {
+public final class ImmutablePicoContainer implements PicoContainer, Converting, Serializable {
private final PicoContainer delegate;
@@ -109,4 +106,11 @@
public String toString() {
return "I<" + delegate.toString();
}
+
+ public Converting.Converter getConverter() {
+ if (delegate instanceof Converting) {
+ return ((Converting) delegate).getConverter();
+ }
+ return new EmptyPicoContainer.NullConverter();
+ }
}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/BooleanConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/BooleanConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/BooleanConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,15 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.lang.reflect.Type;
+
+class BooleanConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return Boolean.class == type;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return Boolean.valueOf(paramValue);
+ }
+}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/BuiltInConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/BuiltInConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/BuiltInConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,47 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.io.File;
+import java.io.Serializable;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Map;
+
+public class BuiltInConverter implements Converting.Converter, Serializable {
+
+ private final Map<Class, Converting.Converter> stringConverters = new HashMap<Class, Converting.Converter>();
+
+ public BuiltInConverter() {
+ addBuiltInConverters();
+ }
+
+ protected void addBuiltInConverters() {
+ addConverter(Integer.class, new IntegerConverter());
+ addConverter(Double.class, new DoubleConverter());
+ addConverter(Boolean.class, new BooleanConverter());
+ addConverter(Long.class, new LongConverter());
+ addConverter(Float.class, new FloatConverter());
+ addConverter(Character.class, new CharacterConverter());
+ addConverter(Byte.class, new ByteConverter());
+ addConverter(Short.class, new ShortConverter());
+ addConverter(File.class, new FileConverter());
+ }
+
+ protected void addConverter(Class<?> key, Converting.Converter converter) {
+ stringConverters.put(key, converter);
+ }
+
+ public boolean canConvert(Type type) {
+ return stringConverters.containsKey(type);
+ }
+
+ public Object convert(String paramValue, Type type) {
+ Converting.Converter converter = stringConverters.get(type);
+ if (converter== null) {
+ return null;
+ }
+ return converter.convert(paramValue, type);
+ }
+
+}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/ByteConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/ByteConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/ByteConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,15 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.lang.reflect.Type;
+
+class ByteConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return Byte.class == type;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return Byte.valueOf(paramValue);
+ }
+}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/CharacterConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/CharacterConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/CharacterConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,15 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.lang.reflect.Type;
+
+class CharacterConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return Character.class == type;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return paramValue.charAt(0);
+ }
+}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/DoubleConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/DoubleConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/DoubleConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,15 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.lang.reflect.Type;
+
+class DoubleConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return Double.class == type;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return Double.valueOf(paramValue);
+ }
+}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/FileConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/FileConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/FileConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,16 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.io.File;
+import java.lang.reflect.Type;
+
+class FileConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return File.class == type;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return new File(paramValue);
+ }
+}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/FloatConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/FloatConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/FloatConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,15 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.lang.reflect.Type;
+
+class FloatConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return Float.class == type;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return Float.valueOf(paramValue);
+ }
+}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/IntegerConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/IntegerConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/IntegerConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,15 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.lang.reflect.Type;
+
+class IntegerConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return Integer.class == type;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return Integer.valueOf(paramValue);
+ }
+}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/LongConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/LongConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/LongConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,15 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.lang.reflect.Type;
+
+class LongConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return Long.class == type;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return Long.valueOf(paramValue);
+ }
+}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/NewInstanceConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/NewInstanceConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/NewInstanceConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,31 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Type;
+
+public class NewInstanceConverter implements Converting.Converter {
+ private Constructor c;
+
+ public NewInstanceConverter(Class clazz) {
+ try {
+ c = clazz.getConstructor(String.class);
+ } catch (NoSuchMethodException e) {
+ }
+ }
+ public boolean canConvert(Type type) {
+ return false;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ try {
+ return c.newInstance(paramValue);
+ } catch (IllegalAccessException e) {
+ } catch (InvocationTargetException e) {
+ } catch (InstantiationException e) {
+ }
+ return null;
+ }
+}
Added: java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/ShortConverter.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/ShortConverter.java (rev 0)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/converters/ShortConverter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,15 @@
+package org.picocontainer.converters;
+
+import org.picocontainer.Converting;
+
+import java.lang.reflect.Type;
+
+class ShortConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return Short.class == type;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return Short.valueOf(paramValue);
+ }
+}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/parameters/BasicComponentParameter.java (5573 => 5574)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/parameters/BasicComponentParameter.java 2010-01-25 19:15:33 UTC (rev 5573)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/parameters/BasicComponentParameter.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -9,25 +9,15 @@
*****************************************************************************/
package org.picocontainer.parameters;
-import java.io.File;
import java.io.Serializable;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.annotation.Annotation;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Map;
import java.util.Set;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.Parameter;
-import org.picocontainer.NameBinding;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoVisitor;
-import org.picocontainer.DefaultPicoContainer;
+import org.picocontainer.*;
import org.picocontainer.injectors.AbstractInjector;
import org.picocontainer.injectors.InjectInto;
@@ -47,88 +37,11 @@
@SuppressWarnings("serial")
public class BasicComponentParameter extends AbstractParameter implements Parameter, Serializable {
- private static interface Converter {
- Object convert(String paramValue);
- }
-
- private static class NewInstanceConverter implements Converter {
- private Constructor c;
-
- private NewInstanceConverter(Class clazz) {
- try {
- c = clazz.getConstructor(String.class);
- } catch (NoSuchMethodException e) {
- }
- }
-
- public Object convert(String paramValue) {
- try {
- return c.newInstance(paramValue);
- } catch (IllegalAccessException e) {
- } catch (InvocationTargetException e) {
- } catch (InstantiationException e) {
- }
- return null;
- }
- }
-
/** <code>BASIC_DEFAULT</code> is an instance of BasicComponentParameter using the default constructor. */
public static final BasicComponentParameter BASIC_DEFAULT = new BasicComponentParameter();
private Object componentKey;
-
- private static final Map<Class, Converter> stringConverters = new HashMap<Class, Converter>();
- static {
- stringConverters.put(Integer.class, new Converter(){
- public Object convert(String paramValue) {
- return Integer.valueOf(paramValue);
- }
- });
- stringConverters.put(Double.class, new Converter() {
- public Object convert(String paramValue) {
- return Double.valueOf(paramValue);
- }
- });
- stringConverters.put(Boolean.class, new Converter(){
- public Object convert(String paramValue) {
- return Boolean.valueOf(paramValue);
- }
- });
- stringConverters.put(Long.class, new Converter() {
- public Object convert(String paramValue) {
- return Long.valueOf(paramValue);
- }
- });
- stringConverters.put(Float.class, new Converter() {
- public Object convert(String paramValue) {
- return Float.valueOf(paramValue);
- }
- });
- stringConverters.put(Character.class, new Converter() {
- public Object convert(String paramValue) {
- return paramValue.charAt(0);
- }
- });
- stringConverters.put(Byte.class, new Converter() {
- public Object convert(String paramValue) {
- return Byte.valueOf(paramValue);
- }
- });
- stringConverters.put(Short.class, new Converter() {
- public Object convert(String paramValue) {
- return Short.valueOf(paramValue);
- }
- });
- stringConverters.put(File.class, new Converter() {
- public Object convert(String paramValue) {
- return new File(paramValue);
- }
- });
-
- }
-
-
/**
* Expect a parameter matching a component of a specific key.
*
@@ -185,11 +98,11 @@
return null;
}
if (componentAdapter instanceof DefaultPicoContainer.LateInstance) {
- return convert(((DefaultPicoContainer.LateInstance) componentAdapter).getComponentInstance(), expectedType);
+ return convert(getConverter(container), ((DefaultPicoContainer.LateInstance) componentAdapter).getComponentInstance(), expectedType);
// } else if (injecteeAdapter != null && injecteeAdapter instanceof DefaultPicoContainer.KnowsContainerAdapter) {
// return convert(((DefaultPicoContainer.KnowsContainerAdapter) injecteeAdapter).getComponentInstance(makeInjectInto(forAdapter)), expectedType);
} else {
- return convert(container.getComponent(componentAdapter.getComponentKey(), makeInjectInto(forAdapter)), expectedType);
+ return convert(getConverter(container), container.getComponent(componentAdapter.getComponentKey(), makeInjectInto(forAdapter)), expectedType);
}
}
@@ -199,16 +112,19 @@
};
}
+ private Converting.Converter getConverter(PicoContainer container) {
+ return container instanceof Converting ? ((Converting) container).getConverter() : null;
+ }
+
private static InjectInto makeInjectInto(ComponentAdapter<?> forAdapter) {
return new InjectInto(forAdapter.getComponentImplementation(), forAdapter.getComponentKey());
}
- private static Object convert(Object o, Type expectedType) {
- if (o instanceof String && expectedType != String.class) {
- Converter converter = stringConverters.get(expectedType);
- o = converter.convert((String) o);
+ private static Object convert(Converting.Converter converter, Object obj, Type expectedType) {
+ if (obj instanceof String && expectedType != String.class) {
+ obj = converter.convert((String) obj, expectedType);
}
- return o;
+ return obj;
}
public void verify(PicoContainer container,
@@ -275,7 +191,7 @@
if (result == null && useNames) {
ComponentAdapter found = container.getComponentAdapter(expectedNameBinding.getName());
- if ((found != null) && areCompatible(expectedType, found) && found != adapter) {
+ if ((found != null) && areCompatible(container, expectedType, found) && found != adapter) {
result = found;
}
}
@@ -299,7 +215,8 @@
}
if (!type.isAssignableFrom(result.getComponentImplementation())) {
- if (!(result.getComponentImplementation() == String.class && stringConverters.containsKey(type))) {
+// if (!(result.getComponentImplementation() == String.class && stringConverters.containsKey(type))) {
+ if (!(result.getComponentImplementation() == String.class && getConverter(container).canConvert(type))) {
return null;
}
}
@@ -344,9 +261,11 @@
found.remove(exclude);
}
- private <T> boolean areCompatible(Class<T> expectedType, ComponentAdapter found) {
+ private <T> boolean areCompatible(PicoContainer container, Class<T> expectedType, ComponentAdapter found) {
Class foundImpl = found.getComponentImplementation();
return expectedType.isAssignableFrom(foundImpl) ||
- (foundImpl == String.class && stringConverters.containsKey(expectedType)) ;
+ //(foundImpl == String.class && stringConverters.containsKey(expectedType)) ;
+ (foundImpl == String.class && getConverter(container) != null
+ && getConverter(container).canConvert(expectedType)) ;
}
}
Added: java/2.x/trunk/pico/container/src/test/org/picocontainer/converters/BuiltInConverterTestCase.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/converters/BuiltInConverterTestCase.java (rev 0)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/converters/BuiltInConverterTestCase.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,77 @@
+package org.picocontainer.converters;
+
+import org.junit.Test;
+import org.picocontainer.Converting;
+
+import javax.swing.*;
+import java.io.File;
+import java.lang.reflect.Type;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+public class BuiltInConverterTestCase {
+
+ @Test
+ public void testBuiltInCanConvert() {
+ BuiltInConverter bic = new BuiltInConverter();
+ assertTrue(bic.canConvert(Integer.class));
+ assertTrue(bic.canConvert(Long.class));
+ assertTrue(bic.canConvert(Byte.class));
+ assertTrue(bic.canConvert(Double.class));
+ assertTrue(bic.canConvert(Float.class));
+ assertTrue(bic.canConvert(File.class));
+ assertTrue(bic.canConvert(Character.class));
+ assertTrue(bic.canConvert(Short.class));
+ assertTrue(bic.canConvert(Boolean.class));
+ assertFalse(bic.canConvert(JPanel.class));
+ }
+
+ @Test
+ public void testBuiltInConvert() {
+ BuiltInConverter bic = new BuiltInConverter();
+ assertEquals(12, bic.convert("12", Integer.class));
+ assertEquals(12345678901L, bic.convert("12345678901",Long.class));
+ assertEquals((byte)12, bic.convert("12", Byte.class));
+ assertEquals(2.22, bic.convert("2.22", Double.class));
+ assertEquals(1.11F, bic.convert("1.11", Float.class));
+ assertEquals(new File("c:\\foo"), bic.convert("c:\\foo", File.class));
+ assertEquals('a', bic.convert("a", Character.class));
+ assertEquals((short)12, bic.convert("12", Short.class));
+ assertEquals(Boolean.TRUE, bic.convert("TRUE", Boolean.class));
+ assertEquals(null, bic.convert("anything", JPanel.class));
+ }
+
+ @Test
+ public void canAddAConverter() {
+ BuiltInConverter bic = new BuiltInConverter();
+ bic.addConverter(JPanel.class, new JPanelConverter());
+ assertTrue(bic.convert("anything", JPanel.class) instanceof JPanel);
+
+ }
+
+ @Test
+ public void canSupplementConverters() {
+ BuiltInConverter bic = new BuiltInConverter() {
+ @Override
+ protected void addBuiltInConverters() {
+ super.addBuiltInConverters();
+ super.addConverter(JPanel.class, new JPanelConverter());
+ }
+ };
+ assertEquals(Boolean.TRUE, bic.convert("TRUE", Boolean.class));
+ assertTrue(bic.convert("anything", JPanel.class) instanceof JPanel);
+
+ }
+
+ private static class JPanelConverter implements Converting.Converter {
+ public boolean canConvert(Type type) {
+ return false;
+ }
+
+ public Object convert(String paramValue, Type type) {
+ return new JPanel();
+ }
+ }
+}
Added: java/2.x/trunk/pico/container/src/test/org/picocontainer/converters/ConverterTestCase.java (0 => 5574)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/converters/ConverterTestCase.java (rev 0)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/converters/ConverterTestCase.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -0,0 +1,81 @@
+package org.picocontainer.converters;
+
+import org.junit.Test;
+import org.picocontainer.Converting;
+import org.picocontainer.DefaultPicoContainer;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.containers.CompositePicoContainer;
+import org.picocontainer.containers.EmptyPicoContainer;
+
+import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+public class ConverterTestCase {
+
+ @Test
+ public void builtInConversionByDefault() {
+ DefaultPicoContainer dpc = new DefaultPicoContainer();
+ assertTrue(dpc.getConverter() instanceof BuiltInConverter);
+ }
+
+ @Test
+ public void canOverrideConverter() {
+ DefaultPicoContainer dpc = new DefaultPicoContainer() {
+ @Override
+ public Converting.Converter getConverter() {
+ return new MyConverter();
+ }
+ };
+ assertTrue(dpc.getConverter() instanceof MyConverter);
+ }
+
+ @Test
+ public void parentContainerSuppliesByDefault() {
+ PicoContainer parent = new DefaultPicoContainer() {
+ @Override
+ public Converting.Converter getConverter() {
+ return new MyConverter();
+ }
+ };
+ DefaultPicoContainer dpc = new DefaultPicoContainer(parent);
+ assertTrue(dpc.getConverter() instanceof MyConverter);
+ }
+
+ @Test
+ public void parentContainerDoesNotSuppliesByDefaultIfItIsNotAConversion() {
+ PicoContainer parent = new EmptyPicoContainer();
+ DefaultPicoContainer dpc = new DefaultPicoContainer(parent);
+ assertTrue(dpc.getConverter() instanceof BuiltInConverter);
+ }
+
+ @Test
+ public void compositesPossible() {
+ PicoContainer one = new DefaultPicoContainer() {
+ @Override
+ public Converting.Converter getConverter() {
+ return new BooleanConverter();
+ }
+ };
+ PicoContainer two = new DefaultPicoContainer() {
+ @Override
+ public Converting.Converter getConverter() {
+ return new ShortConverter();
+ }
+ };
+ CompositePicoContainer compositePC = new CompositePicoContainer(one, two);
+ Converting.Converter converter = compositePC.getConverter();
+ assertFalse(converter.canConvert(Character.class));
+ assertTrue(converter.canConvert(Short.class));
+ assertTrue(converter.canConvert(Boolean.class));
+ assertEquals(null, converter.convert("a", Character.class));
+ assertEquals((short)12, converter.convert("12", Short.class));
+ assertEquals(Boolean.TRUE, converter.convert("TRUE", Boolean.class));
+
+ }
+
+
+ public static class MyConverter extends BooleanConverter {
+ }
+
+}
Modified: java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/containers/CommonsLoggingTracingContainerDecorator.java (5573 => 5574)
--- java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/containers/CommonsLoggingTracingContainerDecorator.java 2010-01-25 19:15:33 UTC (rev 5573)
+++ java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/containers/CommonsLoggingTracingContainerDecorator.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -9,12 +9,8 @@
*****************************************************************************/
package org.picocontainer.gems.containers;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.Parameter;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoVisitor;
-import org.picocontainer.NameBinding;
+import org.picocontainer.*;
+import org.picocontainer.containers.EmptyPicoContainer;
import org.picocontainer.lifecycle.LifecycleState;
import java.util.Collection;
@@ -32,7 +28,7 @@
*/
@Deprecated
@SuppressWarnings("serial")
-public class CommonsLoggingTracingContainerDecorator implements MutablePicoContainer, Serializable {
+public class CommonsLoggingTracingContainerDecorator implements MutablePicoContainer, Converting, Serializable {
/** Wrapped container. */
@@ -162,10 +158,8 @@
* {@inheritDoc}
*
* @param componentType
- *
* @return ComponentAdapter or null.
- *
- * @see org.picocontainer.PicoContainer#getComponentAdapter(java.lang.Class)
+ * @see org.picocontainer.PicoContainer#getComponentAdapter(java.lang.Class, NameBinding)
*/
public <T> ComponentAdapter<T> getComponentAdapter(final Class<T> componentType, final NameBinding componentNameBinding) {
@@ -534,5 +528,10 @@
delegate.setLifecycleState(lifecycleState);
}
-
+ public Converting.Converter getConverter() {
+ if (delegate instanceof Converting) {
+ return ((Converting) delegate).getConverter();
+ }
+ return new EmptyPicoContainer.NullConverter();
+ }
}
Modified: java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/containers/Log4jTracingContainerDecorator.java (5573 => 5574)
--- java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/containers/Log4jTracingContainerDecorator.java 2010-01-25 19:15:33 UTC (rev 5573)
+++ java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/containers/Log4jTracingContainerDecorator.java 2010-01-28 12:04:59 UTC (rev 5574)
@@ -10,12 +10,8 @@
package org.picocontainer.gems.containers;
-import org.picocontainer.ComponentAdapter;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.Parameter;
-import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoVisitor;
-import org.picocontainer.NameBinding;
+import org.picocontainer.*;
+import org.picocontainer.containers.EmptyPicoContainer;
import org.picocontainer.lifecycle.LifecycleState;
import java.io.ObjectInputStream;
@@ -64,7 +60,7 @@
*/
@Deprecated
@SuppressWarnings("serial")
-public class Log4jTracingContainerDecorator implements MutablePicoContainer, Serializable {
+public class Log4jTracingContainerDecorator implements MutablePicoContainer, Converting, Serializable {
/** Wrapped container. */
@@ -441,8 +437,7 @@
*/
public MutablePicoContainer addComponent(final Object componentKey,
final Object componentImplementationOrInstance,
- final Parameter... parameters)
- {
+ final Parameter... parameters) {
if (logger.isDebugEnabled()) {
logger.debug("Registering component "
@@ -594,4 +589,11 @@
public void setLifecycleState(LifecycleState lifecycleState) {
delegate.setLifecycleState(lifecycleState);
}
+
+ public Converting.Converter getConverter() {
+ if (delegate instanceof Converting) {
+ return ((Converting) delegate).getConverter();
+ }
+ return new EmptyPicoContainer.NullConverter();
+ }
}
----------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email