From 260fee16b2365f0f01ef2fecabc47da50bb89b1e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 4 Feb 2025 14:30:52 +0100 Subject: [PATCH] bug6076: restructured to use dedicated importer for extended Vakaros values --- .../sap/sailing/domain/common/DetailType.java | 1 + .../domain/common/dto/LegEntryDTO.java | 4 ++ .../test/TestReadingVakarosFiles.java | 40 +++++++----- .../VakarosExtendedDataImporterImpl.java | 27 +++++++- .../vakarosadapter/VakarosGPSFixImporter.java | 35 ----------- .../trackimport/DoubleVectorFixImporter.java | 4 +- .../domain/trackimport/GPSFixImporter.java | 3 - .../sailing/gwt/ui/leaderboard/LegColumn.java | 4 ++ .../ui/server/SailingServiceWriteImpl.java | 9 ++- .../trackfiles/impl/TrackFilesImporter.java | 8 --- .../ExpeditionExtendedDataImporterImpl.java | 63 ++++++++++--------- 11 files changed, 104 insertions(+), 94 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java index 8fd63cec796..6ae460bcd5b 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java @@ -370,6 +370,7 @@ public enum DetailType implements Serializable, SecuredEnum { allowed.add(EXPEDITION_RACE_JIB_CAR_PORT); allowed.add(EXPEDITION_RACE_JIB_CAR_STBD); allowed.add(EXPEDITION_RACE_MAST_BUTT); + allowed.add(EXPEDITION_RACE_KICKER_TENSION); return allowed; } diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LegEntryDTO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LegEntryDTO.java index 7978a03eb1d..95ae9b31133 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LegEntryDTO.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LegEntryDTO.java @@ -694,6 +694,10 @@ public class LegEntryDTO implements Serializable { return expeditionHolder == null ? null : expeditionHolder.expeditionMastButt; } + public Double getExpeditionKickerTension() { + return expeditionHolder == null ? null : expeditionHolder.expeditionKickerTension; + } + public static class ExpeditionLegHolder implements Serializable { private static final long serialVersionUID = -2507536984016949734L; diff --git a/java/com.sap.sailing.domain.vakarosadapter.test/src/com/sap/sailing/domain/vakarosadapter/test/TestReadingVakarosFiles.java b/java/com.sap.sailing.domain.vakarosadapter.test/src/com/sap/sailing/domain/vakarosadapter/test/TestReadingVakarosFiles.java index 3727497eb4b..de446b75e30 100644 --- a/java/com.sap.sailing.domain.vakarosadapter.test/src/com/sap/sailing/domain/vakarosadapter/test/TestReadingVakarosFiles.java +++ b/java/com.sap.sailing.domain.vakarosadapter.test/src/com/sap/sailing/domain/vakarosadapter/test/TestReadingVakarosFiles.java @@ -20,19 +20,23 @@ import com.sap.sailing.domain.common.tracking.DoubleVectorFix; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; +import com.sap.sailing.domain.trackimport.BaseDoubleVectorFixImporter; import com.sap.sailing.domain.trackimport.FormatNotSupportedException; import com.sap.sailing.domain.trackimport.GPSFixImporter.Callback; +import com.sap.sailing.domain.vakarosadapter.VakarosExtendedDataImporterImpl; import com.sap.sailing.domain.vakarosadapter.VakarosGPSFixImporter; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; public class TestReadingVakarosFiles { private final static double EPSILON = 0.000000001; - private VakarosGPSFixImporter importer; + private VakarosGPSFixImporter gpsFixImporter; + private VakarosExtendedDataImporterImpl sensorFixImporter; @Before public void setUp() { - importer = new VakarosGPSFixImporter(); + gpsFixImporter = new VakarosGPSFixImporter(); + sensorFixImporter = new VakarosExtendedDataImporterImpl(); } @Test @@ -40,7 +44,8 @@ public class TestReadingVakarosFiles { final String sourceName = "/GDF-8-11-2024.csv.gz"; final Map> gpsFixes = new HashMap<>(); final Map> sensorFixes = new HashMap<>(); - readAndAssertNotEmpty(sourceName, gpsFixes, sensorFixes); + readGPSFixesAndAssertNotEmpty(sourceName, gpsFixes); + readSensorFixesAndAssertNotEmpty(sourceName, sensorFixes); // check for presence of fixes corresponding to line: // timestamp,latitude,longitude,sog_kts,cog,hdg_true,roll,pitch,load_GDF2,load_GDF1 // 2024-11-08T08:38:56.077,41.7387700,12.2457483,0.000,113.1,125.4,-1.7,4.6,1.40,141.20 @@ -73,27 +78,33 @@ public class TestReadingVakarosFiles { assertTrue(foundSensorFix); } - private void readAndAssertNotEmpty(final String sourceName, - final Map> gpsFixes, - final Map> sensorFixes) + private void readGPSFixesAndAssertNotEmpty(final String sourceName, + final Map> gpsFixes) throws FormatNotSupportedException, IOException { final Callback callback = new Callback() { @Override public void addFix(GPSFix newFix, TrackFileImportDeviceIdentifier device) { gpsFixes.computeIfAbsent(device, d->new ArrayList<>()).add(newFix); } - - @Override - public void addSensorFixes(Iterable newSensorFixes, TrackFileImportDeviceIdentifier device) { - Util.addAll(newSensorFixes, sensorFixes.computeIfAbsent(device, d->new ArrayList<>())); - } }; - importer.importFixes(getClass().getResourceAsStream(sourceName), Charset.forName("UTF-8"), callback, /* inferSpeedAndBearing */ false, sourceName); + gpsFixImporter.importFixes(getClass().getResourceAsStream(sourceName), Charset.forName("UTF-8"), callback, /* inferSpeedAndBearing */ false, sourceName); assertFalse(gpsFixes.isEmpty()); - assertFalse(sensorFixes.isEmpty()); for (final List gpsFixList : gpsFixes.values()) { assertFalse(gpsFixList.isEmpty()); } + } + + private void readSensorFixesAndAssertNotEmpty(final String sourceName, + final Map> sensorFixes) + throws FormatNotSupportedException, IOException { + final com.sap.sailing.domain.trackimport.BaseDoubleVectorFixImporter.Callback callback = new BaseDoubleVectorFixImporter.Callback() { + @Override + public void addFixes(Iterable fixes, TrackFileImportDeviceIdentifier device) { + Util.addAll(fixes, sensorFixes.computeIfAbsent(device, d->new ArrayList<>())); + } + }; + sensorFixImporter.importFixes(getClass().getResourceAsStream(sourceName), Charset.forName("UTF-8"), callback, /* filename */ sourceName, sourceName, /* downsample */ false); + assertFalse(sensorFixes.isEmpty()); for (final List sensorFixList : sensorFixes.values()) { assertFalse(sensorFixList.isEmpty()); } @@ -104,6 +115,7 @@ public class TestReadingVakarosFiles { final String sourceName = "/GDF-13-12-2024.csv.zip"; final Map> gpsFixes = new HashMap<>(); final Map> sensorFixes = new HashMap<>(); - readAndAssertNotEmpty(sourceName, gpsFixes, sensorFixes); + readGPSFixesAndAssertNotEmpty(sourceName, gpsFixes); + readSensorFixesAndAssertNotEmpty(sourceName, sensorFixes); } } diff --git a/java/com.sap.sailing.domain.vakarosadapter/src/com/sap/sailing/domain/vakarosadapter/VakarosExtendedDataImporterImpl.java b/java/com.sap.sailing.domain.vakarosadapter/src/com/sap/sailing/domain/vakarosadapter/VakarosExtendedDataImporterImpl.java index bdfb1799b18..4d4f227ba3a 100644 --- a/java/com.sap.sailing.domain.vakarosadapter/src/com/sap/sailing/domain/vakarosadapter/VakarosExtendedDataImporterImpl.java +++ b/java/com.sap.sailing.domain.vakarosadapter/src/com/sap/sailing/domain/vakarosadapter/VakarosExtendedDataImporterImpl.java @@ -4,21 +4,46 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Map; +import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sailing.domain.common.sensordata.ExpeditionExtendedSensorDataMetadata; +import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; import com.sap.sailing.domain.trackimport.FormatNotSupportedException; import com.sap.sailing.server.trackfiles.impl.ExpeditionExtendedDataImporterImpl; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util; +import com.sap.sse.common.impl.MillisecondsTimePoint; public class VakarosExtendedDataImporterImpl extends ExpeditionExtendedDataImporterImpl { private static final Logger logger = Logger.getLogger(VakarosExtendedDataImporterImpl.class.getName()); private static final DateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); private static final String VAKAROS_EXTENDED = "VAKAROS_EXTENDED"; + private static final String HEEL_COLUMN_HEADING = "roll"; + private static final String PITCH_COLUMN_HEADING = "pitch"; + private static final String LOAD_GDF1_COLUMN_HEADING = "load_gdf1"; + private static final String LOAD_GDF2_COLUMN_HEADING = "load_gdf2"; public VakarosExtendedDataImporterImpl() { - super(VAKAROS_EXTENDED); + super(VAKAROS_EXTENDED); // FIXME the ExpeditionImportFileHandler has a hard-coded set of file name extensions; we want our own! + } + + @Override + protected Map getColumnNamesToIndexInDoubleFix() { + return Util. mapBuilder() + .put(HEEL_COLUMN_HEADING, ExpeditionExtendedSensorDataMetadata.HEEL.getColumnIndex()) + .put(PITCH_COLUMN_HEADING, ExpeditionExtendedSensorDataMetadata.TRIM.getColumnIndex()) + .put(LOAD_GDF1_COLUMN_HEADING, ExpeditionExtendedSensorDataMetadata.FORESTAY_LOAD.getColumnIndex()) + .put(LOAD_GDF2_COLUMN_HEADING, ExpeditionExtendedSensorDataMetadata.EXPEDITION_KICKER_TENSION.getColumnIndex()) + .build(); + } + + @Override + protected TrackFileImportDeviceIdentifierImpl getTrackIdentifier(String filename, String sourceName) { + return new TrackFileImportDeviceIdentifierImpl( + UUID.randomUUID(), filename+"-SENSORS", sourceName, MillisecondsTimePoint.now()); } @Override diff --git a/java/com.sap.sailing.domain.vakarosadapter/src/com/sap/sailing/domain/vakarosadapter/VakarosGPSFixImporter.java b/java/com.sap.sailing.domain.vakarosadapter/src/com/sap/sailing/domain/vakarosadapter/VakarosGPSFixImporter.java index 335cbcc6d02..aaa9e56562a 100644 --- a/java/com.sap.sailing.domain.vakarosadapter/src/com/sap/sailing/domain/vakarosadapter/VakarosGPSFixImporter.java +++ b/java/com.sap.sailing.domain.vakarosadapter/src/com/sap/sailing/domain/vakarosadapter/VakarosGPSFixImporter.java @@ -6,7 +6,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.Arrays; -import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; @@ -17,10 +16,7 @@ import java.util.logging.Logger; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; -import com.sap.sailing.domain.common.sensordata.ExpeditionExtendedSensorDataMetadata; -import com.sap.sailing.domain.common.tracking.DoubleVectorFix; import com.sap.sailing.domain.common.tracking.GPSFixMoving; -import com.sap.sailing.domain.common.tracking.impl.DoubleVectorFixImpl; import com.sap.sailing.domain.common.tracking.impl.GPSFixMovingImpl; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; @@ -29,7 +25,6 @@ import com.sap.sailing.domain.trackimport.GPSFixImporter; import com.sap.sailing.server.trackfiles.impl.CompressedStreamsUtil; import com.sap.sailing.server.trackfiles.impl.ExpeditionImportFileHandler; import com.sap.sse.common.Bearing; -import com.sap.sse.common.Util; import com.sap.sse.common.impl.DegreeBearingImpl; public class VakarosGPSFixImporter implements GPSFixImporter { @@ -44,17 +39,7 @@ public class VakarosGPSFixImporter implements GPSFixImporter { private static final String SOG_COLUMN_HEADING = "sog_kts"; private static final String COG_COLUMN_HEADING = "cog"; private static final String HDG_COLUMN_HEADING = "hdg_true"; - private static final String HEEL_COLUMN_HEADING = "roll"; - private static final String PITCH_COLUMN_HEADING = "pitch"; - private static final String LOAD_GDF1_COLUMN_HEADING = "load_gdf1"; - private static final String LOAD_GDF2_COLUMN_HEADING = "load_gdf2"; - private static final int MAX_EXPEDITION_COLUMN_INDEX = Collections.max(Arrays.asList( - ExpeditionExtendedSensorDataMetadata.HEEL.getColumnIndex(), - ExpeditionExtendedSensorDataMetadata.TRIM.getColumnIndex(), - ExpeditionExtendedSensorDataMetadata.FORESTAY_LOAD.getColumnIndex(), - ExpeditionExtendedSensorDataMetadata.EXPEDITION_KICKER_TENSION.getColumnIndex()))+1; - private static final String VAKAROS_TYPE = "Vakaros"; @Override @@ -62,7 +47,6 @@ public class VakarosGPSFixImporter implements GPSFixImporter { boolean inferSpeedAndBearing, final String sourceName) throws FormatNotSupportedException, IOException { final TrackFileImportDeviceIdentifier gpsDevice = new TrackFileImportDeviceIdentifierImpl(sourceName, getType() + "@" + new Date()); - final TrackFileImportDeviceIdentifier sensorDevice = new TrackFileImportDeviceIdentifierImpl(sourceName+"-SENSORS", getType() + "@" + new Date()); final AtomicBoolean importedFixes = new AtomicBoolean(false); CompressedStreamsUtil.handlePotentiallyCompressedFiles(sourceName, inputStream, charset, new ExpeditionImportFileHandler() { @@ -102,13 +86,6 @@ public class VakarosGPSFixImporter implements GPSFixImporter { new KnotSpeedWithBearingImpl(sogKnots, new DegreeBearingImpl(cogDeg)), optionalTrueHeading); callback.addFix(fix, gpsDevice); - final Double[] fixData = new Double[MAX_EXPEDITION_COLUMN_INDEX]; - fixData[ExpeditionExtendedSensorDataMetadata.HEEL.getColumnIndex()] = parseOptionalValue(HEEL_COLUMN_HEADING, columnValues, columns); - fixData[ExpeditionExtendedSensorDataMetadata.TRIM.getColumnIndex()] = parseOptionalValue(PITCH_COLUMN_HEADING, columnValues, columns); - fixData[ExpeditionExtendedSensorDataMetadata.FORESTAY_LOAD.getColumnIndex()] = parseOptionalValue(LOAD_GDF1_COLUMN_HEADING, columnValues, columns); - fixData[ExpeditionExtendedSensorDataMetadata.EXPEDITION_KICKER_TENSION.getColumnIndex()] = parseOptionalValue(LOAD_GDF2_COLUMN_HEADING, columnValues, columns); - final DoubleVectorFix sensorFix = new DoubleVectorFixImpl(timePoint, fixData); - callback.addSensorFixes(Collections.singleton(sensorFix), sensorDevice); importedFixes.set(true); }); } @@ -118,18 +95,6 @@ public class VakarosGPSFixImporter implements GPSFixImporter { return importedFixes.get(); } - private Double parseOptionalValue(final String columnName, String[] columns, Map header) { - final Integer columnIndex = header.get(columnName); - final Double result; - if (columnIndex != null && columns.length > columnIndex) { - final String columnContent = columns[columnIndex]; - result = Util.hasLength(columnContent) ? Double.parseDouble(columnContent) : null; - } else { - result = null; - } - return result; - } - @Override public Iterable getSupportedFileExtensions() { return supportedExpeditionLogFileExtensions; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/DoubleVectorFixImporter.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/DoubleVectorFixImporter.java index 1c9efed220c..c6e671fd0d3 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/DoubleVectorFixImporter.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/DoubleVectorFixImporter.java @@ -19,14 +19,14 @@ public interface DoubleVectorFixImporter extends BaseDoubleVectorFixImporter { public static final String EXPEDITION_EXTENDED_TYPE = "EXPEDITION_EXTENDED"; /** - * Creates the {@link RegattaLogEvent} for the DeviceMapping. + * Creates the {@link RegattaLogEvent} for the DeviceMapping, mapping to a {@link Competitor} */ RegattaLogDeviceCompetitorSensorDataMappingEvent createEvent(TimePoint createdAt, TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, Competitor mappedTo, DeviceIdentifier device, TimePoint from, TimePoint to); /** - * Creates the {@link RegattaLogEvent} for the DeviceMapping. + * Creates the {@link RegattaLogEvent} for the DeviceMapping, mapping to a {@link Boat} */ RegattaLogDeviceBoatSensorDataMappingEvent createEvent(TimePoint createdAt, TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, Boat mappedTo, DeviceIdentifier device, diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java index b3d23155996..54f894ce1e0 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java @@ -5,7 +5,6 @@ import java.nio.charset.Charset; import java.util.Map; import com.sap.sailing.domain.common.DeviceIdentifier; -import com.sap.sailing.domain.common.tracking.DoubleVectorFix; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; @@ -50,8 +49,6 @@ public interface GPSFixImporter { default void addFixes(Iterable fixes, TrackFileImportDeviceIdentifier device) { fixes.forEach(fix->addFix(fix, device)); } - - default void addSensorFixes(Iterable sensorFixes, TrackFileImportDeviceIdentifier device) {} } /** diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java index 1150869248c..c1e72bc0f8f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java @@ -430,6 +430,10 @@ public class LegColumn extends ExpandableSortableColumn { new FormattedDoubleLeaderboardRowDTODetailTypeColumn(DetailType.EXPEDITION_LEG_MAST_BUTT, new DoubleDetailTypeExtractor(LegEntryDTO::getExpeditionMastButt), detailHeaderStyle, detailColumnStyle, leaderboardPanel)); + result.put(DetailType.EXPEDITION_RACE_KICKER_TENSION, + new FormattedDoubleLeaderboardRowDTODetailTypeColumn(DetailType.EXPEDITION_RACE_KICKER_TENSION, + new DoubleDetailTypeExtractor(LegEntryDTO::getExpeditionKickerTension), detailHeaderStyle, + detailColumnStyle, leaderboardPanel)); return result; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceWriteImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceWriteImpl.java index 6575f668d9c..1ac001288db 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceWriteImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceWriteImpl.java @@ -2551,6 +2551,12 @@ public class SailingServiceWriteImpl extends SailingServiceImpl implements Saili regattaLog.add(event); } + /** + * Uses the device mapping's {@link TypedDeviceMappingDTO#dataType dataType} to + * {@link #getRegisteredImporter(Class, String) determine} a matching {@link DoubleVectorFixImporter} for sensor + * data. This importer is then used to create the {@link RegattaLogEvent} for the device mapping which is then added + * to the {@link RegattaLog} for the {@link Leaderboard} identified by the {@code leaderboardName}. + */ @Override public void addTypedDeviceMappingToRegattaLog(String leaderboardName, TypedDeviceMappingDTO dto) throws NoCorrespondingServiceRegisteredException, TransformationException, DoesNotHaveRegattaLogException, @@ -2562,12 +2568,11 @@ public class SailingServiceWriteImpl extends SailingServiceImpl implements Saili RegattaLogEvent event = null; TimePoint from = mapping.getTimeRange().hasOpenBeginning() ? null : mapping.getTimeRange().from(); TimePoint to = mapping.getTimeRange().hasOpenEnd() ? null : mapping.getTimeRange().to(); + final DoubleVectorFixImporter importer = getRegisteredImporter(DoubleVectorFixImporter.class, dto.dataType); if (dto.mappedTo instanceof CompetitorWithBoatDTO) { - DoubleVectorFixImporter importer = getRegisteredImporter(DoubleVectorFixImporter.class, dto.dataType); event = importer.createEvent(now, now, getService().getServerAuthor(), UUID.randomUUID(), getCompetitor((CompetitorWithBoatDTO) dto.mappedTo), mapping.getDevice(), from, to); } else if (dto.mappedTo instanceof BoatDTO) { - DoubleVectorFixImporter importer = getRegisteredImporter(DoubleVectorFixImporter.class, dto.dataType); event = importer.createEvent(now, now, getService().getServerAuthor(), UUID.randomUUID(), getBoat((BoatDTO) dto.mappedTo), mapping.getDevice(), from, to); } else { diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/TrackFilesImporter.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/TrackFilesImporter.java index 9401ae51730..f2893278c83 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/TrackFilesImporter.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/trackfiles/impl/TrackFilesImporter.java @@ -20,7 +20,6 @@ import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import com.sap.sailing.domain.common.DeviceIdentifier; -import com.sap.sailing.domain.common.tracking.DoubleVectorFix; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; import com.sap.sailing.domain.trackimport.GPSFixImporter; @@ -93,13 +92,6 @@ public class TrackFilesImporter { storeFixes(fixes, device); deviceIds.add(device); } - - @Override - public void addSensorFixes(Iterable sensorFixes, - TrackFileImportDeviceIdentifier device) { - storeFixes(sensorFixes, device); - deviceIds.add(device); - } }, true, fileName); if (ok) { succeeded.set(ok); 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 04c2e1a6204..83617e82197 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 @@ -76,12 +76,15 @@ public class ExpeditionExtendedDataImporterImpl extends AbstractDoubleVectorFixI protected ExpeditionExtendedDataImporterImpl(String fixType) { super(fixType); - columnNamesInFileAndTheirValueIndexInResultingDoubleVectorFix = ExpeditionExtendedSensorDataMetadata - .getColumnNamesToIndexInDoubleFix(); + columnNamesInFileAndTheirValueIndexInResultingDoubleVectorFix = getColumnNamesToIndexInDoubleFix(); trackColumnCount = columnNamesInFileAndTheirValueIndexInResultingDoubleVectorFix.values().stream() .max((x, y) -> Integer.compare(x, y)).get() + 1; } + protected Map getColumnNamesToIndexInDoubleFix() { + return ExpeditionExtendedSensorDataMetadata.getColumnNamesToIndexInDoubleFix(); + } + @Override public RegattaLogDeviceCompetitorSensorDataMappingEvent createEvent(TimePoint createdAt, TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, Competitor mappedTo, DeviceIdentifier device, @@ -101,49 +104,51 @@ public class ExpeditionExtendedDataImporterImpl extends AbstractDoubleVectorFixI @Override public boolean importFixes(InputStream inputStream, Charset charset, final Callback callback, String filename, String sourceName, boolean downsample) throws FormatNotSupportedException, IOException { - final TrackFileImportDeviceIdentifier trackIdentifier = new TrackFileImportDeviceIdentifierImpl( - UUID.randomUUID(), filename, sourceName, MillisecondsTimePoint.now()); + final TrackFileImportDeviceIdentifier trackIdentifier = getTrackIdentifier(filename, sourceName); final AtomicBoolean importedFixes = new AtomicBoolean(false); CompressedStreamsUtil.handlePotentiallyCompressedFiles(filename, inputStream, charset, new ExpeditionImportFileHandler() { @Override protected void handleExpeditionFile(String fileName, InputStream inputStream, Charset charset) throws IOException, FormatNotSupportedException { logger.fine("Start parsing Expedition file"); final AtomicLong lineNr = new AtomicLong(); - try (BufferedReader buffer = new BufferedReader(new InputStreamReader(inputStream))) { - String headerLine = buffer.readLine(); + final BufferedReader buffer = new BufferedReader(new InputStreamReader(inputStream)); + String headerLine = buffer.readLine(); + lineNr.incrementAndGet(); + logger.fine("Validate and parse header columns"); + final Map colIndices = parseHeader(headerLine); + validateHeader(colIndices); + buffer.lines().forEach(line -> { lineNr.incrementAndGet(); - logger.fine("Validate and parse header columns"); - final Map colIndices = parseHeader(headerLine); - validateHeader(colIndices); - buffer.lines().forEach(line -> { - lineNr.incrementAndGet(); - if (!line.trim().isEmpty()) { - parseLine(lineNr.get(), filename, line, colIndices, - (timePoint, lineContentTokens, columnsInFileFromHeader) -> { - final Double[] trackFixData = new Double[trackColumnCount]; - for (final Entry columnFromFile : columnsInFileFromHeader.entrySet()) { + if (!line.trim().isEmpty()) { + parseLine(lineNr.get(), filename, line, colIndices, + (timePoint, lineContentTokens, columnsInFileFromHeader) -> { + final Double[] trackFixData = new Double[trackColumnCount]; + for (final Entry columnFromFile : columnsInFileFromHeader.entrySet()) { + final Integer indexInDoubleVectorFix = columnNamesInFileAndTheirValueIndexInResultingDoubleVectorFix.get(columnFromFile.getKey()); + if (indexInDoubleVectorFix != null) { final Double value = columnFromFile.getValue() >= lineContentTokens.length ? null : lineContentTokens[columnFromFile.getValue()].trim().isEmpty() ? null : Double.parseDouble(lineContentTokens[columnFromFile.getValue()]); - final Integer indexInDoubleVectorFix = columnNamesInFileAndTheirValueIndexInResultingDoubleVectorFix.get(columnFromFile.getKey()); - if (indexInDoubleVectorFix != null) { - trackFixData[indexInDoubleVectorFix] = value; - } + trackFixData[indexInDoubleVectorFix] = value; } - importedFixes.set(true); - callback.addFixes( - Collections.singleton(new DoubleVectorFixImpl(timePoint, trackFixData)), - trackIdentifier); - }); - } - }); - buffer.close(); - } + } + importedFixes.set(true); + callback.addFixes( + Collections.singleton(new DoubleVectorFixImpl(timePoint, trackFixData)), + trackIdentifier); + }); + } + }); } }); return importedFixes.get(); } + protected TrackFileImportDeviceIdentifierImpl getTrackIdentifier(String filename, String sourceName) { + return new TrackFileImportDeviceIdentifierImpl( + UUID.randomUUID(), filename, sourceName, MillisecondsTimePoint.now()); + } + /** * When the header contains one or more occurrences of {@link #ORIGINAL_POSITION_HEADER}, it is substituted by the * two header columns {@link #COL_NAME_LAT} and {@link #COL_NAME_LON} because that's how positions are stored in