Author: kentam
Date: Mon Nov 29 19:52:56 2004
New Revision: 106983

URL: http://svn.apache.org/viewcvs?view=rev&rev=106983
Log:
Initial controls thread-safety work -- mostly on operations.  Properties and 
events still need analysis.

CR: KyleM


Added:
   
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/Threading.java
   (contents, props changed)
   
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ThreadingPolicy.java
   (contents, props changed)
Modified:
   
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ControlBean.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/ControlBeanContext.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlContainerContext.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplInitializer.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ResourceContextImpl.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/CodeGenerator.java
   
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/apt/ControlClientAnnotationProcessor.java
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestBeanContext.java
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestContext.java
   
incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/composition/ComposerBeanDriver.java

Modified: 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ControlBean.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ControlBean.java?view=diff&rev=106983&p1=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ControlBean.java&r1=106982&p2=incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ControlBean.java&r2=106983
==============================================================================
--- 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ControlBean.java
      (original)
+++ 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ControlBean.java
      Mon Nov 29 19:52:56 2004
@@ -17,10 +17,10 @@
  * $Header:$
  */
 
+import org.apache.beehive.controls.api.context.ControlBeanContext;
+
 import java.beans.beancontext.BeanContext;
 import java.beans.beancontext.BeanContextProxy;
-
-import org.apache.beehive.controls.api.context.ControlBeanContext;
 /**
  * The ControlBean interface defines a base set of methods that are 
implemented by all
  * <code>JavaBeans</code> that host Java Controls.

Added: 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/Threading.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/Threading.java?view=auto&rev=106983
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/Threading.java
        Mon Nov 29 19:52:56 2004
@@ -0,0 +1,35 @@
+package org.apache.beehive.controls.api.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.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Used to specify the desired threading policy to apply to a control 
+ * implementation type.  See [EMAIL PROTECTED] ThreadingPolicy}.  Only 
permitted
+ * on classes that are also annotated with [EMAIL PROTECTED] 
ControlImplementation}.
+ */
[EMAIL PROTECTED](RetentionPolicy.RUNTIME)
[EMAIL PROTECTED]({ElementType.TYPE})
+public @interface Threading
+{
+    ThreadingPolicy value() default ThreadingPolicy.SINGLE_THREADED;
+}

Added: 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ThreadingPolicy.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ThreadingPolicy.java?view=auto&rev=106983
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/controls/src/api/org/apache/beehive/controls/api/bean/ThreadingPolicy.java
  Mon Nov 29 19:52:56 2004
@@ -0,0 +1,47 @@
+package org.apache.beehive.controls.api.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:$
+ */
+
+/**
+ * Specifies threading policy for control implementations.  The constants
+ * of this enumerated type describe the threading policies that apply
+ * during execution of controls.  They are used in conjunction with the
+ * [EMAIL PROTECTED] Threading} annotation type to specify the 
responsibilities of
+ * the runtime infrastructure and control implementation with respect to
+ * threading.
+ */
+public enum ThreadingPolicy
+{
+    /**
+     * When a control implementation is declared as SINGLE_THREADED, the 
+     * controls infrastructure ensures that only a single thread will be
+     * executing in a particular instance of that control at any time.
+     * This is the default policy if no [EMAIL PROTECTED] Threading} 
annotation is
+     * specified.
+     */
+    SINGLE_THREADED,
+    /**
+     * When a control implementation is declared as MULTI_THREADED, the
+     * controls infrastructure permits multiple threads to concurrently
+     * execute in instances of that control.  It is then the responsibility
+     * of the implementation to ensure internal thread-safety using
+     * standard Java concurrency mechanisms.  This policy may yield higher
+     * performance, at the cost of additional work on the implementor's part.
+     */
+    MULTI_THREADED
+}

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=106983&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java&r1=106982&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java&r2=106983
==============================================================================
--- 
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
      Mon Nov 29 19:52:56 2004
