Author: kentam
Date: Fri Dec 10 17:29:46 2004
New Revision: 111564

URL: http://svn.apache.org/viewcvs?view=rev&rev=111564
Log:
Initial implementation of interceptor infrastructure.  You can now define 
annotations that are implemented with interceptors, and the pre/post operation 
invoke methods on the interceptor will be called (other hook points are TBI).

DRT: windows


Added:
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptor.java
   (contents, props changed)
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptorContext.java
   (contents, props changed)
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptorContextImpl.java
   (contents, props changed)
Modified:
   
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/generator/AptOperation.java
   
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm
   
incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/svc/Interceptor.java
   incubator/beehive/trunk/controls/test/build.xml
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/extension/ExtensibleControl.java
   
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestBeanContext.java

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=111564&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java&r1=111563&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBean.java&r2=111564
==============================================================================
--- 
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
      Fri Dec 10 17:29:46 2004
@@ -43,6 +43,7 @@
 import org.apache.beehive.controls.api.properties.BeanPropertyMap;
 import org.apache.beehive.controls.api.properties.PropertyKey;
 import org.apache.beehive.controls.api.properties.PropertyMap;
+import org.apache.beehive.controls.spi.svc.Interceptor;
 
 /**
  * The ControlBean class is an abstract base class for the JavaBean classes 
generated to support
@@ -335,7 +336,7 @@
      * hook for logging, context initialization, resource management, and 
other common
      * services
      */
-    protected void preInvoke(Method m, Object [] args)
+    protected void preInvoke(Method m, Object [] args, String [] 
interceptorNames)
     {
         //
         // If the implementation expects single threaded behavior and our 
container does
@@ -346,6 +347,20 @@
             try { _invokeLock.acquire(); } catch (InterruptedException ie) { }
         }
 
