/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.operation.imports;
import net.codjo.persistent.Reference;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Classe permettant d'importer une Date.
*
* <p>
* Le format de date en entr�e peut �tre de 6 types diff�rents.
* </p>
*
* @author $Author: blazart $
* @version $Revision: 1.3 $
*/
class DateFieldImport extends FieldImport {
/** Type de format de date en entr�e */
private DateFormat formatIN;
private int inputDateFormat;
/** Date NULL. ex: pour le format YYYY_MM_DD_SLASH la nullDate est "0000/00/00" */
private String nullDate;
/**
* Constructor for the DateFieldImport object
*
* @param ref Description of Parameter
* @param dbName Nom du champ DB de destination.
* @param dateFormat Format de date en entr�e.
*/
public DateFieldImport(Reference ref, String dbName, int dateFormat) {
super(ref, dbName);
init(dateFormat);
}
/**
* Constructor for test.
*
* @param dbName Nom du champ DB de destination.
* @param dateFormat Format de date en entr�e.
*/
DateFieldImport(String dbName, int dateFormat) {
super(dbName);
init(dateFormat);
}
/**
* Retourne le Format de Date en entree
*
* @return Le INPUT_DATE_FORMAT.
*/
public int getInputDateFormat() {
return inputDateFormat;
}
/**
* Retourne le type SQL de l'objet produit par convertFieldToSQL.
*
* @return java.sql.Types.DATE.
*/
public int getSQLType() {
return java.sql.Types.DATE;
}
/**
* Traduction du champ en objet Date SQL.
*
* <p>
* La date retourn�e est de type java.sql.Date.
* </p>
*
* @param field Champ � traduire.
*
* @return Le champ en format SQL.
*
* @exception BadFormatException Mauvais format de date
*/
public Object translateField(String field) throws BadFormatException {
if (field == null) {
return null;
}
if ("".equals(field)) {
return null;
}
if (field.equals(nullDate)) {
return null;
}
try {
Date date = formatIN.parse(field);
detectUndectedError(field);
return new java.sql.Date(date.getTime());
}
catch (java.text.ParseException ex) {
throw new BadFormatException(this, ex.getMessage());
}
}
/**
* Detecte quelques erreurs non vue par le formater.
*
* @param field
*
* @exception BadFormatException
*
* @see DateFieldImportTest#test_translateField_ErrorFormatYear()
* @see DateFieldImportTest#test_translateField_ErrorALaCon()
*/
private void detectUndectedError(String field)
throws BadFormatException {
if (nullDate.length() != field.length()) {
throw new BadFormatException(this,
"Mauvais format de date " + "(format " + nullDate + " mais " + field
+ " )");
}
for (int i = 0; i < field.length(); i++) {
if ((nullDate.charAt(i) != '0' && nullDate.charAt(i) != field.charAt(i))
|| field.charAt(i) == ' ') {
throw new BadFormatException(this,
"Mauvais format de date " + "(format " + nullDate + " mais " + field
+ " )");
}
}
}
/**
* Init.
*
* @param dateFormat format de date.
*
* @throws IllegalArgumentException TODO
*/
private void init(int dateFormat) {
switch (dateFormat) {
case FieldImportHome.YYYYMMDD:
formatIN = new SimpleDateFormat("yyyyMMdd");
nullDate = "00000000";
break;
case FieldImportHome.YYYY_MM_DD_HYPHEN:
formatIN = new SimpleDateFormat("yyyy-MM-dd");
nullDate = "0000-00-00";
break;
case FieldImportHome.YYYY_MM_DD_SLASH:
formatIN = new SimpleDateFormat("yyyy/MM/dd");
nullDate = "0000/00/00";
break;
case FieldImportHome.DD_MM_YY_HYPHEN:
formatIN = new SimpleDateFormat("dd-MM-yy");
nullDate = "00-00-00";
break;
case FieldImportHome.DD_MM_YYYY_HYPHEN:
formatIN = new SimpleDateFormat("dd-MM-yyyy");
nullDate = "00-00-0000";
break;
case FieldImportHome.DDMMYYYY:
formatIN = new SimpleDateFormat("ddMMyyyy");
nullDate = "00000000";
break;
case FieldImportHome.DD_MM_YYYY_SLASH:
formatIN = new SimpleDateFormat("dd/MM/yyyy");
nullDate = "00/00/0000";
break;
case FieldImportHome.DD_MM_YY_SLASH:
formatIN = new SimpleDateFormat("dd/MM/yy");
nullDate = "00/00/00";
break;
default:
throw new IllegalArgumentException("Mauvais format de date");
}
inputDateFormat = dateFormat;
formatIN.setLenient(false);
}
}