All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opencms.jsp.util.CmsJspElFunctions Maven / Gradle / Ivy

Go to download

OpenCms is an enterprise-ready, easy to use website content management system based on Java and XML technology. Offering a complete set of features, OpenCms helps content managers worldwide to create and maintain beautiful websites fast and efficiently.

There is a newer version: 18.0
Show newest version
/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * For further information about Alkacon Software, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.opencms.jsp.util;

import org.opencms.file.CmsObject;
import org.opencms.file.CmsResource;
import org.opencms.file.types.CmsResourceTypeFolderSubSitemap;
import org.opencms.flex.CmsFlexController;
import org.opencms.i18n.CmsLocaleManager;
import org.opencms.i18n.CmsMessages;
import org.opencms.json.JSONObject;
import org.opencms.jsp.CmsJspResourceWrapper;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.module.CmsModule;
import org.opencms.util.CmsHtml2TextConverter;
import org.opencms.util.CmsHtmlConverter;
import org.opencms.util.CmsRequestUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.PageContext;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;

import com.google.common.collect.Maps;

/**
 * Provides utility methods to be used as functions from a JSP with the EL.

* * @since 7.0.2 * * @see CmsJspContentAccessBean */ public final class CmsJspElFunctions { /** Logger instance for this class. */ private static final Log LOG = CmsLog.getLog(CmsJspElFunctions.class); /** * Hide the public constructor.

*/ private CmsJspElFunctions() { // NOOP } /** * Extends the given list by adding the provided object.

* * @param list the list to extend * @param value the value to add to the list */ public static void addToList(List list, Object value) { list.add(value); } /** * Returns an OpenCms user context created from an Object.

* *

    *
  • If the input is already a {@link CmsObject}, it is casted and returned unchanged. *
  • If the input is a {@link ServletRequest}, the OpenCms user context is read from the request context. *
  • If the input is a {@link PageContext}, the OpenCms user context is read from the request of the page context. *
  • Otherwise the input is converted to a String which should be a user name, and creation of a OpenCms * user context with this name is attempted. Please note that this will only work if the user name is * either the "Guest" user or the "Export" user. *
  • If no valid OpenCms user context could be created with all of the above, then a new user context for * the "Guest" user is created. *
* * @param input the input to create an OpenCms user context from * * @return an OpenCms user context created from an Object */ public static CmsObject convertCmsObject(Object input) { CmsObject result; if (input instanceof CmsObject) { result = (CmsObject)input; } else if (input instanceof ServletRequest) { result = CmsFlexController.getCmsObject((ServletRequest)input); } else if (input instanceof PageContext) { result = CmsFlexController.getCmsObject(((PageContext)input).getRequest()); } else { try { // try to use the given name as user name result = OpenCms.initCmsObject(String.valueOf(input)); // try to set the right site root ServletRequest req = convertRequest(input); if (req instanceof HttpServletRequest) { result.getRequestContext().setSiteRoot( OpenCms.getSiteManager().matchRequest((HttpServletRequest)req).getSiteRoot()); } } catch (CmsException e) { LOG.warn(e.getLocalizedMessage(), e); result = null; } } if (result == null) { try { result = OpenCms.initCmsObject(OpenCms.getDefaultUsers().getUserGuest()); // try to set the right site root ServletRequest req = convertRequest(input); if (req instanceof HttpServletRequest) { result.getRequestContext().setSiteRoot( OpenCms.getSiteManager().matchRequest((HttpServletRequest)req).getSiteRoot()); } } catch (CmsException e1) { // this should never fail since we can always create a "Guest" user } } return result; } /** * Returns a Date created from an Object.

* *

    *
  • The Object is first checked if it is a {@link Date} already, if so it is casted and returned unchanged. *
  • If not, the input is checked if it is a {@link Long}, and if so the Date is created from the Long value. *
  • If it's not a Date and not a Long, the Object is transformed to a String and then it's tried * to parse a Long out of the String. *
  • If this fails, it is tried to parse as a Date using the * default date formatting. *
  • If this also fails, a new Date is returned that has been initialized with 0.

    *

* * @param input the Object to create a Date from * * @return a Date created from the given Object */ public static Date convertDate(Object input) { Date result; if (input instanceof Date) { result = (Date)input; } else if (input instanceof Long) { result = new Date(((Long)input).longValue()); } else { String str = String.valueOf(input); try { // treat the input as a String long l = Long.parseLong(str); result = new Date(l); } catch (NumberFormatException e) { try { // try to parse String as a Date result = DateFormat.getDateInstance().parse(str); } catch (ParseException e1) { result = null; } if (result == null) { // use default date if parsing fails result = new Date(0); } } } return result; } /** * Returns a list of attribute values specified by the attribute name of the items of the given list.

* * @param input the list of objects to obtain the attribute values from * @param attributeName the name of the attribute to obtain * @return a list of attributes specified by the attribute name of the items of the given list */ public static List convertList(List input, String attributeName) { List result = new ArrayList(input.size()); for (Object item : input) { try { result.add(PropertyUtils.getProperty(item, attributeName)); } catch (Exception e) { // specified attribute is not implemented, return empty list return Collections.emptyList(); } } return result; } /** * Returns a Locale created from an Object.

* *

    *
  • The Object is first checked if it is a {@link Locale} already, if so it is casted and returned. *
  • If not, the input is transformed to a String and then a Locale lookup with this String is done. *
  • If the locale lookup fails, the OpenCms default locale is returned. *
* * @param input the Object to create a Locale from * * @return a Locale created from the given Object */ public static Locale convertLocale(Object input) { Locale locale; if (input instanceof Locale) { locale = (Locale)input; } else { locale = CmsLocaleManager.getLocale(String.valueOf(input)); } return locale; } /** * Tries to convert the given input object into a request.

* * This is only possible if the input object is already a request * or if it is a page context.

* * If everything else, this method returns null.

* * @param input the input object to convert to a request * * @return a request object, or null */ public static ServletRequest convertRequest(Object input) { ServletRequest req = null; if (input instanceof ServletRequest) { req = (ServletRequest)input; } else if (input instanceof PageContext) { req = ((PageContext)input).getRequest(); } return req; } /** * Returns a resource created from an Object.

* *

    *
  • If the input is already a {@link CmsResource}, it is casted to the resource and returned unchanged. *
  • If the input is a String, the given OpenCms context is used to read a resource with this name from the VFS. *
  • If the input is a {@link CmsUUID}, the given OpenCms context is used to read a resource with * this UUID from the VFS. *
  • Otherwise the input is converted to a String, and then the given OpenCms context is used to read * a resource with this name from the VFS. *
* * @param cms the current OpenCms user context * @param input the input to create a resource from * * @return a resource created from the given Object * * @throws CmsException in case of errors accessing the OpenCms VFS for reading the resource */ public static CmsResource convertResource(CmsObject cms, Object input) throws CmsException { CmsResource result; if (input instanceof String) { // input is a String result = cms.readResource((String)input); } else if (input instanceof CmsResource) { // input is already a resource result = (CmsResource)input; } else if (input instanceof CmsUUID) { // input is a UUID result = cms.readResource((CmsUUID)input); } else { // input seems not really to make sense, try to use it like a String result = cms.readResource(String.valueOf(input)); } return new CmsJspResourceWrapper(cms, result); } /** * Returns a CmsUUID created from an Object.

* *

    *
  • The Object is first checked if it is a {@link CmsUUID} already, if so it is casted and returned. *
  • If not, the input is transformed to a byte[] and a new {@link CmsUUID} is created with this byte[]. *
  • Otherwise the input is casted to a String and a new {@link CmsUUID} is created with this String. *
* * @param input the Object to create a CmsUUID from * * @return a CmsUUID created from the given Object */ public static CmsUUID convertUUID(Object input) { CmsUUID uuid; if (input instanceof CmsUUID) { uuid = (CmsUUID)input; } else if (input instanceof byte[]) { uuid = new CmsUUID((byte[])input); } else { uuid = new CmsUUID(String.valueOf(input)); } return uuid; } /** * Returns a newly created, empty List object.

* * There is no way to create an empty list using standard JSTL methods, * hence this function.

* * @return a newly created, empty List object */ public static List createList() { return new ArrayList(); } /** * Returns the current OpenCms user context from the given page context.

* * @param input the input to create a CmsObject from * * @return the current OpenCms user context from the given page context */ public static CmsObject getCmsObject(Object input) { return convertCmsObject(input); } /** * Returns the size of the given list.

* * @param input the list of objects to obtain the size from * @return the size of the given list */ public static Integer getListSize(Collection input) { if (input != null) { return Integer.valueOf(input.size()); } // input was null return Integer.valueOf(0); } /** * Returns a parameter value from the module parameters.

* * @param name the name of the module * @param key the parameter to return the value for * @return the parameter value from the module parameters, or null if the parameter is not set */ public static String getModuleParam(String name, String key) { CmsModule module = OpenCms.getModuleManager().getModule(name); if (module != null) { return module.getParameter(key); } return null; } /** * Returns the current request URI.

* * For OpenCms 10.5, this is the same as using ${cms.requestContext.uri} on a JSP.

* * @param input the request convertible object to get the navigation URI from * * @return the current navigation URI * * @deprecated On a JSP use ${cms.requestContext.uri} instead. */ @Deprecated public static String getNavigationUri(Object input) { ServletRequest req = convertRequest(input); if (req == null) { return null; } return getCmsObject(input).getRequestContext().getUri(); } /** * Returns the link without parameters from a String that is formatted for a GET request.

* * @param url the URL to remove the parameters from * @return the link without parameters */ public static String getRequestLink(String url) { return CmsRequestUtil.getRequestLink(url); } /** * Returns the value of a parameter from a String that is formatted for a GET request.

* * @param url the URL to get the parameter value from * @param paramName the request parameter name * @return the value of the parameter */ public static String getRequestParam(String url, String paramName) { Map params = Collections.emptyMap(); if (CmsStringUtil.isNotEmpty(url)) { int pos = url.indexOf(CmsRequestUtil.URL_DELIMITER); if (pos >= 0) { params = CmsRequestUtil.createParameterMap(url.substring(pos + 1)); } } String[] result = params.get(paramName); if (result != null) { return result[0]; } return null; } /** * Returns a JSP / EL VFS access bean.

* * @param input the Object to create a CmsObject from * * @return a JSP / EL VFS access bean */ public static CmsJspVfsAccessBean getVfsAccessBean(Object input) { return CmsJspVfsAccessBean.create(CmsJspElFunctions.convertCmsObject(input)); } /** * Returns whether the given resource is a sub sitemap folder.

* * @param resource the resource to check * * @return true if the given resource is a sub sitemap folder */ public static boolean isSubSitemap(CmsResource resource) { return (resource != null) && CmsResourceTypeFolderSubSitemap.isSubSitemap(resource); } /** * Parses the JSON String and returns the requested value.

* * @param maybeJsonString the JSON string * @param key the key * * @return the json value string */ public static String jsonGetString(Object maybeJsonString, Object key) { try { if (maybeJsonString == null) { return null; } String jsonString = (String)maybeJsonString; if (CmsStringUtil.isEmptyOrWhitespaceOnly(jsonString)) { return null; } JSONObject json = new JSONObject(jsonString); String keyString = (String)key; return json.optString(keyString); } catch (Exception e) { return null; } } /** * Converts a string (which is assumed to contain a JSON object whose values are strings only) to a map, for use in JSPs.

* * If the input can't be interpreted as JSON, an empty map is returned. * * @param jsonString the JSON string * @return the map with the keys/values from the JSON */ public static Map jsonToMap(String jsonString) { Map result = Maps.newHashMap(); if (jsonString != null) { try { JSONObject json = new JSONObject(jsonString); for (String key : json.keySet()) { String value = json.optString(key); if (value != null) { result.put(key, value); } } } catch (Exception e) { LOG.warn(e.getLocalizedMessage(), e); } } return result; } /** * Looks up the given key from the map that is passed as a String, and returns either the * element found or the empty String.

* * The map String must have the form "key1:value1|key2:value2" etc.

* * @param key the key to look up * @param map the map represented as a String * @return the element found in the map with the given key, or the empty String */ public static String lookup(String key, String map) { return lookup(key, map, ""); } /** * Looks up the given key from the map that is passed as a String, and returns either the * element found or the default value.

* * The map String must have the form "key1:value1|key2:value2" etc.

* * @param key the key to look up * @param map the map represented as a String * @param defaultValue the default value * @return the element found in the map with the given key, or the default value */ public static String lookup(String key, String map, String defaultValue) { Map values = CmsStringUtil.splitAsMap(map, "|", ":"); String result = values.get(key); if (CmsStringUtil.isEmptyOrWhitespaceOnly(result)) { return defaultValue; } return result; } /** * Repairs the given HTML input by adding potentially missing closing tags.

* * @param input the HTML input * * @return the repaired HTML or an empty string in case of errors */ public static String repairHtml(String input) { CmsHtmlConverter converter = new CmsHtmlConverter(); String result = converter.convertToStringSilent(input); return result == null ? "" : result; } /** * Strips all HTML markup from the given input.

* *

    *
  • In case the input is an instance of {@link CmsJspContentAccessValueWrapper}, an optimized * method is used for the HTML stripping. *
  • Otherwise the input is converted to a String and this String is stripped. *
* * @param input the input to Strip from HTML * * @return the given input with all HTML stripped. */ public static String stripHtml(Object input) { if (input instanceof CmsJspContentAccessValueWrapper) { CmsJspContentAccessValueWrapper wrapper = (CmsJspContentAccessValueWrapper)input; if (wrapper.getExists()) { return wrapper.getContentValue().getPlainText(wrapper.obtainCmsObject()); } else { return ""; } } try { return CmsHtml2TextConverter.html2text(String.valueOf(input), OpenCms.getSystemInfo().getDefaultEncoding()); } catch (Exception e) { return CmsMessages.formatUnknownKey(e.getMessage()); } } /** * Returns a substring of the source, which is at most length characters long.

* * If a char is cut, " ..." is appended to the result.

* * @param input the string to trim * @param length the maximum length of the string to be returned * * @return a substring of the source, which is at most length characters long * * @see CmsStringUtil#trimToSize(String, int, String) */ public static String trimToSize(String input, int length) { return CmsStringUtil.trimToSize(input, length, " ..."); } /** * Validates a value against a regular expression.

* * @param value the value * @param regex the regex * * @return true if the value satisfies the validation */ public static boolean validateRegex(String value, String regex) { return CmsStringUtil.validateRegex(value, regex, true); } }