[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
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.