+        //
+        // Process interceptors
+        //
+        if ( interceptorNames != null )
+        {
+            ControlBeanContext cbc = getControlBeanContext();
+
+            for ( String n : interceptorNames )
+            {
+                Interceptor i = ensureInterceptor( n );
+                i.preInvoke( m, args, cbc );
+            }
+        }
+
         Vector<InvokeListener> invokeListeners = getInvokeListeners();
         if (invokeListeners.size() > 0)
         {
@@ -359,10 +374,24 @@
      * hook for logging, context initialization, resource management, and 
other common
      * services.
      */
-    protected void postInvoke(Object retval, Throwable t)
+    protected void postInvoke(Method m, Object [] args, Object retval, 
Throwable t, String [] interceptorNames)
     {
         try
         {
+            //
+            // Process interceptors
+            //
+            if ( interceptorNames != null )
+            {
+                ControlBeanContext cbc = getControlBeanContext();
+
+                for ( String n : interceptorNames )
+                {
+                    Interceptor i = ensureInterceptor( n );
+                    i.postInvoke( m, args, retval, t, cbc );
+                }
+            }
+
             Vector<InvokeListener> invokeListeners = getInvokeListeners();
             if (invokeListeners.size() > 0)
             {
@@ -788,6 +817,52 @@
         oos.defaultWriteObject();
     }
 
+    /**
+     * Retrieves interceptor instances, creates them lazily.
+     */
+    private Interceptor ensureInterceptor( String n )
+    {
+        Interceptor i = _interceptors.get( n );
+        if ( i == null )
+        {
+            try
+            {
+                i  = (Interceptor) getControlService( 
getControlBeanContext().getClassLoader().loadClass( n ), null );
+            }
+            catch ( Exception e )
+            {
+                // Couldn't instantiate the desired service; usually this is 
because the service interface itself
+                // isn't present on this system at runtime 
(ClassNotFoundException), or if the container of the
+                // control didn't registers the service.
+
+                // TODO log a message here to that effect, but just swallow 
the exception for now.
+            }
+            finally
+            {
+                // We want to always return an interceptor, so if we can't get 
the one we want, we'll substitute
+                // a "null" interceptor that does nothing.
+                if ( i == null)
+                    i = new NullInterceptor();
+
+                _interceptors.put( n, i );
+            }
+        }
+        return i;
+    }
+
+    /**
+     * The "null" interceptor that does nothing.  Used when a specific 
interceptor
+     * is unavailable at runtime.
+     */
+    static private class NullInterceptor implements Interceptor
+    {
+        public boolean preInvoke( Method m, Object [] args, 
org.apache.beehive.controls.api.context.ControlBeanContext cbc ) { return true; 
}
+        public boolean postInvoke( Method m, Object [] args, Object retval, 
Throwable t, org.apache.beehive.controls.api.context.ControlBeanContext cbc ) { 
return true; }
+        public boolean preEvent( Class eventSet, Method m, Object [] args, 
org.apache.beehive.controls.api.context.ControlBeanContext cbc ) { return true; 
}
+        public boolean postEvent( Class eventSet, Method m, Object [] args, 
org.apache.beehive.controls.api.context.ControlBeanContext cbc ) { return true; 
}
+    }
+
+
     /* BEGIN synchronized fields */
 
     /*
@@ -879,4 +954,10 @@
      * Maintains the list of callback event listeners (if any) for this 
ControlBean.
      */
     transient private Vector<InvokeListener> _invokeListeners;
+
+    /**
+     * HashMap to hold interceptor impl instances.
+     * Populated lazily.  Maps interceptor interface name to impl.
+     */
+    transient private final HashMap<String,Interceptor> _interceptors = new 
HashMap<String,Interceptor>();
 }

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=111564&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBeanContext.java&r1=111563&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlBeanContext.java&r2=111564
==============================================================================
--- 
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
       Fri Dec 10 17:29:46 2004
@@ -29,15 +29,13 @@
 import java.beans.beancontext.BeanContextServiceProvider;
 import java.beans.beancontext.BeanContextServices;
 import java.beans.beancontext.BeanContextServicesSupport;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TooManyListenersException;
-import java.util.Vector;
+import java.util.*;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.BufferedReader;
+import java.io.IOException;
 
 import org.apache.beehive.controls.api.ControlException;
-import org.apache.beehive.controls.api.bean.ControlExtension;
 import org.apache.beehive.controls.api.bean.ControlInterface;
 import org.apache.beehive.controls.api.context.ControlHandle;
 import org.apache.beehive.controls.api.properties.AnnotatedElementMap;
@@ -687,6 +685,82 @@
         return getControlInterface().getClassLoader();
     }
 
+    /**
+     * Filename that contains ordering priority for controls interceptor 
services.
+     * Each line in the file is a fully qualified interface name.  1st line in 
the file
+     * is highest priority.
+     */
+    public static final String INTERCEPTOR_CONFIG_FILE = 
"controls-interceptors.config";
+
+    /**
+     * Applies externally defined (via INTERCEPTOR_CONFIG_FILE) ordering 
priority for
+     * controls interceptor services.
+     *
+     * @param interceptors
+     * @return
+     */
+    public static String[] prioritizeInterceptors( String [] interceptors )
+    {
+        if ( interceptors == null )
+            return null;
+
+        // Read external configuration to obtain desired prioritization.
+        if ( _interceptorPriorities == null )
+        {
+            // Only ever attempt to read the external configuration once; 
bounce the VM if you want to try again.
+            _interceptorPriorities = new ArrayList<String>();
+            BufferedReader in = null;
+            try
+            {
+                InputStream configFileStream =
+                    
ControlBeanContext.class.getClassLoader().getResourceAsStream( 
INTERCEPTOR_CONFIG_FILE );
+
+                if ( configFileStream != null )
+                {
+                    in = new BufferedReader(new 
InputStreamReader(configFileStream));
+                    String str;
+                    while ((str = in.readLine()) != null)
+                        _interceptorPriorities.add(str);
+                }
+            }
+            catch (IOException e)
+            {
+            }
+            finally
+            {
+                try
+                {
+                    if (in != null)
+                        in.close();
+                }
+                catch ( IOException ie ) { }
+            }
+        }
+
+        // Put input list of interceptors into a Set for easy lookup
+        Set<String> input = new HashSet<String>();
+        for ( String ii : interceptors )
+            input.add( ii );
+
+        // Scan through priorities list, building a prioritized list
+        ArrayList<String> prioritized = new 
ArrayList<String>(interceptors.length);
+        for ( String p : _interceptorPriorities )
+        {
+            if ( input.contains(p) )
+            {
+                input.remove(p);
+                prioritized.add(p);
+            }
+        }
+
+        // Anything still left in the input set did not have a priority 
associated with it,
+        // so they just go at the end in arbitrary order.
+        for ( String p : input )
+            prioritized.add(p);
+
+        return prioritized.toArray(new String[prioritized.size()]);
+    }
+
     //
     // ControlBeanContext.addLifeCycleListener
     //
@@ -782,4 +856,6 @@
      * Maintains the list of lifecycle event listeners (if any) for this 
context.
      */
     transient private Vector<LifeCycle> _lifeCycleListeners;
+
+    private static ArrayList<String> _interceptorPriorities;
 }

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=111564&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlContainerContext.java&r1=111563&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/bean/ControlContainerContext.java&r2=111564
==============================================================================
--- 
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
  Fri Dec 10 17:29:46 2004
