Merge pull request #1524 from OpenRefine/issue/1508
support project backward compatibility to old version of OpenRefine
This commit is contained in:
commit
74a6782ca0
@ -35,8 +35,12 @@ package com.google.refine.model;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.io.Writer;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.ZoneOffset;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.json.JSONException;
|
||||
@ -87,11 +91,19 @@ public class Cell implements HasFields, Jsonizable {
|
||||
} else {
|
||||
writer.key("v");
|
||||
if (value != null) {
|
||||
if (value instanceof LocalDateTime) {
|
||||
writer.value(ParsingUtilities.localDateToString((LocalDateTime)value));
|
||||
writer.key("t"); writer.value("date");
|
||||
Instant instant = null;
|
||||
if (value instanceof Calendar) {
|
||||
instant = ((Calendar)value).toInstant();
|
||||
} else if (value instanceof Date) {
|
||||
instant = ((Date)value).toInstant();
|
||||
} else if (value instanceof OffsetDateTime) {
|
||||
writer.value(ParsingUtilities.dateToString((OffsetDateTime) value));
|
||||
instant = ((OffsetDateTime)value).toInstant();
|
||||
} else if (value instanceof LocalDateTime) {
|
||||
instant = ((LocalDateTime)value).toInstant(ZoneOffset.of("Z"));
|
||||
}
|
||||
|
||||
if (instant != null) {
|
||||
writer.value(ParsingUtilities.instantToString(instant));
|
||||
writer.key("t"); writer.value("date");
|
||||
} else if (value instanceof Double
|
||||
&& (((Double)value).isNaN() || ((Double)value).isInfinite())) {
|
||||
|
@ -292,12 +292,9 @@ public class ProjectMetadata extends AbstractMetadata {
|
||||
|
||||
private void extractModifiedLocalTime(JSONObject obj) {
|
||||
String modified = JSONUtilities.getString(obj, "modified", LocalDateTime.now().toString());
|
||||
if (modified.endsWith("Z")) {
|
||||
this._modified = ParsingUtilities.stringToDate(modified).toLocalDateTime();
|
||||
} else {
|
||||
|
||||
this._modified = ParsingUtilities.stringToLocalDate(modified);
|
||||
}
|
||||
}
|
||||
|
||||
static protected void preparePreferenceStore(PreferenceStore ps) {
|
||||
ProjectManager.preparePreferenceStore(ps);
|
||||
|
@ -42,6 +42,7 @@ import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZoneOffset;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Properties;
|
||||
|
||||
@ -55,6 +56,8 @@ import org.json.JSONObject;
|
||||
import org.json.JSONTokener;
|
||||
|
||||
public class ParsingUtilities {
|
||||
public static final DateTimeFormatter ISO8601 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
|
||||
|
||||
static public Properties parseUrlParameters(HttpServletRequest request) {
|
||||
Properties options = new Properties();
|
||||
|
||||
@ -166,28 +169,39 @@ public class ParsingUtilities {
|
||||
* @return string with ISO_LOCAL_DATE_TIME formatted date & time
|
||||
*/
|
||||
static public String dateToString(OffsetDateTime d) {
|
||||
return d.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
|
||||
return d.format(ISO8601);
|
||||
}
|
||||
|
||||
static public String localDateToString(LocalDateTime d) {
|
||||
return d.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
|
||||
OffsetDateTime odt = OffsetDateTime.of(d,
|
||||
OffsetDateTime.now().getOffset());
|
||||
|
||||
return odt.withOffsetSameInstant(ZoneOffset.of("Z")).format(ISO8601);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse an ISO_LOCAL_DATE_TIME formatted string into a Java Date.
|
||||
* For backward compatibility, to support the version <= 2.8, cannot use the DateTimeFormatter.ISO_OFFSET_DATE_TIME. Instead, use the ISO8601 below format:
|
||||
* yyyy-MM-dd'T'HH:mm:ss'Z'
|
||||
*
|
||||
* @param s the string to be parsed
|
||||
* @return LocalDateTime or null if the parse failed
|
||||
*/
|
||||
static public OffsetDateTime stringToDate(String s) {
|
||||
return OffsetDateTime.parse(s, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
|
||||
Instant instant = Instant.parse(s);
|
||||
return OffsetDateTime.ofInstant(instant, ZoneId.of("Z"));
|
||||
}
|
||||
|
||||
static public LocalDateTime stringToLocalDate(String s) {
|
||||
if (s.endsWith("Z")) { // UTC time
|
||||
Instant instant = Instant.parse(s);
|
||||
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
|
||||
} else
|
||||
return LocalDateTime.parse(s, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
|
||||
}
|
||||
|
||||
static public String instantToString(Instant instant) {
|
||||
return OffsetDateTime.ofInstant(instant, ZoneId.of("Z")).format(ISO8601);
|
||||
}
|
||||
|
||||
static public String instantToLocalDateTimeString(Instant instant) {
|
||||
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).format(ISO8601);
|
||||
}
|
||||
}
|
||||
|
@ -40,9 +40,8 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@ -200,13 +199,13 @@ public class CsvExporterTests extends RefineTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void exportDateColumns(){
|
||||
public void exportDateColumnsPreVersion28(){
|
||||
CreateGrid(1,2);
|
||||
LocalDateTime localDate = LocalDateTime.now();
|
||||
OffsetDateTime date = OffsetDateTime.now(ZoneId.of("Z"));
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
Date date = new Date();
|
||||
|
||||
when(options.getProperty("printColumnHeader")).thenReturn("false");
|
||||
project.rows.get(0).cells.set(0, new Cell(localDate, null));
|
||||
project.rows.get(0).cells.set(0, new Cell(calendar, null));
|
||||
project.rows.get(0).cells.set(1, new Cell(date, null));
|
||||
|
||||
try {
|
||||
@ -215,12 +214,11 @@ public class CsvExporterTests extends RefineTest {
|
||||
Assert.fail();
|
||||
}
|
||||
|
||||
String expectedOutput = alignFractionalDigits(ParsingUtilities.localDateToString(localDate)) + "," +
|
||||
alignFractionalDigits(ParsingUtilities.dateToString(date)) + "\n";
|
||||
String expectedOutput = ParsingUtilities.instantToLocalDateTimeString(calendar.toInstant()) + "," +
|
||||
ParsingUtilities.instantToLocalDateTimeString(date.toInstant()) + "\n";
|
||||
|
||||
Assert.assertEquals(writer.toString(), expectedOutput);
|
||||
}
|
||||
|
||||
//helper methods
|
||||
|
||||
protected void CreateColumns(int noOfColumns){
|
||||
|
Loading…
Reference in New Issue
Block a user