diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPublicCertificateDatabase.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPublicCertificateDatabase.java index 3615c18bd03..4a5a8bcf3ab 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPublicCertificateDatabase.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPublicCertificateDatabase.java @@ -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 dateComparisonMap = new LinkedHashMap(); + List 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 diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/ORCPublicCertificateDatabase.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/ORCPublicCertificateDatabase.java index dd717b8b94e..02ed2d8ef72 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/ORCPublicCertificateDatabase.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/ORCPublicCertificateDatabase.java @@ -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> search(String yachtName, String sailNumber, BoatClass boatClass); + + Date parseDate(final String dateString) throws ParseException; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java index 784f202a493..cf7177b6db6 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java @@ -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