diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java index 26c866592e1..ecdb66d92df 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java @@ -19,6 +19,7 @@ public enum BoatClassMasterdata { _470 ("470", true, 4.70, 1.68, BoatHullType.MONOHULL, true, "470er", "470M", "470W", "470 - M", "470 - W"), _5O5 ("5O5", true, 5.03, 1.88, BoatHullType.MONOHULL, true, "505", "5o5", "505er", "5o5er"), _5_5MR ("5.5mR", true, 9.50, 1.92, BoatHullType.MONOHULL, true, "5.5 Meter", "5.5 Metre", "5.5", "5.5M", "5.5-metre", "5.5 metre"), + _6MR ("6mR", true, 11, 2.2, BoatHullType.MONOHULL, true, "6 Meter", "6 Metre", "6", "6M", "6-metre", "6 metre"), _8MR ("8mR", true, 9.62, 2.45, BoatHullType.MONOHULL, true, "8 Meter", "8 Metre", "8M", "8-metre"), A_CAT ("A-Catamaran", true, 5.49, 2.30, BoatHullType.CATAMARAN, false, "A-Cat", "ACat", "A-Class Catamaran"), ALBIN_EXPRESS ("Albin Express", true, 7.77, 2.50, BoatHullType.MONOHULL, false), diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceStartedAndFinishedReceiver.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceStartedAndFinishedReceiver.java index 98bbded5fc6..fabd24351cf 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceStartedAndFinishedReceiver.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceStartedAndFinishedReceiver.java @@ -71,10 +71,18 @@ public class RaceStartedAndFinishedReceiver extends AbstractReceiverWithQueue +
  • In several places you can now find statistics regarding the highest speed and the competitor that produced it (fastest competitor). + These statistics are available for events and regattas as well as in the yearly statistics. +
  • July 2017
    diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/server/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/server/RaceContext.java index fa501e3f6e0..0cda630cbc8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/server/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/server/RaceContext.java @@ -615,7 +615,7 @@ public class RaceContext { * {@link RaceViewState#RUNNING}, false otherwise */ public boolean isLive() { - return getLiveRaceViewState() == RaceViewState.RUNNING; + return getLiveRaceViewState() == RaceViewState.RUNNING || getLiveRaceViewState() == RaceViewState.FINISHING; } public Collection getCompetitors() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index df0a1a1e31d..519269664be 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -5865,18 +5865,23 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public List getTrackFileImportDeviceIds(List uuids) throws NoCorrespondingServiceRegisteredException, TransformationException { - List result = new ArrayList<>(); - for (String uuidAsString : uuids) { - UUID uuid = UUID.fromString(uuidAsString); - TrackFileImportDeviceIdentifier device = TrackFileImportDeviceIdentifierImpl.getOrCreate(uuid); - long numFixes = getService().getSensorFixStore().getNumberOfFixes(device); - TimeRange timeRange = getService().getSensorFixStore().getTimeRangeCoveredByFixes(device); - Date from = timeRange == null ? null : timeRange.from().asDate(); - Date to = timeRange == null ? null : timeRange.to().asDate(); - result.add(new TrackFileImportDeviceIdentifierDTO(uuidAsString, device.getFileName(), device.getTrackName(), - numFixes, from, to)); + try { + final List result = new ArrayList<>(); + for (String uuidAsString : uuids) { + UUID uuid = UUID.fromString(uuidAsString); + TrackFileImportDeviceIdentifier device = TrackFileImportDeviceIdentifierImpl.getOrCreate(uuid); + long numFixes = getService().getSensorFixStore().getNumberOfFixes(device); + TimeRange timeRange = getService().getSensorFixStore().getTimeRangeCoveredByFixes(device); + Date from = timeRange == null ? null : timeRange.from().asDate(); + Date to = timeRange == null ? null : timeRange.to().asDate(); + result.add(new TrackFileImportDeviceIdentifierDTO(uuidAsString, device.getFileName(), device.getTrackName(), + numFixes, from, to)); + } + return result; + } catch (Exception e) { + logger.log(Level.SEVERE, "Exception trying to obtain track file import device IDs", e); + throw e; } - return result; } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/boatclass/6MR.png b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/boatclass/6MR.png new file mode 100755 index 00000000000..3820d905966 Binary files /dev/null and b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/boatclass/6MR.png differ diff --git a/java/com.sap.sailing.nmeaconnector.test/resources/NMEA.zip b/java/com.sap.sailing.nmeaconnector.test/resources/NMEA.zip new file mode 100755 index 00000000000..6180b2c5d21 Binary files /dev/null and b/java/com.sap.sailing.nmeaconnector.test/resources/NMEA.zip differ diff --git a/java/com.sap.sailing.nmeaconnector.test/resources/NMEA_Snippet.zip b/java/com.sap.sailing.nmeaconnector.test/resources/NMEA_Snippet.zip new file mode 100755 index 00000000000..a2a7a576525 Binary files /dev/null and b/java/com.sap.sailing.nmeaconnector.test/resources/NMEA_Snippet.zip differ diff --git a/java/com.sap.sailing.nmeaconnector.test/src/com/sap/sailing/nmeaconnector/test/NmeaFromZipImportTest.java b/java/com.sap.sailing.nmeaconnector.test/src/com/sap/sailing/nmeaconnector/test/NmeaFromZipImportTest.java index 50eae68411f..34522d50e31 100755 --- a/java/com.sap.sailing.nmeaconnector.test/src/com/sap/sailing/nmeaconnector/test/NmeaFromZipImportTest.java +++ b/java/com.sap.sailing.nmeaconnector.test/src/com/sap/sailing/nmeaconnector/test/NmeaFromZipImportTest.java @@ -1,5 +1,6 @@ package com.sap.sailing.nmeaconnector.test; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.FileInputStream; @@ -48,4 +49,28 @@ public class NmeaFromZipImportTest { } } } + + @Test + public void testYetAnotherZipFile() throws IOException, InterruptedException { + zipInputStream = new ZipInputStream(new FileInputStream("resources/NMEA.zip")); + ZipEntry entry; + while ((entry=zipInputStream.getNextEntry()) != null) { + if (entry.getName().toLowerCase().endsWith(".txt")) { + Iterable windFixes = NmeaFactory.INSTANCE.readWind(zipInputStream); + assertEquals(740, Util.size(windFixes)); + } + } + } + + @Test + public void testZipFileExcerptWithOnlyEmptyWindRecords() throws IOException, InterruptedException { + zipInputStream = new ZipInputStream(new FileInputStream("resources/NMEA_Snippet.zip")); + ZipEntry entry; + while ((entry=zipInputStream.getNextEntry()) != null) { + if (entry.getName().toLowerCase().endsWith(".txt")) { + Iterable windFixes = NmeaFactory.INSTANCE.readWind(zipInputStream); + assertTrue(Util.isEmpty(windFixes)); + } + } + } } diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/AbstractEnrichingProcessor.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/AbstractEnrichingProcessor.java index 3ecd707f765..3aab33581db 100644 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/AbstractEnrichingProcessor.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/AbstractEnrichingProcessor.java @@ -25,7 +25,6 @@ public abstract class AbstractEnrichingProcessor extends @Override protected ProcessorInstruction createInstruction(final InputType element) { return new AbstractProcessorInstruction(this) { - @Override public ResultType computeResult() { return enrich(element); diff --git a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java index fe2359ceed6..d083b73f030 100755 --- a/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java +++ b/java/com.sap.sailing.polars/src/com/sap/sailing/polars/mining/PolarDataMiner.java @@ -193,7 +193,6 @@ public class PolarDataMiner { preFilteringProcessor = new ParallelFilteringProcessor( GPSFixMovingWithOriginInfo.class, executor, preFilterResultReceivers, new FilterCriterion() { - @Override public boolean matches(GPSFixMovingWithOriginInfo element) { boolean result = false; @@ -434,7 +433,7 @@ public class PolarDataMiner { } public void raceFinishedTracking(TrackedRace race) { - Set fixes = null; + final Set fixes; synchronized (fixesForRacesWhichAreStillLoading) { fixes = fixesForRacesWhichAreStillLoading.remove(race); } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java index a391e799331..4f18d4c3aaf 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupJsonExportServlet.java @@ -1,6 +1,8 @@ package com.sap.sailing.server.gateway.impl.rc; import java.io.IOException; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import javax.servlet.ServletException; @@ -11,11 +13,13 @@ import org.json.simple.JSONArray; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.racegroup.RaceGroup; import com.sap.sailing.domain.common.racelog.RaceLogServletConstants; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; +import com.sap.sailing.domain.leaderboard.RegattaLeaderboardWithEliminations; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; import com.sap.sailing.server.gateway.serialization.JsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.BoatClassJsonSerializer; @@ -41,7 +45,6 @@ public class RaceGroupJsonExportServlet extends AbstractJsonHttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String courseAreaFilter = request.getParameter(RaceLogServletConstants.PARAM_COURSE_AREA_FILTER); if (courseAreaFilter == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Need to set a course area filter."); @@ -52,7 +55,6 @@ public class RaceGroupJsonExportServlet extends AbstractJsonHttpServlet { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Course area filter must be valid UUID."); return; } - CourseArea filterCourseArea = getService().getCourseArea(courseAreaId); if (filterCourseArea == null) { response.sendError(HttpServletResponse.SC_NOT_FOUND, "No course area found with given UUID."); @@ -67,20 +69,26 @@ public class RaceGroupJsonExportServlet extends AbstractJsonHttpServlet { } JsonSerializer serializer = createSerializer(clientUuid); JSONArray result = new JSONArray(); - RaceGroupFactory raceGroupFactory = new RaceGroupFactory(); + final Set regattasForWhichRegattaLeaderboardsWereAdded = new HashSet<>(); for (Leaderboard leaderboard : getService().getLeaderboards().values()) { if (filterCourseArea.equals(leaderboard.getDefaultCourseArea())) { - RaceGroup raceGroup = null; - if (leaderboard instanceof RegattaLeaderboard) { - raceGroup = raceGroupFactory.convert((RegattaLeaderboard) leaderboard); + if (leaderboard instanceof RegattaLeaderboard && !(leaderboard instanceof RegattaLeaderboardWithEliminations)) { + result.add(serializer.serialize(raceGroupFactory.convert((RegattaLeaderboard) leaderboard))); + regattasForWhichRegattaLeaderboardsWereAdded.add(((RegattaLeaderboard) leaderboard).getRegatta()); } else if (leaderboard instanceof FlexibleLeaderboard) { - raceGroup = raceGroupFactory.convert((FlexibleLeaderboard) leaderboard); + result.add(serializer.serialize(raceGroupFactory.convert((FlexibleLeaderboard) leaderboard))); } - result.add(serializer.serialize(raceGroup)); } } - + // now add only those RegattaLeaderboardWithEliminations for which the original RegattaLeaderboard hasn't been added + for (Leaderboard leaderboard : getService().getLeaderboards().values()) { + if (leaderboard instanceof RegattaLeaderboardWithEliminations && + filterCourseArea.equals(leaderboard.getDefaultCourseArea()) && + !regattasForWhichRegattaLeaderboardsWereAdded.contains(((RegattaLeaderboardWithEliminations) leaderboard).getRegatta())) { + result.add(serializer.serialize(raceGroupFactory.convert((RegattaLeaderboardWithEliminations) leaderboard))); + } + } setJsonResponseHeader(response); result.writeJSONString(response.getWriter()); } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/AbstractWindImportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/AbstractWindImportServlet.java index f057de15f7b..b798cff553f 100755 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/AbstractWindImportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/AbstractWindImportServlet.java @@ -7,6 +7,8 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -34,7 +36,7 @@ import com.sap.sailing.server.gateway.windimport.AbstractWindImportServlet.WindI import com.sap.sse.common.Util; public abstract class AbstractWindImportServlet extends SailingServerHttpServlet { - + private static final Logger logger = Logger.getLogger(AbstractWindImportServlet.class.getName()); private static final long serialVersionUID = 1L; public static class UploadRequest { @@ -192,6 +194,7 @@ public abstract class AbstractWindImportServlet extends SailingServerHttpServlet // Use text/html to prevent browsers from wrapping the response body, // see "Handling File Upload Responses in GWT" at http://www.artofsolving.com/node/50 } catch (Exception e) { + logger.log(Level.SEVERE, "Error ocurred trying to import wind fixes", e); windImportResult.error = e.toString(); } response.setContentType("text/html;charset=UTF-8"); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/impl/MediaMasterDataExportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/impl/MediaMasterDataExportTest.java index e0de6161d4c..3af3e095716 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/impl/MediaMasterDataExportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/impl/MediaMasterDataExportTest.java @@ -139,8 +139,6 @@ public class MediaMasterDataExportTest { Fleet defaultFleet = raceColumn.getFleets().iterator().next(); raceColumn.setRaceIdentifier(defaultFleet, regattaAndRaceIdentifier); } - - List leaderboards = Arrays.asList(regattaLeaderboard, flexibleLeaderboard); LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl("name", "description", "displayName", displayGroupsInReverseOrder , leaderboards); Set groupsToExport = Collections.singleton(leaderboardGroup); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RemoteSailingServerSet.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RemoteSailingServerSet.java index b95d2967345..f7aad2aa658 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RemoteSailingServerSet.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RemoteSailingServerSet.java @@ -321,9 +321,10 @@ public class RemoteSailingServerSet { if (ref != null) { cachedEventsForRemoteSailingServers.remove(ref); cachedStatisticsByYearForRemoteSailingServers.remove(ref); + cachedTrackedRacesForRemoteSailingServers.remove(ref); } return ref; - }finally{ + } finally { LockUtil.unlockAfterWrite(lock); } } diff --git a/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF b/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF index b50f98b4ef6..8c8a52ae7f9 100644 --- a/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF +++ b/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: TracTrac Client module Bundle-SymbolicName: com.tractrac.clientmodule -Bundle-Version: 3.7.5 +Bundle-Version: 3.7.6 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ClassPath: ., lib/TracAPI.jar diff --git a/java/com.tractrac.clientmodule/README.txt b/java/com.tractrac.clientmodule/README.txt index 118dc6bfed1..ed378377234 100755 --- a/java/com.tractrac.clientmodule/README.txt +++ b/java/com.tractrac.clientmodule/README.txt @@ -16,6 +16,28 @@ It contains also some files: - test.sh -> script that compiles the code in the src folder, creates the test.jar library and execute the code of the example. - Manifest.txt -> manifest used to create the test.jar file +******************************************** +************* TracAPI 3.7.6 **************** +******************************************** + This is a final version.It fixes bugs in the implementation and it adds a some features. + It keeps the backward compatibility. + + Release date: 14/08/2017 + Build number: 14241 + + 1) Features + + - Two new RaceCompetitorStatusType values have been added: 8 (Did not finish) and 9 (Missing data). (Requested by + Chris Terkelsen, 28/07/2017) + + 2) Bugs + + - Releasing the memory when the ISubscriber.close method is called (Reported by Axel Uhl, 04/08/2017) + - The live messages (e.g: race start time updated, live delay updated...) are not arriving sometimes, + despite of the server is sending them all the time. The implementation of this part has been + downgraded to the version used in TracAPI 3.6.x (Reported by SAP) + + ******************************************** ************* TracAPI 3.7.5 **************** ******************************************** diff --git a/java/com.tractrac.clientmodule/lib/TracAPI-src.jar b/java/com.tractrac.clientmodule/lib/TracAPI-src.jar index c90ba50030a..82a8a85569b 100755 Binary files a/java/com.tractrac.clientmodule/lib/TracAPI-src.jar and b/java/com.tractrac.clientmodule/lib/TracAPI-src.jar differ diff --git a/java/com.tractrac.clientmodule/lib/TracAPI.jar b/java/com.tractrac.clientmodule/lib/TracAPI.jar index f9a381c45b0..5846cc96911 100755 Binary files a/java/com.tractrac.clientmodule/lib/TracAPI.jar and b/java/com.tractrac.clientmodule/lib/TracAPI.jar differ diff --git a/java/com.tractrac.clientmodule/pom.xml b/java/com.tractrac.clientmodule/pom.xml index 61ec3353fa1..a103a2ffb9e 100755 --- a/java/com.tractrac.clientmodule/pom.xml +++ b/java/com.tractrac.clientmodule/pom.xml @@ -8,6 +8,6 @@ 1.0.0-SNAPSHOT com.tractrac.clientmodule - 3.7.5 + 3.7.6 eclipse-plugin