/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer.transform;
import java.text.ParseException;
import java.util.Date;
import java.util.logging.Level;
import org.geotools.data.DataStore;
import org.geoserver.importer.DatePattern;
import org.geoserver.importer.Dates;
import org.geoserver.importer.ImportTask;
import org.geoserver.importer.ValidationException;
import org.opengis.feature.simple.SimpleFeature;
/**
* Transform that converts a non date attribute in a date attribute.
* This class is not thread-safe.
*
* @author Justin Deoliveira, OpenGeo
*
*/
public class DateFormatTransform extends AttributeRemapTransform {
private static final long serialVersionUID = 1L;
DatePattern datePattern;
public DateFormatTransform(String field, String datePattern) throws ValidationException {
init(field,datePattern);
init();
}
DateFormatTransform() {
this(null,null);
}
public DatePattern getDatePattern() {
return datePattern;
}
public void setDatePattern(DatePattern datePattern) {
this.datePattern = datePattern;
}
private void init(String field, String datePattern) throws ValidationException {
setType(Date.class);
setField(field);
if (datePattern != null) {
this.datePattern = new DatePattern(datePattern, null, true, false);
//parse the date format to ensure its legal
try {
this.datePattern.dateFormat();
}
catch(IllegalArgumentException iae) {
throw new ValidationException("Invalid date parsing format",iae);
}
}
}
@Override
public SimpleFeature apply(ImportTask task, DataStore dataStore, SimpleFeature oldFeature,
SimpleFeature feature) throws Exception {
Object val = oldFeature.getAttribute(field);
if (val != null) {
Date parsed = parseDate(val.toString());
if (parsed == null) {
task.addMessage(Level.WARNING, "Invalid date '" + val + "' specified for " + feature.getID());
feature = null;
} else {
feature.setAttribute(field, parsed);
}
}
return feature;
}
public Date parseDate(String value) throws ParseException {
Date parsed = null;
// if a format was provided, use it
if (datePattern != null) {
parsed = datePattern.parse(value);
}
// fall back to others
if (parsed == null) {
parsed = Dates.parse(value);
}
if (parsed != null) {
return parsed;
}
throw new ParseException("Invalid date '" + value + "'", 0);
}
}