From 0cd82fb9f3037e7e0597d82c45b5d374602cbee5 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 10 Jun 2016 16:31:05 +0200 Subject: [PATCH 01/11] a failing test case for replicating the effects of a master data import with media tracks; some test refactoring and a new testsupport bundle Change-Id: Ib63d4511e75e6a37f61e5feb6d9c05429e6bba4e --- .../sailing/domain/test/TrackBasedTest.java | 42 ++++++ .../META-INF/MANIFEST.MF | 5 +- .../test/MediaReplicationTest.java | 128 ++++++++++++++++++ .../META-INF/MANIFEST.MF | 6 +- .../impl/MediaMasterDataExportTest.java | 52 ++----- .../server/test/MasterDataImportTest.java | 19 +-- .../server/test/RaceTrackerStartStopTest.java | 1 + .../.settings/org.eclipse.jdt.core.prefs | 7 + .../.settings/org.eclipse.pde.core.prefs | 3 + .../META-INF/MANIFEST.MF | 16 +++ .../pom.xml | 12 ++ .../RacingEventServiceImplMock.java | 2 +- .../META-INF/MANIFEST.MF | 3 +- java/pom.xml | 1 + 14 files changed, 234 insertions(+), 63 deletions(-) create mode 100644 java/com.sap.sailing.server.testsupport/.settings/org.eclipse.jdt.core.prefs create mode 100644 java/com.sap.sailing.server.testsupport/.settings/org.eclipse.pde.core.prefs create mode 100644 java/com.sap.sailing.server.testsupport/META-INF/MANIFEST.MF create mode 100644 java/com.sap.sailing.server.testsupport/pom.xml rename java/{com.sap.sailing.server.test/src/com/sap/sailing/server/test => com.sap.sailing.server.testsupport/src/com/sap/sailing/server/testsupport}/RacingEventServiceImplMock.java (94%) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java index 8f6d3b1d2c6..19a0138cafe 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java @@ -2,34 +2,46 @@ package com.sap.sailing.domain.test; import static org.mockito.Mockito.mock; +import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.UUID; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; +import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.Course; +import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.DomainFactory; +import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.BoatImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.ControlPointWithTwoMarksImpl; +import com.sap.sailing.domain.base.impl.CourseAreaImpl; import com.sap.sailing.domain.base.impl.CourseImpl; +import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.MarkImpl; import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; +import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; +import com.sap.sailing.domain.common.BoatClassMasterdata; +import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; @@ -38,23 +50,30 @@ import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.common.impl.WindImpl; import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.tracking.impl.GPSFixImpl; +import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; +import com.sap.sailing.domain.leaderboard.ScoringScheme; +import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; import com.sap.sailing.domain.racelog.tracking.EmptyGPSFixStore; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.TrackedRegatta; +import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.domain.tracking.impl.MarkPassingImpl; import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; public abstract class TrackBasedTest { private DynamicTrackedRaceImpl trackedRace; + final static Fleet regattaFleet = new FleetImpl("fleet name"); + protected DynamicTrackedRaceImpl getTrackedRace() { return trackedRace; } @@ -140,4 +159,27 @@ public abstract class TrackBasedTest { return trackedRace; } + public static RegattaImpl createTestRegatta(String regattaName, Iterable raceColumnNames) { + final BoatClass boatClass = new BoatClassImpl("boat class name", BoatClassMasterdata._12M); + final TimePoint startDate = MillisecondsTimePoint.now(); + final TimePoint endDate = startDate.plus(MillisecondsDurationImpl.ONE_DAY); + final boolean isMedal = false; + final boolean persistent = false; + final ScoringScheme scoringScheme = new LowPoint(); + final CourseArea courseArea = new CourseAreaImpl("Course Area", UUID.randomUUID()); + final Serializable regatteId = "regatta id"; + + Iterable regattaFleets = Collections.singleton(regattaFleet); + TrackedRegattaRegistry trackedRegattaRegistry = mock(TrackedRegattaRegistry.class); + Series series = new SeriesImpl("series name", isMedal, /* isFleetsCanRunInParallel */ true, regattaFleets, raceColumnNames, trackedRegattaRegistry); + Iterable regattaSeries = Collections.singleton(series); + return new RegattaImpl(regattaName, boatClass, startDate, endDate, regattaSeries, persistent, scoringScheme, regatteId , courseArea, OneDesignRankingMetric::new); + } + + public static void assignRacesToRegattaLeaderboardColumns(RegattaLeaderboard leaderboard, Collection raceIdentifiers) { + Iterator regattaRacesIterator = raceIdentifiers.iterator(); + for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { + raceColumn.setRaceIdentifier(regattaFleet, regattaRacesIterator.next()); + } + } } diff --git a/java/com.sap.sailing.server.replication.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.server.replication.test/META-INF/MANIFEST.MF index 29dcfc7528e..84dde5ee175 100644 --- a/java/com.sap.sailing.server.replication.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server.replication.test/META-INF/MANIFEST.MF @@ -27,4 +27,7 @@ Require-Bundle: com.sap.sailing.server, com.sap.sailing.domain.shared.android, com.sap.sse.replication.testsupport, com.sap.sse.filestorage, - com.sap.sse.shared.android + com.sap.sse.shared.android, + com.sap.sailing.server.gateway, + javax.ws.rs, + com.sap.sailing.server.testsupport diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java index a9a55df6201..2d5a8a09546 100644 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java @@ -4,21 +4,51 @@ import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.MalformedURLException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.UUID; + +import javax.ws.rs.core.Response; +import javax.ws.rs.core.StreamingOutput; import org.junit.Test; +import com.sap.sailing.domain.base.DomainFactory; +import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaNameAndRaceName; +import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.media.MediaTrack; +import com.sap.sailing.domain.leaderboard.LeaderboardGroup; +import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; +import com.sap.sailing.domain.test.TrackBasedTest; +import com.sap.sailing.server.RacingEventService; +import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; +import com.sap.sailing.server.gateway.jaxrs.spi.MasterDataResource; +import com.sap.sailing.server.impl.RacingEventServiceImpl; +import com.sap.sailing.server.masterdata.MasterDataImporter; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.media.MimeType; +import com.sap.sse.mongodb.MongoDBConfiguration; +import com.sap.sse.mongodb.MongoDBService; + +import junit.framework.Assert; public class MediaReplicationTest extends AbstractServerReplicationTest { @@ -153,4 +183,102 @@ public class MediaReplicationTest extends AbstractServerReplicationTest { assertThat(replica.getAllMediaTracks().iterator().next().assignedRaces, is(mediaTrack.assignedRaces)); } + @Test + public void testMasterDataImportForMediaTracks() throws MalformedURLException, IOException, InterruptedException, + ClassNotFoundException { + // Setup source service + RacingEventService sourceService = new RacingEventServiceImpl(); + Set assignedRaces = new HashSet(); + String regattaName1 = "49er"; + String regattaName2 = "49er FX"; + String missingRegattaName = "Missing Regatta"; + String raceName1 = "R1"; + String raceName2 = "R2"; + String raceName3 = "R3"; + String raceName4 = "R4"; + String raceName5 = "R5"; + String missingRaceName = "Missing Race"; + assignedRaces.add(new RegattaNameAndRaceName(regattaName1, raceName1)); + assignedRaces.add(new RegattaNameAndRaceName(regattaName1, raceName2)); + assignedRaces.add(new RegattaNameAndRaceName(regattaName1, raceName3)); + assignedRaces.add(new RegattaNameAndRaceName(regattaName2, raceName4)); + assignedRaces.add(new RegattaNameAndRaceName(regattaName2, raceName5)); + assignedRaces.add(new RegattaNameAndRaceName(missingRegattaName, missingRaceName)); + MediaTrack trackOnSource = new MediaTrack("testTitle", "http://test/test.mp4", new MillisecondsTimePoint(0), + MillisecondsDurationImpl.ONE_HOUR, MimeType.mp4, assignedRaces); + sourceService.mediaTrackAdded(trackOnSource); + + Collection raceColumnNames = Arrays.asList(raceName1, raceName2, raceName3, raceName4, raceName5); + Regatta regatta = TrackBasedTest.createTestRegatta(regattaName1, raceColumnNames); + sourceService.addRegattaWithoutReplication(regatta); + int[] discardThresholds = new int[0]; + RegattaLeaderboard leaderboard = sourceService.addRegattaLeaderboard(regatta.getRegattaIdentifier(), + "leaderboard display name", discardThresholds); + Collection raceIdentifiers = Arrays.asList(new RegattaNameAndRaceName(regattaName1, raceName1), + new RegattaNameAndRaceName(regattaName1, raceName2), + new RegattaNameAndRaceName(regattaName1, raceName3), + new RegattaNameAndRaceName(regattaName2, raceName4), + new RegattaNameAndRaceName(regattaName2, raceName5)); + TrackBasedTest.assignRacesToRegattaLeaderboardColumns(leaderboard, raceIdentifiers); + boolean displayGroupsInReverseOrder = false; + int[] overallLeaderboardDiscardThresholds = new int[0]; + UUID leaderboardGropuUuid = UUID.randomUUID(); + LeaderboardGroup leaderboardGroup = sourceService.addLeaderboardGroup(leaderboardGropuUuid, + "leaderboard group name", "leaderboard group description", "leaderboard group display name", + displayGroupsInReverseOrder, Collections.singletonList(leaderboard.getName()), + overallLeaderboardDiscardThresholds, ScoringSchemeType.LOW_POINT); + + // Serialize + List groupNamesToExport = Collections.singletonList(leaderboardGroup.getName()); + + final DomainFactory domainFactory; + MasterDataResource resource = new MasterDataResource(); + MasterDataResource spyResource = spyResource(resource, sourceService); + Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false, true, false); + StreamingOutput streamingOutput = (StreamingOutput) response.getEntity(); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + UUID randomUUID = UUID.randomUUID(); + ByteArrayInputStream inputStream = null; + try { + streamingOutput.write(os); + os.flush(); + // Delete all data above from the database, to allow recreating all of it on target server + deleteAllDataFromDatabase(); + // Import in new service + domainFactory = master.getBaseDomainFactory(); + inputStream = new ByteArrayInputStream(os.toByteArray()); + MasterDataImporter importer = new MasterDataImporter(domainFactory, master); + importer.importFromStream(inputStream, randomUUID, false); + } finally { + os.close(); + inputStream.close(); + } + + // ---Asserts--- + final Iterable targetTracksMaster = master.getAllMediaTracks(); + compareTracks(trackOnSource, targetTracksMaster); + final Iterable targetTracksReplica = replica.getAllMediaTracks(); + compareTracks(trackOnSource, targetTracksReplica); + } + + private void compareTracks(MediaTrack trackOnSource, Iterable targetTracksMaster) { + Assert.assertEquals(1, Util.size(targetTracksMaster)); + MediaTrack trackOnTarget = targetTracksMaster.iterator().next(); + Assert.assertEquals(trackOnSource.dbId, trackOnTarget.dbId); + Assert.assertEquals(trackOnSource.url, trackOnTarget.url); + Assert.assertEquals(trackOnSource.assignedRaces, trackOnTarget.assignedRaces); + } + + private T spyResource(T resource, RacingEventService service) { + T spyResource = spy(resource); + doReturn(service).when(spyResource).getService(); + return spyResource; + } + + private void deleteAllDataFromDatabase() { + MongoDBService service = MongoDBConfiguration.getDefaultTestConfiguration().getService(); + service.getDB().getWriteConcern().fsync(); + service.getDB().dropDatabase(); + } + } diff --git a/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF index f442ef22283..223ffba5d1c 100644 --- a/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF @@ -21,9 +21,11 @@ Require-Bundle: com.sap.sailing.domain, com.sap.sse.common, org.eclipse.jetty.server;bundle-version="9.2.2", com.sap.sailing.domain.shared.android, - com.sap.sailing.domain.racelogtrackingadapter.testsupport + com.sap.sailing.domain.racelogtrackingadapter.testsupport, + com.sap.sailing.server.testsupport Import-Package: com.sap.sailing.server.gateway.jaxrs, com.sap.sailing.server.gateway.jaxrs.spi, org.json.simple, javax.ws.rs.core;version="1.1.1" -Export-Package: com.sap.sailing.server.impl +Export-Package: com.sap.sailing.server.impl, + com.sap.sailing.server.test 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 bf6f4c88ca5..1a6fc8632c4 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 @@ -3,13 +3,11 @@ package com.sap.sailing.server.impl; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; -import java.io.Serializable; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -17,19 +15,12 @@ import java.util.UUID; import org.junit.Test; -import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Event; 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.BoatClassImpl; import com.sap.sailing.domain.base.impl.CourseAreaImpl; -import com.sap.sailing.domain.base.impl.FleetImpl; -import com.sap.sailing.domain.base.impl.RegattaImpl; -import com.sap.sailing.domain.base.impl.SeriesImpl; -import com.sap.sailing.domain.common.BoatClassMasterdata; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaNameAndRaceName; @@ -47,12 +38,9 @@ import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.masterdataimport.TopLevelMasterData; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; -import com.sap.sailing.domain.ranking.OneDesignRankingMetric; -import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; +import com.sap.sailing.domain.test.TrackBasedTest; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; -import com.sap.sse.common.impl.MillisecondsDurationImpl; -import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.media.MimeType; public class MediaMasterDataExportTest { @@ -66,17 +54,11 @@ public class MediaMasterDataExportTest { static final String missingRace2 = "missing race 2"; static final String missingRace3 = "missing race 3"; - static final boolean displayGroupsInReverseOrder = true; - static final ThresholdBasedResultDiscardingRule resultDiscardingRule = new ThresholdBasedResultDiscardingRuleImpl(new int[0]); - static final BoatClass boatClass = new BoatClassImpl("boat class name", BoatClassMasterdata._12M); - static final TimePoint startDate = MillisecondsTimePoint.now(); - static final TimePoint endDate = startDate.plus(MillisecondsDurationImpl.ONE_DAY); - static final boolean isMedal = false; - static final Fleet regattaFleet = new FleetImpl("fleet name"); - static final boolean persistent = false; - static final ScoringScheme scoringScheme = new LowPoint(); - static final CourseArea courseArea = new CourseAreaImpl("Course Area", UUID.randomUUID()); - static final Serializable regatteId = "regatta id"; + private static final boolean displayGroupsInReverseOrder = true; + private static final ThresholdBasedResultDiscardingRule resultDiscardingRule = new ThresholdBasedResultDiscardingRuleImpl(new int[0]); + private static final boolean isMedal = false; + private static final ScoringScheme scoringScheme = new LowPoint(); + private static final CourseArea courseArea = new CourseAreaImpl("Course Area", UUID.randomUUID()); @Test public void testTrackWithAssignedRaceButEmptyLeaderboardGroup() { @@ -147,9 +129,9 @@ public class MediaMasterDataExportTest { for (RaceIdentifier regattaAndRaceIdentifier : regattaRaces) { raceColumnNames.add(regattaAndRaceIdentifier.getRaceName()); } - Regatta regatta = createTestRegatta("regatta name", raceColumnNames); + Regatta regatta = TrackBasedTest.createTestRegatta("regatta name", raceColumnNames); RegattaLeaderboard regattaLeaderboard = new RegattaLeaderboardImpl(regatta, resultDiscardingRule); - assignRacesToRegattaLeaderboardColumns(regattaLeaderboard, regattaRaces); + TrackBasedTest.assignRacesToRegattaLeaderboardColumns(regattaLeaderboard, regattaRaces); FlexibleLeaderboard flexibleLeaderboard = new FlexibleLeaderboardImpl("flexible leaderboard", resultDiscardingRule, scoringScheme , courseArea); for (RaceIdentifier regattaAndRaceIdentifier : flexibleRaces) { @@ -169,22 +151,4 @@ public class MediaMasterDataExportTest { TopLevelMasterData topLevelMasterData = new TopLevelMasterData(groupsToExport , allEvents , regattaForRaceIdString, allMediaTracks , gpsFixStore , exportWind, new HashMap<>()); return topLevelMasterData; } - - public static void assignRacesToRegattaLeaderboardColumns(RegattaLeaderboard leaderboard, Collection raceIdentifiers) { - Iterator regattaRacesIterator = raceIdentifiers.iterator(); - for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - raceColumn.setRaceIdentifier(regattaFleet, regattaRacesIterator.next()); - } - } - - public static RegattaImpl createTestRegatta(String regattaName, Iterable raceColumnNames) { - Iterable regattaFleets = Collections.singleton(regattaFleet); - TrackedRegattaRegistry trackedRegattaRegistry = mock(TrackedRegattaRegistry.class); - Series series = new SeriesImpl("series name", isMedal, /* isFleetsCanRunInParallel */ true, regattaFleets, raceColumnNames, trackedRegattaRegistry); - Iterable regattaSeries = Collections.singleton(series); - return new RegattaImpl(regattaName, boatClass, startDate, endDate, regattaSeries, persistent, scoringScheme, regatteId , courseArea, OneDesignRankingMetric::new); - } - - - } diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index 89838f6c62e..3ba27d9fa33 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -112,6 +112,7 @@ import com.sap.sailing.domain.racelog.tracking.test.mock.MockSmartphoneImeiServi import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; +import com.sap.sailing.domain.test.TrackBasedTest; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.WindTrack; @@ -119,10 +120,10 @@ import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; import com.sap.sailing.server.gateway.jaxrs.spi.MasterDataResource; -import com.sap.sailing.server.impl.MediaMasterDataExportTest; import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.masterdata.DummyTrackedRace; import com.sap.sailing.server.masterdata.MasterDataImporter; +import com.sap.sailing.server.testsupport.RacingEventServiceImplMock; import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; @@ -1743,7 +1744,7 @@ public class MasterDataImportTest { sourceService.mediaTrackAdded(trackOnSource); Collection raceColumnNames = Arrays.asList(raceName1, raceName2, raceName3, raceName4, raceName5); - Regatta regatta = MediaMasterDataExportTest.createTestRegatta(regattaName1, raceColumnNames); + Regatta regatta = TrackBasedTest.createTestRegatta(regattaName1, raceColumnNames); sourceService.addRegattaWithoutReplication(regatta); int[] discardThresholds = new int[0]; RegattaLeaderboard leaderboard = sourceService.addRegattaLeaderboard(regatta.getRegattaIdentifier(), @@ -1753,7 +1754,7 @@ public class MasterDataImportTest { new RegattaNameAndRaceName(regattaName1, raceName3), new RegattaNameAndRaceName(regattaName2, raceName4), new RegattaNameAndRaceName(regattaName2, raceName5)); - MediaMasterDataExportTest.assignRacesToRegattaLeaderboardColumns(leaderboard, raceIdentifiers); + TrackBasedTest.assignRacesToRegattaLeaderboardColumns(leaderboard, raceIdentifiers); boolean displayGroupsInReverseOrder = false; int[] overallLeaderboardDiscardThresholds = new int[0]; UUID leaderboardGropuUuid = UUID.randomUUID(); @@ -1790,26 +1791,16 @@ public class MasterDataImportTest { os.close(); inputStream.close(); } - - MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID) - .getResult(); + MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID).getResult(); // ---Asserts--- - Assert.assertNotNull(creationCount); - Iterable targetTracks = destService.getAllMediaTracks(); - Assert.assertEquals(1, Util.size(targetTracks)); - MediaTrack trackOnTarget = targetTracks.iterator().next(); - Assert.assertEquals(trackOnSource.dbId, trackOnTarget.dbId); - Assert.assertEquals(trackOnSource.url, trackOnTarget.url); - Assert.assertEquals(trackOnSource.assignedRaces, trackOnTarget.assignedRaces); - } @Test diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java index 46b54829df6..696fb8f9f88 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java @@ -42,6 +42,7 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.server.RacingEventService; +import com.sap.sailing.server.testsupport.RacingEventServiceImplMock; public class RaceTrackerStartStopTest { diff --git a/java/com.sap.sailing.server.testsupport/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sailing.server.testsupport/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..295926d9641 --- /dev/null +++ b/java/com.sap.sailing.server.testsupport/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/java/com.sap.sailing.server.testsupport/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sailing.server.testsupport/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 00000000000..b7e72d019c2 --- /dev/null +++ b/java/com.sap.sailing.server.testsupport/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/java/com.sap.sailing.server.testsupport/META-INF/MANIFEST.MF b/java/com.sap.sailing.server.testsupport/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..f7c0599834d --- /dev/null +++ b/java/com.sap.sailing.server.testsupport/META-INF/MANIFEST.MF @@ -0,0 +1,16 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Testsupport +Bundle-SymbolicName: com.sap.sailing.server.testsupport +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Export-Package: com.sap.sailing.server.testsupport +Require-Bundle: com.sap.sailing.server, + com.sap.sailing.domain.common, + com.sap.sse.common, + com.sap.sailing.domain, + com.sap.sse, + com.sap.sse.replication, + com.sap.sse.filestorage, + com.sap.sailing.domain.persistence diff --git a/java/com.sap.sailing.server.testsupport/pom.xml b/java/com.sap.sailing.server.testsupport/pom.xml new file mode 100644 index 00000000000..dae01747cad --- /dev/null +++ b/java/com.sap.sailing.server.testsupport/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + root + com.sap.sailing + 1.0.0-SNAPSHOT + + com.sap.sailing.server.testsupport + eclipse-plugin + diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RacingEventServiceImplMock.java b/java/com.sap.sailing.server.testsupport/src/com/sap/sailing/server/testsupport/RacingEventServiceImplMock.java similarity index 94% rename from java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RacingEventServiceImplMock.java rename to java/com.sap.sailing.server.testsupport/src/com/sap/sailing/server/testsupport/RacingEventServiceImplMock.java index 7e4f55db6f6..c0ec90114a6 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RacingEventServiceImplMock.java +++ b/java/com.sap.sailing.server.testsupport/src/com/sap/sailing/server/testsupport/RacingEventServiceImplMock.java @@ -1,4 +1,4 @@ -package com.sap.sailing.server.test; +package com.sap.sailing.server.testsupport; import java.util.Map; import java.util.Set; diff --git a/java/com.sap.sailing.server/META-INF/MANIFEST.MF b/java/com.sap.sailing.server/META-INF/MANIFEST.MF index 914c2f075c0..ca1e4920472 100644 --- a/java/com.sap.sailing.server/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server/META-INF/MANIFEST.MF @@ -43,7 +43,8 @@ Export-Package: com.sap.sailing.server, com.sap.sailing.domain.swisstimingadapter.test, com.sap.sailing.gwt.ui.test, com.sap.sailing.server.replication.test, - com.sap.sailing.domain.racelogtrackingadapter.test", + com.sap.sailing.domain.racelogtrackingadapter.test, + com.sap.sailing.server.testsupport", com.sap.sailing.server.masterdata, com.sap.sailing.server.operationaltransformation, com.sap.sailing.server.operationaltransformation.racelog, diff --git a/java/pom.xml b/java/pom.xml index c6824ecbfa3..861856c858a 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -134,6 +134,7 @@ com.sap.sailing.gwt.ui com.sap.sailing.domain.test com.sap.sse.replication.testsupport + com.sap.sailing.server.testsupport com.sap.sse.gwt.test From 2645c552a2f574b4866d3a75d296a539779e595e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 13 Jun 2016 10:38:32 +0200 Subject: [PATCH 02/11] formatting changes only Change-Id: I5a4deba0ed30071b30a69707ecadc4de10b9c37b --- .../sailing/server/masterdata/MasterDataImporter.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java index c52613e5058..b210dce3d2b 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java @@ -38,36 +38,29 @@ public class MasterDataImporter { .createObjectInputStreamResolvingAgainstThisFactory(inputStream); racingEventService.createOrUpdateDataImportProgressWithReplication(importOperationId, 0.03, DataImportSubProgress.TRANSFER_STARTED, 0.5); - RaceLogStore raceLogStore = MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore( racingEventService.getMongoObjectFactory(), racingEventService.getDomainObjectFactory()); RegattaImpl.setOngoingMasterDataImport(new MasterDataImportInformation(raceLogStore)); ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(racingEventService.getCombinedMasterDataClassLoader()); - @SuppressWarnings("unchecked") final List competitorIds = (List) objectInputStream.readObject(); - if (override) { setAllowCompetitorsDataToBeReset(competitorIds); } // Deserialize Regattas to make sure that Regattas are deserialized before Series objectInputStream.readObject(); TopLevelMasterData topLevelMasterData = (TopLevelMasterData) objectInputStream.readObject(); - RegattaImpl.setOngoingMasterDataImport(null); Thread.currentThread().setContextClassLoader(oldContextClassLoader); - // in order to restore all listeners we need to initialize the regatta // after the whole object graph has been restored for (Regatta regatta : topLevelMasterData.getAllRegattas()) { RegattaImpl regattaImpl = (RegattaImpl)regatta; regattaImpl.initializeSeriesAfterDeserialize(); } - racingEventService.createOrUpdateDataImportProgressWithReplication(importOperationId, 0.3, DataImportSubProgress.TRANSFER_COMPLETED, 0.5); - applyMasterDataImportOperation(topLevelMasterData, importOperationId, override); } @@ -84,10 +77,8 @@ public class MasterDataImporter { private MasterDataImportObjectCreationCount applyMasterDataImportOperation(TopLevelMasterData topLevelMasterData, UUID importOperationId, boolean override) { MasterDataImportObjectCreationCountImpl creationCount = new MasterDataImportObjectCreationCountImpl(); - ImportMasterDataOperation op = new ImportMasterDataOperation(topLevelMasterData, importOperationId, override, - creationCount); + ImportMasterDataOperation op = new ImportMasterDataOperation(topLevelMasterData, importOperationId, override, creationCount); creationCount = racingEventService.apply(op); - racingEventService.mediaTracksImported(topLevelMasterData.getFilteredMediaTracks(), override); return creationCount; } From 67329d130c56739b0e44d78662f566931cb79c46 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 13 Jun 2016 10:40:44 +0200 Subject: [PATCH 03/11] moved the mediaTracksImported invocation to ImportMasterDataOperation.internalApplyTo so that it always happens for each import Change-Id: I5cb93f7c540dddc960a2a14edd9e83b2f641427c --- .../operationaltransformation/ImportMasterDataOperation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java index c5d84f5697d..88bca237bae 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java @@ -129,6 +129,7 @@ public class ImportMasterDataOperation extends importDeviceConfigurations(toState); } dataImportLock.getProgress(importOperationId).setResult(creationCount); + toState.mediaTracksImported(masterData.getFilteredMediaTracks(), override); return creationCount; } catch (Exception e) { logger.severe("Error during execution of ImportMasterDataOperation"); From 4bb9282ac50b9268923025e1fe91022b308297c7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 13 Jun 2016 10:43:13 +0200 Subject: [PATCH 04/11] added wait time; test for media track replication is now green Change-Id: I85150784f11311faac626eca7ca3ae71021e1bb8 --- .../sailing/server/replication/test/MediaReplicationTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java index 2d5a8a09546..5b64cc5f486 100644 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java @@ -257,6 +257,7 @@ public class MediaReplicationTest extends AbstractServerReplicationTest { // ---Asserts--- final Iterable targetTracksMaster = master.getAllMediaTracks(); compareTracks(trackOnSource, targetTracksMaster); + waitSomeTime(); final Iterable targetTracksReplica = replica.getAllMediaTracks(); compareTracks(trackOnSource, targetTracksReplica); } From d706894927c71baa33bfbc1946c0b7b3e1aef218 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 13 Jun 2016 20:29:13 +0200 Subject: [PATCH 05/11] added missing Eclipse files for com.sap.sailing.server.testsupport bundle Change-Id: I2ff79dab26478bef414be7a5f41afd2cb5d9f2c6 --- .../.classpath | 7 +++++ .../.project | 28 +++++++++++++++++++ .../build.properties | 4 +++ 3 files changed, 39 insertions(+) create mode 100644 java/com.sap.sailing.server.testsupport/.classpath create mode 100644 java/com.sap.sailing.server.testsupport/.project create mode 100644 java/com.sap.sailing.server.testsupport/build.properties diff --git a/java/com.sap.sailing.server.testsupport/.classpath b/java/com.sap.sailing.server.testsupport/.classpath new file mode 100644 index 00000000000..b862a296d38 --- /dev/null +++ b/java/com.sap.sailing.server.testsupport/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/java/com.sap.sailing.server.testsupport/.project b/java/com.sap.sailing.server.testsupport/.project new file mode 100644 index 00000000000..b082705427c --- /dev/null +++ b/java/com.sap.sailing.server.testsupport/.project @@ -0,0 +1,28 @@ + + + com.sap.sailing.server.testsupport + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/java/com.sap.sailing.server.testsupport/build.properties b/java/com.sap.sailing.server.testsupport/build.properties new file mode 100644 index 00000000000..41eb6ade2b4 --- /dev/null +++ b/java/com.sap.sailing.server.testsupport/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . From 05e621d89e3a75df7403aa3b1f2dacd3a9dc4e2d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jun 2016 11:09:34 +0200 Subject: [PATCH 06/11] removed unnecessary exports from com.sap.sailing.server.test fragment because no other bundle/fragment requires this fragment Change-Id: Ic6f268b0e62f69a577996f85f1a8fdc7afe43ae2 --- java/com.sap.sailing.server.test/META-INF/MANIFEST.MF | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF index 223ffba5d1c..dd44553ef6c 100644 --- a/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server.test/META-INF/MANIFEST.MF @@ -27,5 +27,3 @@ Import-Package: com.sap.sailing.server.gateway.jaxrs, com.sap.sailing.server.gateway.jaxrs.spi, org.json.simple, javax.ws.rs.core;version="1.1.1" -Export-Package: com.sap.sailing.server.impl, - com.sap.sailing.server.test From 81efcd480e92a5ff73c4f65fe7075149b3e9677f Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jun 2016 16:48:13 +0200 Subject: [PATCH 07/11] added all dependencies of com.sap.sailing.server to com.sap.sailing.server.testsupport; The RacingEventServiceImplMock used there is a replicable, and its classloader is used to resolve objects serialized during master data import and replication. This will only work if the same dependencies are mimiked that com.sap.sailing.server has; ugly, but this should work and let us use this mock class from several places Change-Id: I027deb457e83d18cd29d96458a3cfc198cbcec4a --- .../META-INF/MANIFEST.MF | 2 +- .../META-INF/MANIFEST.MF | 23 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF index 79b133999a3..3794c5a2077 100644 --- a/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF @@ -8,7 +8,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Require-Bundle: com.sap.sailing.domain.common, com.sap.sse.common, com.sap.sse.shared.android, - com.sap.sse.datamining.annotations;bundle-version="1.0.0" + com.sap.sse.datamining.annotations Export-Package: com.sap.sailing.domain.abstractlog, com.sap.sailing.domain.abstractlog.impl, com.sap.sailing.domain.abstractlog.race, diff --git a/java/com.sap.sailing.server.testsupport/META-INF/MANIFEST.MF b/java/com.sap.sailing.server.testsupport/META-INF/MANIFEST.MF index f7c0599834d..94aec2a2ec1 100644 --- a/java/com.sap.sailing.server.testsupport/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.server.testsupport/META-INF/MANIFEST.MF @@ -13,4 +13,25 @@ Require-Bundle: com.sap.sailing.server, com.sap.sse, com.sap.sse.replication, com.sap.sse.filestorage, - com.sap.sailing.domain.persistence + com.sap.sailing.domain.persistence, + com.sap.sailing.expeditionconnector, + com.sap.sailing.declination, + com.sap.sse.mongodb, + org.mongodb.mongo-java-driver;bundle-version="2.13.0", + com.sap.sailing.domain.persistence, + com.sap.sailing.domain.common, + com.sap.sailing.udpconnector, + com.sap.sailing.domain.shared.android, + com.sap.sailing.server.gateway.serialization, + com.sap.sse.common, + com.sap.sse.operationaltransformation, + com.sap.sse.replication, + com.sap.sse, + com.sap.sailing.server.gateway.serialization.shared.android, + com.sap.sse.shared.android, + com.sap.sse.filestorage, + com.sap.sailing.simulator, + com.sap.sse.security, + org.apache.shiro.web;bundle-version="1.2.2", + org.apache.shiro.core;bundle-version="1.2.2", + javax.servlet;bundle-version="3.1.0" From 803d9e488e0ffa4e49d1cd84e1c4b8d547d2267a Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jun 2016 01:16:31 +0200 Subject: [PATCH 08/11] formatting and comments only Change-Id: I719e26661f17f7d129aa65a63059a09715dd2187 --- .../home/communication/event/GetRegattaListViewAction.java | 2 ++ .../gwt/home/communication/eventview/RegattaReferenceDTO.java | 2 +- .../desktop/partials/multiregattalist/MultiRegattaList.java | 2 +- .../com/sap/sailing/gwt/home/server/LeaderboardContext.java | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetRegattaListViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetRegattaListViewAction.java index 9c3d95c921b..988f09cf788 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetRegattaListViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetRegattaListViewAction.java @@ -38,6 +38,8 @@ public class GetRegattaListViewAction implements SailingAction(EventActionUtil.getEventStateDependentTTL(context, eventId, Duration.ONE_MINUTE.times(3)), new SortedSetResult<>(result)); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/eventview/RegattaReferenceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/eventview/RegattaReferenceDTO.java index 350bdd6da82..d2646012607 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/eventview/RegattaReferenceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/eventview/RegattaReferenceDTO.java @@ -32,7 +32,7 @@ public class RegattaReferenceDTO implements DTO, Comparable @Override public int compareTo(RegattaReferenceDTO o) { int compareByDisplayName = displayName.compareTo(o.displayName); - if(compareByDisplayName != 0) { + if (compareByDisplayName != 0) { return compareByDisplayName; } return id.compareTo(o.id); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/multiregattalist/MultiRegattaList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/multiregattalist/MultiRegattaList.java index 2fdb6c082f4..841ebea8dc3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/multiregattalist/MultiRegattaList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/multiregattalist/MultiRegattaList.java @@ -51,7 +51,7 @@ public class MultiRegattaList extends Composite implements RefreshableWidget Date: Wed, 15 Jun 2016 01:40:23 +0200 Subject: [PATCH 09/11] whitespace/formatting change only Change-Id: Ib7c0abb773c7df8efb8e1a9009aab6930e5ab74d --- .../gwt/home/communication/regatta/RegattaWithProgressDTO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/regatta/RegattaWithProgressDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/regatta/RegattaWithProgressDTO.java index 5fdcbe5d5df..af13ddf7f8c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/regatta/RegattaWithProgressDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/regatta/RegattaWithProgressDTO.java @@ -24,7 +24,7 @@ public class RegattaWithProgressDTO extends RegattaMetadataDTO { @Override public int compareTo(RegattaReferenceDTO o) { - if(o instanceof RegattaWithProgressDTO) { + if (o instanceof RegattaWithProgressDTO) { RegattaWithProgressDTO other = (RegattaWithProgressDTO) o; RegattaState state = getState(); RegattaState otherState = other.getState(); From c1d6265645a338a553679d752cfc74412700335e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jun 2016 02:19:04 +0200 Subject: [PATCH 10/11] use anonymous inner subclasses (and force this) to instantiate RacingEventServiceImplMock so that serialization context class loader is fine Change-Id: I88b90ca6819c922046174a805841643bd50d260f --- .../server/test/MasterDataImportTest.java | 34 +++++++++---------- .../server/test/RaceTrackerStartStopTest.java | 2 +- .../RacingEventServiceImplMock.java | 10 +++++- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index 3ba27d9fa33..d2ba30f80e9 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -326,7 +326,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID), serviceFinderFactory); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID), serviceFinderFactory){}; domainFactory = destService.getBaseDomainFactory(); DB db = destService.getMongoObjectFactory().getDatabase(); db.setWriteConcern(WriteConcern.SAFE); @@ -430,7 +430,7 @@ public class MasterDataImportTest { Assert.assertTrue(destService.getGPSFixStore().getNumberOfFixes(deviceIdentifier) == 1); // Check for persisting of race log events: - RacingEventService dest2 = new RacingEventServiceImplMock(); + RacingEventService dest2 = new RacingEventServiceImplMock(){}; Leaderboard lb2 = dest2.getLeaderboardByName(TEST_LEADERBOARD_NAME); RaceColumn raceColumn2 = lb2.getRaceColumns().iterator().next(); RaceLog raceLog2 = raceColumn2.getRaceLog(raceColumn2.getFleetByName(fleet1OnTarget.getName())); @@ -547,7 +547,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); inputStream = new ByteArrayInputStream(os.toByteArray()); @@ -694,7 +694,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); inputStream = new ByteArrayInputStream(os.toByteArray()); @@ -877,7 +877,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); inputStream = new ByteArrayInputStream(os.toByteArray()); @@ -1047,7 +1047,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); // Create existing data on target venueNameNotToOverride = "doNotOverride"; @@ -1245,7 +1245,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); // Create existing data on target String venueNameToOverride = "Override"; @@ -1410,7 +1410,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); inputStream = new ByteArrayInputStream(os.toByteArray()); @@ -1544,7 +1544,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); inputStream = new ByteArrayInputStream(os.toByteArray()); @@ -1682,7 +1682,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); inputStream = new ByteArrayInputStream(os.toByteArray()); @@ -1711,7 +1711,7 @@ public class MasterDataImportTest { Assert.assertEquals(regattaOnTarget, map.get("dummy2")); // Check if persistent regatta for race id has been persisted - RacingEventServiceImplMock destService2 = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + RacingEventServiceImplMock destService2 = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; ConcurrentHashMap map2 = destService2.getPersistentRegattasForRaceIDs(); Regatta regattaOnTarget2 = destService2.getRegattaByName(TEST_LEADERBOARD_NAME); Assert.assertEquals(regattaOnTarget2, map2.get("dummy")); @@ -1781,7 +1781,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); inputStream = new ByteArrayInputStream(os.toByteArray()); @@ -1899,7 +1899,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); inputStream = new ByteArrayInputStream(os.toByteArray()); @@ -1971,7 +1971,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); inputStream = new ByteArrayInputStream(os.toByteArray()); @@ -2012,7 +2012,7 @@ public class MasterDataImportTest { Assert.assertEquals(factor, metaColumn.getFactor()); // Verify that overall leaderboard data has been persisted - RacingEventService persistenceVerifier = new RacingEventServiceImplMock(); + RacingEventService persistenceVerifier = new RacingEventServiceImplMock(){}; LeaderboardGroup lg = persistenceVerifier.getLeaderboardGroupByName(TEST_GROUP_NAME); Assert.assertNotNull(lg); overallLeaderboard = (LeaderboardGroupMetaLeaderboard) lg.getOverallLeaderboard(); @@ -2158,7 +2158,7 @@ public class MasterDataImportTest { // Delete all data above from the database, to allow recreating all of it on target server deleteAllDataFromDatabase(); // Import in new service - destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)); + destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID)){}; domainFactory = destService.getBaseDomainFactory(); inputStream = new ByteArrayInputStream(os.toByteArray()); @@ -2239,7 +2239,7 @@ public class MasterDataImportTest { .getFirstFixAtOrAfter(logTimePoint2)).getWindFix()); // Check for persisting of race log events: - RacingEventService dest2 = new RacingEventServiceImplMock(); + RacingEventService dest2 = new RacingEventServiceImplMock(){}; Leaderboard lb2 = dest2.getLeaderboardByName(flexLeaderboardName); RaceColumn raceColumn2 = lb2.getRaceColumns().iterator().next(); RaceLog raceLog2 = raceColumn2.getRaceLog(raceColumn2.getFleets().iterator().next()); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java index 696fb8f9f88..1c35cda5751 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java @@ -67,7 +67,7 @@ public class RaceTrackerStartStopTest { @Before public void setUp() { - racingEventService = new RacingEventServiceImplMock(); + racingEventService = new RacingEventServiceImplMock(){}; boatClass = new BoatClassImpl(BOATCLASSNAME, /* typicallyStartsUpwind */ true); regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName(EVENTNAME, boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ diff --git a/java/com.sap.sailing.server.testsupport/src/com/sap/sailing/server/testsupport/RacingEventServiceImplMock.java b/java/com.sap.sailing.server.testsupport/src/com/sap/sailing/server/testsupport/RacingEventServiceImplMock.java index c0ec90114a6..479b0e6c5de 100644 --- a/java/com.sap.sailing.server.testsupport/src/com/sap/sailing/server/testsupport/RacingEventServiceImplMock.java +++ b/java/com.sap.sailing.server.testsupport/src/com/sap/sailing/server/testsupport/RacingEventServiceImplMock.java @@ -10,7 +10,15 @@ import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.masterdata.DataImportLockWithProgress; import com.sap.sse.common.TypeBasedServiceFinderFactory; -public class RacingEventServiceImplMock extends RacingEventServiceImpl { +/** + * Use an empty anonymous inner subclass for instantiation to ensure that you'll have the right classpath for + * your bundle in order to carry out de-serializations in the correct context. Example: + * {@code new RacingEventServiceImplMock(){}}. + * + * @author Axel Uhl (d043530) + * + */ +public abstract class RacingEventServiceImplMock extends RacingEventServiceImpl { private DataImportLockWithProgress lock; From 1cb57307e39e9829c2a34a3c84f931f8c618fd16 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jun 2016 07:48:38 +0200 Subject: [PATCH 11/11] add the local classloader to the master RacingEventService's master data class loaders to ensure lambdas can be de-serialized Change-Id: If1fc062641307dfc6efa450aa865517b15e5234b --- .../SailingGWT sdm.launch | 156 +++++++++--------- java/com.sap.sailing.gwt.ui/SailingGWT.launch | 150 ++++++++--------- .../test/MediaReplicationTest.java | 5 + 3 files changed, 158 insertions(+), 153 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch index 01f086d2cd1..82f8aab22d4 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch @@ -1,78 +1,78 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT.launch b/java/com.sap.sailing.gwt.ui/SailingGWT.launch index a533c08e61c..6adb642328e 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT.launch @@ -1,75 +1,75 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java index 5b64cc5f486..75590ce8571 100644 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/MediaReplicationTest.java @@ -246,6 +246,11 @@ public class MediaReplicationTest extends AbstractServerReplicationTest { deleteAllDataFromDatabase(); // Import in new service domainFactory = master.getBaseDomainFactory(); + // ensure that this class's class loader and with it the dependency to com.sap.sailing.domain.test + // is known during de-serialization because anonymous inner classes from that bundle may be used + // in the object graph, e.g., for RankingMetricConstructor objects based on locally-instantiated lambda + // expressions + master.addMasterDataClassLoader(this.getClass().getClassLoader()); inputStream = new ByteArrayInputStream(os.toByteArray()); MasterDataImporter importer = new MasterDataImporter(domainFactory, master); importer.importFromStream(inputStream, randomUUID, false);