com.jsfsample.util.StringUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.jsfsample.util.StringUtil.java

Source

package com.jsfsample.util;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CodingErrorAction;
import java.text.MessageFormat;
import java.text.Normalizer;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * String Utility Class
 * 
 * @author
 */
public class StringUtil {

    private static Log log = LogFactory.getLog(StringUtil.class);

    /**
     * Check if the string is empty.
     * 
     * @param str
     * @return boolean
     */
    public static boolean isEmpty(String str) {
        boolean isEmpty = false;
        if (str == null || str.trim().equals("")) {
            isEmpty = true;
        }
        return isEmpty;
    }

    /**
     * convert string to upper case.
     * 
     * @param str
     * @return String
     */
    public static String toUpperCase(String str) {
        String outStr = null;
        if (!isEmpty(str)) {
            outStr = str.toUpperCase();
        }
        return outStr;
    }

    /**
     * convert string to Integer.
     * 
     * @param str
     * @return Integer
     */
    public static Integer toInteger(String str) {
        Integer outInteger = null;
        if (!isEmpty(str)) {
            outInteger = Integer.valueOf(str);
        }
        return outInteger;
    }

    /**
     * convert string to Long.
     * 
     * @param str
     * @return Long
     */
    public static Long toLong(String str) {
        Long outInteger = null;
        if (!isEmpty(str)) {
            outInteger = Long.valueOf(str);
        }
        return outInteger;
    }

    /**
     * convert string to Short.
     * 
     * @param str
     * @return Short
     */
    public static Short toShort(String str) {
        Short outShort = null;
        if (!isEmpty(str)) {
            outShort = Short.valueOf(str);
        }
        return outShort;
    }

    /**
     * Check if the string is empty.
     * 
     * @param str
     * @return String
     */
    public static String trim(String str) {
        String returnValue = null;
        if (!isEmpty(str)) {
            returnValue = str.trim();
        }
        return returnValue;
    }

    /**
     * Check if all characters are digits.
     * 
     * @param str
     * @return boolean
     */
    public static boolean isNumerical(String str) {
        boolean isNumerical = true;
        if (!isEmpty(str)) {
            int i = 0;
            // ensure all characters are digits
            while (i < str.length()) {
                if (!Character.isDigit(str.charAt(i))) {
                    isNumerical = false;
                    break;
                }
                i++;
            }
        }
        return isNumerical;
    }

    /**
     * Left pad string with char c.
     * 
     * @param s
     * @param n
     * @param c
     * @return String
     */
    public static String lPad(String s, int n, char c) {
        if (s == null) {
            return s;
        }
        int add = n - s.length();
        if (add <= 0) {
            return s;
        }
        StringBuffer str = new StringBuffer(s);
        char[] ch = new char[add];
        Arrays.fill(ch, c);
        str.insert(0, ch);

        return str.toString();
    }

    /**
     * right pad string with char c.
     * 
     * @param s
     * @param n
     * @param c
     * @return String
     */
    public static String rPad(String s, int n, char c) {
        if (s == null) {
            return s;
        }
        int add = n - s.length();
        if (add <= 0) {
            return s;
        }
        StringBuffer str = new StringBuffer(s);
        char[] ch = new char[add];
        Arrays.fill(ch, c);
        str.append(ch);

        return str.toString();
    }

    /**
     * Check if all characters are alpha.
     * 
     * @param str
     * @return boolean
     * @see StringUtilTest
     */
    public static boolean isAlpha(String str) {
        //Pattern p = Pattern.compile("[a-zA-Z]* ");

        //dot is a regular express matter character, suggest to use "union" in regular express
        //MUST run StringUtilTest if any change happened.
        Pattern p = Pattern.compile("[a-zA-Z' -[\\.][,]]*");
        //String regex = "[\\p{L&}]+"; 
        // Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        boolean isValid = m.matches();
        return isValid;
    }

