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