001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.cocoon.components.treeprocessor.sitemap;
018:
019: import org.apache.avalon.framework.activity.Disposable;
020: import org.apache.avalon.framework.component.ComponentManager;
021: import org.apache.avalon.framework.component.Composable;
022: import org.apache.avalon.framework.logger.Logger;
023:
024: import org.apache.cocoon.ConnectionResetException;
025: import org.apache.cocoon.components.treeprocessor.InvokeContext;
026: import org.apache.cocoon.components.treeprocessor.ProcessingNode;
027: import org.apache.cocoon.components.treeprocessor.SimpleParentProcessingNode;
028: import org.apache.cocoon.environment.Environment;
029:
030: /**
031: * Handles <map:pipelines>
032: *
033: * @author <a href="mailto:juergen.seitz@basf-it-services.com">Jürgen Seitz</a>
034: * @author <a href="mailto:bluetkemeier@s-und-n.de">Björn Lütkemeier</a>
035: * @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
036: * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
037: * @version $Id: PipelinesNode.java 433543 2006-08-22 06:22:54Z crossley $
038: */
039: public final class PipelinesNode extends SimpleParentProcessingNode
040: implements Composable, Disposable {
041:
042: private ComponentManager manager;
043:
044: private ErrorHandlerHelper errorHandlerHelper;
045:
046: public PipelinesNode() {
047: this .errorHandlerHelper = new ErrorHandlerHelper();
048: }
049:
050: /**
051: * Keep the component manager used everywhere in the tree so that we can
052: * cleanly dispose it.
053: */
054: public void compose(ComponentManager manager) {
055: this .manager = manager;
056: this .errorHandlerHelper.compose(manager);
057: }
058:
059: public void enableLogging(Logger logger) {
060: super .enableLogging(logger);
061: this .errorHandlerHelper.enableLogging(logger);
062: }
063:
064: public void setErrorHandler(ProcessingNode node) {
065: this .errorHandlerHelper.set500Handler(node);
066: }
067:
068: public void setChildren(ProcessingNode[] nodes) {
069: // Mark the last pipeline so that it can throw a ResourceNotFoundException
070: ((PipelineNode) nodes[nodes.length - 1]).setLast(true);
071: super .setChildren(nodes);
072: }
073:
074: /**
075: * Process the environment. Also adds a <code>SourceResolver</code>
076: * and a <code>Redirector</code> in the object model. The previous resolver and
077: * redirector, if any, are restored before return.
078: */
079: public final boolean invoke(Environment env, InvokeContext context)
080: throws Exception {
081:
082: // Perform any common invoke functionality
083: super .invoke(env, context);
084:
085: // Recompose context (and pipelines) to the local component manager
086: context.recompose(this .manager);
087:
088: try {
089: // FIXME: Is there any useful information that can be passed as top-level parameters,
090: // such as the URI of the mount point ?
091:
092: return invokeNodes(this .children, env, context);
093:
094: } catch (ConnectionResetException e) {
095: // Will be reported by CocoonServlet, rethrowing
096: throw e;
097: } catch (Exception ex) {
098: // Invoke pipelines handler
099: return this .errorHandlerHelper.invokeErrorHandler(ex, env,
100: context);
101: }
102: }
103:
104: /**
105: * Dispose the component manager.
106: */
107: public void dispose() {
108: if (this .manager instanceof Disposable) {
109: ((Disposable) this.manager).dispose();
110: }
111: this.manager = null;
112: }
113: }
|