mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-08 13:20:57 +00:00
support master data serialization for overall leaderboards
This commit is contained in:
1 parent
4fd8ab2328
commit
8aa47bac1a
7 files changed
+120
-44
No files matched your search
+36
-18
@@ -3,6 +3,7 @@ package com.sap.sailing.domain.masterdataimport;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sap.sailing.domain.base.LeaderboardMasterData;
|
||||
import com.sap.sailing.domain.leaderboard.ScoringScheme;
|
||||
|
||||
/**
|
||||
* Holds leaderboard group object AND its leaderboards, etc
|
||||
@@ -11,23 +12,32 @@ import com.sap.sailing.domain.base.LeaderboardMasterData;
|
||||
*/
|
||||
public class LeaderboardGroupMasterData {
|
||||
|
||||
private String name;
|
||||
private String description;
|
||||
private LeaderboardMasterData overallLeaderboardMasterData;
|
||||
private Iterable<LeaderboardMasterData> leaderboards;
|
||||
private boolean displayGroupsRevese;
|
||||
private Set<EventMasterData> events;
|
||||
private Set<RegattaMasterData> regattas;
|
||||
private final String name;
|
||||
private final String description;
|
||||
private final boolean hasOverallLeaderboard;
|
||||
private final ScoringScheme overallLeaderboardScoringScheme;
|
||||
private final int[] overallLeaderboardDiscardingRule;
|
||||
private final Iterable<LeaderboardMasterData> leaderboards;
|
||||
private final boolean displayGroupsRevese;
|
||||
private final Set<EventMasterData> events;
|
||||
private final Set<RegattaMasterData> regattas;
|
||||
|
||||
public LeaderboardGroupMasterData(String name, String description,
|
||||
boolean displayGroupsRevese, LeaderboardMasterData overallLeaderboardMasterData, Iterable<LeaderboardMasterData> leaderboards, Set<EventMasterData> events, Set<RegattaMasterData> regattas) {
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
this.displayGroupsRevese = displayGroupsRevese;
|
||||
this.overallLeaderboardMasterData = overallLeaderboardMasterData;
|
||||
this.leaderboards = leaderboards;
|
||||
this.events = events;
|
||||
this.regattas = regattas;
|
||||
|
||||
public LeaderboardGroupMasterData(String name, String description, boolean displayGroupsRevese,
|
||||
boolean hasOverallLeaderboard,
|
||||
ScoringScheme overallLeaderboardScoringScheme,
|
||||
int[] overallLeaderboardDiscardingRule, Iterable<LeaderboardMasterData> leaderboards, Set<EventMasterData> events,
|
||||
Set<RegattaMasterData> regattas) {
|
||||
super();
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
this.hasOverallLeaderboard = hasOverallLeaderboard;
|
||||
this.overallLeaderboardScoringScheme = overallLeaderboardScoringScheme;
|
||||
this.overallLeaderboardDiscardingRule = overallLeaderboardDiscardingRule;
|
||||
this.leaderboards = leaderboards;
|
||||
this.displayGroupsRevese = displayGroupsRevese;
|
||||
this.events = events;
|
||||
this.regattas = regattas;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
@@ -38,8 +48,16 @@ public class LeaderboardGroupMasterData {
|
||||
return description;
|
||||
}
|
||||
|
||||
public LeaderboardMasterData getOverallLeaderboardMasterData() {
|
||||
return overallLeaderboardMasterData;
|
||||
public boolean hasOverallLeaderboard() {
|
||||
return hasOverallLeaderboard;
|
||||
}
|
||||
|
||||
public ScoringScheme getOverallLeaderboardScoringScheme() {
|
||||
return overallLeaderboardScoringScheme;
|
||||
}
|
||||
|
||||
public int[] getOverallLeaderboardDiscardingRule() {
|
||||
return overallLeaderboardDiscardingRule;
|
||||
}
|
||||
|
||||
public Iterable<LeaderboardMasterData> getLeaderboards() {
|
||||
|
||||
@@ -171,6 +171,47 @@ body ::-webkit-scrollbar-track {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.gwt-TabBar {
|
||||
background: #ccc;
|
||||
padding-top: 6px;
|
||||
}
|
||||
|
||||
.gwt-TabBar .gwt-TabBarFirst {
|
||||
width: 5px; /* first tab distance from the left */
|
||||
}
|
||||
|
||||
.gwt-TabBar .gwt-TabBarRest {
|
||||
}
|
||||
|
||||
.gwt-TabBar .gwt-TabBarItem {
|
||||
margin-left: 4px;
|
||||
padding: 4px 8px 4px 8px;
|
||||
cursor: pointer;
|
||||
cursor: hand;
|
||||
color: white;
|
||||
font-weight: normal;
|
||||
text-align: center;
|
||||
background: #8E8E8E;
|
||||
-moz-border-radius: 3px 3px 0px 0px;
|
||||
border-radius: 3px 3px 0px 0px;
|
||||
}
|
||||
|
||||
.gwt-TabBar .gwt-TabBarItem-selected {
|
||||
cursor: default;
|
||||
background: white;
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.gwt-TabBar .gwt-TabBarItem-disabled {
|
||||
cursor: default;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.gwt-TabPanel {
|
||||
}
|
||||
|
||||
|
||||
.titleLabelWrapper {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
|
||||
+10
-4
@@ -17,6 +17,7 @@ import com.sap.sailing.domain.base.Nationality;
|
||||
import com.sap.sailing.domain.base.Person;
|
||||
import com.sap.sailing.domain.base.Team;
|
||||
import com.sap.sailing.domain.common.Color;
|
||||
import com.sap.sailing.domain.leaderboard.ScoringScheme;
|
||||
import com.sap.sailing.domain.masterdataimport.EventMasterData;
|
||||
import com.sap.sailing.domain.masterdataimport.LeaderboardGroupMasterData;
|
||||
import com.sap.sailing.domain.masterdataimport.RaceColumnMasterData;
|
||||
@@ -41,6 +42,8 @@ public class LeaderboardGroupMasterDataJsonDeserializer implements JsonDeseriali
|
||||
|
||||
private final JsonDeserializer<RegattaMasterData> regattaDeserializer;
|
||||
|
||||
private final DomainFactory domainFactory;
|
||||
|
||||
public static JsonDeserializer<LeaderboardGroupMasterData> create(DomainFactory domainFactory) {
|
||||
JsonDeserializer<BoatClass> boatClassDeserializer = new BoatClassJsonDeserializer(domainFactory);
|
||||
JsonDeserializer<Nationality> nationalityDeserializer = new NationalityJsonDeserialzer();
|
||||
@@ -58,15 +61,16 @@ public class LeaderboardGroupMasterDataJsonDeserializer implements JsonDeseriali
|
||||
JsonDeserializer<RegattaMasterData> regattaDeserializer = new RegattaMasterDataJsonDeserializer(
|
||||
fleetDeserializer, raceColumnDeserializer);
|
||||
JsonDeserializer<LeaderboardGroupMasterData> leaderboardGroupMasterDataDeserializer = new LeaderboardGroupMasterDataJsonDeserializer(
|
||||
leaderboardDeserializer, eventDeserializer, regattaDeserializer);
|
||||
leaderboardDeserializer, eventDeserializer, regattaDeserializer, domainFactory);
|
||||
return leaderboardGroupMasterDataDeserializer;
|
||||
}
|
||||
|
||||
public LeaderboardGroupMasterDataJsonDeserializer(JsonDeserializer<LeaderboardMasterData> leaderboardDeserializer,
|
||||
JsonDeserializer<EventMasterData> eventDeserializer, JsonDeserializer<RegattaMasterData> regattaDeserializer) {
|
||||
JsonDeserializer<EventMasterData> eventDeserializer, JsonDeserializer<RegattaMasterData> regattaDeserializer, DomainFactory domainFactory) {
|
||||
this.leaderboardDeserializer = leaderboardDeserializer;
|
||||
this.eventDeserializer = eventDeserializer;
|
||||
this.regattaDeserializer = regattaDeserializer;
|
||||
this.domainFactory = domainFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -92,8 +96,10 @@ public class LeaderboardGroupMasterDataJsonDeserializer implements JsonDeseriali
|
||||
String name = (String) object.get(LeaderboardGroupMasterDataJsonSerializer.FIELD_NAME);
|
||||
String description = (String) object.get(LeaderboardGroupMasterDataJsonSerializer.FIELD_DESCRIPTION);
|
||||
boolean displayGroupsReverse = (Boolean) object.get(LeaderboardGroupMasterDataJsonSerializer.FIELD_DISPLAY_GROUPS_REVERSE);
|
||||
LeaderboardMasterData overallLeaderboardMasterData = leaderboardDeserializer.deserialize((JSONObject) object.get(LeaderboardGroupMasterDataJsonSerializer.FIELD_OVERALL_LEADERBOARD));
|
||||
return new LeaderboardGroupMasterData(name, description, displayGroupsReverse, overallLeaderboardMasterData, leaderboards, events, regattas);
|
||||
boolean hasOverallLeaderboard = (Boolean) object.get(LeaderboardGroupMasterDataJsonSerializer.FIELD_HAS_OVERALL_LEADERBOARD);
|
||||
ScoringScheme overallLeaderboardScoringScheme = LeaderboardMasterDataJsonDeserializer.deserializeScoringScheme((JSONObject) object.get(LeaderboardGroupMasterDataJsonSerializer.FIELD_OVERALL_LEADERBOARD_SCORING_SCHEME), domainFactory);
|
||||
int[] overallLeaderboardResultDiscardingThresholds = LeaderboardMasterDataJsonDeserializer.deserializeResultDesicardingRule((JSONObject) object.get(LeaderboardGroupMasterDataJsonSerializer.FIELD_OVERALL_LEADERBOARD_DISCARDING_THRESHOLDS));
|
||||
return new LeaderboardGroupMasterData(name, description, displayGroupsReverse, hasOverallLeaderboard, overallLeaderboardScoringScheme, overallLeaderboardResultDiscardingThresholds, leaderboards, events, regattas);
|
||||
}
|
||||
|
||||
}
|
||||
+8
-6
@@ -71,23 +71,25 @@ public class LeaderboardMasterDataJsonDeserializer implements JsonDeserializer<L
|
||||
Competitor deserializedCompetitor = competitorDeserializer.deserialize(competitorJson);
|
||||
competitorsById.put(deserializedCompetitor.getId().toString(), deserializedCompetitor);
|
||||
}
|
||||
final LeaderboardMasterData result;
|
||||
if (isRegattaLeaderBoard) {
|
||||
String regattaName = (String) object.get(LeaderboardMasterDataJsonSerializer.FIELD_REGATTA_NAME);
|
||||
return new RegattaLeaderboardMasterData(name, displayName, resultDiscardingRule, competitorsById,
|
||||
result = new RegattaLeaderboardMasterData(name, displayName, resultDiscardingRule, competitorsById,
|
||||
scoreCorrection, regattaName, carriedPoints, suppressedCompetitors, displayNamesByCompetitorId,
|
||||
raceLogEvents);
|
||||
|
||||
} else {
|
||||
ScoringScheme scoringScheme = deserializeScoringScheme((JSONObject) object
|
||||
.get(LeaderboardMasterDataJsonSerializer.FIELD_SCORING_SCHEME));
|
||||
.get(LeaderboardMasterDataJsonSerializer.FIELD_SCORING_SCHEME), domainFactory);
|
||||
String courseAreaId = deserializeCourseAreaId((JSONObject) object
|
||||
.get(LeaderboardMasterDataJsonSerializer.FIELD_COURSE_AREA));
|
||||
List<RaceColumnMasterData> raceColumns = deserializeRaceColumns((JSONArray) object
|
||||
.get(LeaderboardMasterDataJsonSerializer.FIELD_RACE_COLUMNS));
|
||||
return new FlexibleLeaderboardMasterData(name, displayName, resultDiscardingRule, competitorsById,
|
||||
result = new FlexibleLeaderboardMasterData(name, displayName, resultDiscardingRule, competitorsById,
|
||||
scoreCorrection, scoringScheme, courseAreaId, raceColumns, carriedPoints, suppressedCompetitors,
|
||||
displayNamesByCompetitorId, raceLogEvents);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private Map<String, Map<String, List<RaceLogEvent>>> deserializeRaceLogEvents(JSONArray jsonArray) {
|
||||
@@ -230,12 +232,12 @@ public class LeaderboardMasterDataJsonDeserializer implements JsonDeserializer<L
|
||||
|
||||
}
|
||||
|
||||
private ScoringScheme deserializeScoringScheme(JSONObject jsonObject) {
|
||||
public static ScoringScheme deserializeScoringScheme(JSONObject jsonObject, DomainFactory domainFactory) {
|
||||
String type = (String) jsonObject.get(LeaderboardMasterDataJsonSerializer.FIELD_TYPE);
|
||||
return domainFactory.createScoringScheme(ScoringSchemeType.valueOf(type));
|
||||
}
|
||||
|
||||
private int[] deserializeResultDesicardingRule(JSONObject jsonObject) {
|
||||
|
||||
public static int[] deserializeResultDesicardingRule(JSONObject jsonObject) {
|
||||
JSONArray indeces = (JSONArray) jsonObject.get(LeaderboardMasterDataJsonSerializer.FIELD_INDICES);
|
||||
if (indeces == null) {
|
||||
return null;
|
||||
|
||||
+12
-3
@@ -28,7 +28,9 @@ import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogEventSer
|
||||
public class LeaderboardGroupMasterDataJsonSerializer implements JsonSerializer<LeaderboardGroup> {
|
||||
|
||||
public static final String FIELD_LEADERBOARDS = "leaderboards";
|
||||
public static final String FIELD_OVERALL_LEADERBOARD = "overallLeaderboard";
|
||||
public static final String FIELD_HAS_OVERALL_LEADERBOARD = "overallLeaderboard";
|
||||
public static final String FIELD_OVERALL_LEADERBOARD_SCORING_SCHEME = "overallLeaderboardScoringScheme";
|
||||
public static final String FIELD_OVERALL_LEADERBOARD_DISCARDING_THRESHOLDS = "overallLeaderboardScoringScheme";
|
||||
public static final String FIELD_DESCRIPTION = "description";
|
||||
public static final String FIELD_NAME = "name";
|
||||
public static final String FIELD_DISPLAY_GROUPS_REVERSE = "displayGroupsReverse";
|
||||
@@ -67,8 +69,15 @@ public class LeaderboardGroupMasterDataJsonSerializer implements JsonSerializer<
|
||||
JSONObject jsonLeaderboardGroup = new JSONObject();
|
||||
jsonLeaderboardGroup.put(FIELD_NAME, leaderboardGroup.getName());
|
||||
jsonLeaderboardGroup.put(FIELD_DESCRIPTION, leaderboardGroup.getDescription());
|
||||
jsonLeaderboardGroup.put(FIELD_OVERALL_LEADERBOARD,
|
||||
leadboardSerializer.serialize(leaderboardGroup.getOverallLeaderboard()));
|
||||
jsonLeaderboardGroup.put(FIELD_HAS_OVERALL_LEADERBOARD, leaderboardGroup.getOverallLeaderboard() != null);
|
||||
if (leaderboardGroup.getOverallLeaderboard() != null) {
|
||||
jsonLeaderboardGroup.put(FIELD_OVERALL_LEADERBOARD_DISCARDING_THRESHOLDS,
|
||||
LeaderboardMasterDataJsonSerializer.createJsonForResultDiscardingRule(leaderboardGroup
|
||||
.getOverallLeaderboard().getResultDiscardingRule()));
|
||||
jsonLeaderboardGroup.put(FIELD_OVERALL_LEADERBOARD_SCORING_SCHEME,
|
||||
LeaderboardMasterDataJsonSerializer.createJsonForScoringScheme(leaderboardGroup
|
||||
.getOverallLeaderboard().getScoringScheme()));
|
||||
}
|
||||
jsonLeaderboardGroup.put(FIELD_LEADERBOARDS, createJsonArrayForLeaderboards(leaderboardGroup.getLeaderboards()));
|
||||
jsonLeaderboardGroup.put(FIELD_DISPLAY_GROUPS_REVERSE, leaderboardGroup.isDisplayGroupsInReverseOrder());
|
||||
|
||||
|
||||
+4
-5
@@ -38,6 +38,7 @@ public class LeaderboardMasterDataJsonSerializer implements JsonSerializer<Leade
|
||||
public static final String FIELD_SCORING_SCHEME = "scoringScheme";
|
||||
public static final String FIELD_TYPE = "type";
|
||||
public static final String FIELD_REGATTA_LEADERBOARD = "regattaLeaderboard";
|
||||
public static final String FIELD_META_LEADERBOARD = "metaLeaderboard";
|
||||
public static final String FIELD_RESULT_DISCARDING_RULE = "resultDiscardingRule";
|
||||
public static final String FIELD_INDICES = "indices";
|
||||
public static final String FIELD_COURSE_AREA = "courseArea";
|
||||
@@ -96,7 +97,7 @@ public class LeaderboardMasterDataJsonSerializer implements JsonSerializer<Leade
|
||||
jsonLeaderboard.put(FIELD_SCORING_SCHEME, createJsonForScoringScheme(leaderboard.getScoringScheme()));
|
||||
jsonLeaderboard.put(FIELD_COURSE_AREA, createJsonForCourseArea(flexibleLeaderboard.getDefaultCourseArea()));
|
||||
jsonLeaderboard.put(FIELD_RACE_COLUMNS, createJsonArrayForRaceColumns(leaderboard.getRaceColumns()));
|
||||
} else {
|
||||
} else if (leaderboard instanceof RegattaLeaderboard) {
|
||||
RegattaLeaderboard regattaLeaderboard = (RegattaLeaderboard) leaderboard;
|
||||
jsonLeaderboard.put(FIELD_REGATTA_NAME, regattaLeaderboard.getRegatta().getName());
|
||||
CourseArea courseArea = regattaLeaderboard.getRegatta().getDefaultCourseArea();
|
||||
@@ -106,9 +107,7 @@ public class LeaderboardMasterDataJsonSerializer implements JsonSerializer<Leade
|
||||
regattas.add(regattaLeaderboard.getRegatta());
|
||||
isRegattaLeaderboard = true;
|
||||
}
|
||||
|
||||
jsonLeaderboard.put(FIELD_REGATTA_LEADERBOARD, isRegattaLeaderboard);
|
||||
|
||||
return jsonLeaderboard;
|
||||
}
|
||||
|
||||
@@ -198,7 +197,7 @@ public class LeaderboardMasterDataJsonSerializer implements JsonSerializer<Leade
|
||||
return null;
|
||||
}
|
||||
|
||||
private JSONObject createJsonForResultDiscardingRule(ResultDiscardingRule resultDiscardingRule) {
|
||||
public static JSONObject createJsonForResultDiscardingRule(ResultDiscardingRule resultDiscardingRule) {
|
||||
JSONObject result = new JSONObject();
|
||||
if (resultDiscardingRule instanceof ThresholdBasedResultDiscardingRule) {
|
||||
ThresholdBasedResultDiscardingRule rule = (ThresholdBasedResultDiscardingRule) resultDiscardingRule;
|
||||
@@ -212,7 +211,7 @@ public class LeaderboardMasterDataJsonSerializer implements JsonSerializer<Leade
|
||||
return result;
|
||||
}
|
||||
|
||||
private JSONObject createJsonForScoringScheme(ScoringScheme scoringScheme) {
|
||||
public static JSONObject createJsonForScoringScheme(ScoringScheme scoringScheme) {
|
||||
JSONObject result = new JSONObject();
|
||||
result.put(FIELD_TYPE, scoringScheme.getType().name());
|
||||
return result;
|
||||
|
||||
+9
-8
@@ -34,6 +34,7 @@ import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
|
||||
import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl;
|
||||
import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard;
|
||||
import com.sap.sailing.domain.masterdataimport.EventMasterData;
|
||||
import com.sap.sailing.domain.masterdataimport.FlexibleLeaderboardMasterData;
|
||||
import com.sap.sailing.domain.masterdataimport.LeaderboardGroupMasterData;
|
||||
@@ -129,13 +130,7 @@ public class ImportMasterDataOperation extends
|
||||
}
|
||||
int[] overallLeaderboardDiscardThresholds = null;
|
||||
ScoringSchemeType overallLeaderboardScoringSchemeType = null;
|
||||
LeaderboardMasterData overallLeaderboard = masterData.getOverallLeaderboardMasterData();
|
||||
if (overallLeaderboard != null && overallLeaderboard instanceof FlexibleLeaderboardMasterData) {
|
||||
FlexibleLeaderboardMasterData flex = (FlexibleLeaderboardMasterData) overallLeaderboard;
|
||||
overallLeaderboardDiscardThresholds = overallLeaderboard.getResultDiscardingRule()
|
||||
.getDiscardIndexResultsStartingWithHowManyRaces();
|
||||
overallLeaderboardScoringSchemeType = flex.getScoringScheme().getType();
|
||||
}
|
||||
final LeaderboardGroup leaderboardGroup;
|
||||
LeaderboardGroup existingLeaderboardGroup = toState.getLeaderboardGroupByName(masterData.getName());
|
||||
if (existingLeaderboardGroup != null && override) {
|
||||
logger.info(String.format("Leaderboard Group with name %1$s already existed and will be overridden.",
|
||||
@@ -144,14 +139,20 @@ public class ImportMasterDataOperation extends
|
||||
existingLeaderboardGroup = null;
|
||||
}
|
||||
if (existingLeaderboardGroup == null) {
|
||||
toState.addLeaderboardGroup(masterData.getName(), masterData.getDescription(),
|
||||
leaderboardGroup = toState.addLeaderboardGroup(masterData.getName(), masterData.getDescription(),
|
||||
masterData.isDisplayGroupsRevese(), leaderboardNames, overallLeaderboardDiscardThresholds,
|
||||
overallLeaderboardScoringSchemeType);
|
||||
creationCount.addOneLeaderboardGroup(masterData.getName());
|
||||
} else {
|
||||
leaderboardGroup = existingLeaderboardGroup;
|
||||
logger.info(String.format("Leaderboard Group with name %1$s already exists and hasn't been overridden.",
|
||||
masterData.getName()));
|
||||
}
|
||||
if (masterData.hasOverallLeaderboard() && (override || existingLeaderboardGroup == null)) {
|
||||
LeaderboardGroupMetaLeaderboard overallLeaderboard = new LeaderboardGroupMetaLeaderboard(leaderboardGroup, masterData.getOverallLeaderboardScoringScheme(),
|
||||
new ThresholdBasedResultDiscardingRuleImpl(masterData.getOverallLeaderboardDiscardingRule()));
|
||||
leaderboardGroup.setOverallLeaderboard(overallLeaderboard);
|
||||
}
|
||||
}
|
||||
|
||||
private void addRaceLogEvents(Leaderboard leaderboard, Map<String, Map<String, List<RaceLogEvent>>> raceLogEvents) {
|
||||
|
||||
Reference in new issue
Block a user