/** * */ package org.sakaiproject.search.component.service.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * @author ieb * */ public class StringUtils { private static final Log log = LogFactory.getLog(StringUtils.class); /** * This is a copy of the method in FormattedText... its here because FormattedText * depends on the component manager, and I need to run simple unit tests * @param value * @param escapeNewlines * @return * * deprecated use commons-lang StringEscapeUtils.escapeHTML */ public static String escapeHtml(String value, boolean escapeNewlines) { if (value == null) return ""; try { // lazily allocate the StringBuilder // only if changes are actually made; otherwise // just return the given string without changing it. StringBuilder buf = null; final int len = value.length(); for (int i = 0; i < len; i++) { char c = value.charAt(i); switch (c) { case '<': { if (buf == null) buf = new StringBuilder(value.substring(0, i)); buf.append("<"); } break; case '>': { if (buf == null) buf = new StringBuilder(value.substring(0, i)); buf.append(">"); } break; case '&': { if (buf == null) buf = new StringBuilder(value.substring(0, i)); buf.append("&"); } break; case '"': { if (buf == null) buf = new StringBuilder(value.substring(0, i)); buf.append("""); } break; case '\n': { if (escapeNewlines) { if (buf == null) buf = new StringBuilder(value.substring(0, i)); buf.append("<br />\n"); } else { if (buf != null) buf.append(c); } } break; default: { if (c < 128) { if (buf != null) buf.append(c); } else { // escape higher Unicode characters using an // HTML numeric character entity reference like "㴸" if (buf == null) buf = new StringBuilder(value.substring(0, i)); buf.append("&#"); buf.append(Integer.toString((int) c)); buf.append(";"); } } break; } } // for return (buf == null) ? value : buf.toString(); } catch (Exception e) { log.warn("Validator.escapeHtml: ", e); return value; } } // escapeHtml public static final char HIGHEST_CHARACTER = '>'; public static final char[][] specialChars = new char[HIGHEST_CHARACTER + 1][]; static { specialChars['>'] = ">".toCharArray(); specialChars['<'] = "<".toCharArray(); specialChars['&'] = "&".toCharArray(); specialChars['"'] = """.toCharArray(); specialChars['\''] = "'".toCharArray(); } /** * * @param toEscape * @return * * @deprecated Use Commons-lang StringEscapeUtils.escapeXml as this code might result in NPE's */ public static String xmlEscape(String toEscape) { char[] chars = toEscape.toCharArray(); int lastEscapedBefore = 0; StringBuilder escapedString = null; for (int i = 0; i < chars.length; i++) { if (chars[i] <= HIGHEST_CHARACTER) { char[] escapedPortion = specialChars[chars[i]]; if (escapedPortion != null) { if (lastEscapedBefore == 0) { escapedString = new StringBuilder(chars.length + 5); } if (lastEscapedBefore < i) { escapedString.append(chars, lastEscapedBefore, i - lastEscapedBefore); } lastEscapedBefore = i + 1; escapedString.append(escapedPortion); } } } if (lastEscapedBefore == 0) { return toEscape; } if (lastEscapedBefore < chars.length) { escapedString.append(chars, lastEscapedBefore, chars.length - lastEscapedBefore); } return escapedString.toString(); } }