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