@@ -18,7 +18,6 @@
  */
 
 import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.util.Stack;
 
 import org.apache.beehive.controls.api.context.ControlHandle;
@@ -138,7 +137,7 @@
     /**
      * Dispatch an operation or an event to a bean within this container bean 
context.
      * @param handle the control handle identifying the target bean
-     * @param method the method to be invoked on the target bean
+     * @param event the event to be invoked on the target bean
      * @param args the arguments to be passed to the target method invocation
      */
     public Object dispatchEvent(ControlHandle handle, EventRef event, Object 
[] args) 

Modified: 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptOperation.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptOperation.java?view=diff&rev=111564&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptOperation.java&r1=111563&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptOperation.java&r2=111564
==============================================================================
--- 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptOperation.java
        (original)
+++ 
incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/AptOperation.java
        Fri Dec 10 17:29:46 2004
@@ -18,12 +18,12 @@
  */
 
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collection;
 
 import com.sun.mirror.apt.AnnotationProcessorEnvironment;
-import com.sun.mirror.declaration.MethodDeclaration;
-
-import org.apache.beehive.controls.api.packaging.FeatureInfo;
+import com.sun.mirror.declaration.*;
+import com.sun.mirror.type.AnnotationType;
+import com.sun.mirror.type.DeclaredType;
 
 /**
  * The AptOperation class represents a control operation where the operation 
attributes
@@ -35,7 +35,7 @@
      * Constructs a new ControlOperation instance where interface information 
is derived
      * from APT metadata
      * @param controlIntf the declaring ControlInterface
-     * @param operMethod the Method associated with the operation
+     * @param methodDecl the method associated with the operation
      */
     public AptOperation(AptControlInterface controlIntf, MethodDeclaration 
methodDecl,
                         AnnotationProcessorEnvironment env)
@@ -44,6 +44,42 @@
         _controlIntf = controlIntf;
         _operDecl = methodDecl;
         _env = env;
+
+        _interceptorServiceNames = initInterceptorServiceNames();
+    }
+
+    /**
+     * Returns the names of interceptor service interfaces associated with 
this operation
+     * @return
+     */
+    public Collection<String> getInterceptorServiceNames()
+    {
+        return _interceptorServiceNames;
+    }
+
+    /**
+     * Returns the names of interceptor service interfaces associated with 
this operation, formatted as a
+     * constant initializer string.
+     * @return
+     */
+    public String getInterceptorDecl()
+    {
+        Collection<String> names = getInterceptorServiceNames();
+        if ( names == null || names.size() == 0 )
+            return null;
+
+        StringBuffer ret = new StringBuffer("{");
+
+        String [] n = names.toArray(new String[0]);
+        for (int i=0 ; i < n.length ; ++i)
+        {
+            ret.append('"'); ret.append( n[i] ); ret.append('"');
+            if ( i != n.length-1 )
+                ret.append(", ");
+        }
+        ret.append( "}" );
+
+        return ret.toString();
     }
 
     /**
@@ -67,7 +103,43 @@
      */
     public AptControlInterface getControlInterface() { return _controlIntf; }
 
