From d5ce190c581ce17af5736fc7fa782ae14c0956cb Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 18 Oct 2017 16:40:23 +0200 Subject: [PATCH] adjusted Expedition wind importer so it can read Phoenix data; added test case Change-Id: Ide5c060899877b14428de2a9e833e6ddb330f037 --- .../impl/ExpeditionGPSFixImporter.java | 4 +- .../expeditionimport/TestWindLogParser.java | 12 ++++- .../windimport/expedition/WindLogParser.java | 45 +++++++++++-------- .../ExpeditionExtendedDataImporterImpl.java | 10 ++--- 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/java/com.sap.sailing.domain.expeditionadapter/src/com/sap/sailing/domain/expeditionadapter/impl/ExpeditionGPSFixImporter.java b/java/com.sap.sailing.domain.expeditionadapter/src/com/sap/sailing/domain/expeditionadapter/impl/ExpeditionGPSFixImporter.java index 9a92c48908d..edae24e5e61 100755 --- a/java/com.sap.sailing.domain.expeditionadapter/src/com/sap/sailing/domain/expeditionadapter/impl/ExpeditionGPSFixImporter.java +++ b/java/com.sap.sailing.domain.expeditionadapter/src/com/sap/sailing/domain/expeditionadapter/impl/ExpeditionGPSFixImporter.java @@ -21,8 +21,8 @@ import com.sap.sailing.domain.trackimport.GPSFixImporter; import com.sap.sailing.server.trackfiles.impl.ExpeditionExtendedDataImporterImpl; public class ExpeditionGPSFixImporter implements GPSFixImporter { - private static final String LAT_COLUMN_HEADING = ExpeditionExtendedDataImporterImpl.GENERATED_LAT_HEADER; - private static final String LON_COLUMN_HEADING = ExpeditionExtendedDataImporterImpl.GENERATED_LON_HEADER; + private static final String LAT_COLUMN_HEADING = ExpeditionExtendedDataImporterImpl.COL_NAME_LAT; + private static final String LON_COLUMN_HEADING = ExpeditionExtendedDataImporterImpl.COL_NAME_LON; private static final String COG_COLUMN_HEADING = "Ext_COG"; private static final String SOG_COLUMN_HEADING = "Ext_SOG"; @Override diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/expeditionimport/TestWindLogParser.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/expeditionimport/TestWindLogParser.java index 6e178ed9ff4..01fb4918f01 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/expeditionimport/TestWindLogParser.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/expeditionimport/TestWindLogParser.java @@ -2,6 +2,7 @@ package com.sap.sailing.server.gateway.expeditionimport; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.number.IsCloseTo.closeTo; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import org.junit.Test; @@ -14,7 +15,16 @@ public class TestWindLogParser { private static final double DOUBLE_TOLERANCE = 1e-7; - @Test + @Test + public void testPhoenixRows() throws Exception { + assertEquals(51., Double.valueOf("051"), 0.000001); + Iterable windImport = WindLogParser.importWind(getClass().getResourceAsStream("PhoenixRowWithWind.csv")); + assertThat(Util.size(windImport), is(1)); + Wind wind = windImport.iterator().next(); + assertWind(wind, 10.5, 51, 41.521689, -71.338883); + } + + @Test public void testCompleteRow() throws Exception { Iterable windImport = WindLogParser.importWind(getClass().getResourceAsStream("CompleteRow.csv")); assertThat(Util.size(windImport), is(1)); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/expedition/WindLogParser.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/expedition/WindLogParser.java index 47f6a0f195c..306261c701e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/expedition/WindLogParser.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/expedition/WindLogParser.java @@ -74,16 +74,14 @@ public class WindLogParser { } private static final String COL_NAME_TRUE_WIND_SPEED = "Tws"; + private static final String COL_NAME_TRUE_WIND_SPEED2 = "TW_speed"; private static final String COL_NAME_TRUE_WIND_DIRECTION = "Twd"; - private static final String COL_NAME_LAT = "Lat"; - private static final String COL_NAME_LONG = "Lon"; + private static final String COL_NAME_TRUE_WIND_DIRECTION2 = "TW_Dirn"; + private static final String COL_NAME_LAT = ExpeditionExtendedDataImporterImpl.COL_NAME_LAT; + private static final String COL_NAME_LON = ExpeditionExtendedDataImporterImpl.COL_NAME_LON; /** - * See ExpeditionMessage, UDPExpeditionReceiver - * - * @param windStream - * @return - * @throws IOException + * Reads an Expedition log file passed as the {@code windStream} input stream. */ public static Iterable importWind(InputStream windStream) throws IOException { BufferedReader csvReader = new BufferedReader(new InputStreamReader(windStream)); @@ -93,18 +91,27 @@ public class WindLogParser { WindBuffer windBuffer = new WindBuffer(); final AtomicInteger lineNr = new AtomicInteger(1); csvReader.lines().forEach(line->{ - ExpeditionExtendedDataImporterImpl.parseLine(lineNr.incrementAndGet(), "Expedition Wind Import", - line, headers, (timePoint, columnValues, headerDefinitions)->{ - windBuffer.updateTime(timePoint); - windBuffer.updateWindData(columnValues[headerDefinitions.get(COL_NAME_TRUE_WIND_SPEED)], - columnValues[headerDefinitions.get(COL_NAME_TRUE_WIND_DIRECTION)]); - windBuffer.updatePosition(columnValues[headerDefinitions.get(COL_NAME_LAT)], - columnValues[headerDefinitions.get(COL_NAME_LONG)]); - Wind wind = windBuffer.createWindIfReady(); - if (wind != null) { - result.add(wind); - } - }); + if (!line.trim().isEmpty()) { + ExpeditionExtendedDataImporterImpl.parseLine(lineNr.incrementAndGet(), "Expedition Wind Import", + line, headers, (timePoint, columnValues, headerDefinitions)->{ + windBuffer.updateTime(timePoint); + final String trueWindSpeedData = headerDefinitions.containsKey(COL_NAME_TRUE_WIND_SPEED) && + columnValues[headerDefinitions.get(COL_NAME_TRUE_WIND_SPEED)] != null ? columnValues[headerDefinitions.get(COL_NAME_TRUE_WIND_SPEED)] + : headerDefinitions.containsKey(COL_NAME_TRUE_WIND_SPEED2) ? columnValues[headerDefinitions.get(COL_NAME_TRUE_WIND_SPEED2)] + : null; + final String trueWindDirectionData = headerDefinitions.containsKey(COL_NAME_TRUE_WIND_DIRECTION) && + columnValues[headerDefinitions.get(COL_NAME_TRUE_WIND_DIRECTION)] != null ? columnValues[headerDefinitions.get(COL_NAME_TRUE_WIND_DIRECTION)] + : headerDefinitions.containsKey(COL_NAME_TRUE_WIND_DIRECTION2) ? columnValues[headerDefinitions.get(COL_NAME_TRUE_WIND_DIRECTION2)] + : null; + windBuffer.updateWindData(trueWindSpeedData, trueWindDirectionData); + windBuffer.updatePosition(columnValues[headerDefinitions.get(COL_NAME_LAT)], + columnValues[headerDefinitions.get(COL_NAME_LON)]); + Wind wind = windBuffer.createWindIfReady(); + if (wind != null) { + result.add(wind); + } + }); + } }); return result; } diff --git a/java/com.sap.sailing.server.trackfiles/src/com/sap/sailing/server/trackfiles/impl/ExpeditionExtendedDataImporterImpl.java b/java/com.sap.sailing.server.trackfiles/src/com/sap/sailing/server/trackfiles/impl/ExpeditionExtendedDataImporterImpl.java index 99becb18f79..c6845771a93 100755 --- a/java/com.sap.sailing.server.trackfiles/src/com/sap/sailing/server/trackfiles/impl/ExpeditionExtendedDataImporterImpl.java +++ b/java/com.sap.sailing.server.trackfiles/src/com/sap/sailing/server/trackfiles/impl/ExpeditionExtendedDataImporterImpl.java @@ -45,8 +45,8 @@ public class ExpeditionExtendedDataImporterImpl extends AbstractDoubleVectorFixI public static final String EXPEDITION_EXTENDED_TYPE = "EXPEDITION_EXTENDED"; private static final Logger logger = Logger.getLogger(ExpeditionExtendedDataImporterImpl.class.getName()); private static final String ORIGINAL_POSITION_HEADER = "Pos[ddd.dd]"; - public static final String GENERATED_LAT_HEADER = "Lat"; - public static final String GENERATED_LON_HEADER = "Lon"; + public static final String COL_NAME_LAT = "Lat"; + public static final String COL_NAME_LON = "Lon"; private static final String DATE_COLUMN_1 = "dd/mm/yy"; private static final String DATE_COLUMN_1_PATTERN = "dd/MM/yy"; private static final String DATE_COLUMN_2 = "mm/dd/yy"; @@ -120,7 +120,7 @@ public class ExpeditionExtendedDataImporterImpl extends AbstractDoubleVectorFixI /** * When the header contains one or more occurrences of {@link #ORIGINAL_POSITION_HEADER}, it is substituted - * by the two header columns {@link #GENERATED_LAT_HEADER} and {@link #GENERATED_LON_HEADER} because that's + * by the two header columns {@link #COL_NAME_LAT} and {@link #COL_NAME_LON} because that's * how positions are stored in Expedition files: as two comma-separated values, one for latitude, another * for longitude, although there is only one header field. */ @@ -131,8 +131,8 @@ public class ExpeditionExtendedDataImporterImpl extends AbstractDoubleVectorFixI for (int columnInHeader = 0; columnInHeader < headerTokens.length; columnInHeader++) { String header = headerTokens[columnInHeader]; if (header.equals(ORIGINAL_POSITION_HEADER)) { - colIndicesInFile.put(GENERATED_LAT_HEADER, columnInResultingHeader++); - colIndicesInFile.put(GENERATED_LON_HEADER, columnInResultingHeader++); + colIndicesInFile.put(COL_NAME_LAT, columnInResultingHeader++); + colIndicesInFile.put(COL_NAME_LON, columnInResultingHeader++); } else { colIndicesInFile.put(header, columnInResultingHeader++); }