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 <map:pipeline> - - * @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 <map:pipeline> + + * @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]