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,
String leaderboardName, ErrorReporter errorReporter,
StringMessages stringConstants) {
super(sailingService, LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(
super(sailingService, null, LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(
/* racesToShow */null, /* namesOfRacesToShow */ null, /* autoExpandFirstRace */false), new CompetitorSelectionModel(
/* hasMultiSelection */true), leaderboardName, null, errorReporter, stringConstants, null);
}
@@ -1,21 +1,30 @@
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.user.client.rpc.AsyncCallback;
public class AsyncActionsExecutor {
private AsyncAction<?> lastRequestedAction;
private int numPending;
private int numPendingCalls;
private final int maxPendingCalls;
private final int maxPendingCallsPerType;
private Map<String, Integer> actionsPerType;
public AsyncActionsExecutor() {
numPending = 0;
maxPendingCalls = 5;
numPendingCalls = 0;
maxPendingCalls = 6;
maxPendingCallsPerType = 3;
lastRequestedAction = null;
actionsPerType = new HashMap<String, Integer>();
}
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());
// 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")
@Override
public void onFailure(Throwable caught) {
AsyncCallback<Object> callback = (AsyncCallback<Object>) action.getCallback();
callback.onFailure(caught);
numPending--;
finish();
String actionName = action.getName();
GWT.log("Execution failure for action of type: " + actionName);
AsyncCallback<Object> callback = (AsyncCallback<Object>) action.getCallback();
callback.onFailure(caught);
Integer numActionsPerType = actionsPerType.get(actionName);
if(numActionsPerType != null && numActionsPerType > 0)
actionsPerType.put(actionName, numActionsPerType-1);
numPendingCalls--;
checkForEmptyCallQueue();
}
@SuppressWarnings("unchecked")
@Override
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();
callback.onSuccess(result);
numPending--;
finish();
Integer numActionsPerType = actionsPerType.get(actionName);
if(numActionsPerType != null && numActionsPerType > 0)
actionsPerType.put(actionName, numActionsPerType-1);
numPendingCalls--;
checkForEmptyCallQueue();
}
};
action.setWrapperCallback(wrapper);
action.execute();
numPending++;
if(numActionsOfType == null)
numActionsOfType = 0;
actionsPerType.put(action.getName(), numActionsOfType+1);
numPendingCalls++;
GWT.log("Execute action: " + action.getName());
GWT.log("Pending actions counter: " + numPending);
GWT.log("Pending actions counter: " + numPendingCalls);
}
private void finish() {
if(numPending == 0 && lastRequestedAction != null) {
execute(lastRequestedAction);
private void checkForEmptyCallQueue() {
if(numPendingCalls == 0 && lastRequestedAction != null) {
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 RaceIdentifier raceIdentifier;
private final Date from;
private Date from;
private long millisecondsStepWidth;
private int numberOfFixes;
private Collection<String> windSourceTypeNames;
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;
public GetWindInfoAction(SailingServiceAsync sailingService, RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth,
@@ -29,12 +36,33 @@ public class GetWindInfoAction extends DefaultAsyncAction<WindInfoForRaceDTO>
this.millisecondsStepWidth = millisecondsStepWidth;
this.numberOfFixes = numberOfFixes;
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")
@Override
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
@@ -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.TabPanel;
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.CompetitorSelectionModel;
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);
LeaderboardSettings defaultLeaderboardSettings = LeaderboardSettingsFactory.getInstance()
.createNewDefaultSettings(/* racesToShow */ null, /* namesOfRacesToShow */ null, /* autoExpandFirstRace */false);
final LeaderboardPanel defaultLeaderboardPanel = new LeaderboardPanel(sailingService,
final LeaderboardPanel defaultLeaderboardPanel = new LeaderboardPanel(sailingService, new AsyncActionsExecutor(),
defaultLeaderboardSettings,
/* preSelectedRace */null, new CompetitorSelectionModel(/* hasMultiSelection */true),
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;
public RaceMap(SailingServiceAsync sailingService, ErrorReporter errorReporter, Timer timer,
public RaceMap(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter, Timer timer,
CompetitorSelectionProvider competitorSelection, StringMessages stringMessages) {
this.setSize("100%", "100%");
this.stringMessages = stringMessages;
this.sailingService = sailingService;
this.asyncActionsExecutor = asyncActionsExecutor;
this.errorReporter = errorReporter;
this.timer = timer;
timer.addTimeListener(this);
@@ -227,7 +228,6 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
settings = new RaceMapSettings();
lastTimeChangeBeforeInitialization = null;
dataInitialized = false;
asyncActionsExecutor = new AsyncActionsExecutor();
initializeData();
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.Widget;
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.ErrorReporter;
import com.sap.sailing.gwt.ui.client.EventDisplayer;
@@ -71,7 +72,7 @@ public class RaceMapPanel extends FormPanel implements EventDisplayer, TimeListe
AbsolutePanel mapPanel = new AbsolutePanel();
mapPanel.setSize("100%", "100%");
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);
raceSelectionModel = new RaceSelectionModel();
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.WindSource;
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.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
@@ -462,12 +463,13 @@ public class WindChart extends SimplePanel implements Component<WindChartSetting
if (raceIdentifier == null) {
clearChart();
} else if (needsDataLoading()) {
sailingService.getWindInfo(raceIdentifier,
// 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.
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.
// Consider incremental updates for new data only.
from, to, resolutionInMilliseconds, // use race start and time of newest event as default time period
null, // retrieve data on all wind sources
new AsyncCallback<WindInfoForRaceDTO>() {
null); // retrieve data on all wind sources
getWindInfoAction.setCallback(new AsyncCallback<WindInfoForRaceDTO>() {
@Override
public void onSuccess(WindInfoForRaceDTO result) {
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.impl.Util.Pair;
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.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.DetailTypeFormatter;
@@ -75,6 +77,7 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
protected static final int LINE_WIDTH = 1;
protected MultiCompetitorRaceDataDTO chartData;
protected final SailingServiceAsync sailingService;
protected final AsyncActionsExecutor asyncActionsExecutor;
protected final ErrorReporter errorReporter;
protected Chart chart;
private boolean compactChart;
@@ -94,7 +97,7 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
protected DetailType dataToShow;
protected final CompetitorSelectionProvider competitorSelectionProvider;
public AbstractChartPanel(SailingServiceAsync sailingService,
public AbstractChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider,
Timer timer, final StringMessages stringMessages, ErrorReporter errorReporter, DetailType dataToShow,
boolean compactChart, boolean allowTimeAdjust) {
@@ -110,6 +113,7 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
chartData = null;
this.compactChart = compactChart;
this.sailingService = sailingService;
this.asyncActionsExecutor = asyncActionsExecutor;
this.raceSelectionProvider = raceSelectionProvider;
this.allowTimeAdjust = allowTimeAdjust;
raceSelectionProvider.addRaceSelectionChangeListener(this);
@@ -271,8 +275,9 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
}
}
sailingService.getCompetitorsRaceData(getSelectedRace(), dataQuery, toDate, getStepSize(), getDataToShow(),
new AsyncCallback<MultiCompetitorRaceDataDTO>() {
GetCompetitorsRaceDataAction getCompetitorsRaceDataAction = new GetCompetitorsRaceDataAction(sailingService,
getSelectedRace(), dataQuery, toDate, getStepSize(), getDataToShow());
getCompetitorsRaceDataAction.setCallback(new AsyncCallback<MultiCompetitorRaceDataDTO>() {
@Override
public void onFailure(Throwable caught) {
@@ -296,6 +301,8 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
setWidget(chart);
}
});
asyncActionsExecutor.execute(getCompetitorsRaceDataAction);
} else {
setWidget(noCompetitorsSelectedLabel);
}
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.ui.leaderboard;
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.ErrorReporter;
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 ChartPanel(SailingServiceAsync sailingService, CompetitorSelectionProvider competitorSelectionProvider,
public ChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, CompetitorSelectionProvider competitorSelectionProvider,
RaceSelectionProvider raceSelectionProvider, Timer timer, DetailType dataToShow, StringMessages stringMessages,
ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust) {
super(sailingService, competitorSelectionProvider, raceSelectionProvider, timer, stringMessages, errorReporter,
super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, stringMessages, errorReporter,
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.Widget;
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.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionModel;
@@ -53,7 +54,7 @@ public class CompareCompetitorsChartDialog extends DialogBox {
raceSelectionProvider = new RaceSelectionModel();
raceSelectionProvider.setAllRaces(races);
multiChartPanel = new MultiChartPanel(sailingService, competitorSelectionProvider, raceSelectionProvider,
multiChartPanel = new MultiChartPanel(sailingService, new AsyncActionsExecutor(), competitorSelectionProvider, raceSelectionProvider,
timer, stringConstants, errorReporter, false, false);
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.ScrollPanel;
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.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel;
@@ -61,7 +62,7 @@ public class LeaderboardEntryPoint extends AbstractEntryPoint {
userAgentType, null, timer, logoAndTitlePanel, mainPanel);
mainPanel.add(tvViewPanel);
} else {
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService,
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, new AsyncActionsExecutor(),
LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(null, null, /* autoExpandFirstRace */ false),
/* preSelectedRace */ null, new CompetitorSelectionModel(/* hasMultiSelection */ true),
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,
String leaderboardGroupName, ErrorReporter errorReporter, final StringMessages stringMessages,
final UserAgentTypes userAgentType) {
this(sailingService, settings, /* preSelectedRace */null, competitorSelectionProvider, leaderboardName,
this(sailingService, asyncActionsExecutor, settings, /* preSelectedRace */null, competitorSelectionProvider, 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, String leaderboardName, String leaderboardGroupName,
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);
}
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,
ErrorReporter errorReporter, final StringMessages stringMessages, final UserAgentTypes userAgentType) {
this.sailingService = sailingService;
this.asyncActionsExecutor = asyncActionsExecutor;
this.preSelectedRace = preSelectedRace;
this.competitorSelectionProvider = competitorSelectionProvider;
competitorSelectionProvider.addCompetitorSelectionChangeListener(this);
@@ -881,7 +882,6 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
selectedRaceDetails.addAll(settings.getRaceDetailsToShow());
setAutoExpandFirstRace(settings.isAutoExpandFirstRace());
asyncActionsExecutor = new AsyncActionsExecutor();
this.timer = timer;
timer.addPlayStateListener(this);
timer.addTimeListener(this);
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.ui.leaderboard;
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.ErrorReporter;
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 MultiChartPanel(SailingServiceAsync sailingService, CompetitorSelectionProvider competitorSelectionProvider,
public MultiChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, CompetitorSelectionProvider competitorSelectionProvider,
RaceSelectionProvider raceSelectionProvider, Timer timer, final StringMessages stringMessages,
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);
}
@@ -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.SimplePanel;
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.ErrorReporter;
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);
Timer timer = new Timer(PlayModes.Live, /* delayBetweenAutoAdvancesInMilliseconds */3000l);
timer.play();
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, settings,
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, new AsyncActionsExecutor(), settings,
/* preSelectedRace */null, selectionModel, timer, leaderboardName, null, errorReporter, stringMessages,
userAgentType) {
@Override
@@ -14,6 +14,7 @@ import com.google.gwt.cell.client.SelectionCell;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.rpc.AsyncCallback;
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.ErrorReporter;
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) {
super(sailingService, LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(
super(sailingService, asyncActionsExecutor, LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(
/* racesToShow */ null, /* namesOfRacesToShow */ null, /* autoExpandFirstRace */false),
new CompetitorSelectionModel(/* hasMultiSelection */true),
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.ui.Label;
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.LogoAndTitlePanel;
@@ -20,7 +21,7 @@ public class LeaderboardEditPage extends AbstractEntryPoint {
if (leaderboardNames.contains(leaderboardName)) {
LogoAndTitlePanel logoAndTitlePanel = new LogoAndTitlePanel("", stringMessages);
logoAndTitlePanel.addStyleName("LogoAndTitlePanel");
EditableLeaderboardPanel leaderboardPanel = new EditableLeaderboardPanel(sailingService, leaderboardName, null,
EditableLeaderboardPanel leaderboardPanel = new EditableLeaderboardPanel(sailingService, new AsyncActionsExecutor(), leaderboardName, null,
LeaderboardEditPage.this, stringMessages, userAgentType);
RootPanel.get().add(logoAndTitlePanel);
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.sap.sailing.domain.common.RaceIdentifier;
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.RaceMapSettings;
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
*/
private CollapsableComponentViewer<MultiChartSettings> competitorChartViewer = null;
private final AsyncActionsExecutor asyncActionsExecutor;
public RaceBoardPanel(SailingServiceAsync sailingService, UserDTO theUser, Timer timer,
RaceSelectionProvider theRaceSelectionProvider, String leaderboardName, String leaderboardGroupName,
ErrorReporter errorReporter, final StringMessages stringMessages, UserAgentTypes userAgentType,
@@ -127,6 +130,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
this.errorReporter = errorReporter;
this.userAgentType = userAgentType;
this.viewMode = viewMode;
asyncActionsExecutor = new AsyncActionsExecutor();
FlowPanel mainPanel = new FlowPanel();
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
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));
List<Component<?>> components = new ArrayList<Component<?>>();
competitorChart = new MultiChartPanel(sailingService, competitorSelectionModel, raceSelectionProvider,
competitorChart = new MultiChartPanel(sailingService, asyncActionsExecutor, competitorSelectionModel, raceSelectionProvider,
timer, stringMessages, errorReporter, true, true);
competitorChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
components.add(competitorChart);
@@ -263,7 +267,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
// create the race map
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>(
raceMap, "auto", "500px", stringMessages);
@@ -283,7 +287,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
// CollapsableComponentViewer<ChartSettings> chartViewer = new CollapsableComponentViewer<ChartSettings>(
// competitorCharts, "auto", "400px", stringMessages);
competitorChart = new MultiChartPanel(sailingService, competitorSelectionModel, raceSelectionProvider,
competitorChart = new MultiChartPanel(sailingService, asyncActionsExecutor, competitorSelectionModel, raceSelectionProvider,
timer, stringMessages, errorReporter, false, true);
competitorChartViewer = new CollapsableComponentViewer<MultiChartSettings>(
competitorChart, "auto", "400px", stringMessages);
@@ -303,7 +307,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
.createNewSettingsForPlayMode(timer.getPlayMode(), /* nameOfRaceToSort */
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,
userAgentType);
}