geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From gno...@apache.org
Subject svn commit: r789914 - in /geronimo/sandbox/blueprint/blueprint-core/src: main/java/org/apache/geronimo/blueprint/ main/java/org/apache/geronimo/blueprint/container/ main/java/org/apache/geronimo/blueprint/di/ main/java/org/apache/geronimo/blueprint/nam...
Date Tue, 30 Jun 2009 20:03:51 GMT
Author: gnodet
Date: Tue Jun 30 20:03:50 2009
New Revision: 789914

URL: http://svn.apache.org/viewvc?rev=789914&view=rev
Log:
Fix a few tck problems

Added:
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceListRecipe.java
      - copied, changed from r788924, geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RefListRecipe.java
Removed:
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RefListRecipe.java
Modified:
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/BlueprintConstants.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AggregateConverter.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BeanRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintExtender.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/GenericType.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/MapRecipe.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/TypeUtils.java
    geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java
    geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/container/AggregateConverterTest.java
    geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/container/GenericTypeTest.java
    geronimo/sandbox/blueprint/blueprint-core/src/test/resources/test-generics.xml

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/BlueprintConstants.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/BlueprintConstants.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/BlueprintConstants.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/BlueprintConstants.java Tue Jun 30 20:03:50 2009
@@ -24,7 +24,7 @@
     
     public static final String TIMEOUT_DIRECTIVE = "blueprint.timeout";
     
-    public static final String WAIT_FOR_DEPENDENCIES_DIRECTIVE = "blueprint.wait-for-dependencies";
+    public static final String GRACE_PERIOD = "blueprint.graceperiod";
     
     public static final String BUNDLE_VERSION = "bundle.version";
     

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AbstractServiceReferenceRecipe.java Tue Jun 30 20:03:50 2009
@@ -61,6 +61,8 @@
  * TODO: if we have a single interface (which is the standard behavior), then we should be able to get rid of
  *       the proxyClassloader and just use this interface classloader to define the proxy
  *
+ * TODO: it is allowed to have no interface defined at all, which should result in an empty proxy
+ *
  * @author <a href="mailto:dev@geronimo.apache.org">Apache Geronimo Project</a>
  * @version $Rev: 760378 $, $Date: 2009-03-31 11:31:38 +0200 (Tue, 31 Mar 2009) $
  */
@@ -78,6 +80,7 @@
     protected final String filter;
     /** The list of listeners for this reference.  This list will be lazy created */
     protected List<Listener> listeners;
+    protected boolean listenersCreated = true;
 
     private final List<ServiceReference> references = new ArrayList<ServiceReference>();
     private final AtomicBoolean started = new AtomicBoolean();
