sylvain     2004/01/18 14:27:15

  Modified:    src/java/org/apache/cocoon/components/treeprocessor
                        TreeProcessor.java
               src/java/org/apache/cocoon/components/treeprocessor/sitemap
                        PipelinesNode.java
  Log:
  Internal redirects "cocoon:" are now processed immediately (previously, 
redirecting was only setting a flag handled at the end of the tree processing)
  
  Revision  Changes    Path
  1.17      +51 -22    
cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java
  
  Index: TreeProcessor.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- TreeProcessor.java        15 Nov 2003 04:21:30 -0000      1.16
  +++ TreeProcessor.java        18 Jan 2004 22:27:14 -0000      1.17
  @@ -50,6 +50,7 @@
   */
   package org.apache.cocoon.components.treeprocessor;
   
  +import java.io.IOException;
   import java.net.MalformedURLException;
   import java.util.Collections;
   import java.util.HashMap;
  @@ -73,6 +74,7 @@
   import org.apache.avalon.framework.logger.AbstractLogEnabled;
   import org.apache.avalon.framework.logger.Logger;
   import org.apache.avalon.framework.thread.ThreadSafe;
  +import org.apache.cocoon.ProcessingException;
   import org.apache.cocoon.Processor;
   import org.apache.cocoon.components.ChainedConfiguration;
   import org.apache.cocoon.components.CocoonComponentManager;
  @@ -81,7 +83,9 @@
   import org.apache.cocoon.components.pipeline.ProcessingPipeline;
   import org.apache.cocoon.components.source.SourceUtil;
   import org.apache.cocoon.components.source.impl.DelayedRefreshSourceWrapper;
  +import org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode;
   import org.apache.cocoon.environment.Environment;
  +import org.apache.cocoon.environment.ForwardRedirector;
   import org.apache.cocoon.environment.wrapper.EnvironmentWrapper;
   import org.apache.cocoon.environment.wrapper.MutableEnvironmentFacade;
   import org.apache.excalibur.source.Source;
  @@ -104,7 +108,9 @@
                  Contextualizable,
                  Disposable {
   
  -    public static final String COCOON_REDIRECT_ATTR = "cocoon: redirect url";
  +    public static final String REDIRECTOR_ATTR = "sitemap:redirector";
  +
  +    private static final String OBJECT_SOURCE_RESOLVER = 
"sitemap:sourceresolver";
   
       private static final String XCONF_URL =
           
"resource://org/apache/cocoon/components/treeprocessor/treeprocessor-builtins.xml";
  @@ -350,33 +356,32 @@
   
           // and now process
           CocoonComponentManager.enterEnvironment(environment, 
this.sitemapComponentManager, this);
  +
  +        Map objectModel = environment.getObjectModel();
  +
  +        Object oldResolver = objectModel.get(OBJECT_SOURCE_RESOLVER);
  +        Object oldRedirector = environment.getAttribute(REDIRECTOR_ATTR);
  +
  +        // Build a redirector
  +        TreeProcessorRedirector redirector = new 
TreeProcessorRedirector(environment, context);
  +        setupLogger(redirector);
  +
  +        objectModel.put(OBJECT_SOURCE_RESOLVER, environment);
  +        environment.setAttribute(REDIRECTOR_ATTR, redirector);
           try {
               boolean success = this.rootNode.invoke(environment, context);
               
  -            if (success) {
  -                // Do we have a cocoon: redirect ?
  -                String cocoonRedirect = 
(String)environment.getAttribute(COCOON_REDIRECT_ATTR);
  -                if (cocoonRedirect != null) {
  -                    // Remove the redirect indication
  -                    environment.removeAttribute(COCOON_REDIRECT_ATTR);
  -                    // and handle the redirect
  -                    return handleCocoonRedirect(cocoonRedirect, environment, 
context);
  -                } else {
  -                    // "normal" success
  -                    return true;
  -                }
  -           
  -            } else {
  -                return false;
  -            }
  +            return success;
   
           } finally {
               CocoonComponentManager.leaveEnvironment();
  +            // Restore old redirector and resolver
  +            environment.setAttribute(REDIRECTOR_ATTR, oldRedirector);
  +            objectModel.put(PipelinesNode.OBJECT_SOURCE_RESOLVER, 
oldResolver);
           }
       }
  -    
  -    private boolean handleCocoonRedirect(String uri, Environment 
environment, InvokeContext context) throws Exception
  -    {
  +        
  +    private boolean handleCocoonRedirect(String uri, Environment 
environment, InvokeContext context) throws Exception {
           
           // Build an environment wrapper
           // If the current env is a facade, change the delegate and continue 
processing the facade, since
  @@ -407,7 +412,8 @@
           }
           
           // Process the redirect
  -        context.reset();
  +// No more reset since with TreeProcessorRedirector, we need to pop values 
from the redirect location
  +//        context.reset();
           return processor.process(newEnv, context);
       }
       
  @@ -556,6 +562,29 @@
                   ((Disposable)disposableNodes.get(i)).dispose();
               }
               this.disposableNodes = null;
  +        }
  +    }
  +    
  +    private class TreeProcessorRedirector extends ForwardRedirector {
  +        
  +        private InvokeContext context;
  +        public TreeProcessorRedirector(Environment env, InvokeContext 
context) {
  +            super(env);
  +            this.context = context;
  +        }
  +        
  +        protected void cocoonRedirect(String uri) throws IOException, 
ProcessingException {
  +            try {
  +                TreeProcessor.this.handleCocoonRedirect(uri, this.env, 
this.context);
  +            } catch(IOException ioe) {
  +                throw ioe;
  +            } catch(ProcessingException pe) {
  +                throw pe;
  +            } catch(RuntimeException re) {
  +                throw re;
  +            } catch(Exception ex) {
  +                throw new ProcessingException(ex);
  +            }
           }
       }
       
  
  
  
  1.7       +3 -20     
cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNode.java
  
  Index: PipelinesNode.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNode.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- PipelinesNode.java        24 Oct 2003 13:36:40 -0000      1.6
  +++ PipelinesNode.java        18 Jan 2004 22:27:15 -0000      1.7
  @@ -59,6 +59,7 @@
   import org.apache.cocoon.components.treeprocessor.InvokeContext;
   import org.apache.cocoon.components.treeprocessor.ProcessingNode;
   import org.apache.cocoon.components.treeprocessor.SimpleParentProcessingNode;
  +import org.apache.cocoon.components.treeprocessor.TreeProcessor;
   import org.apache.cocoon.environment.Environment;
   import org.apache.cocoon.environment.ForwardRedirector;
   import org.apache.cocoon.environment.Redirector;
  @@ -76,8 +77,6 @@
   public final class PipelinesNode extends SimpleParentProcessingNode
     implements Composable, Disposable {
   
  -    private static final String REDIRECTOR_ATTR = "sitemap:redirector";
  -
       private ComponentManager manager;
       
       private ErrorHandlerHelper errorHandlerHelper = new ErrorHandlerHelper();
  @@ -116,7 +115,7 @@
       }
   
       public static Redirector getRedirector(Environment env) {
  -        return (Redirector)env.getAttribute(REDIRECTOR_ATTR);
  +        return (Redirector)env.getAttribute(TreeProcessor.REDIRECTOR_ATTR);
       }
   
       /**
  @@ -133,18 +132,6 @@
           // Recompose context (and pipelines) to the local component manager
           context.recompose(this.manager);
   
  -        // Build a redirector
  -        ForwardRedirector redirector = new ForwardRedirector(env);
  -        setupLogger(redirector);
  -
  -        Map objectModel = env.getObjectModel();
  -
  -        Object oldResolver = objectModel.get(OBJECT_SOURCE_RESOLVER);
  -        Object oldRedirector = env.getAttribute(REDIRECTOR_ATTR);
  -
  -        objectModel.put(OBJECT_SOURCE_RESOLVER, env);
  -        env.setAttribute(REDIRECTOR_ATTR, redirector);
  -
           try {
               // FIXME : is there any useful information that can be passed as 
top-level parameters,
               //         such as the URI of the mount point ?
  @@ -158,10 +145,6 @@
                   // No handler : propagate
                   throw ex;
               }
  -        } finally {
  -            // Restore old redirector and resolver
  -            env.setAttribute(REDIRECTOR_ATTR, oldRedirector);
  -            objectModel.put(OBJECT_SOURCE_RESOLVER, oldResolver);
           }
       }
   
  
  
  

Reply via email to