jcarman     2005/02/28 04:42:33

  Modified:    .        .classpath
               src/documentation/content/xdocs site.xml links.ent
               library  build.xml
               library/src/descriptor/META-INF hivemodule.xml
  Added:       library/src/test/org/apache/hivemind/lib/impl
                        TestMethodInterceptorFactory.java
                        NonMethodInterceptor.xml
                        ServiceMethodInterceptor.xml FortuneCookie.java
                        InstanceMethodInterceptor.xml
                        SuffixMethodInterceptor.java FortuneCookieImpl.java
               library/src/java/org/apache/hivemind/lib/impl
                        MethodInterceptorFactory.java
               library/src/documentation/content/xdocs/hivemind-lib
                        MethodInterceptorFactory.xml
  Log:
  Create interceptor factory supporting aopalliance MethodInterceptors
  PR: HIVEMIND-45
  
  Revision  Changes    Path
  1.49      +1 -0      jakarta-hivemind/.classpath
  
  Index: .classpath
  ===================================================================
  RCS file: /home/cvs/jakarta-hivemind/.classpath,v
  retrieving revision 1.48
  retrieving revision 1.49
  diff -u -r1.48 -r1.49
  --- .classpath        11 Feb 2005 01:55:41 -0000      1.48
  +++ .classpath        28 Feb 2005 12:42:01 -0000      1.49
  @@ -27,5 +27,6 @@
        <classpathentry kind="lib" 
path="ext-package/lib/groovy-all-1.0-beta-9.jar"/>
        <classpathentry kind="lib" path="ext-package/lib/cglib-full-2.0.1.jar"/>
        <classpathentry kind="lib" 
path="ext-package/lib/easymockclassextension-1.1.jar"/>
  +     <classpathentry kind="lib" path="ext-package/lib/aopalliance-1.0.jar"/>
        <classpathentry kind="output" path="bin"/>
   </classpath>
  
  
  
  1.1                  
jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/TestMethodInterceptorFactory.java
  
  Index: TestMethodInterceptorFactory.java
  ===================================================================
  //Copyright 2004, 2005 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.
  
  package org.apache.hivemind.lib.impl;
  
  import org.apache.hivemind.ApplicationRuntimeException;
  import org.apache.hivemind.Registry;
  import org.apache.hivemind.test.HiveMindTestCase;
  
  /**
   * Tests for [EMAIL PROTECTED] MethodInterceptorFactory}.
   * 
   * @author James Carman
   * @since 1.1
   */
  public class TestMethodInterceptorFactory extends HiveMindTestCase
  {
  
      public void testWithInstanceMethodInterceptor() throws Exception
      {
          Registry registry = 
buildFrameworkRegistry("InstanceMethodInterceptor.xml");
          final FortuneCookie cookie = (FortuneCookie) 
registry.getService(FortuneCookie.class);
          assertEquals( FortuneCookieImpl.FORTUNE + 
SuffixMethodInterceptor.SUFFIX, cookie.generateFortune());
      }
      
      public void testWithServiceMethodInterceptor() throws Exception
      {
          Registry registry = 
buildFrameworkRegistry("ServiceMethodInterceptor.xml");
          final FortuneCookie cookie = (FortuneCookie) 
registry.getService(FortuneCookie.class);
          assertEquals( FortuneCookieImpl.FORTUNE + 
SuffixMethodInterceptor.SUFFIX, cookie.generateFortune());
      }
      
      public void testWithNonMethodInterceptor() throws Exception
      {
          Registry registry = 
buildFrameworkRegistry("NonMethodInterceptor.xml");
          try
          {
              final FortuneCookie cookie = (FortuneCookie) 
registry.getService(FortuneCookie.class);
              cookie.generateFortune();
              fail( "Should not be able to construct service interceptor using 
non-MethodInterceptor instance." );
          }
          catch( ApplicationRuntimeException e )
          {
          }
          
      }
  }
  
  
  
  1.1                  
jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/NonMethodInterceptor.xml
  
  Index: NonMethodInterceptor.xml
  ===================================================================
  <?xml version="1.0"?>
  <!-- 
     Copyright 2004, 2005 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.
  -->
  
  <module id="hivemind.lib.test" version="1.0.0">
    
    <service-point id="FortuneCookie" 
interface="org.apache.hivemind.lib.impl.FortuneCookie" >
      <create-instance class="org.apache.hivemind.lib.impl.FortuneCookieImpl" />
      <interceptor service-id="hivemind.lib.MethodInterceptorFactory">
        <impl object="instance:java.lang.String" />
      </interceptor>
    </service-point>
    
  </module>
  
  
  1.1                  
jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/ServiceMethodInterceptor.xml
  
  Index: ServiceMethodInterceptor.xml
  ===================================================================
  <?xml version="1.0"?>
  <!-- 
     Copyright 2004, 2005 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.
  -->
  
  <module id="hivemind.lib.test" version="1.0.0">
    
    <service-point id="FortuneCookie" 
interface="org.apache.hivemind.lib.impl.FortuneCookie">
      <create-instance class="org.apache.hivemind.lib.impl.FortuneCookieImpl"/>
      <interceptor service-id="hivemind.lib.MethodInterceptorFactory">
        <impl object="service:SuffixMethodInterceptor"; />
      </interceptor>
    </service-point>
    
    <service-point id="SuffixMethodInterceptor" 
interface="org.aopalliance.intercept.MethodInterceptor">
      <create-instance 
class="org.apache.hivemind.lib.impl.SuffixMethodInterceptor"/>
    </service-point>
    
  </module>
  
  
  1.1                  
jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/FortuneCookie.java
  
  Index: FortuneCookie.java
  ===================================================================
  //Copyright 2004, 2005 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.
  
  package org.apache.hivemind.lib.impl;
  
  /**
   * @author James Carman
   * @since 1.1
   */
  public interface FortuneCookie
  {
      public String generateFortune();
  }
  
  
  
  1.1                  
jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/InstanceMethodInterceptor.xml
  
  Index: InstanceMethodInterceptor.xml
  ===================================================================
  <?xml version="1.0"?>
  <!-- 
     Copyright 2004, 2005 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.
  -->
  
  <module id="hivemind.lib.test" version="1.0.0">
    
    <service-point id="FortuneCookie" 
interface="org.apache.hivemind.lib.impl.FortuneCookie">
      <create-instance class="org.apache.hivemind.lib.impl.FortuneCookieImpl"/>
      <interceptor service-id="hivemind.lib.MethodInterceptorFactory">
        <impl 
object="instance:org.apache.hivemind.lib.impl.SuffixMethodInterceptor" />
      </interceptor>
    </service-point>
    
  </module>
  
  
  1.1                  
jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/SuffixMethodInterceptor.java
  
  Index: SuffixMethodInterceptor.java
  ===================================================================
  //Copyright 2004, 2005 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.
  
  package org.apache.hivemind.lib.impl;
  
  import org.aopalliance.intercept.MethodInterceptor;
  import org.aopalliance.intercept.MethodInvocation;
  
  /**
   * 
   * @author James Carman
   * @since 1.1
   */
  public class SuffixMethodInterceptor implements MethodInterceptor
  {
      public static final String SUFFIX = " in bed.";
      
      public Object invoke(MethodInvocation invocation) throws Throwable
      {
          return invocation.proceed() + SUFFIX;
      }
  }
  
  
  
  1.1                  
jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/FortuneCookieImpl.java
  
  Index: FortuneCookieImpl.java
  ===================================================================
  //Copyright 2004, 2005 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.
  
  package org.apache.hivemind.lib.impl;
  
  /**
   * @author James Carman
   * @since 1.1
   */
  public class FortuneCookieImpl implements FortuneCookie
  {
      public static final String FORTUNE = "You will conquer obstacles to 
achieve success";
      
      public String generateFortune()
      {
          return FORTUNE;
      }
  
  }
  
  
  
  1.43      +1 -0      jakarta-hivemind/src/documentation/content/xdocs/site.xml
  
  Index: site.xml
  ===================================================================
  RCS file: 
/home/cvs/jakarta-hivemind/src/documentation/content/xdocs/site.xml,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- site.xml  19 Feb 2005 17:57:40 -0000      1.42
  +++ site.xml  28 Feb 2005 12:42:01 -0000      1.43
  @@ -123,6 +123,7 @@
         <hivemind.lib.ChainFactory label="ChainFactory" 
href="ChainFactory.html"/>
         <hivemind.lib.DefaultImplementationBuilder 
label="DefaultImplementationBuilder" href="DefaultImplementationBuilder.html"/>
                        <hivemind.lib.EJBProxyFactory label="EJBProxyFactory" 
href="EJBProxyFactory.html"/>
  +                     <hivemind.lib.MethodInterceptorFactory 
label="MethodInterceptorFactory" href="MethodInterceptorFactory.html"/>
                        <hivemind.lib.NameLookup label="NameLookup" 
href="NameLookup.html"/>
         <hivemind.lib.PlaceholderFactory label="PlaceholderFactory" 
href="PlaceholderFactory.html"/> 
         <hivemind.lib.PipelineFactory label="PipelineFactory" 
href="PipelineFactory.html"/>     
  
  
  
  1.25      +2 -1      
jakarta-hivemind/src/documentation/content/xdocs/links.ent
  
  Index: links.ent
  ===================================================================
  RCS file: 
/home/cvs/jakarta-hivemind/src/documentation/content/xdocs/links.ent,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- links.ent 19 Feb 2005 17:57:40 -0000      1.24
  +++ links.ent 28 Feb 2005 12:42:01 -0000      1.25
  @@ -159,4 +159,5 @@
   <!ENTITY hivemind.lib.NameLookup '<link 
href="site:hivemind.lib.NameLookup">hivemind.lib.NameLookup</link>'>
   <!ENTITY hivemind.lib.RemoteExceptionCoordinator '<link 
href="site:hivemind.lib.RemoteExceptionCoordinator">hivemind.lib.RemoteExceptionCoordinator</link>'>
   <!ENTITY hivemind.lib.ChainBuilder '<link 
href="site:hivemind.lib.ChainBuilder">hivemind.lib.ChainBuilder</link>'>
  -<!ENTITY hivemind.lib.ChainFactory '<link 
href="site:hivemind.lib.ChainFactory">hivemind.lib.ChainFactory</link>'>
  \ No newline at end of file
  +<!ENTITY hivemind.lib.ChainFactory '<link 
href="site:hivemind.lib.ChainFactory">hivemind.lib.ChainFactory</link>'>
  +<!ENTITY hivemind.lib.MethodInterceptorFactory '<link 
href="site:hivemind.lib.MethodInterceptorFactory">hivemind.lib.MethodInterceptorFactory</link>'>
  
  
  
  1.16      +1 -1      jakarta-hivemind/library/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-hivemind/library/build.xml,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- build.xml 1 Feb 2005 11:59:01 -0000       1.15
  +++ build.xml 28 Feb 2005 12:42:05 -0000      1.16
  @@ -46,7 +46,7 @@
                <ibiblio-dependency artifact="servletapi" version="2.3" 
group="servletapi" use="test"/>                         
                <ibiblio-dependency artifact="oro" version="2.0.6" group="oro" 
use="test"/>                     
                <ibiblio-dependency artifact="easymock" version="1.1" 
group="easymock" use="test"/>
  -             
  +             <ibiblio-dependency artifact="aopalliance" version="1.0" 
group="aopalliance" />
                <project-dependency artifact="hivemind"/>
                
                <default-compile/>
  
  
  
  1.1                  
jakarta-hivemind/library/src/java/org/apache/hivemind/lib/impl/MethodInterceptorFactory.java
  
  Index: MethodInterceptorFactory.java
  ===================================================================
  //Copyright 2004, 2005 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.
  
  package org.apache.hivemind.lib.impl;
  
  import java.lang.reflect.AccessibleObject;
  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  import java.lang.reflect.Proxy;
  import java.util.List;
  
  import org.aopalliance.intercept.MethodInterceptor;
  import org.aopalliance.intercept.MethodInvocation;
  import org.apache.hivemind.ApplicationRuntimeException;
  import org.apache.hivemind.InterceptorStack;
  import org.apache.hivemind.ServiceInterceptorFactory;
  import org.apache.hivemind.impl.BaseLocatable;
  import org.apache.hivemind.internal.Module;
  import org.apache.hivemind.util.Defense;
  
  /**
   * A service interceptor factory supporting the AOP Alliance 
MethodInterceptor interface.
   * <b>Note:</b>The current implementation uses JDK proxies as opposed to 
Javassist! 
   * @author James Carman
   * @since 1.1
   */
  public class MethodInterceptorFactory extends BaseLocatable implements 
ServiceInterceptorFactory
  {
  
      /**
       * 
       * @see 
org.apache.hivemind.ServiceInterceptorFactory#createInterceptor(org.apache.hivemind.InterceptorStack,
 org.apache.hivemind.internal.Module, java.util.List)
       */
      public void createInterceptor(InterceptorStack stack, Module 
invokingModule, List parameters)
      {
          final Class[] interfaces = new Class[]{stack.getServiceInterface()};
          final ClassLoader classLoader = 
invokingModule.getClassResolver().getClassLoader();
          final Object parameter = parameters.get( 0 );
          Defense.isAssignable( parameter, MethodInterceptor.class, 
"Implementation Object" );
          MethodInterceptor methodInterceptor = ( MethodInterceptor )parameter;
          final InvocationHandler invocationHandler = new 
MethodInterceptorInvocationHandler( methodInterceptor, stack );
          stack.push( Proxy.newProxyInstance( classLoader, interfaces, 
invocationHandler ) );
      }
      
      /**
       * A java proxy InvocationHandler implementation which allows a 
MethodInterceptor to intercept the method invocation.
       */
      private final class MethodInterceptorInvocationHandler implements 
InvocationHandler
      {
          private final MethodInterceptor methodInterceptor;
          private final InterceptorStack stack;
          private final Object target;
  
          /**
           * Constructs a MethodInterceptorInvocationHandler
           *
           * @param stack       the interceptor stack
           */
          public MethodInterceptorInvocationHandler( MethodInterceptor 
methodInterceptor, InterceptorStack stack )
          {
              this.stack = stack;
              this.target = stack.peek();
              this.methodInterceptor = methodInterceptor;
          }
  
          /**
           * Calls the MethodInterceptor's invoke method.
           * @param proxy  a reference to the proxy instance
           * @param method the method being invoked
           * @param args   the arguments to the method
           * @return the value returned by the MethodInterceptor
           * @throws Throwable
           */
          public Object invoke( Object proxy, Method method, Object[] args ) 
throws Throwable
          {
              return methodInterceptor.invoke( new MethodInvocationImpl( 
target, method, args, stack.peek() ) );
          }
      }
  
      /**
       * A java reflection-based implementation of a MethodInvocation
       */
      private final class MethodInvocationImpl implements MethodInvocation
      {
          private final Object next;
          private final Method method;
          private final Object[] arguments;
          private final Object proxy;
  
          /**
           * Constructs a MethodInvocationImpl object.
           *
           * @param next      the next object
           * @param method    the method
           * @param arguments the arguments
           * @param proxy     the outermost proxy object (allows calling 
another method instead).
           */
          public MethodInvocationImpl( Object next, Method method, Object[] 
arguments, Object proxy )
          {
              this.next = next;
              this.method = method;
              this.arguments = arguments;
              this.proxy = proxy;
          }
  
          /**
           * Invokes the method on the next object.
           *
           * @return value returned by invoking the method on the next object
           * @throws Throwable throwable thrown by invoking method on the next 
object
           */
          public final Object proceed() throws Throwable
          {
              try
              {
                  return method.invoke( next, arguments );
              }
              catch( InvocationTargetException e )
              {
                  throw e.getTargetException();
              }
          }
  
          public final Method getMethod()
          {
              return method;
          }
  
          public final AccessibleObject getStaticPart()
          {
              return method;
          }
  
          public final Object getThis()
          {
              return proxy;
          }
  
          public final Object[] getArguments()
          {
              return arguments;
          }
      }
  }
  
  
  
  1.23      +18 -1     
jakarta-hivemind/library/src/descriptor/META-INF/hivemodule.xml
  
  Index: hivemodule.xml
  ===================================================================
  RCS file: 
/home/cvs/jakarta-hivemind/library/src/descriptor/META-INF/hivemodule.xml,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- hivemodule.xml    10 Feb 2005 01:04:34 -0000      1.22
  +++ hivemodule.xml    28 Feb 2005 12:42:33 -0000      1.23
  @@ -440,5 +440,22 @@
       </parameters-schema>
       
     </service-point>
  -  
  +  <service-point id="MethodInterceptorFactory" parameters-occurs="1" 
interface="org.apache.hivemind.ServiceInterceptorFactory">
  +    <invoke-factory>
  +      <construct 
class="org.apache.hivemind.lib.impl.MethodInterceptorFactory" />
  +    </invoke-factory>
  +    
  +    <parameters-schema>
  +      <element name="impl">
  +        <attribute name="object" required="true" translator="object">
  +          The implementation object which implements the MethodInterceptor 
interface.
  +        </attribute>
  +
  +             <rules>
  +               <push-attribute attribute="object" />
  +               <invoke-parent method="addElement" />
  +             </rules>
  +      </element>
  +    </parameters-schema>
  +  </service-point>
   </module>
  
  
  
  1.1                  
jakarta-hivemind/library/src/documentation/content/xdocs/hivemind-lib/MethodInterceptorFactory.xml
  
  Index: MethodInterceptorFactory.xml
  ===================================================================
  <?xml version="1.0"?>
  <!-- 
     Copyright 2004, 2005 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.
  -->
  
  <!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.3//EN"
        "http://xml.apache.org/forrest/dtd/document-v13.dtd"; [
        <!ENTITY projectroot '../'>
        <!ENTITY % common-links SYSTEM "../links.ent">
        %common-links;
        ]>
  <document>
        <header>
                <title>hivemind.lib.MethodInterceptorFactory Service</title>
        </header>
        <body>
                <p>The <link 
href="&hivedoc;/service/hivemind.lib.MethodInterceptorFactory.html">
                    MethodInterceptorFactory</link> is a service interceptor 
factory supporting
                    AOP Alliance MethodInterceptors as service interceptors.</p>
                <p>The <code>impl</code> parameter identifies the 
<code>MethodInterceptor</code> to
                use.  It can be any object implementing the 
<code>MethodInterceptor</code> interface.</p>
                <source><![CDATA[
         <interceptor service-id="hivemind.lib.MethodInterceptorFactory">
           <impl object="service:SomeService"; />
         </interceptor> 
      
         <interceptor service-id="hivemind.lib.MethodInterceptorFactory">
           <impl object="instance:com.myco.interceptor.SecurityInterceptor" />
         </interceptor>]]>
      </source>
        
        </body>
  </document>
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to