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.flow.util;
018:
019: import java.io.IOException;
020: import java.io.InputStream;
021: import java.io.OutputStream;
022: import java.util.Map;
023:
024: import org.apache.avalon.framework.activity.Disposable;
025: import org.apache.avalon.framework.context.Context;
026: import org.apache.avalon.framework.context.ContextException;
027: import org.apache.avalon.framework.context.Contextualizable;
028: import org.apache.avalon.framework.service.ServiceException;
029: import org.apache.avalon.framework.service.ServiceManager;
030: import org.apache.avalon.framework.service.Serviceable;
031: import org.apache.cocoon.ProcessingException;
032: import org.apache.cocoon.components.ContextHelper;
033: import org.apache.cocoon.components.flow.FlowHelper;
034: import org.apache.cocoon.components.flow.javascript.JavaScriptFlowHelper;
035: import org.apache.cocoon.components.source.SourceUtil;
036: import org.apache.commons.io.IOUtils;
037: import org.apache.excalibur.source.Source;
038: import org.apache.excalibur.source.SourceResolver;
039: import org.w3c.dom.Document;
040: import org.xml.sax.ContentHandler;
041: import org.xml.sax.SAXException;
042:
043: /**
044: * Utility class to process a pipeline to various destinations.
045: * This class must be setup from the flowscript before being used. This means that instances must
046: * be created with <code>cocoon.createObject(Packages.org.apache.cocoon.components.flow.util.PipelineUtil);
047: *
048: * @author <a href="http://www.apache.org/~sylvain/">Sylvain Wallez</a>
049: * @version CVS $Id: PipelineUtil.java 454131 2006-10-08 11:42:14Z joerg $
050: */
051: public class PipelineUtil implements Contextualizable, Serviceable,
052: Disposable {
053:
054: private Context context;
055: private ServiceManager manager;
056: private SourceResolver resolver;
057:
058: /* (non-Javadoc)
059: * @see org.apache.avalon.framework.activity.Disposable#dispose()
060: */
061: public void dispose() {
062: if (this .manager != null) {
063: this .manager.release(this .resolver);
064: this .manager = null;
065: this .resolver = null;
066: }
067: }
068:
069: public void contextualize(Context context) throws ContextException {
070: this .context = context;
071:
072: }
073:
074: public void service(ServiceManager manager) throws ServiceException {
075: this .manager = manager;
076: this .resolver = (SourceResolver) manager
077: .lookup(SourceResolver.ROLE);
078: }
079:
080: /**
081: * Check that this object has been correctly set up.
082: *
083: * @throws IllegalStateException if not already set up.
084: */
085: private void checkSetup() {
086: if (this .manager == null) {
087: throw new IllegalStateException(
088: "Instances of "
089: + getClass().getName()
090: + " must be setup using either cocoon.createObject() or cocoon.setupObject().");
091: }
092: }
093:
094: /**
095: * Process a pipeline to a stream.
096: *
097: * @param uri the pipeline URI
098: * @param viewData the view data object
099: * @param output the stream where pipeline result is output. Note: this stream is not closed.
100: * @throws IOException
101: */
102: public void processToStream(String uri, Object viewData,
103: OutputStream output) throws IOException {
104: checkSetup();
105:
106: Map objectModel = ContextHelper.getObjectModel(this .context);
107:
108: // Keep the previous view data, if any (is it really necessary?), and set the new one
109: Object oldViewData = FlowHelper.getContextObject(objectModel);
110: FlowHelper.setContextObject(objectModel, JavaScriptFlowHelper
111: .unwrap(viewData));
112:
113: Source src = null;
114: InputStream input = null;
115: try {
116: src = this .resolver.resolveURI("cocoon:/" + uri);
117: input = src.getInputStream();
118: IOUtils.copy(input, output);
119: } finally {
120: if (input != null) {
121: try {
122: input.close();
123: } catch (IOException ignored) {
124: }
125: }
126:
127: // Restore the previous view data
128: FlowHelper.setContextObject(objectModel, oldViewData);
129:
130: if (src != null) {
131: this .resolver.release(src);
132: }
133: }
134: }
135:
136: /**
137: * Process a pipeline to a SAX <code>ContentHandler</code>
138: *
139: * @param uri the pipeline URI
140: * @param viewData the view data object
141: * @param handler where the pipeline should be streamed to.
142: */
143: public void processToSAX(String uri, Object viewData,
144: ContentHandler handler) throws SAXException, IOException,
145: ProcessingException {
146: checkSetup();
147:
148: Map objectModel = ContextHelper.getObjectModel(this .context);
149: Object oldViewData = FlowHelper.getContextObject(objectModel);
150: FlowHelper.setContextObject(objectModel, JavaScriptFlowHelper
151: .unwrap(viewData));
152:
153: Source src = null;
154: try {
155: src = this .resolver.resolveURI("cocoon:/" + uri);
156: SourceUtil.toSAX(src, handler);
157: } finally {
158: FlowHelper.setContextObject(objectModel, oldViewData);
159: if (src != null) {
160: this .resolver.release(src);
161: }
162: }
163: }
164:
165: /**
166: * Process a pipeline and gets is result as a DOM <code>Document</code>
167: *
168: * @param uri the pipeline URI
169: * @param viewData the view data object
170: * @return the document
171: */
172: public Document processToDOM(String uri, Object viewData)
173: throws ProcessingException, SAXException, IOException {
174: checkSetup();
175:
176: Map objectModel = ContextHelper.getObjectModel(this .context);
177: Object oldViewData = FlowHelper.getContextObject(objectModel);
178: FlowHelper.setContextObject(objectModel, JavaScriptFlowHelper
179: .unwrap(viewData));
180:
181: Source src = null;
182:
183: try {
184: src = this .resolver.resolveURI("cocoon:/" + uri);
185: return SourceUtil.toDOM(src);
186: } finally {
187: FlowHelper.setContextObject(objectModel, oldViewData);
188: if (src != null) {
189: this.resolver.release(src);
190: }
191: }
192: }
193: }
|