+    private Collection<String> initInterceptorServiceNames()
+    {
+        ArrayList<String> ret = new ArrayList<String>();
+
+        if (_operDecl == null)
+            return ret;
+
+        // Iterate over annotations on operation, looking for 
interceptor-based ones
+        Collection<AnnotationMirror> annotations = 
_operDecl.getAnnotationMirrors();
+        for ( AnnotationMirror a : annotations )
+        {
+            AnnotationType at = a.getAnnotationType();
+            AnnotationTypeDeclaration atd = at.getDeclaration();
+            Collection<AnnotationMirror> metaAnnotations = 
atd.getAnnotationMirrors();
+
+            // Look for annotations that are meta-annotated with 
@InterceptorAnnotation
+            for ( AnnotationMirror ma : metaAnnotations )
+            {
+                if ( 
ma.getAnnotationType().getDeclaration().getQualifiedName().
+                        equals( 
"org.apache.beehive.controls.spi.svc.InterceptorAnnotation" ) )
+                {
+                    // found an interceptor-based annotation, add it!
+                    AptAnnotationHelper ia = new AptAnnotationHelper( ma );
+                    DeclaredType serviceType = (DeclaredType) 
ia.getObjectValue("service");
+                    String intf = serviceType.toString();
+                    ret.add( intf );
+
+                    break;
+                }
+            }
+        }
+
+        return ret;
+    }
+
     MethodDeclaration _operDecl;
     AnnotationProcessorEnvironment _env;
     AptControlInterface _controlIntf;
+    Collection<String> _interceptorServiceNames;
 }

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=111564&p1=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm&r1=111563&p2=incubator/beehive/trunk/controls/src/runtime/org/apache/beehive/controls/runtime/generator/ControlBean.vm&r2=111564
==============================================================================
--- 
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
   Fri Dec 10 17:29:46 2004
@@ -111,7 +111,11 @@
         $returnType retval = ${operation.defaultReturnValue};
         #end
 
