avalon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From blorit...@apache.org
Subject cvs commit: jakarta-avalon/src/java/org/apache/excalibur/datasource JdbcConnectionPool.java
Date Fri, 20 Apr 2001 20:48:36 GMT
bloritsch    01/04/20 13:48:36

  Modified:    src/java/org/apache/excalibur/component
                        DefaultComponentHandler.java
                        DefaultComponentManager.java
                        DefaultComponentSelector.java
               src/java/org/apache/excalibur/datasource
                        JdbcConnectionPool.java
  Added:       src/java/org/apache/excalibur/component
                        ComponentHandler.java PoolableComponentHandler.java
                        ThreadSafeComponentHandler.java
  Log:
  Fixes for ComponentManagement architecture and fix for JdbcConnectionPool so
  that it checks to see if the connection has timed out before returning the instance.
  
  Revision  Changes    Path
  1.2       +15 -167   jakarta-avalon/src/java/org/apache/excalibur/component/DefaultComponentHandler.java
  
  Index: DefaultComponentHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/java/org/apache/excalibur/component/DefaultComponentHandler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultComponentHandler.java	2001/04/18 13:16:36	1.1
  +++ DefaultComponentHandler.java	2001/04/20 20:48:34	1.2
  @@ -15,8 +15,6 @@
   import org.apache.avalon.configuration.Configuration;
   import org.apache.avalon.context.Context;
   import org.apache.avalon.logger.AbstractLoggable;
  -import org.apache.avalon.thread.ThreadSafe;
  -import org.apache.excalibur.pool.Poolable;
   import org.apache.log.Logger;
   
   /**
  @@ -24,33 +22,14 @@
    * and destroyed correctly.
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
  - * @version CVS $Revision: 1.1 $ $Date: 2001/04/18 13:16:36 $
  + * @version CVS $Revision: 1.2 $ $Date: 2001/04/20 20:48:34 $
    */
   class DefaultComponentHandler
  -    extends AbstractLoggable
  -    implements Initializable, Disposable
  +    extends ComponentHandler
   {
  -    /** Indicates that the Handler is holding a <code>ThreadSafe</code> Component
*/
  -    private final static int           THREADSAFE      = 0;
  -
  -    /** Indicates that the Handler is holding a <code>Poolable</code> Component
*/
  -    private final static int           POOLABLE        = 1;
  -
  -    /** Indicates that the Handler is holding a <code>SingleThreaded</code>
Component */
  -    private final static int           SINGLETHREADED  = 2;
  -
       /** The instance of the ComponentFactory that creates and disposes of the Component
*/
  -    private DefaultComponentFactory    m_factory;
  -
  -    /** The pool of components for <code>Poolable</code> Components */
  -    private DefaultComponentPool       m_pool;
  +    private final DefaultComponentFactory    m_factory;
   
  -    /** The instance of the Component for <code>ThreadSafe</code> Components
*/
  -    private Component                  m_instance;
  -
  -    /** The type of the Component: THREADSAFE, POOLABLE, or SINGLETHREADED */
  -    private final int                  m_type;
  -
       /** State management boolean stating whether the Handler is initialized or not */
       private boolean                    m_initialized   = false;
   
  @@ -62,7 +41,7 @@
        * whether a Component is ThreadSafe, Poolable, or SingleThreaded.
        * It falls back to SingleThreaded if not specified.
        */
  -    DefaultComponentHandler( final Class componentClass,
  +    protected DefaultComponentHandler( final Class componentClass,
                                final Configuration config,
                                final ComponentManager manager,
                                final Context context,
  @@ -70,48 +49,14 @@
           throws Exception
       {
           m_factory = new DefaultComponentFactory( componentClass, config, manager, context,
roles );
  -
  -        if( Poolable.class.isAssignableFrom( componentClass ) )
  -        {
  -            m_pool = new DefaultComponentPool( m_factory );
  -            m_type = POOLABLE;
  -        }
  -        else if( ThreadSafe.class.isAssignableFrom( componentClass ) )
  -        {
  -            m_type = THREADSAFE;
  -        }
  -        else
  -        {
  -            m_type = SINGLETHREADED;
  -        }
       }
   
       /**
  -     * Create a ComponentHandler that takes care of hiding the details of
  -     * whether a Component is ThreadSafe, Poolable, or SingleThreaded.
  -     * It falls back to SingleThreaded if not specified.
  -     */
  -    DefaultComponentHandler( final Component component )
  -        throws Exception
  -    {
  -        m_type = THREADSAFE;
  -        m_instance = component;
  -    }
  -
  -    /**
        * Sets the logger that the ComponentHandler will use.
        */
       public void setLogger( final Logger logger )
       {
  -        if( null != m_factory )
  -        {
  -            m_factory.setLogger( logger );
  -        }
  -
  -        if( null != m_pool )
  -        {
  -            m_pool.setLogger( logger );
  -        }
  +        m_factory.setLogger( logger );
   
           super.setLogger( logger );
       }
  @@ -123,39 +68,7 @@
       {
           if( m_initialized ) return;
   
  -        switch( m_type )
  -        {
  -        case THREADSAFE:
  -            try
  -            {
  -                if( null == m_instance )
  -                {
  -                    m_instance = (Component)m_factory.newInstance();
  -                }
  -            }
  -            catch( final Exception e )
  -            {
  -                getLogger().error( "Cannot use component: " +
  -                                   m_factory.getCreatedClass().getName(), e );
  -            }
  -            break;
  -
  -        case POOLABLE:
  -            try
  -            {
  -                m_pool.init();
  -            }
  -            catch( Exception e )
  -            {
  -                getLogger().error( "Cannot use component: " + m_factory.getCreatedClass().getName(),
e );
  -            }
  -            break;
  -
  -        default:
  -            // Nothing to do for SingleThreaded Components
  -            break;
  -        }
  -
  +        getLogger().debug("ComponentHandler initialized for: " + this.m_factory.getCreatedClass().getName());
           m_initialized = true;
       }
   
  @@ -174,25 +87,8 @@
           {
               throw new IllegalStateException( "You cannot get a component from a disposed
holder" );
           }
  -
  -        Component component = null;
   
  -        switch( m_type )
  -        {
  -        case THREADSAFE:
  -            component = m_instance;
  -            break;
  -
  -        case POOLABLE:
  -            component = (Component)m_pool.get();
  -            break;
  -
  -        default:
  -            component = (Component)m_factory.newInstance();
  -            break;
  -        }
  -
  -        return component;
  +        return (Component)m_factory.newInstance();
       }
   
       /**
  @@ -210,27 +106,14 @@
               throw new IllegalStateException( "You cannot put a component in a disposed
holder" );
           }
   
  -        switch( m_type )
  +        try
           {
  -        case THREADSAFE:
  -            // Nothing to do for ThreadSafe Components
  -            break;
  -
  -        case POOLABLE:
  -            m_pool.put( (Poolable)component );
  -            break;
  -
  -        default:
  -            try
  -            {
  -                m_factory.decommission( component );
  -            }
  -            catch( final Exception e )
  -            {
  -                getLogger().warn( "Error decommissioning component: " +
  -                                  m_factory.getCreatedClass().getName(), e);
  -            }
  -            break;
  +            m_factory.decommission( component );
  +        }
  +        catch( final Exception e )
  +        {
  +            getLogger().warn( "Error decommissioning component: " +
  +                              m_factory.getCreatedClass().getName(), e);
           }
       }
   
  @@ -243,47 +126,12 @@
   
           try
           {
  -            switch( m_type )
  -            {
  -            case THREADSAFE:
  -                if( null != m_factory )
  -                {
  -                    m_factory.decommission( m_instance );
  -                }
  -                else
  -                {
  -                    if( m_instance instanceof Stoppable )
  -                    {
  -                        ((Stoppable)m_instance).stop();
  -                    }
  -
  -                    if( m_instance instanceof Disposable )
  -                    {
  -                        ((Disposable)m_instance).dispose();
  -                    }
  -                }
  -                m_instance = null;
  -                break;
  -
  -            case POOLABLE:
  -                if( m_pool instanceof Disposable )
  -                {
  -                    ((Disposable)m_pool).dispose();
  -                }
  -
  -                m_pool = null;
  -                break;
  -
  -            default:
  -                // do nothing here
  -                break;
  -            }
  +            // do nothing here
   
               if( m_factory instanceof Disposable )
               {
                   ((Disposable)m_factory).dispose();
               }
  -            m_factory = null;
           }
           catch( final Exception e )
           {
  
  
  
  1.2       +35 -18    jakarta-avalon/src/java/org/apache/excalibur/component/DefaultComponentManager.java
  
  Index: DefaultComponentManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/java/org/apache/excalibur/component/DefaultComponentManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultComponentManager.java	2001/04/18 13:16:36	1.1
  +++ DefaultComponentManager.java	2001/04/20 20:48:34	1.2
  @@ -32,7 +32,7 @@
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
    * @author <a href="mailto:paul@luminas.co.uk">Paul Russell</a>
  - * @version CVS $Revision: 1.1 $ $Date: 2001/04/18 13:16:36 $
  + * @version CVS $Revision: 1.2 $ $Date: 2001/04/20 20:48:34 $
    */
   public class DefaultComponentManager
       extends AbstractLoggable
  @@ -87,10 +87,18 @@
           while( keys.hasNext() )
           {
               final Object key = keys.next();
  -            final DefaultComponentHandler handler =
  -                (DefaultComponentHandler)m_componentHandlers.get( key );
  +            final ComponentHandler handler =
  +                (ComponentHandler)m_componentHandlers.get( key );
   
  -            handler.dispose();
  +            try
  +            {
  +                handler.dispose();
  +            }
  +            catch (Exception e)
  +            {
  +                getLogger().debug("Caught an exception trying to dispose of the component
handler.", e);
  +            }
  +
               keyList.add( key );
           }
   
  @@ -127,7 +135,7 @@
               throw new ComponentException( message );
           }
   
  -        DefaultComponentHandler handler = (DefaultComponentHandler)m_componentHandlers.get(
role );
  +        ComponentHandler handler = (ComponentHandler)m_componentHandlers.get( role );
   
           // Retrieve the instance of the requested component
           if( null == handler )
  @@ -144,11 +152,11 @@
                   final Configuration configuration = new DefaultConfiguration( "", "-" );
   
                   handler =
  -                    new DefaultComponentHandler( componentClass,
  -                                                 configuration,
  -                                                 this,
  -                                                 m_context,
  -                                                 m_roles );
  +                    ComponentHandler.getComponentHandler( componentClass,
  +                                                          configuration,
  +                                                          this,
  +                                                          m_context,
  +                                                          m_roles );
   
                   handler.setLogger( getLogger() );
                   handler.init();
  @@ -177,10 +185,9 @@
           }
           catch( final IllegalStateException ise )
           {
  -            handler.init();
  -
               try
               {
  +                handler.init();
                   component = handler.get();
               }
               catch( final Exception e )
  @@ -279,12 +286,20 @@
       {
           if( null == component ) return;
   
  -        final DefaultComponentHandler handler =
  -            (DefaultComponentHandler)m_componentMapping.get( component );
  +        final ComponentHandler handler =
  +            (ComponentHandler)m_componentMapping.get( component );
   
           if( null != handler )
           {
  -            handler.put( component );
  +            try
  +            {
  +                handler.put( component );
  +            }
  +            catch (Exception e)
  +            {
  +                getLogger().debug("Error trying to release component.", e);
  +            }
  +
               m_componentMapping.remove( component );
           }
       }
  @@ -301,9 +316,11 @@
       {
           try
           {
  -            final DefaultComponentHandler handler =
  -                new DefaultComponentHandler( component, configuration, this, m_context,
m_roles );
  +            getLogger().debug("Attempting to get Handler for: " + role);
  +            final ComponentHandler handler =
  +                ComponentHandler.getComponentHandler( component, configuration, this, m_context,
m_roles );
   
  +            getLogger().debug("Handler type = " + handler.getClass().getName());
               handler.setLogger( getLogger() );
               m_componentHandlers.put( role, handler );
           }
  @@ -321,7 +338,7 @@
       {
           try
           {
  -            DefaultComponentHandler handler = new DefaultComponentHandler( (Component)instance
);
  +            ComponentHandler handler = ComponentHandler.getComponentHandler( (Component)instance
);
               handler.setLogger( getLogger() );
               m_componentHandlers.put( role, handler );
           }
  
  
  
  1.2       +25 -16    jakarta-avalon/src/java/org/apache/excalibur/component/DefaultComponentSelector.java
  
  Index: DefaultComponentSelector.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/java/org/apache/excalibur/component/DefaultComponentSelector.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultComponentSelector.java	2001/04/18 13:16:36	1.1
  +++ DefaultComponentSelector.java	2001/04/20 20:48:34	1.2
  @@ -33,7 +33,7 @@
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
    * @author <a href="mailto:paul@luminas.co.uk">Paul Russell</a>
  - * @version CVS $Revision: 1.1 $ $Date: 2001/04/18 13:16:36 $
  + * @version CVS $Revision: 1.2 $ $Date: 2001/04/20 20:48:34 $
    */
   public class DefaultComponentSelector
       extends AbstractLoggable
  @@ -121,10 +121,15 @@
           while( keys.hasNext() )
           {
               Object key = keys.next();
  -            DefaultComponentHandler handler =
  -                (DefaultComponentHandler)m_componentHandlers.get( key );
  +            ComponentHandler handler =
  +                (ComponentHandler)m_componentHandlers.get( key );
   
  -            handler.dispose();
  +            try {
  +                handler.dispose();
  +            } catch (Exception e) {
  +                getLogger().debug("Caught an exception disposing of component handler.",
e);
  +            }
  +
               keyList.add( key );
           }
   
  @@ -159,7 +164,7 @@
               throw new ComponentException( message );
           }
   
  -        DefaultComponentHandler handler = (DefaultComponentHandler)m_componentHandlers.get(
hint );
  +        ComponentHandler handler = (ComponentHandler)m_componentHandlers.get( hint );
   
           // Retrieve the instance of the requested component
           if( null == handler )
  @@ -259,12 +264,16 @@
       {
           if( null == component ) return;
   
  -        final DefaultComponentHandler handler =
  -            (DefaultComponentHandler)m_componentMapping.get( component );
  +        final ComponentHandler handler =
  +            (ComponentHandler)m_componentMapping.get( component );
   
           if( null == handler ) return;
   
  -        handler.put( component );
  +        try {
  +            handler.put( component );
  +        } catch (Exception e) {
  +            getLogger().debug("Error trying to release component", e);
  +        }
   
           m_componentMapping.remove( component );
       }
  @@ -281,12 +290,12 @@
       {
           try
           {
  -            final DefaultComponentHandler handler =
  -                new DefaultComponentHandler( component,
  -                                             configuration,
  -                                             m_componentManager,
  -                                             m_context,
  -                                             m_roles );
  +            final ComponentHandler handler =
  +                ComponentHandler.getComponentHandler( component,
  +                                                      configuration,
  +                                                      m_componentManager,
  +                                                      m_context,
  +                                                      m_roles );
   
               handler.setLogger( getLogger() );
               handler.init();
  @@ -310,8 +319,8 @@
       {
           try
           {
  -            final DefaultComponentHandler handler =
  -                new DefaultComponentHandler( (Component)instance );
  +            final ComponentHandler handler =
  +                ComponentHandler.getComponentHandler( (Component)instance );
               handler.setLogger( getLogger() );
               handler.init();
               m_componentHandlers.put( hint, handler );
  
  
  
  1.1                  jakarta-avalon/src/java/org/apache/excalibur/component/ComponentHandler.java
  
  Index: ComponentHandler.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.excalibur.component;
  
  import org.apache.avalon.logger.AbstractLoggable;
  import org.apache.avalon.thread.ThreadSafe;
  import org.apache.avalon.thread.SingleThreaded;
  import org.apache.avalon.Initializable;
  import org.apache.avalon.Disposable;
  import org.apache.avalon.component.Component;
  import org.apache.avalon.configuration.Configuration;
  import org.apache.avalon.component.ComponentManager;
  import org.apache.avalon.context.Context;
  import org.apache.excalibur.pool.Poolable;
  
  /**
   * The DefaultComponentHandler to make sure components are initialized
   * and destroyed correctly.
   *
   * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
   * @version CVS $Revision: 1.1 $ $Date: 2001/04/20 20:48:33 $
   */
  public abstract class ComponentHandler extends AbstractLoggable
                                         implements Initializable, Disposable {
  
      public static ComponentHandler getComponentHandler(
                               final Class componentClass,
                               final Configuration config,
                               final ComponentManager manager,
                               final Context context,
                               final RoleManager roles )
      throws Exception
      {
          int numInterfaces = 0;
  
          if (SingleThreaded.class.isAssignableFrom(componentClass))
          {
              numInterfaces++;
          }
  
          if (ThreadSafe.class.isAssignableFrom(componentClass))
          {
              numInterfaces++;
          }
  
          if (Poolable.class.isAssignableFrom(componentClass))
          {
              numInterfaces++;
          }
  
          if (numInterfaces > 1)
          {
              throw new Exception("[CONFLICT] lifestyle interfaces: " + componentClass.getName());
          }
  
          if (Poolable.class.isAssignableFrom(componentClass))
          {
              return new PoolableComponentHandler(componentClass,
                                                  config,
                                                  manager,
                                                  context,
                                                  roles);
          }
          else if (ThreadSafe.class.isAssignableFrom(componentClass))
          {
              return new ThreadSafeComponentHandler(componentClass,
                                                    config,
                                                    manager,
                                                    context,
                                                    roles);
          }
          else // This is a SingleThreaded component
          {
              return new DefaultComponentHandler(componentClass,
                                                 config,
                                                 manager,
                                                 context,
                                                 roles);
          }
      }
  
      public static ComponentHandler getComponentHandler(
                               final Component componentInstance )
      throws Exception
      {
          int numInterfaces = 0;
  
          if (SingleThreaded.class.isAssignableFrom(componentInstance.getClass()))
          {
              numInterfaces++;
          }
  
          if (ThreadSafe.class.isAssignableFrom(componentInstance.getClass()))
          {
              numInterfaces++;
          }
  
          if (Poolable.class.isAssignableFrom(componentInstance.getClass()))
          {
              numInterfaces++;
          }
  
          if (numInterfaces > 1)
          {
              throw new Exception("[CONFLICT] lifestyle interfaces: " + componentInstance.getClass().getName());
          }
  
          return new ThreadSafeComponentHandler(componentInstance);
      }
  
      public abstract Component get() throws Exception;
  
      public abstract void put(Component component) throws Exception;
  }
  
  
  1.1                  jakarta-avalon/src/java/org/apache/excalibur/component/PoolableComponentHandler.java
  
  Index: PoolableComponentHandler.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.excalibur.component;
  
  import org.apache.excalibur.pool.Poolable;
  import org.apache.avalon.Disposable;
  import org.apache.avalon.component.Component;
  import org.apache.avalon.component.ComponentManager;
  import org.apache.avalon.configuration.Configuration;
  import org.apache.avalon.context.Context;
  import org.apache.log.Logger;
  
  /**
   * The PoolableComponentHandler to make sure components are initialized
   * and destroyed correctly.
   *
   * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
   * @version CVS $Revision: 1.1 $ $Date: 2001/04/20 20:48:34 $
   */
  public class PoolableComponentHandler extends ComponentHandler {
      /** The instance of the ComponentFactory that creates and disposes of the Component
*/
      private final DefaultComponentFactory    m_factory;
  
      /** The pool of components for <code>Poolable</code> Components */
      private final DefaultComponentPool       m_pool;
  
      /** State management boolean stating whether the Handler is initialized or not */
      private boolean                    m_initialized   = false;
  
      /** State management boolean stating whether the Handler is disposed or not */
      private boolean                    m_disposed      = false;
  
      /**
       * Create a ComponentHandler that takes care of hiding the details of
       * whether a Component is ThreadSafe, Poolable, or SingleThreaded.
       * It falls back to SingleThreaded if not specified.
       */
      protected PoolableComponentHandler( final Class componentClass,
                                final Configuration config,
                                final ComponentManager manager,
                                final Context context,
                                final RoleManager roles )
          throws Exception
      {
          m_factory = new DefaultComponentFactory( componentClass, config, manager, context,
roles );
  
          m_pool = new DefaultComponentPool( m_factory );
      }
  
      /**
       * Sets the logger that the ComponentHandler will use.
       */
      public void setLogger( final Logger logger )
      {
          m_factory.setLogger( logger );
          m_pool.setLogger( logger );
  
          super.setLogger( logger );
      }
  
      /**
       * Initialize the ComponentHandler.
       */
      public void init()
      {
          if( m_initialized ) return;
  
          try
          {
              m_pool.init();
          }
          catch( Exception e )
          {
              getLogger().error( "Cannot use component: " + m_factory.getCreatedClass().getName(),
e );
          }
  
          getLogger().debug("ComponentHandler initialized for: " + this.m_factory.getCreatedClass().getName());
  
          m_initialized = true;
      }
  
      /**
       * Get a reference of the desired Component
       */
      public Component get()
          throws Exception
      {
          if( ! m_initialized )
          {
              throw new IllegalStateException( "You cannot get a component from an uninitialized
holder." );
          }
  
          if( m_disposed )
          {
              throw new IllegalStateException( "You cannot get a component from a disposed
holder" );
          }
  
          return (Component)m_pool.get();
      }
  
      /**
       * Return a reference of the desired Component
       */
      public void put( final Component component )
      {
          if( !m_initialized )
          {
              throw new IllegalStateException( "You cannot put a component in an uninitialized
holder." );
          }
  
          if( m_disposed )
          {
              throw new IllegalStateException( "You cannot put a component in a disposed holder"
);
          }
  
          m_pool.put( (Poolable)component );
      }
  
      /**
       * Dispose of the ComponentHandler and any associated Pools and Factories.
       */
      public void dispose()
      {
          m_disposed = true;
  
          try
          {
              if( m_pool instanceof Disposable )
              {
                  ((Disposable)m_pool).dispose();
              }
  
              if( m_factory instanceof Disposable )
              {
                  ((Disposable)m_factory).dispose();
              }
          }
          catch( final Exception e )
          {
              getLogger().warn( "Error decommissioning component: " +
                                m_factory.getCreatedClass().getName(), e );
          }
      }
  }
  
  
  1.1                  jakarta-avalon/src/java/org/apache/excalibur/component/ThreadSafeComponentHandler.java
  
  Index: ThreadSafeComponentHandler.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.excalibur.component;
  
  import org.apache.avalon.component.Component;
  import org.apache.avalon.configuration.Configuration;
  import org.apache.avalon.component.ComponentManager;
  import org.apache.avalon.context.Context;
  import org.apache.avalon.Stoppable;
  import org.apache.avalon.Disposable;
  import org.apache.log.Logger;
  
  /**
   * The ThreadSafeComponentHandler to make sure components are initialized
   * and destroyed correctly.
   *
   * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
   * @version CVS $Revision: 1.1 $ $Date: 2001/04/20 20:48:34 $
   */
  public class ThreadSafeComponentHandler extends ComponentHandler {
      private Component m_instance;
      private final DefaultComponentFactory m_factory;
      private boolean m_initialized = false;
      private boolean m_disposed = false;
  
      /**
       * Create a ComponentHandler that takes care of hiding the details of
       * whether a Component is ThreadSafe, Poolable, or SingleThreaded.
       * It falls back to SingleThreaded if not specified.
       */
      protected ThreadSafeComponentHandler( final Class componentClass,
                               final Configuration config,
                               final ComponentManager manager,
                               final Context context,
                               final RoleManager roles )
          throws Exception
      {
          m_factory = new DefaultComponentFactory( componentClass, config, manager, context,
roles );
      }
  
      /**
       * Create a ComponentHandler that takes care of hiding the details of
       * whether a Component is ThreadSafe, Poolable, or SingleThreaded.
       * It falls back to SingleThreaded if not specified.
       */
      protected ThreadSafeComponentHandler( final Component component )
          throws Exception
      {
          m_instance = component;
          m_factory = null;
      }
  
      public void setLogger(Logger log)
      {
          if (m_factory != null)
          {
              m_factory.setLogger(log);
          }
  
          super.setLogger(log);
      }
  
      /**
       * Initialize the ComponentHandler.
       */
      public void init()
      throws Exception
      {
          if( m_initialized ) return;
  
          if (m_instance == null)
          {
              m_instance = (Component) this.m_factory.newInstance();
          }
  
          if (this.m_factory != null)
          {
              getLogger().debug("ComponentHandler initialized for: " + this.m_factory.getCreatedClass().getName());
          }
          else
          {
              getLogger().debug("ComponentHandler initialized for: " + this.m_instance.getClass().getName());
          }
  
          m_initialized = true;
      }
  
      /**
       * Get a reference of the desired Component
       */
      public final Component get()
          throws Exception
      {
          if( ! m_initialized )
          {
              throw new IllegalStateException( "You cannot get a component from an uninitialized
holder." );
          }
  
          if( m_disposed )
          {
              throw new IllegalStateException( "You cannot get a component from a disposed
holder" );
          }
  
          return m_instance;
      }
  
      /**
       * Return a reference of the desired Component
       */
      public void put( final Component component )
      {
          if( !m_initialized )
          {
              throw new IllegalStateException( "You cannot put a component in an uninitialized
holder." );
          }
  
          if( m_disposed )
          {
              throw new IllegalStateException( "You cannot put a component in a disposed holder"
);
          }
      }
  
      /**
       * Dispose of the ComponentHandler and any associated Pools and Factories.
       */
      public void dispose()
      {
          m_disposed = true;
  
          try {
              if( null != m_factory )
              {
                  m_factory.decommission( m_instance );
              }
              else
              {
                  if( m_instance instanceof Stoppable )
                  {
                      ((Stoppable)m_instance).stop();
                  }
  
                  if( m_instance instanceof Disposable )
                  {
                      ((Disposable)m_instance).dispose();
                  }
              }
  
              m_instance = null;
          }
          catch( final Exception e )
          {
              getLogger().warn( "Error decommissioning component: " +
                                m_factory.getCreatedClass().getName(), e );
          }
      }
  }
  
  
  1.3       +6 -1      jakarta-avalon/src/java/org/apache/excalibur/datasource/JdbcConnectionPool.java
  
  Index: JdbcConnectionPool.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon/src/java/org/apache/excalibur/datasource/JdbcConnectionPool.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- JdbcConnectionPool.java	2001/04/18 13:15:48	1.2
  +++ JdbcConnectionPool.java	2001/04/20 20:48:35	1.3
  @@ -26,7 +26,7 @@
    * thread to manage the number of SQL Connections.
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
  - * @version CVS $Revision: 1.2 $ $Date: 2001/04/18 13:15:48 $
  + * @version CVS $Revision: 1.3 $ $Date: 2001/04/20 20:48:35 $
    */
   public class JdbcConnectionPool
       extends AbstractLoggable
  @@ -147,6 +147,11 @@
               else
               {
                   obj = (Poolable)m_ready.remove( 0 );
  +                if (((Connection)obj).isClosed())
  +                {
  +                    ((JdbcConnection)obj).recycle();
  +                    obj = this.createJdbcConnection();
  +                }
   
                   m_active.add( obj );
               }
  
  
  

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


Mime
View raw message