- added new LeaderboardSettingsFactory for creating different kind of settings

This commit is contained in:
fmittag committed 2012-02-07 18:24:17 +01:00
1 parent 6000aed5f1
commit 9299fa1210
11 files changed
+123 -33

No files matched your search

@@ -15,6 +15,7 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.EventDisplayer; import com.sap.sailing.gwt.ui.client.EventDisplayer;
import com.sap.sailing.gwt.ui.client.EventRefresher; import com.sap.sailing.gwt.ui.client.EventRefresher;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettingsFactory;
import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.EventDTO;
public class AdminConsole extends AbstractEntryPoint implements EventRefresher { public class AdminConsole extends AbstractEntryPoint implements EventRefresher {
@@ -52,8 +53,8 @@ public class AdminConsole extends AbstractEntryPoint implements EventRefresher {
eventDisplayers.add(raceMapPanel); eventDisplayers.add(raceMapPanel);
raceMapPanel.setSize("90%", "90%"); raceMapPanel.setSize("90%", "90%");
tabPanel.add(raceMapPanel, stringMessages.map(), /* asHTML */ false); tabPanel.add(raceMapPanel, stringMessages.map(), /* asHTML */ false);
LeaderboardPanel defaultLeaderboardPanel = new LeaderboardPanel(sailingService, null, LeaderboardPanel defaultLeaderboardPanel = new LeaderboardPanel(sailingService, LeaderboardSettingsFactory.getDefaultSettings(),
new CompetitorSelectionModel(/* hasMultiSelection */true), null, new CompetitorSelectionModel(/* hasMultiSelection */true),
DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, null, this, stringMessages); DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, null, this, stringMessages);
defaultLeaderboardPanel.setSize("90%", "90%"); defaultLeaderboardPanel.setSize("90%", "90%");
tabPanel.add(defaultLeaderboardPanel, stringMessages.defaultLeaderboard(), /* asHTML */ false); tabPanel.add(defaultLeaderboardPanel, stringMessages.defaultLeaderboard(), /* asHTML */ false);
@@ -46,10 +46,12 @@ public abstract class AbstractEntryPoint implements EntryPoint, ErrorReporter {
public void onModuleLoad() { public void onModuleLoad() {
stringMessages = GWT.create(StringMessages.class); stringMessages = GWT.create(StringMessages.class);
errorDialogBox = createErrorDialog(); errorDialogBox = createErrorDialog();
ServiceDefTarget serviceDef = (ServiceDefTarget) sailingService; ServiceDefTarget sailingServiceDef = (ServiceDefTarget) sailingService;
ServiceDefTarget userManagementServiceDef = (ServiceDefTarget) userManagementService;
String moduleBaseURL = GWT.getModuleBaseURL(); String moduleBaseURL = GWT.getModuleBaseURL();
String baseURL = moduleBaseURL.substring(0, moduleBaseURL.lastIndexOf('/', moduleBaseURL.length()-2)+1); String baseURL = moduleBaseURL.substring(0, moduleBaseURL.lastIndexOf('/', moduleBaseURL.length()-2)+1);
serviceDef.setServiceEntryPoint(baseURL + "sailing"); sailingServiceDef.setServiceEntryPoint(baseURL + "sailing");
userManagementServiceDef.setServiceEntryPoint(baseURL + "usermanagement");
} }
@Override @Override
@@ -786,21 +786,21 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
} }
} }
public LeaderboardPanel(SailingServiceAsync sailingService, public LeaderboardPanel(SailingServiceAsync sailingService, LeaderboardSettings settings,
CompetitorSelectionProvider competitorSelectionProvider, String leaderboardName, String leaderboardGroupName, CompetitorSelectionProvider competitorSelectionProvider, String leaderboardName, String leaderboardGroupName,
ErrorReporter errorReporter, final StringMessages stringConstants) { ErrorReporter errorReporter, final StringMessages stringConstants) {
this(sailingService, /* preSelectedRace */ null, competitorSelectionProvider, leaderboardName, leaderboardGroupName, errorReporter, stringConstants); this(sailingService, settings, /* preSelectedRace */ null, competitorSelectionProvider, leaderboardName, leaderboardGroupName, errorReporter, stringConstants);
} }
public LeaderboardPanel(SailingServiceAsync sailingService, RaceIdentifier preSelectedRace, public LeaderboardPanel(SailingServiceAsync sailingService, LeaderboardSettings settings, RaceIdentifier preSelectedRace,
CompetitorSelectionProvider competitorSelectionProvider, String leaderboardName, String leaderboardGroupName, CompetitorSelectionProvider competitorSelectionProvider, String leaderboardName, String leaderboardGroupName,
ErrorReporter errorReporter, final StringMessages stringConstants) { ErrorReporter errorReporter, final StringMessages stringConstants) {
this(sailingService, preSelectedRace, competitorSelectionProvider, new Timer(PlayModes.Replay, /* delayBetweenAutoAdvancesInMilliseconds */3000l), this(sailingService, settings, preSelectedRace, competitorSelectionProvider, new Timer(PlayModes.Replay, /* delayBetweenAutoAdvancesInMilliseconds */3000l),
leaderboardName, leaderboardGroupName, errorReporter, stringConstants); leaderboardName, leaderboardGroupName, errorReporter, stringConstants);
timer.setDelay(getDelayInMilliseconds()); // set time/delay before adding as listener timer.setDelay(getDelayInMilliseconds()); // set time/delay before adding as listener
} }
public LeaderboardPanel(SailingServiceAsync sailingService, RaceIdentifier preSelectedRace, public LeaderboardPanel(SailingServiceAsync sailingService, LeaderboardSettings settings, RaceIdentifier preSelectedRace,
CompetitorSelectionProvider competitorSelectionProvider, Timer timer, String leaderboardName, String leaderboardGroupName, CompetitorSelectionProvider competitorSelectionProvider, Timer timer, String leaderboardName, String leaderboardGroupName,
ErrorReporter errorReporter, final StringMessages stringConstants) { ErrorReporter errorReporter, final StringMessages stringConstants) {
this.sailingService = sailingService; this.sailingService = sailingService;
@@ -811,18 +811,16 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
this.errorReporter = errorReporter; this.errorReporter = errorReporter;
this.stringConstants = stringConstants; this.stringConstants = stringConstants;
this.selectedLegDetails = new ArrayList<DetailType>(); this.selectedLegDetails = new ArrayList<DetailType>();
this.selectedLegDetails.add(DetailType.DISTANCE_TRAVELED);
this.selectedLegDetails.add(DetailType.AVERAGE_SPEED_OVER_GROUND_IN_KNOTS);
this.selectedLegDetails.add(DetailType.RANK_GAIN);
this.selectedRaceDetails = new ArrayList<DetailType>(); this.selectedRaceDetails = new ArrayList<DetailType>();
this.selectedRaceDetails.add(DetailType.DISPLAY_LEGS);
this.selectedRaceColumns = new ArrayList<RaceInLeaderboardDTO>(); this.selectedRaceColumns = new ArrayList<RaceInLeaderboardDTO>();
this.selectedManeuverDetails = new ArrayList<DetailType>(); this.selectedManeuverDetails = new ArrayList<DetailType>();
selectedManeuverDetails.add(DetailType.TACK);
selectedManeuverDetails.add(DetailType.JIBE); selectedLegDetails.addAll(settings.getLegDetailsToShow());
selectedManeuverDetails.add(DetailType.PENALTY_CIRCLE); selectedManeuverDetails.addAll(settings.getManeuverDetailsToShow());
delayInMilliseconds = 0l; selectedRaceDetails.addAll(settings.getRaceDetailsToShow());
autoExpandFirstRace = false; delayInMilliseconds = settings.getDelayInMilliseconds();
autoExpandFirstRace = settings.isAutoExpandFirstRace();
this.timer = timer; this.timer = timer;
timer.addPlayStateListener(this); timer.addPlayStateListener(this);
timer.addTimeListener(this); timer.addTimeListener(this);
@@ -0,0 +1,60 @@
package com.sap.sailing.gwt.ui.leaderboard;
import java.util.ArrayList;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.gwt.ui.shared.RaceInLeaderboardDTO;
import com.sap.sailing.gwt.ui.shared.UserDTO;
import com.sap.sailing.gwt.ui.usermanagement.UserRoles;
/*
* A factory class creating leaderboard settings for different contexts (user role, live or replay mode, etc.
*/
public class LeaderboardSettingsFactory {
public static LeaderboardSettings getSettingsForUserRole(UserDTO user)
{
LeaderboardSettings settings = null;
if (user != null && user.roles.contains(UserRoles.moderator.name())) {
ArrayList<DetailType> maneuverDetails = new ArrayList<DetailType>();
maneuverDetails.add(DetailType.TACK);
maneuverDetails.add(DetailType.JIBE);
maneuverDetails.add(DetailType.PENALTY_CIRCLE);
ArrayList<DetailType> legDetails = new ArrayList<DetailType>();
legDetails.add(DetailType.DISTANCE_TRAVELED);
legDetails.add(DetailType.AVERAGE_SPEED_OVER_GROUND_IN_KNOTS);
legDetails.add(DetailType.RANK_GAIN);
ArrayList<DetailType> raceDetails = new ArrayList<DetailType>();
raceDetails.add(DetailType.DISPLAY_LEGS);
ArrayList<RaceInLeaderboardDTO> raceColumns = new ArrayList<RaceInLeaderboardDTO>();
settings = new LeaderboardSettings(maneuverDetails, legDetails, raceDetails, raceColumns, true, 0l, 0l);
} else {
// anonymous user
settings = getDefaultSettings();
}
return settings;
}
public static LeaderboardSettings getDefaultSettings() {
ArrayList<DetailType> maneuverDetails = new ArrayList<DetailType>();
maneuverDetails.add(DetailType.TACK);
maneuverDetails.add(DetailType.JIBE);
maneuverDetails.add(DetailType.PENALTY_CIRCLE);
ArrayList<DetailType> legDetails = new ArrayList<DetailType>();
legDetails.add(DetailType.DISTANCE_TRAVELED);
legDetails.add(DetailType.AVERAGE_SPEED_OVER_GROUND_IN_KNOTS);
legDetails.add(DetailType.RANK_GAIN);
ArrayList<DetailType> raceDetails = new ArrayList<DetailType>();
raceDetails.add(DetailType.DISPLAY_LEGS);
ArrayList<RaceInLeaderboardDTO> raceColumns = new ArrayList<RaceInLeaderboardDTO>();
return new LeaderboardSettings(maneuverDetails, legDetails, raceDetails, raceColumns, true, 0l, 0l);
}
}
@@ -34,6 +34,7 @@ import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes; import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettingsFactory;
import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.LegTimepointDTO; import com.sap.sailing.gwt.ui.shared.LegTimepointDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO; import com.sap.sailing.gwt.ui.shared.RaceDTO;
@@ -41,7 +42,6 @@ import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.UserDTO; import com.sap.sailing.gwt.ui.shared.UserDTO;
import com.sap.sailing.gwt.ui.shared.components.ComponentViewer; import com.sap.sailing.gwt.ui.shared.components.ComponentViewer;
import com.sap.sailing.gwt.ui.shared.panels.BreadcrumbPanel; import com.sap.sailing.gwt.ui.shared.panels.BreadcrumbPanel;
import com.sap.sailing.gwt.ui.usermanagement.UserRoles;
/** /**
* A panel showing a list of components visualizing a race from the events announced by calls to {@link #fillEvents(List)}. * A panel showing a list of components visualizing a race from the events announced by calls to {@link #fillEvents(List)}.
@@ -92,8 +92,6 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
ArrayList<Pair<String, String>> breadcrumbLinksData = new ArrayList<Pair<String, String>>(); ArrayList<Pair<String, String>> breadcrumbLinksData = new ArrayList<Pair<String, String>>();
String debugParam = Window.Location.getParameter("gwt.codesvr"); String debugParam = Window.Location.getParameter("gwt.codesvr");
getUserSpecificLeaderBoardSettings(user);
if(leaderboardGroupName != null) { if(leaderboardGroupName != null) {
String link = "/gwt/Spectator.html?leaderboardGroupName=" + leaderboardGroupName; String link = "/gwt/Spectator.html?leaderboardGroupName=" + leaderboardGroupName;
if(debugParam != null && !debugParam.isEmpty()) if(debugParam != null && !debugParam.isEmpty())
@@ -107,7 +105,8 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
componentsNavigationPanel.addStyleName("raceBoardNavigation"); componentsNavigationPanel.addStyleName("raceBoardNavigation");
// create the default leaderboard and select the right race // create the default leaderboard and select the right race
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, selectedRaceIdentifier, competitorSelectionModel, LeaderboardSettings leaderBoardSettings = LeaderboardSettingsFactory.getSettingsForUserRole(user);
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, leaderBoardSettings, selectedRaceIdentifier, competitorSelectionModel,
timer, leaderboardName, leaderboardGroupName, errorReporter, stringMessages); timer, leaderboardName, leaderboardGroupName, errorReporter, stringMessages);
CollapsableComponentViewer<LeaderboardSettings> leaderboardViewer = new CollapsableComponentViewer<LeaderboardSettings>( CollapsableComponentViewer<LeaderboardSettings> leaderboardViewer = new CollapsableComponentViewer<LeaderboardSettings>(
@@ -141,16 +140,6 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
timePanel = new TimePanel(timer, stringMessages); timePanel = new TimePanel(timer, stringMessages);
} }
private LeaderboardSettings getUserSpecificLeaderBoardSettings(UserDTO user)
{
LeaderboardSettings settings = null;
if (user != null && user.roles.contains(UserRoles.moderator.name())) {
} else {
// anonymous user
}
return settings;
}
private void addComponentViewerMenuEntry(final ComponentViewer c) { private void addComponentViewerMenuEntry(final ComponentViewer c) {
Anchor menuEntry = new Anchor(c.getViewerName()); Anchor menuEntry = new Anchor(c.getViewerName());
@@ -69,6 +69,7 @@ import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.KilometersPerHourSpeedImpl; import com.sap.sailing.domain.common.impl.KilometersPerHourSpeedImpl;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.Leaderboard.Entry; import com.sap.sailing.domain.leaderboard.Leaderboard.Entry;
@@ -754,6 +755,39 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
Iterable<TrackedLeg> trackedLegs = trackedRace.getTrackedLegs(); Iterable<TrackedLeg> trackedLegs = trackedRace.getTrackedLegs();
int i = 1; int i = 1;
for (TrackedLeg trackedLeg : trackedLegs) { for (TrackedLeg trackedLeg : trackedLegs) {
if(i == 1) {
// try to calculate the point in time where all boats passed the start line in a small time frame
Waypoint from = trackedLeg.getLeg().getFrom();
Iterable<MarkPassing> markPassings = trackedRace.getMarkPassingsInOrder(from);
int markPassingsCount = Util.size(markPassings);
if(markPassings != null && markPassingsCount >= 4) {
long maxTimeFrameInMs = 60 * 1000; // = 1 minute
Iterator<MarkPassing> iterator = markPassings.iterator();
long currentTimeToCheck = 0;
int enoughCompetitors = markPassingsCount / 2;
int currentCompetitorsInTime = 0;
while (iterator.hasNext()) {
MarkPassing currentMarkPassing = iterator.next();
long diff = currentMarkPassing.getTimePoint().asMillis() - currentTimeToCheck;
if(diff > maxTimeFrameInMs) {
// reset the check
currentCompetitorsInTime = 0;
currentTimeToCheck = currentMarkPassing.getTimePoint().asMillis();
} else {
currentCompetitorsInTime++;
if(currentCompetitorsInTime == enoughCompetitors) {
LegTimepointDTO legTimepointDTO = new LegTimepointDTO("L0");
legTimepointDTO.firstPassingDate = currentMarkPassing.getTimePoint().asDate();
result.add(legTimepointDTO);
break;
}
}
}
}
}
Waypoint to = trackedLeg.getLeg().getTo(); Waypoint to = trackedLeg.getLeg().getTo();
Iterable<MarkPassing> markPassings = trackedRace.getMarkPassingsInOrder(to); Iterable<MarkPassing> markPassings = trackedRace.getMarkPassingsInOrder(to);
if(markPassings != null) { if(markPassings != null) {
@@ -13,6 +13,9 @@ public class UserDTO implements IsSerializable {
public List<String> roles; public List<String> roles;
public UserDTO() {
}
public UserDTO(String principalName) { public UserDTO(String principalName) {
super(); super();
this.principalName = principalName; this.principalName = principalName;
@@ -479,7 +479,7 @@ public class OverviewEventPanel extends AbstractEventPanel {
} }
currentLeaderboard = boardToDisplay; currentLeaderboard = boardToDisplay;
CompetitorSelectionModel competitorSelectionModel = new CompetitorSelectionModel(true); CompetitorSelectionModel competitorSelectionModel = new CompetitorSelectionModel(true);
displayedLeaderboardPanel = new LeaderboardPanel(sailingService, competitorSelectionModel, displayedLeaderboardPanel = new LeaderboardPanel(sailingService, null, competitorSelectionModel,
currentLeaderboard.name, null, errorReporter, stringConstants); currentLeaderboard.name, null, errorReporter, stringConstants);
leaderboardPanel.add(displayedLeaderboardPanel); leaderboardPanel.add(displayedLeaderboardPanel);
} }
@@ -47,6 +47,7 @@
<source path='components'/> <source path='components'/>
<source path='adminconsole'/> <source path='adminconsole'/>
<source path='leaderboard'/> <source path='leaderboard'/>
<source path='usermanagement'/>
<source path='shared'/> <source path='shared'/>
<source path='test'/> <source path='test'/>
</module> </module>
@@ -34,5 +34,6 @@
<source path='raceboard'/> <source path='raceboard'/>
<source path='leaderboard'/> <source path='leaderboard'/>
<source path='adminconsole'/> <source path='adminconsole'/>
<source path='usermanagement'/>
<source path='shared'/> <source path='shared'/>
</module> </module>
@@ -37,5 +37,6 @@
<source path='spectator'/> <source path='spectator'/>
<source path='leaderboard'/> <source path='leaderboard'/>
<source path='adminconsole'/> <source path='adminconsole'/>
<source path='usermanagement'/>
<source path='test'/> <source path='test'/>
</module> </module>