[jboss-cvs] JBossAS SVN: r63822 - in projects/microcontainer/trunk/kernel/src: main/org/jboss/beans/metadata/spi and 7 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Jul 4 10:52:03 EDT 2007


Author: alesj
Date: 2007-07-04 10:52:02 -0400 (Wed, 04 Jul 2007)
New Revision: 63822

Added:
   projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/deployment/xml/test/PropertyWithPreInstantiate.xml
   projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testArrayUnmodifiable.xml
   projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableCollectionPreInstantiated.xml
   projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableListPreInstantiated.xml
   projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableMapPreInstantiated.xml
   projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableSetPreInstantiated.xml
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/UnmodifiableGetterBean.java
Modified:
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractArrayMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractCollectionMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractListMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractMapMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractPropertiesMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractPropertyMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractSetMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractTypeMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/StringValueMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/spi/PropertyMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/BeanSchemaBinding.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/PropertyHandler.java
   projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_1_0.xsd
   projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_2_0.xsd
   projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomCollectionPreInstantiated.xml
   projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomListPreInstantiated.xml
   projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomMapPreInstantiated.xml
   projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomSetPreInstantiated.xml
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/CollectionTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/CollectionXMLTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/ListTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/ListXMLTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/MapTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/MapXMLTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/SetTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/SetXMLTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/PropertyTestCase.java
Log:
Changed behavior on preinstantiated collections.

1) AbstractTypeMetaData.getClassInfo(ClassInfo);
2) preinstantiated
3) TypeInfo in getValue() parameters
4) Default collection type

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractArrayMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractArrayMetaData.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractArrayMetaData.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -26,7 +26,6 @@
 
 import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.reflect.spi.TypeInfo;
-import org.jboss.util.JBossStringBuilder;
 
 /**
  * Array metadata.
@@ -45,9 +44,10 @@
    {
    }
 
+   @SuppressWarnings("unchecked")
    public Object getValue(TypeInfo info, ClassLoader cl) throws Throwable
    {
-      Collection<? extends Object> result = (Collection<? extends Object>) super.getValue(info, cl);
+      Collection result = (Collection)super.getValue(info, cl);
 
       TypeInfo typeInfo = getClassInfo(cl);
       
@@ -77,32 +77,32 @@
          typeInfo = info;
       }
 
-      Object[] array = new Object[result.size()];
-      if (typeInfo != null)
-         array = typeInfo.newArrayInstance(result.size());
-      
+      Object[] array = typeInfo.newArrayInstance(result.size());
       return result.toArray(array);
    }
 
-   protected Collection<Object> getCollectionInstance(TypeInfo info, ClassLoader cl, Class expected) throws Throwable
+   protected <T> T getTypeInstance(TypeInfo info, ClassLoader cl, Class<T> expected) throws Throwable
    {
       Collection<Object> result = new ArrayList<Object>();
-      Object preinstantiatedObject = preinstantiatedLookup(cl, null);
+      Object preinstantiatedObject = preinstantiatedLookup(cl, Object[].class);
       if (preinstantiatedObject != null)
       {
-         if (preinstantiatedObject.getClass().isArray() == false)
-            throw new ClassCastException("Preinstantiated property is not an array: " + propertyName);
          Object[] preinstantiatedArray = (Object[]) preinstantiatedObject;
          for(Object previous : preinstantiatedArray)
          {
             result.add(previous);
          }
       }
-      return result;
+      return expected.cast(result);
    }
 
-   public void toString(JBossStringBuilder buffer)
+   protected <T> T checkResult(Object result, Class<T> expected)
    {
-      super.toString(buffer);
+      if (result != null)
+      {
+         if (result.getClass().isArray() == false)
+            throw new ClassCastException("Preinstantiated property is not an array: " + propertyName);
+      }
+      return expected.cast(result);
    }
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractCollectionMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractCollectionMetaData.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractCollectionMetaData.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -26,11 +26,9 @@
 import java.util.Collection;
 import java.util.Iterator;
 
-import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.beans.metadata.spi.MetaDataVisitor;
 import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.beans.metadata.spi.ValueMetaData;
-import org.jboss.joinpoint.spi.Joinpoint;
 import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.JBossObject;
@@ -80,14 +78,12 @@
       this.elementType = elementType;
    }
 
+   @SuppressWarnings("unchecked")
    public Object getValue(TypeInfo info, ClassLoader cl) throws Throwable
    {
-      Collection<Object> result = getCollectionInstance(info, cl, Collection.class);
-      if (result == null)
-         result = getDefaultCollectionInstance();
+      Collection result = getTypeInstance(info, cl, Collection.class);
 
       TypeInfo elementTypeInfo = getElementClassInfo(cl);
-
       for (int i = 0; i < collection.size(); ++i)
       {
          ValueMetaData vmd = (ValueMetaData) collection.get(i);
@@ -186,64 +182,13 @@
     * Create the default collection instance
     * 
     * @return the class instance
-    * @throws Throwable for any error
     */
