Merge branch 'parse-orc-date' into bug5170

Conflicts:
	java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPublicCertificateDatabase.java
	java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java
This commit is contained in:
Aleksadnr Vanteev committed 2020-03-04 17:18:17 +03:00
commit 2e4273e5f5
3 files changed
+88 -13

No files matched your search

@@ -4,36 +4,62 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.text.ParseException;
import java.util.Arrays;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Ignore;
import org.junit.Test;
import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.common.BoatClassMasterdata;
import com.sap.sailing.domain.common.orc.ORCCertificate;
import com.sap.sailing.domain.orc.ORCPublicCertificateDatabase.CertificateHandle;
import com.sap.sailing.domain.orc.impl.ORCPublicCertificateDatabaseImpl;
import com.sap.sse.common.CountryCode;
import com.sap.sse.common.CountryCodeFactory;
import com.sap.sse.common.Util;
public class TestORCPublicCertificateDatabase {
private ORCPublicCertificateDatabase db;
@Rule
public IgnoreInvalidOrcCertificatesRule customIgnoreRule = new IgnoreInvalidOrcCertificatesRule();
Map<String, GregorianCalendar> dateComparisonMap = new LinkedHashMap<String, GregorianCalendar>();
List<String> dateFailureCases =null;
@Before
public void setUp() {
db = new ORCPublicCertificateDatabaseImpl();
/**
* By default GregorianCalendar month starts from 0 as January and so on. In below cases 1 specifies the date
* month as February.
*/
dateComparisonMap.put("2019-02-21T10:38:59Z", new GregorianCalendar(2019, 1, 21, 15, 38, 59));
dateComparisonMap.put("2019-02-21T12:00:00.000GMT+2", new GregorianCalendar(2019, 1, 21, 15, 00, 00));
dateComparisonMap.put("2019-02-21T15:00:00.000 GMT-2", new GregorianCalendar(2019, 1, 21, 22, 00, 00));
dateComparisonMap.put("2019-02-21T10:38:55.000-0800", new GregorianCalendar(2019, 1, 21, 23, 38, 55));
dateComparisonMap.put("2019-02-21T10:38:32.000+08:00", new GregorianCalendar(2019, 1, 21, 07, 38, 32));
dateComparisonMap.put("2019-02-21T10:38:09.000-06", new GregorianCalendar(2019, 1, 21, 21, 38, 9));
dateComparisonMap.put("2019-02-21T10:38:22.000Z", new GregorianCalendar(2019, 1, 21, 15, 38, 22));
dateComparisonMap.put("2019-02-21T10:38:00.000z", new GregorianCalendar(2019, 1, 21, 15, 38, 00));
dateComparisonMap.put("2019-02-21T10:38:46z", new GregorianCalendar(2019, 1, 21, 15, 38, 46));
dateComparisonMap.put("2019-02-21T10:38:17", new GregorianCalendar(2019, 1, 21, 15, 38, 17));
dateComparisonMap.put("2019-02-21T10:38:33.000", new GregorianCalendar(2019, 1, 21, 15, 38, 33));
dateFailureCases = Arrays.asList("2019-02-21T10:44GMT+2","2019-02-21T10:38+0800","2019-02-21T10:38+08:00",
"2019-02-21T10:38-08","2019-02-21T10:38Z","2019-02-21T10z","2019-02-21T10:38z");
}
@Test
@@ -1,6 +1,8 @@
package com.sap.sailing.domain.orc;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Future;
@@ -166,4 +168,6 @@ public interface ORCPublicCertificateDatabase {
* parameters.
*/
Future<Set<ORCCertificate>> search(String yachtName, String sailNumber, BoatClass boatClass);
Date parseDate(final String dateString) throws ParseException;
}
@@ -72,6 +72,8 @@ public class ORCPublicCertificateDatabaseImpl implements ORCPublicCertificateDat
private static final String ROOT_ELEMENT = "ROOT";
private static final String DATA_ELEMENT = "DATA";
private static final String ROW_ELEMENT = "ROW";
private static final String[] dateFormatsWithTimeZone = new String[] {"yyyy-MM-dd'T'HH:mm:ssX","yyyy-MM-dd'T'HH:mm:ss.SSSX"};
private static final String[] dateFormatsWithoutTimeZone = new String[] {"yyyy-MM-dd'T'HH:mm:ss.SSS","yyyy-MM-dd'T'HH:mm:ss"};
private static final DateFormat isoTimestampFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
/**
@@ -352,15 +354,58 @@ public class ORCPublicCertificateDatabaseImpl implements ORCPublicCertificateDat
}
private Date parseDate(String dateString) throws ParseException {
final StringBuilder stringBuilder = new StringBuilder(dateString);
final char timeZoneCharacter = stringBuilder.charAt(stringBuilder.length() - 1);
if (timeZoneCharacter == 'z' || timeZoneCharacter == 'Z' || timeZoneCharacter == 'X') {
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
// final StringBuilder stringBuilder = new StringBuilder(dateString);
// final char timeZoneCharacter = stringBuilder.charAt(stringBuilder.length() - 1);
// if (timeZoneCharacter == 'z' || timeZoneCharacter == 'Z' || timeZoneCharacter == 'X') {
// stringBuilder.deleteCharAt(stringBuilder.length() - 1);
// }
// if (stringBuilder.indexOf("+") == -1) {
// stringBuilder.append("+0000");
}
@Override
public Date parseDate(final String dateString) throws ParseException {
DateFormat dateFormat = null;
if (dateString.contains("GMT")) {
try {
return timeAsGmt(dateString);
} catch (Exception ex) {
logger.fine("Date is not in GMT format :" + dateString);
}
}
if (stringBuilder.indexOf("+") == -1) {
stringBuilder.append("+0000");
for (String df : dateFormatsWithTimeZone) {
try {
dateFormat = new SimpleDateFormat(df);
return dateFormat.parse(dateString);
} catch (Exception ex) {
logger.fine("Date is not parsable by " + df + " format :" + dateString);
}
}
for (String df : dateFormatsWithoutTimeZone) {
try {
TimeZone timeZone = TimeZone.getTimeZone("UTC");
dateFormat = new SimpleDateFormat(df);
dateFormat.setTimeZone(timeZone);
return dateFormat.parse(dateString);
} catch (Exception ex) {
logger.fine("Date is not parsable by " + df + " format :" + dateString);
}
}
logger.fine("Date is not parsable by any of the format :" + dateString);
throw new ParseException("Date is not parsable by any of the format :" + dateString,0);
}
private Date timeAsGmt(String dateTimeWithGMT) throws ParseException {
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
String[] dateSplit = dateTimeWithGMT.split(" ");
if (dateSplit.length < 2) {
dateSplit = dateTimeWithGMT.split("GMT");
sdf.setTimeZone(TimeZone.getTimeZone("GMT" + dateSplit[1]));
return sdf.parse(dateSplit[0]);
} else {
sdf.setTimeZone(TimeZone.getTimeZone(dateSplit[1]));
return sdf.parse(dateSplit[0]);
}
return isoTimestampFormat.parse(stringBuilder.toString());
}
@Override