[jboss-cvs] JBossAS SVN: r80512 - in projects/jboss-man/trunk/managed: src/main/java/org/jboss/managed/api/annotation and 11 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Nov 4 13:39:17 EST 2008


Author: scott.stark at jboss.org
Date: 2008-11-04 13:39:17 -0500 (Tue, 04 Nov 2008)
New Revision: 80512

Added:
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/DefaultInstanceClassFactory.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/ManagementPropertyClass.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/ManagementPropertyClassAndExplicit.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/SimpleUnannotated.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/mcf/LocalDSInstanceClassFactory.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/mcf/NoTxICF.java
Modified:
   projects/jboss-man/trunk/managed/.classpath
   projects/jboss-man/trunk/managed/pom.xml
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/annotation/ManagementObject.java
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/annotation/ManagementProperties.java
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/factory/ManagedObjectFactory.java
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/WritethroughManagedPropertyImpl.java
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractInstanceClassFactory.java
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractManagedObjectFactory.java
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractManagedObjectPopulator.java
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/Utility.java
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/InstanceClassFactory.java
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/ManagedObjectBuilder.java
   projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/ManagedObjectPopulator.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/AbstractManagedObjectFactoryTest.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/ManagementObjectWithRuntimeRefICF.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestICF.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestMOP.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestSimpleICF.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/beans/BeanMetaDataICF.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/deployment/JmsDestinationICF.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/deployment/SecDomainICF.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/test/AbstractManagedObjectFactoryUnitTestCase.java
   projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/test/ManagementObjectPropertiesUnitTestCase.java
Log:
JBMAN-32, update managed object factory related interfaces to accept a MetaData repository

Modified: projects/jboss-man/trunk/managed/.classpath
===================================================================
--- projects/jboss-man/trunk/managed/.classpath	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/.classpath	2008-11-04 18:39:17 UTC (rev 80512)
@@ -18,5 +18,7 @@
 	<classpathentry kind="var" path="M2_REPO/junit/junit/4.4/junit-4.4.jar" sourcepath="M2_REPO/junit/junit/4.4/junit-4.4-sources.jar"/>
 	<classpathentry kind="var" path="M2_REPO/apache-log4j/log4j/1.2.14/log4j-1.2.14.jar" sourcepath="M2_REPO/apache-log4j/log4j/1.2.14/log4j-1.2.14-sources.jar"/>
 	<classpathentry kind="var" path="M2_REPO/sun-jaxb/jaxb-api/2.1.4/jaxb-api-2.1.4.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/jboss/jboss-mdr/2.0.0.GA/jboss-mdr-2.0.0.GA.jar" sourcepath="/M2_REPO/org/jboss/jboss-mdr/2.0.0.GA/jboss-mdr-2.0.0.GA-sources.jar"/>
+	<classpathentry kind="var" path="M2_REPO/javassist/javassist/3.9.0.GA/javassist-3.9.0.GA.jar" sourcepath="/M2_REPO/javassist/javassist/3.9.0.GA/javassist-3.9.0.GA-sources.jar"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>

Modified: projects/jboss-man/trunk/managed/pom.xml
===================================================================
--- projects/jboss-man/trunk/managed/pom.xml	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/pom.xml	2008-11-04 18:39:17 UTC (rev 80512)
@@ -33,6 +33,10 @@
       <groupId>org.jboss.man</groupId>
       <artifactId>jboss-metatype</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.jboss</groupId>
+      <artifactId>jboss-mdr</artifactId>
+    </dependency>
     <!-- Test dependencies -->
     <dependency>
       <groupId>sun-jaxb</groupId>
@@ -53,5 +57,10 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>javassist</groupId>
+      <artifactId>javassist</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/annotation/ManagementObject.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/annotation/ManagementObject.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/annotation/ManagementObject.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -75,9 +75,17 @@
    /** What properties to include */
    ManagementProperties properties() default ManagementProperties.ALL;
 
-   /** The exposed operations. If empty
-    * TODO: 
+   /**
+    * A class level specification of the management properties. Depending on the
+    * properties() value, this can either override or augment the ManagementProperty
+    * annotations found on the bean fields/methods.
+    * @return
     */
+   ManagementProperty[] classProperties() default {};
+
+   /** The exposed operations. If empty the operations will be obtained from
+    * the annotated bean in a bean type specific way.
+    */
    ManagementOperation[] operations() default {};
 
    /** The class to use for the ManagedProperty implementation */

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/annotation/ManagementProperties.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/annotation/ManagementProperties.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/annotation/ManagementProperties.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -25,13 +25,22 @@
  * ManagementProperities.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
- * @version $Revision: 1.1 $
+ * @author Scott.Stark at jboss.org
+ * @version $Revision$
  */
 public enum ManagementProperties
 {
    /** All properties by default */
    ALL,
    
-   /** Only annotated properties */
+   /** Only bean properties annotated with @ManagementProperty */
    EXPLICIT,
+
+   /** Only @ManagementProperty from the @ManagementObject class annotation */
+   CLASS,
+
+   /** Merge @ManagementProperty from the @ManagementObject class annotation
+    * and any bean properties annotated with @ManagementProperty
+    */
+   CLASS_AND_EXPLICIT
 }


Property changes on: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/annotation/ManagementProperties.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/factory/ManagedObjectFactory.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/factory/ManagedObjectFactory.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/api/factory/ManagedObjectFactory.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -21,13 +21,12 @@
 */
 package org.jboss.managed.api.factory;
 
-import java.io.Serializable;
-
 import org.jboss.managed.api.ManagedObject;
 import org.jboss.managed.api.annotation.ManagementObjectID;
 import org.jboss.managed.plugins.factory.ManagedObjectFactoryBuilder;
 import org.jboss.managed.spi.factory.InstanceClassFactory;
 import org.jboss.managed.spi.factory.ManagedObjectBuilder;
+import org.jboss.metadata.spi.MetaData;
 
 /**
  * ManagedObjectFactory.
@@ -64,14 +63,28 @@
     * @return the managed object
     * @throws IllegalArgumentException for a null object
     */
-   public abstract ManagedObject initManagedObject(Object instance, String name, String nameType);
-   public abstract ManagedObject initManagedObject(Serializable instance, String name, String nameType);
+   public ManagedObject initManagedObject(Object instance, String name, String nameType)
+   {
+      return initManagedObject(instance, null, name, nameType);
+   }
+   public ManagedObject initManagedObject(Object instance, Class<?> instanceType,
+         String name, String nameType)
+   {
+      return initManagedObject(instance, null, null, name, nameType);
+   }
+   public ManagedObject initManagedObject(Object instance, MetaData metaData)
+   {
+      return initManagedObject(instance, null, metaData, null, null);
+   }
 
    /**
     * Create a managed object from the given object
     * 
     * @param instance - the object to build the ManagedObject from
-    * @param instanceType - the type to determine InstanceClassFactory registration from
+    * @param instanceType - the optional type to determine InstanceClassFactory registration from.
+    * If not specified instance.getClass() is used.
+    * @param metaData - the optional metadata repository accessor used to query
+    * for management annotation overrides/additions to the clazz
     * @param name - the name of the managed object. If null, the name will
     *    be derived from the object annotations or attachment name.
     * @param nameType - the name of the managed object. If null, the name will
@@ -82,7 +95,7 @@
     * @return the managed object
     */
    public abstract ManagedObject initManagedObject(Object instance, Class<?> instanceType,
-         String name, String nameType);
+         MetaData metaData, String name, String nameType);
 
    /**
     * Create a shell managed object from the given class
@@ -92,7 +105,11 @@
     * @return the managed object
     * @throws IllegalArgumentException for a null class
     */
-   public abstract <T> ManagedObject createManagedObject(Class<T> clazz);
+   public <T> ManagedObject createManagedObject(Class<T> clazz)
+   {
+      return createManagedObject(clazz, null);
+   }
+   public abstract <T> ManagedObject createManagedObject(Class<T> clazz, MetaData metaData);
 
    /**
     * Set a managed object builder
@@ -111,6 +128,22 @@
     * management annotations.
     */
    public abstract <X> void setInstanceClassFactory(Class<X> clazz, InstanceClassFactory<X> factory);
+   /**
+    * Add an InstanceClassFactory. Calls setInstanceClassFactory(factory.getType(), factory);.
+    * @param factory - the factory used to obtain the class to scan for
+    */
+   public <X> void addInstanceClassFactory(InstanceClassFactory<X> factory)
+   {
+      setInstanceClassFactory(factory.getType(), factory);
+   }
+   /**
+    * Remove an InstanceClassFactory. Calls setInstanceClassFactory(factory.getType(), null);.
+    * @param factory
+    */
+   public <X> void removeInstanceClassFactory(InstanceClassFactory<X> factory)
+   {
+      setInstanceClassFactory(factory.getType(), null);
+   }
 
    /**
     * Get the InstanceClassFactory for an instance type.
@@ -120,5 +153,9 @@
     * @return the factory used to obtain the class to scan for
     * management annotations. 
     */
