Merge remote-tracking branch 'server/master'

This commit is contained in:
Axel Uhl committed 2020-02-20 10:09:20 +01:00
commit 214d2b8131
3 files changed
+38 -17

No files matched your search

@@ -6,6 +6,7 @@ import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.logging.Logger;
import org.apache.shiro.SecurityUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
@@ -31,7 +32,10 @@ import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
import com.sap.sse.security.shared.impl.SecuredSecurityTypes;
public abstract class AbstractLeaderboardsResource extends AbstractSailingServerResource {
private static final Logger logger = Logger.getLogger(AbstractLeaderboardsResource.class.getName());
@@ -54,12 +58,16 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer
return result;
}
protected JSONObject createEmptyLeaderboardJson(Leaderboard leaderboard, ResultStates resultState, Integer maxCompetitorsCount) throws NoWindException {
protected JSONObject createEmptyLeaderboardJson(Leaderboard leaderboard, ResultStates resultState, Integer maxCompetitorsCount, boolean userPresentedValidRegattaSecret) throws NoWindException {
JSONObject jsonLeaderboard = new JSONObject();
writeCommonLeaderboardData(jsonLeaderboard, leaderboard, resultState, null, maxCompetitorsCount);
JSONArray jsonCompetitorEntries = new JSONArray();
jsonLeaderboard.put("competitors", jsonCompetitorEntries);
for (Competitor competitor : leaderboard.getCompetitors()) {
for (Competitor competitor : Util.filter(leaderboard.getCompetitors(),
competitor->userPresentedValidRegattaSecret || SecurityUtils.getSubject().isPermitted(competitor.getIdentifier()
.getStringPermission(SecuredSecurityTypes.PublicReadableActions.READ_PUBLIC))
|| SecurityUtils.getSubject()
.isPermitted(competitor.getIdentifier().getStringPermission(DefaultActions.READ)))) {
JSONObject jsonCompetitor = new JSONObject();
jsonCompetitor.put("name", competitor.getName());
jsonCompetitor.put("shortName", competitor.getShortName());
@@ -245,20 +253,20 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer
protected abstract JSONObject getLeaderboardJson(Leaderboard leaderboard, TimePoint resultTimePoint,
ResultStates resultState, Integer maxCompetitorsCount, List<String> raceColumnNames,
List<String> raceDetailNames, boolean competitorAndBoatIdsOnly,
List<String> showOnlyActiveRacesForCompetitorIds)
List<String> showOnlyActiveRacesForCompetitorIds, boolean userPresentedValidRegattaSecret)
throws NoWindException, InterruptedException, ExecutionException;
protected JSONObject getLeaderboardJson(ResultStates resultState, Integer maxCompetitorsCount,
TimePoint requestTimePoint, Leaderboard leaderboard, TimePoint timePoint, List<String> raceColumnNames,
List<String> raceDetailNames, boolean competitorAndBoatIdsOnly,
List<String> showOnlyActiveRacesForCompetitorIds)
List<String> showOnlyActiveRacesForCompetitorIds, boolean userPresentedValidRegattaSecret)
throws NoWindException, InterruptedException, ExecutionException {
final JSONObject jsonLeaderboard;
if (timePoint != null || resultState == ResultStates.Live) {
jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount,
raceColumnNames, raceDetailNames, competitorAndBoatIdsOnly, showOnlyActiveRacesForCompetitorIds);
raceColumnNames, raceDetailNames, competitorAndBoatIdsOnly, showOnlyActiveRacesForCompetitorIds, userPresentedValidRegattaSecret);
} else {
jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, maxCompetitorsCount);
jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, maxCompetitorsCount, userPresentedValidRegattaSecret);
}
return jsonLeaderboard;
}
@@ -218,7 +218,7 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource {
JSONObject jsonLeaderboard;
jsonLeaderboard = getLeaderboardJson(resultState, maxCompetitorsCount, requestTimePoint,
leaderboard, timePoint, /* race column names */ null, /* race detail names */ null, competitorAndBoatIdsOnly,
/* showOnlyActiveRacesForCompetitorIds */ null);
/* showOnlyActiveRacesForCompetitorIds */ null, skip);
StringWriter sw = new StringWriter();
jsonLeaderboard.writeJSONString(sw);
String json = sw.getBuffer().toString();
@@ -238,7 +238,7 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource {
@Override
protected JSONObject getLeaderboardJson(Leaderboard leaderboard,
TimePoint resultTimePoint, ResultStates resultState, Integer maxCompetitorsCount, List<String> raceColumnNames,
List<String> raceDetailNames, boolean competitorIdsOnly, List<String> showOnlyActiveRacesForCompetitorIds)
List<String> raceDetailNames, boolean competitorIdsOnly, List<String> showOnlyActiveRacesForCompetitorIds, boolean userPresentedValidRegattaSecret)
throws NoWindException, InterruptedException, ExecutionException {
LeaderboardDTO leaderboardDTO = leaderboard.getLeaderboardDTO(
resultTimePoint, Collections.<String> emptyList(), /* addOverallDetails */
@@ -249,7 +249,12 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource {
JSONArray jsonCompetitorEntries = new JSONArray();
jsonLeaderboard.put("competitors", jsonCompetitorEntries);
int counter = 1;
for (CompetitorDTO competitor : leaderboardDTO.competitors) {
for (CompetitorDTO competitor : Util.filter(leaderboardDTO.competitors,
competitor -> userPresentedValidRegattaSecret || SecurityUtils.getSubject()
.isPermitted(competitor.getIdentifier().getStringPermission(
SecuredSecurityTypes.PublicReadableActions.READ_PUBLIC))
|| SecurityUtils.getSubject().isPermitted(
competitor.getIdentifier().getStringPermission(DefaultActions.READ)))) {
LeaderboardRowDTO leaderboardRowDTO = leaderboardDTO.rows.get(competitor);
if (maxCompetitorsCount != null && counter > maxCompetitorsCount) {
break;
@@ -545,7 +550,6 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource {
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
Competitor competitor = getService().getCompetitorAndBoatStore()
.getExistingCompetitorByIdAsString(competitorIdAsString);
if (competitor == null) {
response = Response
.status(Status.NOT_FOUND).entity("Could not find a competitor with id '"
@@ -1312,7 +1316,15 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource {
map(mark->trackedRace.getTrack(mark)).filter(markTrack->markTrack!=null).
map(markTrack->markTrack.getEstimatedPosition(timeToUseForStart, /* extrapolate */ false)).
collect(Collectors.toList());
Util.addAll(trackedRace.getRace().getCompetitors(), competitors);
Util.addAll(
// filter for those competitors that the current user may read
Util.filter(trackedRace.getRace().getCompetitors(),
competitor -> SecurityUtils.getSubject()
.isPermitted(competitor.getIdentifier().getStringPermission(
SecuredSecurityTypes.PublicReadableActions.READ_PUBLIC))
|| SecurityUtils.getSubject().isPermitted(
competitor.getIdentifier().getStringPermission(DefaultActions.READ))),
competitors);
competitors.sort((a, b)->{
final MarkPassing aStartMarkPassing = trackedRace.getMarkPassing(a, firstWaypoint);
final MarkPassing bStartMarkPassing = trackedRace.getMarkPassing(b, firstWaypoint);
@@ -98,9 +98,9 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {
if (timePoint != null || resultState == ResultStates.Live) {
jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount,
raceColumnNames, raceDetails, competitorAndBoatIdsOnly,
showOnlyActiveRacesForCompetitorIds);
showOnlyActiveRacesForCompetitorIds, skip);
} else {
jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, maxCompetitorsCount);
jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, maxCompetitorsCount, skip);
}
StringWriter sw = new StringWriter();
jsonLeaderboard.writeJSONString(sw);
@@ -118,9 +118,10 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {
}
@Override
protected JSONObject getLeaderboardJson(Leaderboard leaderboard,
TimePoint resultTimePoint, ResultStates resultState, Integer maxCompetitorsCount,
List<String> raceColumnNames, List<String> raceDetailNames, boolean competitorAndBoatIdsOnly, List<String> showOnlyActiveRacesForCompetitorIds)
protected JSONObject getLeaderboardJson(Leaderboard leaderboard, TimePoint resultTimePoint,
ResultStates resultState, Integer maxCompetitorsCount, List<String> raceColumnNames,
List<String> raceDetailNames, boolean competitorAndBoatIdsOnly,
List<String> showOnlyActiveRacesForCompetitorIds, boolean userPresentedValidRegattaSecret)
throws NoWindException, InterruptedException, ExecutionException {
List<String> raceColumnsToShow = calculateRaceColumnsToShow(leaderboard, raceColumnNames, showOnlyActiveRacesForCompetitorIds, resultTimePoint);
List<DetailType> raceDetailsToShow = calculateRaceDetailTypesToShow(raceDetailNames);
@@ -137,7 +138,7 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {
Map<String, Map<CompetitorDTO, Integer>> competitorsOrderedByFleets = new HashMap<>();
List<CompetitorDTO> filteredCompetitorsFromBestToWorst = new ArrayList<>();
competitorsFromBestToWorst.forEach(competitor -> {
if (SecurityUtils.getSubject().isPermitted(competitor.getIdentifier()
if (userPresentedValidRegattaSecret || SecurityUtils.getSubject().isPermitted(competitor.getIdentifier()
.getStringPermission(SecuredSecurityTypes.PublicReadableActions.READ_PUBLIC))
|| SecurityUtils.getSubject()
.isPermitted(competitor.getIdentifier().getStringPermission(DefaultActions.READ))) {