Finetuning of the new AsynchActionExecutor:

- Added the async actions or the charts (WindChart, CompetitorCharts)
- Added logic to check the amount of pending calls per action type
- Added a central instance of the AsynchActionExecutor to the RaceboardPanel so that all used components of the panel can share one instance
This commit is contained in:
fmittag
2012-03-17 17:19:51 +01:00
parent 5e1e724c7e
commit 63f1d2cbb3
18 changed files with 189 additions and 54 deletions
@@ -17,7 +17,7 @@ public class LeaderboardPanelMock extends LeaderboardPanel {
public LeaderboardPanelMock(SailingServiceAsync sailingService, public LeaderboardPanelMock(SailingServiceAsync sailingService,
String leaderboardName, ErrorReporter errorReporter, String leaderboardName, ErrorReporter errorReporter,
StringMessages stringConstants) { StringMessages stringConstants) {
super(sailingService, LeaderboardSettingsFactory.getInstance().createNewDefaultSettings( super(sailingService, null, LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(
/* racesToShow */null, /* namesOfRacesToShow */ null, /* autoExpandFirstRace */false), new CompetitorSelectionModel( /* racesToShow */null, /* namesOfRacesToShow */ null, /* autoExpandFirstRace */false), new CompetitorSelectionModel(
/* hasMultiSelection */true), leaderboardName, null, errorReporter, stringConstants, null); /* hasMultiSelection */true), leaderboardName, null, errorReporter, stringConstants, null);
} }
@@ -1,21 +1,30 @@
package com.sap.sailing.gwt.ui.actions; package com.sap.sailing.gwt.ui.actions;
import java.util.HashMap;
import java.util.Map;
import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
public class AsyncActionsExecutor { public class AsyncActionsExecutor {
private AsyncAction<?> lastRequestedAction; private AsyncAction<?> lastRequestedAction;
private int numPending; private int numPendingCalls;
private final int maxPendingCalls; private final int maxPendingCalls;
private final int maxPendingCallsPerType;
private Map<String, Integer> actionsPerType;
public AsyncActionsExecutor() { public AsyncActionsExecutor() {
numPending = 0; numPendingCalls = 0;
maxPendingCalls = 5; maxPendingCalls = 6;
maxPendingCallsPerType = 3;
lastRequestedAction = null; lastRequestedAction = null;
actionsPerType = new HashMap<String, Integer>();
} }
public void execute(final AsyncAction<?> action) { public void execute(final AsyncAction<?> action) {
if(numPending >= maxPendingCalls) { Integer numActionsOfType = actionsPerType.get(action.getName());
if(numPendingCalls >= maxPendingCalls || (numActionsOfType != null && numActionsOfType > maxPendingCallsPerType)) {
GWT.log("Drop action : " + action.getName()); GWT.log("Drop action : " + action.getName());
// don't put the call into the execution queue, but save it as the last one // don't put the call into the execution queue, but save it as the last one
@@ -28,33 +37,47 @@ public class AsyncActionsExecutor {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
AsyncCallback<Object> callback = (AsyncCallback<Object>) action.getCallback(); String actionName = action.getName();
callback.onFailure(caught); GWT.log("Execution failure for action of type: " + actionName);
numPending--; AsyncCallback<Object> callback = (AsyncCallback<Object>) action.getCallback();
finish(); callback.onFailure(caught);
Integer numActionsPerType = actionsPerType.get(actionName);
if(numActionsPerType != null && numActionsPerType > 0)
actionsPerType.put(actionName, numActionsPerType-1);
numPendingCalls--;
checkForEmptyCallQueue();
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void onSuccess(Object result) { public void onSuccess(Object result) {
String actionName = action.getName();
GWT.log("Execution success for action of type: " + actionName);
AsyncCallback<Object> callback = (AsyncCallback<Object>) action.getCallback(); AsyncCallback<Object> callback = (AsyncCallback<Object>) action.getCallback();
callback.onSuccess(result); callback.onSuccess(result);
numPending--; Integer numActionsPerType = actionsPerType.get(actionName);
finish(); if(numActionsPerType != null && numActionsPerType > 0)
actionsPerType.put(actionName, numActionsPerType-1);
numPendingCalls--;
checkForEmptyCallQueue();
} }
}; };
action.setWrapperCallback(wrapper); action.setWrapperCallback(wrapper);
action.execute(); action.execute();
numPending++; if(numActionsOfType == null)
numActionsOfType = 0;
actionsPerType.put(action.getName(), numActionsOfType+1);
numPendingCalls++;
GWT.log("Execute action: " + action.getName()); GWT.log("Execute action: " + action.getName());
GWT.log("Pending actions counter: " + numPending); GWT.log("Pending actions counter: " + numPendingCalls);
} }
private void finish() { private void checkForEmptyCallQueue() {
if(numPending == 0 && lastRequestedAction != null) { if(numPendingCalls == 0 && lastRequestedAction != null) {
execute(lastRequestedAction);
GWT.log("Set back last action : " + lastRequestedAction.getName()); GWT.log("Set back last action : " + lastRequestedAction.getName());
execute(lastRequestedAction);
} }
} }
} }
@@ -0,0 +1,62 @@
package com.sap.sailing.gwt.ui.actions;
import java.util.Date;
import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.MultiCompetitorRaceDataDTO;
public class GetCompetitorsRaceDataAction extends DefaultAsyncAction<MultiCompetitorRaceDataDTO> {
private final SailingServiceAsync sailingService;
private final RaceIdentifier race;
private final List<Pair<Date, CompetitorDTO>> competitorsQuery;
private final Date toDate;
private final long stepSize;
private final DetailType detailType;
private MultiCompetitorRaceDataDTO result;
private AsyncCallback<MultiCompetitorRaceDataDTO> callback;
public GetCompetitorsRaceDataAction(SailingServiceAsync sailingService, RaceIdentifier race, List<Pair<Date, CompetitorDTO>> competitorsQuery,
Date toDate, long stepSize, DetailType detailType) {
this.sailingService = sailingService;
this.race = race;
this.competitorsQuery = competitorsQuery;
this.toDate = toDate;
this.stepSize = stepSize;
this.detailType = detailType;
}
@SuppressWarnings("unchecked")
@Override
public void execute() {
sailingService.getCompetitorsRaceData(race, competitorsQuery, toDate, stepSize, detailType,
(AsyncCallback<MultiCompetitorRaceDataDTO>) wrapperCallback);
}
@Override
public MultiCompetitorRaceDataDTO getResult() {
return result;
}
@Override
public AsyncCallback<MultiCompetitorRaceDataDTO> getCallback() {
return callback;
}
@Override
public void setCallback(AsyncCallback<MultiCompetitorRaceDataDTO> callback) {
this.callback = callback;
}
@Override
public String getName() {
return GetCompetitorsRaceDataAction.class.getName();
}
}
@@ -12,13 +12,20 @@ public class GetWindInfoAction extends DefaultAsyncAction<WindInfoForRaceDTO>
{ {
private final SailingServiceAsync sailingService; private final SailingServiceAsync sailingService;
private final RaceIdentifier raceIdentifier; private final RaceIdentifier raceIdentifier;
private final Date from; private Date from;
private long millisecondsStepWidth; private long millisecondsStepWidth;
private int numberOfFixes; private int numberOfFixes;
private Collection<String> windSourceTypeNames; private Collection<String> windSourceTypeNames;
private WindInfoForRaceDTO result; private WindInfoForRaceDTO result;
private long resolutionInMilliseconds;
private Date fromDate;
private Date toDate;
private enum CallVariants { Variant1, Variant2 };
private final CallVariants callVariant;
private AsyncCallback<WindInfoForRaceDTO> callback; private AsyncCallback<WindInfoForRaceDTO> callback;
public GetWindInfoAction(SailingServiceAsync sailingService, RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, public GetWindInfoAction(SailingServiceAsync sailingService, RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth,
@@ -29,12 +36,33 @@ public class GetWindInfoAction extends DefaultAsyncAction<WindInfoForRaceDTO>
this.millisecondsStepWidth = millisecondsStepWidth; this.millisecondsStepWidth = millisecondsStepWidth;
this.numberOfFixes = numberOfFixes; this.numberOfFixes = numberOfFixes;
this.windSourceTypeNames = windSourceTypeNames; this.windSourceTypeNames = windSourceTypeNames;
callVariant = CallVariants.Variant1;
} }
public GetWindInfoAction(SailingServiceAsync sailingService, RaceIdentifier raceIdentifier,
Date fromDate, Date toDate, long resolutionInMilliseconds, Collection<String> windSourceTypeNames) {
this.sailingService = sailingService;
this.raceIdentifier = raceIdentifier;
this.fromDate = fromDate;
this.toDate = toDate;
this.resolutionInMilliseconds = resolutionInMilliseconds;
this.windSourceTypeNames = windSourceTypeNames;
callVariant = CallVariants.Variant2;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void execute() { public void execute() {
sailingService.getWindInfo(raceIdentifier, from, millisecondsStepWidth, numberOfFixes, windSourceTypeNames, (AsyncCallback<WindInfoForRaceDTO>) wrapperCallback); switch (callVariant) {
case Variant1:
sailingService.getWindInfo(raceIdentifier, from, millisecondsStepWidth, numberOfFixes, windSourceTypeNames, (AsyncCallback<WindInfoForRaceDTO>) wrapperCallback);
break;
case Variant2:
sailingService.getWindInfo(raceIdentifier, fromDate, toDate, resolutionInMilliseconds, windSourceTypeNames, (AsyncCallback<WindInfoForRaceDTO>) wrapperCallback);
break;
}
} }
@Override @Override
@@ -10,6 +10,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.TabPanel;
import com.sap.sailing.domain.common.DefaultLeaderboardName; import com.sap.sailing.domain.common.DefaultLeaderboardName;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.client.AbstractEntryPoint; import com.sap.sailing.gwt.ui.client.AbstractEntryPoint;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.EventDisplayer; import com.sap.sailing.gwt.ui.client.EventDisplayer;
@@ -58,7 +59,7 @@ public class AdminConsoleEntryPoint extends AbstractEntryPoint implements EventR
tabPanel.add(raceMapPanel, stringMessages.map(), /* asHTML */ false); tabPanel.add(raceMapPanel, stringMessages.map(), /* asHTML */ false);
LeaderboardSettings defaultLeaderboardSettings = LeaderboardSettingsFactory.getInstance() LeaderboardSettings defaultLeaderboardSettings = LeaderboardSettingsFactory.getInstance()
.createNewDefaultSettings(/* racesToShow */ null, /* namesOfRacesToShow */ null, /* autoExpandFirstRace */false); .createNewDefaultSettings(/* racesToShow */ null, /* namesOfRacesToShow */ null, /* autoExpandFirstRace */false);
final LeaderboardPanel defaultLeaderboardPanel = new LeaderboardPanel(sailingService, final LeaderboardPanel defaultLeaderboardPanel = new LeaderboardPanel(sailingService, new AsyncActionsExecutor(),
defaultLeaderboardSettings, defaultLeaderboardSettings,
/* preSelectedRace */null, new CompetitorSelectionModel(/* hasMultiSelection */true), /* preSelectedRace */null, new CompetitorSelectionModel(/* hasMultiSelection */true),
DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, /* leaderboard group name */null, this, DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, /* leaderboard group name */null, this,
@@ -205,11 +205,12 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
private final AsyncActionsExecutor asyncActionsExecutor; private final AsyncActionsExecutor asyncActionsExecutor;
public RaceMap(SailingServiceAsync sailingService, ErrorReporter errorReporter, Timer timer, public RaceMap(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter, Timer timer,
CompetitorSelectionProvider competitorSelection, StringMessages stringMessages) { CompetitorSelectionProvider competitorSelection, StringMessages stringMessages) {
this.setSize("100%", "100%"); this.setSize("100%", "100%");
this.stringMessages = stringMessages; this.stringMessages = stringMessages;
this.sailingService = sailingService; this.sailingService = sailingService;
this.asyncActionsExecutor = asyncActionsExecutor;
this.errorReporter = errorReporter; this.errorReporter = errorReporter;
this.timer = timer; this.timer = timer;
timer.addTimeListener(this); timer.addTimeListener(this);
@@ -227,7 +228,6 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
settings = new RaceMapSettings(); settings = new RaceMapSettings();
lastTimeChangeBeforeInitialization = null; lastTimeChangeBeforeInitialization = null;
dataInitialized = false; dataInitialized = false;
asyncActionsExecutor = new AsyncActionsExecutor();
initializeData(); initializeData();
windPanel = new CombinedWindPanel(sailingService, asyncActionsExecutor, errorReporter, stringMessages, timer); windPanel = new CombinedWindPanel(sailingService, asyncActionsExecutor, errorReporter, stringMessages, timer);
@@ -21,6 +21,7 @@ import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.EventDisplayer; import com.sap.sailing.gwt.ui.client.EventDisplayer;
@@ -71,7 +72,7 @@ public class RaceMapPanel extends FormPanel implements EventDisplayer, TimeListe
AbsolutePanel mapPanel = new AbsolutePanel(); AbsolutePanel mapPanel = new AbsolutePanel();
mapPanel.setSize("100%", "100%"); mapPanel.setSize("100%", "100%");
grid.setWidget(2, 1, mapPanel); grid.setWidget(2, 1, mapPanel);
raceMap = new RaceMap(sailingService, errorReporter, timer, competitorSelectionProvider, stringMessages); raceMap = new RaceMap(sailingService, new AsyncActionsExecutor(), errorReporter, timer, competitorSelectionProvider, stringMessages);
mapPanel.add(raceMap); mapPanel.add(raceMap);
raceSelectionModel = new RaceSelectionModel(); raceSelectionModel = new RaceSelectionModel();
raceListBox = new RacesListBoxPanel(eventRefresher, raceSelectionModel, stringMessages); raceListBox = new RacesListBoxPanel(eventRefresher, raceSelectionModel, stringMessages);
@@ -42,6 +42,7 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.gwt.ui.actions.GetWindInfoAction;
import com.sap.sailing.gwt.ui.client.ColorMap; import com.sap.sailing.gwt.ui.client.ColorMap;
import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener; import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
@@ -462,12 +463,13 @@ public class WindChart extends SimplePanel implements Component<WindChartSetting
if (raceIdentifier == null) { if (raceIdentifier == null) {
clearChart(); clearChart();
} else if (needsDataLoading()) { } else if (needsDataLoading()) {
sailingService.getWindInfo(raceIdentifier, GetWindInfoAction getWindInfoAction = new GetWindInfoAction(sailingService, raceIdentifier,
// TODO Time interval should be determined by a selection in the chart but be at most 60s. See bug #121. // TODO Time interval should be determined by a selection in the chart but be at most 60s. See bug #121.
// Consider incremental updates for new data only. // Consider incremental updates for new data only.
from, to, resolutionInMilliseconds, // use race start and time of newest event as default time period from, to, resolutionInMilliseconds, // use race start and time of newest event as default time period
null, // retrieve data on all wind sources null); // retrieve data on all wind sources
new AsyncCallback<WindInfoForRaceDTO>() {
getWindInfoAction.setCallback(new AsyncCallback<WindInfoForRaceDTO>() {
@Override @Override
public void onSuccess(WindInfoForRaceDTO result) { public void onSuccess(WindInfoForRaceDTO result) {
if (result != null) { if (result != null) {
@@ -40,6 +40,8 @@ import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.actions.GetCompetitorsRaceDataAction;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener; import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.DetailTypeFormatter; import com.sap.sailing.gwt.ui.client.DetailTypeFormatter;
@@ -75,6 +77,7 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
protected static final int LINE_WIDTH = 1; protected static final int LINE_WIDTH = 1;
protected MultiCompetitorRaceDataDTO chartData; protected MultiCompetitorRaceDataDTO chartData;
protected final SailingServiceAsync sailingService; protected final SailingServiceAsync sailingService;
protected final AsyncActionsExecutor asyncActionsExecutor;
protected final ErrorReporter errorReporter; protected final ErrorReporter errorReporter;
protected Chart chart; protected Chart chart;
private boolean compactChart; private boolean compactChart;
@@ -94,7 +97,7 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
protected DetailType dataToShow; protected DetailType dataToShow;
protected final CompetitorSelectionProvider competitorSelectionProvider; protected final CompetitorSelectionProvider competitorSelectionProvider;
public AbstractChartPanel(SailingServiceAsync sailingService, public AbstractChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider, CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider,
Timer timer, final StringMessages stringMessages, ErrorReporter errorReporter, DetailType dataToShow, Timer timer, final StringMessages stringMessages, ErrorReporter errorReporter, DetailType dataToShow,
boolean compactChart, boolean allowTimeAdjust) { boolean compactChart, boolean allowTimeAdjust) {
@@ -110,6 +113,7 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
chartData = null; chartData = null;
this.compactChart = compactChart; this.compactChart = compactChart;
this.sailingService = sailingService; this.sailingService = sailingService;
this.asyncActionsExecutor = asyncActionsExecutor;
this.raceSelectionProvider = raceSelectionProvider; this.raceSelectionProvider = raceSelectionProvider;
this.allowTimeAdjust = allowTimeAdjust; this.allowTimeAdjust = allowTimeAdjust;
raceSelectionProvider.addRaceSelectionChangeListener(this); raceSelectionProvider.addRaceSelectionChangeListener(this);
@@ -271,8 +275,9 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
} }
} }
sailingService.getCompetitorsRaceData(getSelectedRace(), dataQuery, toDate, getStepSize(), getDataToShow(), GetCompetitorsRaceDataAction getCompetitorsRaceDataAction = new GetCompetitorsRaceDataAction(sailingService,
new AsyncCallback<MultiCompetitorRaceDataDTO>() { getSelectedRace(), dataQuery, toDate, getStepSize(), getDataToShow());
getCompetitorsRaceDataAction.setCallback(new AsyncCallback<MultiCompetitorRaceDataDTO>() {
@Override @Override
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
@@ -296,6 +301,8 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
setWidget(chart); setWidget(chart);
} }
}); });
asyncActionsExecutor.execute(getCompetitorsRaceDataAction);
} else { } else {
setWidget(noCompetitorsSelectedLabel); setWidget(noCompetitorsSelectedLabel);
} }
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.ui.leaderboard; package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider; import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
@@ -24,10 +25,10 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
*/ */
public class ChartPanel extends AbstractChartPanel<ChartSettings> implements Component<ChartSettings> { public class ChartPanel extends AbstractChartPanel<ChartSettings> implements Component<ChartSettings> {
public ChartPanel(SailingServiceAsync sailingService, CompetitorSelectionProvider competitorSelectionProvider, public ChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, CompetitorSelectionProvider competitorSelectionProvider,
RaceSelectionProvider raceSelectionProvider, Timer timer, DetailType dataToShow, StringMessages stringMessages, RaceSelectionProvider raceSelectionProvider, Timer timer, DetailType dataToShow, StringMessages stringMessages,
ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust) { ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust) {
super(sailingService, competitorSelectionProvider, raceSelectionProvider, timer, stringMessages, errorReporter, super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, stringMessages, errorReporter,
dataToShow, compactChart, allowTimeAdjust); dataToShow, compactChart, allowTimeAdjust);
} }
@@ -21,6 +21,7 @@ import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionModel; import com.sap.sailing.gwt.ui.client.RaceSelectionModel;
@@ -53,7 +54,7 @@ public class CompareCompetitorsChartDialog extends DialogBox {
raceSelectionProvider = new RaceSelectionModel(); raceSelectionProvider = new RaceSelectionModel();
raceSelectionProvider.setAllRaces(races); raceSelectionProvider.setAllRaces(races);
multiChartPanel = new MultiChartPanel(sailingService, competitorSelectionProvider, raceSelectionProvider, multiChartPanel = new MultiChartPanel(sailingService, new AsyncActionsExecutor(), competitorSelectionProvider, raceSelectionProvider,
timer, stringConstants, errorReporter, false, false); timer, stringConstants, errorReporter, false, false);
multiChartPanel.setSize("100%", "100%"); multiChartPanel.setSize("100%", "100%");
@@ -12,6 +12,7 @@ import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.ScrollPanel;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.client.AbstractEntryPoint; import com.sap.sailing.gwt.ui.client.AbstractEntryPoint;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel;
@@ -61,7 +62,7 @@ public class LeaderboardEntryPoint extends AbstractEntryPoint {
userAgentType, null, timer, logoAndTitlePanel, mainPanel); userAgentType, null, timer, logoAndTitlePanel, mainPanel);
mainPanel.add(tvViewPanel); mainPanel.add(tvViewPanel);
} else { } else {
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, new AsyncActionsExecutor(),
LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(null, null, /* autoExpandFirstRace */ false), LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(null, null, /* autoExpandFirstRace */ false),
/* preSelectedRace */ null, new CompetitorSelectionModel(/* hasMultiSelection */ true), /* preSelectedRace */ null, new CompetitorSelectionModel(/* hasMultiSelection */ true),
new Timer(PlayModes.Replay, /* delayBetweenAutoAdvancesInMilliseconds */3000l), new Timer(PlayModes.Replay, /* delayBetweenAutoAdvancesInMilliseconds */3000l),
@@ -846,25 +846,26 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
} }
} }
public LeaderboardPanel(SailingServiceAsync sailingService, LeaderboardSettings settings, public LeaderboardPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, LeaderboardSettings settings,
CompetitorSelectionProvider competitorSelectionProvider, String leaderboardName, CompetitorSelectionProvider competitorSelectionProvider, String leaderboardName,
String leaderboardGroupName, ErrorReporter errorReporter, final StringMessages stringMessages, String leaderboardGroupName, ErrorReporter errorReporter, final StringMessages stringMessages,
final UserAgentTypes userAgentType) { final UserAgentTypes userAgentType) {
this(sailingService, settings, /* preSelectedRace */null, competitorSelectionProvider, leaderboardName, this(sailingService, asyncActionsExecutor, settings, /* preSelectedRace */null, competitorSelectionProvider, leaderboardName,
leaderboardGroupName, errorReporter, stringMessages, userAgentType); leaderboardGroupName, errorReporter, stringMessages, userAgentType);
} }
public LeaderboardPanel(SailingServiceAsync sailingService, LeaderboardSettings settings, RaceIdentifier preSelectedRace, public LeaderboardPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, LeaderboardSettings settings, RaceIdentifier preSelectedRace,
CompetitorSelectionProvider competitorSelectionProvider, String leaderboardName, String leaderboardGroupName, CompetitorSelectionProvider competitorSelectionProvider, String leaderboardName, String leaderboardGroupName,
ErrorReporter errorReporter, final StringMessages stringMessages, final UserAgentTypes userAgentType) { ErrorReporter errorReporter, final StringMessages stringMessages, final UserAgentTypes userAgentType) {
this(sailingService, settings, preSelectedRace, competitorSelectionProvider, new Timer(PlayModes.Replay, /* delayBetweenAutoAdvancesInMilliseconds */3000l), this(sailingService, asyncActionsExecutor, settings, preSelectedRace, competitorSelectionProvider, new Timer(PlayModes.Replay, /* delayBetweenAutoAdvancesInMilliseconds */3000l),
leaderboardName, leaderboardGroupName, errorReporter, stringMessages, userAgentType); leaderboardName, leaderboardGroupName, errorReporter, stringMessages, userAgentType);
} }
public LeaderboardPanel(SailingServiceAsync sailingService, LeaderboardSettings settings, RaceIdentifier preSelectedRace, public LeaderboardPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, LeaderboardSettings settings, RaceIdentifier preSelectedRace,
CompetitorSelectionProvider competitorSelectionProvider, Timer timer, String leaderboardName, String leaderboardGroupName, CompetitorSelectionProvider competitorSelectionProvider, Timer timer, String leaderboardName, String leaderboardGroupName,
ErrorReporter errorReporter, final StringMessages stringMessages, final UserAgentTypes userAgentType) { ErrorReporter errorReporter, final StringMessages stringMessages, final UserAgentTypes userAgentType) {
this.sailingService = sailingService; this.sailingService = sailingService;
this.asyncActionsExecutor = asyncActionsExecutor;
this.preSelectedRace = preSelectedRace; this.preSelectedRace = preSelectedRace;
this.competitorSelectionProvider = competitorSelectionProvider; this.competitorSelectionProvider = competitorSelectionProvider;
competitorSelectionProvider.addCompetitorSelectionChangeListener(this); competitorSelectionProvider.addCompetitorSelectionChangeListener(this);
@@ -881,7 +882,6 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
selectedRaceDetails.addAll(settings.getRaceDetailsToShow()); selectedRaceDetails.addAll(settings.getRaceDetailsToShow());
setAutoExpandFirstRace(settings.isAutoExpandFirstRace()); setAutoExpandFirstRace(settings.isAutoExpandFirstRace());
asyncActionsExecutor = new AsyncActionsExecutor();
this.timer = timer; this.timer = timer;
timer.addPlayStateListener(this); timer.addPlayStateListener(this);
timer.addTimeListener(this); timer.addTimeListener(this);
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.ui.leaderboard; package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider; import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
@@ -23,10 +24,10 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
* *
*/ */
public class MultiChartPanel extends AbstractChartPanel<MultiChartSettings> implements Component<MultiChartSettings> { public class MultiChartPanel extends AbstractChartPanel<MultiChartSettings> implements Component<MultiChartSettings> {
public MultiChartPanel(SailingServiceAsync sailingService, CompetitorSelectionProvider competitorSelectionProvider, public MultiChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, CompetitorSelectionProvider competitorSelectionProvider,
RaceSelectionProvider raceSelectionProvider, Timer timer, final StringMessages stringMessages, RaceSelectionProvider raceSelectionProvider, Timer timer, final StringMessages stringMessages,
ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust) { ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust) {
super(sailingService, competitorSelectionProvider, raceSelectionProvider, timer, stringMessages, errorReporter, super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, stringMessages, errorReporter,
/*show initially*/ DetailType.WINDWARD_DISTANCE_TO_OVERALL_LEADER, compactChart, allowTimeAdjust); /*show initially*/ DetailType.WINDWARD_DISTANCE_TO_OVERALL_LEADER, compactChart, allowTimeAdjust);
} }
@@ -12,6 +12,7 @@ import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.SimplePanel;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel;
@@ -84,7 +85,7 @@ public class TVViewPanel extends SimplePanel implements RaceTimesInfoProviderLis
CompetitorSelectionModel selectionModel = new CompetitorSelectionModel(/* hasMultiSelection */ true); CompetitorSelectionModel selectionModel = new CompetitorSelectionModel(/* hasMultiSelection */ true);
Timer timer = new Timer(PlayModes.Live, /* delayBetweenAutoAdvancesInMilliseconds */3000l); Timer timer = new Timer(PlayModes.Live, /* delayBetweenAutoAdvancesInMilliseconds */3000l);
timer.play(); timer.play();
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, settings, LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, new AsyncActionsExecutor(), settings,
/* preSelectedRace */null, selectionModel, timer, leaderboardName, null, errorReporter, stringMessages, /* preSelectedRace */null, selectionModel, timer, leaderboardName, null, errorReporter, stringMessages,
userAgentType) { userAgentType) {
@Override @Override
@@ -14,6 +14,7 @@ import com.google.gwt.cell.client.SelectionCell;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -250,9 +251,9 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
} }
} }
public EditableLeaderboardPanel(SailingServiceAsync sailingService, String leaderboardName, String leaderboardGroupName, public EditableLeaderboardPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, String leaderboardName, String leaderboardGroupName,
ErrorReporter errorReporter, StringMessages stringConstants, UserAgentTypes userAgentType) { ErrorReporter errorReporter, StringMessages stringConstants, UserAgentTypes userAgentType) {
super(sailingService, LeaderboardSettingsFactory.getInstance().createNewDefaultSettings( super(sailingService, asyncActionsExecutor, LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(
/* racesToShow */ null, /* namesOfRacesToShow */ null, /* autoExpandFirstRace */false), /* racesToShow */ null, /* namesOfRacesToShow */ null, /* autoExpandFirstRace */false),
new CompetitorSelectionModel(/* hasMultiSelection */true), new CompetitorSelectionModel(/* hasMultiSelection */true),
leaderboardName, leaderboardGroupName, errorReporter, stringConstants, userAgentType); leaderboardName, leaderboardGroupName, errorReporter, stringConstants, userAgentType);
@@ -6,6 +6,7 @@ import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.RootPanel;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.client.AbstractEntryPoint; import com.sap.sailing.gwt.ui.client.AbstractEntryPoint;
import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel;
@@ -20,7 +21,7 @@ public class LeaderboardEditPage extends AbstractEntryPoint {
if (leaderboardNames.contains(leaderboardName)) { if (leaderboardNames.contains(leaderboardName)) {
LogoAndTitlePanel logoAndTitlePanel = new LogoAndTitlePanel("", stringMessages); LogoAndTitlePanel logoAndTitlePanel = new LogoAndTitlePanel("", stringMessages);
logoAndTitlePanel.addStyleName("LogoAndTitlePanel"); logoAndTitlePanel.addStyleName("LogoAndTitlePanel");
EditableLeaderboardPanel leaderboardPanel = new EditableLeaderboardPanel(sailingService, leaderboardName, null, EditableLeaderboardPanel leaderboardPanel = new EditableLeaderboardPanel(sailingService, new AsyncActionsExecutor(), leaderboardName, null,
LeaderboardEditPage.this, stringMessages, userAgentType); LeaderboardEditPage.this, stringMessages, userAgentType);
RootPanel.get().add(logoAndTitlePanel); RootPanel.get().add(logoAndTitlePanel);
RootPanel.get().add(leaderboardPanel); RootPanel.get().add(leaderboardPanel);
@@ -22,6 +22,7 @@ import com.google.gwt.user.client.ui.ToggleButton;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.adminconsole.RaceMap; import com.sap.sailing.gwt.ui.adminconsole.RaceMap;
import com.sap.sailing.gwt.ui.adminconsole.RaceMapSettings; import com.sap.sailing.gwt.ui.adminconsole.RaceMapSettings;
import com.sap.sailing.gwt.ui.adminconsole.WindChart; import com.sap.sailing.gwt.ui.adminconsole.WindChart;
@@ -111,7 +112,9 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
* The competitor chart viewer in <code>CASCADE</code> view mode. <code>null</code> if in <code>ONESCREEN</code> view mode * The competitor chart viewer in <code>CASCADE</code> view mode. <code>null</code> if in <code>ONESCREEN</code> view mode
*/ */
private CollapsableComponentViewer<MultiChartSettings> competitorChartViewer = null; private CollapsableComponentViewer<MultiChartSettings> competitorChartViewer = null;
private final AsyncActionsExecutor asyncActionsExecutor;
public RaceBoardPanel(SailingServiceAsync sailingService, UserDTO theUser, Timer timer, public RaceBoardPanel(SailingServiceAsync sailingService, UserDTO theUser, Timer timer,
RaceSelectionProvider theRaceSelectionProvider, String leaderboardName, String leaderboardGroupName, RaceSelectionProvider theRaceSelectionProvider, String leaderboardName, String leaderboardGroupName,
ErrorReporter errorReporter, final StringMessages stringMessages, UserAgentTypes userAgentType, ErrorReporter errorReporter, final StringMessages stringMessages, UserAgentTypes userAgentType,
@@ -127,6 +130,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
this.errorReporter = errorReporter; this.errorReporter = errorReporter;
this.userAgentType = userAgentType; this.userAgentType = userAgentType;
this.viewMode = viewMode; this.viewMode = viewMode;
asyncActionsExecutor = new AsyncActionsExecutor();
FlowPanel mainPanel = new FlowPanel(); FlowPanel mainPanel = new FlowPanel();
mainPanel.setSize("100%", "100%"); mainPanel.setSize("100%", "100%");
@@ -162,12 +166,12 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
// create the default leaderboard and select the right race // create the default leaderboard and select the right race
leaderboardPanel = createLeaderboardPanel(leaderboardName, leaderboardGroupName); leaderboardPanel = createLeaderboardPanel(leaderboardName, leaderboardGroupName);
RaceMap raceMap = new RaceMap(sailingService, errorReporter, timer, competitorSelectionModel, stringMessages); RaceMap raceMap = new RaceMap(sailingService, asyncActionsExecutor, errorReporter, timer, competitorSelectionModel, stringMessages);
raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier)); raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier));
List<Component<?>> components = new ArrayList<Component<?>>(); List<Component<?>> components = new ArrayList<Component<?>>();
competitorChart = new MultiChartPanel(sailingService, competitorSelectionModel, raceSelectionProvider, competitorChart = new MultiChartPanel(sailingService, asyncActionsExecutor, competitorSelectionModel, raceSelectionProvider,
timer, stringMessages, errorReporter, true, true); timer, stringMessages, errorReporter, true, true);
competitorChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); competitorChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
components.add(competitorChart); components.add(competitorChart);
@@ -263,7 +267,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
// create the race map // create the race map
if(showMap) { if(showMap) {
RaceMap raceMap = new RaceMap(sailingService, errorReporter, timer, competitorSelectionModel, stringMessages); RaceMap raceMap = new RaceMap(sailingService, asyncActionsExecutor, errorReporter, timer, competitorSelectionModel, stringMessages);
CollapsableComponentViewer<RaceMapSettings> raceMapViewer = new CollapsableComponentViewer<RaceMapSettings>( CollapsableComponentViewer<RaceMapSettings> raceMapViewer = new CollapsableComponentViewer<RaceMapSettings>(
raceMap, "auto", "500px", stringMessages); raceMap, "auto", "500px", stringMessages);
@@ -283,7 +287,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
// CollapsableComponentViewer<ChartSettings> chartViewer = new CollapsableComponentViewer<ChartSettings>( // CollapsableComponentViewer<ChartSettings> chartViewer = new CollapsableComponentViewer<ChartSettings>(
// competitorCharts, "auto", "400px", stringMessages); // competitorCharts, "auto", "400px", stringMessages);
competitorChart = new MultiChartPanel(sailingService, competitorSelectionModel, raceSelectionProvider, competitorChart = new MultiChartPanel(sailingService, asyncActionsExecutor, competitorSelectionModel, raceSelectionProvider,
timer, stringMessages, errorReporter, false, true); timer, stringMessages, errorReporter, false, true);
competitorChartViewer = new CollapsableComponentViewer<MultiChartSettings>( competitorChartViewer = new CollapsableComponentViewer<MultiChartSettings>(
competitorChart, "auto", "400px", stringMessages); competitorChart, "auto", "400px", stringMessages);
@@ -303,7 +307,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
.createNewSettingsForPlayMode(timer.getPlayMode(), /* nameOfRaceToSort */ .createNewSettingsForPlayMode(timer.getPlayMode(), /* nameOfRaceToSort */
selectedRaceIdentifier.getRaceName(), selectedRaceIdentifier.getRaceName(),
/* nameOfRaceColumnToShow */null, /* nameOfRaceToShow */selectedRaceIdentifier.getRaceName()); /* nameOfRaceColumnToShow */null, /* nameOfRaceToShow */selectedRaceIdentifier.getRaceName());
return new LeaderboardPanel(sailingService, leaderBoardSettings, selectedRaceIdentifier, return new LeaderboardPanel(sailingService, asyncActionsExecutor, leaderBoardSettings, selectedRaceIdentifier,
competitorSelectionModel, timer, leaderboardName, leaderboardGroupName, errorReporter, stringMessages, competitorSelectionModel, timer, leaderboardName, leaderboardGroupName, errorReporter, stringMessages,
userAgentType); userAgentType);
} }