/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma.datasource.spss.support;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public final class SpssDateValueConverters {
private SpssDateValueConverters() {}
private static abstract class AbstractDateValueConverter implements SpssValueConverter {
public abstract String getFormat(String value) throws SpssValueConversionException;
protected SpssValueConversionException createException(String value, String... formats) {
StringBuilder message = new StringBuilder("Failed to convert date value. Expected SPSS date formats are:");
for (String format : formats) message.append(" ").append(format);
return new SpssValueConversionException(message.toString(), value);
}
@Override
public String convert(String value) throws SpssValueConversionException {
SimpleDateFormat source = new SimpleDateFormat(getFormat(value));
try {
Date date = source.parse(value);
return new SimpleDateFormat("dd/MM/yyyy").format(date);
} catch(ParseException e) {
throw new SpssValueConversionException("Failed to convert date value.", e, value);
}
}
}
public static class ADateValueConverter extends AbstractDateValueConverter {
private static final String SHORT_ADATE = "MM/dd/yy";
private static final String LONG_ADATE = "MM/dd/yyyy";
@Override
public String getFormat(String value) throws SpssValueConversionException {
int length = value.length();
if(length == SHORT_ADATE.length()) {
return SHORT_ADATE;
} else if(length == LONG_ADATE.length()) {
return LONG_ADATE;
}
throw createException(SHORT_ADATE, LONG_ADATE);
}
}
public static class DateValueConverter extends AbstractDateValueConverter {
private static final String SHORT_DATE = "dd-MMM-yy";
private static final String LONG_DATE = "dd-MMM-yyyy";
@Override
public String getFormat(String value) throws SpssValueConversionException {
int length = value.length();
if(length == SHORT_DATE.length()) {
return SHORT_DATE;
} else if(length == LONG_DATE.length()) {
return LONG_DATE;
}
throw createException(SHORT_DATE, LONG_DATE);
}
}
public static class DateTimeValueConverter extends AbstractDateValueConverter {
private static final String SHORT_DATETIME = "dd-MMM-yyyy hh:mm";
private static final String LONG_DATETIME = "dd-MMM-yyyy hh:mm:ss";
@Override
public String getFormat(String value) throws SpssValueConversionException {
int length = value.length();
if(length == SHORT_DATETIME.length()) {
return SHORT_DATETIME;
} else if(length == LONG_DATETIME.length()) {
return LONG_DATETIME;
}
throw createException(SHORT_DATETIME, LONG_DATETIME);
}
}
}