diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingFactory.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingFactory.java index 3fde4a05837..dcaa608c744 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingFactory.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/SwissTimingFactory.java @@ -42,6 +42,9 @@ public interface SwissTimingFactory { SailMasterConnector getOrCreateSailMasterConnector(String hostname, int port, RaceSpecificMessageLoader messageLoader, boolean canSendRequests) throws InterruptedException; + SailMasterConnector getOrCreateSailMasterLiveSimulatorConnector(String host, int port, + RaceSpecificMessageLoader messageLoader, boolean canSendRequests) throws InterruptedException; + SailMasterTransceiver createSailMasterTransceiver(); SwissTimingConfiguration createSwissTimingConfiguration(String name, String hostname, int port, boolean canSendRequests); diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterConnectorImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterConnectorImpl.java index d61c4e6c91b..e824940c627 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterConnectorImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterConnectorImpl.java @@ -299,7 +299,7 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement blockingQueue.offer(message); } - private void notifyListeners(SailMasterMessage message) throws ParseException { + protected void notifyListeners(SailMasterMessage message) throws ParseException { switch (message.getType()) { case RPD: notifyListenersRPD(message); diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterLiveSimulatorConnectorImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterLiveSimulatorConnectorImpl.java new file mode 100644 index 00000000000..37e85ae3281 --- /dev/null +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterLiveSimulatorConnectorImpl.java @@ -0,0 +1,52 @@ +package com.sap.sailing.domain.swisstimingadapter.impl; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader; +import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage; + +public class SailMasterLiveSimulatorConnectorImpl extends SailMasterConnectorImpl { + private final List bufferedMessageList; + + private long messageDeliveryIntervalInMs = 1000; + + public SailMasterLiveSimulatorConnectorImpl(String host, int port, RaceSpecificMessageLoader messageLoader, boolean canSendRequests) throws InterruptedException { + super(host, port, messageLoader, canSendRequests); + + bufferedMessageList = Collections.synchronizedList(new ArrayList()); + + Thread messageDeliveryThread = new Thread(" SailMasterLiveSimulatorConnector") { + public void run() { + while(true) { + try { + if(!bufferedMessageList.isEmpty()) { + SailMasterMessage message = bufferedMessageList.get(0); + + notifyParentListeners(message); + + bufferedMessageList.remove(0); + } + + Thread.sleep(messageDeliveryIntervalInMs); + } catch (Exception e) { + } + } + } + }; + messageDeliveryThread.start(); + } + + private void notifyParentListeners(SailMasterMessage message) throws ParseException { + super.notifyListeners(message); + } + + @Override + protected void notifyListeners(SailMasterMessage message) throws ParseException { + // we cache all messages here and deliver them with a different speed + bufferedMessageList.add(message); + } + +} diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingFactoryImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingFactoryImpl.java index 13c41ff8e68..3dcdb9fe50a 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingFactoryImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingFactoryImpl.java @@ -1,7 +1,6 @@ package com.sap.sailing.domain.swisstimingadapter.impl; import java.io.IOException; - import java.net.UnknownHostException; import java.text.ParseException; import java.util.HashMap; @@ -35,7 +34,8 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory { } @Override - public SailMasterConnector getOrCreateSailMasterConnector(String host, int port, RaceSpecificMessageLoader messageLoader, boolean canSendRequests) throws InterruptedException { + public SailMasterConnector getOrCreateSailMasterConnector(String host, int port, RaceSpecificMessageLoader messageLoader, + boolean canSendRequests) throws InterruptedException { Triple key = new Triple(host, port, messageLoader); SailMasterConnector result = connectors.get(key); if (result == null) { @@ -49,6 +49,21 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory { return result; } + @Override + public SailMasterConnector getOrCreateSailMasterLiveSimulatorConnector(String host, int port, RaceSpecificMessageLoader messageLoader, boolean canSendRequests) throws InterruptedException { + Triple key = new Triple(host, port, messageLoader); + SailMasterConnector result = connectors.get(key); + if (result == null) { + result = new SailMasterLiveSimulatorConnectorImpl(host, port, messageLoader, canSendRequests); + connectors.put(key, result); + // TODO how do connectors get stopped, terminated and removed from the connectors map again? + } else if (result.isStopped()) { + result = new SailMasterLiveSimulatorConnectorImpl(host, port, messageLoader, canSendRequests); + connectors.put(key, result); + } + return result; + } + @Override public SwissTimingConfiguration createSwissTimingConfiguration(String name, String hostname, int port, boolean canSendRequests) { return new SwissTimingConfigurationImpl(name, hostname, port, canSendRequests); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java index 7c51da84ff3..ef3ec3866a8 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SwissTimingEventManagementPanel.java @@ -220,6 +220,11 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane Label lblTrackSettings = new Label(stringConstants.trackSettings()); trackPanel.add(lblTrackSettings); + + final CheckBox simulateLiveEventCheckbox = new CheckBox("Simulate live event"); + simulateLiveEventCheckbox.setValue(false); + simulateLiveEventCheckbox.setWordWrap(false); + trackPanel.add(simulateLiveEventCheckbox); final CheckBox trackWindCheckbox = new CheckBox(stringConstants.trackWind()); trackWindCheckbox.setWordWrap(false); @@ -241,7 +246,7 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane btnTrack.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - trackSelectedRaces(trackWindCheckbox.getValue(), declinationCheckbox.getValue()); + trackSelectedRaces(simulateLiveEventCheckbox.getValue(), trackWindCheckbox.getValue(), declinationCheckbox.getValue()); } }); @@ -337,13 +342,13 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane }); } - private void trackSelectedRaces(boolean trackWind, boolean correctWindByDeclination) { + private void trackSelectedRaces(boolean simulateLiveEvent, boolean trackWind, boolean correctWindByDeclination) { String hostname = hostnameTextbox.getValue(); int port = portIntegerbox.getValue(); for (final SwissTimingRaceRecordDTO rr : raceList.getList()) { if (raceTable.getSelectionModel().isSelected(rr)) { - sailingService.trackWithSwissTiming(rr, hostname, port, /* TODO canSendRequests */false, trackWind, - correctWindByDeclination, new AsyncCallback() { + sailingService.trackWithSwissTiming(rr, hostname, port, /* canSendRequests */false, + trackWind, correctWindByDeclination, new AsyncCallback() { @Override public void onFailure(Throwable caught) { errorReporter.reportError("Error trying to register race " + rr.ID + " for tracking: " diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/CompareCompetitorsChartDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/CompareCompetitorsChartDialog.java index 54a2846fffd..6a33123a600 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/CompareCompetitorsChartDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/CompareCompetitorsChartDialog.java @@ -143,6 +143,7 @@ public class CompareCompetitorsChartDialog extends DialogBox { }); } parentPanel.add(raceChooserPanel); + } private void selectRace(final RaceIdentifier selectedRace) {