cziegeler    02/05/27 03:52:09

  Modified:    src/java/org/apache/cocoon/components/treeprocessor
                        InvokeContext.java
               src/java/org/apache/cocoon/components/treeprocessor/sitemap
                        PipelineNode.java PipelineNodeBuilder.java
  Log:
  First idea of configurable pipelines and movement to processing pipeline
  
  Revision  Changes    Path
  1.3       +45 -4     
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/InvokeContext.java
  
  Index: InvokeContext.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/InvokeContext.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InvokeContext.java        23 Apr 2002 16:11:06 -0000      1.2
  +++ InvokeContext.java        27 May 2002 10:52:08 -0000      1.3
  @@ -59,6 +59,7 @@
   
   import org.apache.cocoon.components.pipeline.EventPipeline;
   import org.apache.cocoon.components.pipeline.StreamPipeline;
  +import org.apache.cocoon.components.pipeline.ProcessingPipeline;
   import org.apache.cocoon.environment.Environment;
   import org.apache.log.Logger;
   
  @@ -75,7 +76,8 @@
    * </ul>
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Sylvain Wallez</a>
  - * @version CVS $Id: InvokeContext.java,v 1.2 2002/04/23 16:11:06 sylvain Exp $
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Carsten Ziegeler</a>
  + * @version CVS $Id: InvokeContext.java,v 1.3 2002/05/27 10:52:08 cziegeler Exp $
    */
   
   public class InvokeContext implements Recomposable, Disposable, Loggable {
  @@ -97,6 +99,15 @@
       /** Logger that we will log any messages to */
       private Logger logger;
   
  +    /** The name of the processing pipeline component */
  +    protected String processingPipelineName;
  +
  +    /** The parameters for the processing pipeline */
  +    protected Map processingPipelineParameters;
  +
  +    /** The ProcessingPipeline used */
  +    protected ProcessingPipeline processingPipeline;
  +
       /**
        * Create an <code>InvokeContext</code> without existing pipelines. This also 
means
        * the current request is external.
  @@ -115,15 +126,20 @@
           this.eventPipeline = eventPipeline;
       }
   
  -    public void setLogger(Logger logger)
  -    {
  +    public void setLogger(Logger logger) {
           this.logger = logger;
       }
   
  +    /**
  +     * Composable Interface
  +     */
       public void compose(ComponentManager manager) throws ComponentException {
           this.currentManager = manager;
       }
   
  +    /**
  +     * Recomposable interface
  +     */
       public void recompose(ComponentManager manager) throws ComponentException {
   
           this.currentManager = manager;
  @@ -133,6 +149,18 @@
               this.streamPipeline.recompose(manager);
               this.eventPipeline.recompose(manager);
           }
  +        if (this.processingPipeline != null) {
  +            this.processingPipeline.recompose(manager);
  +        }
  +    }
  +
  +    /**
  +     * Informs the context about a new pipeline section
  +     */
  +    public void inform(String pipelineName,
  +                       Map    parameters) {
  +        this.processingPipelineName = pipelineName;
  +        this.processingPipelineParameters = parameters;
       }
   
       /**
  @@ -157,6 +185,19 @@
           return this.streamPipeline;
       }
   
  +    /**
  +     * Get the current <code>ProcessingPipeline</code>
  +     */
  +    public ProcessingPipeline getProcessingPipeline()
  +    throws Exception {
  +        if (this.processingPipeline == null) {
  +            this.processingPipeline = 
(ProcessingPipeline)this.pipelinesManager.lookup(ProcessingPipeline.ROLE);
  +            // FIXME - Setup pipeline
  +            this.processingPipeline.recompose( this.pipelinesManager );
  +        }
  +        return this.processingPipeline;
  +    }
  +
       private final void setupPipelines() throws Exception {
           // Keep current manager for proper release
           this.pipelinesManager = this.currentManager;
  @@ -243,7 +284,7 @@
   
               this.pipelinesManager.release(this.eventPipeline);
               this.pipelinesManager.release(this.streamPipeline);
  -
  +            this.pipelinesManager.release(this.processingPipeline);
               this.pipelinesManager = null;
           }
       }
  
  
  
  1.5       +314 -313  
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java
  
  Index: PipelineNode.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PipelineNode.java 26 May 2002 22:02:51 -0000      1.4
  +++ PipelineNode.java 27 May 2002 10:52:09 -0000      1.5
  @@ -1,313 +1,314 @@
  -/*
  -
  - ============================================================================
  -                   The Apache Software License, Version 1.1
  - ============================================================================
  -
  - Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.
  -
  - Redistribution and use in source and binary forms, with or without modifica-
  - tion, are permitted provided that the following conditions are met:
  -
  - 1. Redistributions of  source code must  retain the above copyright  notice,
  -    this list of conditions and the following disclaimer.
  -
  - 2. Redistributions in binary form must reproduce the above copyright notice,
  -    this list of conditions and the following disclaimer in the documentation
  -    and/or other materials provided with the distribution.
  -
  - 3. The end-user documentation included with the redistribution, if any, must
  -    include  the following  acknowledgment:  "This product includes  software
  -    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
  -    Alternately, this  acknowledgment may  appear in the software itself,  if
  -    and wherever such third-party acknowledgments normally appear.
  -
  - 4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
  -    used to  endorse or promote  products derived from  this software without
  -    prior written permission. For written permission, please contact
  -    [EMAIL PROTECTED]
  -
  - 5. Products  derived from this software may not  be called "Apache", nor may
  -    "Apache" appear  in their name,  without prior written permission  of the
  -    Apache Software Foundation.
  -
  - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  - FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
  - APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
  - INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
  - DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
  - OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
  - ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
  - (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
  - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  -
  - This software  consists of voluntary contributions made  by many individuals
  - on  behalf of the Apache Software  Foundation and was  originally created by
  - Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
  - Software Foundation, please see <http://www.apache.org/>.
  -
  -*/
  -package org.apache.cocoon.components.treeprocessor.sitemap;
  -
  -import org.apache.avalon.framework.activity.Disposable;
  -import org.apache.avalon.framework.component.ComponentManager;
  -import org.apache.avalon.framework.component.Composable;
  -import org.apache.avalon.framework.parameters.Parameters;
  -
  -import org.apache.cocoon.ConnectionResetException;
  -import org.apache.cocoon.Constants;
  -import org.apache.cocoon.ResourceNotFoundException;
  -
  -import org.apache.cocoon.environment.Environment;
  -import org.apache.cocoon.environment.ObjectModelHelper;
  -import org.apache.cocoon.environment.Response;
  -import org.apache.cocoon.components.notification.Notifying;
  -import org.apache.cocoon.components.notification.NotifyingBuilder;
  -import org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode;
  -import org.apache.cocoon.components.treeprocessor.MapStackResolver;
  -import org.apache.cocoon.components.treeprocessor.ProcessingNode;
  -import org.apache.cocoon.components.treeprocessor.InvokeContext;
  -
  -import java.util.*;
  -
  -/**
  - *
  - *
  - * @author <a href="mailto:[EMAIL PROTECTED]";>Sylvain Wallez</a>
  - * @author <a href="mailto:[EMAIL PROTECTED]";>Gianugo Rabellino</a>
  - * @version CVS $Id: PipelineNode.java,v 1.4 2002/05/26 22:02:51 gianugo Exp $
  - */
  -
  -public class PipelineNode extends AbstractParentProcessingNode implements 
