From 9299fa12103d83c52a0f1bbd602970ee9d8edfbe Mon Sep 17 00:00:00 2001 From: fmittag Date: Tue, 7 Feb 2012 18:24:17 +0100 Subject: [PATCH] - added new LeaderboardSettingsFactory for creating different kind of settings --- .../gwt/ui/adminconsole/AdminConsole.java | 5 +- .../gwt/ui/client/AbstractEntryPoint.java | 6 +- .../gwt/ui/leaderboard/LeaderboardPanel.java | 26 ++++---- .../LeaderboardSettingsFactory.java | 60 +++++++++++++++++++ .../gwt/ui/raceboard/RaceBoardPanel.java | 17 +----- .../gwt/ui/server/SailingServiceImpl.java | 34 +++++++++++ .../sap/sailing/gwt/ui/shared/UserDTO.java | 3 + .../gwt/ui/spectator/OverviewEventPanel.java | 2 +- .../sap/sailing/gwt/ui/AdminConsole.gwt.xml | 1 + .../com/sap/sailing/gwt/ui/RaceBoard.gwt.xml | 1 + .../com/sap/sailing/gwt/ui/Spectator.gwt.xml | 1 + 11 files changed, 123 insertions(+), 33 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsFactory.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsole.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsole.java index 57d360c5e9f..c3628402d5f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsole.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsole.java @@ -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.EventRefresher; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel; +import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettingsFactory; import com.sap.sailing.gwt.ui.shared.EventDTO; public class AdminConsole extends AbstractEntryPoint implements EventRefresher { @@ -52,8 +53,8 @@ public class AdminConsole extends AbstractEntryPoint implements EventRefresher { eventDisplayers.add(raceMapPanel); raceMapPanel.setSize("90%", "90%"); tabPanel.add(raceMapPanel, stringMessages.map(), /* asHTML */ false); - LeaderboardPanel defaultLeaderboardPanel = new LeaderboardPanel(sailingService, null, - new CompetitorSelectionModel(/* hasMultiSelection */true), + LeaderboardPanel defaultLeaderboardPanel = new LeaderboardPanel(sailingService, LeaderboardSettingsFactory.getDefaultSettings(), + null, new CompetitorSelectionModel(/* hasMultiSelection */true), DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, null, this, stringMessages); defaultLeaderboardPanel.setSize("90%", "90%"); tabPanel.add(defaultLeaderboardPanel, stringMessages.defaultLeaderboard(), /* asHTML */ false); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/AbstractEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/AbstractEntryPoint.java index fb7171397a7..ea6f5442227 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/AbstractEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/AbstractEntryPoint.java @@ -46,10 +46,12 @@ public abstract class AbstractEntryPoint implements EntryPoint, ErrorReporter { public void onModuleLoad() { stringMessages = GWT.create(StringMessages.class); errorDialogBox = createErrorDialog(); - ServiceDefTarget serviceDef = (ServiceDefTarget) sailingService; + ServiceDefTarget sailingServiceDef = (ServiceDefTarget) sailingService; + ServiceDefTarget userManagementServiceDef = (ServiceDefTarget) userManagementService; String moduleBaseURL = GWT.getModuleBaseURL(); String baseURL = moduleBaseURL.substring(0, moduleBaseURL.lastIndexOf('/', moduleBaseURL.length()-2)+1); - serviceDef.setServiceEntryPoint(baseURL + "sailing"); + sailingServiceDef.setServiceEntryPoint(baseURL + "sailing"); + userManagementServiceDef.setServiceEntryPoint(baseURL + "usermanagement"); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java index 4bfc75db654..c77022a2e05 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java @@ -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, 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, 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); 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, ErrorReporter errorReporter, final StringMessages stringConstants) { this.sailingService = sailingService; @@ -811,18 +811,16 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta this.errorReporter = errorReporter; this.stringConstants = stringConstants; this.selectedLegDetails = new ArrayList(); - 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(); - this.selectedRaceDetails.add(DetailType.DISPLAY_LEGS); this.selectedRaceColumns = new ArrayList(); this.selectedManeuverDetails = new ArrayList(); - selectedManeuverDetails.add(DetailType.TACK); - selectedManeuverDetails.add(DetailType.JIBE); - selectedManeuverDetails.add(DetailType.PENALTY_CIRCLE); - delayInMilliseconds = 0l; - autoExpandFirstRace = false; + + selectedLegDetails.addAll(settings.getLegDetailsToShow()); + selectedManeuverDetails.addAll(settings.getManeuverDetailsToShow()); + selectedRaceDetails.addAll(settings.getRaceDetailsToShow()); + delayInMilliseconds = settings.getDelayInMilliseconds(); + autoExpandFirstRace = settings.isAutoExpandFirstRace(); + this.timer = timer; timer.addPlayStateListener(this); timer.addTimeListener(this); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsFactory.java new file mode 100644 index 00000000000..57ced25ebca --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsFactory.java @@ -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 maneuverDetails = new ArrayList(); + maneuverDetails.add(DetailType.TACK); + maneuverDetails.add(DetailType.JIBE); + maneuverDetails.add(DetailType.PENALTY_CIRCLE); + + ArrayList legDetails = new ArrayList(); + legDetails.add(DetailType.DISTANCE_TRAVELED); + legDetails.add(DetailType.AVERAGE_SPEED_OVER_GROUND_IN_KNOTS); + legDetails.add(DetailType.RANK_GAIN); + + ArrayList raceDetails = new ArrayList(); + raceDetails.add(DetailType.DISPLAY_LEGS); + + ArrayList raceColumns = new ArrayList(); + + settings = new LeaderboardSettings(maneuverDetails, legDetails, raceDetails, raceColumns, true, 0l, 0l); + } else { + // anonymous user + settings = getDefaultSettings(); + } + return settings; + } + + public static LeaderboardSettings getDefaultSettings() { + ArrayList maneuverDetails = new ArrayList(); + maneuverDetails.add(DetailType.TACK); + maneuverDetails.add(DetailType.JIBE); + maneuverDetails.add(DetailType.PENALTY_CIRCLE); + + ArrayList legDetails = new ArrayList(); + legDetails.add(DetailType.DISTANCE_TRAVELED); + legDetails.add(DetailType.AVERAGE_SPEED_OVER_GROUND_IN_KNOTS); + legDetails.add(DetailType.RANK_GAIN); + + ArrayList raceDetails = new ArrayList(); + raceDetails.add(DetailType.DISPLAY_LEGS); + + ArrayList raceColumns = new ArrayList(); + + return new LeaderboardSettings(maneuverDetails, legDetails, raceDetails, raceColumns, true, 0l, 0l); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index f808aee3013..5f8ab6f3666 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -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.leaderboard.LeaderboardPanel; 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.LegTimepointDTO; 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.components.ComponentViewer; 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)}. @@ -92,8 +92,6 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel ArrayList> breadcrumbLinksData = new ArrayList>(); String debugParam = Window.Location.getParameter("gwt.codesvr"); - getUserSpecificLeaderBoardSettings(user); - if(leaderboardGroupName != null) { String link = "/gwt/Spectator.html?leaderboardGroupName=" + leaderboardGroupName; if(debugParam != null && !debugParam.isEmpty()) @@ -107,7 +105,8 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel componentsNavigationPanel.addStyleName("raceBoardNavigation"); // 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); CollapsableComponentViewer leaderboardViewer = new CollapsableComponentViewer( @@ -141,16 +140,6 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel 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) { Anchor menuEntry = new Anchor(c.getViewerName()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index b6af2105c94..ab39cf850e6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -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.DegreePosition; 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.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard.Entry; @@ -754,6 +755,39 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS Iterable trackedLegs = trackedRace.getTrackedLegs(); int i = 1; 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 markPassings = trackedRace.getMarkPassingsInOrder(from); + int markPassingsCount = Util.size(markPassings); + + if(markPassings != null && markPassingsCount >= 4) { + long maxTimeFrameInMs = 60 * 1000; // = 1 minute + Iterator 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(); Iterable markPassings = trackedRace.getMarkPassingsInOrder(to); if(markPassings != null) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/UserDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/UserDTO.java index ed99cd06bc9..4fb7c06b36c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/UserDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/UserDTO.java @@ -13,6 +13,9 @@ public class UserDTO implements IsSerializable { public List roles; + public UserDTO() { + } + public UserDTO(String principalName) { super(); this.principalName = principalName; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/OverviewEventPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/OverviewEventPanel.java index 809d1ebb77f..ed7060a4252 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/OverviewEventPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/OverviewEventPanel.java @@ -479,7 +479,7 @@ public class OverviewEventPanel extends AbstractEventPanel { } currentLeaderboard = boardToDisplay; CompetitorSelectionModel competitorSelectionModel = new CompetitorSelectionModel(true); - displayedLeaderboardPanel = new LeaderboardPanel(sailingService, competitorSelectionModel, + displayedLeaderboardPanel = new LeaderboardPanel(sailingService, null, competitorSelectionModel, currentLeaderboard.name, null, errorReporter, stringConstants); leaderboardPanel.add(displayedLeaderboardPanel); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml index 9b057d3842d..0fc425406f5 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml @@ -47,6 +47,7 @@ + diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/RaceBoard.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/RaceBoard.gwt.xml index 9fd86175033..f0956ffaa75 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/RaceBoard.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/RaceBoard.gwt.xml @@ -34,5 +34,6 @@ + diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Spectator.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Spectator.gwt.xml index e3d153062fd..0f097fdaa44 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Spectator.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Spectator.gwt.xml @@ -37,5 +37,6 @@ +