@@ -411,8 +414,10 @@
             for (Method method : objectPropMethods) {
                 if (props == null) {
                     props = new HashMap<String, Object>();
-                    for (String name : reference.getPropertyKeys()) {
-                        props.put(name, reference.getProperty(name));
+                    if (reference == null) {
+                        for (String name : reference.getPropertyKeys()) {
+                            props.put(name, reference.getProperty(name));
+                        }
                     }
                 }
                 try {

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AggregateConverter.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AggregateConverter.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AggregateConverter.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/AggregateConverter.java Tue Jun 30 20:03:50 2009
@@ -22,20 +22,25 @@
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Hashtable;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.regex.Pattern;
+import java.math.BigInteger;
+import java.math.BigDecimal;
 
 import org.apache.geronimo.blueprint.ExtendedBlueprintContainer;
 import org.apache.geronimo.blueprint.di.CollectionRecipe;
 import org.apache.geronimo.blueprint.di.MapRecipe;
 import static org.apache.geronimo.blueprint.utils.ReflectionUtils.getRealCause;
-import org.osgi.service.blueprint.container.BlueprintContainer;
 import org.osgi.service.blueprint.container.ReifiedType;
 import org.osgi.service.blueprint.container.Converter;
 
@@ -112,14 +117,18 @@
         }
         Object value = convertWithConverters(fromValue, type);
         if (value == null) {
-            if (fromValue instanceof String) {
+            if (fromValue instanceof Number && Number.class.isAssignableFrom(unwrap(toClass(type)))) {
+                return convertToNumber((Number) fromValue, toClass(type));
+            } else if (fromValue instanceof String) {
                 return convertFromString((String) fromValue, toClass(type), blueprintContainer);
-            } else if (toClass(type).isArray()) {
-                return convertArray(fromValue, type);
-            } else if (Map.class.isAssignableFrom(toClass(type))) {
-                return convertMap(fromValue, type);
-            } else if (Collection.class.isAssignableFrom(toClass(type))) {
-                return convertCollection(fromValue, type);
+            } else if (toClass(type).isArray() && (fromValue instanceof Collection || fromValue.getClass().isArray())) {
+                return convertToArray(fromValue, type);
+            } else if (Map.class.isAssignableFrom(toClass(type)) && (fromValue instanceof Map || fromValue instanceof Dictionary)) {
+                return convertToMap(fromValue, type);
+            } else if (Dictionary.class.isAssignableFrom(toClass(type)) && (fromValue instanceof Map || fromValue instanceof Dictionary)) {
+                return convertToDictionary(fromValue, type);
+            } else if (Collection.class.isAssignableFrom(toClass(type)) && (fromValue instanceof Collection || fromValue.getClass().isArray())) {
+                return convertToCollection(fromValue, type);
             } else {
                 throw new Exception("Unable to convert value " + fromValue + " to type " + type);
             }
@@ -140,7 +149,35 @@
         return value;
     }
 
+    public Object convertToNumber(Number value, Class toType) throws Exception {
+        toType = unwrap(toType);
+        if (AtomicInteger.class == toType) {
+            return new AtomicInteger((Integer) convertToNumber(value, Integer.class));
+        } else if (AtomicLong.class == toType) {
+            return new AtomicLong((Long) convertToNumber(value, Long.class));
+        } else if (Integer.class == toType) {
+            return value.intValue();
+        } else if (Short.class == toType) {
+            return value.shortValue();
+        } else if (Long.class == toType) {
+            return value.longValue();
+        } else if (Float.class == toType) {
+            return value.floatValue();
+        } else if (Double.class == toType) {
+            return value.doubleValue();
+        } else if (Byte.class == toType) {
+            return value.byteValue();
+        } else if (BigInteger.class == toType) {
+            return new BigInteger(value.toString());
+        } else if (BigDecimal.class == toType) {
+            return new BigDecimal(value.toString());
+        } else {
+            throw new Exception("Unable to convert number " + value + " to " + toType);
+        }
+    }
+
     public Object convertFromString(String value, Class toType, Object loader) throws Exception {
+        toType = unwrap(toType);
         if (ReifiedType.class == toType) {
             try {
                 return GenericType.parse(value, loader);
@@ -171,7 +208,7 @@
             ByteArrayInputStream in = new ByteArrayInputStream(value.getBytes("UTF8"));
             props.load(in);
             return props;
-        } else if (Boolean.class == toType || boolean.class == toType) {
+        } else if (Boolean.class == toType) {
             if ("yes".equalsIgnoreCase(value) || "true".equalsIgnoreCase(value) || "on".equalsIgnoreCase(value)) {
                 return Boolean.TRUE;
             } else if ("no".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value) || "off".equalsIgnoreCase(value)) {
@@ -179,17 +216,17 @@
             } else {
                 throw new RuntimeException("Invalid boolean value: " + value);
             }
-        } else if (Integer.class == toType || int.class == toType) {
+        } else if (Integer.class == toType) {
             return Integer.valueOf(value);
-        } else if (Short.class == toType || short.class == toType) {
+        } else if (Short.class == toType) {
             return Short.valueOf(value);
-        } else if (Long.class == toType || long.class == toType) {
+        } else if (Long.class == toType) {
             return Long.valueOf(value);
-        } else if (Float.class == toType || float.class == toType) {
+        } else if (Float.class == toType) {
             return Float.valueOf(value);
-        } else if (Double.class == toType || double.class == toType) {
+        } else if (Double.class == toType) {
             return Double.valueOf(value);
-        } else if (Character.class == toType || char.class == toType) {
+        } else if (Character.class == toType) {
             if (value.length() == 6 && value.startsWith("\\u")) {
                 int code = Integer.parseInt(value.substring(2), 16);
                 return (char)code;
@@ -198,7 +235,7 @@
             } else {
                 throw new Exception("Invalid value for character type: " + value);
             }
-        } else if (Byte.class == toType || byte.class == toType) {
+        } else if (Byte.class == toType) {
             return Byte.valueOf(value);
         } else if (Enum.class.isAssignableFrom(toType)) {
             return Enum.valueOf((Class<Enum>) toType, value);
@@ -224,7 +261,7 @@
         }
     }
 
-    private Object convertCollection(Object obj, ReifiedType type) throws Exception {
+    private Object convertToCollection(Object obj, ReifiedType type) throws Exception {
         ReifiedType valueType = type.getActualTypeArgument(0);
         Collection newCol = (Collection) CollectionRecipe.getCollection(toClass(type)).newInstance();
         if (obj.getClass().isArray()) {
@@ -247,28 +284,71 @@
         return newCol;
     }
 
-    private Object convertMap(Object obj, ReifiedType type) throws Exception {
+    private Object convertToDictionary(Object obj, ReifiedType type) throws Exception {
+        ReifiedType keyType = type.getActualTypeArgument(0);
+        ReifiedType valueType = type.getActualTypeArgument(1);
+        Dictionary newDic = new Hashtable();
+        if (obj instanceof Dictionary) {
+            Dictionary dic = (Dictionary) obj;
+            for (Enumeration keyEnum = dic.keys(); keyEnum.hasMoreElements();) {
+                Object key = keyEnum.nextElement();
+                try {
+                    newDic.put(convert(key, keyType), convert(dic.get(key), valueType));
+                } catch (Exception t) {
+                    throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting map entry)", t);
+                }
+            }
+        } else {
+            for (Map.Entry e : ((Map<Object,Object>) obj).entrySet()) {
+                try {
+                    newDic.put(convert(e.getKey(), keyType), convert(e.getValue(), valueType));
+                } catch (Exception t) {
+                    throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting map entry)", t);
+                }
+            }
+        }
+        return newDic;
+    }
+
+    private Object convertToMap(Object obj, ReifiedType type) throws Exception {
         ReifiedType keyType = type.getActualTypeArgument(0);
         ReifiedType valueType = type.getActualTypeArgument(1);
         Map newMap = (Map) MapRecipe.getMap(toClass(type)).newInstance();
-        for (Map.Entry e : ((Map<Object,Object>) obj).entrySet()) {
-            try {
-                newMap.put(convert(e.getKey(), keyType), convert(e.getValue(), valueType));
-            } catch (Exception t) {
-                throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting map entry)", t);
+        if (obj instanceof Dictionary) {
+            Dictionary dic = (Dictionary) obj;
+            for (Enumeration keyEnum = dic.keys(); keyEnum.hasMoreElements();) {
+                Object key = keyEnum.nextElement();
+                try {
+                    newMap.put(convert(key, keyType), convert(dic.get(key), valueType));
+                } catch (Exception t) {
+                    throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting map entry)", t);
+                }
+            }
+        } else {
+            for (Map.Entry e : ((Map<Object,Object>) obj).entrySet()) {
+                try {
+                    newMap.put(convert(e.getKey(), keyType), convert(e.getValue(), valueType));
+                } catch (Exception t) {
+                    throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting map entry)", t);
+                }
             }
         }
         return newMap;
     }
 
-    private Object convertArray(Object obj, ReifiedType type) throws Exception {
+    private Object convertToArray(Object obj, ReifiedType type) throws Exception {
         if (obj instanceof Collection) {
             obj = ((Collection) obj).toArray();
         }
         if (!obj.getClass().isArray()) {
             throw new Exception("Unable to convert from " + obj + " to " + type);
         }
-        ReifiedType componentType = type.getActualTypeArgument(0);
+        ReifiedType componentType;
+        if (type.size() > 0) {
+            componentType = type.getActualTypeArgument(0);
+        } else {
+            componentType = new GenericType(type.getRawClass().getComponentType());
+        }
         Object array = Array.newInstance(toClass(componentType), Array.getLength(obj));
         for (int i = 0; i < Array.getLength(obj); i++) {
             try {
@@ -280,9 +360,10 @@
         return array;
     }
 
-    private boolean isAssignable(Object source, ReifiedType target) {
-        return target.size() == 0
-                && unwrap(target.getRawClass()).isAssignableFrom(unwrap(source.getClass()));
+    public static boolean isAssignable(Object source, ReifiedType target) {
+        return source == null
+                || (target.size() == 0
+                    && unwrap(target.getRawClass()).isAssignableFrom(unwrap(source.getClass())));
     }
 
     private static Class unwrap(Class c) {

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BeanRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BeanRecipe.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BeanRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BeanRecipe.java Tue Jun 30 20:03:50 2009
@@ -36,7 +36,6 @@
 import org.apache.geronimo.blueprint.di.Recipe;
 import org.apache.geronimo.blueprint.utils.ReflectionUtils;
 import static org.apache.geronimo.blueprint.utils.ReflectionUtils.getRealCause;
-import static org.apache.geronimo.blueprint.utils.TypeUtils.isInstance;
 import org.osgi.service.blueprint.container.ReifiedType;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
 import org.slf4j.Logger;
@@ -175,7 +174,7 @@
         
         // Instanciate arguments
         List<Object> args = new ArrayList<Object>();
-        List<Class> argTypes = new ArrayList<Class>();
+        List<ReifiedType> argTypes = new ArrayList<ReifiedType>();
         if (arguments != null) {
             for (int i = 0; i < arguments.size(); i++) {
                 Object arg = arguments.get(i);
@@ -185,7 +184,7 @@
                     args.add(arg);
                 }
                 if (this.argTypes != null) {
-                    argTypes.add(this.argTypes.get(i) != null ? loadClass(this.argTypes.get(i)) : null);
+                    argTypes.add(this.argTypes.get(i) != null ? loadType(this.argTypes.get(i)) : null);
                 }
             }
         }
@@ -245,7 +244,7 @@
         return instance;
     }
 
-    private Map<Method, List<Object>> findMatchingMethods(Class type, String name, boolean instance, List<Object> args, List<Class> types) {
+    private Map<Method, List<Object>> findMatchingMethods(Class type, String name, boolean instance, List<Object> args, List<ReifiedType> types) {
         Map<Method, List<Object>> matches = new HashMap<Method, List<Object>>();
         // Get constructors
         List<Method> methods = new ArrayList<Method>(Arrays.asList(type.getMethods()));
@@ -267,11 +266,12 @@
                 boolean found = true;
                 List<Object> match = new ArrayList<Object>();
                 for (int i = 0; i < args.size(); i++) {
-                    if (types.get(i) != null && !mth.getParameterTypes()[i].equals(types.get(i))) {
+                    ReifiedType argType = new GenericType(mth.getGenericParameterTypes()[i]);
+                    if (types.get(i) != null && !argType.getRawClass().equals(types.get(i).getRawClass())) {
                         found = false;
                         break;
                     }
-                    if (!isInstance(mth.getParameterTypes()[i], args.get(i))) {
+                    if (!AggregateConverter.isAssignable(args.get(i), argType)) {
                         found = false;
                         break;
                     }
@@ -297,12 +297,13 @@
                 boolean found = true;
                 List<Object> match = new ArrayList<Object>();
                 for (int i = 0; i < args.size(); i++) {
-                    if (types.get(i) != null && !mth.getParameterTypes()[i].equals(types.get(i))) {
+                    ReifiedType argType = new GenericType(mth.getGenericParameterTypes()[i]);
+                    if (types.get(i) != null && !argType.getRawClass().equals(types.get(i).getRawClass())) {
                         found = false;
                         break;
                     }
                     try {
-                        Object val = convert(args.get(i), mth.getGenericParameterTypes()[i]);
+                        Object val = convert(args.get(i), argType);
                         match.add(val);
                     } catch (Throwable t) {
                         found = false;
@@ -348,7 +349,7 @@
         return matches;
     }
 
-    private Map<Constructor, List<Object>> findMatchingConstructors(Class type, List<Object> args, List<Class> types) {
+    private Map<Constructor, List<Object>> findMatchingConstructors(Class type, List<Object> args, List<ReifiedType> types) {
         Map<Constructor, List<Object>> matches = new HashMap<Constructor, List<Object>>();
         // Get constructors
         List<Constructor> constructors = new ArrayList<Constructor>(Arrays.asList(type.getConstructors()));
@@ -365,11 +366,12 @@
                 boolean found = true;
                 List<Object> match = new ArrayList<Object>();
                 for (int i = 0; i < args.size(); i++) {
-                    if (types.get(i) != null && !cns.getParameterTypes()[i].equals(types.get(i))) {
+                    ReifiedType argType = new GenericType(cns.getGenericParameterTypes()[i]);
+                    if (types.get(i) != null && !argType.getRawClass().equals(types.get(i).getRawClass())) {
                         found = false;
                         break;
                     }
-                    if (!isInstance(cns.getParameterTypes()[i], args.get(i))) {
+                    if (!AggregateConverter.isAssignable(args.get(i), argType)) {
                         found = false;
                         break;
                     }
@@ -395,12 +397,13 @@
                 boolean found = true;
                 List<Object> match = new ArrayList<Object>();
                 for (int i = 0; i < args.size(); i++) {
-                    if (types.get(i) != null && !cns.getParameterTypes()[i].equals(types.get(i))) {
+                    ReifiedType argType = new GenericType(cns.getGenericParameterTypes()[i]);
+                    if (types.get(i) != null && !argType.getRawClass().equals(types.get(i).getRawClass())) {
                         found = false;
                         break;
                     }
                     try {
-                        Object val = convert(args.get(i), cns.getGenericParameterTypes()[i]);
+                        Object val = convert(args.get(i), argType);
                         match.add(val);
                     } catch (Throwable t) {
                         found = false;
@@ -633,12 +636,12 @@
         public ArgumentMatcher(Type[] types, boolean convert) {
             entries = new ArrayList<TypeEntry>();
             for (Type type : types) {
-                entries.add(new TypeEntry(type));
+                entries.add(new TypeEntry(new GenericType(type)));
             }
             this.convert = convert;
         }
 
-        public List<Object> match(List<Object> arguments, List<Class> forcedTypes) {
+        public List<Object> match(List<Object> arguments, List<ReifiedType> forcedTypes) {
             if (find(arguments, forcedTypes)) {
                 return getArguments();
             }
@@ -657,7 +660,7 @@
             return list;
         }
 
-        private boolean find(List<Object> arguments, List<Class> forcedTypes) {
+        private boolean find(List<Object> arguments, List<ReifiedType> forcedTypes) {
             if (entries.size() == arguments.size()) {
                 boolean matched = true;
                 for (int i = 0; i < arguments.size() && matched; i++) {
@@ -668,7 +671,7 @@
             return false;
         }
 
-        private boolean find(Object arg, Class forcedType) {
+        private boolean find(Object arg, ReifiedType forcedType) {
             for (TypeEntry entry : entries) {
                 Object val = arg;
                 if (entry.argument != UNMATCHED) {
@@ -687,7 +690,7 @@
                             continue;
                         }
                     } else {
-                        if (!isInstance(entry.type, arg)) {
+                        if (!AggregateConverter.isAssignable(arg, entry.type)) {
                             continue;
                         }
                     }
@@ -702,10 +705,10 @@
 
     private static class TypeEntry {
 
-        private final Type type;
+        private final ReifiedType type;
         private Object argument;
 
-        public TypeEntry(Type type) {
+        public TypeEntry(ReifiedType type) {
             this.type = type;
             this.argument = UNMATCHED;
         }

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintContainerImpl.java Tue Jun 30 20:03:50 2009
@@ -30,6 +30,7 @@
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
+import java.util.LinkedHashSet;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
@@ -169,10 +170,10 @@
             timeout = Integer.parseInt(timeoutDirective);
         }
 
-        String waitForDependenciesDirective = paths.get(0).getDirective(BlueprintConstants.WAIT_FOR_DEPENDENCIES_DIRECTIVE);
-        if (waitForDependenciesDirective != null) {
-            LOGGER.debug("Wait-for-dependencies directive: " + waitForDependenciesDirective);
-            waitForDependencies = Boolean.parseBoolean(waitForDependenciesDirective);
+        String graceperiod = paths.get(0).getDirective(BlueprintConstants.GRACE_PERIOD);
+        if (graceperiod != null) {
+            LOGGER.debug("Grace-period directive: " + graceperiod);
+            waitForDependencies = Boolean.parseBoolean(graceperiod);
         }
 
         String xmlValidationDirective = paths.get(0).getDirective(BlueprintConstants.XML_VALIDATION);
@@ -559,7 +560,13 @@
     }
     
     public Set<String> getComponentIds() {
-        return componentDefinitionRegistry.getComponentDefinitionNames();
+        Set<String> set = new LinkedHashSet<String>();
+        set.addAll(componentDefinitionRegistry.getComponentDefinitionNames());
+        set.add("blueprintContainer");
+        set.add("blueprintBundle");
+        set.add("blueprintBundleContext");
+        set.add("blueprintConverter");
+        return set;
     }
     
     public Object getComponentInstance(String id) throws NoSuchComponentException {
@@ -569,6 +576,8 @@
         try {
             LOGGER.debug("Instantiating component {}", id);
             return repository.create(id);
+        } catch (NoSuchComponentException e) {
+            throw e;
         } catch (ComponentDefinitionException e) {
             throw e;
         } catch (Throwable t) {

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintExtender.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintExtender.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintExtender.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/BlueprintExtender.java Tue Jun 30 20:03:50 2009
@@ -150,7 +150,7 @@
                         filePattern = name.substring(pos + 1);
                     }
                     if (hasWildcards(filePattern)) {
-                        addEntries(bundle, baseName, filePattern, true, urls);
+                        addEntries(bundle, baseName, filePattern, false, urls);
                     } else {
                         addEntry(bundle, name, urls);
                     }                    

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/GenericType.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/GenericType.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/GenericType.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/GenericType.java Tue Jun 30 20:03:50 2009
@@ -120,7 +120,11 @@
     public String toString() {
         Class cl = getRawClass();
         if (cl.isArray()) {
-            return parameters[0].toString() + "[]";
+            if (parameters.length > 0) {
+                return parameters[0].toString() + "[]";
+            } else {
+                return cl.getComponentType().getName() + "[]";
+            }
         }
         if (parameters.length > 0) {
             StringBuilder sb = new StringBuilder();
@@ -142,7 +146,12 @@
 		if ( type instanceof Class ) {
 		    Class clazz = (Class) type;
 		    if (clazz.isArray()) {
-		        return new GenericType[] { new GenericType(clazz.getComponentType()) };
+                GenericType t = new GenericType(clazz.getComponentType());
+                if (t.size() > 0) {
+		            return new GenericType[] { t };
+                } else {
+                    return EMPTY;
+                }
 		    } else {
 		        return EMPTY;
 		    }

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RecipeBuilder.java Tue Jun 30 20:03:50 2009
@@ -82,7 +82,6 @@
             repository.putDefault("blueprintBundle", blueprintContainer.getBundleContext().getBundle());
             repository.putDefault("blueprintBundleContext", blueprintContainer.getBundleContext());
             repository.putDefault("blueprintConverter", blueprintContainer.getConverter());
-            repository.putDefault("blueprintExtenderBundle", blueprintContainer.getExtenderBundle());
         }
     }
     
@@ -125,7 +124,7 @@
         for (String name : metadata.getDependsOn()) {
             deps.add(new RefRecipe(getName(null), name));
         }
-        RefListRecipe recipe = new RefListRecipe(getName(metadata.getId()),
+        ReferenceListRecipe recipe = new ReferenceListRecipe(getName(metadata.getId()),
                                                  blueprintContainer,
                                                  metadata,
                                                  listenersRecipe,

Copied: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceListRecipe.java (from r788924, geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RefListRecipe.java)
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceListRecipe.java?p2=geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceListRecipe.java&p1=geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RefListRecipe.java&r1=788924&r2=789914&rev=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/RefListRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceListRecipe.java Tue Jun 30 20:03:50 2009
@@ -50,16 +50,16 @@
  * @author <a href="mailto:dev@geronimo.apache.org">Apache Geronimo Project</a>
  * @version $Rev: 760378 $, $Date: 2009-03-31 11:31:38 +0200 (Tue, 31 Mar 2009) $
  */
-public class RefListRecipe extends AbstractServiceReferenceRecipe {
+public class ReferenceListRecipe extends AbstractServiceReferenceRecipe {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(RefListRecipe.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(ReferenceListRecipe.class);
 
     private final ReferenceListMetadata metadata;
     private final List<ManagedCollection> collections = new ArrayList<ManagedCollection>();
     private final DynamicCollection<ServiceDispatcher> storage = new DynamicCollection<ServiceDispatcher>();
     private final List<ServiceDispatcher> unboundDispatchers = new ArrayList<ServiceDispatcher>();
 
-    public RefListRecipe(String name,
+    public ReferenceListRecipe(String name,
                          ExtendedBlueprintContainer blueprintContainer,
                          ReferenceListMetadata metadata,
                          Recipe listenersRecipe,
@@ -258,6 +258,10 @@
 
     /**
      * Base class for managed collections.
+     *
+     * TODO: list iterators should not be supported
+     * TODO: rework the iteration so that if hasNext() has returned false, it will always return false
+     * TODO: implement subList()
      */
     public static class ManagedCollection extends AbstractCollection implements List, RandomAccess {
 

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ReferenceRecipe.java Tue Jun 30 20:03:50 2009
@@ -143,6 +143,7 @@
                 for (Listener listener : listeners) {
                     listener.bind(trackedServiceReference, proxy);
                 }
+                listenersCreated = false;
             }
         }
     }
@@ -154,11 +155,19 @@
                     for (Listener listener : listeners) {
                         listener.unbind(trackedServiceReference, proxy);
                     }
+                    listenersCreated = false;
                 }
                 blueprintContainer.getBundleContext().ungetService(trackedServiceReference);
                 trackedServiceReference = null;
                 trackedService = null;
                 monitor.notifyAll();
+            } else if (listenersCreated) {
+                if (listeners != null) {
+                    for (Listener listener : listeners) {
+                        listener.unbind(null, null);
+                    }
+                    listenersCreated = false;
+                }
             }
         }
     }

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/container/ServiceRecipe.java Tue Jun 30 20:03:50 2009
@@ -73,7 +73,6 @@
     private Map registrationProperties;
     private List<ServiceListener> listeners;
     private Object service;
-    private final Object serviceLock = new Object();
     private boolean prototypeService;
 
     public ServiceRecipe(String name,
@@ -229,10 +228,18 @@
                             listeners = Collections.emptyList();
                         }
                         LOGGER.debug("Listeners created: {}", listeners);
-                        LOGGER.debug("Calling listeners for service registration");
-                        for (ServiceListener listener : listeners) {
-                            listener.register(prototypeService || service instanceof ServiceFactory ? null : service,
-                                              registrationProperties);
+                        if (registered) { // Do not call isRegistered() because of the synchronization
+                            LOGGER.debug("Calling listeners for initial service registration");
+                            for (ServiceListener listener : listeners) {
+                                listener.register(prototypeService || service instanceof ServiceFactory ? null : service,
+                                                  registrationProperties);
+                            }
+                        } else {
+                            LOGGER.debug("Calling listeners for initial service unregistration");
+                            for (ServiceListener listener : listeners) {
+                                listener.unregister(prototypeService || service instanceof ServiceFactory ? null : service,
+                                                  registrationProperties);
+                            }
                         }
                     }
                 } catch (RuntimeException e) {

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/MapRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/MapRecipe.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/MapRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/di/MapRecipe.java Tue Jun 30 20:03:50 2009
@@ -25,6 +25,7 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.Hashtable;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/namespace/ComponentDefinitionRegistryImpl.java Tue Jun 30 20:03:50 2009
@@ -29,6 +29,7 @@
 import org.apache.geronimo.blueprint.ComponentNameAlreadyInUseException;
 import org.osgi.service.blueprint.reflect.ComponentMetadata;
 import org.osgi.service.blueprint.reflect.Target;
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
 
 /**
  * ComponentDefinitionRegistry implementation.
@@ -68,6 +69,12 @@
             // TODO: should we generate a unique name?
             throw new IllegalArgumentException("Component must have a valid id");
         }
+        if (id.equals("blueprintContainer") || id.equals("blueprintBundle")
+                || id.equals("blueprintBundleContext") || id.equals("blueprintConverter")) {
+            throw new ComponentDefinitionException("Can not override an environment manager (" + id + ")");
+        } else if (id.startsWith("blueprint")) {
+            // TODO: log a warning
+        }
         // TODO: perform other validation: scope, class/runtimeClass/factoryMethod, etc...
         if (components.containsKey(id)) {
             throw new ComponentNameAlreadyInUseException(id);

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/TypeUtils.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/TypeUtils.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/TypeUtils.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/utils/TypeUtils.java Tue Jun 30 20:03:50 2009
@@ -16,19 +16,8 @@
  */
 package org.apache.geronimo.blueprint.utils;
 
-import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.GenericArrayType;
 import java.lang.reflect.Modifier;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.geronimo.blueprint.ExtendedBlueprintContainer;
-import org.apache.geronimo.blueprint.di.ExecutionContext;
-import org.osgi.framework.Bundle;
 
 /**
  * @version $Rev: 6687 $ $Date: 2005-12-28T21:08:56.733437Z $
@@ -54,54 +43,4 @@
         return false;
     }
 
-    public static boolean isInstance(Type t, Object instance) {
-        Class type = toClass(t);
-        if (type.isPrimitive()) {
-            // for primitives the insance can't be null
-            if (instance == null) {
-                return false;
-            }
-
-            // verify instance is the correct wrapper type
-            if (type.equals(boolean.class)) {
-                return instance instanceof Boolean;
-            } else if (type.equals(char.class)) {
-                return instance instanceof Character;
-            } else if (type.equals(byte.class)) {
-                return instance instanceof Byte;
-            } else if (type.equals(short.class)) {
-                return instance instanceof Short;
-            } else if (type.equals(int.class)) {
-                return instance instanceof Integer;
-            } else if (type.equals(long.class)) {
-                return instance instanceof Long;
-            } else if (type.equals(float.class)) {
-                return instance instanceof Float;
-            } else if (type.equals(double.class)) {
-                return instance instanceof Double;
-            } else {
-                throw new AssertionError("Invalid primitve type: " + type);
-            }
-        }
-
-        return instance == null || type.isInstance(instance);
-    }
-
-    public static Class toClass(Type type) {
-        // GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType
-        if (type instanceof Class) {
-            Class clazz = (Class) type;
-            return clazz;
-        } else if (type instanceof GenericArrayType) {
-            GenericArrayType arrayType = (GenericArrayType) type;
-            Class componentType = toClass(arrayType.getGenericComponentType());
-            return Array.newInstance(componentType, 0).getClass();
-        } else if (type instanceof ParameterizedType) {
-            ParameterizedType parameterizedType = (ParameterizedType) type;
-            return toClass(parameterizedType.getRawType());
-        } else {
-            return Object.class;
-        }
-    }
-
 }

Modified: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/WiringTest.java Tue Jun 30 20:03:50 2009
@@ -37,6 +37,8 @@
 import org.apache.geronimo.blueprint.pojos.PojoB;
 import org.apache.geronimo.blueprint.pojos.PojoGenerics;
 import org.apache.geronimo.blueprint.pojos.PojoListener;
+import org.apache.geronimo.blueprint.container.AggregateConverter;
+import org.apache.geronimo.blueprint.container.GenericType;
 import org.osgi.framework.ServiceRegistration;
 
 public class WiringTest extends AbstractBlueprintTest {

Modified: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/container/AggregateConverterTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/container/AggregateConverterTest.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/container/AggregateConverterTest.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/container/AggregateConverterTest.java Tue Jun 30 20:03:50 2009
@@ -40,6 +40,11 @@
         service = new AggregateConverter(new TestBlueprintContainer(null));
     }
 
+    public void testConvertNumbers() throws Exception {
+        assertEquals(1, service.convert(1.46f, int.class));
+        assertEquals(1.0d, service.convert(1, double.class));
+    }
+
     public void testConvertSimpleTypes() throws Exception {
         assertEquals(123, service.convert("123", int.class));
         assertEquals(123, service.convert("123", Integer.class));

Modified: geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/container/GenericTypeTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/container/GenericTypeTest.java?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/container/GenericTypeTest.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/java/org/apache/geronimo/blueprint/container/GenericTypeTest.java Tue Jun 30 20:03:50 2009
@@ -21,6 +21,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.net.URI;
 
 import junit.framework.TestCase;
 
@@ -32,6 +33,14 @@
         return type;
     }
     
+    public void testArrays() {
+        assertTrue(AggregateConverter.isAssignable(new Object[0], new GenericType(Object[].class)));
+        assertFalse(AggregateConverter.isAssignable(new Object[0], new GenericType(String[].class)));
+        assertTrue(AggregateConverter.isAssignable(new String[0], new GenericType(String[].class)));
+        assertFalse(AggregateConverter.isAssignable(new String[0], new GenericType(URI[].class)));
+        assertTrue(AggregateConverter.isAssignable(new String[0], new GenericType(Object[].class)));
+    }
+
     public void testParseTypes() throws Exception {
         
         GenericType type = parse("java.util.List<java.lang.String[]>");

Modified: geronimo/sandbox/blueprint/blueprint-core/src/test/resources/test-generics.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/test/resources/test-generics.xml?rev=789914&r1=789913&r2=789914&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/test/resources/test-generics.xml (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/test/resources/test-generics.xml Tue Jun 30 20:03:50 2009
@@ -32,7 +32,7 @@
     </bean>
     
     <bean id="constructorList" class="org.apache.geronimo.blueprint.pojos.PojoGenerics">
-        <argument>
+        <argument type="java.util.List">
             <list>
                 <value>10</value>
                 <value>20</value>
@@ -42,7 +42,7 @@
     </bean>
     
     <bean id="constructorSet" class="org.apache.geronimo.blueprint.pojos.PojoGenerics">
-       <argument>
+       <argument type="java.util.Set">
             <set>
                 <value>1000</value>
                 <value>2000</value>



Mime
View raw message