123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- /*
- * Copyright 2004-2011 H2 Group.
- * Copyright 2011 James Moger.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- package com.iciql.util;
-
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStreamReader;
- import java.io.UnsupportedEncodingException;
- import java.nio.charset.Charset;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.util.ArrayList;
-
- /**
- * Common string utilities.
- */
- public class StringUtils {
-
- /**
- * Replace all occurrences of the before string with the after string.
- *
- * @param s the string
- * @param before the old text
- * @param after the new text
- * @return the string with the before string replaced
- */
- public static String replaceAll(String s, String before, String after) {
- int next = s.indexOf(before);
- if (next < 0) {
- return s;
- }
- StringBuilder buff = new StringBuilder(s.length() - before.length() + after.length());
- int index = 0;
- while (true) {
- buff.append(s.substring(index, next)).append(after);
- index = next + before.length();
- next = s.indexOf(before, index);
- if (next < 0) {
- buff.append(s.substring(index));
- break;
- }
- }
- return buff.toString();
- }
-
- /**
- * Check if a String is null or empty (the length is null).
- *
- * @param s the string to check
- * @return true if it is null or empty
- */
- public static boolean isNullOrEmpty(String s) {
- return s == null || s.length() == 0;
- }
-
- /**
- * Convert a string to a Java literal using the correct escape sequences.
- * The literal is not enclosed in double quotes. The result can be used in
- * properties files or in Java source code.
- *
- * @param s the text to convert
- * @return the Java representation
- */
- public static String javaEncode(String s) {
- int length = s.length();
- StringBuilder buff = new StringBuilder(length);
- for (int i = 0; i < length; i++) {
- char c = s.charAt(i);
- switch (c) {
- // case '\b':
- // // BS backspace
- // // not supported in properties files
- // buff.append("\\b");
- // break;
- case '\t':
- // HT horizontal tab
- buff.append("\\t");
- break;
- case '\n':
- // LF linefeed
- buff.append("\\n");
- break;
- case '\f':
- // FF form feed
- buff.append("\\f");
- break;
- case '\r':
- // CR carriage return
- buff.append("\\r");
- break;
- case '"':
- // double quote
- buff.append("\\\"");
- break;
- case '\\':
- // backslash
- buff.append("\\\\");
- break;
- default:
- int ch = c & 0xffff;
- if (ch >= ' ' && (ch < 0x80)) {
- buff.append(c);
- // not supported in properties files
- // } else if(ch < 0xff) {
- // buff.append("\\");
- // // make sure it's three characters (0x200 is octal 1000)
- // buff.append(Integer.toOctalString(0x200 |
- // ch).substring(1));
- } else {
- buff.append("\\u");
- // make sure it's four characters
- buff.append(Integer.toHexString(0x10000 | ch).substring(1));
- }
- }
- }
- return buff.toString();
- }
-
- /**
- * Pad a string. This method is used for the SQL function RPAD and LPAD.
- *
- * @param string the original string
- * @param n the target length
- * @param padding the padding string
- * @param right true if the padding should be appended at the end
- * @return the padded string
- */
- public static String pad(String string, int n, String padding, boolean right) {
- if (n < 0) {
- n = 0;
- }
- if (n < string.length()) {
- return string.substring(0, n);
- } else if (n == string.length()) {
- return string;
- }
- char paddingChar;
- if (padding == null || padding.length() == 0) {
- paddingChar = ' ';
- } else {
- paddingChar = padding.charAt(0);
- }
- StringBuilder buff = new StringBuilder(n);
- n -= string.length();
- if (right) {
- buff.append(string);
- }
- for (int i = 0; i < n; i++) {
- buff.append(paddingChar);
- }
- if (!right) {
- buff.append(string);
- }
- return buff.toString();
- }
-
- /**
- * Convert a string to a SQL literal. Null is converted to NULL. The text is
- * enclosed in single quotes. If there are any special characters, the
- * method STRINGDECODE is used.
- *
- * @param s the text to convert.
- * @return the SQL literal
- */
- public static String quoteStringSQL(String s) {
- if (s == null) {
- return "NULL";
- }
- int length = s.length();
- StringBuilder buff = new StringBuilder(length + 2);
- buff.append('\'');
- for (int i = 0; i < length; i++) {
- char c = s.charAt(i);
- if (c == '\'') {
- buff.append(c);
- } else if (c < ' ' || c > 127) {
- // need to start from the beginning because maybe there was a \
- // that was not quoted
- return "STRINGDECODE(" + quoteStringSQL(javaEncode(s)) + ")";
- }
- buff.append(c);
- }
- buff.append('\'');
- return buff.toString();
- }
-
- /**
- * Split a string into an array of strings using the given separator. A null
- * string will result in a null array, and an empty string in a zero element
- * array.
- *
- * @param s the string to split
- * @param separatorChar the separator character
- * @param trim whether each element should be trimmed
- * @return the array list
- */
- public static String[] arraySplit(String s, char separatorChar, boolean trim) {
- if (s == null) {
- return null;
- }
- int length = s.length();
- if (length == 0) {
- return new String[0];
- }
- ArrayList<String> list = Utils.newArrayList();
- StringBuilder buff = new StringBuilder(length);
- for (int i = 0; i < length; i++) {
- char c = s.charAt(i);
- if (c == separatorChar) {
- String e = buff.toString();
- list.add(trim ? e.trim() : e);
- buff.setLength(0);
- } else if (c == '\\' && i < length - 1) {
- buff.append(s.charAt(++i));
- } else {
- buff.append(c);
- }
- }
- String e = buff.toString();
- list.add(trim ? e.trim() : e);
- String[] array = new String[list.size()];
- list.toArray(array);
- return array;
- }
-
- /**
- * Calculates the SHA1 of the string.
- *
- * @param text
- * @return sha1 of the string
- */
- public static String calculateSHA1(String text) {
- try {
- byte[] bytes = text.getBytes("iso-8859-1");
- return calculateSHA1(bytes);
- } catch (UnsupportedEncodingException u) {
- throw new RuntimeException(u);
- }
- }
-
- /**
- * Calculates the SHA1 of the byte array.
- *
- * @param bytes
- * @return sha1 of the byte array
- */
- public static String calculateSHA1(byte[] bytes) {
- try {
- MessageDigest md = MessageDigest.getInstance("SHA-1");
- md.update(bytes, 0, bytes.length);
- byte[] digest = md.digest();
- StringBuilder sb = new StringBuilder(digest.length * 2);
- for (int i = 0; i < digest.length; i++) {
- if (((int) digest[i] & 0xff) < 0x10) {
- sb.append('0');
- }
- sb.append(Integer.toHexString((int) digest[i] & 0xff));
- }
- return sb.toString();
- } catch (NoSuchAlgorithmException t) {
- throw new RuntimeException(t);
- }
- }
-
- /**
- * Counts the occurrences of char c in the given string.
- *
- * @param c the character to count
- * @param value the source string
- * @return the count of c in value
- */
- public static int count(char c, String value) {
- int count = 0;
- for (char cv : value.toCharArray()) {
- if (cv == c) {
- count++;
- }
- }
- return count;
- }
-
- /**
- * Prepare text for html presentation. Replace sensitive characters with
- * html entities.
- *
- * @param inStr
- * @param changeSpace
- * @return plain text escaped for html
- */
- public static String escapeForHtml(String inStr, boolean changeSpace) {
- StringBuffer retStr = new StringBuffer();
- int i = 0;
- while (i < inStr.length()) {
- if (inStr.charAt(i) == '&') {
- retStr.append("&");
- } else if (inStr.charAt(i) == '<') {
- retStr.append("<");
- } else if (inStr.charAt(i) == '>') {
- retStr.append(">");
- } else if (inStr.charAt(i) == '\"') {
- retStr.append(""");
- } else if (changeSpace && inStr.charAt(i) == ' ') {
- retStr.append(" ");
- } else if (changeSpace && inStr.charAt(i) == '\t') {
- retStr.append(" ");
- } else {
- retStr.append(inStr.charAt(i));
- }
- i++;
- }
- return retStr.toString();
- }
-
- /**
- * Replaces carriage returns and line feeds with html line breaks.
- *
- * @param string
- * @return plain text with html line breaks
- */
- public static String breakLinesForHtml(String string) {
- return string.replace("\r\n", "<br/>").replace("\r", "<br/>").replace("\n", "<br/>");
- }
-
- /**
- * Returns the string content of the specified file.
- *
- * @param file
- * @param lineEnding
- * @return the string content of the file
- */
- public static String readContent(File file, String lineEnding) {
- StringBuilder sb = new StringBuilder();
- try {
- InputStreamReader is = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"));
- BufferedReader reader = new BufferedReader(is);
- String line = null;
- while ((line = reader.readLine()) != null) {
- sb.append(line);
- if (lineEnding != null) {
- sb.append(lineEnding);
- }
- }
- reader.close();
- } catch (Throwable t) {
- System.err.println("Failed to read content of " + file.getAbsolutePath());
- t.printStackTrace();
- }
- return sb.toString();
- }
- }
|