Merge branch 'permission-vertical' of ssh://trac@sapsailing.com/home/trac/git into permission-vertical

This commit is contained in:
Kai Börnert committed 2018-12-10 13:39:22 +01:00
commit f88c80720a
9 files changed
+63 -13

No files matched your search

@@ -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<Competitor, Boat> 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<Sideline> sidelines = Collections.<Sideline> emptyList();
// set race definition, so race is linked to leaderboard automatically
trackedRegatta.getRegatta().addRace(raceDef);
@@ -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
@@ -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<Mark> 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<Mark> 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<Waypoint> waypoints1 = new ArrayList<Waypoint>();
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<Mark> 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<Waypoint> waypoints1 = new ArrayList<Waypoint>();
for (Waypoint waypoint : raceDefinition.getCourse().getWaypoints()) {
@@ -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);
@@ -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<Competitor, Boat> 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;
}
@@ -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
@@ -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);
}
@@ -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> threadLocalTransporter);
RaceDefinition createRaceDefinition(Regatta regatta, String name, Course course, BoatClass boatClass,
Map<Competitor, Boat> 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<Competitor, Boat> competitorsAndTheirBoats, Serializable id) {
return new RaceDefinitionImpl(name, course, boatClass, competitorsAndTheirBoats, id);
}
}
}
@@ -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<Competitor, Boat> 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();
}
}
}