easyJ.common.validate.GenericTypeValidator.java Source code

Java tutorial

Introduction

Here is the source code for easyJ.common.validate.GenericTypeValidator.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with this
 * work for additional information regarding copyright ownership. The ASF
 * licenses this file to You 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 easyJ.common.validate;

import java.io.Serializable;
import java.util.Date;
import java.util.Locale;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * This class contains basic methods for performing validations that return the
 * correctly typed class based on the validation performed.
 * 
 * @version $Revision: 1.1.1.1 $ $Date: 2008/05/12 09:53:37 $
 */
public class GenericTypeValidator implements Serializable {

    /**
     * Checks if the value can safely be converted to a byte primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @return the converted Byte value.
     */
    public static Byte formatByte(String value) {
        if (value == null) {
            return null;
        }

        try {
            return new Byte(value);
        } catch (NumberFormatException e) {
            return null;
        }

    }

    /**
     * Checks if the value can safely be converted to a byte primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @param locale
     *                The locale to use to parse the number (system default if
     *                null)
     * @return the converted Byte value.
     */
    public static Byte formatByte(String value, Locale locale) {
        Byte result = null;

        if (value != null) {
            NumberFormat formatter = null;
            if (locale != null) {
                formatter = NumberFormat.getNumberInstance(locale);
            } else {
                formatter = NumberFormat.getNumberInstance(Locale.getDefault());
            }
            formatter.setParseIntegerOnly(true);
            ParsePosition pos = new ParsePosition(0);
            Number num = formatter.parse(value, pos);

            // If there was no error and we used the whole string
            if (pos.getErrorIndex() == -1 && pos.getIndex() == value.length()) {
                if (num.doubleValue() >= Byte.MIN_VALUE && num.doubleValue() <= Byte.MAX_VALUE) {
                    result = new Byte(num.byteValue());
                }
            }
        }

        return result;
    }

    /**
     * Checks if the value can safely be converted to a short primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @return the converted Short value.
     */
    public static Short formatShort(String value) {
        if (value == null) {
            return null;
        }

        try {
            return new Short(value);
        } catch (NumberFormatException e) {
            return null;
        }

    }

    /**
     * Checks if the value can safely be converted to a short primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @param locale
     *                The locale to use to parse the number (system default if
     *                null)vv
     * @return the converted Short value.
     */
    public static Short formatShort(String value, Locale locale) {
        Short result = null;

        if (value != null) {
            NumberFormat formatter = null;
            if (locale != null) {
                formatter = NumberFormat.getNumberInstance(locale);
            } else {
                formatter = NumberFormat.getNumberInstance(Locale.getDefault());
            }
            formatter.setParseIntegerOnly(true);
            ParsePosition pos = new ParsePosition(0);
            Number num = formatter.parse(value, pos);

            // If there was no error and we used the whole string
            if (pos.getErrorIndex() == -1 && pos.getIndex() == value.length()) {
                if (num.doubleValue() >= Short.MIN_VALUE && num.doubleValue() <= Short.MAX_VALUE) {
                    result = new Short(num.shortValue());
                }
            }
        }

        return result;
    }

    /**
     * Checks if the value can safely be converted to a int primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @return the converted Integer value.
     */
    public static Integer formatInt(String value) {
        if (value == null) {
            return null;
        }

        try {
            return new Integer(value);
        } catch (NumberFormatException e) {
            return null;
        }

    }

    /**
     * Checks if the value can safely be converted to an int primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @param locale
     *                The locale to use to parse the number (system default if
     *                null)
     * @return the converted Integer value.
     */
    public static Integer formatInt(String value, Locale locale) {
        Integer result = null;

        if (value != null) {
            NumberFormat formatter = null;
            if (locale != null) {
                formatter = NumberFormat.getNumberInstance(locale);
            } else {
                formatter = NumberFormat.getNumberInstance(Locale.getDefault());
            }
            formatter.setParseIntegerOnly(true);
            ParsePosition pos = new ParsePosition(0);
            Number num = formatter.parse(value, pos);

            // If there was no error and we used the whole string
            if (pos.getErrorIndex() == -1 && pos.getIndex() == value.length()) {
                if (num.doubleValue() >= Integer.MIN_VALUE && num.doubleValue() <= Integer.MAX_VALUE) {
                    result = new Integer(num.intValue());
                }
            }
        }

        return result;
    }

    /**
     * Checks if the value can safely be converted to a long primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @return the converted Long value.
     */
    public static Long formatLong(String value) {
        if (value == null) {
            return null;
        }

        try {
            return new Long(value);
        } catch (NumberFormatException e) {
            return null;
        }

    }

    /**
     * Checks if the value can safely be converted to a long primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @param locale
     *                The locale to use to parse the number (system default if
     *                null)
     * @return the converted Long value.
     */
    public static Long formatLong(String value, Locale locale) {
        Long result = null;

        if (value != null) {
            NumberFormat formatter = null;
            if (locale != null) {
                formatter = NumberFormat.getNumberInstance(locale);
            } else {
                formatter = NumberFormat.getNumberInstance(Locale.getDefault());
            }
            formatter.setParseIntegerOnly(true);
            ParsePosition pos = new ParsePosition(0);
            Number num = formatter.parse(value, pos);

            // If there was no error and we used the whole string
            if (pos.getErrorIndex() == -1 && pos.getIndex() == value.length()) {
                if (num.doubleValue() >= Long.MIN_VALUE && num.doubleValue() <= Long.MAX_VALUE) {
                    result = new Long(num.longValue());
                }
            }
        }

        return result;
    }

