package prefuse.data.parser;
import java.sql.Date;
import java.text.DateFormat;
import java.text.ParsePosition;
/**
* DataParser instance that parses Date values as java.sql.Time instances,
* representing a particular date (but not a specific time on that day).
* This class uses a backing {@link java.text.DateFormat} instance to
* perform parsing. The DateFormat instance to use can be passed in to the
* constructor, or by default the DateFormat returned by
* {@link java.text.DateFormat#getDateInstance(int)} with an
* argument of {@link java.text.DateFormat#SHORT} is used.
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class DateParser implements DataParser {
protected DateFormat m_dfmt;
protected ParsePosition m_pos;
/**
* Create a new DateParser.
*/
public DateParser() {
this(DateFormat.getDateInstance(DateFormat.SHORT));
}
/**
* Create a new DateParser.
* @param dateFormat the DateFormat instance to use for parsing
*/
public DateParser(DateFormat dateFormat) {
m_dfmt = dateFormat;
m_pos = new ParsePosition(0);
}
/**
* Returns java.sql.Date.
* @see prefuse.data.parser.DataParser#getType()
*/
public Class getType() {
return Date.class;
}
/**
* @see prefuse.data.parser.DataParser#format(java.lang.Object)
*/
public String format(Object value) {
return value==null ? null : m_dfmt.format(value);
}
/**
* @see prefuse.data.parser.DataParser#canParse(java.lang.String)
*/
public boolean canParse(String text) {
try {
parseDate(text);
return true;
} catch ( DataParseException e ) {
return false;
}
}
/**
* @see prefuse.data.parser.DataParser#parse(java.lang.String)
*/
public Object parse(String text) throws DataParseException {
return parseDate(text);
}
/**
* Parse a Date value from a text string.
* @param text the text string to parse
* @return the parsed Date value
* @throws DataParseException if an error occurs during parsing
*/
public Date parseDate(String text) throws DataParseException {
m_pos.setErrorIndex(0);
m_pos.setIndex(0);
// parse the data value, convert to the wrapper type
Date d = null;
try {
d = Date.valueOf(text);
m_pos.setIndex(text.length());
} catch ( IllegalArgumentException e ) {
d = null;
}
if ( d == null ) {
java.util.Date d1 = m_dfmt.parse(text, m_pos);
if ( d1 != null ) {
d = new Date(d1.getTime());
}
}
// date format will parse substrings successfully, so we need
// to check the position to make sure the whole value was used
if ( d == null || m_pos.getIndex() < text.length() ) {
throw new DataParseException("Could not parse Date: "+text);
} else {
return d;
}
}
} // end of class DateParser