-   protected Collection<Object> getDefaultCollectionInstance() throws Throwable
+   protected Object getDefaultInstance()
    {
       return new ArrayList<Object>();
    }
 
    /**
-    * Create the collection instance
-    * 
-    * @param info the request type
-    * @param cl the classloader
-    * @param expected the expected class
-    * @return the class instance
-    * @throws Throwable for any error
-    */
-   @SuppressWarnings("unchecked")
-   protected Collection<Object> getCollectionInstance(TypeInfo info, ClassLoader cl, Class<?> expected) throws Throwable
-   {
-      Object result = preinstantiatedLookup(cl, expected);
-      if (result == null)
-      {
-         TypeInfo typeInfo = getClassInfo(cl);
-
-         if (typeInfo != null && typeInfo instanceof ClassInfo == false)
-            throw new IllegalArgumentException(typeInfo.getName() + " is not a class");
-
-         if (typeInfo != null && ((ClassInfo) typeInfo).isInterface())
-            throw new IllegalArgumentException(typeInfo.getName() + " is an interface");
-
-         if (typeInfo == null)
-         {
-            // No type specified
-            if (info == null)
-               return null;
-            // Not a class
-            if (info instanceof ClassInfo == false)
-               return null;
-            // Is an interface
-            if (((ClassInfo) info).isInterface())
-               return null;
-            // Type is too general
-            if (Object.class.getName().equals(info.getName()))
-               return null;
-            // Try to use the passed type
-            typeInfo = info;
-         }
-
-         BeanInfo beanInfo = configurator.getBeanInfo(typeInfo);
-         Joinpoint constructor = configurator.getConstructorJoinPoint(beanInfo);
-         result = constructor.dispatch();
-         if (expected.isAssignableFrom(result.getClass()) == false)
-            throw new ClassCastException(result.getClass() + " is not a " + expected.getName());
-      }
-      return (Collection<Object>) result;
-   }
-
-   /**
     * Get the class info for the element type
     *
     * @param cl the classloader

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractListMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractListMetaData.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractListMetaData.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -27,7 +27,6 @@
 import java.util.ListIterator;
 
 import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
-import org.jboss.util.JBossStringBuilder;
 
 /**
  * List metadata.
@@ -69,7 +68,7 @@
 
    public int lastIndexOf(Object o)
    {
-      return lastIndexOf(o);
+      return collection.lastIndexOf(o);
    }
 
    public ListIterator<MetaDataVisitorNode> listIterator()
@@ -89,16 +88,12 @@
 
    public MetaDataVisitorNode set(int index, MetaDataVisitorNode element)
    {
-      return set(index, element);
+      return collection.set(index, element);
    }
 
    public List<MetaDataVisitorNode> subList(int fromIndex, int toIndex)
    {
-      return subList(fromIndex, toIndex);
+      return collection.subList(fromIndex, toIndex);
    }
 
-   public void toString(JBossStringBuilder buffer)
-   {
-      super.toString(buffer);
-   }
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractMapMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractMapMetaData.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractMapMetaData.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -22,13 +22,16 @@
 package org.jboss.beans.metadata.plugins;
 
 import java.io.Serializable;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
 
-import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.beans.metadata.spi.MetaDataVisitor;
 import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.beans.metadata.spi.ValueMetaData;
-import org.jboss.joinpoint.spi.Joinpoint;
 import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.reflect.spi.TypeInfo;
 
@@ -99,16 +102,10 @@
       this.valueType = valueType;
    }
 
-   protected Class<? extends Map> expectedMapClass()
-   {
-      return Map.class;
-   }
-
+   @SuppressWarnings("unchecked")
    public Object getValue(TypeInfo info, ClassLoader cl) throws Throwable
    {
-      Map<Object, Object> result = getMapInstance(info, cl, expectedMapClass());
-      if (result == null)
-         result = getDefaultMapInstance();
+      Map result = getTypeInstance(info, cl, getExpectedClass());
 
       TypeInfo keyTypeInfo = getKeyClassInfo(cl);
       TypeInfo valueTypeInfo = getValueClassInfo(cl);
@@ -224,61 +221,15 @@
     * Create the default map instance
     * 
     * @return the class instance
-    * @throws Throwable for any error
     */
-   protected Map<Object, Object> getDefaultMapInstance() throws Throwable
+   protected Object getDefaultInstance()
    {
       return new HashMap<Object, Object>();
    }
 
-   /**
-    * Create the map instance
-    * 
-    * @param info the request type
-    * @param cl the classloader
-    * @param expected the expected class
-    * @return the class instance
-    * @throws Throwable for any error
-    */
-   @SuppressWarnings("unchecked")
-   protected Map<Object, Object> getMapInstance(TypeInfo info, ClassLoader cl, Class<?> expected) throws Throwable
+   protected Class<? extends Map> getExpectedClass()
    {
-      Object result = preinstantiatedLookup(cl, expected);
-      if (result == null)
-      {
-         TypeInfo typeInfo = getClassInfo(cl);
-
-         if (typeInfo != null && typeInfo instanceof ClassInfo == false)
-            throw new IllegalArgumentException(typeInfo.getName() + " is not a class");
-
-         if (typeInfo != null && ((ClassInfo) typeInfo).isInterface())
-            throw new IllegalArgumentException(typeInfo.getName() + " is an interface");
-
-         if (typeInfo == null)
-         {
-            // No type specified
-            if (info == null)
-               return null;
-            // Not a class
-            if (info instanceof ClassInfo == false)
-               return null;
-            // Not an interface
-            if (((ClassInfo) info).isInterface())
-               return null;
-            // Type is too general
-            if (Object.class.getName().equals(info.getName()))
-               return null;
-            // Try to use the passed type
-            typeInfo = info;
-         }
-
-         BeanInfo beanInfo = configurator.getBeanInfo(typeInfo);
-         Joinpoint constructor = configurator.getConstructorJoinPoint(beanInfo);
-         result = constructor.dispatch();
-         if (expected.isAssignableFrom(result.getClass()) == false)
-            throw new ClassCastException(result.getClass() + " is not a " + expected.getName());
-      }
-      return (Map<Object, Object>) result;
+      return Map.class;
    }
 
    /**

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractPropertiesMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractPropertiesMetaData.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractPropertiesMetaData.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -33,12 +33,12 @@
 {
    private static final long serialVersionUID = 1L;
 
-   protected Map<Object, Object> getDefaultMapInstance() throws Throwable
+   protected Object getDefaultInstance()
    {
       return new Properties();
    }
 
-   protected Class<? extends Map> expectedMapClass()
+   protected Class<? extends Map> getExpectedClass()
    {
       return Properties.class;
    }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractPropertyMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractPropertyMetaData.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractPropertyMetaData.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -45,11 +45,14 @@
 public class AbstractPropertyMetaData extends AbstractFeatureMetaData
    implements PropertyMetaData, ValueMetaDataAware, TypeProvider, Serializable
 {
-   private static final long serialVersionUID = 1L;
+   private static final long serialVersionUID = 2L;
 
    /** The property name */
    protected String name;
 