    /**
     * Checks if the value can safely be converted to a float primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @return the converted Float value.
     */
    public static Float formatFloat(String value) {
        if (value == null) {
            return null;
        }

        try {
            return new Float(value);
        } catch (NumberFormatException e) {
            return null;
        }

    }

    /**
     * Checks if the value can safely be converted to a float primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @param locale
     *                The locale to use to parse the number (system default if
     *                null)
     * @return the converted Float value.
     */
    public static Float formatFloat(String value, Locale locale) {
        Float result = null;

        if (value != null) {
            NumberFormat formatter = null;
            if (locale != null) {
                formatter = NumberFormat.getInstance(locale);
            } else {
                formatter = NumberFormat.getInstance(Locale.getDefault());
            }
            ParsePosition pos = new ParsePosition(0);
            Number num = formatter.parse(value, pos);

            // If there was no error and we used the whole string
            if (pos.getErrorIndex() == -1 && pos.getIndex() == value.length()) {
                if (num.doubleValue() >= (Float.MAX_VALUE * -1) && num.doubleValue() <= Float.MAX_VALUE) {
                    result = new Float(num.floatValue());
                }
            }
        }

        return result;
    }

    /**
     * Checks if the value can safely be converted to a double primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @return the converted Double value.
     */
    public static Double formatDouble(String value) {
        if (value == null) {
            return null;
        }

        try {
            return new Double(value);
        } catch (NumberFormatException e) {
            return null;
        }

    }

    /**
     * Checks if the value can safely be converted to a double primitive.
     * 
     * @param value
     *                The value validation is being performed on.
     * @param locale
     *                The locale to use to parse the number (system default if
     *                null)
     * @return the converted Double value.
     */
    public static Double formatDouble(String value, Locale locale) {
        Double result = null;

        if (value != null) {
            NumberFormat formatter = null;
            if (locale != null) {
                formatter = NumberFormat.getInstance(locale);
            } else {
                formatter = NumberFormat.getInstance(Locale.getDefault());
            }
            ParsePosition pos = new ParsePosition(0);
            Number num = formatter.parse(value, pos);

            // If there was no error and we used the whole string
            if (pos.getErrorIndex() == -1 && pos.getIndex() == value.length()) {
                if (num.doubleValue() >= (Double.MAX_VALUE * -1) && num.doubleValue() <= Double.MAX_VALUE) {
                    result = new Double(num.doubleValue());
                }
            }
        }

        return result;
    }

    /**
     * <p>
     * Checks if the field is a valid date. The <code>Locale</code> is used
     * with <code>java.text.DateFormat</code>. The setLenient method is set
     * to <code>false</code> for all.
     * </p>
     * 
     * @param value
     *                The value validation is being performed on.
     * @param locale
     *                The Locale to use to parse the date (system default if
     *                null)
     * @return the converted Date value.
     */
    public static Date formatDate(String value, Locale locale) {
        Date date = null;

        if (value == null) {
            return null;
        }

        try {
            DateFormat formatter = null;
            if (locale != null) {
                formatter = DateFormat.getDateInstance(DateFormat.SHORT, locale);
            } else {
                formatter = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
            }

            formatter.setLenient(false);

            date = formatter.parse(value);
        } catch (ParseException e) {
            // Bad date so return null
            Log log = LogFactory.getLog(GenericTypeValidator.class);
            if (log.isDebugEnabled()) {
                log.debug("Date parse failed value=[" + value + "], " + "locale=[" + locale + "] " + e);
            }
        }

        return date;
    }

    /**
     * <p>
     * Checks if the field is a valid date. The pattern is used with
     * <code>java.text.SimpleDateFormat</code> . If strict is true, then the
     * length will be checked so '2/12/1999' will not pass validation with the
     * format 'MM/dd/yyyy' because the month isn't two digits. The setLenient
     * method is set to <code>false</code> for all.
     * </p>
     * 
     * @param value
     *                The value validation is being performed on.
     * @param datePattern
     *                The pattern passed to <code>SimpleDateFormat</code>.
     * @param strict
     *                Whether or not to have an exact match of the datePattern.
     * @return the converted Date value.
     */
    public static Date formatDate(String value, String datePattern, boolean strict) {
        Date date = null;

        if (value == null || datePattern == null || datePattern.length() == 0) {
            return null;
        }

        try {
            SimpleDateFormat formatter = new SimpleDateFormat(datePattern);
            formatter.setLenient(false);

            date = formatter.parse(value);

            if (strict) {
                if (datePattern.length() != value.length()) {
                    date = null;
                }
            }
        } catch (ParseException e) {
            // Bad date so return null
            Log log = LogFactory.getLog(GenericTypeValidator.class);
            if (log.isDebugEnabled()) {
                log.debug("Date parse failed value=[" + value + "], " + "pattern=[" + datePattern + "], "
                        + "strict=[" + strict + "] " + e);
            }
        }

        return date;
    }

    /**
     * <p>
     * Checks if the field is a valid credit card number.
     * </p>
     * <p>
     * Reference Sean M. Burke's <a
     * href="http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl"> script</a> .
     * </p>
     * 
     * @param value
     *                The value validation is being performed on.
     * @return the converted Credit Card number.
     */
    public static Long formatCreditCard(String value) {
        return GenericValidator.isCreditCard(value) ? new Long(value) : null;
    }

}