001: package org.apache.turbine.modules.screens;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import org.apache.commons.lang.StringUtils;
023: import org.apache.commons.lang.exception.ExceptionUtils;
024:
025: import org.apache.ecs.ConcreteElement;
026: import org.apache.ecs.StringElement;
027:
028: import org.apache.velocity.context.Context;
029:
030: import org.apache.turbine.Turbine;
031: import org.apache.turbine.TurbineConstants;
032: import org.apache.turbine.services.template.TurbineTemplate;
033: import org.apache.turbine.services.velocity.TurbineVelocity;
034: import org.apache.turbine.util.RunData;
035:
036: /**
037: * Base Velocity Screen. The buildTemplate() assumes the template
038: * parameter has been set in the RunData object. This provides the
039: * ability to execute several templates from one Screen.
040: *
041: * <p>
042: *
043: * If you need more specific behavior in your application, extend this
044: * class and override the doBuildTemplate() method.
045: *
046: * @author <a href="mailto:mbryson@mont.mindspring.com">Dave Bryson</a>
047: * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
048: * @version $Id: VelocityScreen.java 534527 2007-05-02 16:10:59Z tv $
049: */
050: public class VelocityScreen extends TemplateScreen {
051: /** The prefix for lookup up screen pages */
052: private String prefix = TurbineConstants.SCREEN_PREFIX + "/";
053:
054: /**
055: * Velocity Screens extending this class should overide this
056: * method to perform any particular business logic and add
057: * information to the context.
058: *
059: * @param data Turbine information.
060: * @param context Context for web pages.
061: * @exception Exception, a generic exception.
062: */
063: protected void doBuildTemplate(RunData data, Context context)
064: throws Exception {
065: }
066:
067: /**
068: * Needs to be implemented to make TemplateScreen like us. The
069: * actual method that you should override is the one with the
070: * context in the parameter list.
071: *
072: * @param data Turbine information.
073: * @exception Exception, a generic exception.
074: */
075: protected void doBuildTemplate(RunData data) throws Exception {
076: doBuildTemplate(data, TurbineVelocity.getContext(data));
077: }
078:
079: /**
080: * This builds the Velocity template.
081: *
082: * @param data Turbine information.
083: * @return A ConcreteElement.
084: * @exception Exception, a generic exception.
085: */
086: public ConcreteElement buildTemplate(RunData data) throws Exception {
087: String screenData = null;
088:
089: Context context = TurbineVelocity.getContext(data);
090:
091: String screenTemplate = data.getTemplateInfo()
092: .getScreenTemplate();
093: String templateName = TurbineTemplate
094: .getScreenTemplateName(screenTemplate);
095:
096: // The Template Service could not find the Screen
097: if (StringUtils.isEmpty(templateName)) {
098: log.error("Screen " + screenTemplate + " not found!");
099: throw new Exception("Could not find screen for "
100: + screenTemplate);
101: }
102:
103: try {
104: // if a layout has been defined return the results, otherwise
105: // send the results directly to the output stream.
106: if (getLayout(data) == null) {
107: TurbineVelocity.handleRequest(context, prefix
108: + templateName, data.getResponse()
109: .getOutputStream());
110: } else {
111: screenData = TurbineVelocity.handleRequest(context,
112: prefix + templateName);
113: }
114: } catch (Exception e) {
115: // If there is an error, build a $processingException and
116: // attempt to call the error.vm template in the screens
117: // directory.
118: context.put(
119: TurbineConstants.PROCESSING_EXCEPTION_PLACEHOLDER,
120: e.toString());
121: context.put(TurbineConstants.STACK_TRACE_PLACEHOLDER,
122: ExceptionUtils.getStackTrace(e));
123:
124: templateName = Turbine.getConfiguration().getString(
125: TurbineConstants.TEMPLATE_ERROR_KEY,
126: TurbineConstants.TEMPLATE_ERROR_VM);
127:
128: screenData = TurbineVelocity.handleRequest(context, prefix
129: + templateName);
130: }
131:
132: // package the response in an ECS element
133: StringElement output = new StringElement();
134: output.setFilterState(false);
135:
136: if (screenData != null) {
137: output.addElement(screenData);
138: }
139: return output;
140: }
141:
142: /**
143: * Return the Context needed by Velocity.
144: *
145: * @param data Turbine information.
146: * @return A Context.
147: *
148: * @deprecated Use TurbineVelocity.getContext(data)
149: */
150: public static Context getContext(RunData data) {
151: return TurbineVelocity.getContext(data);
152: }
153: }
|