You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by bl...@apache.org on 2001/03/16 20:54:09 UTC

cvs commit: xml-cocoon/src/org/apache/cocoon/components CocoonComponentHandler.java ComponentPool.java ComponentFactory.java CocoonComponentManager.java

bloritsch    01/03/16 11:54:09

  Modified:    src/org/apache/cocoon/components Tag: xml-cocoon2
                        ComponentPool.java ComponentFactory.java
                        CocoonComponentManager.java
  Added:       src/org/apache/cocoon/components Tag: xml-cocoon2
                        CocoonComponentHandler.java
  Log:
  Major rearchitecting of ComponentManagement infrastructure.  It is not only more maintainable,
  but it is also faster.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.2   +1 -1      xml-cocoon/src/org/apache/cocoon/components/Attic/ComponentPool.java
  
  Index: ComponentPool.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon/src/org/apache/cocoon/components/Attic/ComponentPool.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- ComponentPool.java	2001/03/12 05:18:05	1.1.2.1
  +++ ComponentPool.java	2001/03/16 19:53:59	1.1.2.2
  @@ -99,7 +99,7 @@
       protected synchronized Poolable getOverflowResource()
           throws Exception
       {
  -        Poolable poolable = m_factory.newInstance();
  +        Poolable poolable = (Poolable)m_factory.newInstance();
           log.debug("Component Pool - creating Overflow Resource:"
                           + " Resource=" + poolable
                           + " Available=" + availableResources.size()
  
  
  
  1.1.2.2   +6 -4      xml-cocoon/src/org/apache/cocoon/components/Attic/ComponentFactory.java
  
  Index: ComponentFactory.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon/src/org/apache/cocoon/components/Attic/ComponentFactory.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- ComponentFactory.java	2001/03/12 05:18:05	1.1.2.1
  +++ ComponentFactory.java	2001/03/16 19:54:01	1.1.2.2
  @@ -29,7 +29,7 @@
   
   /** Factory for Cocoon components.
    * @author <a href="mailto:paul@luminas.co.uk">Paul Russell</a>
  - * @version CVS $Revision: 1.1.2.1 $ $Date: 2001/03/12 05:18:05 $
  + * @version CVS $Revision: 1.1.2.2 $ $Date: 2001/03/16 19:54:01 $
    */
   public class ComponentFactory implements ObjectFactory, ThreadSafe, Loggable {
       private Logger log;
  @@ -69,8 +69,8 @@
           }
       }
   
  -    public Poolable newInstance() throws Exception {
  -        Poolable comp = (Poolable)componentClass.newInstance();
  +    public Object newInstance() throws Exception {
  +        Object comp = componentClass.newInstance();
   
           log.debug("ComponentFactory creating new instance of "
               + componentClass.getName() + "."
  @@ -107,7 +107,7 @@
           return componentClass;
       }
   
  -    public final void decommission(Poolable comp) throws Exception {
  +    public final void decommission(Object comp) throws Exception {
           if ( comp instanceof Stoppable ) {
               ((Stoppable)comp).stop();
           }
  @@ -115,5 +115,7 @@
           if ( comp instanceof Disposable ) {
               ((Disposable)comp).dispose();
           }
  +
  +        comp = null;
       }
   }
  
  
  
  1.1.2.2   +58 -219   xml-cocoon/src/org/apache/cocoon/components/Attic/CocoonComponentManager.java
  
  Index: CocoonComponentManager.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon/src/org/apache/cocoon/components/Attic/CocoonComponentManager.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- CocoonComponentManager.java	2001/03/12 05:18:04	1.1.2.1
  +++ CocoonComponentManager.java	2001/03/16 19:54:03	1.1.2.2
  @@ -16,15 +16,8 @@
   import org.apache.avalon.ComponentManager;
   import org.apache.avalon.Component;
   import org.apache.avalon.ComponentManagerException;
  -import org.apache.avalon.ComponentNotFoundException;
  -import org.apache.avalon.ComponentNotAccessibleException;
   import org.apache.avalon.Context;
   import org.apache.avalon.Contextualizable;
  -import org.apache.avalon.SingleThreaded;
  -import org.apache.avalon.ThreadSafe;
  -import org.apache.avalon.Poolable;
  -import org.apache.avalon.Recyclable;
  -import org.apache.avalon.Disposable;
   import org.apache.avalon.configuration.Configurable;
   import org.apache.avalon.configuration.Configuration;
   import org.apache.avalon.Composer;
  @@ -40,7 +33,7 @@
   
   /** Default component manager for Cocoon's non sitemap components.
    * @author <a href="mailto:paul@luminas.co.uk">Paul Russell</a>
  - * @version CVS $Revision: 1.1.2.1 $ $Date: 2001/03/12 05:18:04 $
  + * @version CVS $Revision: 1.1.2.2 $ $Date: 2001/03/16 19:54:03 $
    */
   public class CocoonComponentManager implements ComponentManager, Loggable, Configurable, Contextualizable {
   
  @@ -50,29 +43,20 @@
        */
       private Context context;
   
  -    /** Hashmap of all components which this ComponentManager knows about.
  +    /** Static component handlers.
        */
  -    private Map components;
  +    private Map componentMapping;
   
  -    /** Static component instances.
  +    /** Static component handlers.
        */
  -    private Map instances;
  +    private Map componentHandlers;
   
  -    /** Configurations for components.
  -     */
  -    private Map configurations;
  -
  -    /** Component pools. */
  -    private Map pools;
  -
       /** Construct a new default component manager.
        */
       public CocoonComponentManager() {
           // Setup the maps.
  -        components = Collections.synchronizedMap(new HashMap());
  -        configurations = Collections.synchronizedMap(new HashMap());
  -        pools = Collections.synchronizedMap(new HashMap());
  -        instances = Collections.synchronizedMap(new HashMap());
  +        componentHandlers = Collections.synchronizedMap(new HashMap());
  +        componentMapping = Collections.synchronizedMap(new HashMap());
       }
   
       public void setLogger(Logger logger) {
  @@ -92,91 +76,52 @@
       public Component lookup( String role )
       throws ComponentManagerException {
   
  -        Component component;
  +        CocoonComponentHandler handler = null;
  +        Component component = null;
   
           if ( role == null ) {
               log.error("CocoonComponentManager Attempted to retrieve component with null role.");
  -            throw new ComponentNotFoundException("Attempted to retrieve component with null role.");
  +            throw new ComponentManagerException("Attempted to retrieve component with null role.");
           }
   
  +        handler = (CocoonComponentHandler) this.componentHandlers.get(role);
           // Retrieve the instance of the requested component
  -        component = (Component) this.instances.get(role);
  -
  -        if ( component != null ) {
  -            return component;
  -        }
  -
  -        // Retrieve the class of the requested component.
  -        Class componentClass = (Class)this.components.get(role);
  -
  -        if (componentClass == null) {
  +        if ( handler != null ) {
               try {
  -                componentClass = ClassUtils.loadClass(RoleUtils.defaultClass(role));
  +                component = handler.get();
               } catch (Exception e) {
  -                log.error("CocoonComponentManager Could not find component for role '" + role + "'.", e);
  -                throw new ComponentNotFoundException("Could not find component for role '" + role + "'.", e);
  +                throw new ComponentManagerException("Could not access the Component for you", e);
               }
  -
  -            this.components.put(role, componentClass);
  -
  -            if (Configurable.class.isAssignableFrom(componentClass)) {
  -                this.configurations.put(role, new DefaultConfiguration("", "-"));
  -            }
           }
   
  -        if ( !Component.class.isAssignableFrom(componentClass) ) {
  -            log.error("CocoonComponentManager Component with role '" + role + "' (" + componentClass.getName() + ")does not implement Component.");
  -            throw new ComponentNotAccessibleException(
  -                "Component with role '" + role + "' (" + componentClass.getName() + ")does not implement Component.",
  -                null
  -            );
  +        if (component != null) {
  +            this.componentMapping.put(component, handler);
  +            return component;
           }
   
  -        // Work out what class of component we're dealing with.
  -        if ( ThreadSafe.class.isAssignableFrom(componentClass)) {
  -            component = getThreadsafeComponent(role, componentClass);
  -        } else if ( Poolable.class.isAssignableFrom(componentClass) ) {
  -            component = getPooledComponent(role, componentClass);
  -        } else if ( SingleThreaded.class.isAssignableFrom(componentClass) ) {
  -            try {
  -                component = (Component)componentClass.newInstance();
  -            } catch ( InstantiationException e ) {
  -                log.error("CocoonComponentManager Could not access class " + componentClass.getName(), e);
  -                throw new ComponentNotAccessibleException(
  -                    "Could not instantiate component " + componentClass.getName() + ": " + e.getMessage(),
  -                    e
  -                );
  -            } catch ( IllegalAccessException e ) {
  -                log.error("CocoonComponentManager Could not access class " + componentClass.getName(), e);
  -                throw new ComponentNotAccessibleException(
  -                    "Could not access class " + componentClass.getName() + ": " + e.getMessage(),
  -                    e
  -                );
  -            }
  -            setupComponent(role, component);
  -        } else {
  -            /* The component doesn't implement any of the Avalon marker
  -             * classes, treat as normal.
  -             */
  -            try {
  -                component = (Component)componentClass.newInstance();
  -            } catch ( InstantiationException e ) {
  -                log.error("CocoonComponentManager Could not instantiate component " + componentClass.getName(), e);
  -                throw new ComponentNotAccessibleException(
  -                    "Could not instantiate component " + componentClass.getName() + ": " + e.getMessage(),
  -                    e
  -                );
  -            } catch ( IllegalAccessException e ) {
  -                log.error("CocoonComponentManager Could not access class " + componentClass.getName(), e);
  -                throw new ComponentNotAccessibleException(
  -                    "Could not access class " + componentClass.getName() + ": " + e.getMessage(),
  -                    e
  -                );
  -            }
  -            setupComponent(role, component);
  +        Class componentClass = null;
  +        Configuration config = new DefaultConfiguration("", "-");
  +
  +        try {
  +            componentClass = ClassUtils.loadClass(RoleUtils.defaultClass(role));
  +        } catch (Exception e) {
  +            log.error("CocoonComponentManager Could not find component for role: " + role, e);
  +            throw new ComponentManagerException("Could not find component for role: " + role, e);
           }
   
  -        return component;
  +        try {
  +            handler = new CocoonComponentHandler(componentClass, config, this, this.context);
  +            handler.setLogger(this.log);
  +            handler.init();
  +
  +            this.componentHandlers.put(role, handler);
  +            component = handler.get();
  +            this.componentMapping.put(component, handler);
  +
  +            return component;
  +        } catch (Exception e) {
  +            throw new ComponentManagerException("Could not access the component for role: " + role, e);
  +        }
       }
   
       public void configure(Configuration conf) throws ConfigurationException {
  @@ -230,125 +175,10 @@
           }
       }
   
  -    /** Retrieve an instance of a threadsafe component.
  -     * @param componentClass the class to retrieve an instance of.
  -     * @return and instance of the component.
  -     */
  -    private Component getThreadsafeComponent(String role, Class componentClass)
  -    throws ComponentManagerException {
  -
  -        Component retVal;
  -
  -        try {
  -            retVal = (Component) componentClass.newInstance();
  -
  -            this.setupComponent(role, retVal);
  -            this.instances.put(role, retVal);
  -        } catch (Exception e) {
  -            log.error("Could not set up the Component for role: " + role, e);
  -            throw new ComponentNotAccessibleException("Could not set up the Component for role: " + role, e);
  -        }
  -
  -        return retVal;
  -    }
  -
  -    /** Return an instance of a component from its associated pool.
  -     * @param componentClass the class of the component of which we need an instance.
  -     */
  -    private Component getPooledComponent(String role, Class componentClass)
  -    throws ComponentManagerException {
  -        ComponentPool pool = (ComponentPool)pools.get(componentClass);
  -
  -        if ( pool == null ) {
  -            try {
  -                log.debug("Creating new component pool for " + componentClass.getName() + ".");
  -                ComponentFactory cf = new ComponentFactory(componentClass, (Configuration)configurations.get(role), this, this.context);
  -                cf.setLogger(this.log);
  -
  -                pool = new ComponentPool(cf);
  -                pool.setLogger(this.log);
  -                pool.init();
  -            } catch (Exception e) {
  -                log.error("Could not create pool for component " + componentClass.getName(), e);
  -                throw new ComponentNotAccessibleException(
  -                    "Could not create pool for component " + componentClass.getName() + ": " + e.getMessage(),
  -                    e
  -                );
  -            }
  -            pools.put(componentClass, pool);
  -        }
  -
  -        Component component;
  -        try {
  -            component = (Component)pool.get();
  -        } catch ( Exception e ) {
  -            log.error("Could not retrieve component " + componentClass.getName(), e);
  -            throw new ComponentNotAccessibleException(
  -                "Could not retrieve component " + componentClass.getName() + " due to a " +
  -                e.getClass().getName() + ": " + e.getMessage(),
  -                e
  -            );
  -        }
  -
  -        return component;
  -    }
  -
       public void release(Component component) {
  -         if (
  -            component instanceof Disposable
  -            && ! ( component instanceof Poolable )
  -            && ! ( component instanceof ThreadSafe)
  -        ) {
  -            try {
  -                ((Disposable) component).dispose();
  -            } catch (Exception e) {
  -                this.log.warn(
  -                    "Could not dispose of instance of component " + component.getClass().getName() + ".",
  -                    e
  -                );
  -            }
  -         }
  -        
  -        if (component instanceof Poolable) {
  -            ComponentPool pool = (ComponentPool) pools.get(component.getClass());
  -
  -            if (pool != null) {
  -                pool.put((Poolable) component);
  -            }
  -        }
  -    }
  -
  -    /** Configure a new component.
  -     * @param c the component to configure.
  -     */
  -    private void setupComponent(String role, Component c)
  -    throws ComponentManagerException {
  -
  -        if ( c instanceof Contextualizable ) {
  -            ((Contextualizable)c).contextualize(this.context);
  -        }
  -
  -        if ( c instanceof Loggable ) {
  -            ((Loggable)c).setLogger(this.log);
  -        }
  -
  -        if ( c instanceof Configurable ) {
  -            try {
  -                ((Configurable)c).configure(
  -                    (Configuration)this.configurations.get(role)
  -                );
  -            } catch (ConfigurationException e) {
  -                log.error("Could not configure component " + c.getClass().getName(), e);
  -                throw new ComponentNotAccessibleException(
  -                    "Could not configure component " + c.getClass().getName() + ".",
  -                    e
  -                );
  -            }
  -        }
  -
  -        if ( c instanceof Composer ) {
  -            ((Composer)c).compose(this);
  -        }
  +        CocoonComponentHandler handler = (CocoonComponentHandler) this.componentMapping.get(component);
  +        handler.put(component);
  +        this.componentMapping.remove(component);
       }
   
       /** Add a new component to the manager.
  @@ -357,20 +187,29 @@
        * @param Configuration the configuration for this component.
        */
       public void addComponent(String role, Class component, Configuration config)
  -    throws ConfigurationException,
  -           ComponentManagerException {
  -
  -        this.components.put(role,component);
  -        if ( config != null ) {
  -            this.configurations.put(role, config);
  +    throws ComponentManagerException {
  +        try {
  +            CocoonComponentHandler handler = new CocoonComponentHandler(component, config, this, this.context);
  +            handler.setLogger(this.log);
  +            handler.init();
  +            this.componentHandlers.put(role, handler);
  +        } catch (Exception e) {
  +            throw new ComponentManagerException ("Could not set up Component for role: " + role, e);
           }
  -      }
  +    }
   
       /** Add a static instance of a component to the manager.
        * @param role the role name for the component.
        * @param instance the instance of the component.
        */
       public void addComponentInstance(String role, Object instance) {
  -        this.instances.put(role,instance);
  +        try {
  +            CocoonComponentHandler handler = new CocoonComponentHandler((Component) instance);
  +            handler.setLogger(this.log);
  +            handler.init();
  +            this.componentHandlers.put(role, handler);
  +        } catch (Exception e) {
  +            this.log.warn("Could not set up Component for role: " + role, e);
  +        }
       }
   }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.1   +210 -0    xml-cocoon/src/org/apache/cocoon/components/Attic/CocoonComponentHandler.java
  
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     webmaster@xml.apache.org
To unsubscribe, e-mail:          cocoon-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: cocoon-cvs-help@xml.apache.org