2020-04-27 14:52:31 +02:00
|
|
|
|
2020-02-13 16:49:45 +01:00
|
|
|
package eu.dnetlib.dhp.utils.saxon;
|
|
|
|
|
2020-04-18 12:42:58 +02:00
|
|
|
import java.text.ParseException;
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
import java.util.Date;
|
2020-04-28 11:23:29 +02:00
|
|
|
|
2020-02-13 16:49:45 +01:00
|
|
|
import net.sf.saxon.expr.XPathContext;
|
|
|
|
import net.sf.saxon.om.Sequence;
|
|
|
|
import net.sf.saxon.trans.XPathException;
|
|
|
|
import net.sf.saxon.value.SequenceType;
|
|
|
|
import net.sf.saxon.value.StringValue;
|
|
|
|
|
|
|
|
public class NormalizeDate extends AbstractExtensionFunction {
|
|
|
|
|
2020-04-27 14:52:31 +02:00
|
|
|
private static final String[] normalizeDateFormats = {
|
|
|
|
"yyyy-MM-dd'T'hh:mm:ss", "yyyy-MM-dd", "yyyy/MM/dd", "yyyy"
|
|
|
|
};
|
2020-02-13 16:49:45 +01:00
|
|
|
|
2020-04-29 19:09:07 +02:00
|
|
|
private static final String normalizeOutFormat = "yyyy-MM-dd'T'hh:mm:ss'Z'";
|
2020-02-13 16:49:45 +01:00
|
|
|
|
2020-04-27 14:52:31 +02:00
|
|
|
@Override
|
|
|
|
public String getName() {
|
|
|
|
return "normalizeDate";
|
|
|
|
}
|
2020-02-13 16:49:45 +01:00
|
|
|
|
2020-04-27 14:52:31 +02:00
|
|
|
@Override
|
|
|
|
public Sequence doCall(XPathContext context, Sequence[] arguments) throws XPathException {
|
|
|
|
if (arguments == null | arguments.length == 0) {
|
|
|
|
return new StringValue("");
|
|
|
|
}
|
|
|
|
String s = arguments[0].head().getStringValue();
|
|
|
|
return new StringValue(_year(s));
|
|
|
|
}
|
2020-02-13 16:49:45 +01:00
|
|
|
|
2020-04-27 14:52:31 +02:00
|
|
|
@Override
|
|
|
|
public int getMinimumNumberOfArguments() {
|
|
|
|
return 0;
|
|
|
|
}
|
2020-02-13 16:49:45 +01:00
|
|
|
|
2020-04-27 14:52:31 +02:00
|
|
|
@Override
|
|
|
|
public int getMaximumNumberOfArguments() {
|
|
|
|
return 1;
|
|
|
|
}
|
2020-02-13 16:49:45 +01:00
|
|
|
|
2020-04-27 14:52:31 +02:00
|
|
|
@Override
|
|
|
|
public SequenceType[] getArgumentTypes() {
|
|
|
|
return new SequenceType[] {
|
|
|
|
SequenceType.OPTIONAL_ITEM
|
|
|
|
};
|
|
|
|
}
|
2020-02-13 16:49:45 +01:00
|
|
|
|
2020-04-27 14:52:31 +02:00
|
|
|
@Override
|
|
|
|
public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) {
|
|
|
|
return SequenceType.SINGLE_STRING;
|
|
|
|
}
|
2020-02-13 16:49:45 +01:00
|
|
|
|
2020-04-27 14:52:31 +02:00
|
|
|
private String _year(String s) {
|
|
|
|
final String date = s != null ? s.trim() : "";
|
2020-02-13 16:49:45 +01:00
|
|
|
|
2020-04-27 14:52:31 +02:00
|
|
|
for (String format : normalizeDateFormats) {
|
|
|
|
try {
|
|
|
|
Date parse = new SimpleDateFormat(format).parse(date);
|
|
|
|
String res = new SimpleDateFormat(normalizeOutFormat).format(parse);
|
|
|
|
return res;
|
|
|
|
} catch (ParseException e) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
2020-02-13 16:49:45 +01:00
|
|
|
}
|