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]