Author: kylem
Date: Sun Jan  9 19:19:32 2005
New Revision: 124758

URL: http://svn.apache.org/viewcvs?view=rev&rev=124758
Log:
Another checkpoint of work for XML persistence of controls using 
java.beans.XMLEncoder.  Now has
support for encoding implementation instances and nested controls.  Some work 
on listener wireup
on decode remains.


Added:
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ContextPersistenceDelegate.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplPersistenceDelegate.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/packaging/ControlEventSetDescriptor.java
Modified:
   
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/context/ControlBeanContext.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/EventNotifier.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/UnicastEventNotifier.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlImplementation.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlInterface.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptEventSet.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptPropertySet.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestProps.java
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestPropsImpl.jcs
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/Props.java
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/PropsImpl.jcs
   
incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/property/DrivePropsBeans.java
   
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo
   
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo
   
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo
   
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo
   
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo

Modified: 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/context/ControlBeanContext.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/context/ControlBeanContext.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/context/ControlBeanContext.java&r1=124757&p2=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/context/ControlBeanContext.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/context/ControlBeanContext.java
    (original)
+++ 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/context/ControlBeanContext.java
    Sun Jan  9 19:19:32 2005
@@ -24,6 +24,7 @@
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
 
+import org.apache.beehive.controls.api.bean.ControlBean;
 import org.apache.beehive.controls.api.events.EventSet;
 import org.apache.beehive.controls.api.properties.PropertyMap;
 import org.apache.beehive.controls.api.properties.PropertySet;
@@ -175,6 +176,13 @@
      * necessarily have been packaged directly with the implementation class).
      */
     public java.lang.ClassLoader getClassLoader();
