1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17   * SOFTWARE.
18   */
19  
20  package com.liferay.portal.velocity;
21  
22  import com.liferay.portal.kernel.language.LanguageUtil;
23  import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
24  import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
25  import com.liferay.portal.kernel.servlet.ImageServletTokenUtil;
26  import com.liferay.portal.kernel.util.ArrayUtil;
27  import com.liferay.portal.kernel.util.ArrayUtil_IW;
28  import com.liferay.portal.kernel.util.DateFormats_IW;
29  import com.liferay.portal.kernel.util.DateUtil_IW;
30  import com.liferay.portal.kernel.util.GetterUtil;
31  import com.liferay.portal.kernel.util.GetterUtil_IW;
32  import com.liferay.portal.kernel.util.HtmlUtil;
33  import com.liferay.portal.kernel.util.HttpUtil;
34  import com.liferay.portal.kernel.util.JavaConstants;
35  import com.liferay.portal.kernel.util.LocaleUtil;
36  import com.liferay.portal.kernel.util.ParamUtil_IW;
37  import com.liferay.portal.kernel.util.Randomizer_IW;
38  import com.liferay.portal.kernel.util.StaticFieldGetter;
39  import com.liferay.portal.kernel.util.StringUtil_IW;
40  import com.liferay.portal.kernel.util.TimeZoneUtil_IW;
41  import com.liferay.portal.kernel.util.UnicodeFormatter_IW;
42  import com.liferay.portal.kernel.util.Validator;
43  import com.liferay.portal.kernel.util.Validator_IW;
44  import com.liferay.portal.kernel.velocity.VelocityContext;
45  import com.liferay.portal.kernel.xml.SAXReaderUtil;
46  import com.liferay.portal.model.Layout;
47  import com.liferay.portal.model.Theme;
48  import com.liferay.portal.service.permission.AccountPermissionUtil;
49  import com.liferay.portal.service.permission.CommonPermissionUtil;
50  import com.liferay.portal.service.permission.GroupPermissionUtil;
51  import com.liferay.portal.service.permission.LayoutPermissionUtil;
52  import com.liferay.portal.service.permission.OrganizationPermissionUtil;
53  import com.liferay.portal.service.permission.PasswordPolicyPermissionUtil;
54  import com.liferay.portal.service.permission.PortalPermissionUtil;
55  import com.liferay.portal.service.permission.PortletPermissionUtil;
56  import com.liferay.portal.service.permission.RolePermissionUtil;
57  import com.liferay.portal.service.permission.UserGroupPermissionUtil;
58  import com.liferay.portal.service.permission.UserPermissionUtil;
59  import com.liferay.portal.theme.NavItem;
60  import com.liferay.portal.theme.RequestVars;
61  import com.liferay.portal.theme.ThemeDisplay;
62  import com.liferay.portal.util.PortalUtil;
63  import com.liferay.portal.util.PrefsPropsUtil_IW;
64  import com.liferay.portal.util.PropsUtil_IW;
65  import com.liferay.portal.util.SessionClicks_IW;
66  import com.liferay.portal.util.WebKeys;
67  import com.liferay.portlet.PortletConfigImpl;
68  import com.liferay.portlet.PortletURLFactoryUtil;
69  import com.liferay.portlet.expando.service.ExpandoColumnLocalService;
70  import com.liferay.portlet.expando.service.ExpandoRowLocalService;
71  import com.liferay.portlet.expando.service.ExpandoTableLocalService;
72  import com.liferay.portlet.expando.service.ExpandoValueLocalService;
73  import com.liferay.portlet.journalcontent.util.JournalContentUtil;
74  import com.liferay.util.portlet.PortletRequestUtil;
75  
76  import java.util.List;
77  import java.util.Map;
78  
79  import javax.portlet.PortletRequest;
80  import javax.portlet.PortletResponse;
81  import javax.portlet.RenderRequest;
82  import javax.portlet.RenderResponse;
83  
84  import javax.servlet.http.HttpServletRequest;
85  
86  import org.apache.struts.taglib.tiles.ComponentConstants;
87  import org.apache.struts.tiles.ComponentContext;
88  import org.apache.velocity.tools.generic.DateTool;
89  import org.apache.velocity.tools.generic.EscapeTool;
90  import org.apache.velocity.tools.generic.IteratorTool;
91  import org.apache.velocity.tools.generic.ListTool;
92  import org.apache.velocity.tools.generic.MathTool;
93  import org.apache.velocity.tools.generic.NumberTool;
94  import org.apache.velocity.tools.generic.SortTool;
95  
96  /**
97   * <a href="VelocityVariables.java.html"><b><i>View Source</i></b></a>
98   *
99   * @author Brian Wing Shun Chan
100  * @author Raymond Augé
101  *
102  */
103 public class VelocityVariables {
104 
105     public static void insertHelperUtilities(
106         VelocityContext velocityContext, String[] restrictedVariables) {
107 
108         // Array util
109 
110         velocityContext.put("arrayUtil", ArrayUtil_IW.getInstance());
111 
112         // Browser sniffer
113 
114         velocityContext.put(
115             "browserSniffer", BrowserSnifferUtil.getBrowserSniffer());
116 
117         // Date formats
118 
119         velocityContext.put("dateFormats", DateFormats_IW.getInstance());
120 
121         // Date tool
122 
123         velocityContext.put("dateTool", new DateTool());
124 
125         // Date util
126 
127         velocityContext.put("dateUtil", DateUtil_IW.getInstance());
128 
129         // Escape tool
130 
131         velocityContext.put("escapeTool", new EscapeTool());
132 
133         // Expando column service
134 
135         ServiceLocator serviceLocator = ServiceLocator.getInstance();
136 
137         velocityContext.put(
138             "expandoColumnLocalService",
139             serviceLocator.findService(
140                 ExpandoColumnLocalService.class.getName()));
141 
142         // Expando row service
143 
144         velocityContext.put(
145             "expandoRowLocalService",
146             serviceLocator.findService(ExpandoRowLocalService.class.getName()));
147 
148         // Expando table service
149 
150         velocityContext.put(
151             "expandoTableLocalService",
152             serviceLocator.findService(
153                 ExpandoTableLocalService.class.getName()));
154 
155         // Expando value service
156 
157         velocityContext.put(
158             "expandoValueLocalService",
159             serviceLocator.findService(
160                 ExpandoValueLocalService.class.getName()));
161 
162         // Getter util
163 
164         velocityContext.put("getterUtil", GetterUtil_IW.getInstance());
165 
166         // Html util
167 
168         velocityContext.put("htmlUtil", HtmlUtil.getHtml());
169 
170         // Http util
171 
172         velocityContext.put("httpUtil", HttpUtil.getHttp());
173 
174         // Image servlet token
175 
176         velocityContext.put(
177             "imageToken", ImageServletTokenUtil.getImageServletToken());
178 
179         // Iterator tool
180 
181         velocityContext.put("iteratorTool", new IteratorTool());
182 
183         // Journal content util
184 
185         velocityContext.put(
186             "journalContentUtil", JournalContentUtil.getJournalContent());
187 
188         // Language util
189 
190         velocityContext.put("languageUtil", LanguageUtil.getLanguage());
191         velocityContext.put(
192             "unicodeLanguageUtil", UnicodeLanguageUtil.getUnicodeLanguage());
193 
194         // List tool
195 
196         velocityContext.put("listTool", new ListTool());
197 
198         // Locale util
199 
200         velocityContext.put("localeUtil", LocaleUtil.getInstance());
201 
202         // Math tool
203 
204         velocityContext.put("mathTool", new MathTool());
205 
206         // Number tool
207 
208         velocityContext.put("numberTool", new NumberTool());
209 
210         // Param util
211 
212         velocityContext.put("paramUtil", ParamUtil_IW.getInstance());
213 
214         // Portal util
215 
216         _insertHelperUtility(
217             velocityContext, restrictedVariables, "portalUtil",
218             PortalUtil.getPortal());
219         _insertHelperUtility(
220             velocityContext, restrictedVariables, "portal",
221             PortalUtil.getPortal());
222 
223         // Prefs props util
224 
225         _insertHelperUtility(
226             velocityContext, restrictedVariables, "prefsPropsUtil",
227             PrefsPropsUtil_IW.getInstance());
228 
229         // Props util
230 
231         _insertHelperUtility(
232             velocityContext, restrictedVariables, "propsUtil",
233             PropsUtil_IW.getInstance());
234 
235         // Portlet URL factory
236 
237         velocityContext.put(
238             "portletURLFactory", PortletURLFactoryUtil.getPortletURLFactory());
239 
240         // Portlet preferences
241 
242         _insertHelperUtility(
243             velocityContext, restrictedVariables, "velocityPortletPreferences",
244             new VelocityPortletPreferences());
245 
246         // Randomizer
247 
248         velocityContext.put(
249             "randomizer", Randomizer_IW.getInstance().getWrappedInstance());
250 
251         // SAX reader util
252 
253         UtilLocator utilLocator = UtilLocator.getInstance();
254 
255         velocityContext.put(
256             "saxReaderUtil",
257             utilLocator.findUtil(SAXReaderUtil.class.getName()));
258 
259         // Service locator
260 
261         _insertHelperUtility(
262             velocityContext, restrictedVariables, "serviceLocator",
263             serviceLocator);
264 
265         // Session clicks
266 
267         _insertHelperUtility(
268             velocityContext, restrictedVariables, "sessionClicks",
269             SessionClicks_IW.getInstance());
270 
271         // Sort tool
272 
273         velocityContext.put("sortTool", new SortTool());
274 
275         // Static field getter
276 
277         velocityContext.put(
278             "staticFieldGetter", StaticFieldGetter.getInstance());
279 
280         // String util
281 
282         velocityContext.put("stringUtil", StringUtil_IW.getInstance());
283 
284         // Time zone util
285 
286         velocityContext.put("timeZoneUtil", TimeZoneUtil_IW.getInstance());
287 
288         // Util locator
289 
290         _insertHelperUtility(
291             velocityContext, restrictedVariables, "utilLocator", utilLocator);
292 
293         // Unicode formatter
294 
295         velocityContext.put(
296             "unicodeFormatter", UnicodeFormatter_IW.getInstance());
297 
298         // Validator
299 
300         velocityContext.put("validator", Validator_IW.getInstance());
301 
302         // Permissions
303 
304         velocityContext.put(
305             "accountPermission", AccountPermissionUtil.getAccountPermission());
306         velocityContext.put(
307             "commonPermission", CommonPermissionUtil.getCommonPermission());
308         velocityContext.put(
309             "groupPermission", GroupPermissionUtil.getGroupPermission());
310         velocityContext.put(
311             "layoutPermission", LayoutPermissionUtil.getLayoutPermission());
312         velocityContext.put(
313             "organizationPermission",
314             OrganizationPermissionUtil.getOrganizationPermission());
315         velocityContext.put(
316             "passwordPolicyPermission",
317             PasswordPolicyPermissionUtil.getPasswordPolicyPermission());
318         velocityContext.put(
319             "portalPermission", PortalPermissionUtil.getPortalPermission());
320         velocityContext.put(
321             "portletPermission", PortletPermissionUtil.getPortletPermission());
322         velocityContext.put(
323             "rolePermission", RolePermissionUtil.getRolePermission());
324         velocityContext.put(
325             "userGroupPermission",
326             UserGroupPermissionUtil.getUserGroupPermission());
327         velocityContext.put(
328             "userPermission", UserPermissionUtil.getUserPermission());
329 
330         // Deprecated
331 
332         velocityContext.put(
333             "locationPermission",
334             OrganizationPermissionUtil.getOrganizationPermission());
335     }
336 
337     public static void insertVariables(
338         VelocityContext velocityContext, HttpServletRequest request) {
339 
340         // Request
341 
342         velocityContext.put("request", request);
343 
344         // Portlet config
345 
346         PortletConfigImpl portletConfigImpl =
347             (PortletConfigImpl)request.getAttribute(
348                 JavaConstants.JAVAX_PORTLET_CONFIG);
349 
350         if (portletConfigImpl != null) {
351             velocityContext.put("portletConfig", portletConfigImpl);
352         }
353 
354         // Render request
355 
356         PortletRequest portletRequest = (PortletRequest)request.getAttribute(
357             JavaConstants.JAVAX_PORTLET_REQUEST);
358 
359         if (portletRequest != null) {
360             if (portletRequest instanceof RenderRequest) {
361                 velocityContext.put("renderRequest", portletRequest);
362             }
363         }
364 
365         // Render response
366 
367         PortletResponse portletResponse = (PortletResponse)request.getAttribute(
368             JavaConstants.JAVAX_PORTLET_RESPONSE);
369 
370         if (portletResponse != null) {
371             if (portletResponse instanceof RenderResponse) {
372                 velocityContext.put("renderResponse", portletResponse);
373             }
374         }
375 
376         // XML request
377 
378         if ((portletRequest != null) && (portletResponse != null)) {
379             String xmlRequest = PortletRequestUtil.toXML(
380                 portletRequest, portletResponse);
381 
382             velocityContext.put("xmlRequest", xmlRequest);
383         }
384 
385         // Theme display
386 
387         ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
388             WebKeys.THEME_DISPLAY);
389 
390         if (themeDisplay != null) {
391             Theme theme = themeDisplay.getTheme();
392 
393             Layout layout = themeDisplay.getLayout();
394             List<Layout> layouts = themeDisplay.getLayouts();
395 
396             velocityContext.put("themeDisplay", themeDisplay);
397             velocityContext.put("company", themeDisplay.getCompany());
398             velocityContext.put("user", themeDisplay.getUser());
399             velocityContext.put("realUser", themeDisplay.getRealUser());
400             velocityContext.put("layout", layout);
401             velocityContext.put("layouts", layouts);
402             velocityContext.put("plid", String.valueOf(themeDisplay.getPlid()));
403             velocityContext.put(
404                 "layoutTypePortlet", themeDisplay.getLayoutTypePortlet());
405             velocityContext.put(
406                 "scopeGroupId", new Long(themeDisplay.getScopeGroupId()));
407             velocityContext.put(
408                 "permissionChecker", themeDisplay.getPermissionChecker());
409             velocityContext.put("locale", themeDisplay.getLocale());
410             velocityContext.put("timeZone", themeDisplay.getTimeZone());
411             velocityContext.put("theme", theme);
412             velocityContext.put("colorScheme", themeDisplay.getColorScheme());
413             velocityContext.put(
414                 "portletDisplay", themeDisplay.getPortletDisplay());
415 
416             // Navigation items
417 
418             if (layout != null) {
419                 RequestVars requestVars = new RequestVars(
420                     request, themeDisplay, layout.getAncestorPlid(),
421                     layout.getAncestorLayoutId());
422 
423                 List<NavItem> navItems = NavItem.fromLayouts(
424                     requestVars, layouts);
425 
426                 velocityContext.put("navItems", navItems);
427             }
428 
429             // Full css and templates path
430 
431             String servletContextName = GetterUtil.getString(
432                 theme.getServletContextName());
433 
434             velocityContext.put(
435                 "fullCssPath",
436                 servletContextName + theme.getVelocityResourceListener() +
437                     theme.getCssPath());
438 
439             velocityContext.put(
440                 "fullTemplatesPath",
441                 servletContextName + theme.getVelocityResourceListener() +
442                     theme.getTemplatesPath());
443 
444             // Init
445 
446             velocityContext.put(
447                 "init",
448                 themeDisplay.getPathContext() +
449                     VelocityResourceListener.SERVLET_SEPARATOR +
450                         "/html/themes/_unstyled/templates/init.vm");
451 
452             // Deprecated
453 
454             velocityContext.put(
455                 "portletGroupId", new Long(themeDisplay.getScopeGroupId()));
456         }
457 
458         // Tiles attributes
459 
460         String tilesTitle = _insertTilesVariables(
461             velocityContext, request, "tilesTitle", "title");
462         String tilesContent = _insertTilesVariables(
463             velocityContext, request, "tilesContent", "content");
464         boolean tilesSelectable = GetterUtil.getBoolean(_insertTilesVariables(
465             velocityContext, request, "tilesSelectable", "selectable"));
466 
467         if (themeDisplay != null) {
468             themeDisplay.setTilesTitle(tilesTitle);
469             themeDisplay.setTilesContent(tilesContent);
470             themeDisplay.setTilesSelectable(tilesSelectable);
471         }
472 
473         // Page title and subtitle
474 
475         velocityContext.put(
476             "pageTitle", request.getAttribute(WebKeys.PAGE_TITLE));
477         velocityContext.put(
478             "pageSubtitle", request.getAttribute(WebKeys.PAGE_SUBTITLE));
479 
480         // Insert custom vm variables
481 
482         Map<String, Object> vmVariables =
483             (Map<String, Object>)request.getAttribute(WebKeys.VM_VARIABLES);
484 
485         if (vmVariables != null) {
486             for (Map.Entry<String, Object> entry : vmVariables.entrySet()) {
487                 String key = entry.getKey();
488                 Object value = entry.getValue();
489 
490                 if (Validator.isNotNull(key)) {
491                     velocityContext.put(key, value);
492                 }
493             }
494         }
495     }
496 
497     private static void _insertHelperUtility(
498         VelocityContext velocityContext, String[] restrictedVariables,
499         String key, Object value) {
500 
501         if (!ArrayUtil.contains(restrictedVariables, key)) {
502             velocityContext.put(key, value);
503         }
504     }
505 
506     private static String _insertTilesVariables(
507         VelocityContext velocityContext, HttpServletRequest request,
508         String attributeId, String attributeName) {
509 
510         ComponentContext componentContext =
511             (ComponentContext)request.getAttribute(
512                 ComponentConstants.COMPONENT_CONTEXT);
513 
514         String value = null;
515 
516         if (componentContext != null) {
517             value = (String)componentContext.getAttribute(attributeName);
518 
519             if (value != null) {
520                 velocityContext.put(attributeId, value);
521             }
522         }
523 
524         return value;
525     }
526 
527 }