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; } +} +
