You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by mc...@apache.org on 2004/03/15 13:58:43 UTC

cvs commit: avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/impl BlockInvocationHandler.java DefaultBlock.java DefaultServiceManager.java

mcconnell    2004/03/15 04:58:43

  Modified:    merlin/activation/impl/src/java/org/apache/avalon/activation/impl
                        DefaultBlock.java DefaultServiceManager.java
  Added:       merlin/activation/impl/src/java/org/apache/avalon/activation/impl
                        BlockInvocationHandler.java
  Log:
  Separate the BlocvkInvocationHander from DefaultBlock and update the DefaultServiceManager to intercept release of references which are in effect releases of singleton block references.
  
  Revision  Changes    Path
  1.3       +1 -106    avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/impl/DefaultBlock.java
  
  Index: DefaultBlock.java
  ===================================================================
  RCS file: /home/cvs/avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/impl/DefaultBlock.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DefaultBlock.java	8 Mar 2004 11:28:35 -0000	1.2
  +++ DefaultBlock.java	15 Mar 2004 12:58:43 -0000	1.3
  @@ -198,111 +198,6 @@
           return (Class[]) list.toArray( new Class[0] );
       }
   
  -   /**
  -    * This makes a dynamic proxy for an object.  The object can be represented
  -    * by one, some or all of it's interfaces.
  -    */
  -    final class BlockInvocationHandler
  -        implements InvocationHandler
  -    {
  -        private final DefaultBlock m_block;
  -        private final Logger m_logger;
  -
  -       /**
  -        * Create a proxy invocation handler.
  -        *
  -        * @param block the underlying block implementation
  -        * @exception if an invocation handler establishment error occurs
  -        */
  -        protected BlockInvocationHandler( final Logger logger, 
  -                                          final DefaultBlock block )
  -            throws Exception
  -        {
  -            if( block == null )
  -            {
  -                throw new NullPointerException( "block" );
  -            }
  -
  -            m_block = block;
  -            m_logger = logger;
  -        }
  -
  -        /**
  -         * Invoke the specified method on underlying object.
  -         * This is called by the proxy object.
  -         *
  -         * @param proxy the proxy object
  -         * @param method the method invoked on proxy object
  -         * @param args the arguments supplied to method
  -         * @return the return value of method
  -         * @throws Throwable if an error occurs
  -         */
  -        public Object invoke( final Object proxy,
  -                final Method method,
  -                final Object[] args )
  -                throws Throwable
  -        {
  -            if( proxy == null ) throw new NullPointerException( "proxy" );
  -            if( method == null ) throw new NullPointerException( "method" );
  -
  -            //
  -            // if the invocation is against java.lang.Object then
  -            // delegate the operation to the block
  -            //
  -
  -            final ContainmentModel model = getContainmentModel();
  -            Class source = method.getDeclaringClass();
  -            ServiceModel service = model.getServiceModel( source );
  -            if( null == service )
  -            {
  -                final String error = 
  -                 "Unable to resolve an provider for the class ["
  -                 + source.getName() 
  -                 + "].";
  -                throw new IllegalStateException( error );
  -            }
  -
  -            DeploymentModel provider = service.getServiceProvider();
  -
  -            //
  -            // resolve the service object from the appliance
  -            // and delegate the invocation to that provider
  -            //
  -
  -            try
  -            {
  -                Object object = provider.resolve();
  -                return method.invoke( object, args );
  -            }
  -            catch( UndeclaredThrowableException e )
  -            {
  -                Throwable cause = e.getUndeclaredThrowable();
  -                if( cause != null ) throw cause;
  -                final String error = 
  -                  "Delegation error raised by: " + m_block;
  -                throw new ApplianceException( error, e );
  -            }
  -            catch( InvocationTargetException e )
  -            {
  -                Throwable cause = e.getTargetException();
  -                if( cause != null ) throw cause;
  -                final String error = 
  -                  "Delegation error raised by: " + m_block;
  -                throw new ApplianceException( error, e );
  -            }
  -            catch( Throwable e )
  -            {
  -                final String error =
  -                  "Composite service resolution failure for the class: '" 
  -                  + method.getDeclaringClass()
  -                  + "' for operation: '" + method.getName()
  -                  + "' in appliance: " + m_block;
  -                throw new ApplianceException( error, e );
  -            }
  -        }
  -    }
  -
  -
       //-------------------------------------------------------------------
       // Object
       //-------------------------------------------------------------------
  
  
  
  1.5       +13 -4     avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/impl/DefaultServiceManager.java
  
  Index: DefaultServiceManager.java
  ===================================================================
  RCS file: /home/cvs/avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/impl/DefaultServiceManager.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DefaultServiceManager.java	8 Mar 2004 11:28:35 -0000	1.4
  +++ DefaultServiceManager.java	15 Mar 2004 12:58:43 -0000	1.5
  @@ -20,6 +20,7 @@
   import java.util.Map;
   import java.util.Hashtable;
   import java.lang.reflect.Proxy;
  +import java.lang.reflect.InvocationHandler;
   
   import org.apache.avalon.activation.TransientApplianceException;
   
  @@ -254,11 +255,19 @@
   
           if( Proxy.isProxyClass( instance.getClass() ) )
           {
  -            ApplianceInvocationHandler handler = 
  -              (ApplianceInvocationHandler) 
  +            InvocationHandler handler = 
                   Proxy.getInvocationHandler( instance );
  -            handler.release();
  -            return;
  +            if( handler instanceof ApplianceInvocationHandler )
  +            { 
  +                ApplianceInvocationHandler aic = 
  +                  (ApplianceInvocationHandler) handler;
  +                aic.release();
  +                return;
  +            }
  +            else if( handler instanceof BlockInvocationHandler )
  +            {
  +                return;
  +            }
           }
   
           //
  
  
  
  1.1                  avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/impl/BlockInvocationHandler.java
  
  Index: BlockInvocationHandler.java
  ===================================================================
  /* 
   * Copyright 2004 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.avalon.activation.impl;
  
  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  import java.lang.reflect.Proxy;
  import java.lang.reflect.UndeclaredThrowableException;
  
  import org.apache.avalon.activation.ApplianceException;
  import org.apache.avalon.activation.ApplianceRuntimeException;
  
  import org.apache.avalon.composition.model.DeploymentModel;
  import org.apache.avalon.composition.model.ContainmentModel;
  import org.apache.avalon.composition.model.ServiceModel;
  
  import org.apache.avalon.framework.logger.Logger;
  
  /**
   * This makes a dynamic proxy for an object.  The object can be represented
   * by one, some or all of it's interfaces.
   */
  final class BlockInvocationHandler implements InvocationHandler
  {
      private final DefaultBlock m_block;
      private final Logger m_logger;
  
     /**
      * Create a proxy invocation handler.
      *
      * @param block the underlying block implementation
      * @exception if an invocation handler establishment error occurs
      */
      protected BlockInvocationHandler( 
        final Logger logger, final DefaultBlock block )
        throws Exception
      {
          if( block == null )
          {
              throw new NullPointerException( "block" );
          }
  
          m_block = block;
          m_logger = logger;
      }
  
     /**
      * Invoke the specified method on underlying object.
      * This is called by the proxy object.
      *
      * @param proxy the proxy object
      * @param method the method invoked on proxy object
      * @param args the arguments supplied to method
      * @return the return value of method
      * @throws Throwable if an error occurs
      */
      public Object invoke( final Object proxy,
              final Method method,
              final Object[] args )
              throws Throwable
      {
          if( proxy == null ) throw new NullPointerException( "proxy" );
          if( method == null ) throw new NullPointerException( "method" );
  
          final ContainmentModel model = m_block.getContainmentModel();
          Class source = method.getDeclaringClass();
          ServiceModel service = model.getServiceModel( source );
          if( null == service )
          {
              final String error = 
               "Unable to resolve an provider for the class ["
               + source.getName() 
               + "].";
              throw new IllegalStateException( error );
          }
  
          DeploymentModel provider = service.getServiceProvider();
  
          //
          // resolve the service object from the appliance
          // and delegate the invocation to that provider
          //
  
          try
          {
              Object object = provider.resolve();
              return method.invoke( object, args );
          }
          catch( UndeclaredThrowableException e )
          {
              Throwable cause = e.getUndeclaredThrowable();
              if( cause != null ) throw cause;
              final String error = 
                "Delegation error raised by: " + m_block;
              throw new ApplianceException( error, e );
          }
          catch( InvocationTargetException e )
          {
              Throwable cause = e.getTargetException();
              if( cause != null ) throw cause;
              final String error = 
                "Delegation error raised by: " + m_block;
              throw new ApplianceException( error, e );
          }
          catch( Throwable e )
          {
              final String error =
                "Composite service resolution failure for the class: '" 
                + method.getDeclaringClass()
                + "' for operation: '" + method.getName()
                + "' in appliance: " + m_block;
              throw new ApplianceException( error, e );
          }
      }
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org