    /**
     * Check if the email address is valid.
     * 
     * @param email
     * @return boolean
     */
    public static boolean isValidEmail(String email) {
        // Set the email pattern string
        Pattern p = Pattern.compile(
                "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*((\\.[A-Za-z]{2,}){1}$)");

        // Match the given string with the pattern
        Matcher m = p.matcher(email);

        // check whether match is found
        boolean isValid = m.matches();

        return isValid;
    }

    /**
     * Check if the zip code is valid.
     * 
     * @param postal
     * @return boolean
     */
    public static boolean isValidZipCode(String postal) {

        Pattern p = Pattern.compile("\\d{5}(-\\d{4})?");

        // Match the given string with the pattern
        Matcher m = p.matcher(postal);

        // check whether match is found
        boolean isValid = m.matches();

        return isValid;
    }

    /**
     * Check if the postal code is valid.
     * 
     * @param postal
     * @return boolean
     */
    public static boolean isValidPostalCode(String postal) {

        // Pattern p = Pattern.compile("[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d");
        Pattern p = Pattern.compile(
                "^[ABCEGHJ-NPRSTVXY]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$");

        // Match the given string with the pattern
        Matcher m = p.matcher(postal);

        // check whether match is found
        boolean isValid = m.matches();

        return isValid;
    }

    /**
     * Check if the postal code is valid for ontario.
     * 
     * @param postal
     * @return boolean
     */
    public static boolean isValidONPostalCode(String postal) {
        // [ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d
        Pattern p = Pattern
                .compile("[KLMNP]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$");

        // Match the given string with the pattern
        Matcher m = p.matcher(postal);

        // check whether match is found
        boolean isValid = m.matches();

        return isValid;
    }

    /**
     * Check if the phone number is valid.
     * 
     * @param phone
     * @return boolean
     */
    public static boolean isValidPhoneNumber(String phone) {

        Pattern p = Pattern.compile("[1-9]\\d{2}[1-9]\\d{2}\\d{4}");
        // Pattern p =
        // Pattern.compile("\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})");

        // Match the given string with the pattern
        Matcher m = p.matcher(phone);

        // check whether match is found
        boolean isValid = m.matches();

        return isValid;
    }

    /**
     * Check if the phone number is within ontario.
     * 
     * @param phone
     * @return boolean
     */
    public static boolean isValidOntarioPhoneNo(String phone) {
        // Set the list of valid ontario area code
        List<String> ontarioAreaCodes = Arrays.asList("905", "613", "519", "226", "249", "705", "807", "416", "647",
                "365", "343", "289", "437");

        String areaCode = phone.substring(0, 3);

        boolean isValid = false;
        if (ontarioAreaCodes.contains(areaCode)) {
            isValid = true;
        }

        return isValid;
    }

    /**
     * Validate social insurance number
     * 
     * @param value
     * @return
     */
    public static boolean isValidSin(String value) {

        boolean isValid = true;
        int save = 0;

        if (isEmpty(value) || !isNumerical(value) || value.length() != 9) {
            isValid = false;
        } else {
            String firstDigit = value.substring(0, 1);
            if ("0".equals(firstDigit) || "8".equals(firstDigit)) {
                isValid = false;
            } else {
                int tmp = Integer.parseInt(value.substring(1, 2)) * 2;
                value = firstDigit + String.valueOf(tmp) + value.substring(2, value.length());
                if (tmp >= 9)
                    save += 1;

                tmp = Integer.parseInt(value.substring(3 + save, 3 + save + 1)) * 2;
                value = value.substring(0, 3 + save) + String.valueOf(tmp)
                        + value.substring(4 + save, value.length());
                if (tmp >= 9)
                    save += 1;

                tmp = Integer.parseInt(value.substring(5 + save, 5 + save + 1)) * 2;
                value = value.substring(0, 5 + save) + String.valueOf(tmp)
                        + value.substring(6 + save, value.length());
                if (tmp >= 9)
                    save += 1;

                tmp = Integer.parseInt(value.substring(7 + save, 7 + save + 1)) * 2;
                value = value.substring(0, 7 + save) + String.valueOf(tmp)
                        + value.substring(8 + save, value.length());

                int sum = 0;
                for (int i = 0; i < value.length(); i++) {
                    tmp = Integer.parseInt(value.substring(i, i + 1));
                    sum = sum + tmp;
                }

                if ((sum % 10) != 0) {
                    isValid = false;
                }
            }
        }

        return isValid;
    }

