1 package org.apache.turbine.modules.screens;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import org.apache.commons.lang.StringUtils;
20 import org.apache.commons.lang.exception.ExceptionUtils;
21
22 import org.apache.ecs.ConcreteElement;
23 import org.apache.ecs.StringElement;
24
25 import org.apache.velocity.context.Context;
26
27 import org.apache.turbine.Turbine;
28 import org.apache.turbine.TurbineConstants;
29 import org.apache.turbine.services.template.TurbineTemplate;
30 import org.apache.turbine.services.velocity.TurbineVelocity;
31 import org.apache.turbine.util.RunData;
32
33 /***
34 * Base Velocity Screen. The buildTemplate() assumes the template
35 * parameter has been set in the RunData object. This provides the
36 * ability to execute several templates from one Screen.
37 *
38 * <p>
39 *
40 * If you need more specific behavior in your application, extend this
41 * class and override the doBuildTemplate() method.
42 *
43 * @author <a href="mailto:mbryson@mont.mindspring.com">Dave Bryson</a>
44 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
45 * @version $Id: VelocityScreen.java 264148 2005-08-29 14:21:04Z henning $
46 */
47 public class VelocityScreen
48 extends TemplateScreen
49 {
50 /*** The prefix for lookup up screen pages */
51 private String prefix = TurbineConstants.SCREEN_PREFIX + "/";
52
53 /***
54 * Velocity Screens extending this class should overide this
55 * method to perform any particular business logic and add
56 * information to the context.
57 *
58 * @param data Turbine information.
59 * @param context Context for web pages.
60 * @exception Exception, a generic exception.
61 */
62 protected void doBuildTemplate(RunData data,
63 Context context)
64 throws Exception
65 {
66 }
67
68 /***
69 * Needs to be implemented to make TemplateScreen like us. The
70 * actual method that you should override is the one with the
71 * context in the parameter list.
72 *
73 * @param data Turbine information.
74 * @exception Exception, a generic exception.
75 */
76 protected void doBuildTemplate(RunData data)
77 throws Exception
78 {
79 doBuildTemplate(data, TurbineVelocity.getContext(data));
80 }
81
82 /***
83 * This builds the Velocity template.
84 *
85 * @param data Turbine information.
86 * @return A ConcreteElement.
87 * @exception Exception, a generic exception.
88 */
89 public ConcreteElement buildTemplate(RunData data)
90 throws Exception
91 {
92 String screenData = null;
93
94 Context context = TurbineVelocity.getContext(data);
95
96 String screenTemplate = data.getTemplateInfo().getScreenTemplate();
97 String templateName
98 = TurbineTemplate.getScreenTemplateName(screenTemplate);
99
100
101 if (StringUtils.isEmpty(templateName))
102 {
103 log.error("Screen " + screenTemplate + " not found!");
104 throw new Exception("Could not find screen for " + screenTemplate);
105 }
106
107 try
108 {
109
110
111 if (getLayout(data) == null)
112 {
113 TurbineVelocity.handleRequest(context,
114 prefix + templateName,
115 data.getResponse().getOutputStream());
116 }
117 else
118 {
119 screenData = TurbineVelocity
120 .handleRequest(context, prefix + templateName);
121 }
122 }
123 catch (Exception e)
124 {
125
126
127
128 context.put (TurbineConstants.PROCESSING_EXCEPTION_PLACEHOLDER, e.toString());
129 context.put (TurbineConstants.STACK_TRACE_PLACEHOLDER, ExceptionUtils.getStackTrace(e));
130
131 templateName = Turbine.getConfiguration()
132 .getString(TurbineConstants.TEMPLATE_ERROR_KEY,
133 TurbineConstants.TEMPLATE_ERROR_VM);
134
135 screenData = TurbineVelocity.handleRequest(
136 context, prefix + templateName);
137 }
138
139
140 StringElement output = new StringElement();
141 output.setFilterState(false);
142
143 if (screenData != null)
144 {
145 output.addElement(screenData);
146 }
147 return output;
148 }
149
150 /***
151 * Return the Context needed by Velocity.
152 *
153 * @param data Turbine information.
154 * @return A Context.
155 *
156 * @deprecated Use TurbineVelocity.getContext(data)
157 */
158 public static Context getContext(RunData data)
159 {
160 return TurbineVelocity.getContext(data);
161 }
162 }