husted 02/03/04 18:29:48
Modified: contrib/scaffold/src/framework/main/org/apache/scaffold/text
ConvertUtils.java
Log:
Update SuperForm with value object population methods.
Revision Changes Path
1.2 +315 -91
jakarta-struts/contrib/scaffold/src/framework/main/org/apache/scaffold/text/ConvertUtils.java
Index: ConvertUtils.java
===================================================================
RCS file:
/home/cvs/jakarta-struts/contrib/scaffold/src/framework/main/org/apache/scaffold/text/ConvertUtils.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ConvertUtils.java 23 Dec 2001 19:32:52 -0000 1.1
+++ ConvertUtils.java 5 Mar 2002 02:29:48 -0000 1.2
@@ -15,8 +15,11 @@
/**
+ * An <b>experimental</b> class with some standard conversion
+ * utilities. Needs more proof of concept and unit testing.
+ *
* @author Ted Husted
- * @version $Revision: 1.1 $ $Date: 2001/12/23 19:32:52 $
+ * @version $Revision: 1.2 $ $Date: 2002/03/05 02:29:48 $
*/
public class ConvertUtils {
@@ -31,6 +34,10 @@
*/
+
+// --------------------------------------------------------------- Text
+
+
/**
* An empty string.
*/
@@ -46,6 +53,27 @@
/**
+ * Appends name=value parameter.
+ */
+ public static String addParam(String path, String name, String value) {
+ StringBuffer uri = new StringBuffer(path);
+ boolean isQuery = (path.indexOf("?")>=0);
+ if (isQuery)
+ uri.append("&");
+ else
+ uri.append("?");
+ uri.append(name);
+ uri.append("=");
+ uri.append(value);
+ return uri.toString();
+
+ }
+
+
+// ------------------------------------------------------------ Numeric
+
+
+ /**
* Return String with of digits only (0..9).
* http://java.sun.com/j2se/1.4/docs/api/java/lang/Character.html
*/
@@ -60,7 +88,9 @@
return (sb.toString());
}
+
/**
+ * Returns number formatted for default or given locale.
*/
public static String getNumber(Number value, Locale locale) {
if (locale==null)
@@ -68,15 +98,9 @@
return (NumberFormat.getInstance(locale).format(value));
}
- /**
- */
- public static String getDecimal(Number value, Locale locale) {
- if (locale==null)
- return (DecimalFormat.getInstance().format(value));
- return (DecimalFormat.getInstance().format(value));
- }
/**
+ * Returns percent formatted for default or given locale.
*/
public static String getPercent(Number value, Locale locale) {
if (locale==null)
@@ -94,7 +118,66 @@
*/
+ /*
+ * Returns whether the last digit of numeric string is a parity
+ * check on the others per the "primes of nines" method.
+ * Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
+ * @param Number - Number to check.
+ * Must be all digits and not null.
+ */
+ public static boolean luhnCheck(String number) {
+ int no_digit = number.length();
+ int oddoeven = no_digit & 1;
+ long sum = 0;
+ for (int count = 0; count < no_digit; count++) {
+ int digit = Integer.parseInt(
+ String.valueOf(number.charAt(count)));
+ if ( ( (count & 1) ^ oddoeven) ==0 ) { // not
+ digit *= 2;
+ if (digit > 9) digit -= 9;
+ };
+ sum += digit;
+ };
+ if (sum == 0) return false;
+ if (sum % 10 == 0) return true;
+ return false;
+ }
+
+
/**
+ * Returns number with the appropriate digit appended
+ * so that is passes a "luhnCheck".
+ * @param Number - Number to process.
+ * Must be all digits and not null.
+ */
+ public static String addLuhnDigit(String number) {
+ // I don't actually understand the alogorithm
+ // so we just use brute force to find the digit.
+ char[] digits = {'1','2','3','4','5','6','7','8','9','0'};
+ int c = number.length();
+ StringBuffer tryNumber = new StringBuffer(number + digits[0]);
+ int i;
+ for (i=0; i<10; i++) {
+ tryNumber.setCharAt(c,digits[i]);
+ if (luhnCheck(tryNumber.toString()))
+ break;
+ }
+ return tryNumber.toString();
+ }
+
+
+// ------------------------------------------------------------ Decimal
+
+
+ /**
+ * Default decimal pattern.
+ * http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html
+ */
+ public static String DECIMAL_PATTERN ="###,###.###";
+
+
+ /**
+ * Symbols that can be used in a decimal pattern.
*/
public static DecimalFormatSymbols getGenericDecimal(Locale locale) {
DecimalFormatSymbols symbols =
@@ -103,18 +186,20 @@
return symbols;
}
- /**
- * http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html
- */
- public static String DECIMAL_PATTERN ="###,###.###";
/**
- * http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html
+ * Return decimal number formatted for default or given locale.
*/
- public static String CURRENCY_PATTERN ="$" + DECIMAL_PATTERN;
+ public static String getDecimal(Number value, Locale locale) {
+ if (locale==null)
+ return (DecimalFormat.getInstance().format(value));
+ return (DecimalFormat.getInstance().format(value));
+ }
/**
+ * Return decimal number formatted for default or given locale
+ * using given pattern.
*/
public static String getDecimal(Number value, Locale locale, String pattern) {
NumberFormat formatter;
@@ -131,19 +216,76 @@
/**
+ * Return decimal for default locale using standard pattern.
*/
public static String getDecimal(Number value) {
return getDecimal(value,(Locale) null,DECIMAL_PATTERN);
}
+// ----------------------------------------------------------- Currency
+
+
+ /**
+ * Standard currency pattern.
+ * http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html
+ */
+ public static String CURRENCY_PATTERN ="$" + DECIMAL_PATTERN;
+
+
/**
+ * Return currency for default locale using standard pattern.
*/
public static String getCurrency(Number value) {
return getDecimal(value,null,CURRENCY_PATTERN);
}
+// --------------------------------------------------------------- Date
+
+
+ /**
+ * Default style for dates and times.
+ */
+ public static int DEFAULT = DateFormat.DEFAULT;
+
+
+ /**
+ * Short style for dates and times.
+ */
+ public static int SHORT = DateFormat.SHORT;
+
+
+ /**
+ * Medium style for dates and times.
+ */
+ public static int MEDIUM = DateFormat.MEDIUM;
+
+
+ /**
+ * Long style for dates and times.
+ */
+ public static int LONG = DateFormat.LONG;
+
+
+ /**
+ * Full style for dates and times.
+ */
+ public static int FULL = DateFormat.FULL;
+
+
+ /**
+ * Default lenient setting for getDate.
+ */
+ private static boolean LENIENT_DATE = false;
+
+
+ /**
+ * A "default" date format.
+ */
+ public static String ESCAPE_DATE_PATTERN = "yyyy-mm-dd";
+
+
/**
* Convert String to Date using given format.
* Returns null if conversion fails.
@@ -156,8 +298,14 @@
if (dateText == null) {
return null;
}
+ DateFormat df = null;
try {
- DateFormat df = new SimpleDateFormat(format);
+ if (format==null) {
+ df = new SimpleDateFormat();
+ }
+ else {
+ df = new SimpleDateFormat(format);
+ }
// setLenient avoids allowing dates like 9/32/2001
// which would otherwise parse to 10/2/2001
df.setLenient(false);
@@ -170,12 +318,6 @@
/**
- * Default lenient setting for getDate.
- */
- private static boolean LENIENT_DATE = false;
-
-
- /**
* Convert String to Date using given format.
* Returns null if conversion fails.
* Uses "strict" coNversion (lenient=false).
@@ -187,53 +329,31 @@
/**
- * A "default" date format.
- */
- public static String DEFAULT_DATE_PATTERN = "d-MMM-yy";
-
-
- /**
* Convert String to Date using a medium (weekday day month year) format.
* Returns null if conversion fails.
* Uses "strict" coNversion (lenient=false).
* @author Hal Deadman
*/
public static Date getDate(String dateString) {
- return getDate(dateString,DEFAULT_DATE_PATTERN,LENIENT_DATE);
+ return getDate(dateString,null,LENIENT_DATE);
}
/**
- * Default style for dates and times.
- */
- public static int DEFAULT = DateFormat.DEFAULT;
-
- /**
- * Short style for dates and times.
- */
- public static int SHORT = DateFormat.SHORT;
-
- /**
- * Medium style for dates and times.
+ * Return Date value using a String.
+ * Null or conversion error returns null.
+ * @param String representing Date
*/
- public static int MEDIUM = DateFormat.MEDIUM;
+ public static Date toDate(String string) {
+ if (string==null)
+ return null;
+ else try {
+ return getDate(string);
+ } catch (Throwable t) {
+ return null;
+ }
+ }
- /**
- * Long style for dates and times.
- */
- public static int LONG = DateFormat.LONG;
-
- /**
- * Full style for dates and times.
- */
- public static int FULL = DateFormat.FULL;
-
-/*
- dateFormatter = DateFormat.getDateInstance(DateFormat.DEFAULT,
- currentLocale);
- today = new Date();
- dateOut = dateFormatter.format(today);
-*/
/**
* Convert date to String for given locale in given style.
@@ -243,7 +363,7 @@
if (locale==null)
return (DateFormat.getDateInstance(style).format(date));
return (DateFormat.getDateInstance(style,locale).format(date));
- }
+ }
/**
@@ -254,40 +374,115 @@
return getDate(date,(Locale) null,style);
}
+
/**
* Convert date to String for default locale in DEFAULT style.
* A null locale will return the default locale.
*/
public static String getDate(Date date) {
return getDate(date,(Locale) null,DEFAULT);
- }
+ }
+
+
+ /**
+ * Return String value representing Date.
+ * Null returns null.
+ * @param Date
+ */
+ public static String toString(Date date) {
+ if (date==null)
+ return null;
+ else
+ return getDate(date);
+ }
+
+
+ /**
+ * Return String value representing Date.
+ * Null returns null.
+ * @param Date
+ */
+ public static String toEscape(Date date) {
+ if (date==null)
+ return null;
+ DateFormat df = null;
+ try {
+ df = new SimpleDateFormat(ESCAPE_DATE_PATTERN);
+ } catch (Throwable t) {
+ return null;
+ }
+ df.setLenient(false);
+ return df.format(date);
+ }
+
+
+// ---------------------------------------------------------- Timestamp
+
+
+ /**
+ * Escape string to create Timestamp representing
+ * "January 1, 1970 00:00:00".
+ */
+ public static String NULL_TIMESTAMP_TEXT = "1970-01-01 00:00:00";
+
+
+ /**
+ * Value needed to create Timestamp representing
+ * "January 1, 1970 00:00:00".
+ * From the documentation, you would think this would be
+ * Timestamp(0), but empirical tests show it to be
+ * Timestamp(18000000).
+ */
+ public static long NULL_TIME = (long) 18000000;
+
+
+ /**
+ * Timestamp representing "January 1, 1970 00:00:00".
+ */
+ public static Timestamp NULL_TIMESTAMP = new Timestamp(NULL_TIME);
+
+
+ /**
+ * Return null if timestamp is null or equals
+ * "January 1, 1970 00:00:00".
+ */
+ public static boolean isNull(Timestamp timestamp) {
+ return ((timestamp==null) || (timestamp.getTime()==NULL_TIME));
+ }
+
/**
* Convert timestamp to String for given locale in given style.
* A null locale will return the default locale.
*/
- public static String getTimestamp(Timestamp timestamp, Locale locale, int
style) {
+ public static String getTimestamp(Timestamp timestamp,
+ Locale locale, int style) {
Date date = (Date) timestamp;
if (locale==null)
- return (DateFormat.getDateTimeInstance(style,style).format(date));
- return (DateFormat.getDateTimeInstance(style,style,locale).format(date));
- }
+ return (DateFormat.getDateTimeInstance(style,style).
+ format(date));
+ return (DateFormat.getDateTimeInstance(style,style,locale).
+ format(date));
+ }
+
/**
* Convert date to String for default locale in given style.
* A null locale will return the default locale.
*/
- public static String getTimestamp(Timestamp timestamp, int style) {
+ public static String getTimestamp(Timestamp timestamp,
+ int style) {
return getTimestamp(timestamp,(Locale) null,style);
}
+
/**
* Convert date to String for default locale in DEFAULT style.
* A null locale will return the default locale.
*/
public static String getTimestamp(Timestamp timestamp) {
return getTimestamp(timestamp,(Locale) null,DEFAULT);
- }
+ }
/**
@@ -318,33 +513,62 @@
return timestamp.toString();
}
+}
- /**
- * Return Date value using a String.
- * Null or conversion error returns null.
- * @param String representing Date
- */
- public static Date toDate(String string) {
- if (string==null)
- return null;
- else try {
- return getDate(string);
- } catch (Throwable t) {
- return null;
- }
- }
-
- /**
- * Return String value representing Date.
- * Null returns null.
- * @param Date
- */
- public static String toString(Date date) {
- if (date==null)
- return null;
- else
- return getDate(date);
- }
-
-}
\ No newline at end of file
+/*
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Scaffold", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact [EMAIL PROTECTED]
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+**/
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>