gianugo     02/05/26 15:02:51

  Modified:    src/java/org/apache/cocoon/components/treeprocessor/sitemap
                        PipelineNode.java PipelineNodeBuilder.java
               src/java/org/apache/cocoon/environment
                        ObjectModelHelper.java
  Log:
  Added an "expires" directive to <map:pipeline> in order to manually set an 
"Expires:" HTTP header following Apache's mod_expires syntax.
  
  Revision  Changes    Path
  1.4       +313 -222  
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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- PipelineNode.java 29 Apr 2002 14:46:16 -0000      1.3
  +++ PipelineNode.java 26 May 2002 22:02:51 -0000      1.4
  @@ -1,222 +1,313 @@
  -/*
  -
  - ============================================================================
  -                   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.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>
  - * @version CVS $Id: PipelineNode.java,v 1.3 2002/04/29 14:46:16 cziegeler 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;
  -
  -    /**
  -     * 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 {
  -
  -            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();
  -            }
  -        }
  -    }
  -}
  +/*
  +
  + ============================================================================
  +                   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;
  +   }
  +}
  
  
  
  1.2       +135 -133  
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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PipelineNodeBuilder.java  5 Mar 2002 08:26:23 -0000       1.1
  +++ PipelineNodeBuilder.java  26 May 2002 22:02:51 -0000      1.2
  @@ -1,133 +1,135 @@
  -/*
  -
  - ============================================================================
  -                   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>
  - * @version CVS $Id: PipelineNodeBuilder.java,v 1.1 2002/03/05 08:26:23 sylvain 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();
  -        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.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;
  +    }
  +
  +}
  
  
  
  1.5       +108 -101  
xml-cocoon2/src/java/org/apache/cocoon/environment/ObjectModelHelper.java
  
  Index: ObjectModelHelper.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/environment/ObjectModelHelper.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ObjectModelHelper.java    22 Feb 2002 07:03:49 -0000      1.4
  +++ ObjectModelHelper.java    26 May 2002 22:02:51 -0000      1.5
  @@ -1,101 +1,108 @@
  -/*
  -
  - ============================================================================
  -                   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.environment;
  -
  -import java.util.Map;
  -
  -/**
  - * A set of constants and methods to access the content of the object model.
  - * <p>
  - * The object model is a <code>Map</code> used to pass information about the
  - * calling environment to the sitemap and its components (matchers, actions,
  - * transformers, etc).
  - * <p>
  - * This class provides accessors only for the objects in the object model that are
  - * common to every environment and which can thus be used safely. Some environments
  - * provide additional objects, but they are not described here and accessing them
  - * should be done in due cause since this ties the application to that particular
  - * environment.
  - *
  - * @author <a href="mailto:[EMAIL PROTECTED]";>Sylvain Wallez</a>
  - * @version CVS $Id: ObjectModelHelper.java,v 1.4 2002/02/22 07:03:49 cziegeler Exp 
$
  - */
  -
  -public final class ObjectModelHelper {
  -
  -    // FIXME : Constants copied from cocoon.Constants where they should be 
deprecated
  -    // LINK_OBJECT should also be moved to CommandLineEnvironment
  -
  -    /** Key for the environment {@link Request} in the object model. */
  -    public final static String REQUEST_OBJECT  = "request";
  -
  -    /** Key for the environment {@link Response} in the object model. */
  -    public final static String RESPONSE_OBJECT = "response";
  -
  -    /** Key for the environment {@link Context} in the object model. */
  -    public final static String CONTEXT_OBJECT  = "context";
  -
  -    private ObjectModelHelper() {
  -        // Forbid instantiation
  -    }
  -
  -    public static final Request getRequest(Map objectModel) {
  -        return (Request)objectModel.get(REQUEST_OBJECT);
  -    }
  -
  -    public static final Response getResponse(Map objectModel) {
  -        return (Response)objectModel.get(RESPONSE_OBJECT);
  -    }
  -
  -    public static final Context getContext(Map objectModel) {
  -        return (Context)objectModel.get(CONTEXT_OBJECT);
  -    }
  -}
  +/*
  +
  + ============================================================================
  +                   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.environment;
  +
  +import java.util.Map;
  +
  +/**
  + * A set of constants and methods to access the content of the object model.
  + * <p>
  + * The object model is a <code>Map</code> used to pass information about the
  + * calling environment to the sitemap and its components (matchers, actions,
  + * transformers, etc).
  + * <p>
  + * This class provides accessors only for the objects in the object model that are
  + * common to every environment and which can thus be used safely. Some environments
  + * provide additional objects, but they are not described here and accessing them
  + * should be done in due cause since this ties the application to that particular
  + * environment.
  + *
  + * @author <a href="mailto:[EMAIL PROTECTED]";>Sylvain Wallez</a>
  + * @version CVS $Id: ObjectModelHelper.java,v 1.5 2002/05/26 22:02:51 gianugo Exp $
  + */
  +
  +public final class ObjectModelHelper {
  +
  +    // FIXME : Constants copied from cocoon.Constants where they should be 
deprecated
  +    // LINK_OBJECT should also be moved to CommandLineEnvironment
  +
  +    /** Key for the environment {@link Request} in the object model. */
  +    public final static String REQUEST_OBJECT  = "request";
  +
  +    /** Key for the environment {@link Response} in the object model. */
  +    public final static String RESPONSE_OBJECT = "response";
  +
  +    /** Key for the environment {@link Context} in the object model. */
  +    public final static String CONTEXT_OBJECT  = "context";
  +
  +    /** Key for the environment {@link Context} in the object model. */
  +    public final static String EXPIRES_OBJECT  = "expires";
  +
  +    private ObjectModelHelper() {
  +        // Forbid instantiation
  +    }
  +
  +    public static final Request getRequest(Map objectModel) {
  +        return (Request)objectModel.get(REQUEST_OBJECT);
  +    }
  +
  +    public static final Response getResponse(Map objectModel) {
  +        return (Response)objectModel.get(RESPONSE_OBJECT);
  +    }
  +
  +    public static final Context getContext(Map objectModel) {
  +        return (Context)objectModel.get(CONTEXT_OBJECT);
  +    }
  +
  +    public static final Long getExpires(Map objectModel) {
  +        return (Long)objectModel.get(EXPIRES_OBJECT);
  +    }
  +}
  
  
  

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