Merge branch 'gwt' into gwtracecolumndisplay

This commit is contained in:
Fabian Schwarz-Fritz committed 2011-11-24 15:44:59 +01:00
commit 3616e17c13
8 files changed
+396 -36

No files matched your search

@@ -22,20 +22,26 @@ import com.sap.sailing.domain.swisstimingadapter.persistence.SwissTimingAdapterP
public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPersistence {
private final DB database;
private final SwissTimingFactory swissTimingFactory;
private static final Logger logger = Logger.getLogger(SwissTimingAdapterPersistenceImpl.class.getName());
/** this race cache should only be used for checks in the storeSailMasterMessage method to ensure
* that we have always a valid race for a message (also in case we missed a RAC message)
private final SwissTimingFactory swissTimingFactory;
private static final Logger logger = Logger.getLogger(SwissTimingAdapterPersistenceImpl.class.getName());
private final DBCollection lastMessageCountCollection;
/**
* this race cache should only be used for checks in the storeSailMasterMessage method to ensure that we have always
* a valid race for a message (also in case we missed a RAC message)
*/
private HashMap<String, Race> cachedRaces = new HashMap<String, Race>();
private long lastMessageCount;
public SwissTimingAdapterPersistenceImpl(DB db, SwissTimingFactory swissTimingFactory) {
super();
this.database = db;
this.swissTimingFactory = swissTimingFactory;
lastMessageCountCollection = db.getCollection(CollectionNames.LAST_MESSAGE_COUNT.name());
init();
}
@@ -48,22 +54,22 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
indexKeysRaceMsgs.put(FieldNames.RACE_ID.name(), 1);
racesMessageCollection.ensureIndex(indexKeysRaceMsgs, IndexNames.INDEX_RACES_MESSAGES.name(), true);
// ensure the required indexes for the collection of command messages
DBCollection cmdMessagesCollection = database.getCollection(CollectionNames.COMMAND_MESSAGES.name());
BasicDBObject indexKeysCmdMsgs = new BasicDBObject();
indexKeysCmdMsgs.put(FieldNames.MESSAGE_SEQUENCE_NUMBER.name(), 1);
cmdMessagesCollection.ensureIndex(indexKeysCmdMsgs, IndexNames.INDEX_COMMAND_MESSAGES.name(), true);
// initially fill the races cache
Iterable<Race> races = getRaces();
for(Race race: races) {
for (Race race : races) {
cachedRaces.put(race.getRaceID(), race);
}
}
@Override
public Iterable<SwissTimingConfiguration> getSwissTimingConfigurations() {
List<SwissTimingConfiguration> result = new ArrayList<SwissTimingConfiguration>();
@@ -74,8 +80,9 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
result.add(stConfig);
}
} catch (Throwable t) {
// something went wrong during DB access; report, then use empty new wind track
logger.log(Level.SEVERE, "Error connecting to MongoDB, unable to load recorded TracTrac configurations. Check MongoDB settings.");
// something went wrong during DB access; report, then use empty new wind track
logger.log(Level.SEVERE,
"Error connecting to MongoDB, unable to load recorded TracTrac configurations. Check MongoDB settings.");
logger.throwing(SwissTimingAdapterPersistenceImpl.class.getName(), "getTracTracConfigurations", t);
}
return result;
@@ -84,9 +91,8 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
private SwissTimingConfiguration loadSwissTimingConfiguration(DBObject object) {
Boolean canSendRequests = (Boolean) object.get(FieldNames.ST_CONFIG_CAN_SEND_REQUESTS.name());
return swissTimingFactory.createSwissTimingConfiguration((String) object.get(FieldNames.ST_CONFIG_NAME.name()),
(String) object.get(FieldNames.ST_CONFIG_HOSTNAME.name()),
(Integer) object.get(FieldNames.ST_CONFIG_PORT.name()),
canSendRequests==null?false:canSendRequests);
(String) object.get(FieldNames.ST_CONFIG_HOSTNAME.name()), (Integer) object
.get(FieldNames.ST_CONFIG_PORT.name()), canSendRequests == null ? false : canSendRequests);
}
@Override
@@ -110,11 +116,12 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
DBCollection racesMessagesCollection = database.getCollection(CollectionNames.RACES_MESSAGES.name());
BasicDBObject query = new BasicDBObject();
query.append(FieldNames.RACE_ID.name(), raceID);
DBCursor results = racesMessagesCollection.find(query).sort(new BasicDBObject().append(FieldNames.MESSAGE_SEQUENCE_NUMBER.name(), 1));
DBCursor results = racesMessagesCollection.find(query).sort(
new BasicDBObject().append(FieldNames.MESSAGE_SEQUENCE_NUMBER.name(), 1));
List<SailMasterMessage> result = new ArrayList<SailMasterMessage>();
for (DBObject o : results) {
SailMasterMessage msg = swissTimingFactory.createMessage((String) o.get(FieldNames.MESSAGE_CONTENT.name()),
(Long) o.get(FieldNames.MESSAGE_SEQUENCE_NUMBER.name()));
SailMasterMessage msg = swissTimingFactory.createMessage((String) o.get(FieldNames.MESSAGE_CONTENT.name()),
(Long) o.get(FieldNames.MESSAGE_SEQUENCE_NUMBER.name()));
result.add(msg);
}
return result;
@@ -123,17 +130,17 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
@Override
public List<SailMasterMessage> loadCommandMessages() {
DBCollection cmdMessagesCollection = database.getCollection(CollectionNames.COMMAND_MESSAGES.name());
DBCursor results = cmdMessagesCollection.find().sort(new BasicDBObject().append(FieldNames.MESSAGE_SEQUENCE_NUMBER.name(), 1));
DBCursor results = cmdMessagesCollection.find().sort(
new BasicDBObject().append(FieldNames.MESSAGE_SEQUENCE_NUMBER.name(), 1));
List<SailMasterMessage> result = new ArrayList<SailMasterMessage>();
for (DBObject o : results) {
SailMasterMessage msg = swissTimingFactory.createMessage((String) o.get(FieldNames.MESSAGE_CONTENT.name()),
(Long) o.get(FieldNames.MESSAGE_SEQUENCE_NUMBER.name()));
SailMasterMessage msg = swissTimingFactory.createMessage((String) o.get(FieldNames.MESSAGE_CONTENT.name()),
(Long) o.get(FieldNames.MESSAGE_SEQUENCE_NUMBER.name()));
result.add(msg);
}
return result;
}
@Override
public Race getRace(String raceID) {
DBCollection races = database.getCollection(CollectionNames.RACES_MASTERDATA.name());
@@ -142,9 +149,9 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
DBObject o = races.findOne(query);
if (o != null) {
Long startTimeAsMillis = (Long) o.get(FieldNames.RACE_STARTTIME.name());
Race race = swissTimingFactory.createRace((String) o.get(FieldNames.RACE_ID.name()),
(String) o.get(FieldNames.RACE_DESCRIPTION.name()),
startTimeAsMillis == null ? null : new MillisecondsTimePoint(startTimeAsMillis));
Race race = swissTimingFactory.createRace((String) o.get(FieldNames.RACE_ID.name()), (String) o
.get(FieldNames.RACE_DESCRIPTION.name()), startTimeAsMillis == null ? null
: new MillisecondsTimePoint(startTimeAsMillis));
return race;
}
return null;
@@ -157,9 +164,9 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
List<Race> result = new ArrayList<Race>();
for (DBObject o : results) {
Long startTimeAsMillis = (Long) o.get(FieldNames.RACE_STARTTIME.name());
Race race = swissTimingFactory.createRace((String) o.get(FieldNames.RACE_ID.name()),
(String) o.get(FieldNames.RACE_DESCRIPTION.name()),
startTimeAsMillis == null ? null : new MillisecondsTimePoint(startTimeAsMillis));
Race race = swissTimingFactory.createRace((String) o.get(FieldNames.RACE_ID.name()), (String) o
.get(FieldNames.RACE_DESCRIPTION.name()), startTimeAsMillis == null ? null
: new MillisecondsTimePoint(startTimeAsMillis));
result.add(race);
}
return result;
@@ -177,7 +184,7 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
result.put(FieldNames.ST_CONFIG_HOSTNAME.name(), swissTimingConfiguration.getHostname());
result.put(FieldNames.ST_CONFIG_PORT.name(), swissTimingConfiguration.getPort());
result.put(FieldNames.ST_CONFIG_CAN_SEND_REQUESTS.name(), swissTimingConfiguration.canSendRequests());
stConfigCollection.insert(result);
}
@@ -193,6 +200,14 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
if(type.isRaceSpecific()) {
objToInsert.put(FieldNames.RACE_ID.name(), message.getRaceID());
messageCollection = database.getCollection(CollectionNames.RACES_MESSAGES.name());
if (message.getSequenceNumber() == null){
DBObject emptyQuery = new BasicDBObject();
DBObject incrementLastMessageCountQuery = new BasicDBObject().
append("$inc", new BasicDBObject().append(FieldNames.LAST_MESSAGE_COUNT.name(), 1));
DBObject newCountRecord = lastMessageCountCollection.findAndModify(emptyQuery, incrementLastMessageCountQuery);
lastMessageCount = (Long) newCountRecord.get(FieldNames.LAST_MESSAGE_COUNT.name());
objToInsert.put(FieldNames.MESSAGE_SEQUENCE_NUMBER.name(), lastMessageCount);
}
} else {
messageCollection = database.getCollection(CollectionNames.COMMAND_MESSAGES.name());
}
@@ -225,8 +240,8 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
private List<Race> parseAvailableRacesMessage(SailMasterMessage availableRacesMessage) {
int count = Integer.valueOf(availableRacesMessage.getSections()[1]);
List<Race> result = new ArrayList<Race>();
for (int i=0; i<count; i++) {
String[] idAndDescription = availableRacesMessage.getSections()[2+i].split(";");
for (int i = 0; i < count; i++) {
String[] idAndDescription = availableRacesMessage.getSections()[2 + i].split(";");
result.add(SwissTimingFactory.INSTANCE.createRace(idAndDescription[0], idAndDescription[1], null));
}
return result;
@@ -240,8 +255,9 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
BasicDBObject result = new BasicDBObject();
result.put(FieldNames.RACE_ID.name(), race.getRaceID());
result.put(FieldNames.RACE_DESCRIPTION.name(), race.getDescription());
result.put(FieldNames.RACE_STARTTIME.name(), race.getStartTime() == null ? null : new Long(race.getStartTime().asMillis()));
racesCollection.update(query, result, /* upsrt */ true, /* multi */ false);
result.put(FieldNames.RACE_STARTTIME.name(), race.getStartTime() == null ? null : new Long(race.getStartTime()
.asMillis()));
racesCollection.update(query, result, /* upsrt */true, /* multi */false);
}
@Override
@@ -249,7 +265,7 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
DBCollection racesCollection = database.getCollection(CollectionNames.RACES_MASTERDATA.name());
racesCollection.drop();
}
@Override
public void dropAllMessageData() {
DBCollection racesMessageCollection = database.getCollection(CollectionNames.RACES_MESSAGES.name());
@@ -34,6 +34,9 @@ public class AdminConsole extends AbstractEntryPoint implements EventRefresher {
eventDisplayers.add(swisstimingEventManagementPanel);
swisstimingEventManagementPanel.setSize("90%", "90%");
tabPanel.add(swisstimingEventManagementPanel, stringConstants.swissTimingEvents(), false);
CreateSwissTimingRacePanel createSwissTimingRacePanel = new CreateSwissTimingRacePanel(sailingService,this,stringConstants);
createSwissTimingRacePanel.setSize("90%", "90%");
tabPanel.add(createSwissTimingRacePanel,"Create SwissTiming race",false);
WindPanel windPanel = new WindPanel(sailingService, this, this, stringConstants);
eventDisplayers.add(windPanel);
windPanel.setSize("90%", "90%");
@@ -0,0 +1,296 @@
package com.sap.sailing.gwt.ui.client;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
public class CreateSwissTimingRacePanel extends FormPanel {
private TextBox txtbRaceName;
private TextBox txtbRaceDesc;
private TextBox txtbCompName;
private TextBox txtbCompSailNr;
private MultiWordSuggestOracle suggestionsCompCountr;
private SuggestBox listbCompCountr;
private ListBox listbCompetitorList;
private List<Competitor> competitors;
private int selectedIndex;
private int id = 0;
private final SailingServiceAsync service;
private ErrorReporter errorReporter;
private StringConstants stringConstants;
private long lastMessageCount;
public CreateSwissTimingRacePanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter, StringConstants stringConstants){
this.service = sailingService;
this.errorReporter = errorReporter;
this.stringConstants = stringConstants;
competitors = new ArrayList<CreateSwissTimingRacePanel.Competitor>();
VerticalPanel mainPanel = new VerticalPanel();
Grid mainGrid = new Grid(3,1);
mainGrid.setWidth("100%");
mainPanel.add(mainGrid);
mainPanel.setSize("100%", "100%");
this.setWidget(mainPanel);
//Race data panel
CaptionPanel raceDataPanel = new CaptionPanel("Race");
raceDataPanel.setSize("90%", "90%");
mainGrid.setWidget(0, 0, raceDataPanel);
Grid grid = new Grid(2,2);
raceDataPanel.add(grid);
Label lblRaceName = new Label("Race name:");
grid.setWidget(0, 0, lblRaceName);
txtbRaceName = new TextBox();
grid.setWidget(0, 1, txtbRaceName);
Label lblRaceDesc = new Label("Race description:");
grid.setWidget(1, 0, lblRaceDesc);
txtbRaceDesc = new TextBox();
grid.setWidget(1, 1, txtbRaceDesc);
//Competitor panel
CaptionPanel competitorPanel = new CaptionPanel("Competitors");
competitorPanel.setSize("90%", "90%");
mainGrid.setWidget(1, 0, competitorPanel);
grid = new Grid(3,3);
competitorPanel.add(grid);
Label lblCompetitorListTitle = new Label("Competitors:");
grid.setWidget(0, 0, lblCompetitorListTitle);
listbCompetitorList = new ListBox(false);
listbCompetitorList.setVisibleItemCount(10);
listbCompetitorList.setWidth("200px");
listbCompetitorList.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
competitorSelectionChanged();
}
});
grid.setWidget(1, 0, listbCompetitorList);
VerticalPanel compData = new VerticalPanel();
grid.setWidget(1, 1, compData);
Grid subGrid = new Grid(3,2);
compData.add(subGrid);
Label lblName = new Label("Name:");
subGrid.setWidget(0, 0, lblName);
txtbCompName = new TextBox();
txtbCompName.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
competitorChanged();
}
});
subGrid.setWidget(0, 1, txtbCompName);
Label lblSailNr = new Label("Sail number:");
subGrid.setWidget(1, 0, lblSailNr);
txtbCompSailNr = new TextBox();
txtbCompSailNr.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
competitorChanged();
}
});
subGrid.setWidget(1, 1, txtbCompSailNr);
Label lblCountr = new Label("Country:");
subGrid.setWidget(2, 0, lblCountr);
suggestionsCompCountr = new MultiWordSuggestOracle();
service.getCountryCodes(new AsyncCallback<String[]>() {
@Override
public void onFailure(Throwable caught) {
CreateSwissTimingRacePanel.this.errorReporter.reportError("Unable to find the IOC 3-letter-codes.");
}
@Override
public void onSuccess(String[] result) {
for (String cc : result){
suggestionsCompCountr.add(cc);
}
}
});
listbCompCountr = new SuggestBox(suggestionsCompCountr);
listbCompCountr.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
competitorChanged();
}
});
subGrid.setWidget(2, 1, listbCompCountr);
HorizontalPanel horizontalPanel = new HorizontalPanel();
grid.setWidget(2, 0, horizontalPanel);
Button bttAddCompetitor = new Button("Add");
bttAddCompetitor.setWidth("100px");
bttAddCompetitor.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
addCompetitor();
}
});
horizontalPanel.add(bttAddCompetitor);
Button bttDeleteCompetitor = new Button("Delete");
bttDeleteCompetitor.setWidth("100px");
bttDeleteCompetitor.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
deleteCompetitor();
}
});
horizontalPanel.add(bttDeleteCompetitor);
Button bttAddRace = new Button("Add race");
bttAddRace.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
addRace();
}
});
mainGrid.setWidget(2, 0, bttAddRace);
}
private void competitorSelectionChanged(){
selectedIndex = listbCompetitorList.getSelectedIndex();
if (selectedIndex < 0){
return;
}
String name = listbCompetitorList.getItemText(selectedIndex);
Competitor c = getCompetitorByName(name);
if (c != null){
txtbCompName.setText(c.getName());
txtbCompSailNr.setText(c.getSailNumber());
listbCompCountr.setText(c.getCountry());
}
}
private void addCompetitor(){
Competitor c = new Competitor(id++,"Noname","","");
listbCompetitorList.addItem(c.toString());
competitors.add(c);
}
private void deleteCompetitor(){
if (selectedIndex < 0){
return;
}
listbCompetitorList.removeItem(selectedIndex);
competitors.remove(selectedIndex);
}
private void competitorChanged(){
if (selectedIndex < 0){
return;
}
Competitor c = getCompetitorByName(listbCompetitorList.getItemText(selectedIndex));
if (!txtbCompName.getText().equals(c.getName())){
c.setName(txtbCompName.getText());
listbCompetitorList.setItemText(selectedIndex, c.toString());
}
c.setCountry(listbCompCountr.getText());
c.setSailNumber(txtbCompSailNr.getText());
}
private Competitor getCompetitorByName(String name){
for (Competitor c : competitors){
if (name.equals(c.toString()))
return c;
}
return null;
}
private void addRace(){
String racMessage = "RAC|1|" + txtbRaceName.getText()+";" + txtbRaceDesc.getText();
String stlMessage = "STL|" + txtbRaceName.getText()+"|" + competitors.size();
for (Competitor c : competitors){
stlMessage += "|" + c.getSailNumber()+";" + c.getCountry() +";" + c.getName();
}
String ccgMessage = "CCG|" + txtbRaceName.getText() +"|3|0;LeeGate;LG1;LG2|1;Windwards;WW1|2;LeeGate;LG1;LG2";
service.sendSwissTimingDummyRace(racMessage,stlMessage,ccgMessage, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
Window.alert("Succesfully sended new race.");
lastMessageCount += 3;
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Race with raceID \"" + txtbRaceName.getText() + "\" already exists.");
}
});
}
private class Competitor{
private String name;
private String sailNumber;
private String country;
private final int id;
public int getId() {
return id;
}
public Competitor(int id, String name, String sailNumber, String country) {
super();
this.id = id;
this.name = name;
this.sailNumber = sailNumber;
this.country = country;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSailNumber() {
return sailNumber;
}
public void setSailNumber(String sailNumber) {
this.sailNumber = sailNumber;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String toString(){
return getId() + " " + getName();
}
}
}
@@ -114,6 +114,10 @@ public interface SailingService extends RemoteService {
void trackWithSwissTiming(SwissTimingRaceRecordDAO rr, String hostname, int port, boolean canSendRequests,
boolean trackWind, boolean correctWindByDeclination) throws Exception;
void sendSwissTimingDummyRace(String racMessage, String stlMesssage, String ccgMessage) throws IllegalArgumentException;
void stressTestLeaderboardByName(String leaderboardName, int times) throws Exception;
String[] getCountryCodes();
}
@@ -174,10 +174,13 @@ public interface SailingServiceAsync {
void trackWithSwissTiming(SwissTimingRaceRecordDAO rr, String hostname, int port, boolean canSendRequests,
boolean trackWind, boolean correctWindByDeclination, AsyncCallback<Void> asyncCallback);
void sendSwissTimingDummyRace(String racMessage, String stlMesssage, String ccgMessage, AsyncCallback<Void> callback);
/**
* 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);
void getCountryCodes(AsyncCallback<String[]> callback);
}
@@ -117,6 +117,8 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
private final SwissTimingFactory swissTimingFactory;
private final com.sap.sailing.domain.tractracadapter.persistence.DomainObjectFactory tractracDomainObjectFactory;
private final com.sap.sailing.util.CountryCodeFactory countryCodeFactory;
public SailingServiceImpl() {
BundleContext context = Activator.getDefault();
@@ -127,6 +129,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
tractracDomainObjectFactory = com.sap.sailing.domain.tractracadapter.persistence.DomainObjectFactory.INSTANCE;
tractracMongoObjectFactory = com.sap.sailing.domain.tractracadapter.persistence.MongoObjectFactory.INSTANCE;
swissTimingFactory = SwissTimingFactory.INSTANCE;
countryCodeFactory = com.sap.sailing.util.CountryCodeFactory.INSTANCE;
}
protected ServiceTracker<RacingEventService, RacingEventService> createAndOpenRacingEventServiceTracker(
@@ -1088,4 +1091,21 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}.start();
}
}
@Override
public void sendSwissTimingDummyRace(String racMessage, String stlMesssage, String ccgMessage) {
getService().storeSwissTimingDummyRace(racMessage,stlMesssage,ccgMessage);
}
@Override
public String[] getCountryCodes() {
List<String> countryCodes = new ArrayList<String>();
for (CountryCode cc : countryCodeFactory.getAll()){
if (cc.getThreeLetterIOCCode() != null && !cc.getThreeLetterIOCCode().equals("")){
countryCodes.add(cc.getThreeLetterIOCCode());
}
}
Collections.sort(countryCodes);
return countryCodes.toArray(new String[0]);
}
}
@@ -184,5 +184,7 @@ public interface RacingEventService extends TrackedEventRegistry {
WindStore windStore, long timeoutInMilliseconds) throws InterruptedException, UnknownHostException, IOException, ParseException;
SwissTimingFactory getSwissTimingFactory();
public void storeSwissTimingDummyRace(String racMessage, String stlMesssage, String ccgMessage) throws IllegalArgumentException;
}
@@ -36,6 +36,7 @@ import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.swisstimingadapter.Race;
import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector;
import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.swisstimingadapter.persistence.SwissTimingAdapterPersistence;
import com.sap.sailing.domain.tracking.DynamicTrackedEvent;
@@ -488,5 +489,20 @@ public class RacingEventServiceImpl implements RacingEventService {
public void remove(Event event) {
eventTrackingCache.remove(event);
}
@Override
public void storeSwissTimingDummyRace(String racMessage, String stlMessage, String ccgMessage){
SailMasterMessage racSMMessage = swissTimingFactory.createMessage(racMessage, null);
SailMasterMessage stlSMMessage = swissTimingFactory.createMessage(stlMessage, null);
SailMasterMessage ccgSMMessage = swissTimingFactory.createMessage(ccgMessage, null);
if (swissTimingAdapterPersistence.getRace(stlSMMessage.getRaceID()) != null) {
throw new IllegalArgumentException("Race with raceID \"" + stlSMMessage.getRaceID() + "\" already exists.");
}
else {
swissTimingAdapterPersistence.storeSailMasterMessage(racSMMessage);
swissTimingAdapterPersistence.storeSailMasterMessage(stlSMMessage);
swissTimingAdapterPersistence.storeSailMasterMessage(ccgSMMessage);
}
}
}