1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.velocity;
24  
25  import com.liferay.portal.kernel.language.LanguageUtil;
26  import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
27  import com.liferay.portal.kernel.servlet.BrowserSniffer_IW;
28  import com.liferay.portal.kernel.servlet.ImageServletTokenUtil;
29  import com.liferay.portal.kernel.util.ArrayUtil;
30  import com.liferay.portal.kernel.util.ArrayUtil_IW;
31  import com.liferay.portal.kernel.util.DateUtil_IW;
32  import com.liferay.portal.kernel.util.GetterUtil;
33  import com.liferay.portal.kernel.util.GetterUtil_IW;
34  import com.liferay.portal.kernel.util.JavaConstants;
35  import com.liferay.portal.kernel.util.ParamUtil_IW;
36  import com.liferay.portal.kernel.util.Randomizer_IW;
37  import com.liferay.portal.kernel.util.StaticFieldGetter;
38  import com.liferay.portal.kernel.util.StringUtil_IW;
39  import com.liferay.portal.kernel.util.UnicodeFormatter_IW;
40  import com.liferay.portal.kernel.util.Validator;
41  import com.liferay.portal.kernel.util.Validator_IW;
42  import com.liferay.portal.model.Layout;
43  import com.liferay.portal.model.Theme;
44  import com.liferay.portal.service.permission.AccountPermissionUtil;
45  import com.liferay.portal.service.permission.CommonPermissionUtil;
46  import com.liferay.portal.service.permission.GroupPermissionUtil;
47  import com.liferay.portal.service.permission.LayoutPermissionUtil;
48  import com.liferay.portal.service.permission.OrganizationPermissionUtil;
49  import com.liferay.portal.service.permission.PasswordPolicyPermissionUtil;
50  import com.liferay.portal.service.permission.PortalPermissionUtil;
51  import com.liferay.portal.service.permission.PortletPermissionUtil;
52  import com.liferay.portal.service.permission.RolePermissionUtil;
53  import com.liferay.portal.service.permission.UserGroupPermissionUtil;
54  import com.liferay.portal.service.permission.UserPermissionUtil;
55  import com.liferay.portal.theme.NavItem;
56  import com.liferay.portal.theme.RequestVars;
57  import com.liferay.portal.theme.ThemeDisplay;
58  import com.liferay.portal.util.DateFormats_IW;
59  import com.liferay.portal.util.PortalUtil_IW;
60  import com.liferay.portal.util.PrefsPropsUtil_IW;
61  import com.liferay.portal.util.PropsUtil_IW;
62  import com.liferay.portal.util.ServiceLocator;
63  import com.liferay.portal.util.SessionClicks_IW;
64  import com.liferay.portal.util.WebKeys;
65  import com.liferay.portlet.PortletConfigImpl;
66  import com.liferay.portlet.PortletURLFactory;
67  import com.liferay.util.Html_IW;
68  import com.liferay.util.HttpUtil_IW;
69  
70  import java.util.Iterator;
71  import java.util.List;
72  import java.util.Map;
73  
74  import javax.portlet.PortletRequest;
75  import javax.portlet.PortletResponse;
76  import javax.portlet.RenderRequest;
77  import javax.portlet.RenderResponse;
78  
79  import javax.servlet.http.HttpServletRequest;
80  
81  import org.apache.struts.taglib.tiles.ComponentConstants;
82  import org.apache.struts.tiles.ComponentContext;
83  import org.apache.velocity.VelocityContext;
84  import org.apache.velocity.tools.generic.DateTool;
85  import org.apache.velocity.tools.generic.EscapeTool;
86  import org.apache.velocity.tools.generic.IteratorTool;
87  import org.apache.velocity.tools.generic.ListTool;
88  import org.apache.velocity.tools.generic.MathTool;
89  import org.apache.velocity.tools.generic.NumberTool;
90  import org.apache.velocity.tools.generic.SortTool;
91  
92  /**
93   * <a href="VelocityVariables.java.html"><b><i>View Source</i></b></a>
94   *
95   * @author Brian Wing Shun Chan
96   *
97   */
98  public class VelocityVariables {
99  
100     public static void insertHelperUtilities(
101         VelocityContext vc, String[] restrictedVariables) {
102 
103         // Array util
104 
105         vc.put("arrayUtil", ArrayUtil_IW.getInstance());
106 
107         // Browser sniffer
108 
109         vc.put("browserSniffer", BrowserSniffer_IW.getInstance());
110 
111         // Date formats
112 
113         vc.put("dateFormats", DateFormats_IW.getInstance());
114 
115         // Date tool
116 
117         vc.put("dateTool", new DateTool());
118 
119         // Date util
120 
121         vc.put("dateUtil", DateUtil_IW.getInstance());
122 
123         // Escape tool
124 
125         vc.put("escapeTool", new EscapeTool());
126 
127         // Getter util
128 
129         vc.put("getterUtil", GetterUtil_IW.getInstance());
130 
131         // Html util
132 
133         vc.put("htmlUtil", Html_IW.getInstance());
134 
135         // Http util
136 
137         vc.put("httpUtil", HttpUtil_IW.getInstance());
138 
139         // ImageServletToken
140 
141         vc.put("imageToken", ImageServletTokenUtil.getImageServletToken());
142 
143         // Iterator tool
144 
145         vc.put("iteratorTool", new IteratorTool());
146 
147         // Language util
148 
149         vc.put("languageUtil", LanguageUtil.getLanguage());
150         vc.put("unicodeLanguageUtil", UnicodeLanguageUtil.getUnicodeLanguage());
151 
152         // List tool
153 
154         vc.put("listTool", new ListTool());
155 
156         // Math tool
157 
158         vc.put("mathTool", new MathTool());
159 
160         // Number tool
161 
162         vc.put("numberTool", new NumberTool());
163 
164         // Param util
165 
166         vc.put("paramUtil", ParamUtil_IW.getInstance());
167 
168         // Portal util
169 
170         _insertHelperUtility(
171             vc, restrictedVariables, "portalUtil", PortalUtil_IW.getInstance());
172         _insertHelperUtility(
173             vc, restrictedVariables, "portal", PortalUtil_IW.getInstance());
174 
175         // Prefs props util
176 
177         _insertHelperUtility(
178             vc, restrictedVariables, "prefsPropsUtil",
179             PrefsPropsUtil_IW.getInstance());
180 
181         // Props util
182 
183         _insertHelperUtility(
184             vc, restrictedVariables, "propsUtil", PropsUtil_IW.getInstance());
185 
186         // Portlet URL factory
187 
188         vc.put("portletURLFactory", PortletURLFactory.getInstance());
189 
190         // Portlet preferences
191 
192         _insertHelperUtility(
193             vc, restrictedVariables, "velocityPortletPreferences",
194             new VelocityPortletPreferences());
195 
196         // Randomizer
197 
198         vc.put("randomizer", Randomizer_IW.getInstance().getWrappedInstance());
199 
200         // Service locator
201 
202         _insertHelperUtility(
203             vc, restrictedVariables, "serviceLocator",
204             ServiceLocator.getInstance());
205 
206         // Session clicks
207 
208         _insertHelperUtility(
209             vc, restrictedVariables, "sessionClicks",
210             SessionClicks_IW.getInstance());
211 
212         // Sort tool
213 
214         vc.put("sortTool", new SortTool());
215 
216         // Static field getter
217 
218         vc.put("staticFieldGetter", StaticFieldGetter.getInstance());
219 
220         // String util
221 
222         vc.put("stringUtil", StringUtil_IW.getInstance());
223 
224         // Unicode formatter
225 
226         vc.put("unicodeFormatter", UnicodeFormatter_IW.getInstance());
227 
228         // Validator
229 
230         vc.put("validator", Validator_IW.getInstance());
231 
232         // Permissions
233 
234         vc.put(
235             "accountPermission", AccountPermissionUtil.getAccountPermission());
236         vc.put("commonPermission", CommonPermissionUtil.getCommonPermission());
237         vc.put("groupPermission", GroupPermissionUtil.getGroupPermission());
238         vc.put("layoutPermission", LayoutPermissionUtil.getLayoutPermission());
239         vc.put(
240             "organizationPermission",
241             OrganizationPermissionUtil.getOrganizationPermission());
242         vc.put(
243             "passwordPolicyPermission",
244             PasswordPolicyPermissionUtil.getPasswordPolicyPermission());
245         vc.put("portalPermission", PortalPermissionUtil.getPortalPermission());
246         vc.put(
247             "portletPermission", PortletPermissionUtil.getPortletPermission());
248         vc.put("rolePermission", RolePermissionUtil.getRolePermission());
249         vc.put(
250             "userGroupPermission",
251             UserGroupPermissionUtil.getUserGroupPermission());
252         vc.put("userPermission", UserPermissionUtil.getUserPermission());
253 
254         // Deprecated permissions
255 
256         vc.put(
257             "locationPermission",
258             OrganizationPermissionUtil.getOrganizationPermission());
259     }
260 
261     public static void insertVariables(
262         VelocityContext vc, HttpServletRequest req) {
263 
264         // Request
265 
266         vc.put("request", req);
267 
268         // Portlet config
269 
270         PortletConfigImpl portletConfig = (PortletConfigImpl)req.getAttribute(
271             JavaConstants.JAVAX_PORTLET_CONFIG);
272 
273         if (portletConfig != null) {
274             vc.put("portletConfig", portletConfig);
275         }
276 
277         // Render request
278 
279         PortletRequest portletRequest = (PortletRequest)req.getAttribute(
280             JavaConstants.JAVAX_PORTLET_REQUEST);
281 
282         if (portletRequest != null) {
283             if (portletRequest instanceof RenderRequest) {
284                 vc.put("renderRequest", portletRequest);
285             }
286         }
287 
288         // Render response
289 
290         PortletResponse portletResponse = (PortletResponse)req.getAttribute(
291             JavaConstants.JAVAX_PORTLET_RESPONSE);
292 
293         if (portletResponse != null) {
294             if (portletResponse instanceof RenderResponse) {
295                 vc.put("renderResponse", portletResponse);
296             }
297         }
298 
299         // Theme display
300 
301         ThemeDisplay themeDisplay =
302             (ThemeDisplay)req.getAttribute(WebKeys.THEME_DISPLAY);
303 
304         if (themeDisplay != null) {
305             Theme theme = themeDisplay.getTheme();
306 
307             Layout layout = themeDisplay.getLayout();
308             List layouts = themeDisplay.getLayouts();
309 
310             vc.put("themeDisplay", themeDisplay);
311             vc.put("company", themeDisplay.getCompany());
312             vc.put("user", themeDisplay.getUser());
313             vc.put("realUser", themeDisplay.getRealUser());
314             vc.put("layout", layout);
315             vc.put("layouts", layouts);
316             vc.put("plid", String.valueOf(themeDisplay.getPlid()));
317             vc.put("layoutTypePortlet", themeDisplay.getLayoutTypePortlet());
318             vc.put(
319                 "portletGroupId", new Long(themeDisplay.getPortletGroupId()));
320             vc.put("permissionChecker", themeDisplay.getPermissionChecker());
321             vc.put("locale", themeDisplay.getLocale());
322             vc.put("timeZone", themeDisplay.getTimeZone());
323             vc.put("theme", theme);
324             vc.put("colorScheme", themeDisplay.getColorScheme());
325             vc.put("portletDisplay", themeDisplay.getPortletDisplay());
326 
327             // Navigation items
328 
329             if (layout != null) {
330                 RequestVars requestVars = new RequestVars(
331                     req, themeDisplay, layout.getAncestorPlid(),
332                     layout.getAncestorLayoutId());
333 
334                 List navItems = NavItem.fromLayouts(requestVars, layouts);
335 
336                 vc.put("navItems", navItems);
337             }
338 
339             // Full css and templates path
340 
341             String ctxName = GetterUtil.getString(
342                 theme.getServletContextName());
343 
344             vc.put(
345                 "fullCssPath",
346                 ctxName + theme.getVelocityResourceListener() +
347                     theme.getCssPath());
348 
349             vc.put(
350                 "fullTemplatesPath",
351                 ctxName + theme.getVelocityResourceListener() +
352                     theme.getTemplatesPath());
353 
354             // Init
355 
356             vc.put(
357                 "init",
358                 themeDisplay.getPathContext() +
359                     VelocityResourceListener.SERVLET_SEPARATOR +
360                         "/html/themes/_unstyled/templates/init.vm");
361         }
362 
363         // Tiles attributes
364 
365         String tilesTitle = _insertTilesVariables(
366             vc, req, "tilesTitle", "title");
367         String tilesContent = _insertTilesVariables(
368             vc, req, "tilesContent", "content");
369         boolean tilesSelectable = GetterUtil.getBoolean(_insertTilesVariables(
370             vc, req, "tilesSelectable", "selectable"));
371 
372         if (themeDisplay != null) {
373             themeDisplay.setTilesTitle(tilesTitle);
374             themeDisplay.setTilesContent(tilesContent);
375             themeDisplay.setTilesSelectable(tilesSelectable);
376         }
377 
378         // Page title and subtitle
379 
380         vc.put("pageTitle", req.getAttribute(WebKeys.PAGE_TITLE));
381         vc.put("pageSubtitle", req.getAttribute(WebKeys.PAGE_SUBTITLE));
382 
383         // Helper utilities
384 
385         insertHelperUtilities(vc, null);
386 
387         // Insert custom vm variables
388 
389         Map vmVariables = (Map)req.getAttribute(WebKeys.VM_VARIABLES);
390 
391         if (vmVariables != null) {
392             Iterator itr = vmVariables.entrySet().iterator();
393 
394             while (itr.hasNext()) {
395                 Map.Entry entry = (Map.Entry)itr.next();
396 
397                 String key = (String)entry.getKey();
398                 Object value = entry.getValue();
399 
400                 if (Validator.isNotNull(key)) {
401                     vc.put(key, value);
402                 }
403             }
404         }
405     }
406 
407     private static void _insertHelperUtility(
408         VelocityContext vc, String[] restrictedVariables, String key,
409         Object value) {
410 
411         if (!ArrayUtil.contains(restrictedVariables, key)) {
412             vc.put(key, value);
413         }
414     }
415 
416     private static String _insertTilesVariables(
417         VelocityContext vc, HttpServletRequest req, String attributeId,
418         String attributeName) {
419 
420         ComponentContext componentContext = (ComponentContext)req.getAttribute(
421             ComponentConstants.COMPONENT_CONTEXT);
422 
423         String value = null;
424 
425         if (componentContext != null) {
426             value = (String)componentContext.getAttribute(attributeName);
427 
428             if (value != null) {
429                 vc.put(attributeId, value);
430             }
431         }
432 
433         return value;
434     }
435 
436 }