@@ -18,22 +18,18 @@
  */
 
 import java.beans.beancontext.BeanContext;
-import java.beans.beancontext.BeanContextChild;
 import java.beans.beancontext.BeanContextServices;
-import java.beans.beancontext.BeanContextServicesSupport;
-import java.beans.beancontext.BeanContextServiceRevokedListener;
-import java.beans.beancontext.BeanContextServiceRevokedEvent;
-import java.beans.beancontext.BeanContextSupport;
 import java.io.IOException;
 import java.io.ObjectOutputStream;
-import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.lang.reflect.Field;
 import java.util.*;
+import java.util.concurrent.Semaphore;
 
 import org.apache.beehive.controls.api.ControlException;
+import org.apache.beehive.controls.api.bean.Threading;
+import org.apache.beehive.controls.api.bean.ThreadingPolicy;
 import org.apache.beehive.controls.api.context.ControlThreadContext;
 import org.apache.beehive.controls.api.events.EventRef;
 import org.apache.beehive.controls.api.events.EventSet;
@@ -46,8 +42,8 @@
  * The ControlBean class is an abstract base class for the JavaBean classes 
generated to support
  * Workshop controls.
  *
- * The ControlBean class extends the BeanContextServicesSupport class, meaning 
it is capable of
- * being a container and service provider for itself and other nested 
JavaBeans.
+ * The ControlBean class indirectly implements BeanContextProxy; the 
ControlBeanContext that it contains/scopes
+ * acts as that proxy.
  *
  * All support APIs (which may be called from derived derived subclasses or 
contextual services
  * are generally marked as protected and have names that start with an 
underscore.  This avoids the
@@ -55,65 +51,19 @@
  * extended (JCX) interface.
  */
 abstract public class ControlBean
-                      implements 
org.apache.beehive.controls.api.bean.ControlBean,
-                                 java.beans.beancontext.BeanContextProxy,
-                                 java.io.Serializable
+                      implements 
org.apache.beehive.controls.api.bean.ControlBean
 {
     public static final char IDSeparator = '/';
     public static final char FactorySeparator = ':';
 
-    //
-    // TODO: Replace this custom Mutex impl w/ JDK 1.5 Mutex
-    //
     /**
-     * The Mutex class provides a basic mutex implementation.  It does lock 
counting, so the owner
-     * can call lock() multiple times, but will be required to call unlock() 
an equivalent
-     * number of times to give up the mutex lock.
+     *
+     * @param context        the containing ControlBeanContext.  May be null, 
in which case the bean will attempt to
+     *                       associate with an active context at runtime (via 
thread-locals).   
+     * @param id
+     * @param initProperties
+     * @param controlClass
      */
-    private class Mutex implements java.io.Serializable
-    {
-        public synchronized void lock()
-        {
-            Thread currentThread = Thread.currentThread();
-            do
-            {
-                if (_owner == null)
-                {
-                    _owner = currentThread;
-                    _lockCount = 1;
-                }
-                else if (_owner == currentThread)
-                {
-                    _lockCount++;
-                }
-                else
-                {
-                    try { this.wait(); } catch (InterruptedException ie) {};
-                }
-            }
-            while (currentThread != _owner);
-        }
-
-        public synchronized void unlock()
-        {
-            if (_owner != Thread.currentThread())
-                throw new IllegalStateException("Must be lock owner to release 
mutex");
-
-            if (--_lockCount <= 0)
-            {
-                _owner = null;
-                notify();
-            }
-        }
-
-        //
-        // These can be safely marked transient, because a lock should never 
be held across
-        // Java serialization boundaries, since it is associated with a thread.
-        //
-        transient private Thread _owner;  // owning thread, or null if 
available
-        transient private int _lockCount; // lock count of owning thread
-    }
-
     protected 
ControlBean(org.apache.beehive.controls.api.context.ControlBeanContext context,
                           String id, PropertyMap initProperties, Class 
controlClass)
     {
@@ -131,7 +81,7 @@
             context = ControlThreadContext.getContext();
 
         //
-        // Associate the constructed bean w/ a context (if any)
+        // Associate the constructed bean w/ a context (if any).  Beans may 
run without a context!
         //
         if (context != null)
             context.add(this);
@@ -172,20 +122,12 @@
             //
             _properties = new BeanPropertyMap(classMap);
         }
-
-        //
-        // If the implementation class requires a guarantee of single-threaded 
behavior and the
-        // outer container does not guarantee it, then enable invocation 
locking on this
-        // bean instance.
-        //
-        if (hasSingleThreadedImpl() && !hasSingleThreadedContainer())
-            _invokeLock = new Mutex();
     }
 
     /**
      * Return the BeanContextService proxy associated with this bean instance
      */
-    final public ControlBeanContext getBeanContextProxy()
+    final public synchronized ControlBeanContext getBeanContextProxy()
     {
         if (_cbc == null)
             _cbc = new ControlBeanContext(this);
@@ -194,13 +136,15 @@
     }
 
     /**
-     * Returns the nesting BeanContext for this ControlBean.
+     * Returns the nesting BeanContext for this ControlBean.  This is 
thread-safe even though it
+     * is not synchronized.
      */
     final public BeanContext getBeanContext()
     {
         //
         // Indirect through the bean proxy for this control bean and up to its 
parent nesting
-        // context
+        // context.  Both these calls (getBeanContextProxy() and 
getBeanContext()) are, and must
+        // remain, thread-safe.
         //
         return getBeanContextProxy().getBeanContext();
     }
@@ -210,7 +154,7 @@
      * changed.  This is the place to do any initialization (or 
reinitialization) that is dependent
      * upon attributes of the container for the ControlBean
      */
-    final public void setBeanContext(BeanContext bc)
+    final public synchronized void setBeanContext(BeanContext bc)
     {
         //
         // If the implementation class requires a guarantee of single-threaded 
behavior and the
@@ -218,7 +162,7 @@
         // bean instance.
         //
         if (hasSingleThreadedImpl() && !hasSingleThreadedContainer())
-            _invokeLock = new Mutex();
+            _invokeLock = new Semaphore(1, true);
         else
             _invokeLock = null;
     }
@@ -242,7 +186,8 @@
     /**
      * This method will return true if the external container for this control
      * guarantees single-threaded behavior.  For example, the EJB container 
does
-     * provide this guarantee, the servlet container does not.
+     * provide this guarantee, the servlet container does not.  This 
implementation is
+     * thread-safe even though it is not synchronized.
      */
     /* package */ boolean hasSingleThreadedContainer()
     {
@@ -256,16 +201,18 @@
 
     /**
      * Returns true if the implementation class for this ControlBean can be 
assumed to
-     * be thread-safe.  For now, implementations are always assumed to be 
thread unsafe
+     * be thread-safe.
      */
-    /* package */ boolean hasSingleThreadedImpl()
+    private synchronized boolean hasSingleThreadedImpl()
     {
-        return false;
+        return _threadingPolicy == ThreadingPolicy.SINGLE_THREADED;
     }
 
     /**
      * Returns true if the ControlBean instance is running in an environment 
that
-     * guarantees single-threaded behvior, false otherwise
+     * guarantees single-threaded behaviour, false otherwise.
+     *
+     * Thread-safe even thought not synchronized.
      */
     public boolean isSingleThreadedBean()
     {
@@ -285,7 +232,7 @@
     /**
      * Obtains an instance of the appropriate ImplInitializer class
      */
-    public ImplInitializer getImplInitializer()
+    protected synchronized ImplInitializer getImplInitializer()
     {
         if (_implInitializer == null)
         {
@@ -308,9 +255,14 @@
     /**
      * Returns the target control instance associated with this ControlBean, 
performing lazy
      * instantiation and initialization of the instance.
+     *
+     * REVIEW: could probably improve the granularity of locking here, but 
start w/ just
+     * synchronizing the entire fn.
      */
-    protected Object ensureControl()
+    protected synchronized Object ensureControl()
     {
+        Class implClass = null;
+
         if (_control == null)
         {
             try
@@ -320,7 +272,14 @@
                 // an associated implementation.
                 //
                 ControlBeanContext context = getBeanContextProxy();
-                Class implClass = context.getControlBinding(_controlClass);
+                implClass = context.getControlBinding(_controlClass);
+
+                //
+                // Read the threading policy associated with the impl
+                //
+                Threading thr = 
(Threading)implClass.getAnnotation(Threading.class);
+                if ( thr != null )
+                    _threadingPolicy = thr.value();
 
                 //
                 // Create and initialize the new instance
@@ -361,6 +320,14 @@
             _hasServices = true;
         }
 
+        //
+        // If the implementation class requires a guarantee of single-threaded 
behavior and the
+        // outer container does not guarantee it, then enable invocation 
locking on this
+        // bean instance.
+        //
+        if (hasSingleThreadedImpl() && !hasSingleThreadedContainer())
+            _invokeLock = new Semaphore(1, true);
+
         return _control;
     }
 
@@ -376,7 +343,9 @@
         // not guarantee it, then enforce it locally here
         //
         if (_invokeLock != null)
-            _invokeLock.lock();
+        {
+            try { _invokeLock.acquire(); } catch (InterruptedException ie) { }
+        }
 
         Vector<InvokeListener> invokeListeners = getInvokeListeners();
         if (invokeListeners.size() > 0)
@@ -408,7 +377,7 @@
             // Release any lock obtained above in preInvoke
             //
             if (_invokeLock != null)
-                _invokeLock.unlock();
+                _invokeLock.release();
         }
     }
 
@@ -694,7 +663,7 @@
      * Implementation of the Java serialization writeObject method
      */
     private synchronized void writeObject(ObjectOutputStream oos) 
-                              throws IOException, ClassNotFoundException 
+                              throws IOException
     {
         //
         // Reset any contextual service references held by the implementation 
prior to
@@ -709,20 +678,14 @@
         oos.defaultWriteObject();
     }
 
-    /**
-     * The control ID associated with this instance
-     */
-    private String _localID;
-
-    /**
-     * The control ID associated with this instance
-     */
-    private String _id;
+    /* BEGIN synchronized fields */
 
-    /**
-     * The public control interface associated with this ControlBean
+    /*
+     * The following fields must be:
+     * 1) only written in synchronized methods
+     * 2) only read in synchronized methods or methods that are safe wrt the 
values changing during
+     *    execution.
      */
-    private Class _controlClass;
 
     /**
      * The control implementation instance wrapped by this ControlBean
@@ -735,37 +698,60 @@
     private ControlBeanContext _cbc;
 
     /**
-     *  Contains the per-instance properties set for this ControlBean.
+     * An ImplInitializer instances used to initialize/reset the state of the 
associated
+     * implementation instance.
      */
-    private PropertyMap _properties;
+    transient private ImplInitializer _implInitializer;
 
     /**
-     * This field manages the register listener list(s) associated with event 
set interfaces
-     * for the ControlBean.
+     * Indicates whether the contextual services associated with the bean have 
been
+     * fully initialized.
      */
-    private HashMap<Class, EventNotifier> _notifierMap = new 
HashMap<Class,EventNotifier>();
+    transient private boolean _hasServices = false;
 
     /**
-     * Maintains the list of callback event listeners (if any) for this 
ControlBean.
+     * The threading policy associated with the control implementation wrapped 
by this
+     * ControlBean.
      */
-    transient private Vector<InvokeListener> _invokeListeners;
+    transient private ThreadingPolicy _threadingPolicy = 
ThreadingPolicy.SINGLE_THREADED;
 
     /**
      * Used to guarantee single threaded invocation when required.  If the
      * outer container provides the guarantee or the implementation itself
      * is threadsafe, then the value will be null.
      */
-    transient private Mutex _invokeLock;
+    transient private Semaphore _invokeLock;
+
+    /** END synchronized fields */
 
     /**
-     * An ImplInitializer instances used to initialize/reset the state of the 
associated
-     * implementation instance.
+     * The control ID associated with this instance
      */
-    transient private ImplInitializer _implInitializer;
+    private String _localID;
 
     /**
-     * Indicates whether the contextual services associated with the bean have 
been
-     * fully initialized.
+     * The control ID associated with this instance
      */
-    transient private boolean _hasServices = false;
+    private String _id;
+
+    /**
+     * The public control interface associated with this ControlBean
+     */
+    private Class _controlClass;
+
+    /**
+     *  Contains the per-instance properties set for this ControlBean.
+     */
+    private PropertyMap _properties;
+
+    /**
+     * This field manages the register listener list(s) associated with event 
set interfaces
+     * for the ControlBean.
+     */
+    private HashMap<Class, EventNotifier> _notifierMap = new 
HashMap<Class,EventNotifier>();
+
+    /**
+     * Maintains the list of callback event listeners (if any) for this 
ControlBean.
+     */
+    transient private Vector<InvokeListener> _invokeListeners;
 }

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBeanContext.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBeanContext.java?view=diff&rev=106983&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBeanContext.java&r1=106982&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBeanContext.java&r2=106983
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBeanContext.java
       (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBeanContext.java
       Mon Nov 29 19:52:56 2004
@@ -24,7 +24,6 @@
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyVetoException;
 import java.beans.beancontext.BeanContext;
-import java.beans.beancontext.BeanContextChild;
 import java.beans.beancontext.BeanContextServiceRevokedEvent;
 import java.beans.beancontext.BeanContextServiceRevokedListener;
 import java.beans.beancontext.BeanContextServiceProvider;
@@ -43,7 +42,6 @@
 import org.apache.beehive.controls.api.context.ControlHandle;
 import org.apache.beehive.controls.api.properties.AnnotatedElementMap;
 import org.apache.beehive.controls.api.properties.PropertyMap;
-import org.apache.beehive.controls.api.properties.PropertySet;
 import org.apache.beehive.controls.api.properties.BeanPropertyMap;
 
 /**
@@ -60,16 +58,21 @@
                                         implements 
BeanContextServiceRevokedListener,
                                                    
org.apache.beehive.controls.api.context.ControlBeanContext
 {
-    static private HashMap<Class,BeanContextServiceProvider> _providers = 
-                    new HashMap<Class,BeanContextServiceProvider>();
-
     /**
      * Creates a new ControlBeanContext instance associated with a specific
      * control bean.
+     *
+     * @param bean The control bean that contains/scopes the 
ControlBeanContext.  If null, it means the
+     *             ControlBeanContext is for a top-level container.
      */
     protected ControlBeanContext(ControlBean bean)
     {
         _bean = bean;
+
+        // If _bean is non-null, this ControlBeanContext is defined by a 
ControlBean.
+        // If that ControlBean is single-threaded, it implies this context 
acts as a single-threaded container.
+        if ( _bean != null )
+            _isSingleThreadedContainer = _bean.isSingleThreadedBean();
     }
 
     /**
@@ -155,9 +158,8 @@
     public void setBeanContext(BeanContext beanContext) throws 
PropertyVetoException
     {
         ControlBeanContext cbcs = null;
-        String id = _bean.getLocalID();
 
-        if (beanContext != null) 
+        if (beanContext != null)
         {
             //
             // ControlBeans can only be nested in context service instances 
that derive
@@ -174,24 +176,31 @@
             cbcs = (ControlBeanContext)beanContext;
         }
 
-        super.setBeanContext(beanContext);
 
-        //
-        // Notify the bean that its context (container) has been set
-        //
-        _bean.setBeanContext(beanContext);
+        super.setBeanContext(beanContext);
 
-        //
-        // Establish a new value for the absolute control ID based upon the 
nesting context
-        // and parent bean (if any).
-        //
-        if (beanContext != null)
+        if (_bean != null)
         {
-            ControlBean parentBean = cbcs.getControlBean();
-            if (parentBean != null)
-                id = parentBean.getControlID() + ControlBean.IDSeparator + id;
+            String id = _bean.getLocalID();
+
+            //
+            // Notify the bean that its context (container) has been set
+            //
+            _bean.setBeanContext(beanContext);
+
+            //
+            // Establish a new value for the absolute control ID based upon 
the nesting context
+            // and parent bean (if any).
+            //
+            if (beanContext != null)
+            {
+                ControlBean parentBean = cbcs.getControlBean();
+                if (parentBean != null)
+                    id = parentBean.getControlID() + ControlBean.IDSeparator + 
id;
+            }
+
+            _bean.setControlID(id);
         }
-        _bean.setControlID(id);
     }
 
     /**
@@ -349,11 +358,7 @@
      */
     public boolean isSingleThreadedContainer()
     {
-        if (_bean != null)
-            return _bean.isSingleThreadedBean();
-
-        // Better safe than sorry, in this case
-        return false;
+        return _isSingleThreadedContainer;
     }
 
     /**
@@ -716,6 +721,13 @@
      * be null, if the context instance is associated with top-level 
(non-control) context.
      */
     private ControlBean _bean;
+
+    /**
+     * Indicates whether this context acts as a single-threaded container (for 
ControlBeans nested
+     * by the ControlBean that scopes this context, i.e. _bean).  This is 
fixed at construction time
+     * of the context, and defaults to false for safety.
+     */
+    private boolean _isSingleThreadedContainer = false;
 
     /**
      * Maps children by the local (relative) ID of the child to the actual 
bean instance.

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlContainerContext.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlContainerContext.java?view=diff&rev=106983&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlContainerContext.java&r1=106982&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlContainerContext.java&r2=106983
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlContainerContext.java
  (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlContainerContext.java
  Mon Nov 29 19:52:56 2004
@@ -156,7 +156,7 @@
      * used to dispatch events and operations to a control instance.  This 
method will return
      * null if the containing component does not support direct dispatch.
      *
-     * @param targetID the composite ID of the target control bean
+     * @param bean the target control bean
      */
     public ControlHandle 
getControlHandle(org.apache.beehive.controls.api.bean.ControlBean bean)
     {

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplInitializer.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplInitializer.java?view=diff&rev=106983&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplInitializer.java&r1=106982&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplInitializer.java&r2=106983
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplInitializer.java
  (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ImplInitializer.java
  Mon Nov 29 19:52:56 2004
@@ -17,8 +17,7 @@
  * $Header:$
  */
 
-import java.lang.reflect.AnnotatedElement;
-import org.apache.beehive.controls.api.properties.PropertyMap;
+
 
 /**
  * The ImplInitializer class is an abstract base class that all generated 
Control

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ResourceContextImpl.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ResourceContextImpl.java?view=diff&rev=106983&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ResourceContextImpl.java&r1=106982&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ResourceContextImpl.java&r2=106983
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ResourceContextImpl.java
      (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ResourceContextImpl.java
      Mon Nov 29 19:52:56 2004
@@ -17,13 +17,13 @@
  * $Header:$
  */
 
-import java.beans.beancontext.BeanContextServices;
+import org.apache.beehive.controls.api.context.ResourceContext;
+
 import java.beans.beancontext.BeanContextServiceProvider;
+import java.beans.beancontext.BeanContextServices;
 import java.lang.reflect.Method;
 import java.util.Iterator;
 import java.util.Vector;
-
-import org.apache.beehive.controls.api.context.ResourceContext;
 
 /**
  * The ResourceContextImpl class provides an implementation of the 
ResourceContext service,

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/CodeGenerator.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/CodeGenerator.java?view=diff&rev=106983&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/CodeGenerator.java&r1=106982&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/CodeGenerator.java&r2=106983
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/CodeGenerator.java
       (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/CodeGenerator.java
       Mon Nov 29 19:52:56 2004
@@ -18,8 +18,7 @@
  * $Header:$
  */
 
-import java.io.File;
-import java.util.List;
+
 
 /**
  * The CodeGenerator class is an abstract base class that encapsulates the 
invocation

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=106983&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm&r1=106982&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm&r2=106983
==============================================================================
--- 
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
   Mon Nov 29 19:52:56 2004
@@ -47,6 +47,9 @@
     // class file, but if available can enable ease of use by referencing 
parameters by
     // the declared name (vs. by index).
     //
+    // This map should be read-only after its initialization in the static 
block, hence
+    // using a plain HashMap is thread-safe.
+    //
     static HashMap<Method, String []> _methodParamMap = new HashMap<Method, 
String []>();
 #end
 ##
@@ -140,18 +143,18 @@
      */
     public $returnType ${operation.name}($operation.argDecl) 
$operation.throwsClause
     {
-        Object [] _argArray = new Object[] { $operation.argList };
-        Throwable _thrown = null;
+        Object [] argArray = new Object[] { $operation.argList };
+        Throwable thrown = null;
         #if (!$intf.isExtension())
-        $intf.className _target = ($intf.className)ensureControl();
+        $intf.className target = ($intf.className)ensureControl();
         #else
-        Extensible _target = (Extensible)ensureControl();
+        Extensible target = (Extensible)ensureControl();
         #end
         #if ($returnType != "void")
-        $returnType _retval = ${operation.defaultReturnValue};
+        $returnType retval = ${operation.defaultReturnValue};
         #end
 
-        preInvoke(${operation.methodField}, _argArray);
+        preInvoke(${operation.methodField}, argArray);
         try
         {
             ##
@@ -160,15 +163,15 @@
             ##      - extensible invoke (declared on a ControlExtension)
             ##
             #if ($returnType != "void")
-            _retval = 
+            retval = 
             #end
             #if (!$intf.isExtension())
-            _target.${operation.name}($operation.argList)
+            target.${operation.name}($operation.argList)
             #else
             #if ($returnType != "void")
             (#toObject ($returnType))
             #end
-            _target.invoke(${operation.methodField}, _argArray)
+            target.invoke(${operation.methodField}, argArray)
             #end
             ;
         }
@@ -179,7 +182,7 @@
             // the exception status.  Errors, RuntimExceptions, or declared 
checked exceptions will 
             // be rethrown.
             //
-            _thrown = t;
+            thrown = t;
  
             if (t instanceof Error) throw (Error)t;
             else if (t instanceof RuntimeException) throw (RuntimeException)t;
@@ -192,13 +195,13 @@
         finally
         {
             #if ($returnType != "void")
-            postInvoke(_retval, _thrown);
+            postInvoke(retval, thrown);
             #else
-            postInvoke(null, _thrown);
+            postInvoke(null, thrown);
             #end
         }
         #if ($returnType != "void")
-        return _retval;
+        return retval;
         #end
     }
 
@@ -239,7 +242,7 @@
     public $returnType ${event.name}($event.argDecl) $event.throwsClause
     {
         #if ($returnType != "void")
-        $returnType _retval = ${event.defaultReturnValue};
+        $returnType retval = ${event.defaultReturnValue};
         #end
 
         $event.eventSet.shortName listener = 
($event.eventSet.shortName)getEventNotifier(${event.eventSet.shortName}.class).getListener();
@@ -250,13 +253,13 @@
         if (listener != null)
         {
             #if ($returnType != "void")
-            _retval = listener.${event.name}($event.argList);
+            retval = listener.${event.name}($event.argList);
             #else
             listener.${event.name}($event.argList);
             #end
         }
         #if ($returnType != "void")
-        return _retval;
+        return retval;
         #end
      }
 

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?view=diff&rev=106983&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/apt/ControlClientAnnotationProcessor.java&r1=106982&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/apt/ControlClientAnnotationProcessor.java&r2=106983
==============================================================================
--- 
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
        Mon Nov 29 19:52:56 2004
@@ -193,7 +193,7 @@
          else if ( fieldType instanceof ClassType )
          {
              // Valid class type decls must implements the ControlBean API.
-             
+
              // Walk the implementation inheritance hierarchy, seeing if one 
of the
              // classes implements ControlBean.
              //
@@ -243,14 +243,16 @@
 
          TypeDeclaration declaringType = f.getDeclaringType();
          assert declaringType != null : "Field " + f + " has no declaring 
type!";
-        
+
          if ( declaringType.getDeclaringType() != null )
              printError( f, "control.field.in.inner.class" );
-               
-         if ( f.getModifiers().contains( Modifier.TRANSIENT ))
+
+        Collection<Modifier> mods = f.getModifiers();
+
+         if ( mods.contains( Modifier.TRANSIENT ))
              printError( f, "transient.control.field" );
 
-         if ( f.getModifiers().contains( Modifier.STATIC ))
+         if ( mods.contains( Modifier.STATIC ))
              printError( f, "static.control.field" );
     }
 

Modified: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestBeanContext.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestBeanContext.java?view=diff&rev=106983&p1=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestBeanContext.java&r1=106982&p2=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestBeanContext.java&r2=106983
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestBeanContext.java
      (original)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestBeanContext.java
      Mon Nov 29 19:52:56 2004
@@ -1,12 +1,10 @@
 package org.apache.beehive.controls.test.controls.util;
 
-import java.beans.beancontext.BeanContextServices;
 import java.beans.beancontext.BeanContextServiceProvider;
-import java.util.Collection;
+import java.beans.beancontext.BeanContextServices;
+import java.lang.reflect.AnnotatedElement;
 import java.util.Iterator;
 import java.util.Vector;
-import java.util.Arrays;
-import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.InvocationTargetException;
 
 import org.apache.beehive.controls.api.events.EventRef;

Modified: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestContext.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestContext.java?view=diff&rev=106983&p1=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestContext.java&r1=106982&p2=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestContext.java&r2=106983
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestContext.java
  (original)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestContext.java
  Mon Nov 29 19:52:56 2004
@@ -1,6 +1,6 @@
 package org.apache.beehive.controls.test.controls.util;
 
-import java.util.Collection;
+
 
 /**
  * The TestContext is contextual service interface that is part of the basic 
test harness

Modified: 
incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/composition/ComposerBeanDriver.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/composition/ComposerBeanDriver.java?view=diff&rev=106983&p1=incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/composition/ComposerBeanDriver.java&r1=106982&p2=incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/composition/ComposerBeanDriver.java&r2=106983
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/composition/ComposerBeanDriver.java
       (original)
+++ 
incubator/beehive/trunk/controls/test/src/drivers/org/apache/beehive/controls/test/driver/composition/ComposerBeanDriver.java
       Mon Nov 29 19:52:56 2004
@@ -1,9 +1,10 @@
 package org.apache.beehive.controls.test.driver.composition;
 
-import java.util.Arrays;
-import org.apache.beehive.test.tools.milton.common.Report;
-import org.apache.beehive.controls.test.controls.util.TestBeanContext;
 import org.apache.beehive.controls.test.controls.composition.Composer;
+import org.apache.beehive.controls.test.controls.util.TestBeanContext;
+import org.apache.beehive.test.tools.milton.common.Report;
+
+import java.util.Arrays;
 
 /* This class contains the logic to test HelloControlBean
        It will exercise the control in a certain way and generate a

Reply via email to