/* StringFns.java Purpose: Description: History: Thu Mar 31 12:25:57 2005, Created by tomyeh Copyright (C) 2005 Potix Corporation. All Rights Reserved. {{IS_RIGHT This program is distributed under LGPL Version 2.1 in the hope that it will be useful, but WITHOUT ANY WARRANTY. }}IS_RIGHT */ package org.zkoss.xel.fn; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.zkoss.lang.Objects; import org.zkoss.util.Locales; /** * Functions to manipulate strings in EL. * * @author tomyeh */ public class StringFns { private static Logger log = LoggerFactory.getLogger(StringFns.class); /** Concatenates two objects. * Note: null is considered as empty. */ public static String cat(Object o1, Object o2) { return (o1 == null ? "" : String.valueOf(o1)) + (o2 == null ? "" : String.valueOf(o2)); } /** Concatenates three objects. * Note: null is considered as empty. */ public static String cat3(Object o1, Object o2, Object o3) { return cat(cat(o1, o2), o3); } /** Concatenates four objects. * Note: null is considered as empty. */ public static String cat4(Object o1, Object o2, Object o3, Object o4) { return cat(cat(cat(o1, o2), o3), o4); } /** Concatenates five objects. * Note: null is considered as empty. */ public static String cat5(Object o1, Object o2, Object o3, Object o4, Object o5) { return cat(cat(cat(cat(o1, o2), o3), o4), o5); } /** Converts all of the characters in this String to upper case using the rules of the current Locale. * @see Locales#getCurrent * @since 5.0.7 */ public static String toLowerCase(String s) { return s != null ? s.toLowerCase(Locales.getCurrent()): null; } /** Converts all of the characters in this String to upper case using the rules of the current Locale. * @see Locales#getCurrent * @since 5.0.7 */ public static String toUpperCase(String s) { return s != null ? s.toUpperCase(Locales.getCurrent()): null; } /** Returns a copy of the string, with leading and trailing whitespace omitted. * @since 5.0.7 */ public static String trim(String s) { return s != null ? s.trim(): null; } /** Splits a string. * @since 5.0.7 */ public static String[] split(String s, String separator) { return s != null ? s.split(separator): null; } /** Joins an array of string. * since 5.0.7 */ public static String join(Object[] ss, String separator) { if (ss == null) return null; final StringBuffer sb = new StringBuffer(); for (int j = 0; j < ss.length; ++j) { if (j != 0) sb.append(separator); sb.append(ss[j]); } return sb.toString(); } /** Tests if this string starts with the specified prefix. * @since 5.0.7 */ public static boolean startsWith(String s1, String s2) { return s1 != null && s2 != null && s1.startsWith(s2); } /** Tests if this string ends with the specified suffix. * @since 5.0.7 */ public static boolean endsWith(String s1, String s2) { return s1 != null && s2 != null && s1.endsWith(s2); } /** Returns a new string that is a substring of this string. * @since 5.0.7 */ public static String substring(String s, int from, int to) { return s != null ? s.substring(from, to): null; } /** Replaces all occurrences of 'from' in 'src' with 'to' */ public static String replace(String src, String from, String to) { if (Objects.equals(from, to)) return src; final StringBuffer sb = new StringBuffer(src); if ("\n".equals(from) || "\r\n".equals(from)) { replace0(sb, "\r\n", to); replace0(sb, "\n", to); } else { replace0(sb, from, to); } return sb.toString(); } private static void replace0(StringBuffer sb, String from, String to) { final int len = from.length(); for (int j = 0; (j = sb.indexOf(from, j)) >= 0;) { sb.replace(j, j + len, to); j += to.length() ; //ZK-929 : update index to prevent infinite loop } } /** Eliminates single and double quotations to avoid JavaScript * injection. * It eliminates all quotations. In other words, the specified string * shall NOT contain any quotations. * * <p>It is used to avoid JavaScript injection. * For example, in DSP or JSP pages, the following codes is better * to escape with this method. * <code><input value="${c:eatQuot(param.some)}"/></code> * * @since 3.5.2 */ public static String eatQuot(String s) { final int len = s != null ? s.length(): 0; StringBuffer sb = null; for (int j = 0; j < len; ++j) { final char cc = s.charAt(j); if (cc == '\'' || cc == '"') { if (sb == null) { log.warn("JavaScript Injection? Unexpected string detected: "+s); sb = new StringBuffer(len); if (j > 0) sb.append(s.substring(0, j)); } } else if (sb != null) sb.append(cc); } return sb != null ? sb.toString(): s; } }