Merge remote-tracking branch 'origin/master' into simulator

Conflicts:
	java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF
	java/com.sap.sailing.domain.persistence/META-INF/MANIFEST.MF
	java/com.sap.sailing.domain.swisstimingadapter.test/META-INF/MANIFEST.MF
	java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/EndToEndListeningStoreAndFowardTest.java
	java/com.sap.sailing.domain.tractracadapter/META-INF/MANIFEST.MF
	java/com.sap.sailing.domain/META-INF/MANIFEST.MF
	java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/GwtTestCaseColumnToggling.java
	java/com.sap.sailing.gwt.ui/AdminConsole.css
	java/com.sap.sailing.gwt.ui/CommonControls.css
	java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF
	java/com.sap.sailing.gwt.ui/RaceBoard.css
	java/com.sap.sailing.gwt.ui/highcharts/js/adapters/mootools-adapter.js
	java/com.sap.sailing.gwt.ui/highcharts/js/adapters/prototype-adapter.js
	java/com.sap.sailing.gwt.ui/highcharts/js/highcharts.js
	java/com.sap.sailing.gwt.ui/highcharts/js/modules/exporting.js
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetWindInfoAction.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ImagesBarCell.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigImagesBarCell.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardCreateDialog.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardDialog.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardEditDialog.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardRaceConfigImagesBarCell.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceColumnInLeaderboardDialog.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionProvider.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LogoAndTitlePanel.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettingsDialogComponent.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanelSettingsDialogComponent.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardResources.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsFactory.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardViewModes.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CourseDTO.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/MarkPassingTimesDTO.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceTimesInfoDTO.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/components/ComponentResources.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/controls/slider/SliderBar.css
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/controls/slider/SliderBar.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/BoatCanvasOverlay.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/RaceMap.java
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/RaceMapSettings.java
	java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Leaderboard.gwt.xml
	java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/RaceBoard.gwt.xml
	java/com.sap.sailing.kiworesultimport.test/.project
	java/com.sap.sailing.kiworesultimport/.project
	java/com.sap.sailing.kiworesultimport/pom.xml
	java/com.sap.sailing.mongodb.test/META-INF/MANIFEST.MF
	java/com.sap.sailing.mongodb/src/com/sap/sailing/mongodb/MongoDBConfiguration.java
	java/com.sap.sailing.server/SailingServer (No Proxy).launch
	java/com.sap.sailing.server/SailingServer (Proxy).launch
	java/com.sap.sailing.server/WEB-INF/web.xml
	java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java
	java/com.sap.sailing.server/src/com/sap/sailing/server/impl/Activator.java
	java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java
	java/com.sap.sailing.targetplatform.base/site.xml
	java/com.sap.sailing.targetplatform/scripts/createLocalBaseP2repository.sh
	java/com.sap.sailing.xcelsiusadapter/META-INF/MANIFEST.MF
	java/com.sap.sailing.xcelsiusadapter/src/com/sap/sailing/xcelsiusadapter/Action.java
	java/com.sap.sailing.xcelsiusadapter/src/com/sap/sailing/xcelsiusadapter/GPSPerRace.java
	java/com.sap.sailing.xcelsiusadapter/src/com/sap/sailing/xcelsiusadapter/ListEvents.java
	java/com.sap.sailing.xcelsiusadapter/src/com/sap/sailing/xcelsiusadapter/RankPerLeg.java
	java/com.sap.sailing.xcelsiusadapter/src/com/sap/sailing/xcelsiusadapter/RankPerLeg2.java
	java/com.sap.sailing.xcelsiusadapter/src/com/sap/sailing/xcelsiusadapter/RankPerRace.java
	java/com.sap.sailing.xcelsiusadapter/src/com/sap/sailing/xcelsiusadapter/XcelsiusApp.java
	java/com.tractrac.resultapi/META-INF/MANIFEST.MF
	java/com.tractrac.resultapi/javadoc/allclasses-frame.html
	java/com.tractrac.resultapi/javadoc/allclasses-noframe.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/LiveResult.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/LiveResultItem.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/MarkResult.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/MarkResultItem.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/PerLegResult.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/ResultGenerator.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/class-use/LiveResult.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/class-use/LiveResultItem.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/class-use/MarkResult.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/class-use/MarkResultItem.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/class-use/PerLegResult.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/class-use/ResultGenerator.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/package-frame.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/package-summary.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/package-tree.html
	java/com.tractrac.resultapi/javadoc/com/tractrac/ResultAPI/package-use.html
	java/com.tractrac.resultapi/javadoc/constant-values.html
	java/com.tractrac.resultapi/javadoc/deprecated-list.html
	java/com.tractrac.resultapi/javadoc/help-doc.html
	java/com.tractrac.resultapi/javadoc/index-files/index-1.html
	java/com.tractrac.resultapi/javadoc/index-files/index-2.html
	java/com.tractrac.resultapi/javadoc/index-files/index-3.html
	java/com.tractrac.resultapi/javadoc/index-files/index-4.html
	java/com.tractrac.resultapi/javadoc/index-files/index-5.html
	java/com.tractrac.resultapi/javadoc/index-files/index-6.html
	java/com.tractrac.resultapi/javadoc/index-files/index-7.html
	java/com.tractrac.resultapi/javadoc/index-files/index-8.html
	java/com.tractrac.resultapi/javadoc/index-files/index-9.html
	java/com.tractrac.resultapi/javadoc/index.html
	java/com.tractrac.resultapi/javadoc/overview-tree.html
	java/com.tractrac.resultapi/javadoc/package-list
	java/com.tractrac.resultapi/javadoc/stylesheet.css
	java/com.tractrac.resultapi/src/com/tractrac/ResultAPITester.java
	java/org.moxieapps.gwt.highcharts/META-INF/MANIFEST.MF
	java/org.moxieapps.gwt.highcharts/pom.xml
	java/pom.xml
	java/target/configuration/jetty/etc/jetty.xml
	java/target/configuration/logging.properties
	java/target/configuration/logging_debug.properties
	java/target/install
	python/.gitignore
	python/bootstrap.py
	python/buildout.cfg
	python/dev.cfg
	python/prod.cfg
	python/src/sailing.connector/README.txt
	python/src/sailing.connector/docs/HISTORY.txt
	python/src/sailing.connector/sailing/__init__.py
	python/src/sailing.connector/sailing/connector/__init__.py
	python/src/sailing.connector/sailing/connector/provider.py
	python/src/sailing.connector/setup.py
	python/src/sailing.db/README.txt
	python/src/sailing.db/docs/HISTORY.txt
	python/src/sailing.db/sailing/__init__.py
	python/src/sailing.db/sailing/db/__init__.py
	python/src/sailing.db/sailing/db/config.py
	python/src/sailing.db/sailing/db/database.py
	python/src/sailing.db/sailing/db/model/__init__.py
	python/src/sailing.db/sailing/db/model/base.py
	python/src/sailing.db/sailing/db/model/entities.py
	python/src/sailing.db/sailing/db/model/util.py
	python/src/sailing.db/sailing/db/monitoring.py
	python/src/sailing.db/setup.py
	python/src/sailing.web/MANIFEST.in
	python/src/sailing.web/README.txt
	python/src/sailing.web/docs/HISTORY.txt
	python/src/sailing.web/sailing/__init__.py
	python/src/sailing.web/sailing/web/__init__.py
	python/src/sailing.web/sailing/web/adapter/configure.zcml
	python/src/sailing.web/sailing/web/browser/configure.zcml
	python/src/sailing.web/sailing/web/browser/core.py
	python/src/sailing.web/sailing/web/browser/functions.py
	python/src/sailing.web/sailing/web/browser/moderator-static/app.js
	python/src/sailing.web/sailing/web/browser/moderator-static/index.html
	python/src/sailing.web/sailing/web/browser/moderator-static/iphone.html
	python/src/sailing.web/sailing/web/browser/moderator-static/jquery.js
	python/src/sailing.web/sailing/web/browser/moderator-static/mobile.css
	python/src/sailing.web/sailing/web/browser/moderator-static/overall.html
	python/src/sailing.web/sailing/web/browser/moderator-static/screen.css
	python/src/sailing.web/sailing/web/browser/static/core.js
	python/src/sailing.web/sailing/web/browser/static/css/jquery-ui-1.8.11.custom.css.txt
	python/src/sailing.web/sailing/web/browser/static/css/jquery.timeslider.css.txt
	python/src/sailing.web/sailing/web/browser/static/css/styles.css.txt
	python/src/sailing.web/sailing/web/browser/static/js/jquery-1.4.4.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui-timepicker-addon.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery-ui-i18n.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-af.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-ar-DZ.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-ar.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-az.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-bg.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-bs.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-ca.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-cs.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-da.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-de.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-el.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-en-AU.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-en-GB.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-en-NZ.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-eo.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-es.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-et.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-eu.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-fa.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-fi.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-fo.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-fr-CH.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-fr.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-gl.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-he.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-hr.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-hu.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-hy.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-id.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-is.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-it.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-ja.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-ko.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-kz.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-lt.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-lv.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-ml.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-ms.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-nl.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-no.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-pl.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-pt-BR.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-pt.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-rm.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-ro.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-ru.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-sk.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-sl.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-sq.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-sr-SR.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-sr.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-sv.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-ta.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-th.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-tj.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-tr.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-uk.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-vi.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-zh-CN.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-zh-HK.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/i18n/jquery.ui.datepicker-zh-TW.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.effects.core.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.accordion.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.autocomplete.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.core.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.datepicker.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.dialog.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.mouse.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.position.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.resizable.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.selectable.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.slider.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.sortable.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.tabs.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery-ui/jquery.ui.widget.min.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery.form.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery.googlemaps1.01.js
	python/src/sailing.web/sailing/web/browser/static/js/jquery.timeslider.js
	python/src/sailing.web/sailing/web/browser/static/js/mapmarker.js
	python/src/sailing.web/sailing/web/browser/static/maps.js
	python/src/sailing.web/sailing/web/browser/templates/database-stats.pt
	python/src/sailing.web/sailing/web/browser/templates/general-competitor-info.pt
	python/src/sailing.web/sailing/web/browser/templates/general-race-info.pt
	python/src/sailing.web/sailing/web/browser/templates/iphone-status.pt
	python/src/sailing.web/sailing/web/browser/templates/java-connector-custom-race.pt
	python/src/sailing.web/sailing/web/browser/templates/java-connector-select-races.pt
	python/src/sailing.web/sailing/web/browser/templates/java-connector.pt
	python/src/sailing.web/sailing/web/browser/templates/leaderboard-info.pt
	python/src/sailing.web/sailing/web/browser/templates/leaderboard-live.pt
	python/src/sailing.web/sailing/web/browser/templates/leaderboard.pt
	python/src/sailing.web/sailing/web/browser/templates/live-info-view.pt
	python/src/sailing.web/sailing/web/browser/templates/live-info.pt
	python/src/sailing.web/sailing/web/browser/templates/maintemplate.pt
	python/src/sailing.web/sailing/web/browser/templates/map-overview-details.pt
	python/src/sailing.web/sailing/web/browser/templates/map-overview.pt
	python/src/sailing.web/sailing/web/browser/templates/udp-configurator.pt
	python/src/sailing.web/sailing/web/browser/templates/waypoint-info.pt
	python/src/sailing.web/sailing/web/browser/templates/wind-settings-info.pt
	python/src/sailing.web/sailing/web/browser/templates/wind-settings.pt
	python/src/sailing.web/sailing/web/config.py
	python/src/sailing.web/sailing/web/configure.zcml
	python/src/sailing.web/sailing/web/interfaces.py
	python/src/sailing.web/sailing/web/tests/data/events.txt
	python/src/sailing.web/sailing/web/tests/data/events2.txt
	python/src/sailing.web/sailing/web/tests/data/events2updated.txt
	python/src/sailing.web/sailing/web/tests/data/fixes.txt
	python/src/sailing.web/sailing/web/tests/data/race.txt
	python/src/sailing.web/sailing/web/tests/data/race_t1.txt
	python/src/sailing.web/sailing/web/tests/data/waypoints.txt
	python/src/sailing.web/sailing/web/tests/test_base.py
	python/src/sailing.web/sailing/web/tests/utils.py
	python/src/sailing.web/sailing/web/util.py
	python/src/sailing.web/setup.py
	python/templates/app_debug.sh
	python/templates/app_production_start.sh
	python/templates/app_production_stop.sh
	python/templates/db-dev.ini
	python/templates/db.ini
	python/templates/mongodb-master.cfg
	python/templates/webserver-dev.ini
	python/templates/webserver-prod.ini