+   /** The preinstantiate */
+   protected boolean preInstantiate = true;
+
    /** The property value */
    protected ValueMetaData value;
 
@@ -136,6 +139,16 @@
       return null;
    }
 
+   public boolean isPreInstantiate()
+   {
+      return preInstantiate;
+   }
+
+   public void setPreInstantiate(boolean preInstantiate)
+   {
+      this.preInstantiate = preInstantiate;
+   }
+
    public ValueMetaData getValue()
    {
       return value;

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractSetMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractSetMetaData.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractSetMetaData.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -27,7 +27,6 @@
 import java.util.Set;
 
 import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
-import org.jboss.util.JBossStringBuilder;
 
 /**
  * Set metadata.
@@ -71,13 +70,8 @@
       return changed;
    }
 
-   public void toString(JBossStringBuilder buffer)
+   protected Object getDefaultInstance()
    {
-      super.toString(buffer);
-   }
-
-   protected Collection<Object> getDefaultCollectionInstance() throws Throwable
-   {
       return new HashSet<Object>();
    }
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractTypeMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractTypeMetaData.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractTypeMetaData.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -38,12 +38,15 @@
 import org.jboss.kernel.spi.config.KernelConfigurator;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.reflect.spi.ClassInfo;
+import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.JBossStringBuilder;
+import org.jboss.joinpoint.spi.Joinpoint;
 
 /**
  * A typed value.
  *
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  * @version $Revision$
  */
 public abstract class AbstractTypeMetaData extends AbstractValueMetaData
@@ -116,7 +119,13 @@
       visitor.initialVisit(this);
    }
 
-   private void preparePreinstantiatedLookup(MetaDataVisitor visitor)
+   /**
+    * Check if we can extract the information about
+    * existing instance - only on property metadata.
+    *
+    * @param visitor underlying visitor
+    */
+   protected void preparePreinstantiatedLookup(MetaDataVisitor visitor)
    {
       Stack<MetaDataVisitorNode> visitorNodes = visitor.visitorNodeStack();
       // pop it so that we can get to grand parent for more info
@@ -126,12 +135,15 @@
          if (parent instanceof PropertyMetaData)
          {
             PropertyMetaData pmd = (PropertyMetaData)parent;
-            propertyName = pmd.getName();
-            Object gp = visitorNodes.peek();
-            if (gp instanceof BeanMetaData)
+            if (pmd.isPreInstantiate())
             {
-               BeanMetaData bmd = (BeanMetaData)gp;
-               beanName = bmd.getName();
+               propertyName = pmd.getName();
+               Object gp = visitorNodes.peek();
+               if (gp instanceof BeanMetaData)
+               {
+                  BeanMetaData bmd = (BeanMetaData)gp;
+                  beanName = bmd.getName();
+               }
             }
          }
       }
@@ -141,12 +153,19 @@
       }
    }
 
