mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-03 02:43:53 +00:00
refactored stopTracking for events and races; several fixes for race table sorting/filtering
This commit is contained in:
1 parent
2bfe7a4853
commit
2bd6d817c6
14 files changed
+172
-149
No files matched your search
+1
-1
@@ -344,7 +344,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removedTrackedRace(TrackedRace trackedRace) {
|
||||
public void removeTrackedRace(TrackedRace trackedRace) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@@ -200,7 +200,7 @@ public interface Leaderboard extends Named {
|
||||
|
||||
boolean hasCarriedPoints(Competitor competitor);
|
||||
|
||||
void removeRaceColumn(String name);
|
||||
void removeRaceColumn(String columnName);
|
||||
|
||||
SettableScoreCorrection getScoreCorrection();
|
||||
|
||||
|
||||
+2
-2
@@ -106,8 +106,8 @@ public class LeaderboardImpl implements Named, Leaderboard {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeRaceColumn(String name) {
|
||||
races.remove(getRaceColumnByName(name));
|
||||
public void removeRaceColumn(String columnName) {
|
||||
races.remove(getRaceColumnByName(columnName));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@ public abstract class AbstractRaceTrackerImpl implements RaceTracker {
|
||||
for (RaceDefinition race : races) {
|
||||
TrackedRace trackedRace = trackedEvent.getExistingTrackedRace(race);
|
||||
if (trackedRace != null) {
|
||||
trackedEvent.removedTrackedRace(trackedRace);
|
||||
trackedEvent.removeTrackedRace(trackedRace);
|
||||
}
|
||||
}
|
||||
if (Util.isEmpty(trackedEvent.getTrackedRaces())) {
|
||||
|
||||
@@ -9,7 +9,7 @@ import com.sap.sailing.domain.base.RaceDefinition;
|
||||
|
||||
public interface RaceTracker {
|
||||
/**
|
||||
* Stops tracking the race and removes the {@link TrackedRace} object one gets from calling
|
||||
* Stops tracking the races and removes the {@link TrackedRace} object one gets from calling
|
||||
* {@link #getTrackedEvent()}.{@link TrackedEvent#getTrackedRace(RaceDefinition) getTrackedRace(}{@link #getRaces() getRaces())}
|
||||
* from the {@link #getTrackedEvent() tracked event}.
|
||||
*/
|
||||
@@ -24,7 +24,6 @@ public interface RaceTracker {
|
||||
*/
|
||||
Set<RaceDefinition> getRaces();
|
||||
|
||||
// TODO this is inconsistent with getRaces() which can return more than one race
|
||||
RacesHandle getRaceHandle();
|
||||
|
||||
DynamicTrackedEvent getTrackedEvent();
|
||||
|
||||
@@ -45,7 +45,7 @@ public interface TrackedEvent {
|
||||
|
||||
void addTrackedRace(TrackedRace trackedRace);
|
||||
|
||||
void removedTrackedRace(TrackedRace trackedRace);
|
||||
void removeTrackedRace(TrackedRace trackedRace);
|
||||
|
||||
/**
|
||||
* Listener will be notified when {@link #addTrackedRace(TrackedRace)} is called and
|
||||
|
||||
+1
-1
@@ -62,7 +62,7 @@ public class TrackedEventImpl implements TrackedEvent {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removedTrackedRace(TrackedRace trackedRace) {
|
||||
public void removeTrackedRace(TrackedRace trackedRace) {
|
||||
synchronized (trackedRaces) {
|
||||
trackedRaces.remove(trackedRace.getRace());
|
||||
Collection<TrackedRace> trbbc = trackedRacesByBoatClass.get(trackedRace.getRace().getBoatClass());
|
||||
|
||||
+17
-39
@@ -126,14 +126,12 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
});
|
||||
filterPanel.add(filterRacesTextbox);
|
||||
mainPanel.add(filterPanel);
|
||||
|
||||
TextColumn<LeaderboardDAO> leaderboardNameColumn = new TextColumn<LeaderboardDAO>() {
|
||||
@Override
|
||||
public String getValue(LeaderboardDAO object) {
|
||||
return object.name;
|
||||
}
|
||||
};
|
||||
|
||||
TextColumn<LeaderboardDAO> discardingOptionsColumn = new TextColumn<LeaderboardDAO>() {
|
||||
@Override
|
||||
public String getValue(LeaderboardDAO leaderboard) {
|
||||
@@ -146,10 +144,8 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
ImagesBarColumn<LeaderboardDAO, LeaderboardConfigImagesBarCell> leaderboardActionColumn = new ImagesBarColumn<LeaderboardDAO, LeaderboardConfigImagesBarCell>(
|
||||
new LeaderboardConfigImagesBarCell(stringConstants));
|
||||
|
||||
leaderboardActionColumn.setFieldUpdater(new FieldUpdater<LeaderboardDAO, String>() {
|
||||
@Override
|
||||
public void update(int index, LeaderboardDAO object, String value) {
|
||||
@@ -160,13 +156,10 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
} else if ("ACTION_OPEN_BROWSER".equals(value)) {
|
||||
Window.open("/Leaderboard.html?name=" + object.name, "Leaderboard", null);
|
||||
} else if ("ACTION_EDIT".equals(value)) {
|
||||
|
||||
final String oldLeaderboardName= object.name;
|
||||
|
||||
List<LeaderboardDAO> otherExistingLeaderboard = new ArrayList<LeaderboardDAO>();
|
||||
otherExistingLeaderboard.addAll(leaderboardList.getList());
|
||||
otherExistingLeaderboard.remove(object);
|
||||
|
||||
LeaderboardEditDialog dialog = new LeaderboardEditDialog(Collections.unmodifiableCollection(otherExistingLeaderboard), object, stringConstants, errorReporter,
|
||||
new AsyncCallback<LeaderboardDAO>() {
|
||||
@Override
|
||||
@@ -184,7 +177,6 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
|
||||
leaderboardTable = new CellTable<LeaderboardDAO>(/* pageSize */200, tableRes);
|
||||
leaderboardTable.addColumn(leaderboardNameColumn, "Name");
|
||||
@@ -193,22 +185,17 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
leaderboardTable.setWidth("500px");
|
||||
tableSelectionModel = new SingleSelectionModel<LeaderboardDAO>();
|
||||
leaderboardTable.setSelectionModel(tableSelectionModel);
|
||||
|
||||
tableSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
selectedLeaderboard = tableSelectionModel.getSelectedObject();
|
||||
leaderboardSelectionChanged();
|
||||
}
|
||||
});
|
||||
|
||||
leaderboardList.addDataDisplay(leaderboardTable);
|
||||
|
||||
mainPanel.add(leaderboardTable);
|
||||
|
||||
HorizontalPanel leaderboardButtonPanel = new HorizontalPanel();
|
||||
leaderboardButtonPanel.setSpacing(5);
|
||||
mainPanel.add(leaderboardButtonPanel);
|
||||
|
||||
Button btnNew = new Button("Create Leaderboard..");
|
||||
leaderboardButtonPanel.add(btnNew);
|
||||
btnNew.addClickHandler(new ClickHandler() {
|
||||
@@ -245,6 +232,7 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
stringConstants, /* multiselection */false);
|
||||
trackedRacesPanel.add(trackedEventsComposite);
|
||||
trackedEventsComposite.addTrackedRaceChangeListener(this);
|
||||
trackedEventsComposite.addRaceSelectionChangeListener(this);
|
||||
|
||||
HorizontalPanel hPanel = new HorizontalPanel();
|
||||
hPanel.setSpacing(5);
|
||||
@@ -301,7 +289,7 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
removeRaceColumn(object);
|
||||
}
|
||||
} else if ("ACTION_EDIT".equals(value)) {
|
||||
editRaceColumnOfLeaderboard();
|
||||
editRaceColumnOfLeaderboard(object);
|
||||
} else if ("ACTION_UNLINK".equals(value)) {
|
||||
unlinkRaceColumnFromTrackedRace(object.getRaceColumnName());
|
||||
}
|
||||
@@ -502,7 +490,6 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
}
|
||||
|
||||
private void leaderboardRaceColumnSelectionChanged() {
|
||||
//String selectedRaceColumnName = getSelectedRaceInLeaderboard().getRaceColumnName();
|
||||
selectedRaceInLeaderboard = getSelectedRaceInLeaderboard();
|
||||
if (selectedRaceInLeaderboard != null) {
|
||||
columnMoveUpButton.setEnabled(true);
|
||||
@@ -544,26 +531,17 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
}
|
||||
|
||||
private RaceInLeaderboardDAO getSelectedRaceInLeaderboard() {
|
||||
// TODO change to race in leaderboard
|
||||
RaceInLeaderboardDAO raceInLeaderboard = raceTableSelectionModel.getSelectedObject();
|
||||
if (raceInLeaderboard == null) {
|
||||
RaceInLeaderboardDAO dao = new RaceInLeaderboardDAO();
|
||||
dao.setRaceColumnName(null);
|
||||
return dao;
|
||||
} else {
|
||||
return raceInLeaderboard;
|
||||
}
|
||||
return raceInLeaderboard;
|
||||
}
|
||||
|
||||
private void editRaceColumnOfLeaderboard() {
|
||||
final RaceInLeaderboardDAO raceInLeaderboard = getSelectedRaceInLeaderboard();
|
||||
private void editRaceColumnOfLeaderboard(final RaceInLeaderboardDAO raceInLeaderboard) {
|
||||
final String oldRaceName = raceInLeaderboard.getRaceColumnName();
|
||||
List<RaceInLeaderboardDAO> existingRacesWithoutThisRace = new ArrayList<RaceInLeaderboardDAO>();
|
||||
existingRacesWithoutThisRace.addAll(raceColumnList.getList());
|
||||
existingRacesWithoutThisRace.remove(raceInLeaderboard);
|
||||
final RaceInLeaderboardDialog raceDialog = new RaceInLeaderboardDialog(existingRacesWithoutThisRace, raceInLeaderboard, stringConstants,
|
||||
new AsyncCallback<RaceInLeaderboardDAO>() {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
}
|
||||
@@ -589,8 +567,7 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
|
||||
@Override
|
||||
public void onSuccess(Void v) {
|
||||
getSelectedRaceInLeaderboard().setMedalRace(
|
||||
result.isMedalRace());
|
||||
raceInLeaderboard.setMedalRace(result.isMedalRace());
|
||||
reloadRaceInLeaderboardRow(oldRaceName, result);
|
||||
}
|
||||
});
|
||||
@@ -826,34 +803,35 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
|
||||
@Override
|
||||
public void onRaceSelectionChange(List<Triple<EventDAO, RegattaDAO, RaceDAO>> selectedRaces) {
|
||||
if (selectedRaces.isEmpty()) {
|
||||
// unlinkRaceColumnFromTrackedRaceButton.setEnabled(false);
|
||||
} else {
|
||||
if (getSelectedRaceInLeaderboard() != null) {
|
||||
linkTrackedRaceForRaceColumn(selectedRaces.iterator().next());
|
||||
// if no leaderboard column is selected, ignore the race selection change
|
||||
RaceInLeaderboardDAO selectedRaceInLeaderboard = getSelectedRaceInLeaderboard();
|
||||
if (selectedRaceInLeaderboard != null) {
|
||||
if (selectedRaces.isEmpty()) {
|
||||
unlinkRaceColumnFromTrackedRace(selectedRaceInLeaderboard.getRaceColumnName());
|
||||
} else {
|
||||
// unlinkRaceColumnFromTrackedRaceButton.setEnabled(false);
|
||||
linkTrackedRaceToSelectedRaceColumn(selectedRaceInLeaderboard, selectedRaces.iterator().next());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void linkTrackedRaceForRaceColumn(final Triple<EventDAO, RegattaDAO, RaceDAO> selectedRace) {
|
||||
private void linkTrackedRaceToSelectedRaceColumn(final RaceInLeaderboardDAO selectedRaceInLeaderboard,
|
||||
final Triple<EventDAO, RegattaDAO, RaceDAO> selectedRace) {
|
||||
sailingService.connectTrackedRaceToLeaderboardColumn(getSelectedLeaderboardName(),
|
||||
getSelectedRaceInLeaderboard().getRaceColumnName(), new EventNameAndRaceName(selectedRace.getA().name,
|
||||
selectedRaceInLeaderboard.getRaceColumnName(), new EventNameAndRaceName(selectedRace.getA().name,
|
||||
selectedRace.getC().name), new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onFailure(Throwable t) {
|
||||
errorReporter.reportError("Error trying to link tracked race " + selectedRace.getC().name
|
||||
+ " of event " + selectedRace.getA().name + " to race column named "
|
||||
+ getSelectedRaceInLeaderboard() + " of leaderboard " + getSelectedLeaderboardName()
|
||||
+ selectedRaceInLeaderboard.getRaceColumnName() + " of leaderboard " + getSelectedLeaderboardName()
|
||||
+ ": " + t.getMessage());
|
||||
trackedEventsComposite.clearSelection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Void arg0) {
|
||||
// unlinkRaceColumnFromTrackedRaceButton.setEnabled(true);
|
||||
getSelectedRaceInLeaderboard().setTrackedRace(true);
|
||||
// TODO consider disabling the Unlink button
|
||||
selectedRaceInLeaderboard.setTrackedRace(true);
|
||||
raceColumnList.refresh();
|
||||
}
|
||||
});
|
||||
|
||||
+5
@@ -8,7 +8,12 @@ import com.sap.sailing.gwt.ui.shared.RegattaDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.Triple;
|
||||
|
||||
public interface RaceSelectionProvider {
|
||||
/**
|
||||
* @return a non-<code>null</code> list which may be empty
|
||||
*/
|
||||
List<Triple<EventDAO, RegattaDAO, RaceDAO>> getSelectedEventAndRace();
|
||||
|
||||
void addRaceSelectionChangeListener(RaceSelectionChangeListener listener);
|
||||
|
||||
void removeRaceSelectionChangeListener(RaceSelectionChangeListener listener);
|
||||
}
|
||||
+2
-3
@@ -74,13 +74,14 @@ public class TracTracEventManagementPanel extends FormPanel implements EventDisp
|
||||
private final EventRefresher eventRefresher;
|
||||
private DateTimeFormatRenderer dateFormatter = new DateTimeFormatRenderer(DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT));
|
||||
private DateTimeFormatRenderer timeFormatter = new DateTimeFormatRenderer(DateTimeFormat.getFormat(PredefinedFormat.TIME_LONG));
|
||||
private final List<TracTracRaceRecordDAO> availableTracTracRaces = new ArrayList<TracTracRaceRecordDAO>();
|
||||
private final List<TracTracRaceRecordDAO> availableTracTracRaces;
|
||||
|
||||
public TracTracEventManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter,
|
||||
EventRefresher eventRefresher, StringConstants stringConstants) {
|
||||
this.sailingService = sailingService;
|
||||
this.errorReporter = errorReporter;
|
||||
this.eventRefresher = eventRefresher;
|
||||
availableTracTracRaces = new ArrayList<TracTracRaceRecordDAO>();
|
||||
|
||||
VerticalPanel mainPanel = new VerticalPanel();
|
||||
this.setWidget(mainPanel);
|
||||
@@ -291,9 +292,7 @@ public class TracTracEventManagementPanel extends FormPanel implements EventDisp
|
||||
@Override
|
||||
public void onKeyUp(KeyUpEvent event) {
|
||||
String text = filterEventsTextbox.getText();
|
||||
|
||||
raceList.getList().clear();
|
||||
|
||||
if(text == null || text.isEmpty()) {
|
||||
raceList.getList().addAll(availableTracTracRaces);
|
||||
} else {
|
||||
|
||||
+40
-59
@@ -17,6 +17,7 @@ import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
|
||||
import com.google.gwt.text.client.DateTimeFormatRenderer;
|
||||
import com.google.gwt.user.cellview.client.CellTable;
|
||||
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
|
||||
import com.google.gwt.user.cellview.client.ColumnSortEvent;
|
||||
import com.google.gwt.user.cellview.client.ColumnSortList;
|
||||
import com.google.gwt.user.cellview.client.TextColumn;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
@@ -39,6 +40,9 @@ import com.sap.sailing.gwt.ui.shared.RegattaDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.Triple;
|
||||
import com.sap.sailing.server.api.EventNameAndRaceName;
|
||||
|
||||
/**
|
||||
* Shows the
|
||||
*/
|
||||
public class TrackedEventsComposite extends FormPanel implements EventDisplayer, RaceSelectionProvider {
|
||||
private final Set<RaceSelectionChangeListener> raceSelectionChangeListeners;
|
||||
|
||||
@@ -79,6 +83,9 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
|
||||
public TrackedEventsComposite(final SailingServiceAsync sailingService, final ErrorReporter errorReporter,
|
||||
final EventRefresher eventRefresher, StringConstants stringConstants, boolean hasMultiSelection) {
|
||||
if (eventRefresher == null) {
|
||||
throw new IllegalArgumentException("eventRefresher must not be null");
|
||||
}
|
||||
this.sailingService = sailingService;
|
||||
this.errorReporter = errorReporter;
|
||||
this.eventRefresher = eventRefresher;
|
||||
@@ -86,17 +93,12 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
this.raceSelectionChangeListeners = new HashSet<RaceSelectionChangeListener>();
|
||||
this.raceIsTrackedRaceChangeListener = new HashSet<TrackedRaceChangedListener>();
|
||||
this.availableRaceList = new ArrayList<Triple<EventDAO, RegattaDAO, RaceDAO>>();
|
||||
|
||||
this.lastSelectedTriple = null;
|
||||
|
||||
raceList = new ListDataProvider<Triple<EventDAO, RegattaDAO, RaceDAO>>();
|
||||
|
||||
selectionModel = multiSelection ? new MultiSelectionModel<Triple<EventDAO, RegattaDAO, RaceDAO>>()
|
||||
: new SingleSelectionModel<Triple<EventDAO, RegattaDAO, RaceDAO>>();
|
||||
|
||||
panel = new VerticalPanel();
|
||||
setWidget(panel);
|
||||
|
||||
HorizontalPanel filterPanel = new HorizontalPanel();
|
||||
panel.add(filterPanel);
|
||||
Label lblFilterEvents = new Label(stringConstants.filterRacesByName() + ":");
|
||||
@@ -105,34 +107,9 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
filterPanel.setCellVerticalAlignment(lblFilterEvents, HasVerticalAlignment.ALIGN_MIDDLE);
|
||||
filterRacesTextbox = new TextBox();
|
||||
filterRacesTextbox.addKeyUpHandler(new KeyUpHandler() {
|
||||
|
||||
private List<Triple<EventDAO, RegattaDAO, RaceDAO>> racesToHold;
|
||||
|
||||
@Override
|
||||
public void onKeyUp(KeyUpEvent event) {
|
||||
String text = filterRacesTextbox.getText();
|
||||
List<String> wordsToFilter = Arrays.asList(text.split(" "));
|
||||
raceList.getList().clear();
|
||||
raceList.getList().addAll(availableRaceList);
|
||||
racesToHold = new ArrayList<Triple<EventDAO, RegattaDAO, RaceDAO>>();
|
||||
if (text == null || text.isEmpty()) {
|
||||
racesToHold.addAll(availableRaceList);
|
||||
} else {
|
||||
for (String word : wordsToFilter) {
|
||||
// TODO improve search algorithm
|
||||
String textAsUppercase = word.toUpperCase();
|
||||
racesToHold = new ArrayList<Triple<EventDAO, RegattaDAO, RaceDAO>>();
|
||||
for (Triple<EventDAO, RegattaDAO, RaceDAO> triple : raceList.getList()) {
|
||||
if (triple.getA().name.toUpperCase().contains(textAsUppercase)
|
||||
|| triple.getB().boatClass.name.toUpperCase().contains(textAsUppercase)
|
||||
|| triple.getC().name.toUpperCase().contains(textAsUppercase)) {
|
||||
racesToHold.add(triple);
|
||||
}
|
||||
}
|
||||
raceList.setList(racesToHold);
|
||||
}
|
||||
}
|
||||
raceList.setList(racesToHold);
|
||||
fillRaceListFromAvailableRacesApplyingFilter();
|
||||
}
|
||||
});
|
||||
filterPanel.add(filterRacesTextbox);
|
||||
@@ -143,12 +120,9 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
|
||||
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
|
||||
raceTable = new CellTable<Triple<EventDAO, RegattaDAO, RaceDAO>>(/* pageSize */200, tableRes);
|
||||
|
||||
ListHandler<Triple<EventDAO, RegattaDAO, RaceDAO>> columnSortHandler = new ListHandler<Triple<EventDAO, RegattaDAO, RaceDAO>>(
|
||||
raceList.getList());
|
||||
|
||||
TextColumn<Triple<EventDAO, RegattaDAO, RaceDAO>> eventNameColumn = new TextColumn<Triple<EventDAO, RegattaDAO, RaceDAO>>() {
|
||||
|
||||
@Override
|
||||
public String getValue(Triple<EventDAO, RegattaDAO, RaceDAO> object) {
|
||||
return object.getA().name;
|
||||
@@ -284,19 +258,15 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
raceTable.addColumn(raceTrackedColumn, "Tracked");
|
||||
raceTable.setWidth("300px");
|
||||
raceTable.setSelectionModel(selectionModel);
|
||||
|
||||
raceTable.setVisible(false);
|
||||
panel.add(raceTable);
|
||||
|
||||
raceList.addDataDisplay(raceTable);
|
||||
|
||||
raceTable.addColumnSortHandler(columnSortHandler);
|
||||
|
||||
raceTable.getSelectionModel().addSelectionChangeHandler(new Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
List<Triple<EventDAO, RegattaDAO, RaceDAO>> selectedEventAndRace = getSelectedEventAndRace();
|
||||
if (selectedEventAndRace == null) {
|
||||
if (selectedEventAndRace.isEmpty()) {
|
||||
lastSelectedTriple = null;
|
||||
btnRemoveRace.setEnabled(false);
|
||||
btnUntrack.setEnabled(false);
|
||||
@@ -308,15 +278,11 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
fireRaceSelectionChanged(selectedEventAndRace);
|
||||
}
|
||||
});
|
||||
|
||||
HorizontalPanel trackedRacesButtonPanel = new HorizontalPanel();
|
||||
|
||||
trackedRacesButtonPanel.setSpacing(10);
|
||||
panel.add(trackedRacesButtonPanel);
|
||||
|
||||
btnRemoveRace = new Button(stringConstants.remove());
|
||||
btnRemoveRace.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
for (Triple<EventDAO, RegattaDAO, RaceDAO> selection : getSelectedEventAndRace()) {
|
||||
@@ -326,7 +292,6 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
});
|
||||
btnRemoveRace.setEnabled(false);
|
||||
trackedRacesButtonPanel.add(btnRemoveRace);
|
||||
|
||||
btnUntrack = new Button("Stop tracking");
|
||||
// btnRemove = new Button(stringConstants.remove());
|
||||
btnUntrack.addClickHandler(new ClickHandler() {
|
||||
@@ -356,7 +321,6 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
@Override
|
||||
public List<Triple<EventDAO, RegattaDAO, RaceDAO>> getSelectedEventAndRace() {
|
||||
List<Triple<EventDAO, RegattaDAO, RaceDAO>> result = new ArrayList<Triple<EventDAO, RegattaDAO, RaceDAO>>();
|
||||
|
||||
if (raceList != null) {
|
||||
for (Triple<EventDAO, RegattaDAO, RaceDAO> raceTriple : raceList.getList()) {
|
||||
if (selectionModel.isSelected(raceTriple)) {
|
||||
@@ -412,27 +376,18 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
|
||||
@Override
|
||||
public void fillEvents(List<EventDAO> events) {
|
||||
if (events.size() == 0) {
|
||||
if (events.isEmpty()) {
|
||||
raceTable.setVisible(false);
|
||||
btnUntrack.setEnabled(false);
|
||||
btnRemoveRace.setEnabled(false);
|
||||
noTrackedRacesLabel.setVisible(true);
|
||||
} else {
|
||||
raceTable.setVisible(true);
|
||||
if (eventRefresher != null) {
|
||||
btnUntrack.setEnabled(true);
|
||||
btnRemoveRace.setEnabled(true);
|
||||
}
|
||||
btnUntrack.setEnabled(true);
|
||||
btnRemoveRace.setEnabled(true);
|
||||
noTrackedRacesLabel.setVisible(false);
|
||||
}
|
||||
|
||||
raceList.getList().clear();
|
||||
availableRaceList.clear();
|
||||
|
||||
// Handler columnSortHandler = getRaceTableColumnSortHandler(raceList.getList(), raceNameColumn,
|
||||
// raceStartTrackingColumn);
|
||||
// raceTable.addColumnSortHandler(columnSortHandler);
|
||||
|
||||
for (EventDAO event : events) {
|
||||
for (RegattaDAO regatta : event.regattas) {
|
||||
for (RaceDAO race : regatta.races) {
|
||||
@@ -441,10 +396,10 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
if (race != null) {
|
||||
availableRaceList.add(triple);
|
||||
}
|
||||
raceList.getList().add(triple);
|
||||
}
|
||||
}
|
||||
}
|
||||
fillRaceListFromAvailableRacesApplyingFilter();
|
||||
if (lastSelectedTriple != null) {
|
||||
selectRaceByName(lastSelectedTriple.getA().name, lastSelectedTriple.getC().name);
|
||||
}
|
||||
@@ -476,7 +431,6 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
private void removeAndUntrackRace(final EventDAO event, final RaceDAO race) {
|
||||
sailingService.removeAndUntrackedRace(new EventNameAndRaceName(event.name, race.name),
|
||||
new AsyncCallback<Void>() {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Exception trying to stop tracking race " + race.name + "in event "
|
||||
@@ -490,4 +444,31 @@ public class TrackedEventsComposite extends FormPanel implements EventDisplayer,
|
||||
});
|
||||
}
|
||||
|
||||
private void fillRaceListFromAvailableRacesApplyingFilter() {
|
||||
String text = filterRacesTextbox.getText();
|
||||
List<String> wordsToFilter = Arrays.asList(text.split(" "));
|
||||
raceList.getList().clear();
|
||||
if (text != null && !text.isEmpty()) {
|
||||
for (Triple<EventDAO, RegattaDAO, RaceDAO> triple : availableRaceList) {
|
||||
boolean failed = false;
|
||||
for (String word : wordsToFilter) {
|
||||
String textAsUppercase = word.toUpperCase().trim();
|
||||
if (!triple.getA().name.toUpperCase().contains(textAsUppercase)
|
||||
&& !triple.getB().boatClass.name.toUpperCase().contains(textAsUppercase)
|
||||
&& !triple.getC().name.toUpperCase().contains(textAsUppercase)) {
|
||||
failed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!failed) {
|
||||
raceList.getList().add(triple);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
raceList.getList().addAll(availableRaceList);
|
||||
}
|
||||
// now sort again according to selected criterion
|
||||
ColumnSortEvent.fire(raceTable, raceTable.getColumnSortList());
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -474,7 +474,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
if(event!= null){
|
||||
RaceDefinition race = getRace(eventAndRaceidentifier);
|
||||
if(race != null){
|
||||
getService().stopRemoveTrackedRace(event, race);
|
||||
getService().removeRace(event, race);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,9 @@ import java.util.Map;
|
||||
import com.sap.sailing.domain.base.Event;
|
||||
import com.sap.sailing.domain.base.RaceDefinition;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
|
||||
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
|
||||
import com.sap.sailing.domain.tracking.RaceTracker;
|
||||
import com.sap.sailing.domain.tracking.RacesHandle;
|
||||
import com.sap.sailing.domain.tracking.TrackedEvent;
|
||||
import com.sap.sailing.domain.tracking.TrackedEventRegistry;
|
||||
@@ -104,19 +106,33 @@ public interface RacingEventService extends TrackedEventRegistry {
|
||||
void stopTracking(Event event) throws MalformedURLException, IOException, InterruptedException;
|
||||
|
||||
/**
|
||||
* Stops the race to non-tracked. Removes the race from whole RacingEventService. The race will be also removed from all leaderboards, containing that race.
|
||||
* @param event the event to remove
|
||||
* @param race the race to remove
|
||||
* @throws MalformedURLException
|
||||
* @throws IOException
|
||||
* @throws InterruptedException
|
||||
* Removes <code>race</code> and any corresponding {@link #getTrackedRace(Event, RaceDefinition) tracked race} from
|
||||
* this service. If it was the last {@link RaceDefinition} in its {@link Event}, the <code>event</code> is removed
|
||||
* as well and will no longer be returned by {@link #getAllEvents()}. The wind tracking is stopped for
|
||||
* <code>race</code>.
|
||||
* <p>
|
||||
*
|
||||
* Any {@link RaceTracker} for which <code>race</race> is the last race tracked that is still reachable
|
||||
* from {@link #getAllEvents()} will be {@link RaceTracker#stop() stopped}.
|
||||
*
|
||||
* The <code>race</code> will be also removed from all leaderboards containing a column that has <code>race</code>'s
|
||||
* {@link #getTrackedRace(Event, RaceDefinition) corresponding} {@link TrackedRace} as its
|
||||
* {@link RaceInLeaderboard#getTrackedRace()}.
|
||||
*
|
||||
* @param event
|
||||
* the event to remove
|
||||
* @param race
|
||||
* the race to remove
|
||||
*/
|
||||
void stopRemoveTrackedRace(Event event, RaceDefinition race) throws MalformedURLException, IOException,InterruptedException;
|
||||
void removeRace(Event event, RaceDefinition race) throws MalformedURLException, IOException,InterruptedException;
|
||||
|
||||
/**
|
||||
* Stops tracking a single race. Other races of the same event that are currently tracked will continue to be
|
||||
* tracked. If wind tracking for the race is currently running, it will be stopped (see also
|
||||
* {@link #stopTrackingWind(Event, RaceDefinition)}).
|
||||
* Stops all {@link RaceTracker}s currently tracking <code>race</code>. Note that if the same tracker also may have
|
||||
* been tracking other races. Other races of the same event that are currently tracked will continue to be tracked.
|
||||
* If wind tracking for the race is currently running, it will be stopped (see also
|
||||
* {@link #stopTrackingWind(Event, RaceDefinition)}). The <code>race</code> (and the other races tracked by the
|
||||
* same tracker) as well as the corresponding {@link TrackedRace}s will continue to exist, e.g., when asking
|
||||
* {@link #getTrackedRace(Event, RaceDefinition)}.
|
||||
*/
|
||||
void stopTracking(Event event, RaceDefinition race) throws MalformedURLException, IOException, InterruptedException;
|
||||
|
||||
@@ -197,4 +213,6 @@ public interface RacingEventService extends TrackedEventRegistry {
|
||||
|
||||
void storeSwissTimingDummyRace(String racMessage, String stlMesssage, String ccgMessage) throws IllegalArgumentException;
|
||||
|
||||
void stopTrackingAndRemove(Event event) throws MalformedURLException, IOException, InterruptedException;
|
||||
|
||||
}
|
||||
+71
-28
@@ -29,6 +29,7 @@ import com.sap.sailing.domain.base.Event;
|
||||
import com.sap.sailing.domain.base.RaceDefinition;
|
||||
import com.sap.sailing.domain.base.TimePoint;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.impl.LeaderboardImpl;
|
||||
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
|
||||
import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl;
|
||||
@@ -43,6 +44,7 @@ import com.sap.sailing.domain.tracking.DynamicTrackedEvent;
|
||||
import com.sap.sailing.domain.tracking.RaceListener;
|
||||
import com.sap.sailing.domain.tracking.RaceTracker;
|
||||
import com.sap.sailing.domain.tracking.RacesHandle;
|
||||
import com.sap.sailing.domain.tracking.TrackedEvent;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sailing.domain.tracking.WindStore;
|
||||
import com.sap.sailing.domain.tracking.WindTracker;
|
||||
@@ -54,6 +56,7 @@ import com.sap.sailing.domain.tractracadapter.RaceRecord;
|
||||
import com.sap.sailing.domain.tractracadapter.Receiver;
|
||||
import com.sap.sailing.expeditionconnector.ExpeditionWindTrackerFactory;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sailing.util.Util;
|
||||
import com.sap.sailing.util.Util.Pair;
|
||||
import com.sap.sailing.util.Util.Triple;
|
||||
|
||||
@@ -358,6 +361,11 @@ public class RacingEventServiceImpl implements RacingEventService {
|
||||
}
|
||||
raceTrackersByEvent.remove(event);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void stopTrackingAndRemove(Event event) throws MalformedURLException, IOException, InterruptedException {
|
||||
stopTracking(event);
|
||||
if (event != null) {
|
||||
if (event.getName() != null) {
|
||||
eventsByName.remove(event.getName());
|
||||
@@ -415,7 +423,7 @@ public class RacingEventServiceImpl implements RacingEventService {
|
||||
while (trackerIter.hasNext()) {
|
||||
RaceTracker raceTracker = trackerIter.next();
|
||||
if (raceTracker.getRaces() != null && raceTracker.getRaces().contains(race)) {
|
||||
System.out.println("Found tracker to stop...");
|
||||
logger.info("Found tracker to stop for races "+raceTracker.getRaces());
|
||||
raceTracker.stop(); // this also removes the TrackedRace from trackedEvent
|
||||
// do not remove the tracker from raceTrackersByEvent, because it should still exist there, but with the state "non-tracked"
|
||||
trackerIter.remove();
|
||||
@@ -433,41 +441,72 @@ public class RacingEventServiceImpl implements RacingEventService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void stopRemoveTrackedRace(Event event, RaceDefinition race) throws MalformedURLException, IOException, InterruptedException{
|
||||
public synchronized void removeRace(Event event, RaceDefinition race) throws MalformedURLException,
|
||||
IOException, InterruptedException {
|
||||
logger.info("Removing the race + " + race + "...");
|
||||
if(raceTrackersByEvent.containsKey(event)){
|
||||
|
||||
stopAllTrackersForWhichRaceIsLastReachable(event, race);
|
||||
stopTrackingWind(event, race);
|
||||
TrackedRace trackedRace = getExistingTrackedRace(event, race);
|
||||
if (trackedRace != null) {
|
||||
TrackedEvent trackedEvent = getTrackedEvent(event);
|
||||
if (trackedEvent != null) {
|
||||
trackedEvent.removeTrackedRace(trackedRace);
|
||||
}
|
||||
for (Leaderboard leaderboard : getLeaderboards().values()) {
|
||||
boolean changed = false;
|
||||
for (RaceInLeaderboard raceColumn : leaderboard.getRaceColumns()) {
|
||||
if (raceColumn.getTrackedRace() == trackedRace) {
|
||||
raceColumn.setTrackedRace(null);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
if (changed) {
|
||||
updateStoredLeaderboard(leaderboard);
|
||||
}
|
||||
}
|
||||
}
|
||||
// remove the race from the event
|
||||
if (eventsByName.containsKey(event.getName())) {
|
||||
eventsByName.get(event.getName()).removeRace(race);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Doesn't stop any wind trackers
|
||||
*/
|
||||
private void stopAllTrackersForWhichRaceIsLastReachable(Event event, RaceDefinition race)
|
||||
throws MalformedURLException, IOException, InterruptedException {
|
||||
if (raceTrackersByEvent.containsKey(event)) {
|
||||
Iterator<RaceTracker> trackerIter = raceTrackersByEvent.get(event).iterator();
|
||||
while(trackerIter.hasNext()){
|
||||
while (trackerIter.hasNext()) {
|
||||
RaceTracker raceTracker = trackerIter.next();
|
||||
if(raceTracker.getRaces() != null && raceTracker.getRaces().contains(race)){
|
||||
System.out.println("Found tracker to remove");
|
||||
// firstly stop the tracker
|
||||
raceTracker.stop();
|
||||
// remove it from the raceTrackers by Event
|
||||
trackerIter.remove();
|
||||
raceTrackersByID.remove(raceTracker.getID());
|
||||
for (RaceDefinition trackerRace : raceTracker.getRaces()) {
|
||||
// remove from every leaderboard
|
||||
Map<String, Leaderboard> leaderboards = getLeaderboards();
|
||||
for (Map.Entry<String, Leaderboard> entry : leaderboards.entrySet()) {
|
||||
if(entry.getValue().getRaceColumnByName(race.getName()) != null){
|
||||
getLeaderboardByName(entry.getKey()).removeRaceColumn(trackerRace.getName());
|
||||
}
|
||||
if (raceTracker.getRaces() != null && raceTracker.getRaces().contains(race)) {
|
||||
boolean foundReachableRace = false;
|
||||
for (RaceDefinition raceTrackedByTracker : raceTracker.getRaces()) {
|
||||
if (raceTrackedByTracker != race && isReachable(event, raceTrackedByTracker)) {
|
||||
foundReachableRace = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!foundReachableRace) {
|
||||
// firstly stop the tracker
|
||||
raceTracker.stop();
|
||||
// remove it from the raceTrackers by Event
|
||||
trackerIter.remove();
|
||||
raceTrackersByID.remove(raceTracker.getID());
|
||||
// if the last tracked race was removed, remove the entire event
|
||||
if (raceTrackersByEvent.get(event).isEmpty()) {
|
||||
stopTracking(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// remove the race from the event
|
||||
if(eventsByName.containsKey(event.getName())){
|
||||
eventsByName.get(event.getName()).removeRace(race);
|
||||
}
|
||||
|
||||
stopTrackingWind(event, race);
|
||||
// if the last tracked race was removed, remove the entire event
|
||||
if (raceTrackersByEvent.get(event).isEmpty()) {
|
||||
stopTracking(event);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isReachable(Event event, RaceDefinition race) {
|
||||
return Util.contains(event.getAllRaces(), race);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -503,6 +542,10 @@ public class RacingEventServiceImpl implements RacingEventService {
|
||||
return getOrCreateTrackedEvent(e).getTrackedRace(r);
|
||||
}
|
||||
|
||||
private TrackedRace getExistingTrackedRace(Event e, RaceDefinition r) {
|
||||
return getOrCreateTrackedEvent(e).getExistingTrackedRace(r);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DynamicTrackedEvent getOrCreateTrackedEvent(Event event) {
|
||||
synchronized (eventTrackingCache) {
|
||||
|
||||
Reference in new issue
Block a user