[Jboss-cvs] JBossAS SVN: r56338 - in projects/microcontainer/trunk/kernel/src: main/org/jboss/beans/metadata/plugins resources/xml-test/org/jboss/test/kernel/config/test tests/org/jboss/test/kernel/config/support tests/org/jboss/test/kernel/config/test

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Aug 28 09:29:03 EDT 2006


Author: alesj
Date: 2006-08-28 09:28:42 -0400 (Mon, 28 Aug 2006)
New Revision: 56338

Added:
   projects/microcontainer/trunk/kernel/src/resources/xml-test/org/jboss/test/kernel/config/test/testCustomCollectionPreinstantiated.xml
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/AbstractMapMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractTypeMetaData.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/CustomCollection.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/SimpleBean.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/CollectionTestCase.java
Log:
JBMICROCONT-35

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	2006-08-28 12:39:10 UTC (rev 56337)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractArrayMetaData.java	2006-08-28 13:28:42 UTC (rev 56338)
@@ -74,7 +74,7 @@
          // Try to use the passed type
          typeInfo = info;
       }
-      
+
       Object[] array = new Object[result.size()];
       if (typeInfo != null)
          array = typeInfo.newArrayInstance(result.size());
@@ -84,7 +84,19 @@
 
    protected Collection<Object> getCollectionInstance(TypeInfo info, ClassLoader cl, Class expected) throws Throwable
    {
-      return new ArrayList<Object>();
+      Collection<Object> result = new ArrayList<Object>();
+      Object preinstantiatedObject = preinstantiatedLookup(cl, null);
+      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;
    }
 
    public void toString(JBossStringBuilder buffer)

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	2006-08-28 12:39:10 UTC (rev 56337)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractCollectionMetaData.java	2006-08-28 13:28:42 UTC (rev 56338)
@@ -201,37 +201,41 @@
    @SuppressWarnings("unchecked")
    protected Collection<Object> getCollectionInstance(TypeInfo info, ClassLoader cl, Class<?> expected) throws Throwable
    {
-      TypeInfo typeInfo = getClassInfo(cl);
+      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 && 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 && ((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;
+         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());
       }
-
-      BeanInfo beanInfo = configurator.getBeanInfo(typeInfo);
-      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 (Collection<Object>) result;
    }
 

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	2006-08-28 12:39:10 UTC (rev 56337)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractMapMetaData.java	2006-08-28 13:28:42 UTC (rev 56338)
@@ -241,37 +241,41 @@
    @SuppressWarnings("unchecked")
    protected Map<Object, Object> getMapInstance(TypeInfo info, ClassLoader cl, Class<?> expected) throws Throwable
    {
-      TypeInfo typeInfo = getClassInfo(cl);
+      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 && 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 && ((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;
+         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());
       }
-
-      BeanInfo beanInfo = configurator.getBeanInfo(typeInfo);
-      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 (Map<Object, Object>) result;
    }
 

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	2006-08-28 12:39:10 UTC (rev 56337)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractTypeMetaData.java	2006-08-28 13:28:42 UTC (rev 56338)
@@ -21,10 +21,15 @@
 */
 package org.jboss.beans.metadata.plugins;
 
+import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.MetaDataVisitor;
+import org.jboss.beans.metadata.spi.PropertyMetaData;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.joinpoint.spi.TargettedJoinpoint;
+import org.jboss.kernel.plugins.config.Configurator;
 import org.jboss.kernel.spi.config.KernelConfigurator;
+import org.jboss.kernel.spi.dependency.KernelController;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
-import org.jboss.kernel.plugins.config.Configurator;
 import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.util.JBossStringBuilder;
 