+
+    /**
+     * Returns any child ControlBean that is nested in the ControlBeanContext, 
or null
+     * if no matching child is found.  The <code>id</code> parameter is 
relative to
+     * the current nesting context, not an absolute control id.
+     */
+    public ControlBean getBean(String id);
 
     /**
      * The Lifecycle event interface defines a set of lifecycle events exposed 
by the

Added: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ContextPersistenceDelegate.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ContextPersistenceDelegate.java?view=auto&rev=124758
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ContextPersistenceDelegate.java
       Sun Jan  9 19:19:32 2005
@@ -0,0 +1,69 @@
+package org.apache.beehive.controls.runtime.bean;
+/*
+ * Copyright 2004 The 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.
+ *
+ * $Header:$
+ */
+
+import java.beans.BeanInfo;
+import java.beans.DefaultPersistenceDelegate;
+import java.beans.Encoder;
+import java.beans.Expression;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PersistenceDelegate;
+import java.beans.PropertyDescriptor;
+import java.beans.Statement;
+import java.beans.XMLEncoder;
+import java.util.Set;
+
+import org.apache.beehive.controls.api.ControlException;
+
+/**
+ * The ContextPersistenceDelegate class supports the XML persistance of 
ControlBeanContext
+ * instances by implementing the <code>java.beans.PersistenceDelegate</b> API, 
and overriding 
+ * the default persistance algorithm based upon the runtime structure for 
Controls.
+ * <p>
+ */
+public class ContextPersistenceDelegate extends DefaultPersistenceDelegate
+{
+    /**
+     * PersistenceDelegate.instantiate()
+     */
+    protected Expression instantiate(Object oldInstance, Encoder out)
+    {
+        //
+        // Instead of directly creating a context instance, simply ask the 
containing
+        // bean to return the associated context.
+        //
+        return new Expression(((XMLEncoder)out).getOwner(), 
"getControlBeanContext", null);
+    }
+
+    /**
+     * PersistenceDelegate.initialize()
+     */
+    protected void initialize(Class<?> type, Object oldInstance, Object 
newInstance, Encoder out)
+    {
+        //super.initialize(type, oldInstance, newInstance, out);
+    }
+
+    /**
+     * PersistenceDelegate.writeObject()
+     */
+    public void writeObject(Object oldInstance, Encoder out)
+    {
+        super.writeObject(oldInstance, out);
+    }
+}

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java
      (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java
      Sun Jan  9 19:19:32 2005
@@ -286,7 +286,7 @@
      * REVIEW: could probably improve the granularity of locking here, but 
start w/ just
      * synchronizing the entire fn.
      */
-    protected synchronized Object ensureControl()
+    public synchronized Object ensureControl()
     {
         if (_control == null)
         {
@@ -335,6 +335,11 @@
     }
 
     /**
+     * Returns the implementation instance associated with this ControlBean.
+     */
+    /* package */ Object getImplementation() { return _control; }
+
+    /**
      * The preinvoke method is called before all operations on the control.  
It is the basic
      * hook for logging, context initialization, resource management, and 
other common
      * services
@@ -415,7 +420,7 @@
     /**
      * Sets the EventNotifier for this ControlBean
      */
-    protected void setEventNotifier(Class eventSet, Object notifier)
+    protected <T> void setEventNotifier(Class<T> eventSet, T notifier)
     {
         _notifiers.put(eventSet,notifier);
 
@@ -461,9 +466,9 @@
     /**
      * Returns an EventNotifier/UnicastEventNotifier for this ControlBean for 
the target event set
      */
-    protected Object getEventNotifier(Class eventSet)
+    protected <T> T getEventNotifier(Class<T> eventSet)
     {
-        return _notifiers.get(eventSet);
+        return (T)_notifiers.get(eventSet);
     }
 
     /**
@@ -842,6 +847,15 @@
 
         oos.defaultWriteObject();
     }
+
+    /**
+     * Called during XMLDecoder reconstruction of a ControlBean.
+     */
+    public void decodeImpl(Object impl) 
+    {
+        if (impl != _control)
+            throw new ControlException("Cannot change implementation");
+    };
 
     /**
      * Retrieves interceptor instances, creates them lazily.

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java
       (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlPersistenceDelegate.java
       Sun Jan  9 19:19:32 2005
@@ -20,12 +20,17 @@
 import java.beans.BeanInfo;
 import java.beans.DefaultPersistenceDelegate;
 import java.beans.Encoder;
+import java.beans.EventSetDescriptor;
 import java.beans.Expression;
 import java.beans.IntrospectionException;
 import java.beans.Introspector;
 import java.beans.PersistenceDelegate;
 import java.beans.PropertyDescriptor;
 import java.beans.Statement;
+import java.beans.XMLEncoder;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Iterator;
 import java.util.Set;
 
 import org.apache.beehive.controls.api.ControlException;
@@ -35,11 +40,11 @@
 import org.apache.beehive.controls.api.properties.PropertyMap;
 
 /**
- * The ControlPersistenceDelegate class supports the XML persistance of 
Control JavaBeans by
+ * The ControlPersistenceDelegate class supports the XML persistence of 
Control JavaBeans by
  * implementing the <code>java.beans.PersistenceDelegate</b> API, and 
overriding the default
- * persistance algorithm based upon the runtime structure for Controls.
+ * persistence algorithm based upon the runtime structure for Controls.
  * <p>
- * The ControlPersistanceDelegate class implements optimized property 
persistence based upon the
+ * The ControlPersistence class implements optimized property persistence 
based upon the
  * fact that the ControlBean already has a map containing all non-default 
property state.  Rather
  * than using the standard (and slower) algorithm of comparing the encoding 
instance against a
  * 'clean' instance, the delegate can simply retrieve the map and persist the 
values contained
@@ -65,12 +70,36 @@
         }   
     }
 
+    /**
+     * The FieldPersistencersistence is an XMLEncoder Persistence for the
+     * <code>java.lang.reflect.Field</code> claass.  It is similar to the one 
that comes
+     * bundled with the JDK with one key exception:  it works for non-public 
fields as
+     * well.
+     */
+    class FieldPersistenceDelegate extends PersistenceDelegate 
+    {
+        protected Expression instantiate(Object oldInstance, Encoder out) 
+        {
+            Field f = (Field)oldInstance;
+            return new Expression(oldInstance, f.getDeclaringClass(), 
"getDeclaredField",
+                                    new Object[]{f.getName()});
+        }
+    }
+
     protected Expression instantiate(Object oldInstance, Encoder out)
     {
-        System.err.println("ControlPersistenceDelegate instantiate(): " + 
oldInstance);
+        XMLEncoder xmlOut = (XMLEncoder)out;
         ControlBean control = (ControlBean)oldInstance;
 
         //
+        // If processing a nested control, then use the parent bean's context 
as the
+        // constructor context
+        //
+        ControlBeanContext cbc = null;
+        if (xmlOut.getOwner() != null)
+            cbc = ((ControlBean)xmlOut.getOwner()).getControlBeanContext();
+
+        //
         // See if the ControlBean has any associated PropertyMap in its 
delegation chain
         // that was derived from an AnnotatedElement so this relationship (and 
any associated 
         // external config delegates) will be restored as part of the decoding 
process.
@@ -86,9 +115,17 @@
                 aem = (AnnotatedElementMap)pMap;
 
                 //
-                // Ensure that there is a persistance delegate for the map
+                // Ignore a class-valued AnnotationElementMap.. this just 
refers to the
+                // Control type, and will be automatically reassociated at 
construction
+                // time
+                //
+                if (aem.getAnnotatedElement() instanceof Class)
+                    aem = null;
+
+                //
+                // Ensure that there is a persistence delegate for the map
                 //
-                out.setPersistenceDelegate(AnnotatedElementMap.class, 
+                xmlOut.setPersistenceDelegate(AnnotatedElementMap.class, 
                         new AnnotatedElementMapPersistenceDelegate());
                 break;
             }
@@ -105,7 +142,7 @@
         // any AnnotatedElementMap that was passed into the original 
constructor.
         //
         return new Expression(control, control.getClass(), "new", 
-                              new Object [] {null, control.getLocalID(), aem});
+                              new Object [] {cbc, control.getLocalID(), aem});
     }
 
     /**
@@ -113,8 +150,6 @@
      */
     protected void initialize(Class<?> type, Object oldInstance, Object 
newInstance, Encoder out)
     {
-        System.err.println("ControlPersistenceDelegate initialize(): " + 
oldInstance);
-
         //
         // Get the bean and associated beanInfo for the source instance
         //
@@ -128,46 +163,137 @@
         {
             throw new ControlException("Unable to locate BeanInfo", ie);
         }
-        //super.initialize(type, control, newInstance, out);
 
         //
-        // The default implementation of property persistance will use 
BeanInfo to incrementally
-        // compare oldInstance property values to newInstance property values. 
  Because the
-        // bean instance PropertyMap holds only the values that have been 
modified, this process
-        // can be optimized by directly writing out only the properties found 
in the map.
+        // Cast the encoding stream to an XMLEncoder (only encoding supported) 
and then set
+        // the stream owner to the bean being persisted
         //
-        BeanPropertyMap beanMap = control.getPropertyMap();
-        PropertyDescriptor [] propDescriptors = 
beanInfo.getPropertyDescriptors();
-        for (PropertyKey pk : beanMap.getPropertyKeys())
+        XMLEncoder xmlOut = (XMLEncoder)out;
+        Object owner = xmlOut.getOwner();
+        xmlOut.setOwner(control);
+        try
         {
+
             //
-            // Locate the PropertyDescriptor for the modified property, and 
use it to write
-            // the property value to the encoder stream
+            // The default implementation of property persistence will use 
BeanInfo to 
+            // incrementally compare oldInstance property values to 
newInstance property values.   
+            // Because the bean instance PropertyMap holds only the values 
that have been 
+            // modified, this process can be optimized by directly writing out 
only the properties 
+            // found in the map.
             //
-            String propName = pk.getPropertyName();
-            boolean found = false;
-            for (int i = 0; i < propDescriptors.length; i++)
+            BeanPropertyMap beanMap = control.getPropertyMap();
+            PropertyDescriptor [] propDescriptors = 
beanInfo.getPropertyDescriptors();
+            for (PropertyKey pk : beanMap.getPropertyKeys())
             {
-                if (propName.equals(propDescriptors[i].getName()))
+                //
+                // Locate the PropertyDescriptor for the modified property, 
and use it to write
+                // the property value to the encoder stream
+                //
+                String propName = pk.getPropertyName();
+                boolean found = false;
+                for (int i = 0; i < propDescriptors.length; i++)
                 {
-                    found = true;
-
-                    // Only write the property if it is not flagged as 
transient
-                    Object transientVal = 
propDescriptors[i].getValue("transient");
-                    if (transientVal == null || 
transientVal.equals(Boolean.FALSE))
+                    if (propName.equals(propDescriptors[i].getName()))
                     {
-                        out.writeStatement(
-                            new Statement(oldInstance, 
+                        found = true;
+
+                        // Only write the property if it is not flagged as 
transient
+                        Object transientVal = 
propDescriptors[i].getValue("transient");
+                        if (transientVal == null || 
transientVal.equals(Boolean.FALSE))
+                        {
+                            xmlOut.writeStatement(
+                                new Statement(oldInstance, 
                                       
propDescriptors[i].getWriteMethod().getName(),
                                       new Object [] 
{beanMap.getProperty(pk)}));
+                        }
+                    }
+                }
+                if (found == false)
+                {
+                    throw new ControlException("Unknown property in bean 
PropertyMap: " + pk);
+                }
+            }
+
+            //
+            // Get the bean context associated with the bean, and persist any 
nested controls
+            //
+            ControlBeanContext cbc = control.getControlBeanContext();
+            if (cbc.size() != 0)
+            {
+                xmlOut.setPersistenceDelegate(ControlBeanContext.class, 
+                                              new 
ContextPersistenceDelegate());
+
+                Iterator nestedIter = cbc.iterator();
+                while (nestedIter.hasNext())
+                {
+                    Object bean = nestedIter.next();
+                    if (bean instanceof ControlBean)
+                    {
+                        xmlOut.writeStatement(
+                            new Statement(cbc, "add", new Object [] { bean } 
));
                     }
                 }
             }
-            if (found == false)
+
+            //
+            // Restore any listeners associated with the control
+            // NOTE: NOT YET READY FOR PRIME TIME - KWM
+            //
+/*
+            EventSetDescriptor [] eventSetDescriptors = 
beanInfo.getEventSetDescriptors();
+            for (int i = 0; i < eventSetDescriptors.length; i++)
             {
-                throw new ControlException("Unknown property in bean 
PropertyMap: " + pk);
+                EventSetDescriptor esd = eventSetDescriptors[i];
+                Method listenersMethod = esd.getGetListenerMethod();
+                String addListenerName = esd.getAddListenerMethod().getName();
+                if (listenersMethod != null)
+                {
+                    //
+                    // Get the list of listeners, and then add statements to 
incrementally
+                    // add them in the same order
+                    //
+                    try
+                    {
+                        Object [] lstnrs = (Object 
[])listenersMethod.invoke(control, 
+                                                                             
new Object []{});
+                        for (int j = 0; j < lstnrs.length; j++)
+                        {
+                            xmlOut.writeStatement(
+                                new Statement(control, addListenerName, new 
Object [] {lstnrs[j]}));
+                        }
+                    }
+                    catch (Exception iae)
+                    {
+                        throw new ControlException("Unable to initialize 
listeners", iae);
+                    } 
+                }
+            }
+*/
+
+            //
+            // See if the control holds an implementation instance, if so, we 
need to include
+            // it (and any nested controls or state) in the encoding stream
+            //
+            Object impl = control.getImplementation();
+            if (impl != null)
+            {
+
+                //
+                // Set the persistence delegate for the impl class to the Impl 
delegate,
+                // set the current stream owner to the bean, and then write 
the implementation
+                //
+                xmlOut.setPersistenceDelegate(impl.getClass(), new 
ImplPersistenceDelegate());
+                //xmlOut.writeStatement(
+                //    new Statement(oldInstance, "decodeImpl", new Object [] 
{impl}));
+                xmlOut.writeStatement(
+                    new Statement(impl, "toString", null));
             }
         }
+        finally
+        {
+            // Restore the previous encoding stream owner
+            xmlOut.setOwner(owner);
+        }
     }
 
     /**
@@ -175,6 +301,7 @@
      */
     public void writeObject(Object oldInstance, Encoder out)
     {
+        out.setPersistenceDelegate(Field.class, new 
FieldPersistenceDelegate());
         super.writeObject(oldInstance, out);
     }
 }

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/EventNotifier.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/EventNotifier.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/EventNotifier.java&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/EventNotifier.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/EventNotifier.java
    (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/EventNotifier.java
    Sun Jan  9 19:19:32 2005
@@ -44,13 +44,29 @@
 
         _listeners.remove(listener);
     }
-                                                                               
                     
+
     /**
      * Returns an iterator over the full set of listeners
      */
-    public Iterator getListeners()
+    public Iterator listenerIterator()
     {
         return _listeners.iterator();
+    }
+
+    /**
+     * Returns the number of registered listeners
+     */
+    public int getListenerCount()
+    {
+        return _listeners.size();
+    }
+
+    /**
+     * Returns the listener list in array form
+     */
+    public void getListeners(Object [] listeners)
+    {
+        _listeners.toArray(listeners);
     }
 
     private ArrayList _listeners = new ArrayList();

Added: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplPersistenceDelegate.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplPersistenceDelegate.java?view=auto&rev=124758
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplPersistenceDelegate.java
  Sun Jan  9 19:19:32 2005
@@ -0,0 +1,70 @@
+package org.apache.beehive.controls.runtime.bean;
+/*
+ * Copyright 2004 The 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.
+ *
+ * $Header:$
+ */
+
+import java.beans.BeanInfo;
+import java.beans.DefaultPersistenceDelegate;
+import java.beans.Encoder;
+import java.beans.Expression;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PersistenceDelegate;
+import java.beans.PropertyDescriptor;
+import java.beans.Statement;
+import java.beans.XMLEncoder;
+import java.util.Set;
+
+import org.apache.beehive.controls.api.ControlException;
+
+/**
+ * The ImplPersistenceDelegate class supports the XML persistance of Control 
Implementation
+ * instances by implementing the <code>java.beans.PersistenceDelegate</b> API, 
and overriding 
+ * the default persistance algorithm based upon the runtime structure for 
Controls.
+ * <p>
+ */
+public class ImplPersistenceDelegate extends DefaultPersistenceDelegate
+{
+    /**
+     * PersistenceDelegate.instantiate()
+     */
+    protected Expression instantiate(Object oldInstance, Encoder out)
+    {
+        //
+        // An implementation instance is actually constructed at decode time 
by calling
+        // ControlBean.ensureControl on the parent bean.  This will create a 
new impl
+        // instance and run the impl initializer on it.
+        //
+        return new Expression(((XMLEncoder)out).getOwner(), "ensureControl", 
null);
+    }
+
+    /**
+     * PersistenceDelegate.initialize()
+     */
+    protected void initialize(Class<?> type, Object oldInstance, Object 
newInstance, Encoder out)
+    {
+        super.initialize(type, oldInstance, newInstance, out);
+    }
+
+    /**
+     * PersistenceDelegate.writeObject()
+     */
+    public void writeObject(Object oldInstance, Encoder out)
+    {
+        super.writeObject(oldInstance, out);
+    }
+}

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/UnicastEventNotifier.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/UnicastEventNotifier.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/UnicastEventNotifier.java&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/UnicastEventNotifier.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/UnicastEventNotifier.java
     (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/UnicastEventNotifier.java
     Sun Jan  9 19:19:32 2005
@@ -58,5 +58,22 @@
         return _listener;
     }
 
-    private Object    _listener;
+   /**
+     * Returns the number of registered listeners
+     */
+    public int getListenerCount()
+    {
+        return (_listener != null) ? 1 : 0;
+    }
+
+    /**
+     * Returns the listener list in array form
+     */
+    public void getListeners(Object [] listeners)
+    {
+        if (_listener != null)
+            listeners[0] = _listener;
+    }
+
+    private Object _listener;
 }

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java
    (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlClient.java
    Sun Jan  9 19:19:32 2005
@@ -199,7 +199,8 @@
             //
             // Do a quick check for the presence of the EventHandler 
annotation on methods
             //
-            if (clientMethod.getAnnotation(EventHandler.class) == null)
+            if (clientMethod.getAnnotation(EventHandler.class) == null ||
+                clientMethod.toString().equals("<clinit>()"))
                 continue;
 
             //

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlImplementation.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlImplementation.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlImplementation.java&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlImplementation.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlImplementation.java
    (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlImplementation.java
    Sun Jan  9 19:19:32 2005
@@ -296,7 +296,8 @@
             //
             // Do a quick check for the presence of the EventHandler 
annotation on methods
             //
-            if (implMethod.getAnnotation(EventHandler.class) == null)
+            if (implMethod.getAnnotation(EventHandler.class) == null ||
+                implMethod.toString().equals("<clinit>()"))
                 continue;
 
             //

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlInterface.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlInterface.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlInterface.java&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlInterface.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlInterface.java
 (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptControlInterface.java
 Sun Jan  9 19:19:32 2005
@@ -193,8 +193,10 @@
             if ( intfDecl.getMethods() == null )
                 continue;
 
+            // Add all declared methods, but ignore the mystery <clinit> 
methods
             for (MethodDeclaration methodDecl : intfDecl.getMethods())
-                operList.add(new AptOperation(this, methodDecl, _env));
+                if (!methodDecl.toString().equals("<clinit>()"))
+                    operList.add(new AptOperation(this, methodDecl, _env));
 
             if ( intfDecl.getSuperinterfaces() == null )
                 continue;

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptEventSet.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptEventSet.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptEventSet.java&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptEventSet.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptEventSet.java
 (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptEventSet.java
 Sun Jan  9 19:19:32 2005
@@ -168,11 +168,10 @@
                 
_superEventSet.getClassName().equals(intfDecl.getQualifiedName()))
                 continue;
 
-            //
-            // Add all declared methods on the current interface
-            //
+            // Add all declared methods, but ignore the mystery <clinit> 
methods
             for (MethodDeclaration methodDecl : intfDecl.getMethods())
-                events.add(new AptEvent(this, methodDecl, _env));
+                if (!methodDecl.toString().equals("<clinit>()"))
+                    events.add(new AptEvent(this, methodDecl, _env));
 
             //
             // Add all superinterfaces of the target interface to the list
@@ -288,9 +287,9 @@
     /**
      * Returns the name of the method used to retrieve the (unicast) EventSet 
listener
      */
-    public String getGetListenerMethod()
+    public String getGetListenersMethod()
     {
-        return "get" + getShortName() + "Listener";
+        return "get" + getShortName() + "Listeners";
     }
 
     /**

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptPropertySet.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptPropertySet.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptPropertySet.java&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptPropertySet.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptPropertySet.java
      (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptPropertySet.java
      Sun Jan  9 19:19:32 2005
@@ -69,8 +69,11 @@
         if (_propertySet == null || _propertySet.getMethods() == null )
             return properties;
         
+        // Add all declared method, but ignore the mystery <clinit> methods
         for (MethodDeclaration methodDecl : _propertySet.getMethods())
-            properties.add(new 
AptProperty(this,(AnnotationTypeElementDeclaration)methodDecl,_env));
+            if (!methodDecl.toString().equals("<clinit>()"))
+                properties.add(
+                    new 
AptProperty(this,(AnnotationTypeElementDeclaration)methodDecl,_env));
 
         return properties;
     }

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm
     (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ClientInitializer.vm
     Sun Jan  9 19:19:32 2005
@@ -98,10 +98,14 @@
 #end
 ##
 ##
-## This macro defines the initialization of a declared control
+## This macro defines the initialization of a declared control.  A check is 
made first to see
+## if an external initializer (like java.beans.XMLDecoder) has already 
instantiated a configured
+## bean into the context.
 ##
 #macro (initControl $control)
-    $control.controlBean.className $control.localName = new 
${control.controlBean.className}(cbc, "$control.name", getAnnotationMap(cbc, 
${control.reflectField}));
+    $control.controlBean.className $control.localName = 
($control.controlBean.className)cbc.getBean("$control.name");
+    if ($control.localName == null)
+        $control.localName = new ${control.controlBean.className}(cbc, 
"$control.name", getAnnotationMap(cbc, ${control.reflectField}));
     #initEventAdaptors($control)
     #if ($init.needsReflection($control))
     ${control.reflectField}.set(client, $control.localName);

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm
   (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm
   Sun Jan  9 19:19:32 2005
@@ -344,10 +344,10 @@
             return retval;
             #end
         #else
-            java.util.Iterator listenerIter = notifier.getListeners();
+            java.util.Iterator listenerIter = notifier.listenerIterator();
             while (listenerIter.hasNext())
             {
-                $event.eventSet.formalShortName listener = 
($event.eventSet.formalShortName)listenerIter.next();
+                $event.eventSet.formalShortName listener = 
($eventSet.formalShortName)listenerIter.next();
                 listener.${event.name}($event.argList);
             }
         #end
@@ -397,17 +397,17 @@
         notifier.removeListener(listener);
     }
 
-    #if ($eventSet.unicast)
     /**
-     * Returns the registered listener for ${eventSet.shortName} events on the 
bean, or null
-     * if no listener has been registered
+     * Returns the  array of registered listeners for ${eventSet.shortName} 
events on the bean, or 
+     * an empty array if no listener has been registered
      */
-    public synchronized $eventSet.formalShortName 
${eventSet.getListenerMethod}()
+    public synchronized $eventSet.formalShortName [] 
${eventSet.getListenersMethod}()
     {
         $eventSet.notifierClass notifier = 
($eventSet.notifierClass)getEventNotifier(${eventSet.shortName}.class);
-        return ($eventSet.formalShortName)notifier.getListener();    
+        $eventSet.formalShortName [] listeners = new 
${eventSet.shortName}[notifier.getListenerCount()];
+        notifier.getListeners(listeners);
+        return listeners;    
     }
-    #end
 #end
 ##
 ## This macro declares the local (bean class) cache that is used for shared 
PropertyMaps

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm&r1=124757&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm
       (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBeanInfo.vm
       Sun Jan  9 19:19:32 2005
@@ -64,6 +64,7 @@
 
 import org.apache.beehive.controls.api.ControlException;
 import org.apache.beehive.controls.runtime.bean.ControlPersistenceDelegate;
+import org.apache.beehive.controls.runtime.packaging.ControlEventSetDescriptor;
 
 public class ${bean.shortName}BeanInfo 
 #if ($intf.superClass)
@@ -255,7 +256,7 @@
         int eventIndex = 0;
         MethodDescriptor [] eventDescriptors;
         EventSetDescriptor esd;
-        Method addListener, removeListener;
+        Method addListener, removeListener, getListeners;
         Class eventIntf;
 
         #foreach ($eventSet in $intf.eventSets)
@@ -272,6 +273,9 @@
                 removeListener = 
                     
${bean.className}.class.getDeclaredMethod("$eventSet.removeListenerMethod",
                                                                new Class [] { 
eventIntf });
+                getListeners = 
+                    
${bean.className}.class.getDeclaredMethod("$eventSet.getListenersMethod",
+                                                               new Class [] 
{});
             }
             catch (NoSuchMethodException nsme)
             {
@@ -289,8 +293,8 @@
 
             try
             {
-                esd = new EventSetDescriptor("$eventSet.descriptorName", 
eventIntf,
-                                              eventDescriptors, addListener, 
removeListener);
+                esd = new 
ControlEventSetDescriptor("$eventSet.descriptorName", eventIntf, 
+                            eventDescriptors, addListener, removeListener, 
getListeners);
                 #if ($eventSet.featureInfo)
                     #initFeatureDescriptor("esd" $eventSet.featureInfo 
$eventSet.descriptorName)
                 #end

Added: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/packaging/ControlEventSetDescriptor.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/packaging/ControlEventSetDescriptor.java?view=auto&rev=124758
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/packaging/ControlEventSetDescriptor.java
   Sun Jan  9 19:19:32 2005
@@ -0,0 +1,50 @@
+package org.apache.beehive.controls.runtime.packaging;
+
+import java.beans.EventSetDescriptor;
+import java.beans.IntrospectionException;
+import java.beans.MethodDescriptor;
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
+import java.lang.reflect.Method;
+
+/**
+ * The ControlEventSetDescriptor is a result of an infortunate evoluntary flaw 
in the 
+ * java.beans.EventSetDescriptor class.  The getListeners functionality for 
event sets was
+ * added after the initial implementation, and unfortunately, there is no 
constructor that
+ * let you specify <b>both</b> the MethodDescriptors for events <b>and</b> the 
getListener
+ * method.  To compensate for this, we must subclass and provide our own 
getGetListenerMethod
+ * implementation.
+ */
+public class ControlEventSetDescriptor extends EventSetDescriptor
+{
+    /**
+     * This constructor adds the getListenerMethod argument that is missing 
from the JDK!
+     */
+    public ControlEventSetDescriptor(String eventSetName, Class<?> 
listenerType,
+                                     MethodDescriptor[] 
listenerMethodDescriptors,
+                                     Method addListenerMethod, Method 
removeListenerMethod,
+                                     Method getListenerMethod)
+           throws IntrospectionException
+    {
+        super(eventSetName, listenerType, listenerMethodDescriptors, 
+              addListenerMethod, removeListenerMethod);
+
+        // Follow the same pattern as the JDK and store the method as a soft 
reference, so
+        // the introspector (alone) won't prevent Class garbage collection.
+        _getMethodRef = new SoftReference<Method>(getListenerMethod);
+    }
+
+    /**
+     * Override the default implementation of getGetListenerMethod to return 
the method
+     * provided in the constructor.
+     */
+    public Method getGetListenerMethod()
+    {
+        if (_getMethodRef == null)
+            return null;
+
+        return _getMethodRef.get();
+    }
+
+    Reference<Method> _getMethodRef;
+}

Modified: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestProps.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestProps.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestProps.java&r1=124757&p2=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestProps.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestProps.java
        (original)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestProps.java
        Sun Jan  9 19:19:32 2005
@@ -14,12 +14,12 @@
  * A simple control that nests the Props control, for nested property testing.
  */
 @ControlInterface
-public interface NestProps
+public interface NestProps extends Props
 {
     //
     // Returns a propertySet value for a simple nested control
     //
-    public Annotation getControlPropertySet(Class propertySet);
+    public Annotation getNestedPropertySet(Class propertySet);
 
     //
     // Returns a propertySet value for an extension nested control

Modified: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestPropsImpl.jcs
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestPropsImpl.jcs?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestPropsImpl.jcs&r1=124757&p2=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestPropsImpl.jcs&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestPropsImpl.jcs
     (original)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/NestPropsImpl.jcs
     Sun Jan  9 19:19:32 2005
@@ -1,8 +1,13 @@
 package org.apache.beehive.controls.test.controls.property;
 
+import java.beans.PropertyChangeEvent;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 
+import org.apache.beehive.controls.api.events.Client;
+import org.apache.beehive.controls.api.events.EventHandler;
+
 import org.apache.beehive.controls.api.bean.ControlImplementation;
 import org.apache.beehive.controls.api.bean.Control;
 import org.apache.beehive.controls.api.bean.Extensible;
@@ -15,6 +20,9 @@
 { 
     static final long serialVersionUID = 1L;
 
+    @Context
+    ControlBeanContext context;
+
     @Control 
     @Props.SimpleProps(simpleString="A field annotation value")
     Props propControl;
@@ -23,11 +31,23 @@
     @PropsExtension.ArrayProps(arrayString={"One","Two","Three"})
     private PropsExtension propExtControl;
 
+    @Client
+    PropertyEvents client;
+
+    /**
+     * Provides a simple test API to externally query the PropertySet values 
on this
+     * control.
+     */
+    public Annotation getControlPropertySet(Class propertySet)
+    {
+        return context.getControlPropertySet(propertySet);
+    }
+
     /**
      * Provides a simple test API to externally query the PropertySet values 
on a
      * nested control.
      */
-    public Annotation getControlPropertySet(Class propertySet)
+    public Annotation getNestedPropertySet(Class propertySet)
     {
         return propControl.getControlPropertySet(propertySet);
     }
@@ -35,5 +55,30 @@
     public Annotation getExtensionControlPropertySet(Class propertySet)
     {
         return propExtControl.getControlPropertySet(propertySet);
+    }
+
+    //
+    // Expose PropertyEvents from three potential sources: local properties, 
or from either of
+    // the two nested controls
+    //
+    @EventHandler(field="context", 
eventSet=ControlBeanContext.LifeCycle.class, 
+                  eventName="onPropertyChange")
+    public void onContextChange(PropertyChangeEvent pce)
+    {
+        client.onChange(pce);
+    }
+
+    @EventHandler(field="propControl", eventSet=Props.PropertyEvents.class, 
+                  eventName="onChange")
+    public void onPropsChange(PropertyChangeEvent pce)
+    {
+        client.onChange(pce);
+    }
+
+    @EventHandler(field="propExtControl", eventSet=Props.PropertyEvents.class, 
+                  eventName="onChange")
+    public void onExtPropsChange(PropertyChangeEvent pce)
+    {
+        client.onChange(pce);
     }
 } 

Modified: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/Props.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/Props.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/Props.java&r1=124757&p2=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/Props.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/Props.java
    (original)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/Props.java
    Sun Jan  9 19:19:32 2005
@@ -6,8 +6,12 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import java.beans.PropertyChangeEvent;
+
 import org.apache.beehive.controls.api.bean.ControlInterface;
 import org.apache.beehive.controls.api.bean.ExternalPropertySets;
+import org.apache.beehive.controls.api.events.EventSet;
+import org.apache.beehive.controls.api.packaging.PropertyInfo;
 import org.apache.beehive.controls.api.properties.PropertyKey;
 import org.apache.beehive.controls.api.properties.PropertySet;
 
@@ -85,6 +89,7 @@
     @Target( {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD} )
     public @interface TestAnnot
     {
+        @PropertyInfo(bound=true)   // will generate PropertyChange events
         SimpleProps simpleAnnot()
             default @SimpleProps(
                 simpleInt = ANNOT_INT_DEFAULT,
@@ -92,6 +97,15 @@
                 simpleClass =  java.beans.Beans.class,
                 simpleEnum = SimpleEnum.ChoiceC);
         ArrayProps arrayAnnot();
+    }
+
+    //
+    // Exposes PropertyChange events to an external client.
+    //
+    @EventSet
+    public interface PropertyEvents
+    {
+        public void onChange(PropertyChangeEvent pce);
     }
 
     //

Modified: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/PropsImpl.jcs
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/PropsImpl.jcs?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/PropsImpl.jcs&r1=124757&p2=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/PropsImpl.jcs&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/PropsImpl.jcs
 (original)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/property/PropsImpl.jcs
 Sun Jan  9 19:19:32 2005
@@ -1,5 +1,8 @@
 package org.apache.beehive.controls.test.controls.property;
 
+
+import java.beans.PropertyChangeEvent;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 
@@ -7,6 +10,8 @@
 import org.apache.beehive.controls.api.bean.Extensible;
 import org.apache.beehive.controls.api.context.Context;
 import org.apache.beehive.controls.api.context.ControlBeanContext;
+import org.apache.beehive.controls.api.events.Client;
+import org.apache.beehive.controls.api.events.EventHandler;
 import org.apache.beehive.controls.api.properties.PropertySet;
 
 @ControlImplementation
@@ -17,6 +22,9 @@
     @Context
     ControlBeanContext context;
 
+    @Client
+    PropertyEvents client;
+
     /**
      * Provides a simple test API to externally query the control instance 
PropertySet values 
      * returned by ControlBeanContext APIs
@@ -24,6 +32,17 @@
     public Annotation getControlPropertySet(Class propertySet)
     {
         return context.getControlPropertySet(propertySet);
+    }
+
+    /** 
+     * Set up a handler for context property change events, then expose them 
using the
+     * EventSet declared on the public interface.
+     */
+    @EventHandler(field="context", 
eventSet=ControlBeanContext.LifeCycle.class, 
+                  eventName="onPropertyChange")
+    public void onContextChange(PropertyChangeEvent pce)
+    {
+        client.onChange(pce);
     }
 
     /**

Modified: 
incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/property/DrivePropsBeans.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/property/DrivePropsBeans.java?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/property/DrivePropsBeans.java&r1=124757&p2=incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/property/DrivePropsBeans.java&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/property/DrivePropsBeans.java
     (original)
+++ 
incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/property/DrivePropsBeans.java
     Sun Jan  9 19:19:32 2005
@@ -418,7 +418,7 @@
                        return report;
                }
 
-        simpleProps = 
(SimpleProps)nestBean.getControlPropertySet(SimpleProps.class);
+        simpleProps = 
(SimpleProps)nestBean.getNestedPropertySet(SimpleProps.class);
         if (!simpleProps.simpleString().equals("A field annotation value")){
 
                        report.setStatus(Report.FAIL);

Modified: 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo&r1=124757&p2=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo
        (original)
+++ 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/beaninfo/InfoTestBean.beaninfo
        Sun Jan  9 19:19:32 2005
@@ -114,6 +114,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.beaninfo.InfoTestBean.removeTestEventsListener(org.apache.beehive.controls.test.controls.beaninfo.InfoTest$TestEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.beaninfo.InfoTest$TestEvents[] 
org.apache.beehive.controls.test.controls.beaninfo.InfoTestBean.getTestEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="InfoTest eventMethod1"
                     <method>

Modified: 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo&r1=124757&p2=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo
     (original)
+++ 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext1Bean.beaninfo
     Sun Jan  9 19:19:32 2005
@@ -268,6 +268,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.removeIntf2NewEventsListener(org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2NewEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2NewEvents[] 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.getIntf2NewEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="addInEvent1"
                     <method>
@@ -352,6 +355,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Ext1Bean.removeExt1NewEventsListener(org.apache.beehive.controls.test.controls.inherit.Ext1$Ext1NewEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Ext1$Ext1NewEvents[] 
org.apache.beehive.controls.test.controls.inherit.Ext1Bean.getExt1NewEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="ext1NewEvent1"
                     <method>
@@ -406,6 +412,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.removeIntf1EventsListener(org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1Events)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1Events[] 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.getIntf1EventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="intf1Event1"
                     <method>
@@ -490,6 +499,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Ext1Bean.removeExt1EventsListener(org.apache.beehive.controls.test.controls.inherit.Ext1$Ext1Events)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Ext1$Ext1Events[] 
org.apache.beehive.controls.test.controls.inherit.Ext1Bean.getExt1EventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="addInEvent1"
                     <method>
@@ -664,6 +676,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.removeIntf1NewEventsListener(org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1NewEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1NewEvents[] 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.getIntf1NewEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="intf1NewEvent1"
                     <method>
@@ -718,6 +733,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.removeIntf2EventsListener(org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2Events)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2Events[] 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.getIntf2EventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="addInEvent1"
                     <method>

Modified: 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo&r1=124757&p2=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo
     (original)
+++ 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Ext2Bean.beaninfo
     Sun Jan  9 19:19:32 2005
@@ -298,6 +298,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Ext2Bean.removeExt2SkipEventsListener(org.apache.beehive.controls.test.controls.inherit.Ext2$Ext2SkipEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Ext2$Ext2SkipEvents[] 
org.apache.beehive.controls.test.controls.inherit.Ext2Bean.getExt2SkipEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="addInEvent1"
                     <method>
@@ -472,6 +475,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Ext2Bean.removeExt2NewEventsListener(org.apache.beehive.controls.test.controls.inherit.Ext2$Ext2NewEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Ext2$Ext2NewEvents[] 
org.apache.beehive.controls.test.controls.inherit.Ext2Bean.getExt2NewEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="ext2NewEvent1"
                     <method>
@@ -526,6 +532,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.removeIntf2NewEventsListener(org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2NewEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2NewEvents[] 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.getIntf2NewEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="addInEvent1"
                     <method>
@@ -610,6 +619,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Ext1Bean.removeExt1NewEventsListener(org.apache.beehive.controls.test.controls.inherit.Ext1$Ext1NewEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Ext1$Ext1NewEvents[] 
org.apache.beehive.controls.test.controls.inherit.Ext1Bean.getExt1NewEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="ext1NewEvent1"
                     <method>
@@ -664,6 +676,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.removeIntf1EventsListener(org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1Events)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1Events[] 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.getIntf1EventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="intf1Event1"
                     <method>
@@ -748,6 +763,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Ext1Bean.removeExt1EventsListener(org.apache.beehive.controls.test.controls.inherit.Ext1$Ext1Events)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Ext1$Ext1Events[] 
org.apache.beehive.controls.test.controls.inherit.Ext1Bean.getExt1EventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="addInEvent1"
                     <method>
@@ -922,6 +940,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.removeIntf1NewEventsListener(org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1NewEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1NewEvents[] 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.getIntf1NewEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="intf1NewEvent1"
                     <method>
@@ -976,6 +997,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.removeIntf2EventsListener(org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2Events)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2Events[] 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.getIntf2EventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="addInEvent1"
                     <method>
@@ -1120,6 +1144,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Ext2Bean.removeExt2EventsListener(org.apache.beehive.controls.test.controls.inherit.Ext2$Ext2Events)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Ext2$Ext2Events[] 
org.apache.beehive.controls.test.controls.inherit.Ext2Bean.getExt2EventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="addInEvent1"
                     <method>

Modified: 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo&r1=124757&p2=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo
    (original)
+++ 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf1Bean.beaninfo
    Sun Jan  9 19:19:32 2005
@@ -136,6 +136,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.removeIntf1EventsListener(org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1Events)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1Events[] 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.getIntf1EventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="intf1Event1"
                     <method>
@@ -220,6 +223,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.removeIntf1NewEventsListener(org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1NewEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1NewEvents[] 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.getIntf1NewEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="intf1NewEvent1"
                     <method>

Modified: 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo?view=diff&rev=124758&p1=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo&r1=124757&p2=incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo&r2=124758
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo
    (original)
+++ 
incubator/beehive/trunk/controls/test/src/units/org/apache/beehive/controls/test/java/inherit/Intf2Bean.beaninfo
    Sun Jan  9 19:19:32 2005
@@ -238,6 +238,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.removeIntf2NewEventsListener(org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2NewEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2NewEvents[] 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.getIntf2NewEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="addInEvent1"
                     <method>
@@ -322,6 +325,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.removeIntf1EventsListener(org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1Events)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1Events[] 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.getIntf1EventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="intf1Event1"
                     <method>
@@ -406,6 +412,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.removeIntf1NewEventsListener(org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1NewEvents)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf1$Intf1NewEvents[] 
org.apache.beehive.controls.test.controls.inherit.Intf1Bean.getIntf1NewEventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="intf1NewEvent1"
                     <method>
@@ -460,6 +469,9 @@
             <remove-listener-method>
                 public synchronized void 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.removeIntf2EventsListener(org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2Events)
             </remove-listener-method>
+            <get-listener-method>
+                public synchronized 
org.apache.beehive.controls.test.controls.inherit.Intf2$Intf2Events[] 
org.apache.beehive.controls.test.controls.inherit.Intf2Bean.getIntf2EventsListeners()
+            </get-listener-method>
             <listener-method-descriptors>
                 <method-descriptor name="addInEvent1"
                     <method>

Reply via email to