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

This commit is contained in:
fmittag
2015-02-16 19:02:37 +01:00
345 changed files with 4668 additions and 2305 deletions
+13 -6
View File
@@ -95,7 +95,7 @@ parallelexecution=0
p2local=0
if [ $# -eq 0 ]; then
echo "buildAndUpdateProduct [-b -u -g -t -a -r -o -c -p -v -m <config> -n <package> -l <port> -x <gwt-workers>] [build|install|all|hot-deploy|remote-deploy|local-deploy|release]"
echo "buildAndUpdateProduct [-b -u -g -t -a -r -o -c -p -v -m <config> -n <package> -l <port> -x <gwt-workers> -j <test-package>] [build|install|all|hot-deploy|remote-deploy|local-deploy|release]"
echo ""
echo "-g Disable GWT compile, no gwt files will be generated, old ones will be preserved."
echo "-b Build GWT permutation only for one browser and English language."
@@ -115,6 +115,7 @@ if [ $# -eq 0 ]; then
echo "-u Run without confirmation messages. Use with extreme care."
echo "-v Build local p2 respository, and use this instead of p2.sapsailing.com"
echo "-x <number-of-workers> use this many worker threads for building GWT permutations (default: 2)."
echo "-j <test-package> only execute the provided test package during tests"
echo ""
echo "build: builds the server code using Maven to $PROJECT_HOME (log to $START_DIR/build.log)"
echo ""
@@ -151,7 +152,7 @@ echo SERVERS_HOME is $SERVERS_HOME
echo BRANCH is $active_branch
echo VERSION is $VERSION_INFO
options=':bgtocparvm:n:l:s:w:x:u'
options=':bgtocparvm:n:l:s:w:x:j:u'
while getopts $options option
do
case $option in
@@ -172,6 +173,7 @@ do
u) suppress_confirmation=1;;
v) p2local=1;;
x) GWT_WORKERS=$OPTARG;;
j) TESTCASE_TO_EXECUTE=$OPTARG;;
\?) echo "Invalid option"
exit 4;;
esac
@@ -259,7 +261,7 @@ if [[ "$@" == "release" ]]; then
cp -v $PROJECT_HOME/java/target/configuration/jetty/etc/jetty-deployer.xml configuration/jetty/etc
cp -v $PROJECT_HOME/java/target/configuration/jetty/etc/realm.properties configuration/jetty/etc
cp -v $PROJECT_HOME/java/target/configuration/monitoring.properties configuration/
cp -v $PROJECT_HOME/java/target/configuration/security.properties configuration/
cp -v $PROJECT_HOME/java/target/configuration/mail.properties configuration/
cp -v $PROJECT_HOME/configuration/mongodb.cfg $ACDIR/
cp -v $PROJECT_HOME/java/target/udpmirror $ACDIR/
cp -v $PROJECT_HOME/java/target/http2udpmirror $ACDIR
@@ -535,7 +537,7 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then
fi
cd $PROJECT_HOME/java
if [ $gwtcompile -eq 1 ]; then
if [ $gwtcompile -eq 1 ] && [[ "$clean" == "clean" ]]; then
echo "INFO: Compiling GWT (rm -rf com.sap.$PROJECT_TYPE.gwt.ui/com.sap.$PROJECT_TYPE.*)"
rm -rf com.sap.$PROJECT_TYPE.gwt.ui/com.sap.$PROJECT_TYPE.*
GWT_XML_FILES=`find com.sap.$PROJECT_TYPE.gwt.ui/src/main/resources -name '*.gwt.xml'`
@@ -587,6 +589,11 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then
else
extra="$extra -DskipTests=false"
# TODO: Think about http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html
if [[ "$TESTCASE_TO_EXECUTE" != "" ]]; then
# http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html
echo "Running only testcase $TESTCASE_TO_EXECUTE"
extra="$extra -Dtest=$TESTCASE_TO_EXECUTE"
fi
fi
if [ $android -eq 0 ] && [ $gwtcompile -eq 0 ] && [ $testing -eq 0 ]; then
@@ -728,7 +735,7 @@ if [[ "$@" == "install" ]] || [[ "$@" == "all" ]]; then
if [ ! -f "$ACDIR/env.sh" ]; then
cp -v $PROJECT_HOME/java/target/env.sh $ACDIR/
cp -v $PROJECT_HOME/java/target/configuration/monitoring.properties $ACDIR/configuration/
cp -v $PROJECT_HOME/java/target/configuration/security.properties $ACDIR/configuration/
cp -v $PROJECT_HOME/java/target/configuration/mail.properties $ACDIR/configuration/
cp -v $PROJECT_HOME/java/target/configuration/logging.properties $ACDIR/configuration/
fi
@@ -809,7 +816,7 @@ if [[ "$@" == "remote-deploy" ]]; then
$SCP_CMD $PROJECT_HOME/java/target/configuration/jetty/etc/jetty-deployer.xml $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration/jetty/etc
$SCP_CMD $PROJECT_HOME/java/target/configuration/jetty/etc/realm.properties $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration/jetty/etc
$SCP_CMD $PROJECT_HOME/java/target/configuration/monitoring.properties $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration/
$SCP_CMD $PROJECT_HOME/java/target/configuration/security.properties $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration/
$SCP_CMD $PROJECT_HOME/java/target/configuration/mail.properties $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration/
$SCP_CMD $PROJECT_HOME/java/target/env.sh $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/
$SCP_CMD $PROJECT_HOME/java/target/start $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/
+95 -95
View File
@@ -1,95 +1,95 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: mgwt
Bundle-SymbolicName: com.googlecode.mgwt
Bundle-Version: 2.0.0.qualifier
Bundle-Vendor: GOOGLE
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ClassPath: lib/mgwt-2.0.0.jar,
.
Export-Package: com.googlecode.mgwt.collection.client,
com.googlecode.mgwt.collection.shared,
com.googlecode.mgwt.collection.shared.java,
com.googlecode.mgwt.css.client.updater,
com.googlecode.mgwt.css.rebind,
com.googlecode.mgwt.dom.client.event.animation,
com.googlecode.mgwt.dom.client.event.mouse,
com.googlecode.mgwt.dom.client.event.orientation,
com.googlecode.mgwt.dom.client.event.tap,
com.googlecode.mgwt.dom.client.event.touch,
com.googlecode.mgwt.dom.client.recognizer,
com.googlecode.mgwt.dom.client.recognizer.longtap,
com.googlecode.mgwt.dom.client.recognizer.pinch,
com.googlecode.mgwt.dom.client.recognizer.swipe,
com.googlecode.mgwt.dom.client.recognizer.tap,
com.googlecode.mgwt.image.client,
com.googlecode.mgwt.linker.client.cache,
com.googlecode.mgwt.linker.client.cache.event,
com.googlecode.mgwt.linker.client.cache.html5,
com.googlecode.mgwt.linker.linker,
com.googlecode.mgwt.linker.server,
com.googlecode.mgwt.linker.server.propertyprovider,
com.googlecode.mgwt.mvp.client,
com.googlecode.mgwt.mvp.client.history,
com.googlecode.mgwt.ui.client,
com.googlecode.mgwt.ui.client.animation,
com.googlecode.mgwt.ui.client.editor,
com.googlecode.mgwt.ui.client.theme.platform.button,
com.googlecode.mgwt.ui.client.theme.platform.buttonbar,
com.googlecode.mgwt.ui.client.theme.platform.carousel,
com.googlecode.mgwt.ui.client.theme.platform.dialog.options,
com.googlecode.mgwt.ui.client.theme.platform.dialog.panel,
com.googlecode.mgwt.ui.client.theme.platform.form,
com.googlecode.mgwt.ui.client.theme.platform.header,
com.googlecode.mgwt.ui.client.theme.platform.input,
com.googlecode.mgwt.ui.client.theme.platform.input.checkbox,
com.googlecode.mgwt.ui.client.theme.platform.input.listbox,
com.googlecode.mgwt.ui.client.theme.platform.input.radio,
com.googlecode.mgwt.ui.client.theme.platform.input.search,
com.googlecode.mgwt.ui.client.theme.platform.input.slider,
com.googlecode.mgwt.ui.client.theme.platform.list.celllist,
com.googlecode.mgwt.ui.client.theme.platform.list.widgetlist,
com.googlecode.mgwt.ui.client.theme.platform.main,
com.googlecode.mgwt.ui.client.theme.platform.panel,
com.googlecode.mgwt.ui.client.theme.platform.panel.pull,
com.googlecode.mgwt.ui.client.theme.platform.progress,
com.googlecode.mgwt.ui.client.theme.platform.tabbar,
com.googlecode.mgwt.ui.client.util,
com.googlecode.mgwt.ui.client.util.impl,
com.googlecode.mgwt.ui.client.widget.animation,
com.googlecode.mgwt.ui.client.widget.animation.bundle,
com.googlecode.mgwt.ui.client.widget.animation.impl,
com.googlecode.mgwt.ui.client.widget.base,
com.googlecode.mgwt.ui.client.widget.button,
com.googlecode.mgwt.ui.client.widget.button.image,
com.googlecode.mgwt.ui.client.widget.buttonbar,
com.googlecode.mgwt.ui.client.widget.carousel,
com.googlecode.mgwt.ui.client.widget.dialog,
com.googlecode.mgwt.ui.client.widget.dialog.options,
com.googlecode.mgwt.ui.client.widget.dialog.overlay,
com.googlecode.mgwt.ui.client.widget.dialog.panel,
com.googlecode.mgwt.ui.client.widget.form,
com.googlecode.mgwt.ui.client.widget.header,
com.googlecode.mgwt.ui.client.widget.image,
com.googlecode.mgwt.ui.client.widget.input,
com.googlecode.mgwt.ui.client.widget.input.checkbox,
com.googlecode.mgwt.ui.client.widget.input.listbox,
com.googlecode.mgwt.ui.client.widget.input.radio,
com.googlecode.mgwt.ui.client.widget.input.search,
com.googlecode.mgwt.ui.client.widget.input.slider,
com.googlecode.mgwt.ui.client.widget.list.celllist,
com.googlecode.mgwt.ui.client.widget.list.widgetlist,
com.googlecode.mgwt.ui.client.widget.main,
com.googlecode.mgwt.ui.client.widget.menu.overlay,
com.googlecode.mgwt.ui.client.widget.menu.swipe,
com.googlecode.mgwt.ui.client.widget.panel,
com.googlecode.mgwt.ui.client.widget.panel.flex,
com.googlecode.mgwt.ui.client.widget.panel.pull,
com.googlecode.mgwt.ui.client.widget.panel.scroll,
com.googlecode.mgwt.ui.client.widget.panel.scroll.impl,
com.googlecode.mgwt.ui.client.widget.progress,
com.googlecode.mgwt.ui.client.widget.tabbar,
com.googlecode.mgwt.ui.client.widget.tabbar.resources,
com.googlecode.mgwt.ui.client.widget.touch,
com.googlecode.mgwt.ui.generator,
com.googlecode.mgwt.ui.server.util
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: mgwt
Bundle-SymbolicName: com.googlecode.mgwt
Bundle-Version: 2.0.0.qualifier
Bundle-Vendor: GOOGLE
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ClassPath: lib/mgwt-2.0.0.jar,
.
Export-Package: com.googlecode.mgwt.collection.client,
com.googlecode.mgwt.collection.shared,
com.googlecode.mgwt.collection.shared.java,
com.googlecode.mgwt.css.client.updater,
com.googlecode.mgwt.css.rebind,
com.googlecode.mgwt.dom.client.event.animation,
com.googlecode.mgwt.dom.client.event.mouse,
com.googlecode.mgwt.dom.client.event.orientation,
com.googlecode.mgwt.dom.client.event.tap,
com.googlecode.mgwt.dom.client.event.touch,
com.googlecode.mgwt.dom.client.recognizer,
com.googlecode.mgwt.dom.client.recognizer.longtap,
com.googlecode.mgwt.dom.client.recognizer.pinch,
com.googlecode.mgwt.dom.client.recognizer.swipe,
com.googlecode.mgwt.dom.client.recognizer.tap,
com.googlecode.mgwt.image.client,
com.googlecode.mgwt.linker.client.cache,
com.googlecode.mgwt.linker.client.cache.event,
com.googlecode.mgwt.linker.client.cache.html5,
com.googlecode.mgwt.linker.linker,
com.googlecode.mgwt.linker.server,
com.googlecode.mgwt.linker.server.propertyprovider,
com.googlecode.mgwt.mvp.client,
com.googlecode.mgwt.mvp.client.history,
com.googlecode.mgwt.ui.client,
com.googlecode.mgwt.ui.client.animation,
com.googlecode.mgwt.ui.client.editor,
com.googlecode.mgwt.ui.client.theme.platform.button,
com.googlecode.mgwt.ui.client.theme.platform.buttonbar,
com.googlecode.mgwt.ui.client.theme.platform.carousel,
com.googlecode.mgwt.ui.client.theme.platform.dialog.options,
com.googlecode.mgwt.ui.client.theme.platform.dialog.panel,
com.googlecode.mgwt.ui.client.theme.platform.form,
com.googlecode.mgwt.ui.client.theme.platform.header,
com.googlecode.mgwt.ui.client.theme.platform.input,
com.googlecode.mgwt.ui.client.theme.platform.input.checkbox,
com.googlecode.mgwt.ui.client.theme.platform.input.listbox,
com.googlecode.mgwt.ui.client.theme.platform.input.radio,
com.googlecode.mgwt.ui.client.theme.platform.input.search,
com.googlecode.mgwt.ui.client.theme.platform.input.slider,
com.googlecode.mgwt.ui.client.theme.platform.list.celllist,
com.googlecode.mgwt.ui.client.theme.platform.list.widgetlist,
com.googlecode.mgwt.ui.client.theme.platform.main,
com.googlecode.mgwt.ui.client.theme.platform.panel,
com.googlecode.mgwt.ui.client.theme.platform.panel.pull,
com.googlecode.mgwt.ui.client.theme.platform.progress,
com.googlecode.mgwt.ui.client.theme.platform.tabbar,
com.googlecode.mgwt.ui.client.util,
com.googlecode.mgwt.ui.client.util.impl,
com.googlecode.mgwt.ui.client.widget.animation,
com.googlecode.mgwt.ui.client.widget.animation.bundle,
com.googlecode.mgwt.ui.client.widget.animation.impl,
com.googlecode.mgwt.ui.client.widget.base,
com.googlecode.mgwt.ui.client.widget.button,
com.googlecode.mgwt.ui.client.widget.button.image,
com.googlecode.mgwt.ui.client.widget.buttonbar,
com.googlecode.mgwt.ui.client.widget.carousel,
com.googlecode.mgwt.ui.client.widget.dialog,
com.googlecode.mgwt.ui.client.widget.dialog.options,
com.googlecode.mgwt.ui.client.widget.dialog.overlay,
com.googlecode.mgwt.ui.client.widget.dialog.panel,
com.googlecode.mgwt.ui.client.widget.form,
com.googlecode.mgwt.ui.client.widget.header,
com.googlecode.mgwt.ui.client.widget.image,
com.googlecode.mgwt.ui.client.widget.input,
com.googlecode.mgwt.ui.client.widget.input.checkbox,
com.googlecode.mgwt.ui.client.widget.input.listbox,
com.googlecode.mgwt.ui.client.widget.input.radio,
com.googlecode.mgwt.ui.client.widget.input.search,
com.googlecode.mgwt.ui.client.widget.input.slider,
com.googlecode.mgwt.ui.client.widget.list.celllist,
com.googlecode.mgwt.ui.client.widget.list.widgetlist,
com.googlecode.mgwt.ui.client.widget.main,
com.googlecode.mgwt.ui.client.widget.menu.overlay,
com.googlecode.mgwt.ui.client.widget.menu.swipe,
com.googlecode.mgwt.ui.client.widget.panel,
com.googlecode.mgwt.ui.client.widget.panel.flex,
com.googlecode.mgwt.ui.client.widget.panel.pull,
com.googlecode.mgwt.ui.client.widget.panel.scroll,
com.googlecode.mgwt.ui.client.widget.panel.scroll.impl,
com.googlecode.mgwt.ui.client.widget.progress,
com.googlecode.mgwt.ui.client.widget.tabbar,
com.googlecode.mgwt.ui.client.widget.tabbar.resources,
com.googlecode.mgwt.ui.client.widget.touch,
com.googlecode.mgwt.ui.generator,
com.googlecode.mgwt.ui.server.util
-1
View File
@@ -1 +0,0 @@
bin/
@@ -1,5 +0,0 @@
#Fri Jul 29 09:33:56 CEST 2011
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1
@@ -1,18 +0,0 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Driver
Bundle-SymbolicName: com.mongodb.driver
Bundle-Version: 2.6.2
Bundle-Vendor: MONGODB
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: lib/mongo-2.6.2.jar,
.
Export-Package: com.mongodb,
com.mongodb.gridfs,
com.mongodb.io,
com.mongodb.util,
org.bson,
org.bson.io,
org.bson.types,
org.bson.util
-3
View File
@@ -1,3 +0,0 @@
bin.includes = META-INF/,\
.,\
lib/mongo-2.6.2.jar
Binary file not shown.
+25 -25
View File
@@ -1,25 +1,25 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: SAP Sailing Common
Bundle-SymbolicName: com.sap.sailing.domain.common
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Export-Package: com.sap.sailing.domain.common,
com.sap.sailing.domain.common.abstractlog,
com.sap.sailing.domain.common.confidence,
com.sap.sailing.domain.common.confidence.impl,
com.sap.sailing.domain.common.configuration,
com.sap.sailing.domain.common.dto,
com.sap.sailing.domain.common.impl,
com.sap.sailing.domain.common.media,
com.sap.sailing.domain.common.quadtree,
com.sap.sailing.domain.common.quadtree.impl;x-friends:="com.sap.sailing.domain.test",
com.sap.sailing.domain.common.racelog,
com.sap.sailing.domain.common.racelog.tracking,
com.sap.sailing.domain.common.racelog.utils,
com.sap.sailing.domain.common.scalablevalue.impl,
com.sap.sailing.domain.common.trackfiles
Require-Bundle: com.sap.sse.datamining.shared,
com.sap.sse.common
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: SAP Sailing Common
Bundle-SymbolicName: com.sap.sailing.domain.common
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Export-Package: com.sap.sailing.domain.common,
com.sap.sailing.domain.common.abstractlog,
com.sap.sailing.domain.common.confidence,
com.sap.sailing.domain.common.confidence.impl,
com.sap.sailing.domain.common.configuration,
com.sap.sailing.domain.common.dto,
com.sap.sailing.domain.common.impl,
com.sap.sailing.domain.common.media,
com.sap.sailing.domain.common.quadtree,
com.sap.sailing.domain.common.quadtree.impl;x-friends:="com.sap.sailing.domain.test",
com.sap.sailing.domain.common.racelog,
com.sap.sailing.domain.common.racelog.tracking,
com.sap.sailing.domain.common.racelog.utils,
com.sap.sailing.domain.common.scalablevalue.impl,
com.sap.sailing.domain.common.trackfiles
Require-Bundle: com.sap.sse.datamining.shared,
com.sap.sse.common
@@ -22,6 +22,10 @@ public interface CompetitorDTO extends Serializable, MappableToDevice {
String getName();
Color getColor();
String getEmail();
boolean hasEmail();
/**
* A regular instance will simply return this object. A compacted version may compute the result by looking it up
@@ -19,16 +19,18 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
private String twoLetterIsoCountryCode;
private String threeLetterIocCountryCode;
private Color color;
private String email;
private String sailID;
private String idAsString;
private BoatClassDTO boatClass;
public CompetitorDTOImpl() {}
public CompetitorDTOImpl(String name, Color color, String twoLetterIsoCountryCode, String threeLetterIocCountryCode,
public CompetitorDTOImpl(String name, Color color, String email, String twoLetterIsoCountryCode, String threeLetterIocCountryCode,
String countryName, String sailID, String idAsString, BoatClassDTO boatClass) {
super(name);
this.color = color;
this.email = email;
this.twoLetterIsoCountryCode = twoLetterIsoCountryCode;
this.threeLetterIocCountryCode = threeLetterIocCountryCode;
this.countryName = countryName;
@@ -45,6 +47,7 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
result = prime * result + ((idAsString == null) ? 0 : idAsString.hashCode());
result = prime * result + ((sailID == null) ? 0 : sailID.hashCode());
result = prime * result + ((color == null) ? 0 : color.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((threeLetterIocCountryCode == null) ? 0 : threeLetterIocCountryCode.hashCode());
return result;
}
@@ -83,6 +86,11 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
return false;
} else if (!color.equals(other.color))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
return true;
}
@@ -124,4 +132,17 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
public Color getColor() {
return color;
}
public String getEmail() {
return email;
}
public String email(){
return email;
}
@Override
public boolean hasEmail() {
return email != null && !email.isEmpty();
}
}
@@ -92,9 +92,20 @@ public class PreviousCompetitorDTOImpl implements CompetitorDTO {
throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+
" need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization");
}
@Override
public String getEmail() {
throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+
" need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization");
}
@Override
public CompetitorDTO getCompetitorFromPrevious(LeaderboardDTO previousVersion) {
return previousVersion.competitors.get(indexInPreviousCompetitorList);
}
@Override
public boolean hasEmail() {
return false;
}
}
@@ -1,5 +1,8 @@
package com.sap.sailing.domain.common.racelog.tracking;
import com.sap.sailing.domain.common.racelog.RaceLogServletConstants;
import com.sap.sse.common.util.UrlHelper;
/**
* Shared between GWT and Android. Used for creating and deciphering the URL encoded by the QRCode, which gives the
* tracking app all necessary information for creating the device mapping of either the race or leaderboard/regatta.
@@ -13,28 +16,50 @@ package com.sap.sailing.domain.common.racelog.tracking;
*
* @author Fredrik Teschke
*/
public interface DeviceMappingConstants {
public class DeviceMappingConstants {
// According to the HTTP protocol definition (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3), only
// schema and host are case insensitive.
// But to adhere to best practices, and due to the deficiencies of some web servers and clients,
// all URL components should be treated as case insensitive, preferring _underscores_ to CamelCase.
static final String URL_BASE = "/tracking/checkin";
static final String URL_EVENT_ID = "event_id";
static final String URL_LEADERBOARD_NAME = "leaderboard_name";
static final String URL_COMPETITOR_ID_AS_STRING = "competitor_id";
static final String URL_MARK_ID_AS_STRING = "mark_id";
static final String URL_FROM_MILLIS = "from_millis";
static final String URL_TO_MILLIS = "to_millis";
public static final String URL_BASE = "/tracking/checkin";
public static final String URL_EVENT_ID = "event_id";
public static final String URL_LEADERBOARD_NAME = "leaderboard_name";
public static final String URL_COMPETITOR_ID_AS_STRING = "competitor_id";
public static final String URL_MARK_ID_AS_STRING = "mark_id";
public static final String URL_FROM_MILLIS = "from_millis";
public static final String URL_TO_MILLIS = "to_millis";
static final String JSON_COMPETITOR_ID_AS_STRING = "competitorId";
static final String JSON_MARK_ID_AS_STRING = "markId";
static final String JSON_DEVICE_UUID = "deviceUuid";
static final String JSON_DEVICE_TYPE = "deviceType";
static final String JSON_PUSH_DEVICE_ID = "pushDeviceId";
static final String JSON_FROM_MILLIS = "fromMillis";
static final String JSON_TO_MILLIS = "toMillis";
static final String JSON_TEAM_IMAGE_URI = "teamImageUri";
public static final String JSON_COMPETITOR_ID_AS_STRING = "competitorId";
public static final String JSON_MARK_ID_AS_STRING = "markId";
public static final String JSON_DEVICE_UUID = "deviceUuid";
public static final String JSON_DEVICE_TYPE = "deviceType";
public static final String JSON_PUSH_DEVICE_ID = "pushDeviceId";
public static final String JSON_FROM_MILLIS = "fromMillis";
public static final String JSON_TO_MILLIS = "toMillis";
public static final String JSON_TEAM_IMAGE_URI = "teamImageUri";
@Deprecated
static final String APK_PATH = "/apps/com.sap.sailing.android.tracking.app.apk";
public static String getDeviceMappingForRegattaLogUrl(String serverUrlWithoutTrailingSlash, String eventId,
String leaderboardName, String mappedItemType, String mappedItemId, UrlHelper helper) {
return helper.encodeUrl(serverUrlWithoutTrailingSlash + URL_BASE + "?" + URL_EVENT_ID + "=" + eventId + "&"
+ URL_LEADERBOARD_NAME + "=" + leaderboardName + "&" + mappedItemType + "="
+ mappedItemId);
}
@Deprecated
public static String getDeviceMappingForRaceLogUrl(String serverUrlWithoutTrailingSlash, String leaderboardName,
String raceColumnName, String fleetName, String mappedItemType, String mappedItemId, long fromMillis,
long toMillis, UrlHelper helper) throws QRCodeURLCreationException {
if (fromMillis > toMillis) {
throw new QRCodeURLCreationException("from can't lie after to");
}
return helper.encodeUrl(serverUrlWithoutTrailingSlash + DeviceMappingConstants.APK_PATH + "?"
+ RaceLogServletConstants.PARAMS_LEADERBOARD_NAME + "=" + leaderboardName + "&"
+ RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME + "=" + raceColumnName + "&"
+ RaceLogServletConstants.PARAMS_RACE_FLEET_NAME + "=" + fleetName + "&" + mappedItemType + "="
+ mappedItemId + "&" + DeviceMappingConstants.URL_FROM_MILLIS + "=" + fromMillis + "&"
+ DeviceMappingConstants.URL_TO_MILLIS + "=" + toMillis);
}
}
@@ -0,0 +1,9 @@
package com.sap.sailing.domain.common.racelog.tracking;
public class QRCodeURLCreationException extends Exception {
private static final long serialVersionUID = -8243995470804772458L;
public QRCodeURLCreationException(String message) {
super(message);
}
}
@@ -6,7 +6,7 @@ Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: com.sap.sse.mongodb,
com.mongodb.driver;bundle-version="2.6.2"
org.mongodb.mongo-java-driver;bundle-version="2.13.0"
Export-Package: com.sap.sailing.domain.igtimiadapter.persistence
Import-Package: org.osgi.framework
Bundle-Activator: com.sap.sailing.domain.igtimiadapter.persistence.impl.Activator
@@ -19,7 +19,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
public Iterable<String> getAccessTokens() {
List<String> result = new ArrayList<>();
final DBCollection accessTokenCollection = db.getCollection(CollectionNames.IGTIMI_ACCESS_TOKENS.name());
accessTokenCollection.ensureIndex(new BasicDBObject(FieldNames.IGTIMI_ACCESS_TOKENS_ACCESS_TOKEN.name(), 1));
accessTokenCollection.createIndex(new BasicDBObject(FieldNames.IGTIMI_ACCESS_TOKENS_ACCESS_TOKEN.name(), 1));
for (Object o : accessTokenCollection.find()) {
result.add((String) ((DBObject) o).get(FieldNames.IGTIMI_ACCESS_TOKENS_ACCESS_TOKEN.name()));
}
@@ -27,7 +27,8 @@ Import-Package: javax.ws.rs;version="1.1.1",
org.eclipse.jetty.websocket.api.extensions;version="9.0.0",
org.eclipse.jetty.websocket.client;version="9.0.0",
org.eclipse.jetty.websocket.common;version="9.0.0",
org.osgi.framework;version="1.7.0"
org.osgi.framework;version="1.7.0",
org.codehaus.jackson.jaxrs;version="1.9.13"
Web-ContextPath: /igtimi
Bundle-Activator: com.sap.sailing.domain.igtimiadapter.impl.Activator
Export-Package: com.sap.sailing.domain.igtimiadapter,
@@ -8,7 +8,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-Activator: com.sap.sailing.domain.persistence.impl.Activator
Require-Bundle: com.sap.sse.mongodb,
com.sap.sailing.domain,
com.mongodb.driver;bundle-version="2.6.2",
org.mongodb.mongo-java-driver;bundle-version="2.13.0",
com.sap.sailing.domain.common,
com.sap.sailing.domain.shared.android,
com.sap.sailing.server.gateway.serialization,
@@ -277,14 +277,14 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
}
private void ensureIndicesOnWindTracks(DBCollection windTracks) {
windTracks.ensureIndex(FieldNames.RACE_ID.name()); // for new programmatic access
windTracks.ensureIndex(FieldNames.REGATTA_NAME.name()); // for export or human look-up
windTracks.createIndex(new BasicDBObject(FieldNames.RACE_ID.name(), 1)); // for new programmatic access
windTracks.createIndex(new BasicDBObject(FieldNames.REGATTA_NAME.name(), 1)); // for export or human look-up
// for legacy access to not yet migrated fixes
windTracks.ensureIndex(new BasicDBObjectBuilder().add(FieldNames.EVENT_NAME.name(), 1)
windTracks.createIndex(new BasicDBObjectBuilder().add(FieldNames.EVENT_NAME.name(), 1)
.add(FieldNames.RACE_NAME.name(), 1).get());
// Unique index
try {
windTracks.ensureIndex(
windTracks.createIndex(
new BasicDBObjectBuilder().add(FieldNames.RACE_ID.name(), 1)
.add(FieldNames.WIND_SOURCE_NAME.name(), 1).add(FieldNames.WIND_SOURCE_ID.name(), 1)
.add(FieldNames.WIND.name() + "." + FieldNames.TIME_AS_MILLIS.name(), 1).get(),
@@ -201,7 +201,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
public DBCollection getWindTrackCollection() {
DBCollection result = database.getCollection(CollectionNames.WIND_TRACKS.name());
result.ensureIndex(new BasicDBObject(FieldNames.REGATTA_NAME.name(), null));
result.createIndex(new BasicDBObject(FieldNames.REGATTA_NAME.name(), null));
return result;
}
@@ -210,7 +210,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
DBObject index = new BasicDBObject();
index.put(FieldNames.DEVICE_ID.name(), null);
index.put(FieldNames.TIME_AS_MILLIS.name(), null);
gpsFixCollection.ensureIndex(index);
gpsFixCollection.createIndex(index);
return gpsFixCollection;
}
@@ -218,7 +218,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
DBCollection collection = database.getCollection(CollectionNames.GPS_FIXES_METADATA.name());
DBObject index = new BasicDBObject();
index.put(FieldNames.DEVICE_ID.name(), null);
collection.ensureIndex(index);
collection.createIndex(index);
return collection;
}
@@ -263,7 +263,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
public void storeLeaderboard(Leaderboard leaderboard) {
DBCollection leaderboardCollection = database.getCollection(CollectionNames.LEADERBOARDS.name());
try {
leaderboardCollection.ensureIndex(FieldNames.LEADERBOARD_NAME.name());
leaderboardCollection.createIndex(new BasicDBObject(FieldNames.LEADERBOARD_NAME.name(), 1));
} catch (NullPointerException npe) {
// sometimes, for reasons yet to be clarified, ensuring an index on the name field causes an NPE
logger.log(Level.SEVERE, "storeLeaderboard", npe);
@@ -438,7 +438,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
DBCollection leaderboardCollection = database.getCollection(CollectionNames.LEADERBOARDS.name());
try {
leaderboardGroupCollection.ensureIndex(FieldNames.LEADERBOARD_GROUP_NAME.name());
leaderboardGroupCollection.createIndex(new BasicDBObject(FieldNames.LEADERBOARD_GROUP_NAME.name(), 1));
} catch (NullPointerException npe) {
// sometimes, for reasons yet to be clarified, ensuring an index on the name field causes an NPE
logger.log(Level.SEVERE, "storeLeaderboardGroup", npe);
@@ -494,7 +494,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
@Override
public void storeSailingServer(RemoteSailingServerReference server) {
DBCollection serverCollection = database.getCollection(CollectionNames.SAILING_SERVERS.name());
serverCollection.ensureIndex(FieldNames.SERVER_NAME.name());
serverCollection.createIndex(new BasicDBObject(FieldNames.SERVER_NAME.name(), 1));
DBObject query = new BasicDBObject();
query.put(FieldNames.SERVER_NAME.name(), server.getName());
DBObject serverDBObject = new BasicDBObject();
@@ -513,7 +513,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
@Override
public void storeEvent(Event event) {
DBCollection eventCollection = database.getCollection(CollectionNames.EVENTS.name());
eventCollection.ensureIndex(FieldNames.EVENT_ID.name());
eventCollection.createIndex(new BasicDBObject(FieldNames.EVENT_ID.name(), 1));
DBObject query = new BasicDBObject();
query.put(FieldNames.EVENT_ID.name(), event.getId());
DBObject eventDBObject = new BasicDBObject();
@@ -545,7 +545,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
eventCollection.update(query, eventDBObject, /* upsrt */ true, /* multi */ false, WriteConcern.SAFE);
// now store the links to the leaderboard groups
DBCollection linksCollection = database.getCollection(CollectionNames.LEADERBOARD_GROUP_LINKS_FOR_EVENTS.name());
linksCollection.ensureIndex(FieldNames.EVENT_ID.name());
linksCollection.createIndex(new BasicDBObject(FieldNames.EVENT_ID.name(), 1));
BasicDBList lgUUIDs = new BasicDBList();
for (LeaderboardGroup lg : event.getLeaderboardGroups()) {
lgUUIDs.add(lg.getId());
@@ -588,8 +588,8 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
@Override
public void storeRegatta(Regatta regatta) {
DBCollection regattasCollection = database.getCollection(CollectionNames.REGATTAS.name());
regattasCollection.ensureIndex(FieldNames.REGATTA_NAME.name());
regattasCollection.ensureIndex(FieldNames.REGATTA_ID.name());
regattasCollection.createIndex(new BasicDBObject(FieldNames.REGATTA_NAME.name(), 1));
regattasCollection.createIndex(new BasicDBObject(FieldNames.REGATTA_ID.name(), 1));
DBObject dbRegatta = new BasicDBObject();
DBObject query = new BasicDBObject(FieldNames.REGATTA_NAME.name(), regatta.getName());
dbRegatta.put(FieldNames.REGATTA_NAME.name(), regatta.getName());
@@ -690,7 +690,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
public DBCollection getRaceLogCollection() {
DBCollection result = database.getCollection(CollectionNames.RACE_LOGS.name());
result.ensureIndex(new BasicDBObject(FieldNames.RACE_LOG_IDENTIFIER.name(), null));
result.createIndex(new BasicDBObject(FieldNames.RACE_LOG_IDENTIFIER.name(), null));
return result;
}
@@ -1279,7 +1279,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
DBCollection result = database.getCollection(CollectionNames.REGATTA_LOGS.name());
DBObject index = new BasicDBObject(FieldNames.REGATTA_LOG_IDENTIFIER_TYPE.name(), null);
index.put(FieldNames.REGATTA_LOG_IDENTIFIER_NAME.name(), null);
result.ensureIndex(index);
result.createIndex(index);
return result;
}
@@ -14,7 +14,7 @@ import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoException;
import com.mongodb.DuplicateKeyException;
import com.mongodb.WriteConcern;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
@@ -70,7 +70,7 @@ public class MediaDBImpl implements MediaDB {
dbMediaTrack.put(DbNames.Fields.ASSIGNED_RACES.name(), assignedRacesDb);
DBCollection dbVideos = getVideoCollection();
dbVideos.insert(dbMediaTrack);
return ((ObjectId) dbMediaTrack.get(DbNames.Fields._id.name())).toStringMongod();
return ((ObjectId) dbMediaTrack.get(DbNames.Fields._id.name())).toHexString();
}
@Override
@@ -99,7 +99,7 @@ public class MediaDBImpl implements MediaDB {
DBCollection dbVideos = getVideoCollection();
try {
dbVideos.insert(dbMediaTrack);
} catch (MongoException.DuplicateKey e) {
} catch (DuplicateKeyException e) {
throw new IllegalArgumentException("Duplicate key '" + dbId
+ "' caused an error when importing media (title: '" + title + "')", e);
}
@@ -109,7 +109,7 @@ public class MediaDBImpl implements MediaDB {
try {
DBCollection dbVideos = database.getCollection(DbNames.Collections.VIDEOS.name());
dbVideos.setWriteConcern(WriteConcern.FSYNC_SAFE);
dbVideos.ensureIndex(DbNames.Collections.VIDEOS.name());
dbVideos.createIndex(new BasicDBObject(DbNames.Collections.VIDEOS.name(), 1));
return dbVideos;
} catch (NullPointerException e) {
// sometimes, for reasons yet to be clarified, ensuring an index on the name field causes an NPE
@@ -118,7 +118,7 @@ public class MediaDBImpl implements MediaDB {
}
private MediaTrack createMediaTrackFromDb(DBObject dbObject) {
String dbId = ((ObjectId) dbObject.get(DbNames.Fields._id.name())).toStringMongod();
String dbId = ((ObjectId) dbObject.get(DbNames.Fields._id.name())).toHexString();
String title = (String) dbObject.get(DbNames.Fields.MEDIA_TITLE.name());
String url = (String) dbObject.get(DbNames.Fields.MEDIA_URL.name());
Date startTime = (Date) dbObject.get(DbNames.Fields.STARTTIME.name());
@@ -11,7 +11,7 @@ Require-Bundle: org.junit4;bundle-version="4.8.2",
org.mockito.mockito-core;bundle-version="1.9.5",
org.objenesis;bundle-version="1.3.0",
org.hamcrest;bundle-version="1.1.0",
com.mongodb.driver;bundle-version="2.6.2",
org.mongodb.mongo-java-driver;bundle-version="2.13.0",
com.sap.sse.common
Import-Package: com.sap.sailing.domain.abstractlog.regatta.events,
com.sap.sailing.domain.persistence.impl,
@@ -40,7 +40,7 @@ public class AbstractGPSFixStoreTest {
protected final DeviceIdentifier device = new SmartphoneImeiIdentifier("a");
protected RaceLog raceLog;
protected GPSFixStore store;
protected final Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null);
protected final Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null);
protected final Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark");
private final AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0);
@@ -168,7 +168,7 @@ public class CreateAndTrackWithRaceLogTest {
assertFalse(raceLog.isEmpty());
// add a mapping and one fix in, one out of mapping
Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null);
Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null, null);
DeviceIdentifier dev1 = new SmartphoneImeiIdentifier("dev1");
raceLog.add(factory.createDeviceCompetitorMappingEvent(t(), author, dev1, comp1, 0, t(0), t(10)));
addFixes0(dev1);
@@ -202,7 +202,7 @@ public class CreateAndTrackWithRaceLogTest {
adapter.denoteRaceForRaceLogTracking(service, leaderboard, column, fleet, "race");
// add a mapping and one fix in, one out of mapping
Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null);
Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null, null);
DeviceIdentifier dev1 = new SmartphoneImeiIdentifier("dev1");
regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(t(), author, t(), UUID.randomUUID(), comp1, dev1,
t(0), t(10)));
@@ -49,7 +49,7 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest {
@Test
public void areFixesStoredInDb() throws TransformationException, NoCorrespondingServiceRegisteredException,
InterruptedException {
Competitor comp2 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp2", "comp2", null, null, null);
Competitor comp2 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp2", "comp2", null, null, null, null);
Mark mark2 = DomainFactory.INSTANCE.getOrCreateMark("mark2");
DeviceIdentifier device2 = new SmartphoneImeiIdentifier("imei2");
DeviceIdentifier device3 = new SmartphoneImeiIdentifier("imei3");
@@ -1,21 +1,21 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Testsupport
Bundle-SymbolicName: com.sap.sailing.domain.racelogtrackingadapter.testsupport
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: com.sap.sailing.domain.shared.android,
com.sap.sailing.domain,
com.sap.sailing.domain.common,
com.mongodb.driver,
com.sap.sailing.domain.persistence,
com.sap.sailing.domain.racelogtrackingadapter,
com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0",
org.json.simple;bundle-version="1.1.0",
org.mockito.mockito-core;bundle-version="1.9.5",
org.hamcrest;bundle-version="1.1.0",
org.junit4;bundle-version="4.8.2",
com.sap.sse.common,
com.sap.sailing.server.gateway.serialization.shared.android
Export-Package: com.sap.sailing.domain.racelog.tracking.test.mock
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Testsupport
Bundle-SymbolicName: com.sap.sailing.domain.racelogtrackingadapter.testsupport
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: com.sap.sailing.domain.shared.android,
com.sap.sailing.domain,
com.sap.sailing.domain.common,
org.mongodb.mongo-java-driver;bundle-version="2.13.0",
com.sap.sailing.domain.persistence,
com.sap.sailing.domain.racelogtrackingadapter,
com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0",
org.json.simple;bundle-version="1.1.0",
org.mockito.mockito-core;bundle-version="1.9.5",
org.hamcrest;bundle-version="1.1.0",
org.junit4;bundle-version="4.8.2",
com.sap.sse.common,
com.sap.sailing.server.gateway.serialization.shared.android
Export-Package: com.sap.sailing.domain.racelog.tracking.test.mock
@@ -2,6 +2,7 @@
<classpath>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="resources"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="output" path="bin"/>
</classpath>
@@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding//resources/stringmessages/TrackingStringMessages_de.properties=UTF-8
@@ -13,12 +13,17 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.domain.persistence,
com.sap.sailing.server,
com.googlecode.java-diff-utils;bundle-version="1.3.0",
com.mongodb.driver,
org.mongodb.mongo-java-driver;bundle-version="2.13.0",
com.sap.sse.common,
com.sap.sse.replication,
com.sap.sse,
com.sap.sailing.server.gateway.serialization.shared.android
Import-Package: com.mongodb,
com.sap.sailing.server.gateway.serialization.shared.android,
com.sap.sse.mail
Import-Package: com.google.zxing;version="3.1.0",
com.mongodb,
javax.mail;version="1.4.0",
javax.mail.internet;version="1.4.0",
javax.mail.util;version="1.4.0",
javax.servlet;version="2.6.0",
org.json.simple,
org.json.simple.parser,
@@ -1,4 +1,5 @@
source.. = src/
source.. = src/,\
resources/
output.. = bin/
bin.includes = META-INF/,\
.
@@ -0,0 +1,4 @@
trackingInvitationFor=Einladung zum Tracken für
scanQRCodeOrVisitUrlToRegisterAs=Scanne den QRCode oder klicke den Link mit deinem Smartphone an um dich zu registrieren als
welcomeTo=Willkommen zu
alternativelyVisitThisLink=Alternativ kannst du diesen Link anklicken
@@ -0,0 +1,4 @@
trackingInvitationFor=Tracking Invitation for
scanQRCodeOrVisitUrlToRegisterAs=Scan the following QRCode or click the link using your smartphone to register as
welcomeTo=Welcome to
alternativelyVisitThisLink=Alternatively, you can click this Link
@@ -1,5 +1,6 @@
package com.sap.sailing.domain.racelogtracking;
import java.util.Locale;
import java.util.Set;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
@@ -10,6 +11,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEven
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceColumn;
@@ -24,12 +26,14 @@ import com.sap.sailing.domain.racelogtracking.impl.RaceLogRaceTracker;
import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.RacingEventService;
import com.sap.sse.common.mail.MailException;
public interface RaceLogTrackingAdapter {
public interface RaceLogTrackingAdapter {
/**
* Performs the necessary steps to ensure that the race is tracked (aka that a {@link TrackedRace}
* is created from the data in this {@code RaceLog}).<p>
* The following steps are performed to achieve this:
* Performs the necessary steps to ensure that the race is tracked (aka that a {@link TrackedRace} is created from
* the data in this {@code RaceLog}).
* <p>
* The following steps are performed to achieve this:
* <ul>
* <li>Is the racelog denoted for tracking? If not, throw exception.</li>
* <li>Is a {@link RaceLogRaceTracker} already listening for this racelog? If not, add one.</li>
@@ -38,7 +42,7 @@ public interface RaceLogTrackingAdapter {
*/
void startTracking(RacingEventService service, Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet)
throws NotDenotedForRaceLogTrackingException, Exception;
RaceLogTrackingState getRaceLogTrackingState(RacingEventService service, RaceColumn raceColumn, Fleet fleet);
/**
@@ -51,16 +55,15 @@ public interface RaceLogTrackingAdapter {
*
* @throws NotDenotableForRaceLogTrackingException
* Fails, if no {@link RaceLog}, or a non-empty {@link RaceLog}, or one with attached
* {@link TrackedRace} is found already in place.
* Also fails, if the {@code leaderboard} is not a {@link RegattaLeaderboard}.
* {@link TrackedRace} is found already in place. Also fails, if the {@code leaderboard} is not a
* {@link RegattaLeaderboard}.
*/
void denoteRaceForRaceLogTracking(RacingEventService service, Leaderboard leaderboard, RaceColumn raceColumn,
Fleet fleet, String raceName) throws NotDenotableForRaceLogTrackingException;
/**
* Revoke the {@link RaceLogDenoteForTrackingEvent}, and if it exists the {@link RaceLogStartTrackingEvent}.
* This does not affect existing an {@link RaceLogRaceTracker}
* or {@link TrackedRace} for this {@code RaceLog}.
* Revoke the {@link RaceLogDenoteForTrackingEvent}, and if it exists the {@link RaceLogStartTrackingEvent}. This
* does not affect existing an {@link RaceLogRaceTracker} or {@link TrackedRace} for this {@code RaceLog}.
*/
void removeDenotationForRaceLogTracking(RacingEventService service, RaceLog raceLog);
@@ -71,30 +74,35 @@ public interface RaceLogTrackingAdapter {
*/
void denoteAllRacesForRaceLogTracking(RacingEventService service, Leaderboard leaderboard)
throws NotDenotableForRaceLogTrackingException;
/**
* Add a fix to the {@link GPSFixStore}, and create a mapping with a virtual device for exactly that timepoint.
*/
void pingMark(RaceLog raceLogToAddTo, Mark mark, GPSFix gpsFix, RacingEventService service);
/**
* Duplicate the course and competitor registrations in the newest {@link RaceLogCourseDesignChangedEvent}
* in {@code from} race log to the {@code to} race logs.
* The {@link Mark}s and {@link ControlPoint}s are duplicated and not reused. This also inserts the necessary
* {@link RaceLogDefineMarkEvent}s into the {@code to} race logs.
* Duplicate the course and competitor registrations in the newest {@link RaceLogCourseDesignChangedEvent} in
* {@code from} race log to the {@code to} race logs. The {@link Mark}s and {@link ControlPoint}s are duplicated and
* not reused. This also inserts the necessary {@link RaceLogDefineMarkEvent}s into the {@code to} race logs.
*/
void copyCourseAndCompetitors(RaceLog from, Set<RaceLog> to, SharedDomainFactory baseDomainFactory,
RacingEventService service);
/**
* If not yet registered, register the competitors in {@code competitors},
* and unregister all already registered competitors not in {@code competitors}.
* If not yet registered, register the competitors in {@code competitors}, and unregister all already registered
* competitors not in {@code competitors}.
*/
void registerCompetitors(RacingEventService service, RaceLog raceLog, Set<Competitor> competitors);
/**
* If not yet registered, register the competitors in {@code competitors},
* and unregister all already registered competitors not in {@code competitors}.
* If not yet registered, register the competitors in {@code competitors}, and unregister all already registered
* competitors not in {@code competitors}.
*/
void registerCompetitors(RacingEventService service, RegattaLog regattaLog, Set<Competitor> competitors);
/**
* Invite competitors for tracking via the Tracking App by sending out emails.
*/
void inviteCompetitorsForTrackingViaEmail(Event event, Leaderboard leaderboard,
String serverUrlWithoutTrailingSlash, Set<Competitor> competitors, Locale locale) throws MailException;
}
@@ -36,6 +36,12 @@ import com.sap.sse.common.TypeBasedServiceFinder;
public class Activator implements BundleActivator {
private static final Logger logger = Logger.getLogger(Activator.class.getName());
private static BundleContext context;
public static BundleContext getContext() {
return context;
}
private Set<ServiceRegistration<?>> registrations = new HashSet<>();
@@ -53,6 +59,8 @@ public class Activator implements BundleActivator {
@Override
public void start(BundleContext context) throws Exception {
Activator.context = context;
registrations.add(context.registerService(DeviceIdentifierMongoHandler.class, new SmartphoneUUIDMongoHandler(), getDict(SmartphoneUUIDIdentifier.TYPE)));
registrations.add(context.registerService(DeviceIdentifierJsonHandler.class, new SmartphoneUUIDJsonHandler(), getDict(SmartphoneUUIDIdentifier.TYPE)));
registrations.add(context.registerService(DeviceIdentifierStringSerializationHandler.class, new SmartphoneUUIDStringSerializationHandler(), getDict(SmartphoneUUIDIdentifier.TYPE)));
@@ -75,6 +83,8 @@ public class Activator implements BundleActivator {
@Override
public void stop(BundleContext context) throws Exception {
Activator.context = null;
for (ServiceRegistration<?> reg : registrations) {
reg.unregister();
}
@@ -1,8 +1,11 @@
package com.sap.sailing.domain.racelogtracking.impl;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@@ -10,6 +13,17 @@ import java.util.function.Function;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import org.osgi.framework.ServiceReference;
import com.google.zxing.WriterException;
import com.sap.sailing.domain.abstractlog.AbstractLog;
import com.sap.sailing.domain.abstractlog.AbstractLogEvent;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
@@ -32,6 +46,7 @@ import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceColumn;
@@ -42,6 +57,7 @@ import com.sap.sailing.domain.base.impl.CourseDataImpl;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.abstractlog.NotRevokableException;
import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException;
import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException;
import com.sap.sailing.domain.common.racelog.tracking.RaceLogRaceTrackerExistsException;
@@ -61,6 +77,10 @@ import com.sap.sse.common.NoCorrespondingServiceRegisteredException;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.mail.MailException;
import com.sap.sse.mail.MailService;
import com.sap.sse.qrcode.QRCodeGenerationUtil;
import com.sap.sse.util.impl.NonGwtUrlHelper;
public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter {
private static final Logger logger = Logger.getLogger(RaceLogTrackingAdapterImpl.class.getName());
@@ -325,4 +345,66 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter {
c -> new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(),
MillisecondsTimePoint.now(), UUID.randomUUID(), c));
}
private MailService getMailService() {
ServiceReference<MailService> ref = Activator.getContext()
.getServiceReference(MailService.class);
if (ref == null) {
logger.warning("No file storage management service registered");
return null;
}
return Activator.getContext().getService(ref);
}
@Override
public void inviteCompetitorsForTrackingViaEmail(Event event, Leaderboard leaderboard,
String serverUrlWithoutTrailingSlash, Set<Competitor> competitors, Locale locale) throws MailException {
StringBuilder occuredExceptions = new StringBuilder();
for (Competitor competitor : competitors){
final String toAddress = competitor.getEmail();
if (toAddress != null) {
String leaderboardName = leaderboard.getName();
String competitorName = competitor.getName();
String url = DeviceMappingConstants.getDeviceMappingForRegattaLogUrl(serverUrlWithoutTrailingSlash,
event.getId().toString(), leaderboardName, DeviceMappingConstants.URL_COMPETITOR_ID_AS_STRING,
competitor.getId().toString(), NonGwtUrlHelper.INSTANCE);
String subject = String.format("%s %s",
RaceLogTrackingI18n.STRING_MESSAGES.get(locale, "trackingInvitationFor"), competitorName);
// taken from http://www.tutorialspoint.com/javamail_api/javamail_api_send_inlineimage_in_email.htm
BodyPart messageTextPart = new MimeBodyPart();
String htmlText = String.format("<h1>%s %s</h1>" + "<p>%s <b>%s</b></p>"
+ "<img src=\"cid:image\" title=\"%s\"><br/>"
+ "<a href=\"%s\">%s</a>",
RaceLogTrackingI18n.STRING_MESSAGES.get(locale, "welcomeTo"), leaderboardName,
RaceLogTrackingI18n.STRING_MESSAGES.get(locale, "scanQRCodeOrVisitUrlToRegisterAs"), competitorName,
url, url, RaceLogTrackingI18n.STRING_MESSAGES.get(locale, "alternativelyVisitThisLink"));
try {
messageTextPart.setContent(htmlText, "text/html");
BodyPart messageImagePart = new MimeBodyPart();
InputStream imageIs = QRCodeGenerationUtil.create(url, 250);
DataSource imageDs = new ByteArrayDataSource(imageIs, "image/png");
messageImagePart.setDataHandler(new DataHandler(imageDs));
messageImagePart.setHeader("Content-ID", "<image>");
MimeMultipart multipart = new MimeMultipart();
multipart.addBodyPart(messageTextPart);
multipart.addBodyPart(messageImagePart);
getMailService().sendMail(toAddress, subject, multipart);
} catch (MessagingException | MailException | WriterException | IOException e) {
logger.log(Level.SEVERE, "Error trying to send mail to " + competitor.getName()
+ " with e-mail address " + toAddress, e);
occuredExceptions.append(e.getMessage()+"\r\n");
}
}
}
if (!(occuredExceptions.length() == 0)){
throw new MailException(occuredExceptions.toString());
}
}
}
@@ -0,0 +1,11 @@
package com.sap.sailing.domain.racelogtracking.impl;
import com.sap.sse.i18n.ResourceBundleStringMessages;
import com.sap.sse.i18n.impl.ResourceBundleStringMessagesImpl;
public class RaceLogTrackingI18n {
private static final String RESOURCE_BASE_NAME = "stringmessages/TrackingStringMessages";
public static final ResourceBundleStringMessages STRING_MESSAGES = new ResourceBundleStringMessagesImpl(
RESOURCE_BASE_NAME, RaceLogTrackingI18n.class.getClassLoader());
}
@@ -1,18 +1,18 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: com.sap.sailing.domain.shared.android.test
Bundle-SymbolicName: com.sap.sailing.domain.shared.android.test
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0",
com.sap.sailing.domain.shared.android;bundle-version="1.0.0",
org.hamcrest;bundle-version="1.1.0",
org.junit4;bundle-version="4.8.2",
org.objenesis;bundle-version="1.3.0",
org.mockito.mockito-core;bundle-version="1.9.5",
com.sap.sailing.domain.test,
com.sap.sailing.domain.racelogtrackingadapter.testsupport;bundle-version="1.0.0",
com.sap.sse.common,
com.sap.sse,
com.sap.sse.shared.android
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: com.sap.sailing.domain.shared.android.test
Bundle-SymbolicName: com.sap.sailing.domain.shared.android.test
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0",
com.sap.sailing.domain.shared.android;bundle-version="1.0.0",
org.hamcrest;bundle-version="1.1.0",
org.junit4;bundle-version="4.8.2",
org.objenesis;bundle-version="1.3.0",
org.mockito.mockito-core;bundle-version="1.9.5",
com.sap.sailing.domain.test,
com.sap.sailing.domain.racelogtrackingadapter.testsupport;bundle-version="1.0.0",
com.sap.sse.common,
com.sap.sse,
com.sap.sse.shared.android
@@ -52,7 +52,7 @@ public class MultiLogAnalyzerTest {
private AbstractLogEventAuthor author;
private static Competitor createCompetitor(int n) {
return new CompetitorImpl(n, n + "", null, null, null);
return new CompetitorImpl(n, n + "", null, null, null, null);
}
private static DeviceIdentifier createDevice() {
@@ -22,8 +22,8 @@ import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
public class DeviceMappingFinderTest extends AbstractRaceLogTrackingTest {
private final Competitor competitor = new CompetitorImpl("comp", "Comp", null, null, null);
private final Competitor competitor2 = new CompetitorImpl("comp2", "Comp2", null, null, null);
private final Competitor competitor = new CompetitorImpl("comp", "Comp", null, null, null, null);
private final Competitor competitor2 = new CompetitorImpl("comp2", "Comp2", null, null, null, null);
private final DeviceIdentifier device = new SmartphoneImeiIdentifier("imei");
private int time = 0;
@@ -1,50 +1,50 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: com.sap.sailing.domain.shared.android
Bundle-SymbolicName: com.sap.sailing.domain.shared.android
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Require-Bundle: com.sap.sailing.domain.common,
com.sap.sse.datamining.shared,
com.sap.sse.common,
com.sap.sse.shared.android
Export-Package: com.sap.sailing.domain.abstractlog,
com.sap.sailing.domain.abstractlog.impl,
com.sap.sailing.domain.abstractlog.race,
com.sap.sailing.domain.abstractlog.race.analyzing.impl,
com.sap.sailing.domain.abstractlog.race.impl,
com.sap.sailing.domain.abstractlog.race.scoring,
com.sap.sailing.domain.abstractlog.race.scoring.impl,
com.sap.sailing.domain.abstractlog.race.state,
com.sap.sailing.domain.abstractlog.race.state.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl,
com.sap.sailing.domain.abstractlog.race.tracking,
com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl,
com.sap.sailing.domain.abstractlog.race.tracking.impl,
com.sap.sailing.domain.abstractlog.regatta,
com.sap.sailing.domain.abstractlog.regatta.events,
com.sap.sailing.domain.abstractlog.regatta.events.impl,
com.sap.sailing.domain.abstractlog.regatta.impl,
com.sap.sailing.domain.abstractlog.shared.analyzing,
com.sap.sailing.domain.abstractlog.shared.events,
com.sap.sailing.domain.base,
com.sap.sailing.domain.base.configuration,
com.sap.sailing.domain.base.configuration.impl,
com.sap.sailing.domain.base.configuration.procedures,
com.sap.sailing.domain.base.impl,
com.sap.sailing.domain.base.racegroup,
com.sap.sailing.domain.base.racegroup.impl,
com.sap.sailing.domain.racelogtracking,
com.sap.sailing.domain.racelogtracking.impl,
com.sap.sailing.domain.tracking,
com.sap.sailing.domain.tracking.impl
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: com.sap.sailing.domain.shared.android
Bundle-SymbolicName: com.sap.sailing.domain.shared.android
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Require-Bundle: com.sap.sailing.domain.common,
com.sap.sse.datamining.shared,
com.sap.sse.common,
com.sap.sse.shared.android
Export-Package: com.sap.sailing.domain.abstractlog,
com.sap.sailing.domain.abstractlog.impl,
com.sap.sailing.domain.abstractlog.race,
com.sap.sailing.domain.abstractlog.race.analyzing.impl,
com.sap.sailing.domain.abstractlog.race.impl,
com.sap.sailing.domain.abstractlog.race.scoring,
com.sap.sailing.domain.abstractlog.race.scoring.impl,
com.sap.sailing.domain.abstractlog.race.state,
com.sap.sailing.domain.abstractlog.race.state.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26,
com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.impl,
com.sap.sailing.domain.abstractlog.race.tracking,
com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl,
com.sap.sailing.domain.abstractlog.race.tracking.impl,
com.sap.sailing.domain.abstractlog.regatta,
com.sap.sailing.domain.abstractlog.regatta.events,
com.sap.sailing.domain.abstractlog.regatta.events.impl,
com.sap.sailing.domain.abstractlog.regatta.impl,
com.sap.sailing.domain.abstractlog.shared.analyzing,
com.sap.sailing.domain.abstractlog.shared.events,
com.sap.sailing.domain.base,
com.sap.sailing.domain.base.configuration,
com.sap.sailing.domain.base.configuration.impl,
com.sap.sailing.domain.base.configuration.procedures,
com.sap.sailing.domain.base.impl,
com.sap.sailing.domain.base.racegroup,
com.sap.sailing.domain.base.racegroup.impl,
com.sap.sailing.domain.racelogtracking,
com.sap.sailing.domain.racelogtracking.impl,
com.sap.sailing.domain.tracking,
com.sap.sailing.domain.tracking.impl
@@ -15,6 +15,10 @@ public interface Competitor extends Named, WithID, IsManagedByCache<SharedDomain
Color getColor();
String getEmail();
boolean hasEmail();
/**
* Adds a listener to this competitor. The listener is also added to the boat and the team for changes.
* Adding a listener that is already part of this competitor's listeners set remains without effect.
@@ -6,4 +6,6 @@ public interface CompetitorChangeListener extends BoatChangeListener, Nationalit
void colorChanged(Color oldColor, Color newColor);
void nameChanged(String oldName, String newName);
void emailChanged(String oldEmail, String newEmail);
}
@@ -26,5 +26,5 @@ public interface CompetitorFactory {
*/
boolean isCompetitorToUpdateDuringGetOrCreate(Competitor result);
Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat);
Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat);
}
@@ -63,7 +63,7 @@ public interface CompetitorStore extends CompetitorFactory {
*
* If no competitor with the ID requested is found, the call is a no-op, doing nothing, not even throwing an exception.
*/
Competitor updateCompetitor(String idAsString, String newName, Color newDisplayColor, String newSailId,
Competitor updateCompetitor(String idAsString, String newName, Color newDisplayColor, String newEmail, String newSailId,
Nationality newNationality, URI newTeamImageUri);
CompetitorDTO convertToCompetitorDTO(Competitor c);
@@ -20,13 +20,15 @@ public class CompetitorImpl implements DynamicCompetitor {
private String name;
private Color color;
private transient Set<CompetitorChangeListener> listeners;
private String email;
public CompetitorImpl(Serializable id, String name, Color color, DynamicTeam team, DynamicBoat boat) {
public CompetitorImpl(Serializable id, String name, Color color, String email, DynamicTeam team, DynamicBoat boat) {
this.id = id;
this.name = name;
this.team = team;
this.boat = boat;
this.color = color;
this.email = email;
this.listeners = new HashSet<CompetitorChangeListener>();
}
@@ -73,7 +75,7 @@ public class CompetitorImpl implements DynamicCompetitor {
@Override
public Competitor resolve(SharedDomainFactory domainFactory) {
Competitor result = domainFactory.getOrCreateCompetitor(getId(), getName(), getColor(), getTeam(), getBoat());
Competitor result = domainFactory.getOrCreateCompetitor(getId(), getName(), getColor(), getEmail(), getTeam(), getBoat());
return result;
}
@@ -114,4 +116,22 @@ public class CompetitorImpl implements DynamicCompetitor {
return new HashSet<CompetitorChangeListener>(listeners);
}
}
public String getEmail() {
return email;
}
public void setEmail(String newEmail) {
final String oldEmail = this.email;
if (!Util.equalsWithNull(oldEmail, newEmail)) {
this.email = newEmail;
for (CompetitorChangeListener listener : getListeners()) {
listener.emailChanged(oldEmail, newEmail);
}
}
}
public boolean hasEmail(){
return email != null && !email.isEmpty();
}
}
@@ -6,7 +6,10 @@ import com.sap.sse.common.Color;
public interface DynamicCompetitor extends Competitor, Renamable {
DynamicBoat getBoat();
DynamicTeam getTeam();
void setColor(Color displayColor);
void setEmail(String email);
}
@@ -332,11 +332,11 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
}
@Override
public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat) {
public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat) {
if (logger.isLoggable(Level.FINEST)) {
logger.log(Level.FINEST, "getting or creating competitor "+name+" with ID "+competitorId+" in domain factory "+this);
}
return getCompetitorStore().getOrCreateCompetitor(competitorId, name, displayColor, team, boat);
return getCompetitorStore().getOrCreateCompetitor(competitorId, name, displayColor, email, team, boat);
}
@Override
@@ -68,8 +68,8 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
listeners.remove(listener);
}
private Competitor createCompetitor(Serializable id, String name, Color displayColor, DynamicTeam team, DynamicBoat boat) {
Competitor result = new CompetitorImpl(id, name, displayColor, team, boat);
private Competitor createCompetitor(Serializable id, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat) {
Competitor result = new CompetitorImpl(id, name, displayColor, email, team, boat);
addNewCompetitor(id, result);
if (logger.isLoggable(Level.FINEST)) {
logger.log(Level.FINEST, "Created competitor "+name+" with ID "+id, new Exception("Here is where it happened"));
@@ -93,20 +93,20 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
}
@Override
public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat) {
public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat) {
Competitor result = getExistingCompetitorById(competitorId); // avoid synchronization for successful read access
if (result == null) {
LockUtil.lockForWrite(lock);
try {
result = getExistingCompetitorById(competitorId); // try again, now while holding the write lock
if (result == null) {
result = createCompetitor(competitorId, name, displayColor, team, boat);
result = createCompetitor(competitorId, name, displayColor, email, team, boat);
}
} finally {
LockUtil.unlockAfterWrite(lock);
}
} else if (isCompetitorToUpdateDuringGetOrCreate(result)) {
updateCompetitor(result.getId().toString(), name, displayColor, boat.getSailID(), team.getNationality(),
updateCompetitor(result.getId().toString(), name, displayColor, email, boat.getSailID(), team.getNationality(),
team.getImage());
competitorNoLongerToUpdateDuringGetOrCreate(result);
}
@@ -191,7 +191,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
}
@Override
public Competitor updateCompetitor(String idAsString, String newName, Color newDisplayColor, String newSailId,
public Competitor updateCompetitor(String idAsString, String newName, Color newDisplayColor, String newEmail, String newSailId,
Nationality newNationality, URI newTeamImageUri) {
DynamicCompetitor competitor = (DynamicCompetitor) getExistingCompetitorByIdAsString(idAsString);
if (competitor != null) {
@@ -199,6 +199,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
try {
competitor.setName(newName);
competitor.setColor(newDisplayColor);
competitor.setEmail(newEmail);
competitor.getBoat().setSailId(newSailId);
competitor.getTeam().setNationality(newNationality);
competitor.getTeam().setImage(newTeamImageUri);
@@ -229,7 +230,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
if (competitorDTO == null) {
final Nationality nationality = c.getTeam().getNationality();
CountryCode countryCode = nationality == null ? null : nationality.getCountryCode();
competitorDTO = new CompetitorDTOImpl(c.getName(), c.getColor(), countryCode == null ? ""
competitorDTO = new CompetitorDTOImpl(c.getName(), c.getColor(), c.getEmail(), countryCode == null ? ""
: countryCode.getTwoLetterISOCode(), countryCode == null ? ""
: countryCode.getThreeLetterIOCCode(), countryCode == null ? "" : countryCode.getName(), c
.getBoat().getSailID(), c.getId().toString(), new BoatClassDTO(c.getBoat().getBoatClass()
@@ -7,7 +7,7 @@ Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Require-Bundle: com.sap.sailing.domain.swisstimingadapter,
com.mongodb.driver;bundle-version="2.6.2",
org.mongodb.mongo-java-driver;bundle-version="2.13.0",
com.sap.sse.mongodb,
com.sap.sailing.domain,
com.sap.sailing.domain.common
@@ -87,7 +87,7 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
@Override
public void storeSwissTimingConfiguration(SwissTimingConfiguration swissTimingConfiguration) {
DBCollection stConfigCollection = database.getCollection(CollectionNames.SWISSTIMING_CONFIGURATIONS.name());
stConfigCollection.ensureIndex(CollectionNames.SWISSTIMING_CONFIGURATIONS.name());
stConfigCollection.createIndex(new BasicDBObject(CollectionNames.SWISSTIMING_CONFIGURATIONS.name(), 1));
BasicDBObject result = new BasicDBObject();
result.put(FieldNames.ST_CONFIG_NAME.name(), swissTimingConfiguration.getName());
for (DBObject equallyNamedConfig : stConfigCollection.find(result)) {
@@ -104,7 +104,7 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
public void storeSwissTimingArchiveConfiguration(
SwissTimingArchiveConfiguration createSwissTimingArchiveConfiguration) {
DBCollection stArchiveConfigCollection = database.getCollection(CollectionNames.SWISSTIMING_ARCHIVE_CONFIGURATIONS.name());
stArchiveConfigCollection.ensureIndex(CollectionNames.SWISSTIMING_ARCHIVE_CONFIGURATIONS.name());
stArchiveConfigCollection.createIndex(new BasicDBObject(CollectionNames.SWISSTIMING_ARCHIVE_CONFIGURATIONS.name(), 1));
BasicDBObject result = new BasicDBObject();
result.put(FieldNames.ST_ARCHIVE_JSON_URL.name(), createSwissTimingArchiveConfiguration.getJsonUrl());
for (DBObject equallyNamedConfig : stArchiveConfigCollection.find(result)) {
@@ -8,7 +8,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Fragment-Host: com.sap.sailing.domain.swisstimingadapter
Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.udpconnector,
com.mongodb.driver;bundle-version="2.6.2",
org.mongodb.mongo-java-driver;bundle-version="2.13.0",
com.sap.sse.mongodb,
com.googlecode.java-diff-utils;bundle-version="1.3.0",
com.sap.sailing.server,
+21 -21
View File
@@ -1,21 +1,21 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Swisstimingadapter
Bundle-SymbolicName: com.sap.sailing.domain.swisstimingadapter
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.udpconnector,
com.googlecode.java-diff-utils;bundle-version="1.3.0",
com.sap.sailing.domain.common,
com.sap.sailing.xrr.resultimport,
com.sap.sse.common,
com.sap.sse,
com.sap.sailing.xrr.schema
Export-Package: com.sap.sailing.domain.swisstimingadapter,
com.sap.sailing.domain.swisstimingadapter.impl;x-friends:="com.sap.sailing.server.test"
Import-Package: com.sap.sailing.xrr.schema,
org.osgi.framework
Bundle-Activator: com.sap.sailing.domain.swisstimingadapter.impl.Activator
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Swisstimingadapter
Bundle-SymbolicName: com.sap.sailing.domain.swisstimingadapter
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.udpconnector,
com.googlecode.java-diff-utils;bundle-version="1.3.0",
com.sap.sailing.domain.common,
com.sap.sailing.xrr.resultimport,
com.sap.sse.common,
com.sap.sse,
com.sap.sailing.xrr.schema
Export-Package: com.sap.sailing.domain.swisstimingadapter,
com.sap.sailing.domain.swisstimingadapter.impl;x-friends:="com.sap.sailing.server.test"
Import-Package: com.sap.sailing.xrr.schema,
org.osgi.framework
Bundle-Activator: com.sap.sailing.domain.swisstimingadapter.impl.Activator
@@ -124,7 +124,7 @@ public class DomainFactoryImpl implements DomainFactory {
teamMembers.add(person);
}
DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null);
result = competitorStore.getOrCreateCompetitor(competitor.getID(), competitor.getName(), null /*displayColor*/, team, boat);
result = competitorStore.getOrCreateCompetitor(competitor.getID(), competitor.getName(), null /*displayColor*/, null /*email*/, team, boat);
}
return result;
}
@@ -140,7 +140,7 @@ public class DomainFactoryImpl implements DomainFactory {
}
DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null);
result = baseDomainFactory.getCompetitorStore().getOrCreateCompetitor(getCompetitorID(competitor.getBoatID(), raceId, boatClass),
competitor.getName(), null /*displayColor*/, team, boat);
competitor.getName(), null /*displayColor*/, null /*email*/, team, boat);
return result;
}
@@ -232,7 +232,7 @@ public class LeaderboardDTODiffingTest {
@Test
public void testCompetitorListChange() {
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987",
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05));
newVersion.competitors.add(13, somebodyNew); // insert a competitor; this should mess up all others' indexes; check if this works
CompetitorDTO wolfgang = getPreviousCompetitorByName("HUNGER +JESS");
@@ -252,7 +252,7 @@ public class LeaderboardDTODiffingTest {
Util.addAll(newVersion.getSuppressedCompetitors(), newSuppressedCompetitors);
newVersion.setSuppressedCompetitors(newSuppressedCompetitors);
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987",
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05));
newVersion.setSuppressed(newVersion.competitors.get(13), true); // suppress an existing competitor; compaction should reduce this to a single number only
newVersion.setSuppressed(somebodyNew, true); // check that mixed mode with existing and new competitors works as well
@@ -274,7 +274,7 @@ public class LeaderboardDTODiffingTest {
@Test
public void testDisplayNameChange() {
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987",
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05));
newVersion.competitors.add(somebodyNew);
newVersion.competitorDisplayNames = new HashMap<CompetitorDTO, String>(newVersion.competitorDisplayNames);
@@ -303,7 +303,7 @@ public class LeaderboardDTODiffingTest {
List<CompetitorDTO> newOrdering = new ArrayList<CompetitorDTO>(newVersion.getCompetitorsFromBestToWorst(r9));
newVersion.setCompetitorsFromBestToWorst(r9, newOrdering);
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987",
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05));
newVersion.competitors.add(somebodyNew);
newOrdering.add(somebodyNew);
@@ -15,16 +15,16 @@ import com.sap.sse.common.Color;
public abstract class AbstractLeaderboardTest {
public static CompetitorImpl createCompetitor(String competitorName) {
return new CompetitorImpl(competitorName, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
return new CompetitorImpl(competitorName, competitorName, Color.RED, null, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
new BoatClassImpl("505", /* typicallyStartsUpwind */ true), /* sailID */ null));
}
public static Competitor createCompetitor(String competitorName, CompetitorFactory competitorFactory) {
return competitorFactory.getOrCreateCompetitor(competitorName, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
return competitorFactory.getOrCreateCompetitor(competitorName, competitorName, Color.RED, "someone@nobody.de", new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
@@ -33,11 +33,11 @@ public abstract class AbstractLeaderboardTest {
}
public static CompetitorImpl createCompetitor(String competitorName, Serializable id) {
return new CompetitorImpl(id, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
return new CompetitorImpl(id, competitorName, Color.RED, null, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
new BoatClassImpl("505", /* typicallyStartsUpwind */ true), /* sailID */ null));
}
}
@@ -94,6 +94,11 @@ public class CompetitorListenerTest extends AbstractSerializationTest {
CompetitorListenerTest.this.oldColor = oldColor;
CompetitorListenerTest.this.newColor = newColor;
}
@Override
public void emailChanged(String oldEmail, String newEmail) {
//TODO
}
};
competitor.addCompetitorChangeListener(listener);
}
@@ -157,8 +157,8 @@ public class LeaderboardCourseChangeTest {
Set<Competitor> competitors = new HashSet<>();
DynamicBoat mockedBoat = mock(DynamicBoat.class);
when(mockedBoat.getBoatClass()).thenReturn(boatClass);
competitors.add(new CompetitorImpl(UUID.randomUUID(), "TestCompetitor", Color.BLACK, mock(DynamicTeam.class),
mockedBoat));
competitors.add(new CompetitorImpl(UUID.randomUUID(), "TestCompetitor", Color.BLACK, null,
mock(DynamicTeam.class), mockedBoat));
return competitors;
}
@@ -188,11 +188,11 @@ public class OfflineSerializationTest extends AbstractSerializationTest {
DomainFactory senderDomainFactory = new DomainFactoryImpl();
DomainFactory receiverDomainFactory = new DomainFactoryImpl();
String competitorName = "Tina Maximiliane Lutz";
Competitor sendersCompetitor1 = new CompetitorImpl(123, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, senderDomainFactory.getOrCreateNationality("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", senderDomainFactory.getOrCreateNationality("GER"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
Competitor sendersCompetitor1 = new CompetitorImpl(123, competitorName, Color.RED, null, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, senderDomainFactory.getOrCreateNationality("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", senderDomainFactory.getOrCreateNationality("GER"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
senderDomainFactory.getOrCreateBoatClass("470", /* typicallyStartsUpwind */ true), "GER 61"));
Competitor receiversCompetitor1 = cloneBySerialization(sendersCompetitor1, receiverDomainFactory);
Competitor receiversSecondCopyOfCompetitor1 = cloneBySerialization(sendersCompetitor1, receiverDomainFactory);
@@ -117,7 +117,7 @@ public abstract class StoredTrackBasedTest extends TrackBasedTest {
for (String competitorName : getCompetitorNamesOfStoredTracks(KIELER_WOCHE)) {
DynamicPerson p = new PersonImpl(competitorName, /* nationality */ null, /* dateOfBirth */ null, /* description */ null);
DynamicTeam t = new TeamImpl(competitorName, Collections.singleton(p), /* coach */ null);
Competitor c = new CompetitorImpl(competitorName, competitorName, Color.RED, t, new BoatImpl(competitorName,
Competitor c = new CompetitorImpl(competitorName, competitorName, Color.RED, null, t, new BoatImpl(competitorName,
new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
DynamicGPSFixTrack<Competitor, GPSFixMoving> track = readTrack(c, KIELER_WOCHE);
if (track != null) {
@@ -34,11 +34,11 @@ public class TackTest extends StoredTrackBasedTestWithTrackedRace {
@Override
@Before
public void setUp() {
competitor = new CompetitorImpl(123, "Wolfgang Hunger", Color.RED, new TeamImpl("STG", Collections.singleton(
new PersonImpl("Wolfgang Hunger", new NationalityImpl("GER"),
/* dateOfBirth */null, "This is famous Wolfgang Hunger")), new PersonImpl("Rigo van Maas",
new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl("Wolfgang Hunger's boat",
competitor = new CompetitorImpl(123, "Wolfgang Hunger", Color.RED, null, new TeamImpl("STG", Collections.singleton(
new PersonImpl("Wolfgang Hunger", new NationalityImpl("GER"),
/* dateOfBirth */null, "This is famous Wolfgang Hunger")), new PersonImpl("Rigo van Maas",
new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl("Wolfgang Hunger's boat",
new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
setTrackedRace(createTestTrackedRace("Kieler Woche", "505 Race 2", "505", Collections.singleton(competitor),
new MillisecondsTimePoint(new GregorianCalendar(2011, 05, 23).getTime())));
@@ -60,11 +60,11 @@ public abstract class TrackBasedTest {
}
public static CompetitorImpl createCompetitor(String competitorName) {
return new CompetitorImpl(UUID.randomUUID(), competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */null, "This is famous " + competitorName)), new PersonImpl("Rigo van Maas",
new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
return new CompetitorImpl(UUID.randomUUID(), competitorName, Color.RED, null, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */null, "This is famous " + competitorName)), new PersonImpl("Rigo van Maas",
new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
new BoatClassImpl("505", /* typicallyStartsUpwind */true), null));
}
@@ -270,11 +270,11 @@ public class WindTest {
Waypoint w1 = domainFactory.createWaypoint(startFinish, /*passingInstruction*/ null);
Waypoint w2 = domainFactory.createWaypoint(top, /*passingInstruction*/ null);
Waypoint w3 = domainFactory.createWaypoint(startFinish, /*passingInstruction*/ null);
Competitor competitor = new CompetitorImpl(123, "Test Competitor", Color.RED, new TeamImpl("STG", Collections.singleton(
new PersonImpl("Test Competitor", new NationalityImpl("GER"),
/* dateOfBirth */null, "This is famous " + "Test Competitor")), new PersonImpl("Rigo van Maas",
new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl("Test Competitor" + "'s boat",
Competitor competitor = new CompetitorImpl(123, "Test Competitor", Color.RED, null, new TeamImpl("STG", Collections.singleton(
new PersonImpl("Test Competitor", new NationalityImpl("GER"),
/* dateOfBirth */null, "This is famous " + "Test Competitor")), new PersonImpl("Rigo van Maas",
new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl("Test Competitor" + "'s boat",
new BoatClassImpl("505", /* typicallyStartsUpwind */true), null));
final BoatClass boatClass = domainFactory.getOrCreateBoatClass("ESS40");
DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(new DynamicTrackedRegattaImpl(
@@ -45,9 +45,9 @@ import com.sap.sse.common.Util;
import com.sap.sse.common.impl.MillisecondsTimePoint;
public class AbstractMockedRaceMarkPassingTest {
protected Competitor bob = new CompetitorImpl("Bob", "Bob", null, null, null);
protected Competitor joe = new CompetitorImpl("Joe", "Joe", null, null, null);
protected Competitor mike = new CompetitorImpl("Mike", "Mike", null, null, null);
protected Competitor bob = new CompetitorImpl("Bob", "Bob", null, null, null, null);
protected Competitor joe = new CompetitorImpl("Joe", "Joe", null, null, null, null);
protected Competitor mike = new CompetitorImpl("Mike", "Mike", null, null, null, null);
protected Mark m = new MarkImpl("black");
protected Mark m2 = new MarkImpl("white 1");
@@ -13,6 +13,7 @@ import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.EventFetcher;
import com.sap.sailing.domain.base.Leg;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceColumnListener;
@@ -290,7 +291,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
}
@Override
public Iterable<Competitor> getCompetitors() {
public Iterable<Competitor> getAllCompetitors() {
return null;
}
@@ -430,6 +431,10 @@ public class MockedTrackedRace implements DynamicTrackedRace {
@Override
public void removeListener(RegattaLikeListener listener) {
}
@Override
public void adjustEventToRegattaAssociation(EventFetcher eventFetcher) {
}
};
}
@@ -6,7 +6,7 @@ Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Require-Bundle: com.mongodb.driver;bundle-version="2.6.2",
Require-Bundle: org.mongodb.mongo-java-driver;bundle-version="2.13.0",
com.sap.sse.mongodb,
com.sap.sailing.domain.tractracadapter,
com.sap.sailing.domain,
@@ -18,7 +18,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
@Override
public void storeTracTracConfiguration(TracTracConfiguration tracTracConfiguration) {
DBCollection ttConfigCollection = database.getCollection(CollectionNames.TRACTRAC_CONFIGURATIONS.name());
ttConfigCollection.ensureIndex(CollectionNames.TRACTRAC_CONFIGURATIONS.name());
ttConfigCollection.createIndex(new BasicDBObject(CollectionNames.TRACTRAC_CONFIGURATIONS.name(), 1));
BasicDBObject result = new BasicDBObject();
result.put(FieldNames.TT_CONFIG_NAME.name(), tracTracConfiguration.getName());
for (DBObject equallyNamedConfig : ttConfigCollection.find(result)) {
@@ -259,7 +259,7 @@ public class DomainFactoryImpl implements DomainFactory {
}
DynamicTeam team = getOrCreateTeam(name, nationality, competitorId);
DynamicBoat boat = new BoatImpl(shortName, boatClass, shortName);
result = competitorStore.getOrCreateCompetitor(competitorId, name, null /*displayColor*/, team, boat);
result = competitorStore.getOrCreateCompetitor(competitorId, name, null /*displayColor*/, null /*email*/, team, boat);
}
return result;
}
+40 -40
View File
@@ -1,40 +1,40 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Domain
Bundle-SymbolicName: com.sap.sailing.domain
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ClassPath: .
Export-Package: com.sap.sailing.domain.base,
com.sap.sailing.domain.base.impl,
com.sap.sailing.domain.confidence,
com.sap.sailing.domain.leaderboard,
com.sap.sailing.domain.leaderboard.caching,
com.sap.sailing.domain.leaderboard.impl,
com.sap.sailing.domain.leaderboard.meta,
com.sap.sailing.domain.markpassingcalculation,
com.sap.sailing.domain.markpassingcalculation.splining,
com.sap.sailing.domain.masterdataimport,
com.sap.sailing.domain.racelog,
com.sap.sailing.domain.racelog.impl,
com.sap.sailing.domain.racelog.tracking,
com.sap.sailing.domain.regattalike,
com.sap.sailing.domain.regattalog,
com.sap.sailing.domain.regattalog.impl,
com.sap.sailing.domain.trackfiles,
com.sap.sailing.domain.trackimport,
com.sap.sailing.domain.tracking,
com.sap.sailing.domain.tracking.impl,
com.sap.sailing.util,
com.sap.sailing.util.impl;x-friends:="com.sap.sailing.server.replication,com.sap.sailing.domain.test"
Bundle-ActivationPolicy: lazy
Require-Bundle: com.googlecode.java-diff-utils;bundle-version="1.3.0",
com.sap.sailing.domain.shared.android,
com.sap.sailing.domain.common,
org.json.simple;bundle-version="1.1.0",
com.sap.sailing.geocoding,
com.sap.sse.datamining.shared,
com.sap.sse.common,
com.sap.sse,
com.sap.sse.shared.android
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Domain
Bundle-SymbolicName: com.sap.sailing.domain
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ClassPath: .
Export-Package: com.sap.sailing.domain.base,
com.sap.sailing.domain.base.impl,
com.sap.sailing.domain.confidence,
com.sap.sailing.domain.leaderboard,
com.sap.sailing.domain.leaderboard.caching,
com.sap.sailing.domain.leaderboard.impl,
com.sap.sailing.domain.leaderboard.meta,
com.sap.sailing.domain.markpassingcalculation,
com.sap.sailing.domain.markpassingcalculation.splining,
com.sap.sailing.domain.masterdataimport,
com.sap.sailing.domain.racelog,
com.sap.sailing.domain.racelog.impl,
com.sap.sailing.domain.racelog.tracking,
com.sap.sailing.domain.regattalike,
com.sap.sailing.domain.regattalog,
com.sap.sailing.domain.regattalog.impl,
com.sap.sailing.domain.trackfiles,
com.sap.sailing.domain.trackimport,
com.sap.sailing.domain.tracking,
com.sap.sailing.domain.tracking.impl,
com.sap.sailing.util,
com.sap.sailing.util.impl;x-friends:="com.sap.sailing.server.replication,com.sap.sailing.domain.test"
Bundle-ActivationPolicy: lazy
Require-Bundle: com.googlecode.java-diff-utils;bundle-version="1.3.0",
com.sap.sailing.domain.shared.android,
com.sap.sailing.domain.common,
org.json.simple;bundle-version="1.1.0",
com.sap.sailing.geocoding,
com.sap.sse.datamining.shared,
com.sap.sse.common,
com.sap.sse,
com.sap.sse.shared.android
@@ -0,0 +1,5 @@
package com.sap.sailing.domain.base;
public interface EventFetcher {
Iterable<Event> getAllEvents();
}
@@ -103,7 +103,7 @@ public interface Regatta extends Named, WithID, IsRegattaLike {
BoatClass getBoatClass();
Iterable<Competitor> getCompetitors();
Iterable<Competitor> getAllCompetitors();
/**
* Will remove the series from this regatta. Will also call {@link RaceColumn#removeRaceIdentifier(Fleet)} to make
@@ -168,4 +168,12 @@ public interface Regatta extends Named, WithID, IsRegattaLike {
* Updates the flag deciding whether to use start time inference. See {@link #useStartTimeInference()}.
*/
void setUseStartTimeInference(boolean useStartTimeInference);
/**
* {@link Event} manages an association to its {@link Event#getRegattas() regattas}. When something on the
* regatta changes (in particular, the implicit link to an event through an event's {@link CourseArea} that
* is assigned as this regatta's {@link #setDefaultCourseArea(CourseArea) default course area}), the
* opposite end of the association needs to be maintained on the event's side.
*/
void adjustEventToRegattaAssociation(EventFetcher eventFetcher);
}
@@ -10,7 +10,7 @@ public interface DynamicCompetitorStore extends CompetitorStore {
DynamicCompetitor getExistingCompetitorById(Serializable competitorId);
@Override
DynamicCompetitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat);
DynamicCompetitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat);
@Override
Iterable<? extends DynamicCompetitor> getCompetitors();
@@ -12,9 +12,12 @@ import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.EventFetcher;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnInSeries;
@@ -297,13 +300,26 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
}
@Override
public Iterable<Competitor> getCompetitors() {
public Iterable<Competitor> getAllCompetitors() {
Set<Competitor> result = new HashSet<Competitor>();
for (RaceDefinition race : getAllRaces()) {
for (Competitor c : race.getCompetitors()) {
result.add(c);
}
}
for (Series series : getSeries()) {
for (RaceColumn rc : series.getRaceColumns()) {
for (Fleet fleet : rc.getFleets()) {
TrackedRace trackedRace = rc.getTrackedRace(fleet);
if (trackedRace != null) {
Util.addAll(trackedRace.getRace().getCompetitors(), result);
}
}
}
}
//consider {@link RegattaLog}
Set<Competitor> viaLog = new RegisteredCompetitorsAnalyzer<>(regattaLikeHelper.getRegattaLog()).analyze();
result.addAll(viaLog);
return result;
}
@@ -551,4 +567,17 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
public void removeListener(RegattaLikeListener listener) {
regattaLikeHelper.removeListener(listener);
}
public void adjustEventToRegattaAssociation(EventFetcher eventFetcher) {
CourseArea defaultCourseArea = getDefaultCourseArea();
for (Event event : eventFetcher.getAllEvents()) {
event.removeRegatta(this);
for (CourseArea courseArea : event.getVenue().getCourseAreas()) {
if (defaultCourseArea != null && courseArea.getId().equals(defaultCourseArea)) {
event.addRegatta(this);
}
}
}
}
}
@@ -88,7 +88,9 @@ public interface Leaderboard extends LeaderboardBase {
* in a regular view of the leaderboard. Editors for leaderboards shall, though, also display the suppressed competitors
* together with a visual indication showing which competitors are currently suppressed. The "suppressed-state" of a
* competitor can change over the life cycle of a leaderboard. A typical use case for suppressing a competitor is
* removing one-time entries from a series (meta-)leaderboard or suppressing a camera boat in scoring.
* removing one-time entries from a series (meta-)leaderboard or suppressing a camera boat in scoring.<p>
*
* @return all competitors in this leaderboard, including the suppressed ones.
*/
Iterable<Competitor> getAllCompetitors();
@@ -116,6 +116,11 @@ public class LeaderboardCacheManager {
competitor.removeCompetitorChangeListener(this);
}
}
@Override
public void emailChanged(String oldEmail, String newEmail) {
//ignore (email not shown in leaderboard)
}
}
@@ -70,6 +70,10 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI
return Collections.unmodifiableSet(trackedRaces);
}
/**
* This default implementation collects all competitors by visiting all {@link TrackedRace}s associated with this
* leaderboard's columns (see {@link #getTrackedRaces()}).
*/
@Override
public Iterable<Competitor> getAllCompetitors() {
if (allCompetitorsCache == null) {
@@ -6,10 +6,14 @@ import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
@@ -275,4 +279,16 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
public void removeListener(RegattaLikeListener listener) {
regattaLikeHelper.removeListener(listener);
}
@Override
public Iterable<Competitor> getAllCompetitors() {
Set<Competitor> result = new HashSet<>();
for (Competitor c : super.getAllCompetitors()) {
result.add(c);
}
//consider {@link RegattaLog}
Set<Competitor> viaLog = new RegisteredCompetitorsAnalyzer<>(regattaLikeHelper.getRegattaLog()).analyze();
result.addAll(viaLog);
return result;
}
}
@@ -3,11 +3,14 @@ package com.sap.sailing.domain.leaderboard.impl;
import java.util.ArrayList;
import java.util.List;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.RaceColumnListener;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.impl.RaceColumnInSeriesImpl;
@@ -96,6 +99,17 @@ public class RegattaLeaderboardImpl extends AbstractLeaderboardImpl implements R
}
}
/**
* Delegates to {@link Regatta#getAllCompetitors()} which is expected to deliver all competitors from this
* leaderboard's regatta which includes those belonging to {@link RaceDefinition races}
* {@link Regatta#getAllRaces() belonging to the regatta} as well as competitors listed on the regatta's
* {@link RegattaLog}.
*/
@Override
public Iterable<Competitor> getAllCompetitors() {
return regatta.getAllCompetitors();
}
@Override
public IsRegattaLike getRegattaLike() {
return regatta;
@@ -72,6 +72,16 @@ public class DummyMarkPassingWithTimePointOnly implements MarkPassing {
@Override
public void removeCompetitorChangeListener(CompetitorChangeListener listener) {
}
@Override
public String getEmail() {
return null;
}
@Override
public boolean hasEmail() {
return false;
}
};
}
}
+415 -401
View File
@@ -9,392 +9,392 @@
The SAP Sailing Server.
Provides connectivity to a TracTrac live GPS feed as well as a live feed from an Expedition system.
Computes leaderboard information for sailing races and offers RESTful APIs to all of this.
</description>
<copyright url="http://www.example.com/copyright">
[Enter Copyright Description here.]
</copyright>
<license url="http://www.example.com/license">
[Enter License Description here.]
</license>
<requires>
<import plugin="com.googlecode.java-diff-utils" version="1.3.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.osgi" version="3.10.1" match="greaterOrEqual"/>
<import plugin="javax.servlet" version="3.1.0" match="greaterOrEqual"/>
<import plugin="com.mongodb.driver" version="2.6.2" match="greaterOrEqual"/>
<import plugin="com.google.gwt.osgi" version="2.6.1" match="greaterOrEqual"/>
<import plugin="org.json.simple" version="1.1.0" match="greaterOrEqual"/>
<import plugin="org.moxieapps.gwt.highcharts" version="1.1.4" match="greaterOrEqual"/>
<import plugin="org.apache.geronimo.specs.geronimo-jms_1.1_spec"/>
<import plugin="com.rabbitmq.client"/>
<import plugin="org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec"/>
</requires>
<plugin
id="com.sap.sailing.geocoding"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.common"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.tractracadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.expeditionconnector"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.server"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.server.gateway"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.server.gateway.ess40"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.tractrac.clientmodule"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.declination"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.persistence"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.swisstimingadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.swisstimingadapter.persistence"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.swisstimingreplayadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.tractracadapter.persistence"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.gwt"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.security"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.security.ui"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.security.userstore.mongodb"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.gwt.ui"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.udpconnector"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.xmlexport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.simulator"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.www"
download-size="0"
install-size="0"
version="0.0.0"/>
<plugin
id="com.sap.sailing.www.events"
download-size="0"
install-size="0"
version="0.0.0"/>
<plugin
id="com.sap.sailing.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.kiworesultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.ess40.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.freg.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.barbados.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.sailwave.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.manage2sail.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.velum.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.monitoring"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.xrr.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.igtimiadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.igtimiadapter.persistence"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.racelogtrackingadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.deckmanadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.autoload"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.common"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.datamining"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.datamining.shared"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.gateway"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.gwt.adminconsole"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.mongodb"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.operationaltransformation"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.replication"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.xrr.structureimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.server.gateway.serialization.shared.android"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.server.gateway.serialization"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
Computes leaderboard information for sailing races and offers RESTful APIs to all of this.
</description>
<copyright url="http://www.example.com/copyright">
[Enter Copyright Description here.]
</copyright>
<license url="http://www.example.com/license">
[Enter License Description here.]
</license>
<requires>
<import plugin="com.googlecode.java-diff-utils" version="1.3.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.osgi" version="3.10.1" match="greaterOrEqual"/>
<import plugin="javax.servlet" version="3.1.0" match="greaterOrEqual"/>
<import plugin="com.mongodb.driver" version="2.6.2" match="greaterOrEqual"/>
<import plugin="com.google.gwt.osgi" version="2.6.1" match="greaterOrEqual"/>
<import plugin="org.json.simple" version="1.1.0" match="greaterOrEqual"/>
<import plugin="org.moxieapps.gwt.highcharts" version="1.1.4" match="greaterOrEqual"/>
<import plugin="org.apache.geronimo.specs.geronimo-jms_1.1_spec"/>
<import plugin="com.rabbitmq.client"/>
<import plugin="org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec"/>
</requires>
<plugin
id="com.sap.sailing.geocoding"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.common"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.tractracadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.expeditionconnector"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.server"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.server.gateway"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.server.gateway.ess40"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.tractrac.clientmodule"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.declination"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.persistence"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.swisstimingadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.swisstimingadapter.persistence"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.swisstimingreplayadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.tractracadapter.persistence"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.gwt"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.security"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.security.ui"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.security.userstore.mongodb"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.gwt.ui"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.udpconnector"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.xmlexport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.simulator"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.www"
download-size="0"
install-size="0"
version="0.0.0"/>
<plugin
id="com.sap.sailing.www.events"
download-size="0"
install-size="0"
version="0.0.0"/>
<plugin
id="com.sap.sailing.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.kiworesultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.ess40.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.freg.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.barbados.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.sailwave.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.manage2sail.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.velum.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.monitoring"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.xrr.resultimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.igtimiadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.igtimiadapter.persistence"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.racelogtrackingadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.deckmanadapter"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.autoload"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.common"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.datamining"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.datamining.shared"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.gateway"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.gwt.adminconsole"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.mongodb"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.operationaltransformation"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.replication"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.xrr.structureimport"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.server.gateway.serialization.shared.android"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.server.gateway.serialization"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.filestorage"
download-size="0"
@@ -402,18 +402,32 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.shared.android"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.dashboards.gwt"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>
<plugin
id="com.sap.sse.shared.android"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.dashboards.gwt"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sse.mail"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.dashboards.gwt"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>
@@ -11,6 +11,7 @@ import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.EventFetcher;
import com.sap.sailing.domain.base.Leg;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceColumnListener;
@@ -335,7 +336,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
}
@Override
public Iterable<Competitor> getCompetitors() {
public Iterable<Competitor> getAllCompetitors() {
// TODO Auto-generated method stub
return null;
}
@@ -517,6 +518,12 @@ public class MockedTrackedRace implements DynamicTrackedRace {
// TODO Auto-generated method stub
}
@Override
public void adjustEventToRegattaAssociation(EventFetcher eventFetcher) {
// TODO Auto-generated method stub
}
};
}
@@ -163,8 +163,8 @@ public class PolarSheetGenerationServiceTest {
waypoints.add(new WaypointImpl(null));
waypoints.add(new WaypointImpl(null));
ArrayList<Competitor> competitors = new ArrayList<Competitor>();
Competitor competitor = new CompetitorImpl(UUID.randomUUID(), "Hans Frantz", Color.RED, new TeamImpl("SAP", null, null),
new BoatImpl("Schnelle Forelle", forelle, "GER000"));
Competitor competitor = new CompetitorImpl(UUID.randomUUID(), "Hans Frantz", Color.RED, null,
new TeamImpl("SAP", null, null), new BoatImpl("Schnelle Forelle", forelle, "GER000"));
competitors.add(competitor);
RaceDefinition race = new RaceDefinitionImpl("Forelle1", new CourseImpl("ForelleCourse", waypoints), forelle, competitors);
return race;
@@ -1,8 +1,5 @@
package com.sap.sailing.gwt.ui.test;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.net.UnknownHostException;
import java.text.ParseException;
@@ -11,9 +8,6 @@ import java.util.List;
import javax.xml.bind.JAXBException;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.common.RegattaIdentifier;
@@ -27,7 +21,6 @@ import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapter;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapterFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayService;
import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayServiceFactory;
import com.sap.sailing.domain.tracking.RaceHandle;
import com.sap.sailing.domain.tracking.TrackerManager;
import com.sap.sailing.domain.tractracadapter.TracTracAdapterFactory;
@@ -43,72 +36,37 @@ import com.sap.sse.replication.impl.ReplicationServiceImpl;
public class SailingServiceImplMock extends SailingServiceImpl {
private static final long serialVersionUID = 8564037671550730455L;
private RacingEventService service;
private final RacingEventService service;
private ReplicationService replicationService;
private final ScoreCorrectionProvider scoreCorrectionProvider = null;
private final TracTracAdapterFactory tracTracAdapterFactory = TracTracAdapterFactory.INSTANCE;
private final SwissTimingAdapterFactory swissTimingAdapterFactory;
private final SwissTimingReplayService swissTimingReplayService = null;
private final RaceLogTrackingAdapterFactory raceLogTrackingAdapterFactory = RaceLogTrackingAdapterFactory.INSTANCE;
public SailingServiceImplMock() {
super();
service = new RacingEventServiceImpl(true, new MockSmartphoneImeiServiceFinderFactory());
}
@Override
protected ServiceTracker<RacingEventService, RacingEventService> createAndOpenRacingEventServiceTracker(
BundleContext context) {
@SuppressWarnings("unchecked")
ServiceTracker<RacingEventService, RacingEventService> result = mock(ServiceTracker.class);
when(result.getService()).thenReturn(new RacingEventServiceImpl());
return result;
}
@Override
protected ServiceTracker<ReplicationService, ReplicationService> createAndOpenReplicationServiceTracker(
BundleContext context) {
@SuppressWarnings("unchecked")
ServiceTracker<ReplicationService, ReplicationService> result = mock(ServiceTracker.class);
try {
final RacingEventService replicable = new RacingEventServiceImpl();
final ReplicationServiceImpl replicationService =
new ReplicationServiceImpl("test exchange", "localhost", 0,
new ReplicationInstancesManager(), new AbstractReplicablesProvider() {
@Override
public Iterable<Replicable<?, ?>> getReplicables() {
return Collections.<Replicable<?, ?>>singleton(replicable);
}
});
when(result.getService()).thenReturn(replicationService);
replicationService = new ReplicationServiceImpl("test exchange", "localhost", 0,
new ReplicationInstancesManager(), new AbstractReplicablesProvider() {
@Override
public Iterable<Replicable<?, ?>> getReplicables() {
return Collections.<Replicable<?, ?>> singleton(service);
}
});
} catch (IOException e) {
throw new RuntimeException();
e.printStackTrace();
}
return result;
}
@Override
protected ServiceTracker<ScoreCorrectionProvider, ScoreCorrectionProvider> createAndOpenScoreCorrectionProviderServiceTracker(
BundleContext bundleContext) {
return null;
}
@Override
protected ServiceTracker<TracTracAdapterFactory, TracTracAdapterFactory> createAndOpenTracTracAdapterTracker(
BundleContext context) {
@SuppressWarnings("unchecked")
ServiceTracker<TracTracAdapterFactory, TracTracAdapterFactory> result = mock(ServiceTracker.class);
when(result.getService()).thenReturn(TracTracAdapterFactory.INSTANCE);
return result;
}
@Override
protected ServiceTracker<SwissTimingAdapterFactory, SwissTimingAdapterFactory> createAndOpenSwissTimingAdapterTracker(
BundleContext context) {
@SuppressWarnings("unchecked")
ServiceTracker<SwissTimingAdapterFactory, SwissTimingAdapterFactory> result = mock(ServiceTracker.class);
when(result.getService()).thenReturn(new SwissTimingAdapterFactory() {
swissTimingAdapterFactory = new SwissTimingAdapterFactory() {
@Override
public SwissTimingAdapter getOrCreateSwissTimingAdapter(DomainFactory baseDomainFactory) {
return new SwissTimingAdapter() {
@Override
public List<com.sap.sailing.domain.swisstimingadapter.RaceRecord> getSwissTimingRaceRecords(
String hostname, int port) throws InterruptedException,
UnknownHostException, IOException, ParseException {
String hostname, int port) throws InterruptedException, UnknownHostException, IOException,
ParseException {
// TODO Auto-generated method stub
return null;
}
@@ -148,45 +106,43 @@ public class SailingServiceImplMock extends SailingServiceImpl {
}
};
}
});
return result;
};
}
public ScoreCorrectionProvider getScoreCorrectionProvider() {
return scoreCorrectionProvider;
}
@Override
protected ServiceTracker<SwissTimingReplayServiceFactory, SwissTimingReplayServiceFactory> createAndOpenSwissTimingReplayServiceTracker(
BundleContext context) {
@SuppressWarnings("unchecked")
ServiceTracker<SwissTimingReplayServiceFactory, SwissTimingReplayServiceFactory> result = mock(ServiceTracker.class);
final SwissTimingReplayServiceFactory swissTimingReplayService = new SwissTimingReplayServiceFactory() {
@Override
public SwissTimingReplayService createSwissTimingReplayService(
com.sap.sailing.domain.swisstimingadapter.DomainFactory domainFactory) {
// TODO Auto-generated method stub
return null;
}
};
when(result.getService()).thenReturn(swissTimingReplayService);
return result;
protected TracTracAdapterFactory getTracTracAdapterFactory() {
return tracTracAdapterFactory;
}
@Override
protected SwissTimingAdapterFactory getSwissTimingAdapterFactory() {
return swissTimingAdapterFactory;
}
@Override
protected SwissTimingReplayService getSwissTimingReplayService() {
return swissTimingReplayService;
}
@Override
protected RaceLogTrackingAdapterFactory getRaceLogTrackingAdapterFactory() {
return raceLogTrackingAdapterFactory;
}
@Override
protected ServiceTracker<RaceLogTrackingAdapterFactory, RaceLogTrackingAdapterFactory> createAndOpenRaceLogTrackingAdapterTracker(
BundleContext context) {
@SuppressWarnings("unchecked")
ServiceTracker<RaceLogTrackingAdapterFactory, RaceLogTrackingAdapterFactory> result = mock(ServiceTracker.class);
RaceLogTrackingAdapterFactory factory = RaceLogTrackingAdapterFactory.INSTANCE;
when(result.getService()).thenReturn(factory);
return result;
protected ReplicationService getReplicationService() {
return replicationService;
}
@Override
protected RacingEventService getService() {
if (service == null) {
service = new RacingEventServiceImpl();
}
return service;
}
public RacingEventService getRacingEventService() {
return getService();
}
@@ -1,4 +1,4 @@
eclipse.preferences.version=1
entryPointModules=
filesCopiedToWebInfLib=gwt-servlet.jar
gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDQgLXN0cmljdCAtbG9nTGV2ZWwgVFJBQ0VdXT48L2V4dHJhLWFyZ3M+PHZtLWFyZ3M+PCFbQ0RBVEFbLVhteDIwMjRtIC1EZ3d0LnVzZWFyY2hpdmVzPWZhbHNlXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC5Ib21lPC9lbnRyeS1wb2ludC1tb2R1bGU+PC9nd3QtY29tcGlsZS1zZXR0aW5ncz4\=
gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDQgLXN0cmljdCAtbG9nTGV2ZWwgVFJBQ0VdXT48L2V4dHJhLWFyZ3M+PHZtLWFyZ3M+PCFbQ0RBVEFbLVhteDIwMjRtIC1EZ3d0LnVzZWFyY2hpdmVzPWZhbHNlXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC5BdXRvUGxheTwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+
+1 -1
View File
@@ -10,7 +10,7 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.server,
com.sap.sailing.domain.tractracadapter,
com.sap.sse.mongodb,
com.mongodb.driver;bundle-version="2.6.2",
org.mongodb.mongo-java-driver;bundle-version="2.13.0",
com.sap.sailing.domain.swisstimingadapter,
com.sap.sailing.domain.persistence,
com.sap.sailing.domain.swisstimingadapter.persistence,
@@ -69,7 +69,7 @@
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-superDevMode -incremental -war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9997 -startupUrl /gwt/Home.html com.sap.sailing.gwt.Home -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/PolarSheets.html com.sap.sailing.gwt.ui.PolarSheets -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.ui.RegattaOverview -startupUrl /gwt/DataMining.html com.sap.sailing.gwt.ui.DataMining -startupUrl /gwt/Simulator.html com.sap.sailing.gwt.ui.Simulator -startupUrl /gwt/VideoPopup.html com.sap.sailing.gwt.ui.VideoPopup com.sap.sailing.gwt.AutoPlay com.sap.sailing.gwt.ui.YoutubePopup"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-superDevMode -incremental -war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9997 -startupUrl /gwt/Home.html com.sap.sailing.gwt.Home -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/PolarSheets.html com.sap.sailing.gwt.ui.PolarSheets -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.ui.RegattaOverview -startupUrl /gwt/DataMining.html com.sap.sailing.gwt.ui.DataMining -startupUrl /gwt/Simulator.html com.sap.sailing.gwt.ui.Simulator -startupUrl /gwt/VideoPopup.html com.sap.sailing.gwt.ui.VideoPopup com.sap.sailing.gwt.AutoPlay com.sap.sailing.gwt.ui.YoutubePopup com.sap.sailing.gwt.ui.Simulator com.sap.sailing.gwt.ui.Leaderboard com.sap.sailing.gwt.ui.PolarSheets com.sap.sailing.gwt.ui.RegattaOverview com.sap.sailing.gwt.ui.Spectator com.sap.sailing.gwt.ui.AdminConsole com.sap.sailing.gwt.ui.LeaderboardEditing com.sap.sailing.gwt.ui.DataMining com.sap.sailing.gwt.Home com.sap.sailing.gwt.ui.RaceBoard"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms1024m -Xmx3072m"/>
</launchConfiguration>
@@ -6,6 +6,7 @@ import com.google.gwt.i18n.client.Messages;
public interface TextMessages extends Messages {
public static final TextMessages INSTANCE = GWT.create(TextMessages.class);
String chartSelectionHint();
String chooseALanguage();
String home();
String events();
@@ -1,3 +1,4 @@
chartSelectionHint=Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart.
chooseALanguage=Choose a language
events=Events
home=Home
@@ -1,3 +1,4 @@
chartSelectionHint=Hinweis: Sie können auch Ergebnisstabelle (im Menü ERGEBNISSE) nutzen, um die im Diagramm angezeigten Teilnehmer auszuwählen.
chooseALanguage=Wähle eine Sprache
events=Veranstaltungen
home=Startseite

Some files were not shown because too many files have changed in this diff Show More