-   @SuppressWarnings("unchecked")
-   protected Object preinstantiatedLookup(ClassLoader cl, Class expected)
+   /**
+    * Check for already existing instances.
+    *
+    * @param <T> expected type
+    * @param cl the classloader
+    * @param expected the expected class
+    * @return existing instance or null otherwise
+    */
+   protected <T> T preinstantiatedLookup(ClassLoader cl, Class<T> expected)
    {
-      Object result = null;
       if (propertyName != null && beanName != null)
       {
+         Object result = null;
          try
          {
             Controller controller = context.getController();
@@ -169,13 +188,112 @@
          {
             log.warn("Exception in preinstantiated lookup for: " + beanName + "." + propertyName + ", " + t);
          }
-         if (result != null && expected != null && expected.isAssignableFrom(result.getClass()) == false)
-            throw new ClassCastException(result.getClass() + " is not a " + expected.getName());
+         return checkResult(result, expected);
       }
+      return null;
+   }
+
+   /**
+    * Check result for class compatibility.
+    *
+    * @param result the result
+    * @param expected expected class
+    * @return casted result
+    * @throws ClassCastException if result cannot be casted into expected parameter
+    */
+   protected <T> T checkResult(Object result, Class<T> expected)
+   {
+      if (result != null && expected.isAssignableFrom(result.getClass()) == false)
+         throw new ClassCastException(result.getClass() + " is not a " + expected.getName());
+      return expected.cast(result);
+   }
+
+   /**
+    * Create new instance from type field.
+    * Fall back to info parameter if no type field is set.
+    *
+    * @param <T> expected type
+    * @param info the type of reference we are about to set
+    * @param cl the classloader to use
+    * @param expected the expected class
+    * @param explicit is type explicit
+    * @return class instance or null if type is too broad
+    * @throws Throwable on any error
+    */
+   protected <T> T createInstance(TypeInfo info, ClassLoader cl, Class<T> expected, boolean explicit) throws Throwable
+   {
+      if (info == null || Object.class.getName().equals(info.getName()))
+         return null;
+
+      if (info instanceof ClassInfo == false)
+      {
+         if (explicit)
+            throw new IllegalArgumentException(info.getName() + " is not a class");
+         else
+            return null;
+      }
+
+      if (((ClassInfo) info).isInterface())
+      {
+         if (explicit)
+            throw new IllegalArgumentException(info.getName() + " is an interface");
+         else
+            return null;
+      }
+
+      BeanInfo beanInfo = configurator.getBeanInfo(info);
+      Joinpoint constructor = configurator.getConstructorJoinPoint(beanInfo);
+      Object result = constructor.dispatch();
+
+      if (expected.isAssignableFrom(result.getClass()) == false)
+         throw new ClassCastException(result.getClass() + " is not a " + expected.getName());
+
+      return expected.cast(result);
+   }
+
+   /**
+    * Create the class instance
+    *
+    * @param <T> expected type
+    * @param info the request type
+    * @param cl the classloader
+    * @param expected the expected class
+    * @return the class instance
+    * @throws Throwable for any error
+    */
+   protected <T> T getTypeInstance(TypeInfo info, ClassLoader cl, Class<T> expected) throws Throwable
+   {
+      T result = null;
+
+      TypeInfo typeInfo = getClassInfo(cl);
+      // we have explicitly set type
+      if (typeInfo != null)
+         result = createInstance(typeInfo, cl, expected, true);
+
+      if (result == null)
+      {
+         result = preinstantiatedLookup(cl, expected);
+         // try info param
+         if (result == null)
+         {
+            result = createInstance(info, cl, expected, false);
+            // get default
+            if (result == null)
+               result = expected.cast(getDefaultInstance());
+         }
+      }
+
       return result;
    }
 
    /**
+    * Get the default instance.
+    *
+    * @return the default instance
+    */
+   protected abstract Object getDefaultInstance();
+
+   /**
     * Set the configurator
     *
     * @param configurator the configurator

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/StringValueMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/StringValueMetaData.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/StringValueMetaData.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -101,6 +101,11 @@
       return typeInfo.convertValue(value, replace);
    }
 
+   protected Object getDefaultInstance()
+   {
+      return null;
+   }
+
    public Class getType(MetaDataVisitor visitor, MetaDataVisitorNode previous) throws Throwable
    {
       if (getType() != null)

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/spi/PropertyMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/spi/PropertyMetaData.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/spi/PropertyMetaData.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -44,6 +44,13 @@
    String getType();
 
    /**
+    * Get the preinstantiate flag.
+    *
+    * @return the preinstantiate flag
+    */
+   boolean isPreInstantiate();
+
+   /**
     * Get the value.
     * 
     * @return the value.

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/BeanSchemaBinding.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/BeanSchemaBinding.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/BeanSchemaBinding.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -805,6 +805,8 @@
                String localName = attrs.getLocalName(i);
                if ("name".equals(localName))
                   property.setName(attrs.getValue(i));
+               else if ("preinstantiate".equals(localName))
+                  property.setPreInstantiate(Boolean.parseBoolean(attrs.getValue(i)));
                else if ("class".equals(localName) || "replace".equals(localName))
                {
                   StringValueMetaData svmd;

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/PropertyHandler.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/PropertyHandler.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/PropertyHandler.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -55,6 +55,8 @@
          String localName = attrs.getLocalName(i);
          if ("name".equals(localName))
             property.setName(attrs.getValue(i));
+         else if ("preinstantiate".equals(localName))
+            property.setPreInstantiate(Boolean.parseBoolean(attrs.getValue(i)));
          else if ("class".equals(localName) || "replace".equals(localName))
          {
             StringValueMetaData svmd;

Modified: projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_1_0.xsd
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_1_0.xsd	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_1_0.xsd	2007-07-04 14:52:02 UTC (rev 63822)
@@ -354,7 +354,9 @@
          </xsd:documentation>
       </xsd:annotation>
       <xsd:complexContent>
-         <xsd:extension base="namedValueType"/>
+         <xsd:extension base="namedValueType">
+            <xsd:attribute name="preinstantiate" type="xsd:boolean" use="optional" default="true"/>            
+         </xsd:extension>
       </xsd:complexContent>
    </xsd:complexType>
 

Modified: projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_2_0.xsd
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_2_0.xsd	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_2_0.xsd	2007-07-04 14:52:02 UTC (rev 63822)
@@ -537,7 +537,9 @@
          </xsd:documentation>
       </xsd:annotation>
       <xsd:complexContent>
-         <xsd:extension base="namedValueType"/>
+         <xsd:extension base="namedValueType">
+            <xsd:attribute name="preinstantiate" type="xsd:boolean" use="optional" default="true"/>
+         </xsd:extension>
       </xsd:complexContent>
    </xsd:complexType>
 

Added: projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/deployment/xml/test/PropertyWithPreInstantiate.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/deployment/xml/test/PropertyWithPreInstantiate.xml	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/deployment/xml/test/PropertyWithPreInstantiate.xml	2007-07-04 14:52:02 UTC (rev 63822)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy">
+   <property name="PropertyName" preinstantiate="false">PlainValue</property>
+</bean>

Added: projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testArrayUnmodifiable.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testArrayUnmodifiable.xml	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testArrayUnmodifiable.xml	2007-07-04 14:52:02 UTC (rev 63822)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+            xmlns="urn:jboss:bean-deployer">
+   <bean name="SimpleBean" class="org.jboss.test.kernel.config.support.UnmodifiableGetterBean">
+      <property name="array" preinstantiate="false">
+         <array elementClass="java.lang.String">
+            <value>string2</value>
+            <value>string2</value>
+            <value>string1</value>
+         </array>
+      </property>
+   </bean>
+</deployment>

Modified: projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomCollectionPreInstantiated.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomCollectionPreInstantiated.xml	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomCollectionPreInstantiated.xml	2007-07-04 14:52:02 UTC (rev 63822)
@@ -8,7 +8,7 @@
          <parameter class="java.lang.String">string1</parameter>
       </constructor>
       <property name="preInstantiatedCollection">
-         <collection class="org.jboss.test.kernel.config.support.CustomCollection" elementClass="java.lang.String">
+         <collection elementClass="java.lang.String">
             <value>string2</value>
             <value>string2</value>
             <value>string1</value>

Modified: projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomListPreInstantiated.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomListPreInstantiated.xml	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomListPreInstantiated.xml	2007-07-04 14:52:02 UTC (rev 63822)
@@ -8,7 +8,7 @@
          <parameter class="java.lang.String">string1</parameter>
       </constructor>
       <property name="preInstantiatedList">
-         <list class="org.jboss.test.kernel.config.support.CustomList" elementClass="java.lang.String">
+         <list elementClass="java.lang.String">
             <value>string2</value>
             <value>string2</value>
             <value>string1</value>

Modified: projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomMapPreInstantiated.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomMapPreInstantiated.xml	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomMapPreInstantiated.xml	2007-07-04 14:52:02 UTC (rev 63822)
@@ -9,7 +9,7 @@
          <parameter>string2</parameter>
       </constructor>
       <property name="preInstantiatedMap">
-         <map class="org.jboss.test.kernel.config.support.CustomMap" keyClass="java.lang.String" valueClass="java.lang.String">
+         <map keyClass="java.lang.String" valueClass="java.lang.String">
             <entry><key>string2</key><value>string1</value></entry>
          </map>
       </property>

Modified: projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomSetPreInstantiated.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomSetPreInstantiated.xml	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testCustomSetPreInstantiated.xml	2007-07-04 14:52:02 UTC (rev 63822)
@@ -8,7 +8,7 @@
          <parameter class="java.lang.String">string1</parameter>
       </constructor>
       <property name="preInstantiatedSet">
-         <set class="org.jboss.test.kernel.config.support.CustomSet" elementClass="java.lang.String">
+         <set elementClass="java.lang.String">
             <value>string2</value>
             <value>string2</value>
             <value>string1</value>

Added: projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableCollectionPreInstantiated.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableCollectionPreInstantiated.xml	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableCollectionPreInstantiated.xml	2007-07-04 14:52:02 UTC (rev 63822)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd"
+            xmlns="urn:jboss:bean-deployer:2.0">
+   <bean name="SimpleBean" class="org.jboss.test.kernel.config.support.UnmodifiableGetterBean">
+      <property name="collection" preinstantiate="false">
+         <collection elementClass="java.lang.String">
+            <value>string1</value>
+            <value>string2</value>
+            <value>string2</value>
+            <value>string1</value>
+         </collection>
+      </property>
+   </bean>
+</deployment>

Added: projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableListPreInstantiated.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableListPreInstantiated.xml	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableListPreInstantiated.xml	2007-07-04 14:52:02 UTC (rev 63822)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd"
+            xmlns="urn:jboss:bean-deployer:2.0">
+   <bean name="SimpleBean" class="org.jboss.test.kernel.config.support.UnmodifiableGetterBean">
+      <property name="list" preinstantiate="false">
+         <list elementClass="java.lang.String">
+            <value>string1</value>
+            <value>string2</value>
+            <value>string2</value>
+            <value>string1</value>
+         </list>
+      </property>
+   </bean>
+</deployment>

Added: projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableMapPreInstantiated.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableMapPreInstantiated.xml	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableMapPreInstantiated.xml	2007-07-04 14:52:02 UTC (rev 63822)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd"
+            xmlns="urn:jboss:bean-deployer:2.0">
+   <bean name="SimpleBean" class="org.jboss.test.kernel.config.support.UnmodifiableGetterBean">
+      <property name="map" preinstantiate="false">
+         <map keyClass="java.lang.String" valueClass="java.lang.String">
+            <entry><key>string1</key><value>string2</value></entry>
+            <entry><key>string2</key><value>string1</value></entry>
+         </map>
+      </property>
+   </bean>
+</deployment>

Added: projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableSetPreInstantiated.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableSetPreInstantiated.xml	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/xml-test/org/jboss/test/kernel/config/test/testUnmodifiableSetPreInstantiated.xml	2007-07-04 14:52:02 UTC (rev 63822)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd"
+            xmlns="urn:jboss:bean-deployer:2.0">
+   <bean name="SimpleBean" class="org.jboss.test.kernel.config.support.UnmodifiableGetterBean">
+      <property name="set" preinstantiate="false">
+         <set elementClass="java.lang.String">
+            <value>string1</value>
+            <value>string2</value>
+            <value>string2</value>
+            <value>string1</value>
+         </set>
+      </property>
+   </bean>
+</deployment>

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/UnmodifiableGetterBean.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/UnmodifiableGetterBean.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/UnmodifiableGetterBean.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -0,0 +1,94 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.kernel.config.support;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Collection;
+
+/**
+ * An unmodifiable getter bean.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+ at SuppressWarnings("unchecked")
+public class UnmodifiableGetterBean implements Serializable
+{
+   private Collection collection = new CustomCollection(true);
+   private List list = new CustomList(true);
+   private Set set = new CustomSet(true);
+   private Map map = new CustomMap(true);
+   private String[] array = new String[]{"aa", "ab", "ac"};
+
+   public Collection getCollection()
+   {
+      return Collections.unmodifiableCollection(collection);
+   }
+
+   public void setCollection(Collection collection)
+   {
+      this.collection = collection;
+   }
+
+   public List getList()
+   {
+      return Collections.unmodifiableList(list);
+   }
+
+   public void setList(List list)
+   {
+      this.list = list;
+   }
+
+   public Set getSet()
+   {
+      return Collections.unmodifiableSet(set);
+   }
+
+   public void setSet(Set set)
+   {
+      this.set = set;
+   }
+
+   public Map getMap()
+   {
+      return Collections.unmodifiableMap(map);
+   }
+
+   public void setMap(Map map)
+   {
+      this.map = map;
+   }
+
+   public String[] getArray()
+   {
+      return array;
+   }
+
+   public void setArray(String[] array)
+   {
+      this.array = array;
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/CollectionTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/CollectionTestCase.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/CollectionTestCase.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -24,6 +24,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Iterator;
 
 import org.jboss.beans.metadata.plugins.*;
 import org.jboss.beans.metadata.spi.PropertyMetaData;
@@ -33,6 +34,7 @@
 import org.jboss.test.kernel.config.support.CustomCollection;
 import org.jboss.test.kernel.config.support.MyObject;
 import org.jboss.test.kernel.config.support.SimpleBean;
+import org.jboss.test.kernel.config.support.UnmodifiableGetterBean;
 
 import junit.framework.Test;
 
@@ -288,6 +290,56 @@
       return (SimpleBean) instantiate(controller, bmd);
    }
 
+   public void testUnmodifiableCollectionPreInstantiated() throws Throwable
+   {
+      UnmodifiableGetterBean bean = unmodifiableCollectionPreInstantiated();
+      assertNotNull(bean);
+
+      Collection result = bean.getCollection();
+      assertNotNull("Should be a collection", result);
+
+      Collection<Object> expected = new ArrayList<Object>();
+      expected.add(string1);
+      expected.add(string2);
+      expected.add(string2);
+      expected.add(string1);
+
+      assertEquals(expected.size(), result.size());
+      Iterator i1 = expected.iterator();
+      Iterator i2 = result.iterator();
+      while(i1.hasNext() && i2.hasNext())
+      {
+         assertEquals(i1.next(), i2.next());
+      }
+   }
+
+   protected UnmodifiableGetterBean unmodifiableCollectionPreInstantiated() throws Throwable
+   {
+      Kernel kernel = bootstrap();
+      KernelController controller = kernel.getController();
+
+      AbstractBeanMetaData bmd = new AbstractBeanMetaData("test1", UnmodifiableGetterBean.class.getName());
+      HashSet<PropertyMetaData> properties = new HashSet<PropertyMetaData>();
+      bmd.setProperties(properties);
+
+      StringValueMetaData vmd1 = new StringValueMetaData(string1);
+      StringValueMetaData vmd2 = new StringValueMetaData(string2);
+      StringValueMetaData vmd3 = new StringValueMetaData(string1);
+
+      AbstractCollectionMetaData smd = new AbstractCollectionMetaData();
+      smd.setElementType("java.lang.String");
+      smd.add(vmd1);
+      smd.add(vmd2);
+      smd.add(vmd2); // tests duplicates
+      smd.add(vmd3); // tests duplicates
+
+      AbstractPropertyMetaData pmd = new AbstractPropertyMetaData("collection", smd);
+      pmd.setPreInstantiate(false);
+      properties.add(pmd);
+
+      return (UnmodifiableGetterBean) instantiate(controller, bmd);
+   }
+
    public void testCollectionWithValueTypeOverride() throws Throwable
    {
       SimpleBean bean = collectionWithValueTypeOverride();

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/CollectionXMLTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/CollectionXMLTestCase.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/CollectionXMLTestCase.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -25,6 +25,7 @@
 
 import org.jboss.test.kernel.config.support.SimpleBean;
 import org.jboss.test.kernel.config.support.XMLUtil;
+import org.jboss.test.kernel.config.support.UnmodifiableGetterBean;
 
 /**
  * Collection Test Case.
@@ -74,6 +75,12 @@
       return (SimpleBean) util.getBean("SimpleBean");
    }
 
+   protected UnmodifiableGetterBean unmodifiableCollectionPreInstantiated() throws Throwable
+   {
+      XMLUtil util = bootstrapXML(true);
+      return (UnmodifiableGetterBean) util.getBean("SimpleBean");
+   }
+
    protected SimpleBean collectionWithValueTypeOverride() throws Throwable
    {
       XMLUtil util = bootstrapXML(true);

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/ListTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/ListTestCase.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/ListTestCase.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -33,6 +33,7 @@
 import org.jboss.test.kernel.config.support.CustomList;
 import org.jboss.test.kernel.config.support.MyObject;
 import org.jboss.test.kernel.config.support.SimpleBean;
+import org.jboss.test.kernel.config.support.UnmodifiableGetterBean;
 
 import junit.framework.Test;
 
@@ -288,6 +289,49 @@
       return (SimpleBean) instantiate(controller, bmd);
    }
 
+   public void testUnmodifiableListPreInstantiated() throws Throwable
+   {
+      UnmodifiableGetterBean bean = unmodifiableListPreInstantiated();
+      assertNotNull(bean);
+
+      List result = bean.getList();
+      assertNotNull("Should be a list", result);
+
+      ArrayList<Object> expected = new ArrayList<Object>();
+      expected.add(string1);
+      expected.add(string2);
+      expected.add(string2);
+      expected.add(string1);
+      assertEquals(expected, result);
+   }
+
+   protected UnmodifiableGetterBean unmodifiableListPreInstantiated() throws Throwable
+   {
+      Kernel kernel = bootstrap();
+      KernelController controller = kernel.getController();
+
+      AbstractBeanMetaData bmd = new AbstractBeanMetaData("test1", UnmodifiableGetterBean.class.getName());
+      HashSet<PropertyMetaData> properties = new HashSet<PropertyMetaData>();
+      bmd.setProperties(properties);
+
+      StringValueMetaData vmd1 = new StringValueMetaData(string1);
+      StringValueMetaData vmd2 = new StringValueMetaData(string2);
+      StringValueMetaData vmd3 = new StringValueMetaData(string1);
+
+      AbstractListMetaData smd = new AbstractListMetaData();
+      smd.setElementType("java.lang.String");
+      smd.add(vmd1);
+      smd.add(vmd2);
+      smd.add(vmd2); // tests duplicates
+      smd.add(vmd3); // tests duplicates
+
+      AbstractPropertyMetaData pmd1 = new AbstractPropertyMetaData("list", smd);
+      pmd1.setPreInstantiate(false);
+      properties.add(pmd1);
+
+      return (UnmodifiableGetterBean) instantiate(controller, bmd);
+   }
+
    public void testListWithValueTypeOverride() throws Throwable
    {
       SimpleBean bean = listWithValueTypeOverride();

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/ListXMLTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/ListXMLTestCase.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/ListXMLTestCase.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -25,6 +25,7 @@
 
 import org.jboss.test.kernel.config.support.SimpleBean;
 import org.jboss.test.kernel.config.support.XMLUtil;
+import org.jboss.test.kernel.config.support.UnmodifiableGetterBean;
 
 /**
  * List Test Case.
@@ -74,6 +75,12 @@
       return (SimpleBean) util.getBean("SimpleBean");
    }
 
+   protected UnmodifiableGetterBean unmodifiableListPreInstantiated() throws Throwable
+   {
+      XMLUtil util = bootstrapXML(true);
+      return (UnmodifiableGetterBean) util.getBean("SimpleBean");
+   }
+
    protected SimpleBean listWithValueTypeOverride() throws Throwable
    {
       XMLUtil util = bootstrapXML(true);

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/MapTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/MapTestCase.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/MapTestCase.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -33,6 +33,7 @@
 import org.jboss.test.kernel.config.support.CustomMap;
 import org.jboss.test.kernel.config.support.MyObject;
 import org.jboss.test.kernel.config.support.SimpleBean;
+import org.jboss.test.kernel.config.support.UnmodifiableGetterBean;
 
 import junit.framework.Test;
 
@@ -279,6 +280,47 @@
       return (SimpleBean) instantiate(controller, bmd);
    }
 
+   public void testUnmodifiableMapPreInstantiated() throws Throwable
+   {
+      UnmodifiableGetterBean bean = unmodifiableMapPreInstantiated();
+      assertNotNull(bean);
+
+      Map result = bean.getMap();
+      assertNotNull("Should be a map", result);
+
+      Map<Object, Object> expected = new HashMap<Object, Object>();
+      expected.put(string1, string2);
+      expected.put(string2, string1);
+      assertEquals(expected, result);
+   }
+
+   protected UnmodifiableGetterBean unmodifiableMapPreInstantiated() throws Throwable
+   {
+      Kernel kernel = bootstrap();
+      KernelController controller = kernel.getController();
+
+      AbstractBeanMetaData bmd = new AbstractBeanMetaData("test1", UnmodifiableGetterBean.class.getName());
+      HashSet<PropertyMetaData> properties = new HashSet<PropertyMetaData>();
+      bmd.setProperties(properties);
+
+      StringValueMetaData kmd1 = new StringValueMetaData(string1);
+      StringValueMetaData kmd2 = new StringValueMetaData(string2);
+      StringValueMetaData vmd1 = new StringValueMetaData(string2);
+      StringValueMetaData vmd2 = new StringValueMetaData(string1);
+
+      AbstractMapMetaData smd = new AbstractMapMetaData();
+      smd.setKeyType("java.lang.String");
+      smd.setValueType("java.lang.String");
+      smd.put(kmd1, vmd1);
+      smd.put(kmd2, vmd2);
+
+      AbstractPropertyMetaData pmd = new AbstractPropertyMetaData("map", smd);
+      pmd.setPreInstantiate(false);
+      properties.add(pmd);
+
+      return (UnmodifiableGetterBean) instantiate(controller, bmd);
+   }
+
    public void testMapWithKeyTypeOverride() throws Throwable
    {
       SimpleBean bean = mapWithKeyTypeOverride();

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/MapXMLTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/MapXMLTestCase.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/MapXMLTestCase.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -25,6 +25,7 @@
 
 import org.jboss.test.kernel.config.support.SimpleBean;
 import org.jboss.test.kernel.config.support.XMLUtil;
+import org.jboss.test.kernel.config.support.UnmodifiableGetterBean;
 
 /**
  * Map Test Case.
@@ -74,6 +75,12 @@
       return (SimpleBean) util.getBean("SimpleBean");
    }
 
+   protected UnmodifiableGetterBean unmodifiableMapPreInstantiated() throws Throwable
+   {
+      XMLUtil util = bootstrapXML(true);
+      return (UnmodifiableGetterBean) util.getBean("SimpleBean");
+   }
+
    protected SimpleBean mapWithKeyTypeOverride() throws Throwable
    {
       XMLUtil util = bootstrapXML(true);

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/SetTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/SetTestCase.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/SetTestCase.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -32,6 +32,7 @@
 import org.jboss.test.kernel.config.support.CustomSet;
 import org.jboss.test.kernel.config.support.MyObject;
 import org.jboss.test.kernel.config.support.SimpleBean;
+import org.jboss.test.kernel.config.support.UnmodifiableGetterBean;
 
 import junit.framework.Test;
 
@@ -287,6 +288,49 @@
       return (SimpleBean) instantiate(controller, bmd);
    }
 
+   public void testUnmodifiableSetPreInstantiated() throws Throwable
+   {
+      UnmodifiableGetterBean bean = unmodifiableSetPreInstantiated();
+      assertNotNull(bean);
+
+      Set result = bean.getSet();
+      assertNotNull("Should be a set", result);
+
+      HashSet<Object> expected = new HashSet<Object>();
+      expected.add(string1);
+      expected.add(string2);
+      expected.add(string2);
+      expected.add(string1);
+      assertEquals(expected, result);
+   }
+
+   protected UnmodifiableGetterBean unmodifiableSetPreInstantiated() throws Throwable
+   {
+      Kernel kernel = bootstrap();
+      KernelController controller = kernel.getController();
+
+      AbstractBeanMetaData bmd = new AbstractBeanMetaData("test1", UnmodifiableGetterBean.class.getName());
+      HashSet<PropertyMetaData> properties = new HashSet<PropertyMetaData>();
+      bmd.setProperties(properties);
+
+      StringValueMetaData vmd1 = new StringValueMetaData(string1);
+      StringValueMetaData vmd2 = new StringValueMetaData(string2);
+      StringValueMetaData vmd3 = new StringValueMetaData(string1);
+
+      AbstractSetMetaData smd = new AbstractSetMetaData();
+      smd.setElementType("java.lang.String");
+      smd.add(vmd1);
+      smd.add(vmd2);
+      smd.add(vmd2); // tests duplicates
+      smd.add(vmd3); // tests duplicates
+
+      AbstractPropertyMetaData pmd = new AbstractPropertyMetaData("set", smd);
+      pmd.setPreInstantiate(false);
+      properties.add(pmd);
+
+      return (UnmodifiableGetterBean) instantiate(controller, bmd);
+   }
+
    public void testSetWithValueTypeOverride() throws Throwable
    {
       SimpleBean bean = setWithValueTypeOverride();

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/SetXMLTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/SetXMLTestCase.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/SetXMLTestCase.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -25,6 +25,7 @@
 
 import org.jboss.test.kernel.config.support.SimpleBean;
 import org.jboss.test.kernel.config.support.XMLUtil;
+import org.jboss.test.kernel.config.support.UnmodifiableGetterBean;
 
 /**
  * Set Test Case.
@@ -74,6 +75,12 @@
       return (SimpleBean) util.getBean("SimpleBean");
    }
 
+   protected UnmodifiableGetterBean unmodifiableSetPreInstantiated() throws Throwable
+   {
+      XMLUtil util = bootstrapXML(true);
+      return (UnmodifiableGetterBean) util.getBean("SimpleBean");
+   }
+
    protected SimpleBean setWithValueTypeOverride() throws Throwable
    {
       XMLUtil util = bootstrapXML(true);

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/PropertyTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/PropertyTestCase.java	2007-07-04 13:56:31 UTC (rev 63821)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/PropertyTestCase.java	2007-07-04 14:52:02 UTC (rev 63822)
@@ -111,6 +111,15 @@
       assertPlainValue("PlainValue", property.getValue());
    }
    
+   public void testPropertyWithPreInstantiate() throws Exception
+   {
+      PropertyMetaData property = getProperty("PropertyWithPreInstantiate.xml");
+      assertFalse("PreInstantiate should be false.", property.isPreInstantiate());
+      assertNotNull("PropertyName", property.getName());
+      assertNull(property.getAnnotations());
+      assertPlainValue("PlainValue", property.getValue());
+   }
+
    public void testPropertyWithValue() throws Exception
    {
       PropertyMetaData property = getProperty("PropertyWithValue.xml");




More information about the jboss-cvs-commits mailing list