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 <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; - } - -} +/* + ============================================================================ + 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.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]