removed raw message store for SwissTiming; added StressTest button for leaderboard logic

This commit is contained in:
Axel Uhl
2011-11-22 17:20:05 +01:00
parent a102acc9cd
commit 8260d88794
11 changed files with 87 additions and 42 deletions
@@ -38,8 +38,6 @@ public interface SwissTimingAdapterPersistence extends RaceSpecificMessageLoader
void storeSwissTimingConfiguration(SwissTimingConfiguration swissTimingConfiguration);
void storeRawSailMasterMessage(SailMasterMessage message);
void storeSailMasterMessage(SailMasterMessage message);
void storeRace(Race race);
@@ -1,6 +1,6 @@
package com.sap.sailing.domain.swisstimingadapter.persistence.impl;
public enum CollectionNames {
SWISSTIMING_CONFIGURATIONS, LAST_MESSAGE_COUNT, RAW_MESSAGES,
SWISSTIMING_CONFIGURATIONS, LAST_MESSAGE_COUNT,
RACES_MASTERDATA, RACES_MESSAGES, COMMAND_MESSAGES
}
@@ -40,9 +40,6 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
}
private void init() {
DBCollection rawMessages = database.getCollection(CollectionNames.RAW_MESSAGES.name());
rawMessages.ensureIndex(new BasicDBObject().append(FieldNames.MESSAGE_SEQUENCE_NUMBER.name(), 1));
// ensure the required indexes for the collection of race specific messages
DBCollection racesMessageCollection = database.getCollection(CollectionNames.RACES_MESSAGES.name());
@@ -184,13 +181,6 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
stConfigCollection.insert(result);
}
@Override
public void storeRawSailMasterMessage(SailMasterMessage message) {
DBCollection rawMessageCollection = database.getCollection(CollectionNames.RAW_MESSAGES.name());
rawMessageCollection.insert(new BasicDBObject().append(FieldNames.MESSAGE_SEQUENCE_NUMBER.name(), message.getSequenceNumber()).
append(FieldNames.MESSAGE_CONTENT.name(), message.getMessage()));
}
@Override
public void storeSailMasterMessage(SailMasterMessage message) {
// Attention: this method is very time critical as we will receive thousands of messages in a short time
@@ -264,13 +254,8 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
@Override
public void dropAllMessageData() {
DBCollection rawMessageCollection = database.getCollection(CollectionNames.RAW_MESSAGES.name());
rawMessageCollection.drop();
DBCollection racesMessageCollection = database.getCollection(CollectionNames.RACES_MESSAGES.name());
racesMessageCollection.drop();
DBCollection cmdMessageCollection = database.getCollection(CollectionNames.COMMAND_MESSAGES.name());
cmdMessageCollection.drop();
}
@@ -34,10 +34,14 @@ public interface SwissTimingFactory {
* {@link SailMasterConnector#trackRace} and {@link SailMasterConnector#stopTrackingRace} operations.
* {@link MessageType#isRaceSpecific() Race-specific messages} for other races are ignored and not forwarded to any
* listener.
* @param canSendRequests TODO
*
* @param canSendRequests
* tells whether the hostname/port combination is able to receive and process SailMaster request messages;
* if <code>false</code>, only events are sent by the host to which the connector connects.
*/
SailMasterConnector getOrCreateSailMasterConnector(String hostname, int port, RaceSpecificMessageLoader messageLoader, boolean canSendRequests) throws InterruptedException;
SailMasterConnector getOrCreateSailMasterConnector(String hostname, int port,
RaceSpecificMessageLoader messageLoader, boolean canSendRequests) throws InterruptedException;
SailMasterTransceiver createSailMasterTransceiver();
SwissTimingConfiguration createSwissTimingConfiguration(String name, String hostname, int port, boolean canSendRequests);
@@ -151,7 +151,15 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
removeSelectedLeaderboard();
}
});
Button stressTestButton = new Button(stringConstants.stressTest());
verticalPanel.add(stressTestButton);
stressTestButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
performStressTestForSelectedLeaderboard();
}
});
// ------------ specific to selected leaderboard ----------------
Label lblRaceNamesIn = new Label(stringConstants.columnNamesInSelectedLeaderboard());
grid.setWidget(2, 0, lblRaceNamesIn);
@@ -245,6 +253,25 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
leaderboardRaceColumnSelectionChanged();
}
private void performStressTestForSelectedLeaderboard() {
final int selectedIndex = leaderboardsListBox.getSelectedIndex();
if (selectedIndex >= 0) {
final String leaderboardName = leaderboardsListBox.getItemText(selectedIndex);
sailingService.stressTestLeaderboardByName(leaderboardName, 100, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error during leaderboard stress test for " + leaderboardName + ": "
+ caught.getMessage());
}
@Override
public void onSuccess(Void result) {
errorReporter.reportError("Stress test for " + leaderboardName + " finished successfully ");
}
});
}
}
private void unlinkSelectedRaceColumnFromTrackedRace() {
final String selectedRaceColumnName = getSelectedRaceColumnName();
final String selectedLeaderboardName = getSelectedLeaderboardName();
@@ -719,10 +746,10 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
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 "+
getSelectedRaceColumnName()+" of leaderboard "+getSelectedLeaderboardName()+": "+
t.getMessage());
errorReporter.reportError("Error trying to link tracked race " + selectedRace.getC().name
+ " of event " + selectedRace.getA().name + " to race column named "
+ getSelectedRaceColumnName() + " of leaderboard " + getSelectedLeaderboardName()
+ ": " + t.getMessage());
raceTree.clearSelection();
}
@@ -732,20 +759,20 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
}
});
}
private void changeIsMedalRace(final boolean isMedalRace){
sailingService.updateIsMedalRace(getSelectedLeaderboardName(), getSelectedRaceColumnName(), isMedalRace, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to change isMedalRace of "+getSelectedRaceColumnName()+": "+caught.getMessage());
}
private void changeIsMedalRace(final boolean isMedalRace) {
sailingService.updateIsMedalRace(getSelectedLeaderboardName(), getSelectedRaceColumnName(), isMedalRace,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to change isMedalRace of "
+ getSelectedRaceColumnName() + ": " + caught.getMessage());
}
@Override
public void onSuccess(Void result) {
// TODO Punkte in spalte updaten.
selectedLeaderboard.setIsMedalRace(getSelectedRaceColumnName(), isMedalRace);
}
});
@Override
public void onSuccess(Void result) {
selectedLeaderboard.setIsMedalRace(getSelectedRaceColumnName(), isMedalRace);
}
});
}
}
@@ -114,4 +114,6 @@ public interface SailingService extends RemoteService {
void trackWithSwissTiming(SwissTimingRaceRecordDAO rr, String hostname, int port, boolean canSendRequests,
boolean trackWind, boolean correctWindByDeclination) throws Exception;
void stressTestLeaderboardByName(String leaderboardName, int times) throws Exception;
}
@@ -173,4 +173,11 @@ public interface SailingServiceAsync {
void trackWithSwissTiming(SwissTimingRaceRecordDAO rr, String hostname, int port, boolean canSendRequests,
boolean trackWind, boolean correctWindByDeclination, AsyncCallback<Void> asyncCallback);
/**
* Requests the computation of the {@link LeaderboardDAO} for <code>leaderboardName</code> <code>times</code> times.
* The date used for the {@link #getLeaderboardByName(String, Date, Collection, AsyncCallback)} call is iterated
* in 10ms time steps, going backwards from "now." For all races, all details are requested.
*/
void stressTestLeaderboardByName(String leaderboardName, int times, AsyncCallback<Void> callback);
}
@@ -112,4 +112,5 @@ public interface StringConstants extends Constants {
String raceStartTimeColumn();
String showOnlySelected();
String tailLength();
String stressTest();
}
@@ -107,3 +107,4 @@ port=Port
raceStartTimeColumn=Race Started
showOnlySelected=Show only selected
tailLength=Tail length (s)
stressTest=Stress Test
@@ -106,4 +106,5 @@ columnMoveDown=Runter
port=Port
raceStartTimeColumn=Rennstart
showOnlySelected=Nur ausgewählte anzeigen
tailLengt=Schweiflänge (s)
tailLength=Schweiflänge (s)
stressTest=Stresstest
@@ -137,6 +137,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
return result;
}
@Override
public LeaderboardDAO getLeaderboardByName(String leaderboardName, Date date,
Collection<String> namesOfRacesForWhichToLoadLegDetails) throws Exception {
long startOfRequestHandling = System.currentTimeMillis();
@@ -182,6 +183,24 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
return result;
}
@Override
public void stressTestLeaderboardByName(String leaderboardName, int times) throws Exception {
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
if (leaderboard != null) {
List<String> raceColumnNames = new ArrayList<String>();
for (RaceInLeaderboard column : leaderboard.getRaceColumns()) {
raceColumnNames.add(column.getName());
}
int i=0;
for (Date date = new Date(); i<times; date = new Date(date.getTime()-10)) {
getLeaderboardByName(leaderboardName, date, raceColumnNames);
i++;
}
} else {
logger.warning("stressTestLeaderboardByName: couldn't find leaderboard "+leaderboardName);
}
}
@Override
public LeaderboardEntryDAO getLeaderboardEntry(String leaderboardName, String competitorName, String raceName, Date date) throws NoWindException {
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
@@ -203,7 +222,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
throw new IllegalArgumentException("Didn't find leaderboard "+leaderboardName);
}
}
private LeaderboardEntryDAO getLeaderboardEntryDAO(Entry entry, TrackedRace trackedRace, Competitor competitor,
TimePoint timePoint, boolean addLegDetails) throws NoWindException {
LeaderboardEntryDAO entryDAO = new LeaderboardEntryDAO();
@@ -211,7 +230,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
entryDAO.totalPoints = entry.getTotalPoints();
entryDAO.reasonForMaxPoints = entry.getMaxPointsReason().name();
entryDAO.discarded = entry.isDiscarded();
if (addLegDetails) {
if (addLegDetails && trackedRace != null) {
entryDAO.legDetails = new ArrayList<LegEntryDAO>();
for (Leg leg : trackedRace.getRace().getCourse().getLegs()) {
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(competitor, leg);