Author: rich
Date: Fri Apr 29 19:02:08 2005
New Revision: 165371

URL: http://svn.apache.org/viewcvs?rev=165371&view=rev
Log:
Fix for http://issues.apache.org/jira/browse/BEEHIVE-589 : Control fields 
cannot be inherited in page flows

This change causes control client initializers to be generated for any class 
that can *inherit* an annotated control field.  It fixes the InheritControls 
BVT in netui.

tests: drt in trunk, bvt in netui (WinXP)
BB: self (linux)


Modified:
    
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/apt/ControlClientAnnotationProcessor.java

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/apt/ControlClientAnnotationProcessor.java
URL: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/apt/ControlClientAnnotationProcessor.java?rev=165371&r1=165370&r2=165371&view=diff
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/apt/ControlClientAnnotationProcessor.java
 (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/apt/ControlClientAnnotationProcessor.java
 Fri Apr 29 19:02:08 2005
@@ -73,6 +73,20 @@
         }
     }
 
+    private static void addControlType(Map<TypeDeclaration,Set<TypeMirror>> 
clientsMap, TypeDeclaration clientType,
+                                       TypeMirror controlFieldType)
+    {
+        Set<TypeMirror> controlTypes = clientsMap.get( clientType );
+
+        if ( controlTypes == null )
+        {
+            controlTypes = new HashSet<TypeMirror>();
+            clientsMap.put( clientType, controlTypes );
+        }
+
+        controlTypes.add( controlFieldType );
+    }
+    
     /**
      * Each control client requires a manifest that documents the controls 
that it references.
      *
@@ -92,21 +106,43 @@
         {
             if (atd.getSimpleName().equals("Control") )
             {
-                Collection<Declaration> decls = 
getAnnotationProcessorEnvironment().getDeclarationsAnnotatedWith(atd);
+                AnnotationProcessorEnvironment env = 
getAnnotationProcessorEnvironment();
+                Collection<Declaration> decls = 
env.getDeclarationsAnnotatedWith(atd);
                 for (Declaration decl : decls)
                 {
                     if ( decl instanceof FieldDeclaration )
                     {
                         FieldDeclaration fd = (FieldDeclaration)decl;
                         TypeDeclaration clientType = fd.getDeclaringType();
-                        Set<TypeMirror> controlTypes = clientsMap.get( 
clientType );
-                        if ( controlTypes == null )
+                        TypeMirror controlFieldType = fd.getType();
+                        addControlType( clientsMap, clientType, 
controlFieldType );
+                        
+                        //
+                        // If this field is public or protected, add the 
control type to any derived class.
+                        //
+                        Collection<Modifier> modifiers = fd.getModifiers();
+                        if ( modifiers.contains( Modifier.PUBLIC ) || 
modifiers.contains( Modifier.PROTECTED ) )
                         {
-                            controlTypes = new HashSet<TypeMirror>();
-                            clientsMap.put( clientType, controlTypes );
+                            Collection<TypeDeclaration> 
specifiedTypeDeclartions = env.getSpecifiedTypeDeclarations();
+                            for (TypeDeclaration td : specifiedTypeDeclartions)
+                            {
+                                if ( td instanceof ClassDeclaration )
+                                {
+                                    ClassType superclass = ( ( 
ClassDeclaration ) td ).getSuperclass();
+                                    
+                                    while ( superclass != null )
+                                    {
+                                        if ( 
superclass.getDeclaration().equals( clientType ) )
+                                        {
+                                            addControlType( clientsMap, td, 
controlFieldType );
+                                            break;
+                                        }
+                                        
+                                        superclass = 
superclass.getSuperclass();
+                                    }
+                                }
+                            }
                         }
-
-                        controlTypes.add( fd.getType() );
                     }
                 }
             }


Reply via email to