    /**
     * Get message from resource bundle
     * 
     * @param key
     * @param locale
     * @param bundleName
     * @param params
     * @return
     */
    public static String getMessage(String key, Locale locale, String bundleName, Object params[]) {

        String text = null;

        ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale);

        try {
            text = bundle.getString(key);
        } catch (Exception e) {
            text = key;
        }

        if (params != null) {
            MessageFormat mf = new MessageFormat(text, locale);
            text = mf.format(params, new StringBuffer(), null).toString();
        }

        return text;
    }

    /**
     * convert null to space
     * 
     * @param str
     * @return
     */
    public static String nullToSpace(String str) {
        String value = "";
        if (str != null && str.trim().length() > 0) {
            value = str.trim();
        }

        return value;
    }

    /**
     * Check if a string is a integer
     * 
     * @param string
     * @return boolean
     */
    public static boolean isInteger(String str) {
        return Pattern.matches("^\\d*$", str);
    }

    /**
     * Check if a string is a valid driver license
     * 
     * @param string
     *            -- 15 long licnese characters
     * @param aDate
     *            -- dob of driver
     * @return boolean
     */
    public static boolean isValidDriverLicense(Date aDate, String str) {
        boolean valid = false;
        valid = Pattern.matches("[a-zA-Z]\\d{12}(0[1-9]|[12][0-9]|3[01])", str);
        if (valid) {
            String strDate = DateUtil.getDate(aDate);
            String str1011 = str.substring(9, 11); // 10th and 11th characters
            // -- year of driver's dob
            String str1415 = str.substring(13, 15);// 14th and 15th characters
            // -- day of driver's dob
            String dobdd = strDate.substring(3, 5);
            String dobyy = strDate.substring(8, 10);
            if (!dobdd.equals(str1415) || !dobyy.equals(str1011)) {
                valid = false;
            }
        }
        return valid;
    }

    /**
     * Check if characters are alpha and numeric only
     * 
     * @param str
     * @return boolean
     */
    public static boolean hasSpecialChars(String str) {
        Pattern p = Pattern.compile("[\\'?\\s-a-zA-Z0-9]*");
        Matcher m = p.matcher(str);
        boolean isValid = m.matches();
        return !isValid;
    }

    /**
     * PASSWORD MUST CONTAIN AT LEAST ONE DOGIT, ONE LOWER CASE LETTER AND ONE
     * UPPERCASE LETTER AND 8 OR MORE CHARACTERS
     * 
     * @param str
     * @return boolean
     */
    public static boolean isValidPwdChars(String str) {
        Pattern p = Pattern.compile("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$");
        Matcher m = p.matcher(str);
        boolean isValid = m.matches();

        return isValid;
    }

    public static boolean isZero(String str) {
        int zeroCount = 0;
        String tmp;
        // get ride of .
        tmp = str.replace(".", "");

        for (int i = 0; i < tmp.length(); i++) {
            if (tmp.charAt(i) == '0')
                zeroCount++;
        }
        if (zeroCount == tmp.length()) {
            return true;
        }
        return false;
    }

    /**
     * This method is used to encrypt user input password or challenge question
     * answers and save them into database. Since Oracle encryption will return
     * a string of all upper case letters, this method will convert the
     * encrypted string to upper case.
     */
    @Deprecated
    public static String getEncryptedString(String originalString) throws Exception {

        SecretKeySpec keySpec = new SecretKeySpec("1234567890".getBytes(), "RC4");
        Cipher cipher = Cipher.getInstance("RC4");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);

        byte[] encryptedCode = cipher.doFinal(originalString.toString().getBytes());
        String encryptedString = "";//asHex(encryptedCode).toUpperCase();

        //      if (log.isDebugEnabled())
        //         log.debug("--------->original string: " + originalString);
        //      if (log.isDebugEnabled())
        //         log.debug("--------->encrypted string: " + encryptedString);

        return encryptedString;

    }

    @Deprecated
    public static String getDecryptedString(String encryptedString) throws Exception {

        SecretKeySpec keySpec = new SecretKeySpec("1234567890".getBytes(), "RC4");
        Cipher cipher = Cipher.getInstance("RC4");
        cipher.init(Cipher.DECRYPT_MODE, keySpec);
        byte[] byteArray = cipher.doFinal(hexStringToByteArray(encryptedString.toLowerCase()));
        String decryptedString = new String(byteArray);

        //      if (log.isDebugEnabled())
        //         log.debug("--------->encryptedString: " + encryptedString);
        //      if (log.isDebugEnabled())
        //         log.debug("--------->dncryptedString: " + decryptedString);

        return decryptedString;

    }

    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
        }
        return data;
    }

    /**
     * Convert current academic year. ex. 0910 => 2009-2010
     * 
     * @param academicYr
     * @return
     */
    public static String formatAcademicYear(String academicYr) {
        String rtnValue = null;
        String century1 = null;
        String century2 = null;

        if (!StringUtil.isEmpty(academicYr) && academicYr.trim().length() == 4) {
            if (academicYr.compareTo("9091") >= 0) {
                century1 = "19";
                if ("9900".equals(academicYr)) {
                    century2 = "19";
                } else {
                    century2 = "19";
                }
            } else {
                century1 = "20";
                century2 = "20";
            }

            rtnValue = century1 + academicYr.substring(0, 2) + "-" + century2 + academicYr.substring(2);
        }

        return rtnValue;
    }

    /**
     * i.e  
     *    academicYr = 1112, offsetYears = 1  => return 1213
     *    academicYr = 1112, offsetYears = -4 => return 0708
     *   academicYr = "", offsetYears = 1     => return ""
     *   academicYr = null, offsetYears = 1  => return "" 
     * 
     * @param academicYr
     * @param offsetYears
     * @return
     */
    public static String calcAcademicYear(String academicYr, int offsetYears) {

        String rtnValue = null;
        String century1 = null;
        String century2 = null;

        if (StringUtil.isEmpty(academicYr))
            return "";

        if (!StringUtil.isEmpty(academicYr) && academicYr.trim().length() == 4) {
            if (academicYr.compareTo("9091") >= 0) {
                century1 = "19";
                if ("9900".equals(academicYr)) {
                    century2 = "19";
                } else {
                    century2 = "19";
                }
            } else {
                century1 = "20";
                century2 = "20";
            }

            String year1 = century1 + academicYr.substring(0, 2);
            String year2 = century2 + academicYr.substring(2);

            SimpleDateFormat df1 = new SimpleDateFormat("yyyy");
            SimpleDateFormat df2 = new SimpleDateFormat("yy");

            try {
                rtnValue = df2.format(DateUtil.addYear(df1.parse(year1), offsetYears))
                        + df2.format(DateUtil.addYear(df1.parse(year2), offsetYears));

                return rtnValue;
            } catch (ParseException e) {
                //should never happen
                throw new RuntimeException(e);
            }

        }

        return "";
    }

    public static String maskSin(String sin) {
        if (isEmpty(sin) || isEmpty(sin.trim()) || sin.equals("0")) {
            return null;
        } else {
            String last3Digit = sin.substring(6);
            String mask = "******";
            String maskedSin = mask.concat(last3Digit);
            return maskedSin;
        }

    }

    public static String maskDriverLicence(String dl) {
        if (isEmpty(dl) || isEmpty(dl.trim())) {
            return dl;
        } else {
            String last4Digit = dl.substring(11);
            String mask = "***********";
            String maskedDl = mask.concat(last4Digit);
            return maskedDl;
        }

    }

    /**
     * Check whether a given URL is internal to this application.
     * 
     * @param url
     * @return
     */
    // TODO: Current implementation is preliminary.
    public static boolean isInternalURL(String url) {

        return (!isEmpty(url) && url.indexOf(":") < 0);

    }

    /**
     * Convert string with accent to non accent one.
     * @param s
     * @return
     */
    public static String toStringSansAccent(String s) {

        if (isEmpty(s.trim())) {
            return s;
        }
        s = s.replaceAll("[]", "A");
        s = s.replaceAll("[]", "C");
        s = s.replaceAll("[]", "E");
        s = s.replaceAll("[]", "I");
        s = s.replaceAll("[]", "N");
        s = s.replaceAll("[]", "O");
        s = s.replaceAll("[]", "U");
        s = s.replaceAll("[]", "Y");
        s = s.replaceAll("[]", "a");
        s = s.replaceAll("[]", "c");
        s = s.replaceAll("[]", "e");
        s = s.replaceAll("[]", "i");
        s = s.replaceAll("[]", "n");
        s = s.replaceAll("[]", "o");
        s = s.replaceAll("[]", "u");
        s = s.replaceAll("[]", "y");
        return s;

    }

    /**
     * Convert string  to ascii .it returns ? for
     * non ascii characters
     * @param s
     * @return ascii format of s
     */
    public static String toAscii(String s) {

        String s1 = Normalizer.normalize(s, Normalizer.Form.NFKD);
        String regex = "[\\p{InCombiningDiacriticalMarks}]+";
        String s2 = "";
        try {
            s2 = new String(s1.replaceAll(regex, "").getBytes("ascii"), "ascii");
        } catch (UnsupportedEncodingException e) {
            log.error("toAscii failed: " + s, e);
            return s1;
        }

        return s2;

    }

    public static boolean isISO88593(String v) {
        if (v == null || v.length() == 0) {
            return true;
        }
        CharsetEncoder d = Charset.forName("ISO-8859-3").newEncoder();
        d.onMalformedInput(CodingErrorAction.REPORT);
        d.onUnmappableCharacter(CodingErrorAction.REPORT);
        try {
            ByteBuffer bb = d.encode(CharBuffer.wrap(v.toCharArray()));
            bb.toString();
        } catch (CharacterCodingException e) {
            return false;
        }
        return true;
    }

    public static String stackToString(Throwable cause) {
        if (cause == null)
            return "";
        try {
            //cause.printStackTrace();
            StringWriter sw = new StringWriter();
            cause.printStackTrace(new PrintWriter(sw));
            String stackTrace = sw.toString();
            return stackTrace;
        } catch (Exception e) {
            return cause.toString();
        }
    }

    /**
     * Determine if the given OEN passed the OEN verification rule.
     * @param oen
     * @return boolean
     */
    public static boolean isValidOenFormat(String oen) {
        String OEN_MASK = "0246813579135792468024680357913579146802468025791357913680246802479135791358024680246913579135702468";
        int MIN_OEN = 60000000;

        if (isEmpty(oen) || !isNumerical(oen) || oen.length() != 9 || Integer.parseInt(oen) < MIN_OEN) {
            return false;
        }

        int maskValue = 0;
        int checkDigit = 0;
        String oenNumber = oen;
        String[] oenGroup = null;

        oenGroup = oenNumber.split("(?<=\\G.{2})");

        for (int i = 0; i < 4; i++) {
            maskValue = maskValue
                    + Integer.parseInt(Character.toString(OEN_MASK.charAt((Integer.parseInt(oenGroup[i])))));
        }
        checkDigit = ((maskValue / 10 + 1) * 10) - maskValue;

        if (checkDigit == 10) {
            checkDigit = 0;
        }

        return (Integer.parseInt(oenGroup[oenGroup.length - 1]) == checkDigit);
    }
}