/*
* OpenClinica is distributed under the
* GNU Lesser General Public License (GNU LGPL).
* For details see: http://www.openclinica.org/license
* copyright 2003-2005 Akaza Research
*/
package org.akaza.openclinica.core.form;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern;
/**
*
* Help class for string usage
*
* @author jxu
*/
public class StringUtil {
/*
* A utility method for escaping apostrophes in Strings. "My'String" becomes
* "My\'String". This could be used for example to escape a String for
* insertion into a postgresql varchar field.
*/
public static String escapeSingleQuote(String escapeSource) {
if (escapeSource == null || "".equalsIgnoreCase(escapeSource)) {
return "";
}
// We have to use four backslashes in a row here to properly reproduce
// \' from
// a single apostrophe
return escapeSource.replaceAll("'", "\\\\'");
}
/**
* Checks whether a string is blank
*
* @param s
* @return true if blank, false otherwise
* @deprecated Use {@link org.apache.commons.lang.StringUtils#isBlank(String)} instead.
*/
@Deprecated
public static boolean isBlank(String s) {
return s == null ? true : s.trim().equals("") ? true : false;
}
public static boolean isNumber(String s) {
// To Do: whether we consider a blank string is still a number?
return Pattern.matches("[0-9]*", s) ? true : false;
}
public static boolean isValidDate(String s) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
sdf.setLenient(false);
try {
java.util.Date date = sdf.parse(s);
if (date.after(new java.util.Date())) {
return false; // not a date in the past,for date of birth
}
} catch (ParseException fe) {
return false; // format is wrong
}
return true;
}
public static boolean isEmail(String s) {
return Pattern.matches("[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*@[A-Za-z]+(\\.[A-Za-z]+)*", s) ? true : false;
}
public static String join(String glue, ArrayList a) {
String answer = "";
String join = "";
for (int i = 0; i < a.size(); i++) {
String s = (String) a.get(i);
answer += join + s;
join = glue;
}
return answer;
}
/**
* Invoked method that uses the default locale.
* @param s
* @param dateFormat
* @return
*/
// ywang (Nov., 2008)
public static boolean isFormatDate(String s, String dateFormat) {
String dateformat = parseDateFormat(dateFormat);
return isSameDate(dateformat, dateformat, s);
}
public static boolean isFormatDate(String s, String dateFormat, Locale locale) {
String dateformat = parseDateFormat(dateFormat);
return isSameDate(dateformat, dateformat, s, locale);
}
/**
* Return true if a string can be parsed by the dateFormat with locale.
*
* @param s
* @param dateFormat
* @param locale
* @return
*/
//ywang (Oct., 2011)
public static boolean isDateFormatString(String s, String dateFormat, Locale locale) {
String dateformat = parseDateFormat(dateFormat);
SimpleDateFormat f = new SimpleDateFormat(dateformat, locale);
f.setLenient(false);
try {
f.parse(s);
return true;
} catch (Exception ex) {
return false;
}
}
/**
* Allow only 4 digits, no more, no less. SimpleDateFormat uses the default locale.
*
* @param s
* @param yearFormat
* @return
*/
//ywang (Nov., 2008)
public static boolean isPartialYear(String s, String yearFormat) {
return partialYear(s, yearFormat, null);
}
public static boolean isPartialYear(String s, String yearFormat, Locale locale) {
return partialYear(s, yearFormat, locale);
}
private static boolean partialYear(String s, String yearFormat, Locale locale) {
int dn = 0;
char[] cyear = s.toCharArray();
for (char c : cyear) {
if (!Character.isDigit(c)) {
return false;
}
++dn;
}
if(dn != 4) {
return false;
}
String yearformat = parseDateFormat(yearFormat) + "-MM-dd";
SimpleDateFormat sdf_y;
if(locale == null) {
sdf_y = new SimpleDateFormat(yearformat);
}else {
sdf_y = new SimpleDateFormat(yearformat, locale);
}
sdf_y.setLenient(false);
String sy = s + "-01-18";
try {
sdf_y.parse(sy);
return true;
} catch (Exception e) {
return false;
}
}
/**
* The year can only between 1000 and 9999.
*
* @param s
* @param yearMonthFormat
* @return
*/
//ywang (Nov., 2008)
public static boolean isPartialYearMonth(String s, String yearMonthFormat) {
String yearmonthformat = parseDateFormat(yearMonthFormat) + "-dd";
String sym = s + "-18";
return isSameDate(yearmonthformat, yearmonthformat, sym);
}
public static boolean isPartialYearMonth(String s, String yearMonthFormat, Locale locale) {
String yearmonthformat = parseDateFormat(yearMonthFormat) + "-dd";
String sym = s + "-18";
return isSameDate(yearmonthformat, yearmonthformat, sym, locale);
}
/**
* return dateFormat with lowercase "y" and "d"
*
* @param dateFormat
* @return
*/
public static String parseDateFormat(String dateFormat) {
String s = dateFormat;
while (s.contains("Y")) {
s = s.replace("Y", "y");
}
while (s.contains("D")) {
s = s.replace("D", "d");
}
return s;
}
/**
* Return true if a date String is the same day when it is parsed by two
* different dateFormats. The year can only between 1000 and 9999.
* SimpleDataFormat uses the default locale.
*
* @param dateFormat1
* @param dateFormat2
* @param dateStr
* @return
*/
public static boolean isSameDate(String dateFormat1, String dateFormat2, String dateStr) {
SimpleDateFormat sdf1 = new SimpleDateFormat(dateFormat1);
sdf1.setLenient(false);
SimpleDateFormat sdf2 = new SimpleDateFormat(dateFormat2);
sdf2.setLenient(false);
return sameDate(sdf1, sdf2, dateStr);
}
public static boolean isSameDate(String dateFormat1, String dateFormat2, String dateStr, Locale locale) {
SimpleDateFormat sdf1 = new SimpleDateFormat(dateFormat1, locale);
sdf1.setLenient(false);
SimpleDateFormat sdf2 = new SimpleDateFormat(dateFormat2, locale);
sdf2.setLenient(false);
return sameDate(sdf1,sdf2,dateStr);
}
private static boolean sameDate(SimpleDateFormat sdf1, SimpleDateFormat sdf2, String dateStr) {
try {
Date d1 = sdf1.parse(dateStr);
try {
String temp = sdf2.format(d1);
if (temp.equals(dateStr)) {
Calendar c = Calendar.getInstance();
c.setTime(d1);
int year = c.get(Calendar.YEAR);
if(year>9999 || year<1000) {
return false;
}
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
} catch (Exception e) {
return false;
}
}
// /**
// * @param s A string of words, which are substrings separated
// * by non-word characters (reg ex "\W").
// * @param numWords The number of words to cut-off at.
// * @return A string composed of the first <code>numWords</code> words of
// <code>s</code>.
// */
// public static String firstWords(String s, int numWords) {
// Pattern p = Pattern.compile("\\W");
// String[] pieces = p.split(s, numWords);
// ArrayList a = new ArrayList(Arrays.asList(pieces));
// return join(" ", a);
// }
}