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.java;
018:
019: import org.apache.avalon.framework.CascadingRuntimeException;
020: import org.apache.avalon.framework.logger.Logger;
021: import org.apache.avalon.framework.parameters.Parameters;
022: import org.apache.cocoon.components.ContextHelper;
023: import org.apache.cocoon.components.flow.FlowHelper;
024: import org.apache.cocoon.components.flow.util.PipelineUtil;
025: import org.apache.cocoon.environment.Request;
026: import org.apache.excalibur.source.SourceUtil;
027:
028: import java.io.OutputStream;
029: import java.util.Map;
030:
031: /**
032: * Abstract class to add basic methods for flow handling.
033: *
034: * @author <a href="mailto:tcurdt@apache.org">Torsten Curdt</a>
035: * @author <a href="mailto:stephan@apache.org">Stephan Michels</a>
036: * @version CVS $Id: AbstractContinuable.java 433543 2006-08-22 06:22:54Z crossley $
037: */
038: public abstract class AbstractContinuable implements Continuable {
039:
040: private ContinuationContext getContext() {
041: if (Continuation.currentContinuation() == null)
042: throw new IllegalStateException(
043: "No continuation is running");
044: return (ContinuationContext) Continuation.currentContinuation()
045: .getContext();
046: }
047:
048: public Logger getLogger() {
049: return getContext().getLogger();
050: }
051:
052: public void sendPageAndWait(String uri) {
053: sendPageAndWait(uri, new VarMap());
054: }
055:
056: public void sendPageAndWait(String uri, Object bizdata) {
057:
058: ContinuationContext context = getContext();
059:
060: if (context.getLogger() != null)
061: context.getLogger().debug(
062: "send page and wait '" + uri + "'");
063:
064: FlowHelper.setContextObject(ContextHelper
065: .getObjectModel(context.getAvalonContext()), bizdata);
066:
067: if (SourceUtil.indexOfSchemeColon(uri) == -1) {
068: uri = "cocoon:/" + uri;
069: if (getContext().getRedirector().hasRedirected()) {
070: throw new IllegalStateException(
071: "Pipeline has already been processed for this request");
072: }
073: try {
074: context.getRedirector().redirect(false, uri);
075: } catch (Exception e) {
076: throw new CascadingRuntimeException(
077: "Cannot redirect to '" + uri + "'", e);
078: }
079: } else {
080: throw new IllegalArgumentException(
081: "uri is not allowed to contain a scheme (cocoon:/ is always automatically used)");
082: }
083:
084: Continuation.suspend();
085: }
086:
087: public void sendPage(String uri) {
088: sendPage(uri, new VarMap());
089: }
090:
091: public void sendPage(String uri, Object bizdata) {
092:
093: ContinuationContext context = getContext();
094:
095: if (context.getLogger() != null)
096: context.getLogger().debug("send page '" + uri + "'");
097:
098: FlowHelper.setContextObject(ContextHelper
099: .getObjectModel(context.getAvalonContext()), bizdata);
100:
101: if (SourceUtil.indexOfSchemeColon(uri) == -1) {
102: uri = "cocoon:/" + uri;
103: if (getContext().getRedirector().hasRedirected()) {
104: throw new IllegalStateException(
105: "Pipeline has already been processed for this request");
106: }
107: try {
108: context.getRedirector().redirect(false, uri);
109: } catch (Exception e) {
110: throw new CascadingRuntimeException(
111: "Cannot redirect to '" + uri + "'", e);
112: }
113: } else {
114: throw new IllegalArgumentException(
115: "uri is not allowed to contain a scheme (cocoon:/ is always automatically used)");
116: }
117: }
118:
119: public Request getRequest() {
120: return ContextHelper
121: .getRequest(getContext().getAvalonContext());
122: }
123:
124: public Map getObjectModel() {
125: return ContextHelper.getObjectModel(getContext()
126: .getAvalonContext());
127: }
128:
129: public Parameters getParameters() {
130: return getContext().getParameters();
131: }
132:
133: public void processPipelineTo(String uri, Object bizdata,
134: OutputStream out) {
135:
136: ContinuationContext context = getContext();
137:
138: PipelineUtil pipeUtil = new PipelineUtil();
139: try {
140: pipeUtil.contextualize(context.getAvalonContext());
141: pipeUtil.service(context.getServiceManager());
142: pipeUtil.processToStream(uri, bizdata, out);
143: } catch (Exception e) {
144: throw new CascadingRuntimeException(
145: "Cannot process pipeline to '" + uri + "'", e);
146: } finally {
147: pipeUtil.dispose();
148: }
149: }
150:
151: public void redirectTo(String uri) {
152: try {
153: getContext().getRedirector().redirect(false, uri);
154: } catch (Exception e) {
155: throw new CascadingRuntimeException("Cannot redirect to '"
156: + uri + "'", e);
157: }
158: }
159:
160: public void sendStatus(int sc) {
161: getContext().getRedirector().sendStatus(sc);
162: }
163:
164: /**
165: * Access components.
166: */
167: public Object getComponent(String id) {
168: try {
169: return getContext().getServiceManager().lookup(id);
170: } catch (Exception e) {
171: throw new CascadingRuntimeException(
172: "Cannot lookup component '" + id + "'", e);
173: }
174: }
175:
176: /**
177: * Release pooled components.
178: *
179: * @param component a component
180: */
181: public void releaseComponent(Object component) {
182: if (component != null) {
183: getContext().getServiceManager().release(component);
184: }
185: }
186: }
|