1
22
23 package com.liferay.taglib.util;
24
25 import com.liferay.portal.kernel.log.Log;
26 import com.liferay.portal.kernel.log.LogFactoryUtil;
27 import com.liferay.portal.kernel.servlet.StringServletResponse;
28 import com.liferay.portal.kernel.util.GetterUtil;
29 import com.liferay.portal.kernel.util.StringPool;
30 import com.liferay.portal.kernel.velocity.VelocityContext;
31 import com.liferay.portal.kernel.velocity.VelocityEngineUtil;
32 import com.liferay.portal.model.Theme;
33 import com.liferay.portal.theme.ThemeDisplay;
34 import com.liferay.portal.util.WebKeys;
35 import com.liferay.portal.velocity.VelocityContextPool;
36 import com.liferay.portal.velocity.VelocityVariables;
37
38 import java.io.StringWriter;
39
40 import javax.servlet.RequestDispatcher;
41 import javax.servlet.ServletContext;
42 import javax.servlet.http.HttpServletRequest;
43 import javax.servlet.http.HttpServletResponse;
44 import javax.servlet.jsp.PageContext;
45
46 import org.apache.struts.taglib.tiles.ComponentConstants;
47 import org.apache.struts.tiles.ComponentContext;
48
49
56 public class ThemeUtil {
57
58 public static void include(
59 ServletContext servletContext, HttpServletRequest request,
60 HttpServletResponse response, PageContext pageContext, String page,
61 Theme theme)
62 throws Exception {
63
64 String extension = theme.getTemplateExtension();
65
66 if (extension.equals("vm")) {
67 includeVM(servletContext, request, pageContext, page, theme, true);
68 }
69 else {
70 String path =
71 theme.getTemplatesPath() + StringPool.SLASH + page;
72
73 includeJSP(servletContext, request, response, path, theme);
74 }
75 }
76
77 public static void includeJSP(
78 ServletContext servletContext, HttpServletRequest request,
79 HttpServletResponse response, String path, Theme theme)
80 throws Exception {
81
82 String tilesTitle = _getTilesVariables(request, "title");
83 String tilesContent = _getTilesVariables(request, "content");
84 boolean tilesSelectable = GetterUtil.getBoolean(
85 _getTilesVariables(request, "selectable"));
86
87 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
88 WebKeys.THEME_DISPLAY);
89
90 themeDisplay.setTilesTitle(tilesTitle);
91 themeDisplay.setTilesContent(tilesContent);
92 themeDisplay.setTilesSelectable(tilesSelectable);
93
94 if (theme.isWARFile()) {
95 ServletContext themeServletContext = servletContext.getContext(
96 theme.getContextPath());
97
98 if (themeServletContext == null) {
99 _log.error(
100 "Theme " + theme.getThemeId() + " cannot find its " +
101 "servlet context at " + theme.getServletContextName());
102 }
103 else {
104 RequestDispatcher requestDispatcher =
105 themeServletContext.getRequestDispatcher(path);
106
107 if (requestDispatcher == null) {
108 _log.error(
109 "Theme " + theme.getThemeId() + " does not have " +
110 path);
111 }
112 else {
113 requestDispatcher.include(request, response);
114 }
115 }
116 }
117 else {
118 RequestDispatcher requestDispatcher =
119 servletContext.getRequestDispatcher(path);
120
121 if (requestDispatcher == null) {
122 _log.error(
123 "Theme " + theme.getThemeId() + " does not have " + path);
124 }
125 else {
126 requestDispatcher.include(request, response);
127 }
128 }
129 }
130
131 public static String includeVM(
132 ServletContext servletContext, HttpServletRequest request,
133 PageContext pageContext, String page, Theme theme, boolean write)
134 throws Exception {
135
136
142 String ctxName = GetterUtil.getString(theme.getServletContextName());
143
144 if (VelocityContextPool.get(ctxName) == null) {
145
146
149 VelocityContextPool.put(ctxName, servletContext);
150 }
151
152 int pos = page.lastIndexOf(StringPool.PERIOD);
153
154 StringBuilder sb = new StringBuilder();
155
156 sb.append(ctxName);
157 sb.append(theme.getVelocityResourceListener());
158 sb.append(theme.getTemplatesPath());
159 sb.append(StringPool.SLASH);
160 sb.append(page.substring(0, pos));
161 sb.append(".vm");
162
163 String source = sb.toString();
164
165 if (!VelocityEngineUtil.resourceExists(source)) {
166 _log.error(source + " does not exist");
167
168 return null;
169 }
170
171 StringWriter stringWriter = new StringWriter();
172
173 VelocityContext velocityContext =
174 VelocityEngineUtil.getWrappedStandardToolsContext();
175
176
178 VelocityVariables.insertVariables(velocityContext, request);
179
180
182 ServletContext themeServletContext = VelocityContextPool.get(ctxName);
183
184
186 StringServletResponse stringResponse = new StringServletResponse(
187 (HttpServletResponse)pageContext.getResponse());
188
189 VelocityTaglib velocityTaglib = new VelocityTaglib(
190 servletContext, request, stringResponse, pageContext);
191
192 request.setAttribute(WebKeys.VELOCITY_TAGLIB, velocityTaglib);
193
194 velocityContext.put("themeServletContext", themeServletContext);
195 velocityContext.put("taglibLiferay", velocityTaglib);
196 velocityContext.put("theme", velocityTaglib);
197
198
200 VelocityEngineUtil.mergeTemplate(source, velocityContext, stringWriter);
201
202
204 String output = stringWriter.toString();
205
206 if (write) {
207 pageContext.getOut().print(output);
208
209 return null;
210 }
211 else {
212 return output;
213 }
214 }
215
216 private static String _getTilesVariables(
217 HttpServletRequest request, String attributeName) {
218
219 ComponentContext componentContext =
220 (ComponentContext)request.getAttribute(
221 ComponentConstants.COMPONENT_CONTEXT);
222
223 String value = null;
224
225 if (componentContext != null) {
226 value = (String)componentContext.getAttribute(attributeName);
227 }
228
229 return value;
230 }
231
232 private static Log _log = LogFactoryUtil.getLog(ThemeUtil.class);
233
234 }