avalon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From leosu...@apache.org
Subject cvs commit: avalon-sandbox/attributes/api/src/java/org/apache/avalon/attributes Attributes.java DefaultCachedRepository.java
Date Sun, 10 Aug 2003 15:05:24 GMT
leosutic    2003/08/10 08:05:24

  Modified:    attributes/api/src/test/org/apache/avalon/attributes/test
                        AttributeDemo.java Sample.java
               attributes/api/src/java/org/apache/avalon/attributes
                        Attributes.java DefaultCachedRepository.java
  Log:
  Added support for inheriting attributes via interfaces. Added support for adding attributes
to constructors and fields.
  
  Revision  Changes    Path
  1.2       +7 -1      avalon-sandbox/attributes/api/src/test/org/apache/avalon/attributes/test/AttributeDemo.java
  
  Index: AttributeDemo.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/attributes/api/src/test/org/apache/avalon/attributes/test/AttributeDemo.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- AttributeDemo.java	10 Aug 2003 13:46:08 -0000	1.1
  +++ AttributeDemo.java	10 Aug 2003 15:05:24 -0000	1.2
  @@ -12,7 +12,13 @@
           System.out.println ("Sample has the following class attributes:\n" + Attributes.getAttributes
(sample));
           
           System.out.println ("Getting attributes for the method Sample.someMethod(int)...");
  -        System.out.println ("Sample.someMethod(int) has the following class attributes:\n"
+ Attributes.getAttributes (sample.getMethod ("someMethod", new Class[]{ Integer.TYPE })));
  +        System.out.println ("Sample.someMethod(int) has the following attributes:\n" +
Attributes.getAttributes (sample.getMethod ("someMethod", new Class[]{ Integer.TYPE })));
  +        
  +        System.out.println ("Getting attributes for the field Sample.field...");
  +        System.out.println ("Sample.field has the following attributes:\n" + Attributes.getAttributes
(sample.getField ("field")));
  +        
  +        System.out.println ("Getting attributes for the constructor Sample()...");
  +        System.out.println ("Sample() has the following attributes:\n" + Attributes.getAttributes
(sample.getConstructor (new Class[0])));
       }
       
   }
  
  
  
  1.2       +2 -2      avalon-sandbox/attributes/api/src/test/org/apache/avalon/attributes/test/Sample.java
  
  Index: Sample.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/attributes/api/src/test/org/apache/avalon/attributes/test/Sample.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Sample.java	10 Aug 2003 13:46:08 -0000	1.1
  +++ Sample.java	10 Aug 2003 15:05:24 -0000	1.2
  @@ -4,12 +4,12 @@
    * @ThreadSafe ()
    * @Dependency ( SampleService.class, "sample" )
    */
  -public class Sample extends SuperSample {
  +public class Sample extends SuperSample implements SampleIFJoin {
       
       /**
        * @ThreadSafe ()
        */
  -    public Object aaaa;
  +    public Object field;
    
       
       /**
  
  
  
  1.2       +10 -1     avalon-sandbox/attributes/api/src/java/org/apache/avalon/attributes/Attributes.java
  
  Index: Attributes.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/attributes/api/src/java/org/apache/avalon/attributes/Attributes.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Attributes.java	10 Aug 2003 13:46:08 -0000	1.1
  +++ Attributes.java	10 Aug 2003 15:05:24 -0000	1.2
  @@ -14,8 +14,17 @@
       
       protected synchronized static CachedRepository getCachedRepository (Class clazz) throws
Exception {
           if (classRepositories.containsKey (clazz)) {
  -            return (CachedRepository) classRepositories.get (clazz);
  +            CachedRepository cr = (CachedRepository) classRepositories.get (clazz);
  +            if (cr == null) {
  +                // Circular references.
  +                throw new ClassCircularityError (clazz.getName ());
  +            } else {
  +                return cr;
  +            }
           } else {
  +            // Indicates we're loading it.
  +            classRepositories.put (clazz, null);
  +            
               Class attributeRepo;
               CachedRepository cached;
               try {
  
  
  
  1.2       +73 -20    avalon-sandbox/attributes/api/src/java/org/apache/avalon/attributes/DefaultCachedRepository.java
  
  Index: DefaultCachedRepository.java
  ===================================================================
  RCS file: /home/cvs/avalon-sandbox/attributes/api/src/java/org/apache/avalon/attributes/DefaultCachedRepository.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultCachedRepository.java	10 Aug 2003 13:46:08 -0000	1.1
  +++ DefaultCachedRepository.java	10 Aug 2003 15:05:24 -0000	1.2
  @@ -15,11 +15,10 @@
       public DefaultCachedRepository (Class clazz, AttributeRepositoryClass repo) throws
Exception {
           // ---- Fix up class attributes
           this.classAttributes.addAll (repo.getClassAttributes ());
  -        
  -        Class c = clazz.getSuperclass ();
  -        while (c != null) {
  -            this.classAttributes.addAll (getInheritableAttributes (Attributes.getAttributes
(c)));
  -            c = c.getSuperclass ();
  +        this.classAttributes.addAll (getInheritableClassAttributes (clazz.getSuperclass
()));
  +        Class[] ifs = clazz.getInterfaces ();
  +        for (int i = 0; i < ifs.length; i++) {
  +            this.classAttributes.addAll (getInheritableClassAttributes (ifs[i]));
           }
           
           // ---- Fix up method attributes
  @@ -27,26 +26,32 @@
           for (int i = 0; i < methods.length; i++) {
               Method m = methods[i];
               String key = Util.getSignature (m);
  +            
               Set attributes = new HashSet ();
               attributes.addAll ((Collection) repo.getMethodAttributes ().get (key));
  -            
  -            c = clazz.getSuperclass ();
  -            while (c != null) {
  -                
  -                try {
  -                    // Get equivalent method in superclass
  -                    Method m2 = c.getMethod (m.getName (), m.getParameterTypes ());
  -                    if (m2.getDeclaringClass () == c) {
  -                        attributes.addAll (getInheritableAttributes (Attributes.getAttributes
(m2)));
  -                    }
  -                } catch (NoSuchMethodException nsme) {
  -                }
  -                
  -                c = c.getSuperclass ();
  +            attributes.addAll (getInheritableMethodAttributes (clazz.getSuperclass (),
m.getName (), m.getParameterTypes ()));
  +            for (int j = 0; j < ifs.length; j++) {
  +                attributes.addAll (getInheritableMethodAttributes (ifs[j], m.getName (),
m.getParameterTypes ()));
               }
               
               this.methods.put (m, attributes);
           }
  +        
  +        // --- Just copy constructor attributes (they aren't inherited)
  +        Constructor[] constructors = clazz.getDeclaredConstructors ();
  +        for (int i = 0; i < constructors.length; i++) {
  +            Constructor ctor = constructors[i];
  +            String key = Util.getSignature (ctor);
  +            this.constructors.put (ctor, repo.getConstructorAttributes ().get (key));
  +        }
  +        
  +        // --- Just copy field attributes (they aren't inherited)
  +        Field[] fields = clazz.getDeclaredFields ();
  +        for (int i = 0; i < fields.length; i++) {
  +            Field f = fields[i];
  +            String key = f.getName ();
  +            this.fields.put (f, repo.getFieldAttributes ().get (key));
  +        }
       }
       
       private static Collection getInheritableAttributes (Collection attrs) throws Exception
{
  @@ -62,6 +67,54 @@
           return result;
       }
       
  +    private static Collection getInheritableClassAttributes (Class c) throws Exception
{
  +        if (c == null) {
  +            return new ArrayList (0);
  +        }
  +        
  +        HashSet result = new HashSet ();
  +        result.addAll (getInheritableAttributes (Attributes.getAttributes (c)));
  +        
  +        // Traverse the class hierarchy
  +        result.addAll (getInheritableClassAttributes (c.getSuperclass ()));
  +        
  +        // Traverse the interface hierarchy
  +        Class[] ifs = c.getInterfaces ();
  +        for (int i = 0; i < ifs.length; i++) {
  +            result.addAll (getInheritableClassAttributes (ifs[i]));
  +        }
  +        
  +        return result;
  +    }
  +    
  +    private static Collection getInheritableMethodAttributes (Class c, String methodName,
Class[] methodParams) throws Exception {
  +        if (c == null) {
  +            return new ArrayList (0);
  +        }
  +        
  +        HashSet result = new HashSet ();
  +        
  +        try {
  +            // Get equivalent method in c
  +            Method m = c.getMethod (methodName, methodParams);
  +            if (m.getDeclaringClass () == c) {
  +                result.addAll (getInheritableAttributes (Attributes.getAttributes (m)));
  +            }
  +        } catch (NoSuchMethodException nsme) {
  +        }
  +        
  +        // Traverse the class hierarchy
  +        result.addAll (getInheritableMethodAttributes (c.getSuperclass (), methodName,
methodParams));
  +        
  +        // Traverse the interface hierarchy
  +        Class[] ifs = c.getInterfaces ();
  +        for (int i = 0; i < ifs.length; i++) {
  +            result.addAll (getInheritableMethodAttributes (ifs[i], methodName, methodParams));
  +        }
  +        
  +        return result;
  +    }
  +    
       public Collection getAttributes () throws Exception {
           return classAttributes;
       }
  @@ -76,5 +129,5 @@
       
       public Collection getAttributes (Constructor c) throws Exception {
           return (Collection) constructors.get (c);
  -    }
  +    }   
   }
  
  
  

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


Mime
View raw message