This commit is contained in:
Nidhi Sawhney committed 2012-07-02 11:01:41 +02:00
commit fc208742ce
1168 files changed
+45145 -47043

No files matched your search

@@ -10,13 +10,13 @@ import junit.framework.Assert;
import org.junit.Test;
import com.sap.sailing.domain.common.EventNameAndRaceName;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
public class IdentifierSerializationTest {
@Test
public void identifierSerializationTest() throws IOException, ClassNotFoundException {
EventNameAndRaceName original = new EventNameAndRaceName("TestEvent", "Test Race");
RegattaNameAndRaceName original = new RegattaNameAndRaceName("TestEvent", "Test Race");
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);
@@ -27,7 +27,7 @@ public class IdentifierSerializationTest {
oos.writeObject(original);
oos.flush();
EventNameAndRaceName streamed = (EventNameAndRaceName) ois.readObject();
RegattaNameAndRaceName streamed = (RegattaNameAndRaceName) ois.readObject();
ois.close();
oos.close();
@@ -6,6 +6,7 @@ import static org.junit.Assert.assertNotNull;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.server.RacingEventService;
@@ -25,12 +26,12 @@ public class LeaderboardDiscardingRulesTest {
@Test
public void testDiscardingRoules() {
racingEventService.removeLeaderboard(LEADERBOARDNAME);
racingEventService.addLeaderboard(LEADERBOARDNAME, new int[] { 1, 4 });
Leaderboard leaderboard = racingEventService.getLeaderboardByName(LEADERBOARDNAME);
racingEventService.addFlexibleLeaderboard(LEADERBOARDNAME, new int[] { 1, 4 });
FlexibleLeaderboard leaderboard = (FlexibleLeaderboard) racingEventService.getLeaderboardByName(LEADERBOARDNAME);
assertNotNull(leaderboard);
int[] discardingRoulesNew = new int[] { 1, 5 };
leaderboard.setResultDiscardingRule(new ResultDiscardingRuleImpl(discardingRoulesNew));
racingEventService.updateStoredLeaderboard(leaderboard);
racingEventService.updateStoredFlexibleLeaderboard(leaderboard);
Leaderboard leaderboardNew = racingEventService.getLeaderboardByName(LEADERBOARDNAME);
assertNotNull(leaderboardNew);
int[] result = leaderboardNew.getResultDiscardingRule().getDiscardIndexResultsStartingWithHowManyRaces();
@@ -9,7 +9,9 @@ import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.common.DefaultLeaderboardName;
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.mongodb.MongoDBService;
import com.sap.sailing.operationaltransformation.Peer;
@@ -19,7 +21,7 @@ import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
import com.sap.sailing.server.impl.RacingEventServiceImpl;
import com.sap.sailing.server.operationaltransformation.AddColumnToLeaderboard;
import com.sap.sailing.server.operationaltransformation.CreateLeaderboard;
import com.sap.sailing.server.operationaltransformation.CreateFlexibleLeaderboard;
import com.sap.sailing.server.operationaltransformation.MoveLeaderboardColumnUp;
import com.sap.sailing.server.operationaltransformation.OperationalTransformer;
import com.sap.sailing.server.operationaltransformation.RemoveLeaderboard;
@@ -48,7 +50,7 @@ public class OperationalTransformationTest {
@Test
public void testAddLeaderboard() {
RacingEventServiceOperation<Leaderboard> addLeaderboardOp = new CreateLeaderboard(LEADERBOARDNAME, new int[] { 5 });
RacingEventServiceOperation<FlexibleLeaderboard> addLeaderboardOp = new CreateFlexibleLeaderboard(LEADERBOARDNAME, new int[] { 5 });
server.apply(addLeaderboardOp);
server.waitForNotRunning();
replica.waitForNotRunning();
@@ -61,7 +63,7 @@ public class OperationalTransformationTest {
@Test
public void testAddColumnToLeaderboardOnClientAndRemoveLeaderboardOnServer() throws InterruptedException {
RacingEventServiceOperation<Void> addLeaderboardColumn = new AddColumnToLeaderboard(
RacingEventServiceOperation<RaceColumn> addLeaderboardColumn = new AddColumnToLeaderboard(
"newColumn", DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, /* medalRace */ true);
server.apply(addLeaderboardColumn);
RacingEventServiceOperation<Void> removeDefaultLeaderboard = new RemoveLeaderboard(DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME);
@@ -74,10 +76,10 @@ public class OperationalTransformationTest {
@Test
public void testAddOneColumnOnEachSideThenMoveOneUpOnServerAndRemoveLeaderboardOnClient() throws InterruptedException {
RacingEventServiceOperation<Void> addLeaderboardColumnOnServer = new AddColumnToLeaderboard(
RacingEventServiceOperation<RaceColumn> addLeaderboardColumnOnServer = new AddColumnToLeaderboard(
"newColumn1", DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, /* medalRace */ true);
server.apply(addLeaderboardColumnOnServer);
RacingEventServiceOperation<Void> addLeaderboardColumnOnReplica = new AddColumnToLeaderboard(
RacingEventServiceOperation<RaceColumn> addLeaderboardColumnOnReplica = new AddColumnToLeaderboard(
"newColumn2", DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, /* medalRace */ true);
replica.apply(addLeaderboardColumnOnReplica);
replica.waitForNotRunning();
@@ -4,9 +4,10 @@ import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Set;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.tracking.DynamicTrackedEvent;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.domain.tracking.RacesHandle;
import com.sap.sailing.domain.tracking.WindStore;
@@ -14,7 +15,7 @@ import com.sap.sailing.domain.tracking.WindStore;
public class RaceTrackerMock implements RaceTracker{
private Long id;
private Event event;
private Regatta regatta;
private Set<RaceDefinition> raceDefinitions;
private boolean isTracking;
@@ -24,10 +25,10 @@ public class RaceTrackerMock implements RaceTracker{
public RaceTrackerMock(Long id, Event event, Set<RaceDefinition> raceDefinitions, boolean isTracking) {
public RaceTrackerMock(Long id, Regatta regatta, Set<RaceDefinition> raceDefinitions, boolean isTracking) {
super();
this.id = id;
this.event = event;
this.regatta = regatta;
this.raceDefinitions = raceDefinitions;
this.isTracking = isTracking;
}
@@ -50,8 +51,8 @@ public class RaceTrackerMock implements RaceTracker{
}
@Override
public Event getEvent() {
return event;
public Regatta getRegatta() {
return regatta;
}
@Override
@@ -65,7 +66,7 @@ public class RaceTrackerMock implements RaceTracker{
}
@Override
public DynamicTrackedEvent getTrackedEvent() {
public DynamicTrackedRegatta getTrackedRegatta() {
// TODO Auto-generated method stub
return null;
}
@@ -80,4 +81,10 @@ public class RaceTrackerMock implements RaceTracker{
return id;
}
@Override
public Set<RegattaAndRaceIdentifier> getRaceIdentifiers() {
// TODO Auto-generated method stub
return null;
}
}
@@ -19,15 +19,15 @@ import org.junit.Test;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.EventImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.domain.tracking.TrackedEvent;
import com.sap.sailing.domain.tracking.TrackedRegatta;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.server.RacingEventService;
@@ -41,7 +41,7 @@ public class RaceTrackerStartStopTest {
private final static String BOATCLASSNAME = "HAPPYBOATCLASS";
private RacingEventServiceImplMock racingEventService;
private Event event;
private Regatta regatta;
private BoatClass boatClass;
private Set<RaceTracker> raceTrackerSet = new HashSet<RaceTracker>();
@@ -57,22 +57,22 @@ public class RaceTrackerStartStopTest {
public void setUp() {
racingEventService = new RacingEventServiceImplMock();
boatClass = new BoatClassImpl(BOATCLASSNAME, /* typicallyStartsUpwind */ true);
event = new EventImpl(EVENTNAME, boatClass);
racingEventService.getEventsByName().put(EVENTNAME, event);
TrackedEvent trackedEvent1 = racingEventService.getOrCreateTrackedEvent(event);
racingEventService.getEventsByNameMap().put(EVENTNAME, event);
regatta = new RegattaImpl(EVENTNAME, boatClass, /* trackedRegattaRegistry */ null);
racingEventService.getEventsByName().put(EVENTNAME, regatta);
TrackedRegatta trackedRegatta1 = racingEventService.getOrCreateTrackedRegatta(regatta);
racingEventService.getEventsByNameMap().put(EVENTNAME, regatta);
raceTrackerSet = new HashSet<RaceTracker>();
raceDef1 = new RaceDefinitionImpl(RACENAME1, new CourseImpl("Course1", new ArrayList<Waypoint>()), boatClass, new ArrayList<Competitor>());
raceDef2 = new RaceDefinitionImpl(RACENAME2, new CourseImpl("Course2", new ArrayList<Waypoint>()), boatClass, new ArrayList<Competitor>());
raceDef3 = new RaceDefinitionImpl(RACENAME3, new CourseImpl("Course3", new ArrayList<Waypoint>()), boatClass, new ArrayList<Competitor>());
event.addRace(raceDef1);
trackedEvent1.createTrackedRace(raceDef1, /* windStore */ EmptyWindStore.INSTANCE, /* millisecondsOverWhichToAverageWind */ 0l,
regatta.addRace(raceDef1);
trackedRegatta1.createTrackedRace(raceDef1, /* windStore */ EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 0l, /* millisecondsOverWhichToAverageWind */ 0l,
/* millisecondsOverWhichToAverageSpeed */ 0l, /* raceDefinitionSetToUpdate */ null);
event.addRace(raceDef2);
trackedEvent1.createTrackedRace(raceDef2, /* windStore */ EmptyWindStore.INSTANCE, /* millisecondsOverWhichToAverageWind */ 0l,
regatta.addRace(raceDef2);
trackedRegatta1.createTrackedRace(raceDef2, /* windStore */ EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 0l, /* millisecondsOverWhichToAverageWind */ 0l,
/* millisecondsOverWhichToAverageSpeed */ 0l, /* raceDefinitionSetToUpdate */ null);
event.addRace(raceDef3);
trackedEvent1.createTrackedRace(raceDef3, /* windStore */ EmptyWindStore.INSTANCE, /* millisecondsOverWhichToAverageWind */ 0l,
regatta.addRace(raceDef3);
trackedRegatta1.createTrackedRace(raceDef3, /* windStore */ EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 0l, /* millisecondsOverWhichToAverageWind */ 0l,
/* millisecondsOverWhichToAverageSpeed */ 0l, /* raceDefinitionSetToUpdate */ null);
Set<RaceDefinition> raceDefinitionSetRace1 = new HashSet<RaceDefinition>();
raceDefinitionSetRace1.add(raceDef1);
@@ -86,33 +86,33 @@ public class RaceTrackerStartStopTest {
Long trackerID1 = new Long(1);
Long trackerID2 = new Long(2);
Long trackerID3 = new Long(3);
raceTracker1 = new RaceTrackerMock(new Long(1), event, raceDefinitionSetRace1, true);
raceTracker2 = new RaceTrackerMock(new Long(2), event, raceDefinitionSetRace2, true);
raceTracker3 = new RaceTrackerMock(new Long(3), event, raceDefinitionSetRace3, true);
raceTracker1 = new RaceTrackerMock(new Long(1), regatta, raceDefinitionSetRace1, true);
raceTracker2 = new RaceTrackerMock(new Long(2), regatta, raceDefinitionSetRace2, true);
raceTracker3 = new RaceTrackerMock(new Long(3), regatta, raceDefinitionSetRace3, true);
raceTrackerSet.add(raceTracker1);
raceTrackerSet.add(raceTracker2);
raceTrackerSet.add(raceTracker3);
racingEventService.getRaceTrackersByEventMap().put(event, raceTrackerSet);
racingEventService.getRaceTrackersByEventMap().put(regatta, raceTrackerSet);
racingEventService.getRaceTrackersByIDMap().put(trackerID1, raceTracker1);
racingEventService.getRaceTrackersByIDMap().put(trackerID2, raceTracker2);
racingEventService.getRaceTrackersByIDMap().put(trackerID3, raceTracker3);
}
/**
* This test method tests, if the {@link RacingEventService#stopTracking(Event, RaceDefinition) stopTracking} method works correctly.
* This test method tests, if the {@link RacingEventService#stopTracking(Regatta, RaceDefinition) stopTracking} method works correctly.
*/
@Test
public void testStopTrackingRace() throws MalformedURLException, IOException, InterruptedException {
Event event = racingEventService.getEventByName(EVENTNAME);
TrackedEvent trackedEvent = racingEventService.getTrackedEvent(event);
assertNotNull(event.getRaceByName(RACENAME2));
assertNotNull(trackedEvent.getExistingTrackedRace(event.getRaceByName(RACENAME2)));
racingEventService.stopTracking(event, raceDef2);
Regatta regatta = racingEventService.getRegattaByName(EVENTNAME);
TrackedRegatta trackedRegatta = racingEventService.getTrackedRegatta(regatta);
assertNotNull(regatta.getRaceByName(RACENAME2));
assertNotNull(trackedRegatta.getExistingTrackedRace(regatta.getRaceByName(RACENAME2)));
racingEventService.stopTracking(regatta, raceDef2);
// the raceDef2 should still be part of the event, and the corresponding tracked race should still be part
// of the tracked event
assertNotNull(event.getRaceByName(RACENAME2));
assertNotNull(regatta.getRaceByName(RACENAME2));
boolean foundTrackedRaceForRaceDef2 = false;
for (TrackedRace trackedRace : trackedEvent.getTrackedRaces()) {
for (TrackedRace trackedRace : trackedRegatta.getTrackedRaces()) {
if (trackedRace.getRace().getName().equals(RACENAME2)) {
foundTrackedRaceForRaceDef2 = true;
}
@@ -129,36 +129,37 @@ public class RaceTrackerStartStopTest {
// The RaceTrakcersByEvent map should contain a tracker with a set of RaceDefinitions, containing the
// raceDefinition1
assertEquals(1, racingEventService.getRaceTrackersByEventMap().size());
Iterator<RaceTracker> raceTrackerIter = racingEventService.getRaceTrackersByEventMap().get(event).iterator();
Iterator<RaceTracker> raceTrackerIter = racingEventService.getRaceTrackersByEventMap().get(regatta).iterator();
while (raceTrackerIter.hasNext()) {
RaceTracker currentTracker = raceTrackerIter.next();
assertSame(raceTracker1, currentTracker);
}
}
/**
* This test methods checks if the {@link RacingEventService#removeRace(Event, RaceDefinition) removeRace} method works correctly
* This test methods checks if the {@link RacingEventService#removeRace(Regatta, RaceDefinition) removeRace} method works correctly
*/
@Test
public void testRemoveRace() throws MalformedURLException, IOException, InterruptedException {
Event event = racingEventService.getEventByName(EVENTNAME);
TrackedEvent trackedEvent = racingEventService.getTrackedEvent(event);
assertNotNull(event.getRaceByName(RACENAME2));
assertNotNull(trackedEvent.getExistingTrackedRace(event.getRaceByName(RACENAME2)));
racingEventService.removeRace(event, raceDef2);
Regatta regatta = racingEventService.getRegattaByName(EVENTNAME);
TrackedRegatta trackedRegatta = racingEventService.getTrackedRegatta(regatta);
assertNotNull(regatta.getRaceByName(RACENAME2));
assertNotNull(trackedRegatta.getExistingTrackedRace(regatta.getRaceByName(RACENAME2)));
racingEventService.removeRace(regatta, raceDef2);
// the raceDef2 should be removed from the event, and the corresponding tracked race should be removed
// from the tracked event
assertNull(event.getRaceByName(RACENAME2));
assertNull(regatta.getRaceByName(RACENAME2));
boolean foundTrackedRaceForRaceDef2 = false;
for (TrackedRace trackedRace : trackedEvent.getTrackedRaces()) {
for (TrackedRace trackedRace : trackedRegatta.getTrackedRaces()) {
if (trackedRace.getRace().getName().equals(RACENAME2)) {
foundTrackedRaceForRaceDef2 = true;
}
}
assertFalse(foundTrackedRaceForRaceDef2);
// The trackers map should still contain the raceTrackers
assertTrue(racingEventService.getRaceTrackersByEventMap().get(event).contains(raceTracker1));
assertTrue(racingEventService.getRaceTrackersByEventMap().get(event).contains(raceTracker2));
assertTrue(racingEventService.getRaceTrackersByEventMap().get(event).contains(raceTracker3));
assertTrue(racingEventService.getRaceTrackersByEventMap().get(regatta).contains(raceTracker1));
assertTrue(racingEventService.getRaceTrackersByEventMap().get(regatta).contains(raceTracker2));
assertTrue(racingEventService.getRaceTrackersByEventMap().get(regatta).contains(raceTracker3));
// The raceTrackerMap should still contain the raceTrackers. These raceTracker should not contain the raceDefinition raceDef2 anymore
assertTrue(racingEventService.getRaceTrackersByIDMap().containsValue(raceTracker1));
assertTrue(racingEventService.getRaceTrackersByIDMap().containsValue(raceTracker2));
@@ -176,17 +177,17 @@ public class RaceTrackerStartStopTest {
}
/**
* This test methods checks if the {@link RacingEventService#removeRace(Event, RaceDefinition) removeRace} method works correctly if the
* This test methods checks if the {@link RacingEventService#removeRace(Regatta, RaceDefinition) removeRace} method works correctly if the
* race to be stopped is the last race of a tracker
*/
@Test
public void testRemoveLastRaceOfTracker() throws MalformedURLException, IOException, InterruptedException {
racingEventService.removeRace(event, raceDef1);
racingEventService.removeRace(event, raceDef2);
racingEventService.removeRace(regatta, raceDef1);
racingEventService.removeRace(regatta, raceDef2);
// The event map should still contain the raceTrackers except of raceTracker1 and raceTracker2
assertFalse(racingEventService.getRaceTrackersByEventMap().get(event).contains(raceTracker1));
assertFalse(racingEventService.getRaceTrackersByEventMap().get(event).contains(raceTracker2));
assertTrue(racingEventService.getRaceTrackersByEventMap().get(event).contains(raceTracker3));
assertFalse(racingEventService.getRaceTrackersByEventMap().get(regatta).contains(raceTracker1));
assertFalse(racingEventService.getRaceTrackersByEventMap().get(regatta).contains(raceTracker2));
assertTrue(racingEventService.getRaceTrackersByEventMap().get(regatta).contains(raceTracker3));
// The RaceTrackerByID map should still contain raceTracker3, but not raceTracker1 and raceTracker2 anymore
assertFalse(racingEventService.getRaceTrackersByIDMap().containsValue(raceTracker1));
assertFalse(racingEventService.getRaceTrackersByIDMap().containsValue(raceTracker2));
@@ -4,6 +4,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.MalformedURLException;
@@ -11,21 +12,24 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Set;
import java.util.logging.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.tracking.RaceListener;
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.TrackedRegatta;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.domain.tractracadapter.TracTracConnectionConstants;
import com.sap.sailing.server.impl.RacingEventServiceImpl;
public class RaceTrackerTest {
private static final Logger logger = Logger.getLogger(RaceTrackerTest.class.getName());
protected static final boolean tractracTunnel = Boolean.valueOf(System.getProperty("tractrac.tunnel", "false"));
protected static final String tractracTunnelHost = System.getProperty("tractrac.tunnel.host", "localhost");
private final URL paramUrl;
@@ -55,18 +59,25 @@ public class RaceTrackerTest {
@Before
public void setUp() throws Exception {
service = new RacingEventServiceImpl();
logger.info("Calling service.addTracTracRace");
raceHandle = service.addTracTracRace(paramUrl, liveUri, storedUri, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000);
raceHandle.getRaces(); // wait for RaceDefinition to be completely wired in Event
logger.info("Calling raceHandle.getRaces()");
Set<RaceDefinition> races = raceHandle.getRaces(); // wait for RaceDefinition to be completely wired in Regatta
logger.info("Obtained races: "+races);
assertTrue(!races.isEmpty());
// TODO the following assertion fails; this suggests that the race obtained above hasn't properly been entered into the regatta. Why???
assertTrue(!Util.isEmpty(raceHandle.getRegatta().getAllRaces()));
}
@After
public void tearDown() throws MalformedURLException, IOException, InterruptedException {
service.stopTracking(raceHandle.getEvent());
logger.info("calling stopTrackingAndRemove("+raceHandle.getRegatta().getName()+" ("+raceHandle.getRegatta().hashCode()+"))");
service.stopTrackingAndRemove(raceHandle.getRegatta());
}
private TrackedRace getTrackedRace(TrackedEvent trackedEvent) throws InterruptedException {
private TrackedRace getTrackedRace(TrackedRegatta trackedRegatta) throws InterruptedException {
final TrackedRace[] trackedRaces = new TrackedRace[1];
trackedEvent.addRaceListener(new RaceListener() {
trackedRegatta.addRaceListener(new RaceListener() {
@Override
public void raceAdded(TrackedRace trackedRace) {
synchronized (trackedRaces) {
@@ -88,49 +99,57 @@ public class RaceTrackerTest {
@Test
public void testInitialization() throws InterruptedException {
logger.entering(getClass().getName(), "testInitialization");
Set<RaceDefinition> races = raceHandle.getRaces();
assertNotNull(races);
assertFalse(races.isEmpty());
assertNotNull(getTrackedRace(raceHandle.getTrackedEvent()));
assertNotNull(getTrackedRace(raceHandle.getTrackedRegatta()));
logger.exiting(getClass().getName(), "testInitialization");
}
@Test
public void testStopTracking() throws Exception {
TrackedEvent oldTrackedEvent = raceHandle.getTrackedEvent();
TrackedRace oldTrackedRace = getTrackedRace(oldTrackedEvent);
logger.entering(getClass().getName(), "testStopTracking");
assertTrue(!Util.isEmpty(raceHandle.getRegatta().getAllRaces()));
TrackedRegatta oldTrackedRegatta = raceHandle.getTrackedRegatta();
TrackedRace oldTrackedRace = getTrackedRace(oldTrackedRegatta);
RaceDefinition oldRaceDefinition = oldTrackedRace.getRace();
service.removeEvent(raceHandle.getEvent());
assertTrue(!Util.isEmpty(raceHandle.getRegatta().getAllRaces()));
service.removeRegatta(raceHandle.getRegatta());
RacesHandle myRaceHandle = service.addTracTracRace(paramUrl, liveUri, storedUri, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000);
TrackedEvent newTrackedEvent = myRaceHandle.getTrackedEvent();
assertNotSame(oldTrackedEvent, newTrackedEvent);
TrackedRace newTrackedRace = getTrackedRace(newTrackedEvent);
TrackedRegatta newTrackedRegatta = myRaceHandle.getTrackedRegatta();
assertNotSame(oldTrackedRegatta, newTrackedRegatta);
TrackedRace newTrackedRace = getTrackedRace(newTrackedRegatta);
// expecting a new tracked race to be created when starting over with tracking
try {
assertNotSame(oldTrackedRace, newTrackedRace);
assertNotSame(oldRaceDefinition, newTrackedRace.getRace());
} finally {
service.stopTracking(myRaceHandle.getEvent());
service.stopTracking(myRaceHandle.getRegatta());
}
logger.exiting(getClass().getName(), "testStopTracking");
}
/**
* This test asserts that tracking the same race twice doesn't create another tracker and in particular no
* new tracked event / tracked race.
* new tracked regatta / tracked race.
* @throws Exception
*/
@Test
public void testTrackingSameRaceWithoutStopping() throws Exception {
TrackedEvent oldTrackedEvent = raceHandle.getTrackedEvent();
TrackedRace oldTrackedRace = getTrackedRace(oldTrackedEvent);
logger.entering(getClass().getName(), "testTrackingSameRaceWithoutStopping");
TrackedRegatta oldTrackedRegatta = raceHandle.getTrackedRegatta();
TrackedRace oldTrackedRace = getTrackedRace(oldTrackedRegatta);
RacesHandle myRaceHandle = service.addTracTracRace(paramUrl, liveUri, storedUri, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000);
TrackedEvent newTrackedEvent = myRaceHandle.getTrackedEvent();
TrackedRegatta newTrackedEvent = myRaceHandle.getTrackedRegatta();
TrackedRace newTrackedRace = getTrackedRace(newTrackedEvent);
// expecting a new tracked race to be created when starting over with tracking
try {
assertSame(oldTrackedRace, newTrackedRace);
assertSame(raceHandle.getRaceTracker(), myRaceHandle.getRaceTracker());
} finally {
service.stopTracking(myRaceHandle.getEvent());
service.stopTracking(myRaceHandle.getRegatta());
}
logger.exiting(getClass().getName(), "testStopTracking");
}
}
@@ -3,7 +3,7 @@ package com.sap.sailing.server.test;
import java.util.Map;
import java.util.Set;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.server.impl.RacingEventServiceImpl;
@@ -13,19 +13,19 @@ public class RacingEventServiceImplMock extends RacingEventServiceImpl {
super();
}
public Map<String, Event> getEventsByNameMap() {
return eventsByName;
public Map<String, Regatta> getEventsByNameMap() {
return regattasByName;
}
public Map<Event, Set<RaceTracker>> getRaceTrackersByEventMap() {
return raceTrackersByEvent;
public Map<Regatta, Set<RaceTracker>> getRaceTrackersByEventMap() {
return raceTrackersByRegatta;
}
public Map<Object, RaceTracker> getRaceTrackersByIDMap() {
return raceTrackersByID;
}
public Map<String, Event> getEventsByName() {
return eventsByName;
public Map<String, Regatta> getEventsByName() {
return regattasByName;
}
}