You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by ni...@apache.org on 2004/08/19 11:08:11 UTC

svn commit: rev 36599 - in avalon/trunk/planet/facilities/reflector: blocks/complete impl/src/main/org/apache/metro/facilities/reflector/impl typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers

Author: niclas
Date: Thu Aug 19 02:08:09 2004
New Revision: 36599

Added:
   avalon/trunk/planet/facilities/reflector/typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers/AbstractObjectTypeHandler.java   (contents, props changed)
   avalon/trunk/planet/facilities/reflector/typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers/ComponentModelTypeHandler.java   (contents, props changed)
Modified:
   avalon/trunk/planet/facilities/reflector/blocks/complete/build.xml
   avalon/trunk/planet/facilities/reflector/impl/src/main/org/apache/metro/facilities/reflector/impl/ModelRegistrator.java
   avalon/trunk/planet/facilities/reflector/impl/src/main/org/apache/metro/facilities/reflector/impl/ReflectorImpl.java
   avalon/trunk/planet/facilities/reflector/typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers/ObjectTypeHandler.java
Log:
Added support for an implicit 'Implementation' member for ComponentModel objects, so one can navigate from the Model into the implementation.

Modified: avalon/trunk/planet/facilities/reflector/blocks/complete/build.xml
==============================================================================
--- avalon/trunk/planet/facilities/reflector/blocks/complete/build.xml	(original)
+++ avalon/trunk/planet/facilities/reflector/blocks/complete/build.xml	Thu Aug 19 02:08:09 2004
@@ -32,6 +32,7 @@
       <x:component name="typehandler-collection" class="org.apache.metro.facilities.reflector.typehandlers.CollectionTypeHandler" />
       <x:component name="typehandler-map" class="org.apache.metro.facilities.reflector.typehandlers.MapTypeHandler" />
       <x:component name="typehandler-dictionary" class="org.apache.metro.facilities.reflector.typehandlers.DictionaryTypeHandler" />
+      <x:component name="typehandler-componentmodel" class="org.apache.metro.facilities.reflector.typehandlers.ComponentModelTypeHandler" />
       
       <x:component name="reflector-http-handler" class="org.apache.metro.facilities.reflector.impl.ReflectionHandler" >
         <x:parameters>

Modified: avalon/trunk/planet/facilities/reflector/impl/src/main/org/apache/metro/facilities/reflector/impl/ModelRegistrator.java
==============================================================================
--- avalon/trunk/planet/facilities/reflector/impl/src/main/org/apache/metro/facilities/reflector/impl/ModelRegistrator.java	(original)
+++ avalon/trunk/planet/facilities/reflector/impl/src/main/org/apache/metro/facilities/reflector/impl/ModelRegistrator.java	Thu Aug 19 02:08:09 2004
@@ -27,6 +27,9 @@
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 
+import org.apache.avalon.composition.event.CompositionEvent;
+import org.apache.avalon.composition.event.CompositionListener;
+
 import org.apache.avalon.composition.model.ContainmentModel;
 
 import org.apache.metro.facilities.reflector.ReflectorService;
@@ -37,7 +40,8 @@
  *                   collection="weak"
  */
 public class ModelRegistrator
-    implements Contextualizable, Serviceable, Initializable
+    implements Contextualizable, Serviceable, Initializable, 
+               CompositionListener
 {
     private ContainmentModel m_Model;
     private ReflectorService m_Reflector;
@@ -58,6 +62,7 @@
         throws ContextException
     {
         m_Model = (ContainmentModel) ctx.get( "urn:composition:containment.model" );
+        m_Model.addCompositionListener( this );
     }
 
     /** The service method is called by the Avalon framework container.
@@ -77,4 +82,27 @@
     {
         m_Reflector.addRootObject( "model", m_Model );
     }
+
+    /**
+     * Notify the listener that a model has been added to 
+     * a source containment model.
+     *
+     * @param event the containment event raised by the 
+     *    source containment model
+     */
+    public void modelAdded( CompositionEvent event )
+    {
+    }
+
+    /**
+     * Notify the listener that a model has been removed from 
+     * a source containment model.
+     *
+     * @param event the containment event raised by the 
+     *    source containment model
+     */
+    public void modelRemoved( CompositionEvent event )
+    {
+    }
+
 }

