From 971ee13f15e0d91c165edec6d5cb99a5bff8c301 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 16 Jan 2018 16:15:38 +0100 Subject: [PATCH 1/9] Bug 4419: Adjusted expedition all in one import to properly work with replication --- .../impl/ExpeditionAllInOneImporter.java | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java index 9a0dec2752b..0020e45a5a2 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/ExpeditionAllInOneImporter.java @@ -10,6 +10,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.UUID; @@ -29,8 +30,6 @@ import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; -import com.sap.sailing.domain.base.impl.FleetImpl; -import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.RankingMetrics; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; @@ -39,13 +38,14 @@ import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.WindSourceType; +import com.sap.sailing.domain.common.dto.FleetDTO; +import com.sap.sailing.domain.common.dto.RegattaCreationParametersDTO; +import com.sap.sailing.domain.common.dto.SeriesCreationParametersDTO; import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter; -import com.sap.sailing.domain.ranking.RankingMetricConstructor; -import com.sap.sailing.domain.ranking.RankingMetricsFactory; import com.sap.sailing.domain.trackimport.DoubleVectorFixImporter; import com.sap.sailing.domain.trackimport.GPSFixImporter; import com.sap.sailing.domain.tracking.DynamicTrackedRace; @@ -57,6 +57,10 @@ import com.sap.sailing.server.gateway.windimport.AbstractWindImporter; import com.sap.sailing.server.gateway.windimport.AbstractWindImporter.WindImportResult; import com.sap.sailing.server.gateway.windimport.expedition.WindImporter; import com.sap.sailing.server.operationaltransformation.AddColumnToSeries; +import com.sap.sailing.server.operationaltransformation.AddSpecificRegatta; +import com.sap.sailing.server.operationaltransformation.CreateLeaderboardGroup; +import com.sap.sailing.server.operationaltransformation.CreateRegattaLeaderboard; +import com.sap.sailing.server.operationaltransformation.UpdateEvent; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TypeBasedServiceFinderFactory; import com.sap.sse.common.Util.Pair; @@ -202,26 +206,32 @@ public class ExpeditionAllInOneImporter { UUID.randomUUID()); service.addCourseAreas(event.getId(), new String[] { courseAreaName }, new UUID[] { courseAreaId }); - final Series series = new SeriesImpl(seriesName, /* isMedal */ false, /* isFleetsCanRunInParallel */ false, - Collections.singleton(new FleetImpl(fleetName)), Collections.emptySet(), - /* trackedRegattaRegistry */ service); final ScoringScheme scoringScheme = service.getBaseDomainFactory().createScoringScheme(scoringSchemeType); - final RankingMetricConstructor rankingMetricConstructor = RankingMetricsFactory - .getRankingMetricConstructor(rankingMetric); - final Regatta regatta = service.createRegatta(regattaNameAndleaderboardName, boatClassName, null, null, UUID.randomUUID(), - Collections.singleton(series), true, scoringScheme, courseAreaId, buoyZoneRadiusInHullLengths, true, - false, rankingMetricConstructor); + + final LinkedHashMap seriesCreationParameters = new LinkedHashMap<>(); + final List fleets = new ArrayList<>(); + fleets.add(new FleetDTO(fleetName, 0, null)); + seriesCreationParameters.put(seriesName, + new SeriesCreationParametersDTO(fleets, /*isMedal*/ false, + /* isFleetsCanRunInParallel */ false, /*isStartsWithZeroScore*/ false, /*firstColumnIsNonDiscardableCarryForward*/false, /*discardingThresholds*/ null, + /*hasSplitFleetContiguousScoring*/ false, /*maximumNumberOfDiscards*/ null)); + final RegattaCreationParametersDTO regattaCreationParameters = new RegattaCreationParametersDTO( + seriesCreationParameters); + + final Regatta regatta = service.apply(new AddSpecificRegatta(regattaNameAndleaderboardName, boatClassName, null, null, UUID.randomUUID(), + regattaCreationParameters, true, scoringScheme, courseAreaId, buoyZoneRadiusInHullLengths, true, + false, rankingMetric)); this.ensureBoatClassDetermination(regatta); service.apply(new AddColumnToSeries(regattaIdentifier, seriesName, raceColumnName)); - final RegattaLeaderboard regattaLeaderboard = service.addRegattaLeaderboard(regattaIdentifier, null, - discardThresholds); + final RegattaLeaderboard regattaLeaderboard = service.apply(new CreateRegattaLeaderboard(regattaIdentifier, null, + discardThresholds)); - final LeaderboardGroup leaderboardGroup = service.addLeaderboardGroup(UUID.randomUUID(), leaderboardGroupName, - description, null, false, Collections.singletonList(regattaNameAndleaderboardName), null, null); - service.updateEvent(event.getId(), event.getName(), event.getDescription(), event.getStartDate(), + final LeaderboardGroup leaderboardGroup = service.apply(new CreateLeaderboardGroup(leaderboardGroupName, + description, null, false, Collections.singletonList(regattaNameAndleaderboardName), null, null)); + service.apply(new UpdateEvent(event.getId(), event.getName(), event.getDescription(), event.getStartDate(), event.getEndDate(), event.getVenue().getName(), event.isPublic(), Collections.singleton(leaderboardGroup.getId()), event.getOfficialWebsiteURL(), event.getBaseURL(), - event.getSailorsInfoWebsiteURLs(), event.getImages(), event.getVideos()); + event.getSailorsInfoWebsiteURLs(), event.getImages(), event.getVideos())); final RaceColumn raceColumn = regattaLeaderboard.getRaceColumns().iterator().next(); final Fleet fleet = raceColumn.getFleets().iterator().next(); From baa2df5dd438fb09b7994a97097de090bc97e27f Mon Sep 17 00:00:00 2001 From: Joel Buerkle Date: Tue, 23 Jan 2018 07:52:06 +0000 Subject: [PATCH 2/9] Updating info regarding login process in the local admin console --- wiki/howto/onboarding.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wiki/howto/onboarding.md b/wiki/howto/onboarding.md index a4039dac651..a162b1b815f 100644 --- a/wiki/howto/onboarding.md +++ b/wiki/howto/onboarding.md @@ -85,14 +85,14 @@ The primary Git repository for the project is hosted on sapsailing.com. It is mi * Wait until the target platform has been resolved completely * Rebuild all projects 4. Run the Race Analysis Suite - * Start the MongoDB (cd /somePathto MongoDB/mongodb/bin; rm c:/data/SAP/sailing/mongodb/mongod.lock; ./mongod --dbpath c:/data/SAP/sailing/mongodb) + * Start the MongoDB (cd /somePathTo MongoDB/mongodb/bin; rm c:/data/SAP/sailing/mongodb/mongod.lock; ./mongod --dbpath c:/data/SAP/sailing/mongodb) * Start the appropriate Eclipse launch configuration (e.g. 'Sailing Server (Proxy)') You´ll find this in the debug dropdown - * Run "Security UI sdm" in the debug dropdown + * Run "Security UI sdm" in the debug dropdown (obsolete) * Run "SailingGWT sdm" in the debug dropdown 5. Import races within the Race Analysis Suite - * Choose "Security UI sdm" in the upper left corner of the "Development Mode" Tab in Eclipse and open "...Login.html" in your browser - * Default Login: user "admin", password "admin" + * Choose "Security UI sdm" in the upper left corner of the "Development Mode" Tab in Eclipse and open "...Login.html" in your browser (obsolete) * Choose "SailingGWT sdm" in the "Development Mode" Tab and open "...AdminConsole.html..." (It is normal that the first try fails. Reload the page after the first try) + * Default Login: user "admin", password "admin" * In the list on the left, click on "Connectors" * For TracTrac Events: In the "TracTrac Connections" Form, fill in the JSON URL http://germanmaster.traclive.dk/events/event_20120905_erEuropean/jsonservice.php (all other required information will be filled in automatically) * Press "List Races" From 441f547cbed15e8f84faa969e2a417ed83e4140e Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 23 Jan 2018 09:23:08 +0100 Subject: [PATCH 3/9] Added startupUrls to v3 launch config --- java/com.sap.sailing.gwt.ui/SailingGWT sdm (v3).launch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT sdm (v3).launch b/java/com.sap.sailing.gwt.ui/SailingGWT sdm (v3).launch index 10dd96c1286..a00aa2dbbaf 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT sdm (v3).launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT sdm (v3).launch @@ -100,7 +100,7 @@ - + From ddd42f6b5ef7a62eb43f4d6d32bd156867431f6d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 23 Jan 2018 17:53:23 +0100 Subject: [PATCH 4/9] for independence of NOAA for declination, started an implementation using the University of Colorado's WMM interface Change-Id: I68681d853fca2548e56057328d8e1bf714cf3e27 --- .../.classpath | 1 + .../build.properties | 3 +- .../resources/colorado.xml | 87 ++++++++++++++ .../declination/test/ColoradoTest.java | 24 ++++ .../declination/impl/ColoradoImporter.java | 107 ++++++++++++++++++ .../gwt/ui/client/StringMessages.properties | 2 +- 6 files changed, 222 insertions(+), 2 deletions(-) create mode 100755 java/com.sap.sailing.declination.test/resources/colorado.xml create mode 100755 java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoTest.java create mode 100755 java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/ColoradoImporter.java diff --git a/java/com.sap.sailing.declination.test/.classpath b/java/com.sap.sailing.declination.test/.classpath index 4f83b2397ec..03c4ce9fdd8 100644 --- a/java/com.sap.sailing.declination.test/.classpath +++ b/java/com.sap.sailing.declination.test/.classpath @@ -2,6 +2,7 @@ + diff --git a/java/com.sap.sailing.declination.test/build.properties b/java/com.sap.sailing.declination.test/build.properties index 34d2e4d2dad..f11210d3f2c 100755 --- a/java/com.sap.sailing.declination.test/build.properties +++ b/java/com.sap.sailing.declination.test/build.properties @@ -1,4 +1,5 @@ -source.. = src/ +source.. = src/,\ + resources/ output.. = bin/ bin.includes = META-INF/,\ . diff --git a/java/com.sap.sailing.declination.test/resources/colorado.xml b/java/com.sap.sailing.declination.test/resources/colorado.xml new file mode 100755 index 00000000000..f38588d2801 --- /dev/null +++ b/java/com.sap.sailing.declination.test/resources/colorado.xml @@ -0,0 +1,87 @@ + + + +0.5.0.7 + + + +2018.06027 + + +10.00000 + + +20.00000 + + +0.00000 + + +1.89255 + + +-1.78053 + + +34687.2 + + +34704.0 + + +34668.3 + + +1145.5 + + +-1078.3 + + +0.10649 + + +-0.01038 + + +11.3 + + +11.5 + + +9.2 + + +64.8 + + +-6.6 + + +0.29 + + +0.22 + + +133 + + +152 + + +89 + + +138 + + +165 + + + + +1.1 + + \ No newline at end of file diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoTest.java new file mode 100755 index 00000000000..a0b6ea1ca73 --- /dev/null +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoTest.java @@ -0,0 +1,24 @@ +package com.sap.sailing.declination.test; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; + +import org.junit.Test; +import org.xml.sax.SAXException; + +import com.sap.sailing.declination.Declination; +import com.sap.sailing.declination.impl.ColoradoImporter; + +public class ColoradoTest { + @Test + public void simpleDocumentParsingTest() throws SAXException, IOException, ParserConfigurationException { + final Declination declination = new ColoradoImporter().getDeclinationFromXml(getClass().getResourceAsStream("/colorado.xml")); + assertEquals(10.0, declination.getPosition().getLatDeg(), 0.000001); + assertEquals(20.0, declination.getPosition().getLngDeg(), 0.000001); + assertEquals(1.89255, declination.getBearing().getDegrees(), 0.000001); + assertEquals(0.10649, declination.getAnnualChange().getDegrees(), 0.000001); + } +} diff --git a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/ColoradoImporter.java b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/ColoradoImporter.java new file mode 100755 index 00000000000..ee0d7d8d033 --- /dev/null +++ b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/ColoradoImporter.java @@ -0,0 +1,107 @@ +package com.sap.sailing.declination.impl; + +import java.io.IOException; +import java.io.InputStream; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import com.sap.sailing.declination.Declination; +import com.sap.sailing.domain.common.impl.DegreeBearingImpl; +import com.sap.sailing.domain.common.impl.DegreePosition; +import com.sap.sse.common.impl.MillisecondsTimePoint; + +/** + * A typical request for the Geomag service looks like this: + *
+ *   http://magcalc.geomag.info/?model=WMM2015&sourcePage=oldCalc&decimalLatitude=10&decimalLongitude=20&minYear=2018&minMonth=1&minDay=23
+ * 
+ * The response serves an XML document that has elements like this: + *
+ * <DATE>
+ * 2018.06027
+ * </DATE>
+ * <LATITUDE units = "Degree">
+ *  10.00000
+ * </LATITUDE>
+ * <LONGITUDE units="Degree">
+ *  20.00000
+ * </LONGITUDE>
+ * <DECLINATION units="Degree">
+ *  1.89255
+ * </DECLINATION>
+ * <DECLINATION_SV units="Degree">
+ *  0.10649
+ * </DECLINATION_SV>
+ * 
+ * representing the declination in degrees, as well as its annual change. + * + * @author Axel Uhl (D043530) + * + */ +public class ColoradoImporter { + private static class XmlElementHandler extends DefaultHandler { + private double dateAsDecimalYear; + private double latDeg; + private double lngDeg; + private double declinationDeg; + private double annualDeclinationChangeDeg; + + private StringBuilder elementContent; + + public XmlElementHandler() { + elementContent = new StringBuilder(); + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) + throws SAXException { + elementContent.delete(0, elementContent.length()); + super.startElement(uri, localName, qName, attributes); + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + elementContent.append(ch, start, length); + super.characters(ch, start, length); + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + final String content = elementContent.toString(); + switch (qName) { + case "DATE": + dateAsDecimalYear = Double.valueOf(content); + break; + case "LATITUDE": + latDeg = Double.valueOf(content); + break; + case "LONGITUDE": + lngDeg = Double.valueOf(content); + break; + case "DECLINATION": + declinationDeg = Double.valueOf(content); + break; + case "DECLINATION_SV": + annualDeclinationChangeDeg = Double.valueOf(content); + break; + } + super.endElement(uri, localName, qName); + } + + Declination getDeclination() { + return new DeclinationRecordImpl(new DegreePosition(latDeg, lngDeg), new MillisecondsTimePoint((long) ((dateAsDecimalYear-1970.)*365.0*24.0*3600.0*1000.0)), + new DegreeBearingImpl(declinationDeg), new DegreeBearingImpl(annualDeclinationChangeDeg)); + } + } + + public Declination getDeclinationFromXml(InputStream is) throws SAXException, IOException, ParserConfigurationException { + XmlElementHandler handler = new XmlElementHandler(); + SAXParserFactory.newInstance().newSAXParser().parse(is, handler); + return handler.getDeclination(); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index a2f4b697e0e..b2f156256fa 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -2030,7 +2030,7 @@ totalDistanceFoiledInMetersTooltip=Total distance foiled, across the entire lead threeSixtyVideoHint=This is a 360° video, the camera can be turned processingMP4=Mp4 is analyzed (this will take a few Seconds) resetStartTimeToDefault=Set to default -importFullExpeditionData=Import full expedition data +importFullExpeditionData=Import full Expedition data importCanceledNoCompetitorAdded=No competitor was added! Import will be canceled. importCanceledByUser=Import canceled! importFinished=Finished importing data From 3e7e96f4d0b404e78539a417165cbf4e56baeafb Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 23 Jan 2018 18:14:30 +0100 Subject: [PATCH 5/9] introduced abstract DeclinationImporter class of which now NOAAImporter and ColoradoImporter are two different implementations Change-Id: Icc993ccb6b7111a5e30046f09c595d5445ccbf7c --- .../declination/test/ColoradoTest.java | 19 ++++++ .../declination/impl/ColoradoImporter.java | 19 +++++- .../declination/impl/DeclinationImporter.java | 63 +++++++++++++++++++ .../declination/impl/NOAAImporter.java | 49 +-------------- 4 files changed, 102 insertions(+), 48 deletions(-) create mode 100755 java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationImporter.java diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoTest.java index a0b6ea1ca73..8f6b3aca688 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoTest.java @@ -3,6 +3,9 @@ package com.sap.sailing.declination.test; import static org.junit.Assert.assertEquals; import java.io.IOException; +import java.text.ParseException; +import java.util.GregorianCalendar; +import java.util.TimeZone; import javax.xml.parsers.ParserConfigurationException; @@ -11,14 +14,30 @@ import org.xml.sax.SAXException; import com.sap.sailing.declination.Declination; import com.sap.sailing.declination.impl.ColoradoImporter; +import com.sap.sailing.domain.common.impl.DegreePosition; +import com.sap.sse.common.impl.MillisecondsTimePoint; public class ColoradoTest { @Test public void simpleDocumentParsingTest() throws SAXException, IOException, ParserConfigurationException { final Declination declination = new ColoradoImporter().getDeclinationFromXml(getClass().getResourceAsStream("/colorado.xml")); + validateSomeDeclinationInJanuary2018(declination); + } + + private void validateSomeDeclinationInJanuary2018(final Declination declination) { assertEquals(10.0, declination.getPosition().getLatDeg(), 0.000001); assertEquals(20.0, declination.getPosition().getLngDeg(), 0.000001); assertEquals(1.89255, declination.getBearing().getDegrees(), 0.000001); assertEquals(0.10649, declination.getAnnualChange().getDegrees(), 0.000001); } + + @Test + public void simpleOnlineTest() throws IOException, ParseException { + final GregorianCalendar cal = new GregorianCalendar(2018, 0, 23); + cal.setTimeZone(TimeZone.getTimeZone("UTC")); + final Declination declination = new ColoradoImporter().getDeclination(new DegreePosition(10, 20), + new MillisecondsTimePoint(cal.getTime()), + /* timeoutForOnlineFetchInMilliseconds */ 5000); + validateSomeDeclinationInJanuary2018(declination); + } } diff --git a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/ColoradoImporter.java b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/ColoradoImporter.java index ee0d7d8d033..8019535cc76 100755 --- a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/ColoradoImporter.java +++ b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/ColoradoImporter.java @@ -2,6 +2,10 @@ package com.sap.sailing.declination.impl; import java.io.IOException; import java.io.InputStream; +import java.net.URL; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.TimeZone; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; @@ -11,8 +15,10 @@ import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.sap.sailing.declination.Declination; +import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; +import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; /** @@ -43,7 +49,9 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; * @author Axel Uhl (D043530) * */ -public class ColoradoImporter { +public class ColoradoImporter extends DeclinationImporter { + private static final String URL_PATTERN = "http://magcalc.geomag.info/?model=WMM2015&sourcePage=oldCalc&decimalLatitude=%f&decimalLongitude=%f&minYear=%d&minMonth=%d&minDay=%d"; + private static class XmlElementHandler extends DefaultHandler { private double dateAsDecimalYear; private double latDeg; @@ -104,4 +112,13 @@ public class ColoradoImporter { SAXParserFactory.newInstance().newSAXParser().parse(is, handler); return handler.getDeclination(); } + + @Override + public Declination importRecord(Position position, TimePoint timePoint) + throws IOException, ParserConfigurationException, SAXException { + final Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); + cal.setTime(timePoint.asDate()); + final URL url = new URL(String.format(URL_PATTERN, position.getLatDeg(), position.getLngDeg(), cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH))); + return getDeclinationFromXml(url.openStream()); + } } diff --git a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationImporter.java b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationImporter.java new file mode 100755 index 00000000000..bd0ffa14d9e --- /dev/null +++ b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationImporter.java @@ -0,0 +1,63 @@ +package com.sap.sailing.declination.impl; + +import java.io.IOException; +import java.text.ParseException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.parsers.ParserConfigurationException; + +import org.xml.sax.SAXException; + +import com.sap.sailing.declination.Declination; +import com.sap.sailing.domain.common.Position; +import com.sap.sse.common.TimePoint; + +public abstract class DeclinationImporter { + private static final Logger logger = Logger.getLogger(DeclinationImporter.class.getName()); + + public abstract Declination importRecord(Position position, TimePoint timePoint) + throws IOException, ParserConfigurationException, SAXException; + + /** + * Tries two things in parallel: fetch a more or less precise response from the online service and load + * the requested year's declination values from a stored resource to look up a value that comes close. + * The online lookup will be given preference. However, should it take longer than + * timeoutForOnlineFetchInMilliseconds, then the method will return whatever it found + * in the stored file, or null if no file exists for the year of timePoint. + * + * @param timeoutForOnlineFetchInMilliseconds if 0, this means wait forever for the online result + * @throws ParseException + * @throws ClassNotFoundException + * @throws IOException + */ + public Declination getDeclination(final Position position, final TimePoint timePoint, + long timeoutForOnlineFetchInMilliseconds) throws IOException, ParseException { + final Declination[] result = new Declination[1]; + Thread fetcher = new Thread("Declination fetcher for "+position+"@"+timePoint) { + @Override + public void run() { + try { + Declination fetched = importRecord(position, timePoint); + synchronized (result) { + result[0] = fetched; + result.notifyAll(); + } + } catch (IOException | ParserConfigurationException | SAXException e) { + logger.log(Level.FINE, "Exception while trying to load magnetic declination online", e); + } + } + }; + fetcher.start(); + synchronized (result) { + if (result[0] == null) { + try { + result.wait(timeoutForOnlineFetchInMilliseconds); + } catch (InterruptedException e) { + // ignore; simply use value from file in this case + } + } + } + return result[0]; + } +} diff --git a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/NOAAImporter.java b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/NOAAImporter.java index 2e265682a56..3febf4decc3 100755 --- a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/NOAAImporter.java +++ b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/NOAAImporter.java @@ -4,12 +4,9 @@ import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; -import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; -import java.util.logging.Level; -import java.util.logging.Logger; import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilder; @@ -31,8 +28,7 @@ import com.sap.sse.common.TimePoint; * @author Axel Uhl (d043530) * */ -public class NOAAImporter { - private static final Logger logger = Logger.getLogger(NOAAImporter.class.getName()); +public class NOAAImporter extends DeclinationImporter { private static final String QUERY_URL = "https://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination"; private static final String REGEXP_DECLINATION = "

Declination = ([0-9]*)° ([0-9]*)' *([EW])"; private static final String REGEXP_ANNUAL_CHANGE = "changing by *([0-9]*)° *([0-9]*)' ([EW])/year *

"; @@ -54,6 +50,7 @@ public class NOAAImporter { return annualChangePattern; } + @Override public Declination importRecord(Position position, TimePoint timePoint) throws IOException, ParserConfigurationException, SAXException { Declination result = null; Date date = timePoint.asDate(); @@ -80,46 +77,4 @@ public class NOAAImporter { return result; } - /** - * Tries two things in parallel: fetch a more or less precise response from the online service and load - * the requested year's declination values from a stored resource to look up a value that comes close. - * The online lookup will be given preference. However, should it take longer than - * timeoutForOnlineFetchInMilliseconds, then the method will return whatever it found - * in the stored file, or null if no file exists for the year of timePoint. - * - * @param timeoutForOnlineFetchInMilliseconds if 0, this means wait forever for the online result - * @throws ParseException - * @throws ClassNotFoundException - * @throws IOException - */ - public Declination getDeclination(final Position position, final TimePoint timePoint, - long timeoutForOnlineFetchInMilliseconds) throws IOException, ParseException { - final Declination[] result = new Declination[1]; - Thread fetcher = new Thread("Declination fetcher for "+position+"@"+timePoint) { - @Override - public void run() { - try { - Declination fetched = importRecord(position, timePoint); - synchronized (result) { - result[0] = fetched; - result.notifyAll(); - } - } catch (IOException | ParserConfigurationException | SAXException e) { - logger.log(Level.FINE, "Exception while trying to load magnetic declination online", e); - } - } - }; - fetcher.start(); - synchronized (result) { - if (result[0] == null) { - try { - result.wait(timeoutForOnlineFetchInMilliseconds); - } catch (InterruptedException e) { - // ignore; simply use value from file in this case - } - } - } - return result[0]; - } - } From fc92980189f745c85cf8d82e785f2693c440c9f6 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 23 Jan 2018 18:36:43 +0100 Subject: [PATCH 6/9] generalized declination tests so that they also support the Colorado implementation Change-Id: I7bb9b0013e69a8805d2b04e999375ca6b5dee39a --- .../test/AbstractDeclinationTest.java | 14 ++------ .../test/ColoradoDeclinationImportTest.java | 12 +++++++ .../test/ColoradoDeclinationServiceTest.java | 14 ++++++++ .../test/ColoradoDeclinationStoreTest.java | 14 ++++++++ .../test/DeclinationImportTest.java | 30 ++++------------ .../test/DeclinationServiceTest.java | 11 +++--- .../test/DeclinationStoreTest.java | 7 ++-- .../test/NOAADeclinationImportTest.java | 12 +++++++ .../test/NOAADeclinationServiceTest.java | 14 ++++++++ .../test/NOAADeclinationStoreTest.java | 14 ++++++++ .../declination/test/NOAARegexpTest.java | 36 +++++++++++++++++++ .../test/SimpleDeclinationTest.java | 3 +- .../impl/DeclinationServiceImpl.java | 12 ++++--- .../declination/impl/DeclinationStore.java | 22 ++++++++---- 14 files changed, 160 insertions(+), 55 deletions(-) create mode 100755 java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationImportTest.java create mode 100755 java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationServiceTest.java create mode 100755 java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationStoreTest.java create mode 100755 java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationImportTest.java create mode 100755 java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationServiceTest.java create mode 100755 java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationStoreTest.java create mode 100755 java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAARegexpTest.java diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/AbstractDeclinationTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/AbstractDeclinationTest.java index ad5c82e7392..55f61d2254d 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/AbstractDeclinationTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/AbstractDeclinationTest.java @@ -2,17 +2,9 @@ package com.sap.sailing.declination.test; import java.text.SimpleDateFormat; -import org.junit.Before; +import com.sap.sailing.declination.impl.DeclinationImporter; -import com.sap.sailing.declination.impl.NOAAImporterForTesting; - -public abstract class AbstractDeclinationTest { - protected NOAAImporterForTesting importer; +public abstract class AbstractDeclinationTest { + protected I importer; protected final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - - @Before - public void setUp() { - importer = new NOAAImporterForTesting(); - } - } diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationImportTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationImportTest.java new file mode 100755 index 00000000000..253ec307cf7 --- /dev/null +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationImportTest.java @@ -0,0 +1,12 @@ +package com.sap.sailing.declination.test; + +import org.junit.Before; + +import com.sap.sailing.declination.impl.ColoradoImporter; + +public class ColoradoDeclinationImportTest extends DeclinationImportTest { + @Before + public void setUp() { + importer = new ColoradoImporter(); + } +} diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationServiceTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationServiceTest.java new file mode 100755 index 00000000000..be633958aa6 --- /dev/null +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationServiceTest.java @@ -0,0 +1,14 @@ +package com.sap.sailing.declination.test; + +import org.junit.Before; + +import com.sap.sailing.declination.impl.ColoradoImporter; + +public class ColoradoDeclinationServiceTest extends DeclinationServiceTest { + @Override + @Before + public void setUp() { + importer = new ColoradoImporter(); + super.setUp(); + } +} diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationStoreTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationStoreTest.java new file mode 100755 index 00000000000..78ac7bfb2e1 --- /dev/null +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoDeclinationStoreTest.java @@ -0,0 +1,14 @@ +package com.sap.sailing.declination.test; + +import org.junit.Before; + +import com.sap.sailing.declination.impl.ColoradoImporter; + +public class ColoradoDeclinationStoreTest extends DeclinationStoreTest { + @Override + @Before + public void setUp() { + importer = new ColoradoImporter(); + super.setUp(); + } +} diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationImportTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationImportTest.java index 627f733cc6a..488b7566a43 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationImportTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationImportTest.java @@ -2,11 +2,9 @@ package com.sap.sailing.declination.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; import java.io.IOException; import java.text.ParseException; -import java.util.regex.Matcher; import javax.xml.parsers.ParserConfigurationException; @@ -14,34 +12,18 @@ import org.junit.Test; import org.xml.sax.SAXException; import com.sap.sailing.declination.Declination; +import com.sap.sailing.declination.impl.DeclinationImporter; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sse.common.impl.MillisecondsTimePoint; -public class DeclinationImportTest extends AbstractDeclinationTest { - @Test - public void testRegexpDeclination() { - Matcher declinationMatcher = importer.getDeclinationPattern().matcher("

Declination = 12° 41' W"); - assertTrue(declinationMatcher.find()); - assertEquals("12", declinationMatcher.group(1)); - assertEquals("41", declinationMatcher.group(2)); - assertEquals("W", declinationMatcher.group(3)); - } - - @Test - public void testRegexpAnnualChange() { - Matcher annualChangeMatcher = importer.getAnnualChangePattern().matcher(" changing by 0° 11' E/year

"); - assertTrue(annualChangeMatcher.find()); - assertEquals("0", annualChangeMatcher.group(1)); - assertEquals("11", annualChangeMatcher.group(2)); - assertEquals("E", annualChangeMatcher.group(3)); - } +public abstract class DeclinationImportTest extends AbstractDeclinationTest { @Test public void importSimpleDeclination() throws IOException, ParseException, ParserConfigurationException, SAXException { Declination record = importer.importRecord(new DegreePosition(53, 3), new MillisecondsTimePoint(simpleDateFormat.parse("2016-05-27").getTime())); - assertEquals(0.26307, record.getBearing().getDegrees(), 0.0001); - assertEquals(0.14795, record.getAnnualChange().getDegrees(), 0.0001); + assertEquals(0.26307, record.getBearing().getDegrees(), 0.001); + assertEquals(0.14795, record.getAnnualChange().getDegrees(), 0.001); } @Test @@ -50,8 +32,8 @@ public class DeclinationImportTest extends AbstractDeclinationTest { Declination record = importer.importRecord(new DegreePosition(-10, 3), new MillisecondsTimePoint(simpleDateFormat.parse("2017-05-27").getTime())); System.out.println("took "+(System.currentTimeMillis()-start)+"ms"); - assertEquals(-8.44581, record.getBearing().getDegrees(), 0.0001); - assertEquals(0.17712, record.getAnnualChange().getDegrees(), 0.0001); + assertEquals(-8.44581, record.getBearing().getDegrees(), 0.001); + assertEquals(0.17712, record.getAnnualChange().getDegrees(), 0.001); } @Test diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationServiceTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationServiceTest.java index 741d84b64bd..935ff777da0 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationServiceTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationServiceTest.java @@ -12,17 +12,18 @@ import org.junit.Test; import com.sap.sailing.declination.Declination; import com.sap.sailing.declination.DeclinationService; +import com.sap.sailing.declination.impl.DeclinationImporter; import com.sap.sailing.declination.impl.DeclinationServiceImpl; import com.sap.sailing.domain.common.impl.CentralAngleDistance; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sse.common.impl.MillisecondsTimePoint; -public class DeclinationServiceTest extends AbstractDeclinationTest { +public abstract class DeclinationServiceTest extends AbstractDeclinationTest { private DeclinationService service; @Before public void setUp() { - service = new DeclinationServiceImpl(new CentralAngleDistance(1./180.*Math.PI)); + service = new DeclinationServiceImpl(new CentralAngleDistance(1./180.*Math.PI), importer); } @Test @@ -36,10 +37,10 @@ public class DeclinationServiceTest extends AbstractDeclinationTest { @Test public void testDeclinationQueryNotMatchedInStore() throws IOException, ClassNotFoundException, ParseException { Declination result = service.getDeclination(new MillisecondsTimePoint(simpleDateFormat.parse("2019-02-03").getTime()), - new DegreePosition(51, -5), /* timeoutForOnlineFetchInMilliseconds */ 30000); + new DegreePosition(51, -5), /* timeoutForOnlineFetchInMilliseconds */ 5000); assertNotNull(result); - assertEquals(-1.9565, result.getBearing().getDegrees(), 0.0001); - assertEquals(0.15244, result.getAnnualChange().getDegrees(), 0.0001); + assertEquals(-1.9565, result.getBearing().getDegrees(), 0.001); + assertEquals(0.15244, result.getAnnualChange().getDegrees(), 0.001); } @Test diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationStoreTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationStoreTest.java index 5be294d5b56..40fabc1660d 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationStoreTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/DeclinationStoreTest.java @@ -28,6 +28,7 @@ import org.junit.Ignore; import org.junit.Test; import com.sap.sailing.declination.Declination; +import com.sap.sailing.declination.impl.DeclinationImporter; import com.sap.sailing.declination.impl.DeclinationRecordImpl; import com.sap.sailing.declination.impl.DeclinationStore; import com.sap.sailing.domain.common.Bearing; @@ -38,13 +39,13 @@ import com.sap.sailing.domain.common.quadtree.QuadTree; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; -public class DeclinationStoreTest extends AbstractDeclinationTest { +public abstract class DeclinationStoreTest extends AbstractDeclinationTest { private DeclinationStore store; private static final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); @Before public void setUp() { - store = new DeclinationStore(); + store = new DeclinationStore(importer); } @Test @@ -325,7 +326,7 @@ public class DeclinationStoreTest extends AbstractDeclinationTest { @Test public void copyExistingDeclinationsToNewFormat() throws IOException, ClassNotFoundException, ParseException { File resourcesDir = new File("../com.sap.sailing.declination/resources/"); - DeclinationStore store = new DeclinationStore(); + DeclinationStore store = new DeclinationStore(importer); assertTrue(resourcesDir.isDirectory()); for (File f : resourcesDir.listFiles()) { if (f.getName().startsWith("declination-") && f.getName().endsWith(".txt") && diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationImportTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationImportTest.java new file mode 100755 index 00000000000..4f790216326 --- /dev/null +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationImportTest.java @@ -0,0 +1,12 @@ +package com.sap.sailing.declination.test; + +import org.junit.Before; + +import com.sap.sailing.declination.impl.NOAAImporterForTesting; + +public class NOAADeclinationImportTest extends DeclinationImportTest { + @Before + public void setUp() { + importer = new NOAAImporterForTesting(); + } +} diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationServiceTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationServiceTest.java new file mode 100755 index 00000000000..f305b8c2259 --- /dev/null +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationServiceTest.java @@ -0,0 +1,14 @@ +package com.sap.sailing.declination.test; + +import org.junit.Before; + +import com.sap.sailing.declination.impl.NOAAImporter; + +public class NOAADeclinationServiceTest extends DeclinationServiceTest { + @Override + @Before + public void setUp() { + importer = new NOAAImporter(); + super.setUp(); + } +} diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationStoreTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationStoreTest.java new file mode 100755 index 00000000000..68c2f4fe63d --- /dev/null +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationStoreTest.java @@ -0,0 +1,14 @@ +package com.sap.sailing.declination.test; + +import org.junit.Before; + +import com.sap.sailing.declination.impl.NOAAImporter; + +public class NOAADeclinationStoreTest extends DeclinationStoreTest { + @Override + @Before + public void setUp() { + importer = new NOAAImporter(); + super.setUp(); + } +} diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAARegexpTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAARegexpTest.java new file mode 100755 index 00000000000..eb3cfe85c18 --- /dev/null +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAARegexpTest.java @@ -0,0 +1,36 @@ +package com.sap.sailing.declination.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.regex.Matcher; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sailing.declination.impl.NOAAImporterForTesting; + +public class NOAARegexpTest extends AbstractDeclinationTest { + @Before + public void setUp() { + importer = new NOAAImporterForTesting(); + } + + @Test + public void testRegexpDeclination() { + Matcher declinationMatcher = importer.getDeclinationPattern().matcher("

Declination = 12° 41' W"); + assertTrue(declinationMatcher.find()); + assertEquals("12", declinationMatcher.group(1)); + assertEquals("41", declinationMatcher.group(2)); + assertEquals("W", declinationMatcher.group(3)); + } + + @Test + public void testRegexpAnnualChange() { + Matcher annualChangeMatcher = importer.getAnnualChangePattern().matcher(" changing by 0° 11' E/year

"); + assertTrue(annualChangeMatcher.find()); + assertEquals("0", annualChangeMatcher.group(1)); + assertEquals("11", annualChangeMatcher.group(2)); + assertEquals("E", annualChangeMatcher.group(3)); + } +} diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java index 9e477e26c71..d98f6c5f7f8 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java @@ -11,13 +11,14 @@ import org.junit.Test; import org.xml.sax.SAXException; import com.sap.sailing.declination.Declination; +import com.sap.sailing.declination.impl.DeclinationImporter; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; -public class SimpleDeclinationTest extends AbstractDeclinationTest { +public abstract class SimpleDeclinationTest extends AbstractDeclinationTest { @Test public void testSimpleCorrection() throws IOException, ParseException, ParserConfigurationException, SAXException { final MillisecondsTimePoint timePoint = new MillisecondsTimePoint(simpleDateFormat.parse("2019-05-27").getTime()); diff --git a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationServiceImpl.java b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationServiceImpl.java index 51b5a30a1a4..154270264ca 100755 --- a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationServiceImpl.java +++ b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationServiceImpl.java @@ -17,7 +17,7 @@ import com.sap.sse.common.TimePoint; public class DeclinationServiceImpl implements DeclinationService { private final Distance defaultMaxDistance; private final DeclinationStore persistentStore; - private final NOAAImporter noaaImporter; + private final DeclinationImporter declinationImporter; /** * Keys are years @@ -33,10 +33,14 @@ public class DeclinationServiceImpl implements DeclinationService { * Constructs a service that has a default position tolerance of defaultMaxDistance. */ public DeclinationServiceImpl(Distance defaultMaxDistance) { + this(defaultMaxDistance, new NOAAImporter()); + } + + public DeclinationServiceImpl(Distance defaultMaxDistance, DeclinationImporter declinationImporter) { + this.declinationImporter = declinationImporter; this.defaultMaxDistance = defaultMaxDistance; this.yearStore = new HashMap>(); - this.persistentStore = new DeclinationStore(); - this.noaaImporter = new NOAAImporter(); + this.persistentStore = new DeclinationStore(declinationImporter); this.importerCache = new HashMap>(); } @@ -84,7 +88,7 @@ public class DeclinationServiceImpl implements DeclinationService { // else it's further away from the requested position as demanded by maxDistance } } - result = noaaImporter.getDeclination(position, timePoint, timeoutForOnlineFetchInMilliseconds); + result = declinationImporter.getDeclination(position, timePoint, timeoutForOnlineFetchInMilliseconds); if (result != null) { if (importerCacheForYear == null) { importerCacheForYear = new QuadTree(); diff --git a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationStore.java b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationStore.java index f674453b183..327d0219fbc 100755 --- a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationStore.java +++ b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationStore.java @@ -38,6 +38,12 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; public class DeclinationStore { private static final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); + private final DeclinationImporter importer; + + public DeclinationStore(DeclinationImporter importer) { + this.importer = importer; + } + /** * Returns null if no stored declinations exist for the year requested. */ @@ -122,7 +128,7 @@ public class DeclinationStore { return result; } - private void fetchAndAppendDeclination(TimePoint timePoint, Position position, NOAAImporter importer, + private void fetchAndAppendDeclination(TimePoint timePoint, Position position, DeclinationImporter importer, Writer out) throws IOException { Declination declination = null; // re-try three times @@ -153,7 +159,6 @@ public class DeclinationStore { usage(); } else { double grid = Double.valueOf(args[2]); - NOAAImporter importer = new NOAAImporter(); for (int year = fromYear; year <= toYear; year++) { QuadTree storedDeclinations = getStoredDeclinations(year); if (storedDeclinations == null) { @@ -182,7 +187,7 @@ public class DeclinationStore { } } - private void fetchAndAppendDeclinationForLatitude(double grid, NOAAImporter importer, int year, + private void fetchAndAppendDeclinationForLatitude(double grid, DeclinationImporter importer, int year, QuadTree storedDeclinations, Writer out, int month, TimePoint timePoint, double lat) throws IOException { System.out.println("Date: " + year + "/" + (month + 1) + ", Latitude: " + lat); @@ -194,7 +199,7 @@ public class DeclinationStore { } } - private void fetchAndAppendDeclination(NOAAImporter importer, QuadTree storedDeclinations, Writer out, + private void fetchAndAppendDeclination(DeclinationImporter importer, QuadTree storedDeclinations, Writer out, TimePoint timePoint, double lat, double lng) throws IOException { Position point = new DegreePosition(lat, lng); final Declination existingDeclinationRecord; @@ -213,16 +218,19 @@ public class DeclinationStore { * Launches the importer, writing to resources/declination-year.txt (where "year" represents the year for which the * values are stored in the file) the declinations downloaded online for the years args[0] to * args[1] (inclusive) for all positions with a grid of args[2] degrees each, starting at - * 0°0.0'N and 0°0.0'E. + * 0°0.0'N and 0°0.0'E. args[3] can optionally be used to select a non-default declination + * importer. By default, the {@link NOAAImporter} will be used. Using "c" here will use the {@link ColoradoImporter} + * instead. + * * @throws ParseException * @throws ClassNotFoundException */ public static void main(String[] args) throws IOException, ClassNotFoundException, ParseException { - DeclinationStore store = new DeclinationStore(); + DeclinationStore store = new DeclinationStore(args.length > 3 && args[3].equals("c") ? new ColoradoImporter() : new NOAAImporter()); store.run(args); } private void usage() { - System.out.println("java " + NOAAImporter.class.getName() + " "); + System.out.println("java " + getClass().getName() + " "); } } From cc6007291f91a534acd69897fbcff716a7b50238 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 23 Jan 2018 18:40:07 +0100 Subject: [PATCH 7/9] added the two variants of the SimpleDeclinationTest Change-Id: I8563494f6b94eb62abcf75895486face59e53bb6 --- .../test/ColoradoSimpleDeclinationTest.java | 12 ++++++++++++ .../declination/test/NOAASimpleDeclinationTest.java | 12 ++++++++++++ .../declination/test/SimpleDeclinationTest.java | 12 ++++++------ 3 files changed, 30 insertions(+), 6 deletions(-) create mode 100755 java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoSimpleDeclinationTest.java create mode 100755 java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAASimpleDeclinationTest.java diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoSimpleDeclinationTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoSimpleDeclinationTest.java new file mode 100755 index 00000000000..fc29c53c66a --- /dev/null +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/ColoradoSimpleDeclinationTest.java @@ -0,0 +1,12 @@ +package com.sap.sailing.declination.test; + +import org.junit.Before; + +import com.sap.sailing.declination.impl.ColoradoImporter; + +public class ColoradoSimpleDeclinationTest extends SimpleDeclinationTest { + @Before + public void setUp() { + importer = new ColoradoImporter(); + } +} diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAASimpleDeclinationTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAASimpleDeclinationTest.java new file mode 100755 index 00000000000..d712850ffbd --- /dev/null +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAASimpleDeclinationTest.java @@ -0,0 +1,12 @@ +package com.sap.sailing.declination.test; + +import org.junit.Before; + +import com.sap.sailing.declination.impl.NOAAImporter; + +public class NOAASimpleDeclinationTest extends SimpleDeclinationTest { + @Before + public void setUp() { + importer = new NOAAImporter(); + } +} diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java index d98f6c5f7f8..c0c7c8ef5cf 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java @@ -23,22 +23,22 @@ public abstract class SimpleDeclinationTest exten public void testSimpleCorrection() throws IOException, ParseException, ParserConfigurationException, SAXException { final MillisecondsTimePoint timePoint = new MillisecondsTimePoint(simpleDateFormat.parse("2019-05-27").getTime()); Declination record = importer.importRecord(new DegreePosition(53, 3), timePoint); - assertEquals(0.70594, record.getBearing().getDegrees(), 0.0001); - assertEquals(0.14745, record.getAnnualChange().getDegrees(), 0.0001); + assertEquals(0.70594, record.getBearing().getDegrees(), 0.001); + assertEquals(0.14745, record.getAnnualChange().getDegrees(), 0.001); TimePoint oneYearLater = timePoint.plus(Duration.ONE_YEAR); Bearing bearing = record.getBearingCorrectedTo(oneYearLater); - assertEquals(0.70594+0.14745, bearing.getDegrees(), 0.0001); + assertEquals(0.70594+0.14745, bearing.getDegrees(), 0.01); } @Test public void testBackwardCorrection() throws IOException, ParseException, ParserConfigurationException, SAXException { final MillisecondsTimePoint timePoint = new MillisecondsTimePoint(simpleDateFormat.parse("2019-05-27").getTime()); Declination record = importer.importRecord(new DegreePosition(53, 3), timePoint); - assertEquals(0.70594, record.getBearing().getDegrees(), 0.0001); - assertEquals(0.14745, record.getAnnualChange().getDegrees(), 0.0001); + assertEquals(0.70594, record.getBearing().getDegrees(), 0.001); + assertEquals(0.14745, record.getAnnualChange().getDegrees(), 0.001); TimePoint oneYearEarlier = timePoint.minus(Duration.ONE_YEAR); Bearing bearing = record.getBearingCorrectedTo(oneYearEarlier); - assertEquals(0.70594-0.14745, bearing.getDegrees(), 0.0001); + assertEquals(0.70594-0.14745, bearing.getDegrees(), 0.01); } } From 26a483532f060d0fe499153a9e6177fd66ef6b89 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 23 Jan 2018 18:40:58 +0100 Subject: [PATCH 8/9] changed default implementation of declination service from NOAA to Colorado (US Government Shutdown related) Change-Id: I20274b4bcf78d79ff29fe7e9087f7de925568319 --- .../sap/sailing/declination/test/SimpleDeclinationTest.java | 1 - .../src/com/sap/sailing/declination/DeclinationService.java | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java index c0c7c8ef5cf..8cda73e4694 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/SimpleDeclinationTest.java @@ -40,5 +40,4 @@ public abstract class SimpleDeclinationTest exten Bearing bearing = record.getBearingCorrectedTo(oneYearEarlier); assertEquals(0.70594-0.14745, bearing.getDegrees(), 0.01); } - } diff --git a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/DeclinationService.java b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/DeclinationService.java index b84a6fd4848..668899861f3 100755 --- a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/DeclinationService.java +++ b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/DeclinationService.java @@ -3,6 +3,7 @@ package com.sap.sailing.declination; import java.io.IOException; import java.text.ParseException; +import com.sap.sailing.declination.impl.ColoradoImporter; import com.sap.sailing.declination.impl.DeclinationServiceImpl; import com.sap.sailing.declination.impl.NOAAImporter; import com.sap.sailing.domain.common.Distance; @@ -16,7 +17,7 @@ public interface DeclinationService { * A default implementation with a spatial default precision of 1 {@link Mile#METERS_PER_GEOGRAPHICAL_MILE * geographical mile} which equals the length of an arc with one degree on a meridian. */ - DeclinationService INSTANCE = new DeclinationServiceImpl(new CentralAngleDistance(1./180.*Math.PI)); + DeclinationService INSTANCE = new DeclinationServiceImpl(new CentralAngleDistance(1./180.*Math.PI), new ColoradoImporter()); /** * Obtains declination information with the default precision of this declination service in time and space From 31d555f8e28ccddc717099ac50500f432e5f050e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 23 Jan 2018 18:42:16 +0100 Subject: [PATCH 9/9] ignore NOAA declination tests while US Government Shutdown is in effect for NOAA Change-Id: Iac24bba8e84abafb575fe6c7a06dd5a814f65565 --- .../sap/sailing/declination/test/NOAADeclinationImportTest.java | 2 ++ .../sailing/declination/test/NOAADeclinationServiceTest.java | 2 ++ .../sap/sailing/declination/test/NOAADeclinationStoreTest.java | 2 ++ .../sap/sailing/declination/test/NOAASimpleDeclinationTest.java | 2 ++ 4 files changed, 8 insertions(+) diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationImportTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationImportTest.java index 4f790216326..dd52a464baa 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationImportTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationImportTest.java @@ -1,9 +1,11 @@ package com.sap.sailing.declination.test; import org.junit.Before; +import org.junit.Ignore; import com.sap.sailing.declination.impl.NOAAImporterForTesting; +@Ignore("US Government Shutdown around 2018-01-22") public class NOAADeclinationImportTest extends DeclinationImportTest { @Before public void setUp() { diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationServiceTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationServiceTest.java index f305b8c2259..57889159a10 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationServiceTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationServiceTest.java @@ -1,9 +1,11 @@ package com.sap.sailing.declination.test; import org.junit.Before; +import org.junit.Ignore; import com.sap.sailing.declination.impl.NOAAImporter; +@Ignore("US Government Shutdown around 2018-01-22") public class NOAADeclinationServiceTest extends DeclinationServiceTest { @Override @Before diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationStoreTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationStoreTest.java index 68c2f4fe63d..3062e9b6858 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationStoreTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAADeclinationStoreTest.java @@ -1,9 +1,11 @@ package com.sap.sailing.declination.test; import org.junit.Before; +import org.junit.Ignore; import com.sap.sailing.declination.impl.NOAAImporter; +@Ignore("US Government Shutdown around 2018-01-22") public class NOAADeclinationStoreTest extends DeclinationStoreTest { @Override @Before diff --git a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAASimpleDeclinationTest.java b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAASimpleDeclinationTest.java index d712850ffbd..ace67df7dd1 100755 --- a/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAASimpleDeclinationTest.java +++ b/java/com.sap.sailing.declination.test/src/com/sap/sailing/declination/test/NOAASimpleDeclinationTest.java @@ -1,9 +1,11 @@ package com.sap.sailing.declination.test; import org.junit.Before; +import org.junit.Ignore; import com.sap.sailing.declination.impl.NOAAImporter; +@Ignore("US Government Shutdown around 2018-01-22") public class NOAASimpleDeclinationTest extends SimpleDeclinationTest { @Before public void setUp() {