at.spardat.enterprise.fmt.ADateFmtJavaUtilText Maven / Gradle / Ivy
/*******************************************************************************
* Copyright (c) 2003, 2007 s IT Solutions AT Spardat GmbH .
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* s IT Solutions AT Spardat GmbH - initial API and implementation
*******************************************************************************/
// @(#) $Id: ADateFmtJavaUtilText.java 2093 2007-11-28 14:23:36Z s3460 $
package at.spardat.enterprise.fmt;
import java.util.*;
import java.text.*;
import at.spardat.enterprise.util.DateUtil;
/**
* This class wraps the default behaviour of the JDK regarding formatting and parsing of
* Dates. The provided styles are mapped to the corresponding styles of the class
* java.text.DateFormat.
*/
public class ADateFmtJavaUtilText extends ADateFmt {
// the instance used internally to format
private DateFormat dateFormat_;
/**
* Constructs an ADateFmt providing a style and a locale.
*
* @param style one of MANDATORY, SHORT, MEDIUM, LONG or FULL.
* @param l the locale to use
*/
public ADateFmtJavaUtilText (int style, Locale l) {
style_ = style;
int jdkStyle = DateFormat.MEDIUM;
if ((style & SHORT) != 0) jdkStyle = DateFormat.SHORT;
else if ((style & LONG) != 0) jdkStyle = DateFormat.LONG;
else if ((style & FULL) != 0) jdkStyle = DateFormat.FULL;
dateFormat_ = DateFormat.getDateInstance (jdkStyle, l);
dateFormat_.setLenient (false);
}
/**
* Constructs an ADateFmt providing a pattern as specified in
* java.text.SimpleDateFormat.
*
* @param pattern see java.text.SimpleDateFormat
* @param style may be MANDATORY
*/
public ADateFmtJavaUtilText (String pattern, int style) {
dateFormat_ = new SimpleDateFormat (pattern);
style_ = style;
}
/**
* Constructs an ADateFmt providing a pattern as specified in
* java.text.SimpleDateFormat.
*
* @param pattern see java.text.SimpleDateFormat
* @param style may be MANDATORY
*/
public ADateFmtJavaUtilText (String pattern, int style, Locale locale) {
dateFormat_ = new SimpleDateFormat (pattern, locale);
style_ = style;
}
/**
* @see at.spardat.enterprise.fmt.IFmt#parse(String)
*/
public String parse (String external) throws AParseException {
String internal = parse2 (external);
checkMandatory(internal);
checkDateRange(internal);
return internal;
}
/**
* Does the work of parse without the mandatory-check
*/
private String parse2 (String external) throws AParseException {
// trim blanks on both sides
if (external == null) return "";
external = external.trim();
if (external.length() == 0) return "";
else {
ParsePosition pp = new ParsePosition(0);
Date date = null;
date = dateFormat_.parse(external, pp);
if (date == null || pp.getIndex() != external.length()) {
throw new FmtParseException ("ADateSyntax", getSampleDate());
}
// check, if the date we got is within its valid range
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
DateUtil.DMY dmy = DateUtil.getDMY(cal);
if (!DateUtil.isValid(dmy)) {
throw new FmtParseException ("ADateSyntax", getSampleDate());
}
return DateUtil.DMY2Internal(dmy);
}
}
/**
* @see at.spardat.enterprise.fmt.IFmt#format(String)
*/
public String format (String internal) {
if (internal == null || internal.length() == 0) return "";
return dateFormat_.format(DateUtil.internal2Gregorian(internal).getTime());
}
/**
* @see at.spardat.enterprise.fmt.IFmt#maxLenOfExternal()
*/
public int maxLenOfExternal () {
return 50;
}
/**
* @see at.spardat.enterprise.fmt.IFmt#isLegalExternalChar(char)
*/
public boolean isLegalExternalChar (char aChar) {
// we don't know here either
return true;
}
/**
* @see at.spardat.enterprise.fmt.IFmt#isOneWay()
*/
public boolean isOneWay () {
return false;
}
/**
* Provides a sample date for use in error-messages.
*/
private String getSampleDate () {
return dateFormat_.format(new GregorianCalendar().getTime());
}
/**
* @see at.spardat.enterprise.fmt.IFmt#clone()
*/
public Object clone() {
Object toReturn = super.clone();
((ADateFmtJavaUtilText)toReturn).dateFormat_ = (DateFormat)dateFormat_.clone();
return toReturn;
}
}