@@ -38,9 +43,19 @@
 {
    /** The type */
    protected String type;
-   
+
    /** The configurator */
+   protected KernelController controller;
+
+   /** The configurator */
    protected KernelConfigurator configurator;
+
+   /** The property name */
+   protected String propertyName;
+
+   /** The bean name */
+   protected String beanName;
+
    /**
     * Create a new typed value
     */
@@ -75,10 +90,57 @@
 
    public void initialVisit(MetaDataVisitor visitor)
    {
+      controller = (KernelController) visitor.getControllerContext().getController();
       configurator = visitor.getControllerContext().getKernel().getConfigurator();
+      preparePreinstantiatedLookup(visitor);
       visitor.initialVisit(this);
    }
 
+   private void preparePreinstantiatedLookup(MetaDataVisitor visitor)
+   {
+      Object parent = visitor.visitorNodeStack().pop();
+      try
+      {
+         if (parent instanceof PropertyMetaData)
+         {
+            PropertyMetaData pmd = (PropertyMetaData) parent;
+            propertyName = pmd.getName();
+            Object gp = visitor.visitorNodeStack().peek();
+            if (gp instanceof BeanMetaData)
+            {
+               BeanMetaData bmd = (BeanMetaData) gp;
+               beanName = bmd.getName();
+            }
+         }
+      }
+      finally
+      {
+         visitor.visitorNodeStack().push(parent);
+      }
+   }
+
+   protected Object preinstantiatedLookup(ClassLoader cl, Class expected)
+   {
+      try
+      {
+         if (propertyName != null && beanName != null)
+         {
+            KernelControllerContext context = (KernelControllerContext) controller.getContext(beanName, ControllerState.INSTANTIATED);
+            TargettedJoinpoint joinpoint = configurator.getPropertyGetterJoinPoint(context.getBeanInfo(), propertyName);
+            joinpoint.setTarget(context.getTarget());
+            Object result = joinpoint.dispatch();
+            if (result != null && expected != null && expected.isAssignableFrom(result.getClass()) == false)
+               throw new ClassCastException(result.getClass() + " is not a " + expected.getName());
+            return result;
+         }
+      }
+      catch (Throwable t)
+      {
+         log.warn("Exception in preinstantiated lookup: " + t, t);
+      }
+      return null;
+   }
+
    /**
     * Set the configurator
     * 
@@ -88,14 +150,14 @@
    {
       this.configurator = configurator;
    }
-   
+
    public void toString(JBossStringBuilder buffer)
    {
       super.toString(buffer);
       if (type != null)
          buffer.append(" type=").append(type);
    }
-   
+
    /**
     * Get the class info for this type
     * 

Added: projects/microcontainer/trunk/kernel/src/resources/xml-test/org/jboss/test/kernel/config/test/testCustomCollectionPreinstantiated.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/xml-test/org/jboss/test/kernel/config/test/testCustomCollectionPreinstantiated.xml	2006-08-28 12:39:10 UTC (rev 56337)
+++ projects/microcontainer/trunk/kernel/src/resources/xml-test/org/jboss/test/kernel/config/test/testCustomCollectionPreinstantiated.xml	2006-08-28 13:28:42 UTC (rev 56338)
@@ -0,0 +1,18 @@
+<?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.SimpleBean">
+      <constructor>
+         <parameter>string1</parameter>
+      </constructor>
+      <property name="preInstantiatedCollection">
+         <collection class="org.jboss.test.kernel.config.support.CustomCollection" elementClass="java.lang.String">
+            <value>string2</value>
+            <value>string2</value>
+            <value>string1</value>
+         </collection>
+      </property>
+   </bean>
+</deployment>

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/CustomCollection.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/CustomCollection.java	2006-08-28 12:39:10 UTC (rev 56337)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/CustomCollection.java	2006-08-28 13:28:42 UTC (rev 56338)
@@ -39,11 +39,12 @@
    
    public CustomCollection()
    {
+      this.preInstantiated = true;
    }
    
    public CustomCollection(boolean preInstantiated)
    {
-      this.preInstantiated = true;
+      this.preInstantiated = preInstantiated;      
    }
    
    public boolean getPreInstantiated()

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/SimpleBean.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/SimpleBean.java	2006-08-28 12:39:10 UTC (rev 56337)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/SimpleBean.java	2006-08-28 13:28:42 UTC (rev 56338)
@@ -158,6 +158,7 @@
    {
       constructorUsed = string;
       aString = string;
+      preInstantiatedCollection.add(string);
    }
 
    public SimpleBean(Integer integer)

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	2006-08-28 12:39:10 UTC (rev 56337)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/CollectionTestCase.java	2006-08-28 13:28:42 UTC (rev 56338)
@@ -25,13 +25,7 @@
 import java.util.Collection;
 import java.util.HashSet;
 
-import junit.framework.Test;
-
-import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
-import org.jboss.beans.metadata.plugins.AbstractCollectionMetaData;
-import org.jboss.beans.metadata.plugins.AbstractPropertyMetaData;
-import org.jboss.beans.metadata.plugins.AbstractValueMetaData;
-import org.jboss.beans.metadata.plugins.StringValueMetaData;
+import org.jboss.beans.metadata.plugins.*;
 import org.jboss.beans.metadata.spi.PropertyMetaData;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.spi.config.KernelConfigurator;
@@ -39,6 +33,8 @@
 import org.jboss.test.kernel.config.support.MyObject;
 import org.jboss.test.kernel.config.support.SimpleBean;
 
+import junit.framework.Test;
+
 /**
  * Collection Test Case.
  * 
@@ -240,7 +236,7 @@
    /*
     * @todo - allow retrieval of collection instance from the bean
     */
-   public void TODOtestCustomCollectionPreInstantiated() throws Throwable
+   public void testCustomCollectionPreInstantiated() throws Throwable
    {
       SimpleBean bean = customCollectionPreInstantiated();
       assertNotNull(bean);




More information about the jboss-cvs-commits mailing list