-        preInvoke(${operation.methodField}, argArray);
+        #if ($operation.interceptorServiceNames.size() == 0)
+        preInvoke(${operation.methodField}, argArray, null);
+        #else
+        preInvoke(${operation.methodField}, argArray, 
_${operation.name}Interceptors);
+        #end
         try
         {
             ##
@@ -152,9 +156,15 @@
         finally
         {
             #if ($returnType != "void")
-            postInvoke(retval, thrown);
+            Object rv = retval;
+            #else
+            Object rv = null;
+            #end
+
+            #if ($operation.interceptorServiceNames.size() == 0)
+            postInvoke(${operation.methodField}, argArray, rv, thrown, null);
             #else
-            postInvoke(null, thrown);
+            postInvoke(${operation.methodField}, argArray, rv, thrown, 
_${operation.name}Interceptors);
             #end
         }
         #if ($returnType != "void")
@@ -379,6 +389,26 @@
     
org.apache.beehive.controls.runtime.bean.ControlBean.enforceVersionRequired("${intf.className}",
 versionPresent, versionRequired);
 #end
 ##
+## This macro declares the interceptor arrays for operations
+##
+#macro (declareMethodInterceptors)
+    #foreach ($operation in $intf.operations)
+        #if ($operation.interceptorServiceNames.size() != 0)
+        private static String[] _${operation.name}Interceptors = 
${operation.interceptorDecl};
+        #end
+    #end
+#end
+##
+## This macro declares the code that prioritizes interceptor arrays for 
operations
+##
+#macro (prioritizeInterceptors)
+    #foreach ($operation in $intf.operations)
+        #if ($operation.interceptorServiceNames.size() != 0)
+        _${operation.name}Interceptors = 
org.apache.beehive.controls.runtime.bean.ControlBeanContext.prioritizeInterceptors(
 _${operation.name}Interceptors );
+        #end
+    #end
+#end
+##
 ## THE CONTROLBEAN CLASS TEMPLATE
 ##
 package $bean.package;
@@ -404,9 +434,21 @@
     static
     {
         #initMethodStatics()
-        #enforceVersionRequired()
     }
+
+    #declareMethodInterceptors()
+
+    static
+    {
+        #prioritizeInterceptors()
+    }
+
     #end
+
+    static
+    {
+        #enforceVersionRequired()
+    }
 
     #declareConstructors()
 

Modified: 
incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/svc/Interceptor.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/svc/Interceptor.java?view=diff&rev=111564&p1=incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/svc/Interceptor.java&r1=111563&p2=incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/svc/Interceptor.java&r2=111564
==============================================================================
--- 
incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/svc/Interceptor.java
       (original)
+++ 
incubator/beehive/trunk/controls/src/spi/org/apache/beehive/controls/spi/svc/Interceptor.java
       Fri Dec 10 17:29:46 2004
@@ -43,7 +43,7 @@
     /** Called before a control operation is invoked */
     public boolean preInvoke( Method m, Object [] args, ControlBeanContext cbc 
);
     /** Called after a control operation is invoked */
-    public boolean postInvoke( Method m, Object [] args, ControlBeanContext 
cbc );
+    public boolean postInvoke( Method m, Object [] args, Object retval, 
Throwable t, ControlBeanContext cbc );
 
     /** Called before a control event is fired (through a client proxy) */
     public boolean preEvent( Class eventSet, Method m, Object [] args, 
ControlBeanContext cbc );

Modified: incubator/beehive/trunk/controls/test/build.xml
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/build.xml?view=diff&rev=111564&p1=incubator/beehive/trunk/controls/test/build.xml&r1=111563&p2=incubator/beehive/trunk/controls/test/build.xml&r2=111564
==============================================================================
--- incubator/beehive/trunk/controls/test/build.xml     (original)
+++ incubator/beehive/trunk/controls/test/build.xml     Fri Dec 10 17:29:46 2004
@@ -344,7 +344,7 @@
                        <ant dir ="./webapps" antfile="build.xml" 
target="undeploy"/>
                        <echo message="continue the new thread, undeploy 
controlsWeb"/>
                        <echo message="stop tomcat server, finish the new 
thread"/>
-                       <antcall target="tomcat.stop"/>
+            <antcall target="tomcat.stop"/>
                </sequential>
         </parallel>
     </target>   

Modified: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/extension/ExtensibleControl.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/extension/ExtensibleControl.java?view=diff&rev=111564&p1=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/extension/ExtensibleControl.java&r1=111563&p2=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/extension/ExtensibleControl.java&r2=111564
==============================================================================
--- 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/extension/ExtensibleControl.java
       (original)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/extension/ExtensibleControl.java
       Fri Dec 10 17:29:46 2004
@@ -1,4 +1,5 @@
 package org.apache.beehive.controls.test.controls.extension;
+import org.apache.beehive.controls.test.controls.util.TestInterceptor;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -22,6 +23,7 @@
                String Layer() default CURRENT_LAYER;
     }
 
+    @TestInterceptor()
     public String hello();
 
     public String getLayerByContext();

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=111564&p1=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestBeanContext.java&r1=111563&p2=incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestBeanContext.java&r2=111564
==============================================================================
--- 
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
      Fri Dec 10 17:29:46 2004
@@ -75,9 +75,13 @@
         super.initialize();
 
         //
-        // Register the ControlBeanContext provider on all new context 
instances.
+        // Register the TestContext provider on all new context instances.
         //
         
