Author: natalia Date: Sun Apr 6 13:42:36 2008 New Revision: 645305 URL: http://svn.apache.org/viewvc?rev=645305&view=rev Log: New method for escaping path in URL
Modified: xml/xindice/trunk/java/src/org/apache/xindice/util/StringUtilities.java Modified: xml/xindice/trunk/java/src/org/apache/xindice/util/StringUtilities.java URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/util/StringUtilities.java?rev=645305&r1=645304&r2=645305&view=diff ============================================================================== --- xml/xindice/trunk/java/src/org/apache/xindice/util/StringUtilities.java (original) +++ xml/xindice/trunk/java/src/org/apache/xindice/util/StringUtilities.java Sun Apr 6 13:42:36 2008 @@ -20,6 +20,7 @@ package org.apache.xindice.util; import java.util.StringTokenizer; +import java.io.UnsupportedEncodingException; /** * StringUtilities provides a set of commonly used String parsing and @@ -28,6 +29,7 @@ * @version $Revision$, $Date$ */ public final class StringUtilities { + private static final String ALLOWED_CHARS = "$-_.+!*'(),;/:@&="; private StringUtilities() { } @@ -225,67 +227,46 @@ } } + public static boolean isBlank(String str) { + for (int i = 0; i < str.length(); i++) { + if (!Character.isWhitespace(str.charAt(i))) { + return false; + } + } + + return true; + } + /** - * Converts input text into its XML representation by escaping all special symbols, - * if any are present. - * - * @param text Input string - * @return String with all the special symbols escaped + * Escapes a path in URL by converting all unsafe characters to a sequence + * of %xx according to RFC 1738 (Uniform Resource Locators (URL)). It is + * similar, but not identical to URLEncoder. + * @param path String representation of a URL path to be escaped + * @return Escaped path */ - public static String escapeXml(String text) { - char[] value = text.toCharArray(); + public static String escapePath(String path) { StringBuffer buf = new StringBuffer(); - int start = 0; - int len = 0; - - for (int i = 0; i < value.length; i++) { - String outval = null; - switch (value[i]) { - case '&': - outval = "&"; - break; - case '\'': - outval = "'"; - break; - case '\"': - outval = """; - break; - case '<': - outval = "<"; - break; - case '>': - outval = ">"; - break; - default : - len++; - break; - } + for (int i = 0; i < path.length(); i++) { + char ch = path.charAt(i); - if (outval != null) { - if (len > 0) { - buf.append(value, start, len); + if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z') && (ch < '0' || ch > '9') && + ALLOWED_CHARS.indexOf(ch) < 0) { + try { + byte[] b = Character.toString(ch).getBytes("utf-8"); + for (int j = 0; j < b.length; j++) { + char upper = Character.forDigit(((b[j] >> 4) & 0xF), 16); + char lower = Character.forDigit((b[j] & 0xF), 16); + buf.append('%').append(upper).append(lower); + } + } catch (UnsupportedEncodingException e) { + // won't happen } - buf.append(outval); - start = i + 1; - len = 0; + } else { + buf.append(ch); } } - if (len > 0) { - buf.append(value, start, len); - } - return buf.toString(); - } - - public static boolean isBlank(String str) { - for (int i = 0; i < str.length(); i++) { - if (!Character.isWhitespace(str.charAt(i))) { - return false; - } - } - - return true; } }