Modified: avalon/trunk/planet/facilities/reflector/impl/src/main/org/apache/metro/facilities/reflector/impl/ReflectorImpl.java
==============================================================================
--- avalon/trunk/planet/facilities/reflector/impl/src/main/org/apache/metro/facilities/reflector/impl/ReflectorImpl.java	(original)
+++ avalon/trunk/planet/facilities/reflector/impl/src/main/org/apache/metro/facilities/reflector/impl/ReflectorImpl.java	Thu Aug 19 02:08:09 2004
@@ -19,6 +19,8 @@
  */
 package org.apache.metro.facilities.reflector.impl;
 
+import java.lang.reflect.Proxy;
+
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -328,6 +330,13 @@
     
     private TypeHandler getTypeHandler( Object obj )
     {
+        Class clazz = obj.getClass();
+        if( Proxy.isProxyClass( clazz ) )
+        {
+            TypeHandler th = (TypeHandler) m_TypeHandlerMap.get( Proxy.class );
+            if( th != null )
+                return th;
+        }
         Iterator list = m_TypeHandlerMap.entrySet().iterator();
         while( list.hasNext() )
         {

Added: avalon/trunk/planet/facilities/reflector/typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers/AbstractObjectTypeHandler.java
==============================================================================
--- (empty file)
+++ avalon/trunk/planet/facilities/reflector/typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers/AbstractObjectTypeHandler.java	Thu Aug 19 02:08:09 2004
@@ -0,0 +1,288 @@
+/* 
+ * Copyright 2004 Apache Software Foundation
+ * Licensed  under the  Apache License,  Version 2.0  (the "License");
+ * you may not use  this file  except in  compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed  under the  License is distributed on an "AS IS" BASIS,
+ * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
+ * implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.metro.facilities.reflector.typehandlers;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.ArrayList;
+
+import org.apache.metro.facilities.reflector.ReflectionException;
+
+import org.apache.metro.facilities.reflector.spi.ReflectorProvider;
+import org.apache.metro.facilities.reflector.spi.TypeHandler;
+import org.apache.metro.facilities.reflector.spi.Util;
+
+public abstract class AbstractObjectTypeHandler
+    implements TypeHandler
+{
+    protected void getNames( ArrayList names, Object container )
+        throws ReflectionException
+    {
+        
+        Class clazz = container.getClass();
+        
+        if( Modifier.isPublic( clazz.getModifiers() ) )
+            getNames( names, clazz );
+        else
+        {
+            ArrayList all = new ArrayList();
+            Class[] interfaces = clazz.getInterfaces();
+            for( int i=0 ; i < interfaces.length ; i++ )
+            {
+                getNames( names, interfaces[i] );
+            }
+        }
+    }
+    
+    protected String[] packageNames( ArrayList names )
+    {
+        String[] ret = new String[ names.size() ];
+        for( int i= 0; i < names.size() ; i++ )
+            ret[i] = (String) names.get(i);
+        return ret;
+    }
+    
+    protected void getNames( ArrayList names, Class clazz )
+        throws ReflectionException
+    {
+        /////  NORMAL OBJECT
+        // Retrieve all PUBLIC, non-STATIC fields.
+        Field[] flds = clazz.getDeclaredFields();
+        for( int i=0 ; i < flds.length ; i++ )
+        {
+            int mod = flds[i].getModifiers();
+            if( Modifier.isPublic( mod ) && !Modifier.isStatic( mod ) )
+            {
+                String str = flds[i].getName();
+                int j = str.indexOf( '_' );
+                if( j == 1 )
+                    str = str.substring( 2 );
+                names.add( str);
+            }
+        }
+        // Retrieve PUBLIC non-STATIC GET methods
+        Method[] methods = clazz.getMethods();
+        for( int i=0 ; i < methods.length ; i++ )
+        {
+            int mod = methods[i].getModifiers();
+            if( Modifier.isPublic( mod ) && ! Modifier.isStatic( mod ))
+            {
+                String str = methods[i].getName();
+                if( str.startsWith("get") )
+                {
+                    if( methods[i].getParameterTypes().length == 0 )
+                    {
+                        str = str.substring( 3 );
+                        if( ! names.contains(str) )
+                            names.add( str );
+                    }
+                }
+                else if( str.startsWith("is") )
+                {
+                    if( methods[i].getParameterTypes().length == 0 )
+                    {
+                        str = str.substring( 2 );
+                        if( ! names.contains(str) )
+                            names.add( str );
+                    }
+                }
+            }
+        }
+    }
+
+    public Object getMemberObject( Object container, String memberName )
+        throws ReflectionException
+    {
+        Method method = Util.findMethod( container, "get" + memberName );
+        
+        if( method == null )
+            method = Util.findMethod( container, "is" + memberName );
+        
+        if( method != null && ! Modifier.isPublic( method.getModifiers() ) )
+            method = null;
+            
+        if( method != null )
+        {
+            try
+            {
+                if( method.getName().equals( "getTypes" ) )
+                {
+                    System.out.println( method.getName() );
+                    System.out.println( Modifier.isPublic( method.getModifiers() ) );
+                    System.out.println( method.getParameterTypes().length );
+                    System.out.println( method.getReturnType() );
+                    System.out.println( method.getDeclaringClass() );
+                    System.out.println( method.getExceptionTypes().length );
+                }
+                return method.invoke(container, new Object[0] );
+            } catch( IllegalAccessException e )
+            {
+                throw new ReflectionException( container.getClass().toString() + ".get" + memberName + "() is not declared public.", e );
+            } catch( IllegalArgumentException e )
+            {
+                throw new ReflectionException(container.getClass().toString() + ".get" + memberName + "() received illegal arguments. Internal Error?", e);
+            } catch( InvocationTargetException e )
+            {
+                Exception exc;
+                Throwable t = e.getTargetException();
+                if( t instanceof Exception )
+                    exc = (Exception) t;
+                else
+                    exc = null;
+                throw new ReflectionException( container.getClass().toString() + ".get" + memberName + "() resulted in an exception.\n" + e , exc );
+            }
+        }
+        else
+        {
+            try
+            {
+                Field fld = Util.findField( container, memberName );
+                return fld.get( container );
+            } catch( Exception e )
+            {
+                throw new ReflectionException( "Unable to access the field: " + memberName, e );
+            }
+        }
+    }
+
+    public void setMemberObject( Object container, String member, Object value )
+        throws ReflectionException
+    {
+        Class cls = container.getClass();
+        Field[] flds = cls.getDeclaredFields();
+        Method method = Util.findMethod( container, "set" + member );
+        if( method != null )
+        {
+            try
+            {
+                Class[] argTypes = method.getParameterTypes();
+                Object[] args = new Object[1];
+                args[0] = value;
+                Object obj = method.invoke( container, args );
+            } catch( IllegalAccessException e )
+            {
+                throw new ReflectionException( container.getClass().toString() + ".set" + member + "() is not declared public.", e);
+            } catch( Exception e )
+            {
+                throw new ReflectionException( "Problem accessing " + container.getClass().toString() + ".set" + member + "().", e);
+            }
+        }
+        if( method == null )
+        {
+            for( int i=0; i < flds.length ; i++ )
+            {
+                if( Util.matchField( flds[i].getName(), member ) )
+                {
+                    if( flds[i].getType().isPrimitive() )
+                    {
+                        if( value instanceof String )
+                        {
+                            try
+                            {
+                                Util.setPrimitive( flds[i], container, (String) value );
+                            } catch( IllegalAccessException e )
+                            {
+                                throw new ReflectionException( "The field '" + member + "' of " + container.toString() +  " is not declared public.", e);
+                            }
+                        }
+                    }
+                    else
+                        setObject( flds[i], container, value );
+                }
+            }
+        }
+    }
+    
+    public Class getClass( Object container, String memberName )
+        throws ReflectionException
+    {
+        Method method = Util.findMethod( container, "get" + memberName );
+        if( method == null )
+            method = Util.findMethod( container, "is" + memberName );
+
+        if( method != null )
+        {
+            Class retClass = method.getReturnType();
+            if( Modifier.isNative(retClass.getModifiers()) )
+                return retClass;
+
+            // Native classes are not properly serialized/deserialized over RMI.
+
+            return Util.expandNativeClass( retClass );
+        }
+        try
+        {
+            Field fld = Util.findField( container, memberName );
+            return fld.getType();
+        } catch( NoSuchFieldException e )
+        {
+            throw new ReflectionException( "Member '" + memberName + "' not found in " + container );
+        }
+    }
+
+
+    public boolean isSettable( Object container, String memberName )
+        throws ReflectionException
+    {
+        Method method = Util.findMethod( container, "set" + memberName );
+
+        if( method != null )
+            return true;
+        else
+            return false;
+    }
+    
+    private void setObject( Field fld, Object obj, Object value )
+        throws ReflectionException
+    {
+        // Create a new instance of the object
+        // Assign instance to reference.
+        Class fldClass = fld.getType();
+        
+        Constructor[] constructors = fldClass.getConstructors();
+        Constructor constr = null;
+        for( int j=0; j < constructors.length ; j++ )
+        {
+            Class[] params = constructors[j].getParameterTypes();
+            if( params.length == 1 && params[0].getName().equals("String"))
+            {
+                constr = constructors[j];
+                break;
+            }
+        }
+        
+        if( constr != null )
+        {
+            try
+            {
+                Object[] args = {value};
+                Object newObj = constr.newInstance( args );
+                fld.set(obj, newObj );
+            } catch( Exception e )
+            {
+                throw new ReflectionException( "Unable to construct a " + fldClass, e );
+            }
+        }
+        else
+            throw new ReflectionException( "No valid Constructors available for object: " + fldClass );
+    }   
+} 

Added: avalon/trunk/planet/facilities/reflector/typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers/ComponentModelTypeHandler.java
==============================================================================
--- (empty file)
+++ avalon/trunk/planet/facilities/reflector/typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers/ComponentModelTypeHandler.java	Thu Aug 19 02:08:09 2004
@@ -0,0 +1,131 @@
+/* 
+ * Copyright 2004 Apache Software Foundation
+ * Licensed  under the  Apache License,  Version 2.0  (the "License");
+ * you may not use  this file  except in  compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed  under the  License is distributed on an "AS IS" BASIS,
+ * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
+ * implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.metro.facilities.reflector.typehandlers;
+
+import java.util.ArrayList;
+
+import org.apache.avalon.composition.model.ComponentModel;
+
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+
+import org.apache.metro.facilities.reflector.ReflectionException;
+
+import org.apache.metro.facilities.reflector.spi.ReflectorProvider;
+import org.apache.metro.facilities.reflector.spi.TypeHandler;
+
+/**
+ * @avalon.component name="type-handler-componentmodel" lifestyle="singleton"
+ * @avalon.service type="org.apache.metro.facilities.reflector.spi.TypeHandler"
+ */
+public class ComponentModelTypeHandler extends AbstractObjectTypeHandler
+    implements Serviceable
+{
+    /**
+     * @avalon.dependency type="org.apache.metro.facilities.reflector.spi.ReflectorProvider"
+     *                    key="provider"
+     */
+    public void service( ServiceManager man )
+        throws ServiceException
+    {
+        ReflectorProvider provider = (ReflectorProvider) man.lookup( "provider" );
+        provider.addTypeHandler( this, ComponentModel.class );
+    }
+    
+    public boolean isDefault()
+    {
+        return false;
+    }
+
+    public String[] getNames( Object container )
+        throws ReflectionException
+    {
+        if( ! ( container instanceof ComponentModel ) )
+            throw new ReflectionException( container + " is not a ComponentModel: " + container.getClass().getName() );
+        ArrayList names = new ArrayList();
+        names.add( "Implementation" );
+        getNames( names, container );
+        return packageNames( names );
+    }
+    
+    public Object getMemberObject( Object container, String membername )
+        throws ReflectionException
+    {
+        if( ! ( container instanceof ComponentModel ) )
+            throw new ReflectionException( container + " is not a ComponentModel: " + container.getClass().getName() );
+        if( membername.equals( "Implementation" ) )
+        {
+            try
+            {
+                ComponentModel model = (ComponentModel) container;
+                Object instance = model.resolve( false );
+                return instance;
+            } catch( Exception e )
+            {
+                throw new ReflectionException( "Unable to obtain component instance.", e );
+            }
+        }
+        return super.getMemberObject( container, membername );
+    }
+    
+    public void setMemberObject( Object container, String membername, Object value )
+        throws ReflectionException
+    {
+        if( ! ( container instanceof ComponentModel ) )
+            throw new ReflectionException( container + " is not a ComponentModel: " + container.getClass().getName() );
+        if( membername.equals( "Implementation" ) )
+        {
+            // Not supported.
+            return;
+        }
+        super.setMemberObject( container, membername, value );
+    }    
+
+    public Class getClass( Object container, String membername )
+        throws ReflectionException
+    {
+        if( ! ( container instanceof ComponentModel ) )
+            throw new ReflectionException( container + " is not a ComponentModel: " + container.getClass().getName() );
+        if( membername.equals( "Implementation" ) )
+        {
+            try
+            {
+                ComponentModel model = (ComponentModel) container;
+                Object instance = model.resolve( false );
+                return instance.getClass();
+            } catch( Exception e )
+            {
+                throw new ReflectionException( "Unable to obtain component instance.", e );
+            }
+        }
+        return super.getClass( container, membername );
+    }
+
+    public boolean isSettable( Object container, String membername )
+        throws ReflectionException
+    {
+        if( ! ( container instanceof ComponentModel ) )
+            throw new ReflectionException( container + " is not a ComponentModel: " + container.getClass().getName() );
+        if( membername.equals( "Implementation" ) )
+        {
+            return false;
+        }
+        return super.isSettable( container, membername );
+    }
+} 

Modified: avalon/trunk/planet/facilities/reflector/typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers/ObjectTypeHandler.java
==============================================================================
--- avalon/trunk/planet/facilities/reflector/typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers/ObjectTypeHandler.java	(original)
+++ avalon/trunk/planet/facilities/reflector/typehandlers/src/main/org/apache/metro/facilities/reflector/typehandlers/ObjectTypeHandler.java	Thu Aug 19 02:08:09 2004
@@ -17,13 +17,7 @@
 
 package org.apache.metro.facilities.reflector.typehandlers;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
-import java.util.ArrayList;
+import java.util.ArrayList; 
 
 import org.apache.avalon.framework.service.Serviceable;
 import org.apache.avalon.framework.service.ServiceException;
@@ -33,16 +27,14 @@
 
 import org.apache.metro.facilities.reflector.spi.ReflectorProvider;
 import org.apache.metro.facilities.reflector.spi.TypeHandler;
-import org.apache.metro.facilities.reflector.spi.Util;
 
 /**
  * @avalon.component name="type-handler-object" lifestyle="singleton"
  * @avalon.service type="org.apache.metro.facilities.reflector.spi.TypeHandler"
  */
-public class ObjectTypeHandler
-    implements TypeHandler, Serviceable
+public class ObjectTypeHandler extends AbstractObjectTypeHandler
+    implements Serviceable
 {
-    
     /**
      * @avalon.dependency type="org.apache.metro.facilities.reflector.spi.ReflectorProvider"
      *                    key="provider"
@@ -58,251 +50,12 @@
     {
         return true;
     }
-    
-    public String[] getNames( Object container )
-    {
-        ArrayList names = new ArrayList();
-        
-        Class clazz = container.getClass();
-        
-        if( Modifier.isPublic( clazz.getModifiers() ) )
-            getNames( names, clazz );
-        else
-        {
-            ArrayList all = new ArrayList();
-            Class[] interfaces = clazz.getInterfaces();
-            for( int i=0 ; i < interfaces.length ; i++ )
-            {
-                getNames( names, interfaces[i] );
-            }
-        }
-        String[] ret = new String[ names.size() ];
-        for( int i= 0; i < names.size() ; i++ )
-            ret[i] = (String) names.get(i);
-        return ret;
-    }
-    
-    private void getNames( ArrayList names, Class clazz )
-    {
-        /////  NORMAL OBJECT
-        // Retrieve all PUBLIC, non-STATIC fields.
-        Field[] flds = clazz.getDeclaredFields();
-        for( int i=0 ; i < flds.length ; i++ )
-        {
-            int mod = flds[i].getModifiers();
-            if( Modifier.isPublic( mod ) && !Modifier.isStatic( mod ) )
-            {
-                String str = flds[i].getName();
-                int j = str.indexOf( '_' );
-                if( j == 1 )
-                    str = str.substring( 2 );
-                names.add( str);
-            }
-        }
-        // Retrieve PUBLIC non-STATIC GET methods
-        Method[] methods = clazz.getMethods();
-        for( int i=0 ; i < methods.length ; i++ )
-        {
-            int mod = methods[i].getModifiers();
-            if( Modifier.isPublic( mod ) && ! Modifier.isStatic( mod ))
-            {
-                String str = methods[i].getName();
-                if( str.startsWith("get") )
-                {
-                    if( methods[i].getParameterTypes().length == 0 )
-                    {
-                        str = str.substring( 3 );
-                        if( ! names.contains(str) )
-                            names.add( str );
-                    }
-                }
-                else if( str.startsWith("is") )
-                {
-                    if( methods[i].getParameterTypes().length == 0 )
-                    {
-                        str = str.substring( 2 );
-                        if( ! names.contains(str) )
-                            names.add( str );
-                    }
-                }
-            }
-        }
-    }
-
-    public Object getMemberObject( Object container, String memberName )
-        throws ReflectionException
-    {
-        Method method = Util.findMethod( container, "get" + memberName );
-        
-        if( method == null )
-            method = Util.findMethod( container, "is" + memberName );
-        
-        if( method != null && ! Modifier.isPublic( method.getModifiers() ) )
-            method = null;
-            
-        if( method != null )
-        {
-            try
-            {
-                if( method.getName().equals( "getTypes" ) )
-                {
-                    System.out.println( method.getName() );
-                    System.out.println( Modifier.isPublic( method.getModifiers() ) );
-                    System.out.println( method.getParameterTypes().length );
-                    System.out.println( method.getReturnType() );
-                    System.out.println( method.getDeclaringClass() );
-                    System.out.println( method.getExceptionTypes().length );
-                }
-                return method.invoke(container, new Object[0] );
-            } catch( IllegalAccessException e )
-            {
-                throw new ReflectionException( container.getClass().toString() + ".get" + memberName + "() is not declared public.", e );
-            } catch( IllegalArgumentException e )
-            {
-                throw new ReflectionException(container.getClass().toString() + ".get" + memberName + "() received illegal arguments. Internal Error?", e);
-            } catch( InvocationTargetException e )
-            {
-                Exception exc;
-                Throwable t = e.getTargetException();
-                if( t instanceof Exception )
-                    exc = (Exception) t;
-                else
-                    exc = null;
-                throw new ReflectionException( container.getClass().toString() + ".get" + memberName + "() resulted in an exception.\n" + e , exc );
-            }
-        }
-        else
-        {
-            try
-            {
-                Field fld = Util.findField( container, memberName );
-                return fld.get( container );
-            } catch( Exception e )
-            {
-                throw new ReflectionException( "Unable to access the field: " + memberName, e );
-            }
-        }
-    }
 
-    public void setMemberObject( Object container, String member, Object value )
-        throws ReflectionException
-    {
-        Class cls = container.getClass();
-        Field[] flds = cls.getDeclaredFields();
-        Method method = Util.findMethod( container, "set" + member );
-        if( method != null )
-        {
-            try
-            {
-                Class[] argTypes = method.getParameterTypes();
-                Object[] args = new Object[1];
-                args[0] = value;
-                Object obj = method.invoke( container, args );
-            } catch( IllegalAccessException e )
-            {
-                throw new ReflectionException( container.getClass().toString() + ".set" + member + "() is not declared public.", e);
-            } catch( Exception e )
-            {
-                throw new ReflectionException( "Problem accessing " + container.getClass().toString() + ".set" + member + "().", e);
-            }
-        }
-        if( method == null )
-        {
-            for( int i=0; i < flds.length ; i++ )
-            {
-                if( Util.matchField( flds[i].getName(), member ) )
-                {
-                    if( flds[i].getType().isPrimitive() )
-                    {
-                        if( value instanceof String )
-                        {
-                            try
-                            {
-                                Util.setPrimitive( flds[i], container, (String) value );
-                            } catch( IllegalAccessException e )
-                            {
-                                throw new ReflectionException( "The field '" + member + "' of " + container.toString() +  " is not declared public.", e);
-                            }
-                        }
-                    }
-                    else
-                        setObject( flds[i], container, value );
-                }
-            }
-        }
-    }
-    
-    public Class getClass( Object container, String memberName )
+    public String[] getNames( Object container )
         throws ReflectionException
     {
-        Method method = Util.findMethod( container, "get" + memberName );
-        if( method == null )
-            method = Util.findMethod( container, "is" + memberName );
-
-        if( method != null )
-        {
-            Class retClass = method.getReturnType();
-            if( Modifier.isNative(retClass.getModifiers()) )
-                return retClass;
-
-            // Native classes are not properly serialized/deserialized over RMI.
-
-            return Util.expandNativeClass( retClass );
-        }
-        try
-        {
-            Field fld = Util.findField( container, memberName );
-            return fld.getType();
-        } catch( NoSuchFieldException e )
-        {
-            throw new ReflectionException( "Member '" + memberName + "' not found in " + container );
-        }
-    }
-
-
-    public boolean isSettable( Object container, String memberName )
-    {
-        Method method = Util.findMethod( container, "set" + memberName );
-
-        if( method != null )
-            return true;
-        else
-            return false;
+        ArrayList names = new ArrayList();
+        getNames( names, container );
+        return packageNames( names );
     }
-    
-    private void setObject( Field fld, Object obj, Object value )
-        throws ReflectionException
-    {
-        // Create a new instance of the object
-        // Assign instance to reference.
-        Class fldClass = fld.getType();
-        
-        Constructor[] constructors = fldClass.getConstructors();
-        Constructor constr = null;
-        for( int j=0; j < constructors.length ; j++ )
-        {
-            Class[] params = constructors[j].getParameterTypes();
-            if( params.length == 1 && params[0].getName().equals("String"))
-            {
-                constr = constructors[j];
-                break;
-            }
-        }
-        
-        if( constr != null )
-        {
-            try
-            {
-                Object[] args = {value};
-                Object newObj = constr.newInstance( args );
-                fld.set(obj, newObj );
-            } catch( Exception e )
-            {
-                throw new ReflectionException( "Unable to construct a " + fldClass, e );
-            }
-        }
-        else
-            throw new ReflectionException( "No valid Constructors available for object: " + fldClass );
-    }   
-         
 } 

---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org