Composable {
  -
  -    // TODO : handle a 'fail-hard' environment attribute
  -    // can be useful to stop off-line generation when there's an error
  -
  -    private ProcessingNode[] children;
  -
  -    private ProcessingNode error404;
  -
  -    private ProcessingNode error500;
  -
  -    private ComponentManager manager;
  -
  -    private boolean internalOnly = false;
  -
  -    /** Is it the last <pipeline> in the enclosing <pipelines> ? */
  -    private boolean isLast = false;
  -
  -    private String expires;
  -
  -    /**
  -     * A constructor to receive the optional expires parameter.
  -     */
  -
  -    public PipelineNode(String expires) {
  -      this.expires = expires;
  -    }
  -
  -    /**
  -     * The component manager is used to create error pipelines
  -     */
  -    public void compose(ComponentManager manager) {
  -        this.manager = manager;
  -    }
  -
  -    public void setChildren(ProcessingNode[] nodes)
  -    {
  -        this.children = nodes;
  -    }
  -
  -    public void setLast(boolean isLast) {
  -        this.isLast = isLast;
  -    }
  -
  -    public void set404Handler(ProcessingNode node)
  -    {
  -        this.error404 = node;
  -    }
  -
  -    public void set500Handler(ProcessingNode node)
  -    {
  -        this.error500 = node;
  -    }
  -
  -    public void setInternalOnly(boolean internalOnly) {
  -        this.internalOnly = internalOnly;
  -    }
  -
  -    public final boolean invoke(Environment env, InvokeContext context)
  -      throws Exception {
  -
  -        // Always fail on external resquests if internal only.
  -        if (this.internalOnly && !context.isInternalRequest()) {
  -            return false;
  -        }
  -
  -        try {
  -            // See if we need to set an "Expires:" header
  -            if (expires != null) {
  -              Response res = ObjectModelHelper.getResponse(
  -                env.getObjectModel());
  -              long expiration = this.parseExpires(expires);
  -              res.setDateHeader("Expires", expiration);
  -              env.getObjectModel().put(ObjectModelHelper.EXPIRES_OBJECT, 
  -                new Long(expiration));
  -            }
  -            
  -            if (invokeNodes(children, env, context)) {
  -                return true;
  -            } else if (this.isLast) {
  -                String msg = "No pipeline matched request: " + env.getURIPrefix() + 
'/' + env.getURI();
  -                getLogger().info(msg);
  -                throw new ResourceNotFoundException(msg);
  -            } else {
  -                return false;
  -            }
  -
  -        } catch (ConnectionResetException cre) {
  -            // Will be reported by CocoonServlet, rethrowing
  -            throw cre;
  -
  -        } catch(ResourceNotFoundException rnfe) {
  -            getLogger().warn("Resource not found in pipeline at " + getLocation(), 
rnfe);
  -
  -            if (error404 != null) {
  -                // There's a handler
  -                return invokeErrorHandler(error404, rnfe, env);
  -
  -            } else {
  -                // No handler : propagate
  -                throw rnfe;
  -            }
  -
  -        } catch(Exception e) {
  -
  -            // Rethrow exception for internal requests
  -            if (error500 != null && !context.isInternalRequest()) {
  -
  -                getLogger().warn("Error while processing pipeline at " + 
getLocation(), e);
  -
  -                return invokeErrorHandler(error500, e, env);
  -
  -            } else {
  -                // No handler : propagate
  -
  -                getLogger().error("Error while processing pipeline at " + 
getLocation(), e);
  -                throw e;
  -            }
  -        }
  -    }
  -
  -    private boolean invokeErrorHandler(ProcessingNode node, Exception ex, 
Environment env)
  -      throws Exception {
  -
  -        InvokeContext errorContext = null;
  -
  -        try {
  -            // Try to reset the response to avoid mixing already produced output
  -            // and error page.
  -            env.tryResetResponse();
  -
  -            // Build a new context
  -            errorContext = new InvokeContext();
  -            errorContext.setLogger(getLogger());
  -            errorContext.compose(this.manager);
  -
  -            // Create a Notifying
  -            NotifyingBuilder notifyingBuilder= 
(NotifyingBuilder)this.manager.lookup(NotifyingBuilder.ROLE);
  -            Notifying currentNotifying = null;
  -            try {
  -                currentNotifying = notifyingBuilder.build(this, ex);
  -            } finally {
  -                this.manager.release(notifyingBuilder);
  -            }
  -
  -            // Add it to the object model
  -            env.getObjectModel().put(Constants.NOTIFYING_OBJECT, currentNotifying 
);
  -
  -            // notifying-generator is added in HandleErrorsNode
  -            return node.invoke(env, errorContext);
  -
  -        } catch (Exception subEx) {
  -            getLogger().error("error notifier barfs", subEx);
  -            return false;
  -
  -        } finally {
  -            if (errorContext != null) {
  -                errorContext.dispose();
  -            }
  -        }
  -    }
  -
  -    private long parseExpires(String expire) throws Exception {
  -
  -
  -      StringTokenizer tokens = new StringTokenizer(expire);
  -
  -      // get <base>
  -      String current = tokens.nextToken();
  -
  -      if (current.equals("modification")) {
  -        this.getLogger().warn("the \"modification\" keyword is not yet" +
  -          " implemented. Assuming \"now\" as the base attribute");
  -        current = "now";
  -      }    
  -
  -      if (!current.equals("now") && !current.equals("access")) {
  -        this.getLogger().error("bad <base> attribute, Expires header will not be 
set");
  -        return -1;  
  -      }
  -
  -      long number = 0;
  -      long modifier = 0;
  -      long expires = 0;
  -
  -      while (tokens.hasMoreTokens()) {
  -        current = tokens.nextToken();
  -        // get rid of the optional <plus> keyword
  -        if (current.equals("plus"))
  -          current = tokens.nextToken();
  -        // We're expecting a sequence of <number> and <modification> here
  -
  -        // get <number> first
  -        try {
  -          number = Long.parseLong(current);
  -        } catch (NumberFormatException nfe) {
  -          this.getLogger().error("state violation: a number was expected here");
  -          return -1;
  -        }
  -
  -        // now get <modifier>
  -        try {
  -          current = tokens.nextToken();
  -        } catch (NoSuchElementException nsee) {
  -          this.getLogger().error("state violation: expecting a modifier" +
  -            " but no one found: Expires header will not be set");
  -        }
  -
  -        if (current.equals("years"))
  -          modifier = 365L * 24L * 60L * 60L * 1000L;
  -        else if (current.equals("months"))  
  -          modifier = 30L * 24L * 60L * 60L * 1000L;
  -        else if (current.equals("weeks"))  
  -          modifier = 7L * 24L * 60L * 60L * 1000L;
  -        else if (current.equals("days"))  
  -          modifier = 24L * 60L * 60L * 1000L;
  -        else if (current.equals("hours"))  
  -          modifier = 60L * 60L * 1000L;
  -        else if (current.equals("minutes"))  
  -          modifier = 60L * 1000L;
  -        else if (current.equals("seconds"))  
  -          modifier = 1000L;
  -        else {
  -          this.getLogger().error("bad modifier (" + current +
  -            "): ignoring expires configuration");
  -          return -1;  
  -        }  
  -        expires += number * modifier;
  -      }
  -      return System.currentTimeMillis() + expires;
  -   }
  -}
  +/*
  +
  + ============================================================================
  +                   The Apache Software License, Version 1.1
  + ============================================================================
  +
  + Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.
  +
  + Redistribution and use in source and binary forms, with or without modifica-
  + tion, are permitted provided that the following conditions are met:
  +
  + 1. Redistributions of  source code must  retain the above copyright  notice,
  +    this list of conditions and the following disclaimer.
  +
  + 2. Redistributions in binary form must reproduce the above copyright notice,
  +    this list of conditions and the following disclaimer in the documentation
  +    and/or other materials provided with the distribution.
  +
  + 3. The end-user documentation included with the redistribution, if any, must
  +    include  the following  acknowledgment:  "This product includes  software
  +    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
  +    Alternately, this  acknowledgment may  appear in the software itself,  if
  +    and wherever such third-party acknowledgments normally appear.
  +
  + 4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
  +    used to  endorse or promote  products derived from  this software without
  +    prior written permission. For written permission, please contact
  +    [EMAIL PROTECTED]
  +
  + 5. Products  derived from this software may not  be called "Apache", nor may
  +    "Apache" appear  in their name,  without prior written permission  of the
  +    Apache Software Foundation.
  +
  + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  + FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
  + APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
  + INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
  + DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
  + OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
  + ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
  + (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
  + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  +
  + This software  consists of voluntary contributions made  by many individuals
  + on  behalf of the Apache Software  Foundation and was  originally created by
  + Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
  + Software Foundation, please see <http://www.apache.org/>.
  +
  +*/
  +package org.apache.cocoon.components.treeprocessor.sitemap;
  +
  +import org.apache.avalon.framework.activity.Disposable;
  +import org.apache.avalon.framework.component.ComponentManager;
  +import org.apache.avalon.framework.component.Composable;
  +import org.apache.avalon.framework.configuration.Configuration;
  +import org.apache.avalon.framework.parameters.Parameters;
  +
  +import org.apache.cocoon.ConnectionResetException;
  +import org.apache.cocoon.Constants;
  +import org.apache.cocoon.ResourceNotFoundException;
  +
  +import org.apache.cocoon.environment.Environment;
  +import org.apache.cocoon.environment.ObjectModelHelper;
  +import org.apache.cocoon.environment.Response;
  +import org.apache.cocoon.components.notification.Notifying;
  +import org.apache.cocoon.components.notification.NotifyingBuilder;
  +import org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode;
  +import org.apache.cocoon.components.treeprocessor.MapStackResolver;
  +import org.apache.cocoon.components.treeprocessor.ProcessingNode;
  +import org.apache.cocoon.components.treeprocessor.ParameterizableProcessingNode;
  +import org.apache.cocoon.components.treeprocessor.InvokeContext;
  +
  +import java.util.*;
  +
  +/**
  + *
  + *
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Sylvain Wallez</a>
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Gianugo Rabellino</a>
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Carsten Ziegeler</a>
  + * @version CVS $Id: PipelineNode.java,v 1.5 2002/05/27 10:52:09 cziegeler Exp $
  + */
  +public class PipelineNode
  +    extends AbstractParentProcessingNode
  +    implements Composable, ParameterizableProcessingNode {
  +
  +    // TODO : handle a 'fail-hard' environment attribute
  +    // can be useful to stop off-line generation when there's an error
  +
  +    private ProcessingNode[] children;
  +
  +    private ProcessingNode error404;
  +
  +    private ProcessingNode error500;
  +
  +    private ComponentManager manager;
  +
  +    private boolean internalOnly = false;
  +
  +    /** Is it the last <pipeline> in the enclosing <pipelines> ? */
  +    private boolean isLast = false;
  +
  +    private String expires;
  +
  +    /** The component name of the processing pipeline */
  +    protected String processingPipeline;
  +
  +    /** Optional Sitemap parameters */
  +    protected Map parameters;
  +
  +    /**
  +     * A constructor to receive the optional expires parameter
  +     * and optional parameters for the processing pipeline
  +     */
  +    public PipelineNode(Configuration config) {
  +        this.expires = config.getAttribute("expires", null);
  +        this.processingPipeline = config.getAttribute("name", null);
  +    }
  +
  +    /**
  +     * The component manager is used to create error pipelines
  +     */
  +    public void compose(ComponentManager manager) {
  +        this.manager = manager;
  +    }
  +
  +    public void setChildren(ProcessingNode[] nodes) {
  +        this.children = nodes;
  +    }
  +
  +    public void setParameters(Map parameterMap) {
  +        this.parameters = parameterMap;
  +    }
  +
  +    public void setLast(boolean isLast) {
  +        this.isLast = isLast;
  +    }
  +
  +    public void set404Handler(ProcessingNode node) {
  +        this.error404 = node;
  +    }
  +
  +    public void set500Handler(ProcessingNode node) {
  +        this.error500 = node;
  +    }
  +
  +    public void setInternalOnly(boolean internalOnly) {
  +        this.internalOnly = internalOnly;
  +    }
  +
  +    public final boolean invoke(Environment env, InvokeContext context)
  +    throws Exception {
  +
  +        // Always fail on external resquests if internal only.
  +        if (this.internalOnly && !context.isInternalRequest()) {
  +            return false;
  +        }
  +
  +        context.inform(this.processingPipeline, this.parameters);
  +
  +        try {
  +            // See if we need to set an "Expires:" header
  +            if (expires != null) {
  +                Response res = ObjectModelHelper.getResponse(
  +                    env.getObjectModel());
  +                long expiration = this.parseExpires(expires);
  +                res.setDateHeader("Expires", expiration);
  +                env.getObjectModel().put(ObjectModelHelper.EXPIRES_OBJECT,
  +                     new Long(expiration));
  +            }
  +
  +            if (invokeNodes(children, env, context)) {
  +                return true;
  +            } else if (this.isLast) {
  +                String msg = "No pipeline matched request: " + env.getURIPrefix() + 
'/' + env.getURI();
  +                getLogger().info(msg);
  +                throw new ResourceNotFoundException(msg);
  +            } else {
  +                return false;
  +            }
  +        } catch (ConnectionResetException cre) {
  +            // Will be reported by CocoonServlet, rethrowing
  +            throw cre;
  +        } catch(ResourceNotFoundException rnfe) {
  +            getLogger().warn("Resource not found in pipeline at " + getLocation(), 
rnfe);
  +
  +            if (error404 != null) {
  +                // There's a handler
  +                return invokeErrorHandler(error404, rnfe, env);
  +            } else {
  +                // No handler : propagate
  +                throw rnfe;
  +            }
  +        } catch(Exception e) {
  +            // Rethrow exception for internal requests
  +            if (error500 != null && !context.isInternalRequest()) {
  +                getLogger().warn("Error while processing pipeline at " + 
getLocation(), e);
  +                return invokeErrorHandler(error500, e, env);
  +            } else {
  +                // No handler : propagate
  +                getLogger().error("Error while processing pipeline at " + 
getLocation(), e);
  +                throw e;
  +            }
  +        }
  +    }
  +
  +    private boolean invokeErrorHandler(ProcessingNode node, Exception ex, 
Environment env)
  +    throws Exception {
  +        InvokeContext errorContext = null;
  +
  +        try {
  +            // Try to reset the response to avoid mixing already produced output
  +            // and error page.
  +            env.tryResetResponse();
  +
  +            // Build a new context
  +            errorContext = new InvokeContext();
  +            errorContext.setLogger(getLogger());
  +            errorContext.compose(this.manager);
  +
  +            // Create a Notifying
  +            NotifyingBuilder notifyingBuilder= 
(NotifyingBuilder)this.manager.lookup(NotifyingBuilder.ROLE);
  +            Notifying currentNotifying = null;
  +            try {
  +                currentNotifying = notifyingBuilder.build(this, ex);
  +            } finally {
  +                this.manager.release(notifyingBuilder);
  +            }
  +
  +            // Add it to the object model
  +            env.getObjectModel().put(Constants.NOTIFYING_OBJECT, currentNotifying );
  +
  +            // notifying-generator is added in HandleErrorsNode
  +            return node.invoke(env, errorContext);
  +        } catch (Exception subEx) {
  +            getLogger().error("error notifier barfs", subEx);
  +            return false;
  +        } finally {
  +            if (errorContext != null) {
  +                errorContext.dispose();
  +            }
  +        }
  +    }
  +
  +    private long parseExpires(String expire) throws Exception {
  +        StringTokenizer tokens = new StringTokenizer(expire);
  +
  +        // get <base>
  +        String current = tokens.nextToken();
  +        if (current.equals("modification")) {
  +
  +            this.getLogger().warn("the \"modification\" keyword is not yet" +
  +
  +                " implemented. Assuming \"now\" as the base attribute");
  +            current = "now";
  +        }
  +
  +        if (!current.equals("now") && !current.equals("access")) {
  +            this.getLogger().error("bad <base> attribute, Expires header will not 
be set");
  +            return -1;
  +        }
  +        long number = 0;
  +        long modifier = 0;
  +        long expires = 0;
  +
  +        while (tokens.hasMoreTokens()) {
  +            current = tokens.nextToken();
  +
  +            // get rid of the optional <plus> keyword
  +            if (current.equals("plus"))
  +                current = tokens.nextToken();
  +
  +            // We're expecting a sequence of <number> and <modification> here
  +            // get <number> first
  +            try {
  +                number = Long.parseLong(current);
  +            } catch (NumberFormatException nfe) {
  +                this.getLogger().error("state violation: a number was expected 
here");
  +                return -1;
  +            }
  +
  +            // now get <modifier>
  +            try {
  +                current = tokens.nextToken();
  +            } catch (NoSuchElementException nsee) {
  +                this.getLogger().error("state violation: expecting a modifier" +
  +                    " but no one found: Expires header will not be set");
  +            }
  +            if (current.equals("years"))
  +                modifier = 365L * 24L * 60L * 60L * 1000L;
  +            else if (current.equals("months"))
  +                modifier = 30L * 24L * 60L * 60L * 1000L;
  +            else if (current.equals("weeks"))
  +                modifier = 7L * 24L * 60L * 60L * 1000L;
  +            else if (current.equals("days"))
  +                modifier = 24L * 60L * 60L * 1000L;
  +            else if (current.equals("hours"))
  +                modifier = 60L * 60L * 1000L;
  +            else if (current.equals("minutes"))
  +                modifier = 60L * 1000L;
  +            else if (current.equals("seconds"))
  +                modifier = 1000L;
  +            else {
  +                this.getLogger().error("bad modifier (" + current +
  +                   "): ignoring expires configuration");
  +                return -1;
  +            }
  +            expires += number * modifier;
  +        }
  +
  +        return System.currentTimeMillis() + expires;
  +    }
  +}
  \ No newline at end of file
  
  
  
  1.3       +129 -135  
xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNodeBuilder.java
  
  Index: PipelineNodeBuilder.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNodeBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- PipelineNodeBuilder.java  26 May 2002 22:02:51 -0000      1.2
  +++ PipelineNodeBuilder.java  27 May 2002 10:52:09 -0000      1.3
  @@ -1,135 +1,129 @@
  -/*
  -
  - ============================================================================
  -                   The Apache Software License, Version 1.1
  - ============================================================================
  -
  - Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.
  -
  - Redistribution and use in source and binary forms, with or without modifica-
  - tion, are permitted provided that the following conditions are met:
  -
  - 1. Redistributions of  source code must  retain the above copyright  notice,
  -    this list of conditions and the following disclaimer.
  -
  - 2. Redistributions in binary form must reproduce the above copyright notice,
  -    this list of conditions and the following disclaimer in the documentation
  -    and/or other materials provided with the distribution.
  -
  - 3. The end-user documentation included with the redistribution, if any, must
  -    include  the following  acknowledgment:  "This product includes  software
  -    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
  -    Alternately, this  acknowledgment may  appear in the software itself,  if
  -    and wherever such third-party acknowledgments normally appear.
  -
  - 4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
  -    used to  endorse or promote  products derived from  this software without
  -    prior written permission. For written permission, please contact
  -    [EMAIL PROTECTED]
  -
  - 5. Products  derived from this software may not  be called "Apache", nor may
  -    "Apache" appear  in their name,  without prior written permission  of the
  -    Apache Software Foundation.
  -
  - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  - FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
  - APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
  - INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
  - DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
  - OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
  - ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
  - (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
  - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  -
  - This software  consists of voluntary contributions made  by many individuals
  - on  behalf of the Apache Software  Foundation and was  originally created by
  - Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
  - Software Foundation, please see <http://www.apache.org/>.
  -
  -*/
  -package org.apache.cocoon.components.treeprocessor.sitemap;
  -
  -import org.apache.avalon.framework.configuration.Configuration;
  -import org.apache.avalon.framework.configuration.ConfigurationException;
  -import org.apache.avalon.framework.thread.ThreadSafe;
  -
  -import 
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNodeBuilder;
  -import org.apache.cocoon.components.treeprocessor.ProcessingNode;
  -import org.apache.cocoon.components.treeprocessor.ProcessingNodeBuilder;
  -
  -import java.util.*;
  -
  -/**
  - * Builds a &lt;map:pipeline&gt;
  -
  - * @author <a href="mailto:[EMAIL PROTECTED]";>Sylvain Wallez</a>
  - * @author <a href="mailto:[EMAIL PROTECTED]";>Gianugo Rabellino</a>
  - * @version CVS $Id: PipelineNodeBuilder.java,v 1.2 2002/05/26 22:02:51 gianugo Exp 
$
  - */
  -
  -public class PipelineNodeBuilder extends AbstractParentProcessingNodeBuilder 
implements ThreadSafe {
  -
  -    /** This builder has no parameters -- return <code>false</code> */
  -    protected boolean hasParameters() {
  -        return true;
  -    }
  -
  -    public ProcessingNode buildNode(Configuration config) throws Exception {
  -    
  -        PipelineNode node = new PipelineNode(
  -            config.getAttribute("expires", null));
  -        this.treeBuilder.setupNode(node, config);
  -
  -        node.setInternalOnly(config.getAttributeAsBoolean("internal-only", false));
  -
  -        ProcessingNode error404Handler = null;
  -        ProcessingNode error500Handler = null;
  -
  -        Configuration[] childConfigs = config.getChildren();
  -        List children = new ArrayList();
  -
  -        childLoop : for (int i = 0; i < childConfigs.length; i++) {
  -            Configuration childConfig = childConfigs[i];
  -            if (!isChild(childConfig)) {
  -                continue childLoop;
  -            }
  -
  -            ProcessingNodeBuilder builder = 
this.treeBuilder.createNodeBuilder(childConfig);
  -
  -            if (builder instanceof HandleErrorsNodeBuilder) {
  -                // Error handler : check type
  -                HandleErrorsNode handler = 
(HandleErrorsNode)builder.buildNode(childConfig);
  -                int type = handler.getStatusCode();
  -
  -                if ( (type == 404 && error404Handler != null) ||
  -                     (type == 500 && error500Handler != null) ) {
  -                    String msg = "Duplicate handle-errors at " + 
handler.getLocation();
  -                    getLogger().error(msg);
  -                    throw new ConfigurationException(msg);
  -                }
  -
  -                if (type == 404) {
  -                    error404Handler = handler;
  -                } else if (type == 500) {
  -                    error500Handler = handler;
  -                } else {
  -                    String msg = "Unkown handle-errors type (" + type + ") at " + 
handler.getLocation();
  -                    getLogger().error(msg);
  -                    throw new ConfigurationException(msg);
  -                }
  -
  -            } else {
  -                // Regular builder
  -                children.add(builder.buildNode(childConfig));
  -            }
  -        }
  -
  -        node.setChildren(toNodeArray(children));
  -        node.set404Handler(error404Handler);
  -        node.set500Handler(error500Handler);
  -
  -        return node;
  -    }
  -
  -}
  +/*
  + ============================================================================
  +                   The Apache Software License, Version 1.1
  + ============================================================================
  +
  + Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.
  +
  + Redistribution and use in source and binary forms, with or without modifica-
  + tion, are permitted provided that the following conditions are met:
  +
  + 1. Redistributions of  source code must  retain the above copyright  notice,
  +    this list of conditions and the following disclaimer.
  +
  + 2. Redistributions in binary form must reproduce the above copyright notice,
  +    this list of conditions and the following disclaimer in the documentation
  +    and/or other materials provided with the distribution.
  +
  + 3. The end-user documentation included with the redistribution, if any, must
  +    include  the following  acknowledgment:  "This product includes  software
  +    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
  +    Alternately, this  acknowledgment may  appear in the software itself,  if
  +    and wherever such third-party acknowledgments normally appear.
  +
  + 4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
  +    used to  endorse or promote  products derived from  this software without
  +    prior written permission. For written permission, please contact
  +    [EMAIL PROTECTED]
  +
  + 5. Products  derived from this software may not  be called "Apache", nor may
  +    "Apache" appear  in their name,  without prior written permission  of the
  +    Apache Software Foundation.
  +
  + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  + FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
  + APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
  + INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
  + DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
  + OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
  + ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
  + (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
  + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  +
  + This software  consists of voluntary contributions made  by many individuals
  + on  behalf of the Apache Software  Foundation and was  originally created by
  + Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
  + Software Foundation, please see <http://www.apache.org/>.
  +
  +*/
  +package org.apache.cocoon.components.treeprocessor.sitemap;
  +
  +import org.apache.avalon.framework.configuration.Configuration;
  +import org.apache.avalon.framework.configuration.ConfigurationException;
  +import org.apache.avalon.framework.thread.ThreadSafe;
  +import 
org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNodeBuilder;
  +import org.apache.cocoon.components.treeprocessor.ProcessingNode;
  +import org.apache.cocoon.components.treeprocessor.ProcessingNodeBuilder;
  +
  +import java.util.*;
  +
  +/**
  + * Builds a &lt;map:pipeline&gt;
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Sylvain Wallez</a>
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Gianugo Rabellino</a>
  + * @version CVS $Id: PipelineNodeBuilder.java,v 1.3 2002/05/27 10:52:09 cziegeler 
Exp $
  + */
  +
  +public class PipelineNodeBuilder
  +    extends AbstractParentProcessingNodeBuilder
  +    implements ThreadSafe {
  +
  +    /** This builder has no parameters -- return <code>false</code> */
  +    protected boolean hasParameters() {
  +        return true;
  +    }
  +
  +    public ProcessingNode buildNode(Configuration config)
  +    throws Exception {
  +        PipelineNode node = new PipelineNode( config );
  +
  +        this.treeBuilder.setupNode(node, config);
  +        node.setInternalOnly(config.getAttributeAsBoolean("internal-only", false));
  +        ProcessingNode error404Handler = null;
  +        ProcessingNode error500Handler = null;
  +        Configuration[] childConfigs = config.getChildren();
  +        List children = new ArrayList();
  +        for (int i = 0; i < childConfigs.length; i++) {
  +
  +            Configuration childConfig = childConfigs[i];
  +            if (isChild(childConfig)) {
  +
  +                ProcessingNodeBuilder builder = 
this.treeBuilder.createNodeBuilder(childConfig);
  +                if (builder instanceof HandleErrorsNodeBuilder) {
  +                    // Error handler : check type
  +                    HandleErrorsNode handler = 
(HandleErrorsNode)builder.buildNode(childConfig);
  +                    int type = handler.getStatusCode();
  +
  +                    if ( (type == 404 && error404Handler != null) ||
  +                         (type == 500 && error500Handler != null) ) {
  +                        String msg = "Duplicate handle-errors at " + 
handler.getLocation();
  +                        getLogger().error(msg);
  +                        throw new ConfigurationException(msg);
  +                    }
  +
  +                    if (type == 404) {
  +                        error404Handler = handler;
  +                    } else if (type == 500) {
  +                        error500Handler = handler;
  +                    } else {
  +                        String msg = "Unkown handle-errors type (" + type + ") at " 
+ handler.getLocation();
  +                        getLogger().error(msg);
  +                        throw new ConfigurationException(msg);
  +                    }
  +                } else {
  +                    // Regular builder
  +                    children.add(builder.buildNode(childConfig));
  +                }
  +            }
  +        }
  +        node.setChildren(toNodeArray(children));
  +        node.set404Handler(error404Handler);
  +        node.set500Handler(error500Handler);
  +        return node;
  +    }
  +
  +
  +
  +}
  +
  
  
  

----------------------------------------------------------------------
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