diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index bee237df86e..9f6a4ddb287 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -7,8 +7,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Map.Entry; +import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; @@ -51,7 +51,6 @@ import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.CourseDataImpl; import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.RaceColumnListenerWithDefaultAction; -import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; @@ -303,7 +302,8 @@ public class RaceLogRaceTracker extends AbstractRaceTrackerBaseImpl { } Map competitorsAndTheirBoats = raceColumn.getAllCompetitorsAndTheirBoats(params.getFleet()); Serializable raceId = denoteEvent.getRaceId(); - final RaceDefinition raceDef = new RaceDefinitionImpl(raceName, course, boatClass, competitorsAndTheirBoats, raceId); + final RaceDefinition raceDef = raceTrackingHandler.createRaceDefinition(trackedRegatta.getRegatta(), raceName, course, + boatClass, competitorsAndTheirBoats, raceId); Iterable sidelines = Collections. emptyList(); // set race definition, so race is linked to leaderboard automatically trackedRegatta.getRegatta().addRace(raceDef); diff --git a/java/com.sap.sailing.domain.swisstimingadapter.test/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.swisstimingadapter.test/META-INF/MANIFEST.MF index 8bc8ec61206..b675499e158 100644 --- a/java/com.sap.sailing.domain.swisstimingadapter.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.swisstimingadapter.test/META-INF/MANIFEST.MF @@ -19,7 +19,8 @@ Require-Bundle: com.sap.sailing.domain, org.junit;bundle-version="4.8.2", org.hamcrest.core;bundle-version="1.1.0", com.sap.sse, - com.sap.sse.common + com.sap.sse.common, + com.sap.sailing.domain.shared.android Bundle-ClassPath: resources/, . Import-Package: com.sap.sailing.server diff --git a/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SimpleDomainFactoryTest.java b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SimpleDomainFactoryTest.java index f220b5238eb..573eb9d92bb 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SimpleDomainFactoryTest.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SimpleDomainFactoryTest.java @@ -30,6 +30,7 @@ import com.sap.sailing.domain.swisstimingadapter.impl.CourseImpl; import com.sap.sailing.domain.swisstimingadapter.impl.MarkImpl; import com.sap.sailing.domain.swisstimingadapter.impl.RaceImpl; import com.sap.sailing.domain.swisstimingadapter.impl.StartListImpl; +import com.sap.sailing.domain.tracking.RaceTrackingHandler.DefaultRaceTrackingHandler; import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sse.common.Util; @@ -101,7 +102,7 @@ public class SimpleDomainFactoryTest { public Iterable getMarks() { return Collections.emptyList(); } - }); + }, new DefaultRaceTrackingHandler()); assertNotNull(raceDefinition.getBoatClass()); assertEquals("UNKNOWN", raceDefinition.getBoatClass().getName()); } @@ -120,7 +121,8 @@ public class SimpleDomainFactoryTest { Mark mark2 = new MarkImpl("M1", 0, Arrays.asList("D3", "D4"), /* markType */ null); List marks = Arrays.asList(mark1, mark2); Course course = new CourseImpl("1234", marks); - RaceDefinition raceDefinition = domainFactory.createRaceDefinition(regatta, race, startList, course); + RaceDefinition raceDefinition = domainFactory.createRaceDefinition(regatta, race, startList, course, + new DefaultRaceTrackingHandler()); ArrayList waypoints1 = new ArrayList(); for (Waypoint waypoint : raceDefinition.getCourse().getWaypoints()) { waypoints1.add(waypoint); @@ -147,7 +149,8 @@ public class SimpleDomainFactoryTest { Mark mark2 = new MarkImpl("M1", 0, Arrays.asList("D3", "D4"), /* markType */ null); List marks = Arrays.asList(mark1, mark2); Course course = new CourseImpl("1234", marks); - RaceDefinition raceDefinition = domainFactory.createRaceDefinition(regatta, race, startList, course); + RaceDefinition raceDefinition = domainFactory.createRaceDefinition(regatta, race, startList, course, + new DefaultRaceTrackingHandler()); assertEquals(2, Util.size(raceDefinition.getCourse().getWaypoints())); ArrayList waypoints1 = new ArrayList(); for (Waypoint waypoint : raceDefinition.getCourse().getWaypoints()) { diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java index c9a4979fa1f..29b1f174156 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java @@ -22,6 +22,7 @@ import com.sap.sailing.domain.swisstimingadapter.impl.DomainFactoryImpl; import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; +import com.sap.sailing.domain.tracking.RaceTrackingHandler; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util.Pair; @@ -55,7 +56,8 @@ public interface DomainFactory { String getCompetitorID(String boatID, BoatClass boatClass); - RaceDefinition createRaceDefinition(Regatta regatta, Race race, StartList startList, com.sap.sailing.domain.swisstimingadapter.Course course); + RaceDefinition createRaceDefinition(Regatta regatta, Race race, StartList startList, com.sap.sailing.domain.swisstimingadapter.Course course, + RaceTrackingHandler raceTrackingHandler); com.sap.sailing.domain.base.Mark getOrCreateMark(Serializable trackerID, String description); diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java index a5ec56c867e..ba716c92fe2 100644 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java @@ -56,6 +56,7 @@ import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory; import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; +import com.sap.sailing.domain.tracking.RaceTrackingHandler; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.impl.CourseDesignUpdateHandler; import com.sap.sailing.domain.tracking.impl.FinishTimeUpdateHandler; @@ -226,12 +227,13 @@ public class DomainFactoryImpl implements DomainFactory { } @Override - public RaceDefinition createRaceDefinition(Regatta regatta, Race race, StartList startList, Course course) { + public RaceDefinition createRaceDefinition(Regatta regatta, Race race, StartList startList, Course course, + RaceTrackingHandler raceTrackingHandler) { com.sap.sailing.domain.base.Course domainCourse = createCourse(race.getDescription(), course); Map competitorsAndBoats = createCompetitorsAndBoats(startList, race.getRaceID(), race.getBoatClass()); logger.info("Creating RaceDefinitionImpl for race "+race.getRaceID()); BoatClass boatClass = race.getBoatClass() != null ? race.getBoatClass() : getRaceTypeFromRaceID(race.getRaceID()).getBoatClass(); - RaceDefinition result = new RaceDefinitionImpl(race.getRaceName(), domainCourse, boatClass, competitorsAndBoats, race.getRaceID()); + RaceDefinition result = raceTrackingHandler.createRaceDefinition(regatta, race.getRaceName(), domainCourse, boatClass, competitorsAndBoats, race.getRaceID()); regatta.addRace(result); return result; } diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java index eb7f39b2292..6cc7f05682c 100644 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java @@ -466,7 +466,8 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl // now we can create the RaceDefinition and most other things Race swissTimingRace = new RaceImpl(raceID, raceName, raceDescription, boatClass); synchronized (this) { - race = domainFactory.createRaceDefinition(regatta, swissTimingRace, startList, course); + race = domainFactory.createRaceDefinition(regatta, swissTimingRace, startList, course, + raceTrackingHandler); this.notifyAll(); } // temp diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java index 95cbee124cf..ddfcc43b595 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java @@ -47,7 +47,6 @@ import com.sap.sailing.domain.base.impl.DynamicPerson; import com.sap.sailing.domain.base.impl.DynamicTeam; import com.sap.sailing.domain.base.impl.KilometersPerHourSpeedWithBearingImpl; 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.SidelineImpl; import com.sap.sailing.domain.base.impl.TeamImpl; @@ -598,7 +597,7 @@ public class DomainFactoryImpl implements DomainFactory { RaceDefinition raceDefinition = raceCache.get(raceId); if (raceDefinition == null) { logger.info("Creating RaceDefinitionImpl for race "+raceName); - raceDefinition = new RaceDefinitionImpl(raceName, course, boatClass, competitorsAndBoats, raceId); + raceDefinition = raceTrackingHandler.createRaceDefinition(trackedRegatta.getRegatta(), raceName, course, boatClass, competitorsAndBoats, raceId); } else { logger.info("Already found RaceDefinitionImpl for race "+raceName); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceTrackingHandler.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceTrackingHandler.java index 133fc69d859..5e3f27fb20e 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceTrackingHandler.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceTrackingHandler.java @@ -1,10 +1,18 @@ package com.sap.sailing.domain.tracking; +import java.io.Serializable; +import java.util.Map; import java.util.Optional; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; +import com.sap.sailing.domain.base.Boat; +import com.sap.sailing.domain.base.BoatClass; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Sideline; +import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sse.util.ThreadLocalTransporter; /** @@ -20,6 +28,9 @@ public interface RaceTrackingHandler { long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, boolean useMarkPassingCalculator, RaceLogResolver raceLogResolver, Optional threadLocalTransporter); + + RaceDefinition createRaceDefinition(Regatta regatta, String name, Course course, BoatClass boatClass, + Map competitorsAndTheirBoats, Serializable id); public class DefaultRaceTrackingHandler implements RaceTrackingHandler { @Override @@ -32,5 +43,11 @@ public interface RaceTrackingHandler { millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, raceDefinitionSetToUpdate, useMarkPassingCalculator, raceLogResolver, threadLocalTransporter); } + + @Override + public RaceDefinition createRaceDefinition(Regatta regatta, String name, Course course, + BoatClass boatClass, Map competitorsAndTheirBoats, Serializable id) { + return new RaceDefinitionImpl(name, course, boatClass, competitorsAndTheirBoats, id); + } } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/security/PermissionAwareRaceTrackingHandler.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/security/PermissionAwareRaceTrackingHandler.java index 63da335140b..a7e89e051c0 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/security/PermissionAwareRaceTrackingHandler.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/security/PermissionAwareRaceTrackingHandler.java @@ -1,5 +1,7 @@ package com.sap.sailing.server.security; +import java.io.Serializable; +import java.util.Map; import java.util.Optional; import org.apache.shiro.SecurityUtils; @@ -7,7 +9,12 @@ import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.support.SubjectThreadState; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; +import com.sap.sailing.domain.base.Boat; +import com.sap.sailing.domain.base.BoatClass; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.domain.common.security.SecuredDomainType; @@ -66,4 +73,22 @@ public class PermissionAwareRaceTrackingHandler extends DefaultRaceTrackingHandl } } + @Override + public RaceDefinition createRaceDefinition(Regatta regatta, String name, Course course, BoatClass boatClass, + Map competitorsAndTheirBoats, Serializable id) { + SubjectThreadState subjectThreadState = new SubjectThreadState(subject); + subjectThreadState.bind(); + try { + RegattaNameAndRaceName regattaAndRaceIdentifier = new RegattaNameAndRaceName(regatta.getName(), name); + QualifiedObjectIdentifier qualifiedObjectIdentifier = TrackedRace.getIdentifier(regattaAndRaceIdentifier); + return securityService.setOwnershipCheckPermissionForObjectCreationAndRevertOnError( + SecuredDomainType.TRACKED_RACE, qualifiedObjectIdentifier.getTypeRelativeObjectIdentifier(), + regattaAndRaceIdentifier.toString(), () -> { + return super.createRaceDefinition(regatta, name, course, boatClass, competitorsAndTheirBoats, + id); + }); + } finally { + subjectThreadState.clear(); + } + } }