-   public abstract <T> InstanceClassFactory<T> getInstanceClassFactory(Class<T> clazz);
+   public <T> InstanceClassFactory<T> getInstanceClassFactory(Class<T> clazz)
+   {
+      return getInstanceClassFactory(clazz, null);
+   }
+   public abstract <T> InstanceClassFactory<T> getInstanceClassFactory(Class<T> clazz, MetaData metaData);
 }

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/WritethroughManagedPropertyImpl.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/WritethroughManagedPropertyImpl.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/WritethroughManagedPropertyImpl.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -104,7 +104,8 @@
             else
                metaValue = (MetaValue)value;
 
-            InstanceClassFactory icf = getObjectFactory().getInstanceClassFactory(attachment.getClass());
+            ManagedObjectFactory mof = getObjectFactory();
+            InstanceClassFactory icf = mof.getInstanceClassFactory(attachment.getClass(), null);
             BeanInfo beanInfo = propertyInfo.getBeanInfo();
             icf.setValue(beanInfo, this, attachment, metaValue);
          }

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractInstanceClassFactory.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractInstanceClassFactory.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractInstanceClassFactory.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -41,6 +41,7 @@
 import org.jboss.managed.api.factory.ManagedObjectFactory;
 import org.jboss.managed.spi.factory.InstanceClassFactory;
 import org.jboss.managed.spi.factory.RuntimeComponentNameTransformer;
+import org.jboss.metadata.spi.MetaData;
 import org.jboss.metatype.api.types.ArrayMetaType;
 import org.jboss.metatype.api.types.CollectionMetaType;
 import org.jboss.metatype.api.types.MetaType;
@@ -65,7 +66,7 @@
  * @author Scott.Stark at jboss.org
  * @version $Revision$
  */
-public class AbstractInstanceClassFactory<T>
+public abstract class AbstractInstanceClassFactory<T>
    implements InstanceClassFactory<T>
 {
    /** The configuration */
@@ -187,7 +188,8 @@
       return null;
    }
 
