diff --git a/java/com.sap.sailing.declination/resources/declination-2012.txt b/java/com.sap.sailing.declination/resources/declination-2012.txt index 3e074803077..21fda90a897 100755 Binary files a/java/com.sap.sailing.declination/resources/declination-2012.txt and b/java/com.sap.sailing.declination/resources/declination-2012.txt differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Achterberg b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Achterberg new file mode 100755 index 00000000000..3279fe4e234 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Achterberg differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Anton b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Anton new file mode 100755 index 00000000000..a78ffef31c2 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Anton differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Barop b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Barop new file mode 100755 index 00000000000..6c0cabf4fa2 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Barop differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Birkner b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Birkner new file mode 100755 index 00000000000..809b2f014c9 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Birkner differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Brill b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Brill new file mode 100755 index 00000000000..3677365eb23 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Brill differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Broise b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Broise new file mode 100755 index 00000000000..cde20ea7d04 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Broise differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Buhl b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Buhl new file mode 100755 index 00000000000..01b4c62994c Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Buhl differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Böger b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Böger new file mode 100755 index 00000000000..888b574b60a Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Böger differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Böhm b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Böhm new file mode 100755 index 00000000000..38829af0f37 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Böhm differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Bøjland b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Bøjland new file mode 100755 index 00000000000..a099946368e Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Bøjland differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Dasenbrook b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Dasenbrook new file mode 100755 index 00000000000..15e950f0b3c Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Dasenbrook differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Dr.Plattner b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Dr.Plattner new file mode 100755 index 00000000000..7984d76eed2 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Dr.Plattner differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Feldmann b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Feldmann new file mode 100755 index 00000000000..2c89527ff56 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Feldmann differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Findel b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Findel new file mode 100755 index 00000000000..0e4d0402720 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Findel differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Fischer b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Fischer new file mode 100755 index 00000000000..7c4a54aeb90 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Fischer differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Goedeking b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Goedeking new file mode 100755 index 00000000000..ebdd2926dac Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Goedeking differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Gosch b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Gosch new file mode 100755 index 00000000000..eb6eab57256 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Gosch differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Hastenpflug b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Hastenpflug new file mode 100755 index 00000000000..6b8882429f6 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Hastenpflug differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Henge b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Henge new file mode 100755 index 00000000000..593ba862ced Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Henge differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Hunger b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Hunger new file mode 100755 index 00000000000..d3e25a4ae6d Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Hunger differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Kellner b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Kellner new file mode 100755 index 00000000000..274dca7467c Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Kellner differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Kevin b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Kevin new file mode 100755 index 00000000000..22f86737e92 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Kevin differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Kraft b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Kraft new file mode 100755 index 00000000000..e3288e6c046 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Kraft differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Köchlin b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Köchlin new file mode 100755 index 00000000000..b454906c55a Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Köchlin differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Lehmann b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Lehmann new file mode 100755 index 00000000000..11bff438647 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Lehmann differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Lietz b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Lietz new file mode 100755 index 00000000000..f4372cc7289 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Lietz differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Menge b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Menge new file mode 100755 index 00000000000..f914a79e544 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Menge differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Neulen b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Neulen new file mode 100755 index 00000000000..0334664aa60 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Neulen differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Pleßmann b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Pleßmann new file mode 100755 index 00000000000..b24ff156906 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Pleßmann differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Rasenack b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Rasenack new file mode 100755 index 00000000000..06578d02bd0 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Rasenack differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Reincke b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Reincke new file mode 100755 index 00000000000..15cc12b5591 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Reincke differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Saugmann b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Saugmann new file mode 100755 index 00000000000..79ad1dd023e Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Saugmann differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-Schomäker b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Schomäker new file mode 100755 index 00000000000..73f284259b3 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-Schomäker differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-boite b/java/com.sap.sailing.domain.test/resources/Kieler Woche-boite new file mode 100755 index 00000000000..84ea06f6b3b Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-boite differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-de Lisle b/java/com.sap.sailing.domain.test/resources/Kieler Woche-de Lisle new file mode 100755 index 00000000000..bfa9c13a57d Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-de Lisle differ diff --git a/java/com.sap.sailing.domain.test/resources/Kieler Woche-van Wonterghem b/java/com.sap.sailing.domain.test/resources/Kieler Woche-van Wonterghem new file mode 100755 index 00000000000..8bc8657f463 Binary files /dev/null and b/java/com.sap.sailing.domain.test/resources/Kieler Woche-van Wonterghem differ diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractTracTracLiveTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractTracTracLiveTest.java index 874956b274e..b3796e7ec9f 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractTracTracLiveTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractTracTracLiveTest.java @@ -25,6 +25,15 @@ import com.tractrac.clientmodule.data.DataController; import com.tractrac.clientmodule.data.DataController.Listener; import com.tractrac.clientmodule.setup.KeyValue; +/** + * Subclassing tests have to call {@link #addListenersForStoredDataAndStartController(Iterable)} to kick off + * the data receiving process. If subclasses use this class's default constructor, a connection to the + * STG default account with a few test races is established. Subclasses may also choose to configure other + * races / events using the {@link #AbstractTracTracLiveTest(URL, URI, URI)} constructor variant. + * + * @author Axel Uhl (D043530) + * + */ public abstract class AbstractTracTracLiveTest implements Listener { private static final String START_SIMULATOR_URL = "http://sapsimulation.tracdev.dk/start.php"; @@ -39,23 +48,21 @@ public abstract class AbstractTracTracLiveTest implements Listener { private DataController controller; protected AbstractTracTracLiveTest() throws URISyntaxException, MalformedURLException { + this(Boolean.valueOf(System.getProperty("tractrac.tunnel", "false")) ? new URL("http://localhost:12348/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=bd8c778e-7c65-11e0-8236-406186cbf87c") : + new URL("http://germanmaster.traclive.dk/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=bd8c778e-7c65-11e0-8236-406186cbf87c"), + Boolean.valueOf(System.getProperty("tractrac.tunnel", "false")) ? new URI("tcp://localhost:4412") : new URI("tcp://germanmaster.traclive.dk:4400"), + Boolean.valueOf(System.getProperty("tractrac.tunnel", "false")) ? new URI("tcp://localhost:4413") : new URI("tcp://germanmaster.traclive.dk:4401")); // for live simulation: // paramUrl = new URL("http://sapsimulation.tracdev.dk/simulateconf/j80race12.txt"); // liveUri = new URI("tcp://sapsimulation.tracdev.dk:4420"); // or with tunneling: tcp://localhost:4420 // storedUri = new URI("tcp://sapsimulation.tracdev.dk:4421"); // or with tunneling: tcp://localhost:4421 // for stored race, non-real-time simulation: - - if (Boolean.valueOf(System.getProperty("tractrac.tunnel", "false"))) { - // tunnel - paramUrl = new URL("http://localhost:12348/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=bd8c778e-7c65-11e0-8236-406186cbf87c"); - liveUri = new URI("tcp://localhost:4412"); - storedUri = new URI("tcp://localhost:4413"); - } else { - //no tunnel: - paramUrl = new URL("http://germanmaster.traclive.dk/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=bd8c778e-7c65-11e0-8236-406186cbf87c"); - liveUri = new URI("tcp://germanmaster.traclive.dk:4400"); - storedUri = new URI("tcp://germanmaster.traclive.dk:4401"); - } + } + + protected AbstractTracTracLiveTest(URL paramUrl, URI liveUri, URI storedUri) { + this.paramUrl = paramUrl; + this.liveUri = liveUri; + this.storedUri = storedUri; receivers = new HashSet(); } @@ -64,7 +71,7 @@ public abstract class AbstractTracTracLiveTest implements Listener { // Read event data from configuration file event = KeyValue.setup(paramUrl); assertNotNull(event); - assertEquals("Sailing Team Germany", event.getName()); + assertEquals(getExpectedEventName(), event.getName()); // Initialize data controller using live and stored data sources controller = new DataController(liveUri, storedUri, this); // Start live and stored data streams @@ -72,6 +79,10 @@ public abstract class AbstractTracTracLiveTest implements Listener { // test cases need to start the thread calling startController // after adding their listeners } + + protected String getExpectedEventName() { + return "Sailing Team Germany"; + } protected void addListenersForStoredDataAndStartController(Iterable receivers) { for (Receiver receiver : receivers) { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackSmootheningTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackSmootheningTest.java new file mode 100755 index 00000000000..98f83ebe3db --- /dev/null +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackSmootheningTest.java @@ -0,0 +1,185 @@ +package com.sap.sailing.domain.test; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.io.ObjectOutputStream; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; + +import com.maptrack.client.io.TypeController; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Event; +import com.sap.sailing.domain.base.Position; +import com.sap.sailing.domain.base.SpeedWithBearing; +import com.sap.sailing.domain.base.TimePoint; +import com.sap.sailing.domain.base.impl.DegreeBearingImpl; +import com.sap.sailing.domain.base.impl.DegreePosition; +import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl; +import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; +import com.sap.sailing.domain.tracking.DynamicTrack; +import com.sap.sailing.domain.tracking.DynamicTrackedEvent; +import com.sap.sailing.domain.tracking.DynamicTrackedRace; +import com.sap.sailing.domain.tracking.GPSFix; +import com.sap.sailing.domain.tracking.GPSFixMoving; +import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tracking.RaceChangeListener; +import com.sap.sailing.domain.tracking.RaceListener; +import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.domain.tracking.Wind; +import com.sap.sailing.domain.tracking.impl.DynamicGPSFixMovingTrackImpl; +import com.sap.sailing.domain.tracking.impl.EmptyWindStore; +import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl; +import com.sap.sailing.domain.tractracadapter.DomainFactory; +import com.sap.sailing.domain.tractracadapter.Receiver; +import com.sap.sailing.domain.tractracadapter.ReceiverType; + +/** + * Receives GPS tracks from a race. One test (if not ignored) stores these tracks in the resources/ + * folder for later (fast, off-line and reproducible) use by other tests. The other tests apply + * smoothening and ensure that smoothening filters out serious outliers but doesn't alter good + * tracks that don't have outliers. + * + * @author Axel Uhl (D043530) + * + */ +public class TrackSmootheningTest extends AbstractTracTracLiveTest { + final private Object semaphor = new Object(); + private final Map> tracks; + private boolean trackComplete; + + public TrackSmootheningTest() throws URISyntaxException, MalformedURLException { + super(Boolean.valueOf(System.getProperty("tractrac.tunnel", "false")) ? new URL("http://localhost:12348/events/event_20110609_KielerWoch/clientparams.php?event=event_20110609_KielerWoch&race=357c700a-9d9a-11e0-85be-406186cbf87c") : + new URL("http://germanmaster.traclive.dk/events/event_20110609_KielerWoch/clientparams.php?event=event_20110609_KielerWoch&race=357c700a-9d9a-11e0-85be-406186cbf87c"), + Boolean.valueOf(System.getProperty("tractrac.tunnel", "false")) ? new URI("tcp://localhost:1520") : new URI("tcp://germanmaster.traclive.dk:1520"), + Boolean.valueOf(System.getProperty("tractrac.tunnel", "false")) ? new URI("tcp://localhost:1521") : new URI("tcp://germanmaster.traclive.dk:1521")); + tracks = new HashMap>(); + } + + /** + * Sets up a single listener so that the rather time-consuming race setup is received only once, and all + * tests in this class share a single feed execution. The listener fills in the first event received + * into {@link #firstTracked} and {@link #firstData}. All events are converted into {@link GPSFixMovingImpl} + * objects and appended to the {@link DynamicTrackedRace}s. + */ + @Before + public void setupListener() { + final DomainFactory domainFactory = DomainFactory.INSTANCE; + final RaceChangeListener positionListener = new RaceChangeListener() { + @Override + public void gpsFixReceived(GPSFix fix, Competitor competitor) { + DynamicTrack track = tracks.get(competitor); + if (track == null) { + track = new DynamicGPSFixMovingTrackImpl(competitor, /* millisecondsOverWhichToAverage */ 40000); + tracks.put(competitor, track); + } + track.addGPSFix((GPSFixMoving) fix); + } + @Override + public void markPassingReceived(MarkPassing markPassing) { + } + @Override + public void windDataReceived(Wind wind) { + } + @Override + public void windDataRemoved(Wind wind) { + } + @Override + public void speedAveragingChanged(long oldMillisecondsOverWhichToAverage, long newMillisecondsOverWhichToAverage) { + } + @Override + public void windAveragingChanged(long oldMillisecondsOverWhichToAverage, + long newMillisecondsOverWhichToAverage) { + } + }; + List listeners = new ArrayList(); + Event event = domainFactory.createEvent(getEvent()); + DynamicTrackedEvent trackedEvent = domainFactory.getOrCreateTrackedEvent(event); + trackedEvent.addRaceListener(new RaceListener() { + @Override + public void raceAdded(TrackedRace trackedRace) { + System.out.println("Subscribing raw position listener for race "+trackedRace); + ((DynamicTrackedRace) trackedRace).addListener(positionListener); + } + @Override + public void raceRemoved(TrackedRace trackedRace) { + } + }); + for (Receiver receiver : domainFactory.getUpdateReceivers(trackedEvent, getEvent(), EmptyWindStore.INSTANCE, this)) { + for (TypeController raceListener : receiver.getTypeControllers()) { + listeners.add(raceListener); + } + } + Iterable updateReceivers = domainFactory.getUpdateReceivers(trackedEvent, getEvent(), + EmptyWindStore.INSTANCE, this, ReceiverType.RACECOURSE, ReceiverType.RACESTARTFINISH, ReceiverType.RAWPOSITIONS); + addListenersForStoredDataAndStartController(updateReceivers); + } + + @Override + public void storedDataEnd() { + super.storedDataEnd(); + trackComplete = true; + synchronized (semaphor) { + semaphor.notifyAll(); + } + } + + @Test + public void storeReceivedTracks() throws InterruptedException, FileNotFoundException, IOException { + synchronized (semaphor) { + while (!trackComplete) { + semaphor.wait(); + } + } + storeTracks(); + } + + private void storeTracks() throws FileNotFoundException, IOException { + for (Map.Entry> competitorAndTrack : tracks.entrySet()) { + ObjectOutput oo = getOutputStream(competitorAndTrack.getKey()); + for (GPSFixMoving fix : competitorAndTrack.getValue().getFixes()) { + write(fix, oo); + } + oo.close(); + } + } + + private void write(GPSFixMoving fix, ObjectOutput oo) throws IOException { + oo.writeLong(fix.getTimePoint().asMillis()); + oo.writeDouble(fix.getPosition().getLatDeg()); + oo.writeDouble(fix.getPosition().getLngDeg()); + oo.writeDouble(fix.getSpeed().getKnots()); + oo.writeDouble(fix.getSpeed().getBearing().getDegrees()); + } + + private GPSFixMoving read(ObjectInput oi) throws IOException { + TimePoint timePoint = new MillisecondsTimePoint(oi.readLong()); + Position position = new DegreePosition(oi.readDouble(), oi.readDouble()); + SpeedWithBearing speedWithBearing = new KnotSpeedWithBearingImpl(oi.readDouble(), new DegreeBearingImpl(oi.readDouble())); + return new GPSFixMovingImpl(position, timePoint, speedWithBearing); + } + + private ObjectOutput getOutputStream(Competitor competitor) throws FileNotFoundException, IOException { + return new ObjectOutputStream(new FileOutputStream(getFile(competitor))); + } + + private File getFile(Competitor competitor) { + return new File("resources/"+getEvent().getName()+"-"+competitor.getName()); + } + + protected String getExpectedEventName() { + return "Kieler Woche"; + } +}