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