addService(org.apache.beehive.controls.test.controls.util.TestContext.class, 
theProvider);
+
+        // Registers a TestInterceptorContext
+        
addService(org.apache.beehive.controls.test.controls.util.TestInterceptorContext.class,
+                   
org.apache.beehive.controls.test.controls.util.TestInterceptorContextImpl.getProvider()
 );
     }
 
     /**

Added: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptor.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptor.java?view=auto&rev=111564
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptor.java
      Fri Dec 10 17:29:46 2004
@@ -0,0 +1,17 @@
+package org.apache.beehive.controls.test.controls.util;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.beehive.controls.spi.svc.InterceptorAnnotation;
+
[EMAIL PROTECTED]( service=TestInterceptorContext.class )
[EMAIL PROTECTED](RetentionPolicy.RUNTIME)
[EMAIL PROTECTED]({ElementType.METHOD})
+public @interface TestInterceptor
+{
+    public boolean value() default true;
+}
+

Added: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptorContext.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptorContext.java?view=auto&rev=111564
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptorContext.java
       Fri Dec 10 17:29:46 2004
@@ -0,0 +1,8 @@
+package org.apache.beehive.controls.test.controls.util;
+
+import org.apache.beehive.controls.spi.svc.Interceptor;
+
+public interface TestInterceptorContext extends Interceptor
+{
+}
+

Added: 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptorContextImpl.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptorContextImpl.java?view=auto&rev=111564
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/controls/test/src/controls/org/apache/beehive/controls/test/controls/util/TestInterceptorContextImpl.java
   Fri Dec 10 17:29:46 2004
@@ -0,0 +1,80 @@
+package org.apache.beehive.controls.test.controls.util;
+
+import org.apache.beehive.controls.api.context.ControlBeanContext;
+
+import java.lang.reflect.Method;
+import java.beans.beancontext.BeanContextServiceProvider;
+import java.beans.beancontext.BeanContextServices;
+import java.util.Iterator;
+
+public class TestInterceptorContextImpl implements TestInterceptorContext
+{
+    /**
+     * The ResourceContextProvider inner class acts as a single BeanContext 
service
+     * provider for the ResourceContext service class.
+     */
+    public static class TestInterceptorContextProvider implements 
BeanContextServiceProvider
+    {
+        //
+        // BeanContextServiceProvider.getService()
+        //
+        public Object getService(BeanContextServices bcs, Object requestor, 
Class serviceClass,
+                                 Object serviceSelector)
+        {
+            System.out.println( "***********************" );
+            System.out.println( "***********************" );
+            System.out.println( "TestInterceptorContextProvider GetService  " 
);
+            System.out.println( "***********************" );
+            System.out.println( "***********************" );
+            return new TestInterceptorContextImpl();
+        }
+
+        //
+        // BeanContextServiceProvider.releaseService()
+        //
+        public void releaseService(BeanContextServices bcs, Object requestor, 
Object service)
+        {
+            return; // Should not happen, service is never unregistered
+        }
+
+        //
+        // BeanContextServiceProvider.getContextServiceSelectors()
+        //
+        public Iterator getCurrentServiceSelectors(BeanContextServices bcs, 
Class serviceClass)
+        {
+            return null;    // no selectors
+        }
+    }
+
+    /**
+     * A singleton instance of the TestInterceptorContextProvider class is 
what will be registered
+     * on all ControlContainerContext instances.  The provider can be a 
singleton because it is
+     * completely stateless and thread-safe.
+     */
+    static private TestInterceptorContextImpl.TestInterceptorContextProvider 
_theProvider = new TestInterceptorContextImpl.TestInterceptorContextProvider();
+
+    /**
+     * Returns the provider used to create new TestInterceptorContext instances
+     */
+    static public TestInterceptorContextImpl.TestInterceptorContextProvider 
getProvider() { return _theProvider; }
+
+
+    public boolean preInvoke( Method m, Object [] args, ControlBeanContext cbc 
)
+    {
+        System.out.println( "***********************" );
+        System.out.println( "***********************" );
+        System.out.println( "PREINVOKE INTERCEPTOR  " );
+        System.out.println( "***********************" );
+        System.out.println( "***********************" );
+
+        return true;
+    }
+
+    public boolean postInvoke( Method m, Object [] args, Object retval, 
Throwable t, ControlBeanContext cbc ) { return true; }
+
+    /** Called before a control event is fired (through a client proxy) */
+    public boolean preEvent( Class eventSet, Method m, Object [] args, 
ControlBeanContext cbc ) { return true; }
+    /** Called after a control event is fired (through a client proxy) */
+    public boolean postEvent( Class eventSet, Method m, Object [] args, 
ControlBeanContext cbc ) { return true; }
+}
+

Reply via email to