cziegeler    2002/11/15 07:12:35

  Modified:    src/java/org/apache/cocoon/components
                        CocoonComponentManager.java
  Log:
  New Object to support RequestLifecycleComponents
  
  Revision  Changes    Path
  1.31      +136 -13   
xml-cocoon2/src/java/org/apache/cocoon/components/CocoonComponentManager.java
  
  Index: CocoonComponentManager.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/CocoonComponentManager.java,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- CocoonComponentManager.java       15 Nov 2002 13:31:36 -0000      1.30
  +++ CocoonComponentManager.java       15 Nov 2002 15:12:35 -0000      1.31
  @@ -75,9 +75,9 @@
   
   /**
    * Cocoon Component Manager.
  - * This manager extends the <code>ExcaliburComponentManager</code>
  - * by a special lifecycle handling for a RequestLifecycleComponent
  - * and by handling the lookup of the <code>SourceResolver</code> (in development)
  + * This manager extends the {@link ExcaliburComponentManager}
  + * by a special lifecycle handling for a {@link RequestLifecycleComponent}
  + * and by handling the lookup of the <code>SourceResolver</code>
    *
    * @author <a href="mailto:cziegeler@;apache.org">Carsten Ziegeler</a>
    * @version CVS $Id$
  @@ -86,6 +86,10 @@
   extends ExcaliburComponentManager
   implements SourceResolver
   {
  +    /** The key used to store the current process environment */
  +    private static final String PROCESS_KEY =
  +               "org.apache.cocoon.components.CocoonComponentManager";
  +         
       /** The environment information */
       private static InheritableThreadLocal environmentStack = new 
InheritableThreadLocal();
   
  @@ -158,7 +162,7 @@
                   while (iter.hasNext()) {
                       final Object[] o = (Object[])iter.next();
                       final Component component = (Component)o[0];
  -                    ((CocoonComponentManager)o[1]).releaseRLComponent( component );
  +                    ((ComponentManager)o[1]).release( component );
                   }
                   if (objects.length > 6) {
                       final List automaticReleasedComponents = (List)objects[6];
  @@ -195,7 +199,7 @@
           Map values = new HashMap(5);
           Long key = new Long(System.currentTimeMillis());
           processes.put(key, values);
  -        
env.getObjectModel().put("org.apache.cocoon.components.CocoonComponentManager", key);
  +        env.getObjectModel().put(PROCESS_KEY, key);
           return key;
       }
       
  @@ -261,6 +265,22 @@
           final Stack stack = (Stack)environmentStack.get();
           if ( null != stack && !stack.empty()) {
               final Object[] objects = (Object[])stack.peek();
  +            /* new version that will fix the RequestLifecycleComponent bug
  +            Map objectModel = (Map)objects[1];
  +            Object processKey = objectModel.get(PROCESS_KEY);
  +            if ( null != processKey) {
  +                Map processes = (Map)processList.get();
  +                if ( null != processes) {
  +                    EnvironmentDescription envDesc = 
(EnvironmentDescription)processes.get(processKey);
  +                    if (envDesc != null) {
  +                        final Component component = 
envDesc.getRequestLifecycleComponent(role);
  +                        if (null != component) {
  +                            return component;
  +                        }
  +                    }
  +                }
  +            }
  +            */
               final Map components = (Map)objects[2];
               final Object[] o = (Object[])components.get(role);
               if ( null != o  ) {
  @@ -419,13 +439,6 @@
       }
   
       /**
  -     * Release a RequestLifecycleComponent
  -     */
  -    protected void releaseRLComponent( final Component component ) {
  -        super.release( component );
  -    }
  -
  -    /**
        * Get a <code>Source</code> object.
        */
       public Source resolveURI(final String location)
  @@ -456,4 +469,114 @@
       public void release( final Source source ) {
           this.sourceResolver.release( source );
       }
  +}
  +
  +final class EnvironmentDescription {
  +    
  +    Environment environment;
  +    Map         objectModel;
  +    Map         requestLifecycleComponents = new HashMap(5);
  +    List        autoreleaseComponents      = new ArrayList(2);
  +    
  +    /**
  +     * Constructor
  +     */
  +    EnvironmentDescription(Environment env, Map objectModel) {
  +        this.environment = env;
  +        this.objectModel = objectModel;
  +    }
  +    
  +    /**
  +     * Release all components of this environment
  +     * All RequestLifecycleComponents and autoreleaseComponents are
  +     * released.
  +     */
  +    void release() {
  +        final Iterator iter = this.requestLifecycleComponents.values().iterator();
  +        while (iter.hasNext()) {
  +            final Object[] o = (Object[])iter.next();
  +            final Component component = (Component)o[0];
  +            ((ComponentManager)o[1]).release( component );
  +        }
  +        
  +        for(int i = 0; i < autoreleaseComponents.size(); i++) {
  +            final Object[] o = (Object[])autoreleaseComponents.get(i);
  +            final Component component = (Component)o[0];
  +            if (o[1] instanceof ComponentManager) {
  +                ((ComponentManager)o[1]).release( component );
  +            } else {
  +                ((ComponentSelector)o[1]).release( component );
  +                if (o[2] != null) {
  +                    ((ComponentManager)o[2]).release( (Component)o[1] );
  +                }
  +            }
  +        }
  +    }
  +    
  +    /**
  +     * Add a RequestLifecycleComponent to the environment
  +     */
  +    void addRequestLifecycleComponent(final String role, 
  +                                      final Component co, 
  +                                      final ComponentManager manager) {
  +        this.requestLifecycleComponents.put(role, new Object[] {co, manager});
  +    }
  +    
  +    /**
  +     * Search a RequestLifecycleComponent
  +     */
  +    Component getRequestLifecycleComponent(final String role) {
  +        final Object[] o = (Object[])this.requestLifecycleComponents.get(role);
  +        if ( null != o ) {
  +            return (Component)o[0];
  +        }
  +        return null;
  +    }
  +
  +    /**
  +     * Add an automatically released component
  +     */
  +    public void addToAutoRelease(final ComponentSelector selector,
  +                                  final Component         component,
  +                                  final ComponentManager  manager) {
  +        this.autoreleaseComponents.add(new Object[] {component, selector, manager});
  +    }
  +
  +    /**
  +     * Add an automatically released component
  +     */
  +    public void addToAutoRelease(final ComponentManager manager,
  +                                  final Component        component) {
  +        this.autoreleaseComponents.add(new Object[] {component, manager});
  +    }
  +
  +    /**
  +     * Remove from automatically released components
  +     */
  +    public void removeFromAutoRelease(final Component component)
  +    throws ProcessingException {
  +        int i = 0;
  +        boolean found = false;
  +        while (i < this.autoreleaseComponents.size() && !found) {
  +            final Object[] o = (Object[])this.autoreleaseComponents.get(i);
  +            if (o[0] == component) {
  +                found = true;
  +                if (o[1] instanceof ComponentManager) {
  +                    ((ComponentManager)o[1]).release( component );
  +                } else {
  +                    ((ComponentSelector)o[1]).release( component );
  +                    if (o[2] != null) {
  +                        ((ComponentManager)o[2]).release( (Component)o[1] );
  +                    }
  +                }
  +                this.autoreleaseComponents.remove(i);
  +            } else {
  +                i++;
  +            }
  +        }
  +        if (!found) {
  +            throw new ProcessingException("Unable to remove component from 
automatic release: component not found.");
  +        }
  +    }
  +        
   }
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to