-   public MetaValue getValue(BeanInfo beanInfo, ManagedProperty property, T object)
+   public MetaValue getValue(BeanInfo beanInfo, ManagedProperty property,
+         MetaData metaData, T object)
    {
       String name = getPropertyName(property);
       PropertyInfo propertyInfo = beanInfo.getProperty(name);
@@ -216,7 +218,7 @@
       MetaType propertyType = property.getMetaType();
       if (AbstractManagedObjectFactory.MANAGED_OBJECT_META_TYPE == propertyType)
       {
-         GenericValue gvs = getManagedObjectValue(beanInfo, property, value);
+         GenericValue gvs = getManagedObjectValue(beanInfo, property, metaData, value);
          return gvs;
       }
       else if (propertyType.isArray())
@@ -226,7 +228,7 @@
          {
             ArrayMetaType moType = new ArrayMetaType(1, AbstractManagedObjectFactory.MANAGED_OBJECT_META_TYPE);
             ArrayValueSupport moArrayValue = new ArrayValueSupport(moType);
-            List<GenericValue> tmp = getManagedObjectArray(beanInfo, property, value);
+            List<GenericValue> tmp = getManagedObjectArray(beanInfo, property, metaData, value);
             GenericValue[] mos = new GenericValue[tmp.size()];
             moArrayValue.setValue(tmp.toArray(mos));
             return moArrayValue;
@@ -237,7 +239,7 @@
          CollectionMetaType collectionType = CollectionMetaType.class.cast(propertyType);
          if (AbstractManagedObjectFactory.MANAGED_OBJECT_META_TYPE == collectionType.getElementType())
          {
-            List<GenericValue> tmp = getManagedObjectArray(beanInfo, property, value);
+            List<GenericValue> tmp = getManagedObjectArray(beanInfo, property, metaData, value);
             GenericValue[] mos = new GenericValue[tmp.size()];
             CollectionMetaType moType = new CollectionMetaType(propertyType.getClassName(), AbstractManagedObjectFactory.MANAGED_OBJECT_META_TYPE);
             tmp.toArray(mos);
@@ -278,12 +280,19 @@
       }
    }
 
-   public GenericValue getManagedObjectValue(ManagedProperty property, ManagedObject value)
+   public GenericValue getManagedObjectValue(ManagedProperty property,
+         ManagedObject value)
+      {
+         return getManagedObjectValue(null, property, null, value);
+      }
+   public GenericValue getManagedObjectValue(ManagedProperty property, MetaData metaData,
+      ManagedObject value)
    {
-      return getManagedObjectValue(null, property, value);
+      return getManagedObjectValue(null, property, metaData, value);
    }
 
-   protected GenericValue getManagedObjectValue(BeanInfo beanInfo, ManagedProperty property, Object value)
+   protected GenericValue getManagedObjectValue(BeanInfo beanInfo, ManagedProperty property,
+      MetaData metaData, Object value)
    {
       // Look for a ManagementObjectRef
       ManagementObjectRef ref = (ManagementObjectRef) property.getAnnotations().get(ManagementObjectRef.class.getName());
@@ -293,7 +302,7 @@
       if(value instanceof ManagedObject)
          mo = ManagedObject.class.cast(value);
       else
-         mo = mof.initManagedObject(value, moName, moNameType);
+         mo = mof.initManagedObject(value, null, metaData, moName, moNameType);
       ManagedObject parentMO = property.getManagedObject();
       if(parentMO != null && mo instanceof MutableManagedObject)
       {
@@ -302,13 +311,14 @@
       }
       return new GenericValueSupport(AbstractManagedObjectFactory.MANAGED_OBJECT_META_TYPE, mo);
    }
-   protected List<GenericValue> getManagedObjectArray(BeanInfo beanInfo, ManagedProperty property, Object value)
+   protected List<GenericValue> getManagedObjectArray(BeanInfo beanInfo, ManagedProperty property,
+         MetaData metaData, Object value)
    {
       Collection<?> cvalue = getAsCollection(value);
       List<GenericValue> tmp = new ArrayList<GenericValue>();
       for(Object element : cvalue)
       {
-         GenericValue gv = getManagedObjectValue(beanInfo, property, element);
+         GenericValue gv = getManagedObjectValue(beanInfo, property, metaData, element);
          tmp.add(gv);
       }
       return tmp;
@@ -333,7 +343,7 @@
    protected void setManagedObject(BeanInfo beanInfo, PropertyInfo propertyInfo,
          T object, ManagedObject mo)
    {
-      throw new NotImplementedException("Use a custom InstanceClassFactory for now");
+      throw new NotImplementedException("Use a custom InstanceClassFactory, property="+propertyInfo);
    }
 
    /**

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractManagedObjectFactory.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractManagedObjectFactory.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractManagedObjectFactory.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -69,12 +69,14 @@
 import org.jboss.managed.spi.factory.ManagedParameterConstraintsPopulatorFactory;
 import org.jboss.managed.spi.factory.ManagedPropertyConstraintsPopulator;
 import org.jboss.managed.spi.factory.ManagedPropertyConstraintsPopulatorFactory;
+import org.jboss.metadata.spi.MetaData;
 import org.jboss.metatype.api.types.ArrayMetaType;
 import org.jboss.metatype.api.types.CollectionMetaType;
 import org.jboss.metatype.api.types.GenericMetaType;
 import org.jboss.metatype.api.types.MetaType;
 import org.jboss.metatype.api.types.MetaTypeFactory;
 import org.jboss.metatype.api.values.MetaValueFactory;
+import org.jboss.reflect.spi.AnnotatedInfo;
 import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.reflect.spi.MethodInfo;
 import org.jboss.reflect.spi.ParameterInfo;
@@ -146,7 +148,7 @@
    public AbstractManagedObjectFactory()
    {
       // Create an AbstractInstanceClassFactory as the default ICF
-      AbstractInstanceClassFactory<Serializable> icf = new AbstractInstanceClassFactory<Serializable>();
+      DefaultInstanceClassFactory icf = new DefaultInstanceClassFactory();
       icf.setMof(this);
       defaultInstanceFactory = icf;
       // Create an AbstractManagedObjectPopulator as the default
@@ -271,38 +273,31 @@
    }
 
    @Override
-   public <T> ManagedObject createManagedObject(Class<T> clazz)
+   public <T> ManagedObject createManagedObject(Class<T> clazz, MetaData metaData)
    {
       if (clazz == null)
          throw new IllegalArgumentException("Null class");
 
-      ManagedObject result = createSkeletonManagedObject(clazz);
+      ManagedObject result = createSkeletonManagedObject(clazz, metaData);
       ManagedObjectPopulator<T> populator = getPopulator(clazz);
-      populator.createObject(result, clazz);
+      populator.createObject(result, clazz, metaData);
       
       return result;
    }
 
-   @Override
-   public ManagedObject initManagedObject(Serializable instance, String name, String nameType)
-   {
-      Object obj = instance;
-      return initManagedObject(obj, name, nameType);
-   }
-   @Override
-   @SuppressWarnings("unchecked")
-   public ManagedObject initManagedObject(Object instance, String name, String nameType)
-   {
-      return initManagedObject(instance, instance.getClass(), name, nameType);
-   }
    public ManagedObject initManagedObject(Object instance, Class<?> instanceType,
-         String name, String nameType)
+         MetaData metaData, String name, String nameType)
    {
       if (instance == null)
-         throw new IllegalArgumentException("Null object");
+         throw new IllegalArgumentException("instance cannot be null");
 
       Class<?> clazz = instance.getClass();
-      InstanceClassFactory icf = getInstanceClassFactory(clazz);
+      InstanceClassFactory icf = defaultInstanceFactory;
+      if(instanceType != null && instanceType != clazz)
+         icf = getInstanceClassFactory(instanceType, metaData);
+      if(icf == defaultInstanceFactory)
+         icf = getInstanceClassFactory(clazz, metaData);
+
       Class<Object> moClass;
       try
       {
@@ -310,9 +305,16 @@
       }
       catch(ClassNotFoundException e)
       {
+         log.debug("Failed to load class for ManagedObject", e);
          return null;
       }
-      ManagedObject result = createSkeletonManagedObject(moClass);
+      if(moClass == null)
+      {
+         log.debug("ICF returned null class: "+instance);
+         return null;
+      }
+
+      ManagedObject result = createSkeletonManagedObject(moClass, metaData);
       if (result == null )
       {
          log.debug("Null ManagedObject created for: "+moClass);
@@ -322,7 +324,7 @@
       {
          MutableManagedObject mmo = (MutableManagedObject) result;
          ManagedObjectPopulator<Object> populator = getPopulator(moClass);
-         populator.populateManagedObject(mmo, instance);
+         populator.populateManagedObject(mmo, instance, metaData);
       }
 
       return result;
@@ -346,9 +348,15 @@
       synchronized (instanceFactories)
       {
          if (factory == null)
+         {
             instanceFactories.remove(clazz);
+            log.debug("Removed ICF for: "+clazz);
+         }
          else
+         {
             instanceFactories.put(clazz, factory);
+            log.debug("Set ICF for: "+clazz+", to: "+factory);
+         }
       }      
    }
 
@@ -361,30 +369,32 @@
     *    marked as a ManagementObject.
     * {@linkplain ManagementObject}
     */
-   protected <T> ManagedObject createSkeletonManagedObject(Class<T> clazz)
+   protected <T> ManagedObject createSkeletonManagedObject(Class<T> clazz, MetaData metaData)
    {
       if (clazz == null)
          throw new IllegalArgumentException("Null class");
 
       ManagedObjectBuilder builder = getBuilder(clazz);
-      return builder.buildManagedObject(clazz);
+      return builder.buildManagedObject(clazz, metaData);
    }
    
    /**
     * The ManagedObjectBuilder.buildManagedObject implementation. This is based
     * on the org.jboss.managed.api.annotation.* package annotations.
     * @param clazz the attachment class
+    * @param metaData - the optional metadata repository accessor used to query
+    * for management annotation overrides/additions to the clazz
     * @return the ManagementObject if clazz is properly annotated, null if
-    *    it does not have a ManagementObject annotation.
+    *    it does not have a ManagementObject annotation on the class or metaData
     */
    @SuppressWarnings("unchecked")
-   public ManagedObject buildManagedObject(Class<?> clazz)
+   public ManagedObject buildManagedObject(Class<?> clazz, MetaData metaData)
    {
       boolean trace = log.isTraceEnabled();
       BeanInfo beanInfo = configuration.getBeanInfo(clazz);
       ClassInfo classInfo = beanInfo.getClassInfo();
 
-      ManagementObject managementObject = classInfo.getUnderlyingAnnotation(ManagementObject.class);
+      ManagementObject managementObject = getAnnotation(ManagementObject.class, classInfo, metaData);
       if( managementObject == null )
       {
          if (trace)
@@ -395,10 +405,10 @@
 
       HashMap<String, Annotation> moAnnotations = new HashMap<String, Annotation>();
       moAnnotations.put(ManagementObject.class.getName(), managementObject);
-      ManagementDeployment mnagementDeployment = classInfo.getUnderlyingAnnotation(ManagementDeployment.class);
+      ManagementDeployment mnagementDeployment = getAnnotation(ManagementDeployment.class, classInfo, metaData);
       if(mnagementDeployment != null)
          moAnnotations.put(ManagementDeployment.class.getName(), mnagementDeployment);
-      ManagementObjectID moID = classInfo.getUnderlyingAnnotation(ManagementObjectID.class);
+      ManagementObjectID moID = getAnnotation(ManagementObjectID.class, classInfo, metaData);
       if (moID != null)
          moAnnotations.put(ManagementObjectID.class.getName(), moID);
 
@@ -423,7 +433,9 @@
             attachmentName = classInfo.getName();
          // Check for a component specification
          ManagementComponent mc = managementObject.componentType();
-         if (mc.equals(AnnotationDefaults.COMP_TYPE) == false)
+         // Work around JBMDR-51 by checking type/subtype
+         // if (mc.equals(AnnotationDefaults.COMP_TYPE) == false)
+         if (mc.type().length() > 0 || mc.subtype().length() > 0)
             moAnnotations.put(ManagementComponent.class.getName(), mc);
          // ManagementObject level default factory classes
          moFieldsFactory = managementObject.fieldsFactory();
@@ -438,8 +450,22 @@
       }
 
       ManagementProperties propertyType = ManagementProperties.ALL;
+      Set<String> classProperties = null;
       if (managementObject != null)
+      {
          propertyType = managementObject.properties();
+         if(propertyType == ManagementProperties.CLASS || propertyType == ManagementProperties.CLASS_AND_EXPLICIT)
+         {
+            classProperties = new HashSet<String>();
+            for(ManagementProperty mp : managementObject.classProperties())
+            {
+               if(mp.name().length() > 0)
+                  classProperties.add(mp.name());
+               if(mp.mappedName().length() > 0)
+                  classProperties.add(mp.mappedName());
+            }
+         }
+      }
 
       // Build the ManagedProperties
       Set<ManagedProperty> properties = new HashSet<ManagedProperty>();
@@ -453,10 +479,10 @@
             if ("class".equals(propertyInfo.getName()))
                continue;
 
-            ManagementProperty managementProperty = propertyInfo.getUnderlyingAnnotation(ManagementProperty.class);
-            ManagementObjectID id = propertyInfo.getUnderlyingAnnotation(ManagementObjectID.class);
-            ManagementObjectRef ref = propertyInfo.getUnderlyingAnnotation(ManagementObjectRef.class);
-            ManagementRuntimeRef runtimeRef = propertyInfo.getUnderlyingAnnotation(ManagementRuntimeRef.class);
+            ManagementProperty managementProperty = getAnnotation(ManagementProperty.class, propertyInfo, metaData);
+            ManagementObjectID id = getAnnotation(ManagementObjectID.class, propertyInfo, metaData);
+            ManagementObjectRef ref = getAnnotation(ManagementObjectRef.class, propertyInfo, metaData);
+            ManagementRuntimeRef runtimeRef = getAnnotation(ManagementRuntimeRef.class, propertyInfo, metaData);
             HashMap<String, Annotation> propAnnotations = new HashMap<String, Annotation>();
             if (managementProperty != null)
                propAnnotations.put(ManagementProperty.class.getName(), managementProperty);
@@ -471,10 +497,30 @@
             if (runtimeRef != null)
                propAnnotations.put(ManagementRuntimeRef.class.getName(), runtimeRef);
 
-            // Check for a simple property
-            boolean includeProperty = (propertyType == ManagementProperties.ALL);
-            if (managementProperty != null)
-               includeProperty = (managementProperty.ignored() == false);
+            // Check whether this property should be included
+            boolean includeProperty = false;
+            switch(propertyType)
+            {
+               // Only if the property as a ManagementProperty
+               case EXPLICIT:
+                  includeProperty = managementProperty != null &&
+                  (managementProperty.ignored() == false);
+               break;
+               // Only if the property is listed in the classProperties
+               case CLASS:
+                  includeProperty = classProperties.contains(propertyInfo.getName());
+               break;
+               // Only if the property is listed in the classProperties
+               case CLASS_AND_EXPLICIT:
+                  includeProperty = classProperties.contains(propertyInfo.getName())
+                     || (managementProperty != null && managementProperty.ignored() == false);
+               break;
+               // Any property that is not ignored
+               case ALL:
+                  includeProperty = managementProperty == null
+                     || managementProperty.ignored() == false;
+               break;
+            }
 
             if (includeProperty)
             {
@@ -612,7 +658,7 @@
       {
          for (MethodInfo methodInfo : methodInfos)
          {
-            ManagementOperation managementOp = methodInfo.getUnderlyingAnnotation(ManagementOperation.class);
+            ManagementOperation managementOp = getAnnotation(ManagementOperation.class, methodInfo, metaData);
             if (managementOp == null)
                continue;
 
@@ -757,11 +803,19 @@
     * @return the InstanceClassFactory
     */
    @SuppressWarnings("unchecked")
-   public <X> InstanceClassFactory<X> getInstanceClassFactory(Class<X> clazz)
+   public <X> InstanceClassFactory<X> getInstanceClassFactory(Class<X> clazz,
+         MetaData metaData)
    {
+      InstanceClassFactory defaultFactory = defaultInstanceFactory;
+      if(metaData != null)
+      {
+         InstanceClassFactory mdrFactory = metaData.getMetaData(InstanceClassFactory.class);
+         if(mdrFactory != null)
+            defaultFactory = mdrFactory;
+      }
       InstanceClassFactory<X> factory = (InstanceClassFactory<X>)
          Utility.getInstanceClassFactory(clazz, instanceFactories,
-            defaultInstanceFactory);
+               defaultFactory);
       return factory;
    }
 
@@ -800,4 +854,19 @@
    {
       return createManagedProperty(factory, fields);
    }
+
+   protected <X extends Annotation> X getAnnotation(Class<X> annotationType,
+      AnnotatedInfo info, MetaData metaData)
+   {
+      X annotation = null;
+      if(metaData != null)
+      {
+         annotation = metaData.getAnnotation(annotationType);
+         if(annotation != null)
+            log.trace("Loaded "+annotationType+" from MetaData");
+      }
+      if(annotation == null)
+         annotation = info.getUnderlyingAnnotation(annotationType);
+      return annotation;
+   }
 }

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractManagedObjectPopulator.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractManagedObjectPopulator.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/AbstractManagedObjectPopulator.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -21,7 +21,6 @@
  */
 package org.jboss.managed.plugins.factory;
 
-import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.util.Map;
 
@@ -34,9 +33,9 @@
 import org.jboss.managed.api.MutableManagedObject;
 import org.jboss.managed.api.annotation.ManagementObjectID;
 import org.jboss.managed.api.annotation.ManagementRuntimeRef;
-import org.jboss.managed.plugins.ManagedObjectImpl;
 import org.jboss.managed.spi.factory.InstanceClassFactory;
 import org.jboss.managed.spi.factory.ManagedObjectPopulator;
+import org.jboss.metadata.spi.MetaData;
 import org.jboss.metatype.api.values.MetaValue;
 import org.jboss.metatype.api.values.SimpleValue;
 
@@ -105,6 +104,10 @@
 
    public void createObject(ManagedObject managedObject, Class<T> clazz)
    {
+      createObject(managedObject, clazz, null);
+   }
+   public void createObject(ManagedObject managedObject, Class<T> clazz, MetaData metaData)
+   {
       if (managedObject == null)
          throw new IllegalArgumentException("Null managed object");
       
@@ -113,13 +116,18 @@
       
       MutableManagedObject managedObjectImpl = (MutableManagedObject) managedObject;
       T object = createUnderlyingObject(managedObjectImpl, clazz);
-      populateManagedObject(managedObjectImpl, object);
+      populateManagedObject(managedObjectImpl, object, null);
    }
 
    public void populateManagedObject(MutableManagedObject managedObject, T object)
    {
+      populateManagedObject(managedObject, object);
+   }
+   public void populateManagedObject(MutableManagedObject managedObject, T object,
+         MetaData metaData)
+   {
       managedObject.setAttachment(object);
-      populateValues(managedObject, object);
+      populateValues(managedObject, object, metaData);
    }
 
    /**
@@ -130,11 +138,11 @@
     * @return the InstanceClassFactory
     */
    @SuppressWarnings("unchecked")
-   public <X> InstanceClassFactory<X> getInstanceClassFactory(Class<X> clazz)
+   public <X> InstanceClassFactory<X> getInstanceClassFactory(Class<X> clazz, MetaData metaData)
    {
       InstanceClassFactory<X> factory = (InstanceClassFactory<X>)
       Utility.getInstanceClassFactory(clazz, instanceFactories,
-         defaultInstanceFactory);
+         defaultInstanceFactory, metaData);
       return factory;
    }
 
@@ -166,9 +174,10 @@
     * @param object the object
     */
    @SuppressWarnings("unchecked")
-   protected void populateValues(MutableManagedObject managedObject, T object)
+   protected void populateValues(MutableManagedObject managedObject, T object,
+         MetaData metaData)
    {
-      InstanceClassFactory icf = getInstanceClassFactory(object.getClass());
+      InstanceClassFactory icf = getInstanceClassFactory(object.getClass(), metaData);
       Class moClass;
       try
       {
@@ -189,7 +198,7 @@
             MetaValue value = null;
             try
             {
-               value = icf.getValue(beanInfo, property, object);
+               value = icf.getValue(beanInfo, property, metaData, object);
             }
             catch(Throwable t)
             {
@@ -203,9 +212,10 @@
                defines the ManagedObject id name from the property value.
              */
             Map<String, Annotation> annotations = property.getAnnotations();
-            if (annotations == null)
+            if (annotations == null && metaData == null)
                continue;
-            ManagementObjectID id = (ManagementObjectID) annotations.get(ManagementObjectID.class.getName());
+            
+            ManagementObjectID id = getAnnotation(ManagementObjectID.class, annotations, metaData);
             if (id != null)
             {
                if (value == null || value.getMetaType().isSimple() == false)
@@ -217,7 +227,7 @@
                String name = "" + svalue.getValue();
                managedObject.setName(name);
             }
-            ManagementRuntimeRef runtimeRef = (ManagementRuntimeRef) annotations.get(ManagementRuntimeRef.class.getName());
+            ManagementRuntimeRef runtimeRef = getAnnotation(ManagementRuntimeRef.class, annotations, metaData);
             if (runtimeRef != null)
             {
                componentName = icf.getComponentName(beanInfo, property, object, value);
@@ -235,4 +245,14 @@
       managedObject.setComponentName(componentName);
    }
 
+   private static <X extends Annotation> X getAnnotation(Class<X> clazz, Map<String, Annotation> annotations,
+         MetaData metaData)
+   {
+      X annotation = null;
+      if(metaData != null)
+         annotation = metaData.getAnnotation(clazz);
+      if(annotation == null && annotations != null)
+         annotation = (X) annotations.get(clazz.getName());
+      return annotation;
+   }
 }

Added: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/DefaultInstanceClassFactory.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/DefaultInstanceClassFactory.java	                        (rev 0)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/DefaultInstanceClassFactory.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * 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.managed.plugins.factory;
+
+import org.jboss.managed.api.factory.ManagedObjectFactory;
+
+/**
+ * A simple extension of AbstractInstanceClassFactory that handles the
+ * default Object.class type.
+ * 
+ * @author Scott.Stark at jboss.org
+ * @version $Revision:$
+ */
+public class DefaultInstanceClassFactory
+   extends AbstractInstanceClassFactory<Object>
+{
+
+   public DefaultInstanceClassFactory()
+   {
+      super();
+   }
+
+   public DefaultInstanceClassFactory(ManagedObjectFactory mof)
+   {
+      super(mof);
+   }
+
+   public Class<Object> getType()
+   {
+      return Object.class;
+   }
+
+}

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/Utility.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/Utility.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/plugins/factory/Utility.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -24,6 +24,7 @@
 import java.util.Map;
 
 import org.jboss.managed.spi.factory.InstanceClassFactory;
+import org.jboss.metadata.spi.MetaData;
 
 /**
  * Common untility methods used by the factory plugins.
@@ -47,6 +48,32 @@
          Map<Class<?>, InstanceClassFactory<?>> instanceFactories,
          InstanceClassFactory defaultInstanceFactory)
    {
+      return getInstanceClassFactory(clazz, instanceFactories, defaultInstanceFactory, null);
+   }
+   /**
+    * Get the instance factory for a class
+    * 
+    * @param clazz the class
+    * @param instanceFactories - the registered mapping of classes to InstanceClassFactorys
+    * @param defaultInstanceFactory - the default InstanceClassFactory to use
+    *    if no class match is found.
+    * @param metaData - the possibly null metdata repository accessor. Its used to
+    * query for an mdr InstanceClassFactory.class as an override to the defaultInstanceFactory
+    * @return the InstanceClassFactory
+    */
+   @SuppressWarnings("unchecked")
+   public static InstanceClassFactory getInstanceClassFactory(Class<?> clazz,
+         Map<Class<?>, InstanceClassFactory<?>> instanceFactories,
+         InstanceClassFactory defaultInstanceFactory, MetaData metaData)
+   {
+      InstanceClassFactory defaultFactory = defaultInstanceFactory;
+      if(metaData != null)
+      {
+         InstanceClassFactory mdrFactory = metaData.getMetaData(InstanceClassFactory.class);
+         if(mdrFactory != null)
+            defaultFactory = mdrFactory;
+      }
+      
       synchronized (instanceFactories)
       {
          Class<?> c = clazz;
@@ -74,7 +101,7 @@
          if (factory != null)
             return factory;
       }
-      InstanceClassFactory factory = defaultInstanceFactory;
+      InstanceClassFactory factory = defaultFactory;
       return factory;
    }
 

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/InstanceClassFactory.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/InstanceClassFactory.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/InstanceClassFactory.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -23,6 +23,7 @@
 
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.managed.api.ManagedProperty;
+import org.jboss.metadata.spi.MetaData;
 import org.jboss.metatype.api.values.MetaValue;
 
 /**
@@ -37,6 +38,8 @@
  */
 public interface InstanceClassFactory<T>
 {
+   Class<T> getType();
+
    /**
     * Return the Class that represents the root ManagedObject to scan
     * for management object related annotations.
@@ -55,7 +58,7 @@
     * @param attachment - the object which own's the property
     * @return value - the meta value form of the property value
     */
-   MetaValue getValue(BeanInfo beanInfo, ManagedProperty property, T attachment);
+   MetaValue getValue(BeanInfo beanInfo, ManagedProperty property, MetaData metaData, T attachment);
 
    /**
     * Set the property value to attachment object.

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/ManagedObjectBuilder.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/ManagedObjectBuilder.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/ManagedObjectBuilder.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -21,9 +21,8 @@
 */
 package org.jboss.managed.spi.factory;
 
-import java.io.Serializable;
-
 import org.jboss.managed.api.ManagedObject;
+import org.jboss.metadata.spi.MetaData;
 
 /**
  * ManagedObjectBuilder.
@@ -37,7 +36,9 @@
     * Build the managed object
     * 
     * @param clazz the class
+    * @param metaData - the optional metadata repository accessor used to query
+    * for management annotation overrides/additions to the clazz
     * @return the managed object
     */
-   ManagedObject buildManagedObject(Class<?> clazz);
+   ManagedObject buildManagedObject(Class<?> clazz, MetaData metaData);
 }

Modified: projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/ManagedObjectPopulator.java
===================================================================
--- projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/ManagedObjectPopulator.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/main/java/org/jboss/managed/spi/factory/ManagedObjectPopulator.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -23,6 +23,7 @@
 
 import org.jboss.managed.api.ManagedObject;
 import org.jboss.managed.api.MutableManagedObject;
+import org.jboss.metadata.spi.MetaData;
 
 /**
  * ManagedObjectPopulator.
@@ -35,18 +36,37 @@
 public interface ManagedObjectPopulator<T>
 {
    /**
-    * Create a new underlying object
+    * Create a new underlying object from clazz and construct its ManagedObject.
     * 
     * @param managedObject the managed object
     * @param clazz the class
     */
    void createObject(ManagedObject managedObject, Class<T> clazz);
+   /**
+    * Create a new underlying object from clazz and construct its ManagedObject.
+    * 
+    * @param managedObject the managed object
+    * @param clazz the class
+    * @param metaData - the optional metadata repository accessor used to query
+    * for property annotations.
+    */
+   void createObject(ManagedObject managedObject, Class<T> clazz, MetaData metaData);
 
    /**
-    * Populate the managed object
+    * Populate the managed object with property values from the object.
     * 
     * @param managedObject the managed object to populate with values
     * @param object the object used to populate the managed object
     */
    void populateManagedObject(MutableManagedObject managedObject, T object);
+   /**
+    * Populate the managed object with property values from the object.
+    * 
+    * @param managedObject the managed object to populate with values
+    * @param object the object used to populate the managed object
+    * @param metaData - the optional metadata repository accessor used to query
+    * for property annotations.
+    */
+   void populateManagedObject(MutableManagedObject managedObject, T object,
+         MetaData metaData);
 }

Modified: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/AbstractManagedObjectFactoryTest.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/AbstractManagedObjectFactoryTest.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/AbstractManagedObjectFactoryTest.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -30,6 +30,7 @@
 import org.jboss.managed.api.factory.ManagedObjectFactory;
 import org.jboss.managed.plugins.factory.AbstractManagedObjectFactory;
 import org.jboss.managed.spi.factory.ManagedObjectBuilder;
+import org.jboss.metadata.spi.MetaData;
 import org.jboss.metatype.api.types.CompositeMetaType;
 import org.jboss.metatype.api.types.GenericMetaType;
 import org.jboss.metatype.api.types.MetaType;
@@ -85,16 +86,19 @@
       return managedObjectFactory;
    }
 
+   
    /**
     * Create a managed object
     * 
     * @param <T> the type
     * @param clazz the type
+    * @param metaData the metadata repository
     * @return the managed object
     */
-   protected <T extends Serializable> ManagedObject createManagedObject(Class<T> clazz)
+   protected <T> ManagedObject createManagedObject(Class<T> clazz)
    {
-      ManagedObject result = getMOF().createManagedObject(clazz);
+      MetaData metaData = null;
+      ManagedObject result = getMOF().createManagedObject(clazz, metaData);
       getLog().debug("Created managed: " + result + " for class=" + clazz.getName());
       return result;
    }
@@ -109,7 +113,7 @@
    {
       getMOF().setBuilder(clazz, builder);
    }
-   
+
    /**
     * Resolve a meta type
     * 

Added: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/ManagementPropertyClass.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/ManagementPropertyClass.java	                        (rev 0)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/ManagementPropertyClass.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -0,0 +1,67 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * 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.managed.factory.support;
+
+import java.io.Serializable;
+
+import org.jboss.managed.api.annotation.ManagementObject;
+import org.jboss.managed.api.annotation.ManagementProperties;
+import org.jboss.managed.api.annotation.ManagementProperty;
+
+/**
+ * Test that only properties specified at the class level ManagementObject
+ * are seen.
+ * 
+ * @author Scott.Stark at jboss.org
+ * @version $Revision:$
+ */
+ at ManagementObject(properties=ManagementProperties.CLASS,
+   classProperties={
+   @ManagementProperty(name="property2")
+   }
+)
+public class ManagementPropertyClass
+   implements Serializable
+{
+   private static final long serialVersionUID = 1;
+
+   /**
+    * Get property 1
+    * 
+    * @return null
+    */
+   @ManagementProperty
+   public String getProperty1() 
+   {
+      return null;
+   }
+
+   /**
+    * Get property 2
+    * 
+    * @return null
+    */
+   public String getProperty2() 
+   {
+      return null;
+   }
+}

Added: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/ManagementPropertyClassAndExplicit.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/ManagementPropertyClassAndExplicit.java	                        (rev 0)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/ManagementPropertyClassAndExplicit.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -0,0 +1,77 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * 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.managed.factory.support;
+
+import java.io.Serializable;
+
+import org.jboss.managed.api.annotation.ManagementObject;
+import org.jboss.managed.api.annotation.ManagementProperties;
+import org.jboss.managed.api.annotation.ManagementProperty;
+
+/**
+ * Test that properties specified at the class level ManagementObject
+ * and fields/methods marked with ManagementProperty are seen.
+ * 
+ * @author Scott.Stark at jboss.org
+ * @version $Revision:$
+ */
+ at ManagementObject(properties=ManagementProperties.CLASS_AND_EXPLICIT,
+   classProperties={
+   @ManagementProperty(name="property2")
+   }
+)
+public class ManagementPropertyClassAndExplicit
+   implements Serializable
+{
+   private static final long serialVersionUID = 1;
+
+   /**
+    * Get property 1
+    * 
+    * @return null
+    */
+   @ManagementProperty
+   public String getProperty1() 
+   {
+      return null;
+   }
+
+   /**
+    * Get property 2
+    * 
+    * @return null
+    */
+   public String getProperty2() 
+   {
+      return null;
+   }
+
+   /**
+    * Get property 3
+    * 
+    * @return null
+    */
+   public String getProperty3() 
+   {
+      return null;
+   }
+}

Added: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/SimpleUnannotated.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/SimpleUnannotated.java	                        (rev 0)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/SimpleUnannotated.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -0,0 +1,479 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * 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.managed.factory.support;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Date;
+
+/**
+ * A variation of the Simple bean that does not have an ManagementObject annotation
+ * @author Scott.Stark at jboss.org
+ * @version $Revision:$
+ */
+public class SimpleUnannotated
+   implements Serializable
+{
+   /** The serialVersionUID */
+   private static final long serialVersionUID = -1;
+   
+   private BigDecimal bigDecimalValue;
+   
+   private BigInteger bigIntegerValue;
+   
+   private boolean booleanvalue;
+   
+   private Boolean booleanValue;
+   
+   private byte bytevalue;
+   
+   private Byte byteValue;
+   
+   private char charactervalue;
+   
+   private Character characterValue; 
+   
+   private Date dateValue;
+   
+   private double doublevalue;
+   
+   private Double doubleValue;
+   
+   private float floatvalue;
+   
+   private Float floatValue;
+   
+   private int integervalue;
+   
+   private Integer integerValue;
+   
+   private long longvalue;
+   
+   private Long longValue;
+   
+   private short shortvalue;
+   
+   private Short shortValue;
+   
+   private String stringValue;
+
+   /**
+    * Get the bigDecimalValue.
+    * 
+    * @return the bigDecimalValue.
+    */
+   public BigDecimal getBigDecimalValue()
+   {
+      return bigDecimalValue;
+   }
+
+   /**
+    * Set the bigDecimalValue.
+    * 
+    * @param bigDecimalValue the bigDecimalValue.
+    */
+   public void setBigDecimalValue(BigDecimal bigDecimalValue)
+   {
+      this.bigDecimalValue = bigDecimalValue;
+   }
+
+   /**
+    * Get the bigIntegerValue.
+    * 
+    * @return the bigIntegerValue.
+    */
+   public BigInteger getBigIntegerValue()
+   {
+      return bigIntegerValue;
+   }
+
+   /**
+    * Set the bigIntegerValue.
+    * 
+    * @param bigIntegerValue the bigIntegerValue.
+    */
+   public void setBigIntegerValue(BigInteger bigIntegerValue)
+   {
+      this.bigIntegerValue = bigIntegerValue;
+   }
+
+   /**
+    * Get the booleanvalue.
+    * 
+    * @return the booleanvalue.
+    */
+   public boolean isBooleanvalue()
+   {
+      return booleanvalue;
+   }
+
+   /**
+    * Set the booleanvalue.
+    * 
+    * @param booleanvalue the booleanvalue.
+    */
+   public void setBooleanvalue(boolean booleanvalue)
+   {
+      this.booleanvalue = booleanvalue;
+   }
+
+   /**
+    * Get the booleanValue.
+    * 
+    * @return the booleanValue.
+    */
+   public Boolean getBooleanValue()
+   {
+      return booleanValue;
+   }
+
+   /**
+    * Set the booleanValue.
+    * 
+    * @param booleanValue the booleanValue.
+    */
+   public void setBooleanValue(Boolean booleanValue)
+   {
+      this.booleanValue = booleanValue;
+   }
+
+   /**
+    * Get the bytevalue.
+    * 
+    * @return the bytevalue.
+    */
+   public byte getBytevalue()
+   {
+      return bytevalue;
+   }
+
+   /**
+    * Set the bytevalue.
+    * 
+    * @param bytevalue the bytevalue.
+    */
+   public void setBytevalue(byte bytevalue)
+   {
+      this.bytevalue = bytevalue;
+   }
+
+   /**
+    * Get the byteValue.
+    * 
+    * @return the byteValue.
+    */
+   public Byte getByteValue()
+   {
+      return byteValue;
+   }
+
+   /**
+    * Set the byteValue.
+    * 
+    * @param byteValue the byteValue.
+    */
+   public void setByteValue(Byte byteValue)
+   {
+      this.byteValue = byteValue;
+   }
+
+   /**
+    * Get the charactervalue.
+    * 
+    * @return the charactervalue.
+    */
+   public char getCharactervalue()
+   {
+      return charactervalue;
+   }
+
+   /**
+    * Set the charactervalue.
+    * 
+    * @param charactervalue the charactervalue.
+    */
+   public void setCharactervalue(char charactervalue)
+   {
+      this.charactervalue = charactervalue;
+   }
+
+   /**
+    * Get the characterValue.
+    * 
+    * @return the characterValue.
+    */
+   public Character getCharacterValue()
+   {
+      return characterValue;
+   }
+
+   /**
+    * Set the characterValue.
+    * 
+    * @param characterValue the characterValue.
+    */
+   public void setCharacterValue(Character characterValue)
+   {
+      this.characterValue = characterValue;
+   }
+
+   /**
+    * Get the dateValue.
+    * 
+    * @return the dateValue.
+    */
+   public Date getDateValue()
+   {
+      return dateValue;
+   }
+
+   /**
+    * Set the dateValue.
+    * 
+    * @param dateValue the dateValue.
+    */
+   public void setDateValue(Date dateValue)
+   {
+      this.dateValue = dateValue;
+   }
+
+   /**
+    * Get the doublevalue.
+    * 
+    * @return the doublevalue.
+    */
+   public double getDoublevalue()
+   {
+      return doublevalue;
+   }
+
+   /**
+    * Set the doublevalue.
+    * 
+    * @param doublevalue the doublevalue.
+    */
+   public void setDoublevalue(double doublevalue)
+   {
+      this.doublevalue = doublevalue;
+   }
+
+   /**
+    * Get the doubleValue.
+    * 
+    * @return the doubleValue.
+    */
+   public Double getDoubleValue()
+   {
+      return doubleValue;
+   }
+
+   /**
+    * Set the doubleValue.
+    * 
+    * @param doubleValue the doubleValue.
+    */
+   public void setDoubleValue(Double doubleValue)
+   {
+      this.doubleValue = doubleValue;
+   }
+
+   /**
+    * Get the floatvalue.
+    * 
+    * @return the floatvalue.
+    */
+   public float getFloatvalue()
+   {
+      return floatvalue;
+   }
+
+   /**
+    * Set the floatvalue.
+    * 
+    * @param floatvalue the floatvalue.
+    */
+   public void setFloatvalue(float floatvalue)
+   {
+      this.floatvalue = floatvalue;
+   }
+
+   /**
+    * Get the floatValue.
+    * 
+    * @return the floatValue.
+    */
+   public Float getFloatValue()
+   {
+      return floatValue;
+   }
+
+   /**
+    * Set the floatValue.
+    * 
+    * @param floatValue the floatValue.
+    */
+   public void setFloatValue(Float floatValue)
+   {
+      this.floatValue = floatValue;
+   }
+
+   /**
+    * Get the integervalue.
+    * 
+    * @return the integervalue.
+    */
+   public int getIntegervalue()
+   {
+      return integervalue;
+   }
+
+   /**
+    * Set the integervalue.
+    * 
+    * @param integervalue the integervalue.
+    */
+   public void setIntegervalue(int integervalue)
+   {
+      this.integervalue = integervalue;
+   }
+
+   /**
+    * Get the integerValue.
+    * 
+    * @return the integerValue.
+    */
+   public Integer getIntegerValue()
+   {
+      return integerValue;
+   }
+
+   /**
+    * Set the integerValue.
+    * 
+    * @param integerValue the integerValue.
+    */
+   public void setIntegerValue(Integer integerValue)
+   {
+      this.integerValue = integerValue;
+   }
+
+   /**
+    * Get the longvalue.
+    * 
+    * @return the longvalue.
+    */
+   public long getLongvalue()
+   {
+      return longvalue;
+   }
+
+   /**
+    * Set the longvalue.
+    * 
+    * @param longvalue the longvalue.
+    */
+   public void setLongvalue(long longvalue)
+   {
+      this.longvalue = longvalue;
+   }
+
+   /**
+    * Get the longValue.
+    * 
+    * @return the longValue.
+    */
+   public Long getLongValue()
+   {
+      return longValue;
+   }
+
+   /**
+    * Set the longValue.
+    * 
+    * @param longValue the longValue.
+    */
+   public void setLongValue(Long longValue)
+   {
+      this.longValue = longValue;
+   }
+
+   /**
+    * Get the shortvalue.
+    * 
+    * @return the shortvalue.
+    */
+   public short getShortvalue()
+   {
+      return shortvalue;
+   }
+
+   /**
+    * Set the shortvalue.
+    * 
+    * @param shortvalue the shortvalue.
+    */
+   public void setShortvalue(short shortvalue)
+   {
+      this.shortvalue = shortvalue;
+   }
+
+   /**
+    * Get the shortValue.
+    * 
+    * @return the shortValue.
+    */
+   public Short getShortValue()
+   {
+      return shortValue;
+   }
+
+   /**
+    * Set the shortValue.
+    * 
+    * @param shortValue the shortValue.
+    */
+   public void setShortValue(Short shortValue)
+   {
+      this.shortValue = shortValue;
+   }
+
+   /**
+    * Get the stringValue.
+    * 
+    * @return the stringValue.
+    */
+   public String getStringValue()
+   {
+      return stringValue;
+   }
+
+   /**
+    * Set the stringValue.
+    * 
+    * @param stringValue the stringValue.
+    */
+   public void setStringValue(String stringValue)
+   {
+      this.stringValue = stringValue;
+   }
+}

Modified: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/ManagementObjectWithRuntimeRefICF.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/ManagementObjectWithRuntimeRefICF.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/ManagementObjectWithRuntimeRefICF.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -25,6 +25,7 @@
 import org.jboss.beans.info.spi.PropertyInfo;
 import org.jboss.managed.api.ManagedProperty;
 import org.jboss.managed.spi.factory.InstanceClassFactory;
+import org.jboss.metadata.spi.MetaData;
 import org.jboss.metatype.api.values.MetaValue;
 import org.jboss.metatype.api.values.MetaValueFactory;
 
@@ -38,6 +39,12 @@
    /** The meta value factory */
    private MetaValueFactory metaValueFactory = MetaValueFactory.getInstance(); 
 
+   
+   public Class<ManagementObjectWithRuntimeRef> getType()
+   {
+      return ManagementObjectWithRuntimeRef.class;
+   }
+
    @SuppressWarnings("unchecked")
    public Class<?> getManagedObjectClass(ManagementObjectWithRuntimeRef instance)
       throws ClassNotFoundException
@@ -54,7 +61,8 @@
       return name;
    }
 
-   public MetaValue getValue(BeanInfo beanInfo, ManagedProperty property, ManagementObjectWithRuntimeRef instance)
+   public MetaValue getValue(BeanInfo beanInfo, ManagedProperty property,
+      MetaData metaData, ManagementObjectWithRuntimeRef instance)
    {
       String name = getPropertyName(property);
       PropertyInfo propertyInfo = beanInfo.getProperty(name);

Modified: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestICF.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestICF.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestICF.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -31,5 +31,10 @@
  */
 public class TestICF extends AbstractInstanceClassFactory<Serializable>
 {
+
+   public Class<Serializable> getType()
+   {
+      return Serializable.class;
+   }
    
 }

Modified: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestMOP.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestMOP.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestMOP.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -30,6 +30,7 @@
 import org.jboss.managed.plugins.factory.AbstractManagedObjectPopulator;
 import org.jboss.managed.spi.factory.InstanceClassFactory;
 import org.jboss.managed.spi.factory.ManagedObjectPopulator;
+import org.jboss.metadata.spi.MetaData;
 
 /**
  * @author Scott.Stark at jboss.org
@@ -52,19 +53,35 @@
       super(configuration);
    }
 
+   @Override
    public void createObject(ManagedObject managedObject,
          Class<Serializable> clazz)
    {
       createObjectCalled = true;
       super.createObject(managedObject, clazz);
    }
+   @Override
+   public void createObject(ManagedObject managedObject,
+         Class<Serializable> clazz, MetaData metaData)
+   {
+      createObjectCalled = true;
+      super.createObject(managedObject, clazz, metaData);
+   }
 
+   @Override
    public void populateManagedObject(MutableManagedObject managedObject,
          Serializable object)
    {
       populateManagedObjectCalled = true;
       super.populateManagedObject(managedObject, object);
    }
+   @Override
+   public void populateManagedObject(MutableManagedObject managedObject,
+         Serializable object, MetaData metaData)
+   {
+      populateManagedObjectCalled = true;
+      super.populateManagedObject(managedObject, object, metaData);
+   }
 
    public boolean isCreateObjectCalled()
    {

Modified: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestSimpleICF.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestSimpleICF.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/amof/TestSimpleICF.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -25,6 +25,7 @@
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.managed.api.ManagedProperty;
 import org.jboss.managed.plugins.factory.AbstractInstanceClassFactory;
+import org.jboss.metadata.spi.MetaData;
 import org.jboss.metatype.api.values.MetaValue;
 import org.jboss.test.managed.factory.support.Simple;
 
@@ -39,10 +40,10 @@
 
    @Override
    public MetaValue getValue(BeanInfo beanInfo, ManagedProperty property,
-         Simple object)
+         MetaData metaData, Simple object)
    {
       getValueCalled = true;
-      return super.getValue(beanInfo, property, object);
+      return super.getValue(beanInfo, property, metaData, object);
    }
 
    public boolean isGetValueCalled()
@@ -50,6 +51,11 @@
       return getValueCalled;
    }
 
+   public Class<Simple> getType()
+   {
+      return Simple.class;
+   }
+
    @Override
    public void setValue(BeanInfo beanInfo, ManagedProperty property,
          Simple object, MetaValue value)

Modified: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/beans/BeanMetaDataICF.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/beans/BeanMetaDataICF.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/beans/BeanMetaDataICF.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -34,6 +34,7 @@
 import org.jboss.managed.api.annotation.ManagementProperty;
 import org.jboss.managed.api.annotation.ViewUse;
 import org.jboss.managed.spi.factory.InstanceClassFactory;
+import org.jboss.metadata.spi.MetaData;
 import org.jboss.metatype.api.values.MetaValue;
 import org.jboss.metatype.api.values.MetaValueFactory;
 
@@ -74,6 +75,12 @@
       return beanMap.get(beanName);
    }
 
+   
+   public Class<IBeanMetaData> getType()
+   {
+      return IBeanMetaData.class;
+   }
+
    public Object getComponentName(BeanInfo beanInfo, ManagedProperty property,
          IBeanMetaData attachment, MetaValue value)
    {
@@ -114,7 +121,7 @@
    }
 
    public MetaValue getValue(BeanInfo beanInfo, ManagedProperty property,
-         IBeanMetaData attachment)
+         MetaData metaData, IBeanMetaData attachment)
    {
       // Get the property from the bean
       // First look to the mapped name

Modified: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/deployment/JmsDestinationICF.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/deployment/JmsDestinationICF.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/deployment/JmsDestinationICF.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -47,6 +47,10 @@
       super(mof);
    }
 
+   public Class<JmsDestination> getType()
+   {
+      return JmsDestination.class;
+   }
    @Override
    public void setValue(BeanInfo beanInfo, ManagedProperty property,
          JmsDestination object, MetaValue value)

Modified: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/deployment/SecDomainICF.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/deployment/SecDomainICF.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/deployment/SecDomainICF.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -30,4 +30,9 @@
 public class SecDomainICF extends AbstractInstanceClassFactory<SecDomainMD>
 {
 
+   public Class<SecDomainMD> getType()
+   {
+      return SecDomainMD.class;
+   }
+
 }

Added: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/mcf/LocalDSInstanceClassFactory.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/mcf/LocalDSInstanceClassFactory.java	                        (rev 0)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/mcf/LocalDSInstanceClassFactory.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -0,0 +1,121 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * 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.managed.factory.support.mcf;
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jboss.beans.info.spi.BeanInfo;
+import org.jboss.managed.api.ManagedProperty;
+import org.jboss.managed.api.factory.ManagedObjectFactory;
+import org.jboss.managed.plugins.factory.AbstractInstanceClassFactory;
+import org.jboss.metadata.spi.MetaData;
+import org.jboss.metatype.api.types.SimpleMetaType;
+import org.jboss.metatype.api.values.MapCompositeValueSupport;
+import org.jboss.metatype.api.values.MetaValue;
+import org.jboss.metatype.api.values.SimpleValueSupport;
+
+/**
+ * An InstanceClassFactory for LocalDataSourceDeploymentMetaData that handles
+ * connection-properties property as a MapCompositeValueSupport.
+ * 
+ * @author Scott.Stark at jboss.org
+ * @version $Revision: 78217 $
+ */
+public class LocalDSInstanceClassFactory
+   extends AbstractInstanceClassFactory<LocalDataSourceDeploymentMetaData>
+{
+   public LocalDSInstanceClassFactory()
+   {
+      super();
+   }
+   public LocalDSInstanceClassFactory(ManagedObjectFactory mof)
+   {
+      super(mof);
+   }
+
+   public Class<LocalDataSourceDeploymentMetaData> getType()
+   {
+      return LocalDataSourceDeploymentMetaData.class;
+   }
+   public Class<? extends Serializable> getManagedObjectClass(
+         LocalDataSourceDeploymentMetaData attachment)
+         throws ClassNotFoundException
+   {
+      return attachment.getClass();
+   }
+
+   public MetaValue getValue(BeanInfo beanInfo, ManagedProperty property,
+         MetaData metaData,
+         LocalDataSourceDeploymentMetaData attachment)
+   {
+      MetaValue value = null;
+      if("connection-properties".equals(property.getName()))
+      {
+         MapCompositeValueSupport mapValue = new MapCompositeValueSupport(SimpleMetaType.STRING);
+         List<DataSourceConnectionPropertyMetaData> list = attachment.getDataSourceConnectionProperties();
+         if(list != null)
+         {
+            for(DataSourceConnectionPropertyMetaData prop : list)
+            {
+               MetaValue wrapped = SimpleValueSupport.wrap(prop.getValue());
+               mapValue.put(prop.getName(), wrapped);
+            }
+         }
+         value = mapValue;
+      }
+      else
+      {
+         value = super.getValue(beanInfo, property, metaData, attachment);
+      }
+      return value;
+   }
+
+   @Override
+   protected Object unwrapValue(BeanInfo beanInfo, ManagedProperty property,
+         MetaValue value)
+   {
+      if((value instanceof MapCompositeValueSupport) == false)
+      {
+         return super.unwrapValue(beanInfo, property, value);
+      }
+
+      MapCompositeValueSupport mapValue = (MapCompositeValueSupport) value;
+      Object unwrapValue = null;
+      if("connection-properties".equals(property.getName()))
+      {
+         List<DataSourceConnectionPropertyMetaData> list = new ArrayList<DataSourceConnectionPropertyMetaData>();
+         for(String name : mapValue.getMetaType().keySet())
+         {
+            DataSourceConnectionPropertyMetaData prop = new DataSourceConnectionPropertyMetaData();
+            prop.setName(name);
+            String svalue = (String) getMetaValueFactory().unwrap(mapValue.get(name));
+            prop.setValue(svalue);
+            list.add(prop);
+         }
+         unwrapValue = list;
+      }
+      return unwrapValue;
+   }
+}

Added: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/mcf/NoTxICF.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/mcf/NoTxICF.java	                        (rev 0)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/support/mcf/NoTxICF.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * 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.managed.factory.support.mcf;
+
+import org.jboss.managed.api.factory.ManagedObjectFactory;
+import org.jboss.managed.plugins.factory.AbstractInstanceClassFactory;
+
+/**
+ * @author Scott.Stark at jboss.org
+ * @version $Revision:$
+ */
+public class NoTxICF 
+   extends AbstractInstanceClassFactory<NoTxConnectionFactoryDeploymentMetaData>
+{
+   public NoTxICF()
+   {
+      super();
+   }
+
+   public NoTxICF(ManagedObjectFactory mof)
+   {
+      super(mof);
+   }
+
+   public Class<NoTxConnectionFactoryDeploymentMetaData> getType()
+   {
+      return NoTxConnectionFactoryDeploymentMetaData.class;
+   }
+   
+}

Modified: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/test/AbstractManagedObjectFactoryUnitTestCase.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/test/AbstractManagedObjectFactoryUnitTestCase.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/test/AbstractManagedObjectFactoryUnitTestCase.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -21,21 +21,31 @@
  */
 package org.jboss.test.managed.factory.test;
 
+import java.lang.annotation.Annotation;
 import java.math.BigDecimal;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.jboss.annotation.factory.AnnotationCreator;
 import org.jboss.managed.api.ManagedObject;
 import org.jboss.managed.api.ManagedProperty;
+import org.jboss.managed.api.annotation.ManagementComponent;
+import org.jboss.managed.api.annotation.ManagementObject;
 import org.jboss.managed.api.factory.ManagedObjectFactory;
 import org.jboss.managed.plugins.factory.AbstractInstanceClassFactory;
 import org.jboss.managed.plugins.factory.AbstractManagedObjectFactory;
+import org.jboss.managed.plugins.factory.DefaultInstanceClassFactory;
+import org.jboss.managed.spi.factory.InstanceClassFactory;
+import org.jboss.metadata.plugins.loader.memory.MemoryMetaDataLoader;
+import org.jboss.metadata.spi.MetaData;
+import org.jboss.metadata.spi.retrieval.MetaDataRetrievalToMetaDataBridge;
 import org.jboss.metatype.api.values.CollectionValue;
 import org.jboss.metatype.api.values.GenericValue;
 import org.jboss.metatype.api.values.MetaValue;
@@ -44,6 +54,7 @@
 import org.jboss.test.managed.factory.support.ManagementObjectChangedName;
 import org.jboss.test.managed.factory.support.ManagementPropertySimpleManaged;
 import org.jboss.test.managed.factory.support.Simple;
+import org.jboss.test.managed.factory.support.SimpleUnannotated;
 import org.jboss.test.managed.factory.support.amof.CustomName;
 import org.jboss.test.managed.factory.support.amof.ManagementObjectWithRuntimeRef;
 import org.jboss.test.managed.factory.support.amof.ManagementObjectWithRuntimeRefICF;
@@ -62,9 +73,12 @@
 import org.jboss.test.managed.factory.support.deployment.SecurityDomain;
 import org.jboss.test.managed.factory.support.mcf.DBMSMetaData;
 import org.jboss.test.managed.factory.support.mcf.DataSourceConnectionPropertyMetaData;
+import org.jboss.test.managed.factory.support.mcf.LocalDSInstanceClassFactory;
 import org.jboss.test.managed.factory.support.mcf.LocalDataSourceDeploymentMetaData;
 import org.jboss.test.managed.factory.support.mcf.ManagedConnectionFactoryDeploymentGroup;
 import org.jboss.test.managed.factory.support.mcf.ManagedConnectionFactoryDeploymentMetaData;
+import org.jboss.test.managed.factory.support.mcf.NoTxConnectionFactoryDeploymentMetaData;
+import org.jboss.test.managed.factory.support.mcf.NoTxICF;
 import org.jboss.test.managed.factory.support.mcf.SecurityMetaData;
 
 /**
@@ -115,6 +129,10 @@
       checkDefaultManagedProperties(managedObject, ManagementPropertySimpleManaged.class);
    }
 
+   /**
+    * Test that the setDefaultManagedObjectPopulator overrides the MOF
+    * default ManagedObjectPopulator
+    */
    public void testDefaultManagedObjectPopulator()
    {
       AbstractManagedObjectFactory mof = new AbstractManagedObjectFactory();
@@ -139,6 +157,56 @@
  
    }
 
+   public void testInstanceClassFactoryAddition()
+   {
+      AbstractManagedObjectFactory mof = new AbstractManagedObjectFactory();
+      testMOF = mof;
+
+      BeanMetaDataICF bicf = new BeanMetaDataICF();
+      mof.addInstanceClassFactory(bicf);
+      LocalDSInstanceClassFactory dsicf = new LocalDSInstanceClassFactory();
+      mof.addInstanceClassFactory(dsicf);
+      NoTxICF nticf = new NoTxICF();
+      mof.addInstanceClassFactory(nticf);
+
+      InstanceClassFactory icf = mof.getInstanceClassFactory(IBeanMetaData.class);
+      assertEquals("IBeanMetaData ICF", bicf, icf);
+      icf = mof.getInstanceClassFactory(LocalDataSourceDeploymentMetaData.class);
+      assertEquals("LocalDataSourceDeploymentMetaData ICF", dsicf, icf);
+      icf = mof.getInstanceClassFactory(NoTxConnectionFactoryDeploymentMetaData.class);
+      assertEquals("NoTxConnectionFactoryDeploymentMetaData ICF", nticf, icf);
+   }
+
+   /**
+    * Test that the MetaData repository annotations override/augment the class
+    * annotations.
+    */
+   public void testMetaDataRepositoryOverride()
+      throws Exception
+   {
+      MemoryMetaDataLoader memory = new MemoryMetaDataLoader();
+      String annotationExpr = "@org.jboss.managed.api.annotation.ManagementObject(name=\"testMetaDataRepositoryOverride\",componentType=@org.jboss.managed.api.annotation.ManagementComponent(type=\"MCBean\", subtype=\"MetaDataTest\"))";
+      ManagementObject override = (ManagementObject) AnnotationCreator.createAnnotation(annotationExpr, ManagementObject.class);
+      memory.addAnnotation(override);
+      MetaData metaData = new MetaDataRetrievalToMetaDataBridge(memory);
+
+      BigDecimal bigDecimal = new BigDecimal(10);
+      SimpleUnannotated simple = new SimpleUnannotated();
+      simple.setBigDecimalValue(bigDecimal);
+
+      ManagedObjectFactory mof = getMOF();
+      ManagedObject managedObject = mof.initManagedObject(simple, metaData);
+      assertEquals("testMetaDataRepositoryOverride", managedObject.getName());
+      Map<String, Annotation> moAnnotations = managedObject.getAnnotations();
+      assertEquals("MO annotations == 2;", 2, moAnnotations.size());
+      ManagementObject moAnn = (ManagementObject) moAnnotations.get(ManagementObject.class.getName());
+      ManagementComponent componentType = moAnn.componentType();
+      assertEquals("componentType.type", "MCBean", componentType.type());
+      assertEquals("componentType.subtype", "MetaDataTest", componentType.subtype());
+      checkPropertyDefaults(managedObject, "bigDecimalValue", BigDecimal.class, bigDecimal);
+      checkDefaultManagedProperties(managedObject, SimpleUnannotated.class);
+   }
+
    @SuppressWarnings("unchecked")
    public void testGenericValueUpdate()
    {
@@ -179,7 +247,7 @@
       assertEquals(SimpleValueSupport.wrap("java:/jaas/JMS"), domainName.getValue());
 
       ManagedObject domainUpdateMO = initManagedObject(new SecurityDomain("java:/jaas/JMS2"));
-      AbstractInstanceClassFactory icf = new AbstractInstanceClassFactory(mof);
+      DefaultInstanceClassFactory icf = new DefaultInstanceClassFactory(mof);
       GenericValue domainUpdateGV = icf.getManagedObjectValue(domain, domainUpdateMO);
       assertNotNull(domainUpdateGV.getValue());
       domain.setValue(domainUpdateGV);

Modified: projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/test/ManagementObjectPropertiesUnitTestCase.java
===================================================================
--- projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/test/ManagementObjectPropertiesUnitTestCase.java	2008-11-04 18:30:18 UTC (rev 80511)
+++ projects/jboss-man/trunk/managed/src/test/java/org/jboss/test/managed/factory/test/ManagementObjectPropertiesUnitTestCase.java	2008-11-04 18:39:17 UTC (rev 80512)
@@ -30,6 +30,8 @@
 import org.jboss.test.managed.factory.support.ManagementObjectExplicit;
 import org.jboss.test.managed.factory.support.ManagementObjectIgnored;
 import org.jboss.test.managed.factory.support.ManagementObjectNone;
+import org.jboss.test.managed.factory.support.ManagementPropertyClass;
+import org.jboss.test.managed.factory.support.ManagementPropertyClassAndExplicit;
 import org.jboss.test.managed.factory.support.WriteOnlyPropertyObject;
 
 /**
@@ -79,7 +81,7 @@
       checkManagedObjectDefaults(ManagementObjectIgnored.class, managedObject);
       checkManagedProperties(managedObject, "property2");
    }
-   
+
    /**
     * Test no properties included
     */
@@ -101,6 +103,26 @@
    }
 
    /**
+    * Test CLASS properties included
+    */
+   public void testClass()
+   {
+      ManagedObject managedObject = createManagedObject(ManagementPropertyClass.class);
+      checkManagedObjectDefaults(ManagementPropertyClass.class, managedObject);
+      checkManagedProperties(managedObject, "property2");
+   }
+
+   /**
+    * Test CLASS_AND_EXPLICIT properties included
+    */
+   public void testClassAndExplicit()
+   {
+      ManagedObject managedObject = createManagedObject(ManagementPropertyClassAndExplicit.class);
+      checkManagedObjectDefaults(ManagementPropertyClassAndExplicit.class, managedObject);
+      checkManagedProperties(managedObject, "property1", "property2");
+   }
+
+   /**
     * Validate that a write-only property does not fail the creation of
     * a ManagedObject/ManagedProperty.
     */




More information about the jboss-cvs-commits mailing list