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

Conflicts:
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/app/MobilePlacesNavigator.java
This commit is contained in:
Benjamin Barth committed 2015-09-07 14:10:37 +02:00
commit 0057a30fe8
256 files changed
+4917 -1894

No files matched your search

@@ -0,0 +1,39 @@
#!/bin/bash
command -v tmux >/dev/null 2>&1 || { echo "I require tmux but it's not installed. Aborting." >&2; exit 1; }
sn=sailing
SERVERS_DIR=/home/sailing/servers
TMUX_ACTIVE=`tmux has-session -t $sn 2>/dev/null`
if [ $? -eq 0 ]; then
echo "Session exists...not configuring a new one"
else
echo "Session does not exist...creating a new one with name $sn"
cd /home/sailing/code
tmux new-session -s "$sn" -n "BUILD" -d
counter=0
cd $SERVERS_DIR
tmux new-window -t "$sn:$[counter+1]" -n "GOAccess" "bash -c 'goaccess -f /var/log/httpd/access_log'; bash"
cd $SERVERS_DIR
tmux new-window -t "$sn:$[counter+2]" -n "ATop" "bash -c 'apachetop -f /var/log/httpd/access_log'; bash"
cd $SERVERS_DIR
tmux new-window -t "$sn:$[counter+3]" -n "Htop" "bash -c 'htop'; bash"
cd $SERVERS_DIR/server/logs
tmux new-window -t "$sn:$[counter+4]" -n "Logs" "bash -c 'ls -lah'; bash"
cd $SERVERS_DIR
tmux new-window -t "$sn:$[counter+5]" -n "LeaderboardCalc" "bash -c 'tail -f server/logs/sailing0.log.0 | grep took'; bash"
tmux select-window -t "$sn:0"
fi
if [[ "$1" != "unattended" ]]; then
tmux -2 attach-session -t "$sn"
fi
@@ -7,6 +7,6 @@
<classpathentry exported="true" kind="lib" path="WEB-INF/lib/gwt-ajaxloader.jar"/>
<classpathentry kind="lib" path="WEB-INF/classes"/>
<classpathentry kind="con" path="com.google.gwt.eclipse.core.GWT_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<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>
@@ -1,12 +1,12 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.7
org.eclipse.jdt.core.compiler.source=1.8
@@ -5,7 +5,7 @@ Bundle-SymbolicName: com.sap.sailing.dashboards.gwt
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.sap.sailing.dashboards.gwt.server.Activator
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.server,
com.google.gwt.osgi;bundle-version="2.6.1",
@@ -22,7 +22,8 @@ Require-Bundle: com.sap.sailing.domain,
org.json.simple;bundle-version="1.1.0",
com.sap.sailing.udpconnector,
com.googlecode.mgwt;bundle-version="2.0.0",
com.sap.sse.gwt.adminconsole
com.sap.sse.gwt.adminconsole,
org.apache.commons.math;bundle-version="2.1.0"
Bundle-ActivationPolicy: lazy
Import-Package: org.osgi.framework;version="1.5.0",
org.osgi.util.tracker
@@ -22,11 +22,9 @@
}
.highcharts-container {
position: absolute;
top: 0pt;
bottom: 0pt;
left: 0pt;
right: 0pt;
position: absolute !important;
width: 100% !important;
height: 100% !important;
}
.bottomnotification {
@@ -1,47 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9998"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
<booleanAttribute key="com.google.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/dashboards/RibDashboard.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.dashboards.gwt"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-servlet.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<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.dashboards.gwt}&quot; -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9998 com.sap.sailing.dashboards.gwt.RibDashboard"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.dashboards.gwt"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2048m"/>
</launchConfiguration>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9998"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
<booleanAttribute key="com.google.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/dashboards/RibDashboard.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.dashboards.gwt"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-servlet.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<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.dashboards.gwt}&quot; -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9998 com.sap.sailing.dashboards.gwt.RibDashboard"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.dashboards.gwt"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XstartOnFirstThread -Xmx2048m"/>
</launchConfiguration>
@@ -1,47 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9998"/>
<booleanAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT_AUTO" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/dashboards/RibDashboard.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.dashboards.gwt"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-servlet.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<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="-nosuperDevMode -incremental -war &quot;${project_loc:com.sap.sailing.dashboards.gwt}&quot; -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort auto com.sap.sailing.dashboards.gwt.RibDashboard"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.dashboards.gwt"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2048m"/>
</launchConfiguration>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9998"/>
<booleanAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT_AUTO" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/dashboards/RibDashboard.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.dashboards.gwt"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-servlet.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<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="-nosuperDevMode -incremental -war &quot;${project_loc:com.sap.sailing.dashboards.gwt}&quot; -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort auto com.sap.sailing.dashboards.gwt.RibDashboard"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.dashboards.gwt"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XstartOnFirstThread -Xmx2048m"/>
</launchConfiguration>
@@ -25,6 +25,7 @@ import com.sap.sailing.dashboards.gwt.client.eventlogo.EventLogo;
import com.sap.sailing.dashboards.gwt.client.notifications.WrongDeviceOrientationNotification;
import com.sap.sailing.dashboards.gwt.client.startanalysis.StartlineAnalysisComponent;
import com.sap.sailing.dashboards.gwt.client.startlineadvantage.StartLineAdvantageComponent;
import com.sap.sailing.dashboards.gwt.client.startlineadvantage.StartlineAdvantagesByWindComponent;
import com.sap.sailing.dashboards.gwt.client.windchart.WindBotComponent;
import com.sap.sailing.dashboards.gwt.shared.dto.RibDashboardRaceInfoDTO;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -63,9 +64,9 @@ public class RibDashboardPanel extends Composite implements RibDashboardDataRetr
@UiField
HTMLPanel rightwindbotcontainer;
@UiField(provided = true)
public StartLineAdvantageComponent startLineCAComponent;
StartlineAdvantagesByWindComponent startlineAdvantagesByWindComponent;
@UiField
public DivElement windloadinghintleft;
@@ -81,6 +82,9 @@ public class RibDashboardPanel extends Composite implements RibDashboardDataRetr
@UiField(provided = true)
public StartlineAnalysisComponent startanalysisComponent;
@UiField(provided = true)
public StartLineAdvantageComponent startlineAdvantageByGeometryComponent;
private List<WindBotComponent> windBotComponents;
private StringMessages stringConstants;
@@ -90,7 +94,8 @@ public class RibDashboardPanel extends Composite implements RibDashboardDataRetr
windBotComponents = new ArrayList<WindBotComponent>();
ribDashboardDataRetriever.addDataObserver(this);
startanalysisComponent = new StartlineAnalysisComponent(ribDashboardService, sailingServiceAsync);
startLineCAComponent = new StartLineAdvantageComponent(ribDashboardDataRetriever);
startlineAdvantagesByWindComponent = new StartlineAdvantagesByWindComponent(ribDashboardService);
startlineAdvantageByGeometryComponent = new StartLineAdvantageComponent(ribDashboardDataRetriever);
stringConstants = StringMessages.INSTANCE;
initWidget(uiBinder.createAndBindUi(this));
initLogos();
@@ -7,8 +7,7 @@
xmlns:mgwtpanel="urn:import:com.googlecode.mgwt.ui.client.widget.panel">
<ui:style
type='com.sap.sailing.dashboards.gwt.client.RibDashboardPanelStyle'
src='Ribstyle.css'></ui:style>
type='com.sap.sailing.dashboards.gwt.client.RibDashboardPanelStyle' src='resources/Ribstyle.css'></ui:style>
<g:LayoutPanel ui:field="root">
<g:layer left="0%" top="0%" right="0%" height="35pt">
@@ -18,11 +17,15 @@
<mgwtcarousel:Carousel ui:field="carousel">
<mgwtpanel:Panel styleName="{style.page}">
<g:HTMLPanel ui:field="leftwindbotcontainer" styleName="{style.collumn} {style.left}">
<div class="{style.windloadinghint}"><div ui:field="windloadinghintleft" class="{style.windloadinghinttext}"></div></div>
<div class="{style.windloadinghint}">
<div ui:field="windloadinghintleft" class="{style.windloadinghinttext}"></div>
</div>
</g:HTMLPanel>
<g:HTMLPanel ui:field="rightwindbotcontainer"
styleName="{style.collumn} {style.right}">
<div class="{style.windloadinghint}"><div ui:field="windloadinghintright" class="{style.windloadinghinttext}"></div></div>
<div class="{style.windloadinghint}">
<div ui:field="windloadinghintright" class="{style.windloadinghinttext}"></div>
</div>
</g:HTMLPanel>
<g:HTMLPanel ui:field="windcharthint" styleName="{style.windcharthint}"></g:HTMLPanel>
</mgwtpanel:Panel>
@@ -32,10 +35,14 @@
ui:field="startanalysisComponent"></startanalysis:StartlineAnalysisComponent>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.collumn} {style.collumn3}">
<g:HTMLPanel styleName="{style.startlineadvantagepanel}">
<startlineadvantage:StartLineAdvantageComponent
ui:field="startLineCAComponent"></startlineadvantage:StartLineAdvantageComponent>
<g:HTMLPanel styleName="{style.startline_advantage_by_geometry_container}">
<startlineadvantage:StartLineAdvantageComponent
ui:field="startlineAdvantageByGeometryComponent"></startlineadvantage:StartLineAdvantageComponent>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.startline_advantage_by_wind_container}">
<startlineadvantage:StartlineAdvantagesByWindComponent
ui:field="startlineAdvantagesByWindComponent"></startlineadvantage:StartlineAdvantagesByWindComponent>
</g:HTMLPanel>
</g:HTMLPanel>
</mgwtpanel:Panel>
</mgwtcarousel:Carousel>
@@ -4,6 +4,7 @@ import java.util.List;
import com.google.gwt.user.client.rpc.RemoteService;
import com.sap.sailing.dashboards.gwt.shared.dto.RibDashboardRaceInfoDTO;
import com.sap.sailing.dashboards.gwt.shared.dto.StartlineAdvantagesWithMaxAndAverageDTO;
import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.StartAnalysisDTO;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
@@ -14,4 +15,6 @@ public interface RibDashboardService extends RemoteService {
List<StartAnalysisDTO> getStartAnalysisListForCompetitorIDAndLeaderboardName(String competitorIdAsString, String leaderboardName);
List<CompetitorDTO> getCompetitorsInLeaderboard(String leaderboardName);
StartlineAdvantagesWithMaxAndAverageDTO getAdvantagesOnStartline(String leaderboardName);
}
@@ -4,6 +4,7 @@ import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.dashboards.gwt.shared.dto.RibDashboardRaceInfoDTO;
import com.sap.sailing.dashboards.gwt.shared.dto.StartlineAdvantagesWithMaxAndAverageDTO;
import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.StartAnalysisDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
@@ -15,4 +16,5 @@ public interface RibDashboardServiceAsync {
void getCompetitorsInLeaderboard(String leaderboardName, AsyncCallback<List<CompetitorDTO>> callback);
void getAdvantagesOnStartline(String leaderboardName, AsyncCallback<StartlineAdvantagesWithMaxAndAverageDTO> callback);
}
@@ -0,0 +1,26 @@
package com.sap.sailing.dashboards.gwt.client.actions;
/**
* @author Alexander Ries (D062114)
*
*/
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.dashboards.gwt.client.RibDashboardServiceAsync;
import com.sap.sailing.dashboards.gwt.shared.dto.StartlineAdvantagesWithMaxAndAverageDTO;
import com.sap.sse.gwt.client.async.AsyncAction;
public class GetStartlineAdvantagesAction implements AsyncAction<StartlineAdvantagesWithMaxAndAverageDTO> {
private final RibDashboardServiceAsync ribDashboardService;
private final String leaderboardName;
public GetStartlineAdvantagesAction(RibDashboardServiceAsync ribDashboardService, String leaderboardName) {
this.ribDashboardService = ribDashboardService;
this.leaderboardName = leaderboardName;
}
@Override
public void execute(AsyncCallback<StartlineAdvantagesWithMaxAndAverageDTO> callback) {
ribDashboardService.getAdvantagesOnStartline(leaderboardName, callback);
}}
@@ -0,0 +1,15 @@
package com.sap.sailing.dashboards.gwt.client.resources;
/**
* @author Alexander Ries (D062114)
*
*/
public class Colors {
/* -> App colors -- */
public static final String C_PRIMARY = "#000000";
public static final String C_SECONDARY = "#000000";
/* -> Default colors -- */
public static final String C_BACKGROUND = "#000000";
public static final String C_TEXT = "#000000";
public static final String C_TEXT_LIGHT = "#000000";
}
@@ -0,0 +1,19 @@
package com.sap.sailing.dashboards.gwt.client.resources;
/**
* @author Alexander Ries (D062114)
*
*/
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
public interface DashboardResources extends ClientBundle {
interface Style extends CssResource {
// Your classes here
}
// We only need to source the theme file
@Source({"colors.gss", "Ribstyle.css"})
Style style();
}
@@ -1,3 +1,4 @@
@require "colors";
.bar {
height: 100%;
@@ -16,7 +17,7 @@
position: absolute;
border: none;
border-radius: 0;
background-color: #d4d4d4;
background-color: C_PRIMARY;
left: 0;
right: 0;
top: 0;
@@ -60,40 +61,6 @@
right: 0pt;
}
/*??????*/
.panelHeader {
height: 100%;
line-height: 25pt;
vertical-align: middle;
font-size: 15pt;
font-family: 'Open Sans', Arial, Verdana, sans-serif;
width: 100%;
text-align: center;
font-weight: bold;
overflow: visible;
background-color: white;
}
/*?????????*/
.currentaveragepanel {
position: absolute;
border: none;
border-radius: 0pt;
background-color: white;
top: 20pt;
bottom: 75%;
}
/*????????*/
.windchartpanel {
position: absolute;
border: none;
border-radius: 0pt;
background-color: white;
top: 25%;
bottom: 0pt;
}
.left {
left: 0pt;
right: 50%;
@@ -125,19 +92,28 @@
}
.rootpanel {
background-color: #fafafa;
background-color: C_PRIMARY;
width: 100%;
height: 200%;
}
.startlineadvantagepanel {
.startline_advantage_by_wind_container {
position: absolute;
background-color: white;
top: 0pt;
top: 27%;
right: 0pt;
left: 0pt;
bottom: 70%;
margin-bottom: 5pt;
bottom: 0%;
}
.startline_advantage_by_geometry_container {
position: absolute;
background-color: white;
top: 0%;
right: 0pt;
left: 0pt;
bottom: 73%;
margin-bottom: 10pt;
}
.hintpanel {
@@ -0,0 +1,7 @@
@provide 'colors';
@def C_PRIMARY eval("com.company.project.client.resources.Colors.C_PRIMARY");
@def C_SECONDARY eval("com.company.project.client.resources.Colors.C_SECONDARY");
@def C_BACKGROUND eval("com.company.project.client.resources.Colors.C_BACKGROUND");
@def C_TEXT eval("com.company.project.client.resources.Colors.C_TEXT");
@def C_TEXT_LIGHT eval("com.company.project.client.resources.Colors.C_TEXT_LIGHT");
@@ -15,7 +15,7 @@
margin-top: 0;
line-height: 30pt;
vertical-align: middle;
font-size: 15pt;
font-size: 14pt;
font-family: 'Open Sans', Arial, Verdana, sans-serif;
width: 100%;
text-align: center;
@@ -97,7 +97,7 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star
.equals(StartlineAdvantageType.GEOMETRIC)) {
startLineAdvantageType = stringMessages.dashboardStartlineAdvantageByGeometry();
}else{
startLineAdvantageType = stringMessages.dashboardStartlineAdvantageByWind();
startLineAdvantageType = stringMessages.dashboardStartlineAdvantagesByWind();
}
startanalysis_card_line_advantage
.setInnerHTML(startLineAdvantageType
@@ -141,7 +141,7 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star
zoomTypes.add(ZoomTypes.BUOYS);
} else {
timer.setTime(startAnalysisDTO.timeOfStartInMilliSeconds);
zoomTypes.add(ZoomTypes.BOATS);
zoomTypes.add(ZoomTypes.BUOYS);
}
AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor();
RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingServiceAsync,
@@ -20,7 +20,7 @@
margin-top: 5pt;
line-height: 15pt;
vertical-align: middle;
font-size: 12.5pt;
font-size: 13pt;
font-family: 'Open Sans', Arial, Verdana, sans-serif;
width: 100%;
text-align: center;
@@ -56,12 +56,12 @@
.liveAverageCompoment_panel_value_number {
font-family: 'Open Sans', Arial, Verdana, sans-serif;
font-size: 27pt;
font-size: 26pt;
}
.liveAverageCompoment_panel_value_unit {
font-family: 'Open Sans', Arial, Verdana, sans-serif;
font-size: 12pt;
font-size: 15pt;
}
.liveAverageCompoment_panel_value_unit_degrees {
@@ -84,7 +84,7 @@
width: 100%;
height: 100%;
text-align: center;
font-size: 12pt;
font-size: 11pt;
color: grey;
font-family: 'Open Sans', Arial, Verdana, sans-serif;
}
@@ -12,6 +12,7 @@ import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.dashboards.gwt.client.visualeffects.NumberTickingAnimation;
import com.sap.sailing.dashboards.gwt.client.windchart.VerticalWindChartClickListener;
import com.sap.sailing.dashboards.gwt.client.windchart.WindBotComponent;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -73,6 +74,9 @@ public class LiveAverageComponent extends Composite implements HasWidgets, Verti
LiveAverageComponentStyle style;
private StringMessages stringConstants;
private NumberTickingAnimation liveTickingAnimation;
private NumberTickingAnimation averageTickingAnimation;
public LiveAverageComponent() {
initWidget(uiBinder.createAndBindUi(this));
}
@@ -86,6 +90,7 @@ public class LiveAverageComponent extends Composite implements HasWidgets, Verti
* */
public LiveAverageComponent(String header, String unit) {
stringConstants = StringMessages.INSTANCE;
initTickingAnimations();
initWidget(uiBinder.createAndBindUi(this));
liveAveragePanel.getElement().getStyle().setProperty("backgroundColor", "white");
this.header.setInnerText(header);
@@ -99,10 +104,31 @@ public class LiveAverageComponent extends Composite implements HasWidgets, Verti
this.liveLabel.setInnerHTML(stringConstants.dashboardLiveWind());
this.averageLabel.setInnerHTML(stringConstants.dashboardAverageWind()+"<br>"+stringConstants.dashboardAverageWindMinutes(15));
}
private void initTickingAnimations() {
liveTickingAnimation = new NumberTickingAnimation() {
@Override
public void setValueInUI(String value) {
liveNumber.setInnerText(value);
}
};
averageTickingAnimation = new NumberTickingAnimation() {
@Override
public void setValueInUI(String value) {
averageNumber.setInnerText(value);
}
};
}
public void updateValues(String liveValue, String averageValue) {
this.liveNumber.setInnerText(liveValue);
this.averageNumber.setInnerText(averageValue);
public void setLiveValue(String liveValue) {
liveTickingAnimation.execute(liveValue);
}
public void setAverageValue(String averageValue) {
averageTickingAnimation.execute(averageValue);
}
@Override
@@ -1,12 +1,12 @@
@CHARSET "UTF-8";
.startLineAdvantageComponent_liveAveragePanel {
bottom: 25pt;
bottom: 5pt;
margin-top: 4pt;
}
.startLineAdvantageComponent_header {
font-size: 15pt;
font-size: 14pt;
}
.startLineAdvantageComponent_livePanel {
@@ -25,11 +25,11 @@ public class StartLineAdvantageComponent extends LiveAverageComponent implements
private static StringMessages stringConstants = StringMessages.INSTANCE;
public StartLineAdvantageComponent(RibDashboardDataRetriever ribDashboardDataRetriever) {
super(stringConstants.dashboardStartlineAdvantageByWind(), "m");
super(stringConstants.dashboardStartlineAdvantageByGeometry(), "m");
initAndSetStartLineAdvantageStates();
StartLineAdvantageComponentRessources.INSTANCE.css().ensureInjected();
this.header.addClassName(StartLineAdvantageComponentRessources.INSTANCE.css()
.startLineAdvantageComponent_header());
this.header.setInnerText(stringConstants.dashboardStartlineAdvantageByGeometry());
this.header.addClassName(StartLineAdvantageComponentRessources.INSTANCE.css().startLineAdvantageComponent_header());
liveAveragePanel.getElement().addClassName(
StartLineAdvantageComponentRessources.INSTANCE.css().startLineAdvantageComponent_liveAveragePanel());
livePanel.getElement().addClassName(
@@ -39,14 +39,14 @@ public class StartLineAdvantageComponent extends LiveAverageComponent implements
averagePanel.getElement().addClassName(
StartLineAdvantageComponentRessources.INSTANCE.css().startLineAdvantageComponent_averagePanel());
this.liveLabel.setInnerHTML(stringConstants.dashboardLiveWind());
this.averageLabel.setInnerHTML(stringConstants.dashboardAverageWind()+"<br>"+stringConstants.dashboardAverageWindMinutes(60));
this.averageLabel.setInnerHTML(stringConstants.dashboardAverageWind()+"<br>"+stringConstants.dashboardAverageWindMinutes(15));
ribDashboardDataRetriever.addDataObserver(this);
}
private void initAndSetStartLineAdvantageStates() {
startLineAdvantageComponentStateShowsAdvantageByWind = new StartLineAdvantageComponentStateShowsAdvantageByWind();
startLineAdvantageComponentStateShowsAdvantageByGeometry = new StartLineAdvantageComponentStateShowsAdvantageByGeometry();
startLineAdvantageComponentState = startLineAdvantageComponentStateShowsAdvantageByWind;
startLineAdvantageComponentState = startLineAdvantageComponentStateShowsAdvantageByGeometry;
}
@Override
@@ -100,21 +100,21 @@ public class StartLineAdvantageComponent extends LiveAverageComponent implements
String liveValue = NumberFormat.getFormat("#0.0").format(
liveRaceInfoDTO.startLineAdvantageDTO.startLineAdvantage);
String averageValue = NumberFormat.getFormat("#0.0").format(
liveRaceInfoDTO.startLineAdvantageDTO.startlineAdvantageAverage);
liveRaceInfoDTO.startLineAdvantageDTO.average);
startLineAdvantageComponent.liveNumber.setInnerText(liveValue);
startLineAdvantageComponent.averageNumber.setInnerText(averageValue);
lastLiveValue = liveValue;
lastAverageValue = averageValue;
startLineAdvantageComponent.startLineAdvantageComponentStateShowsAdvantageByGeometry.lastLiveValue = NumberFormat
.getFormat("#0.0").format(liveRaceInfoDTO.startLineAdvantageDTO.startLineAdvantage);
startLineAdvantageComponent.startLineAdvantageComponentStateShowsAdvantageByGeometry.lastAverageValue = NumberFormat
.getFormat("#0.0").format(liveRaceInfoDTO.startLineAdvantageDTO.startlineAdvantageAverage);
setLiveValue(NumberFormat
.getFormat("#0.0").format(liveRaceInfoDTO.startLineAdvantageDTO.startLineAdvantage));
setAverageValue(NumberFormat
.getFormat("#0.0").format(liveRaceInfoDTO.startLineAdvantageDTO.average));
}
@Override
public void changeStartLineAdvatageComponentsStateToOtherState(
StartLineAdvantageComponent startLineAdvantageComponent) {
startLineAdvantageComponent.header.setInnerText(stringConstants.dashboardStartlineAdvantageByWind());
startLineAdvantageComponent.header.setInnerText(stringConstants.dashboardStartlineAdvantagesByWind());
startLineAdvantageComponent.startLineAdvantageComponentState = startLineAdvantageComponent.startLineAdvantageComponentStateShowsAdvantageByGeometry;
startLineAdvantageComponent.liveNumber
.setInnerText(startLineAdvantageComponent.startLineAdvantageComponentStateShowsAdvantageByGeometry
@@ -133,15 +133,15 @@ public class StartLineAdvantageComponent extends LiveAverageComponent implements
String liveValue = NumberFormat.getFormat("#0.0").format(
liveRaceInfoDTO.startLineAdvantageDTO.startLineAdvantage);
String averageValue = NumberFormat.getFormat("#0.0").format(
liveRaceInfoDTO.startLineAdvantageDTO.startlineAdvantageAverage);
liveRaceInfoDTO.startLineAdvantageDTO.average);
startLineAdvantageComponent.liveNumber.setInnerText(liveValue);
startLineAdvantageComponent.averageNumber.setInnerText(averageValue);
lastLiveValue = liveValue;
lastAverageValue = averageValue;
startLineAdvantageComponent.startLineAdvantageComponentStateShowsAdvantageByWind.lastLiveValue = NumberFormat
.getFormat("#0.0").format(liveRaceInfoDTO.startLineAdvantageDTO.startLineAdvantage);
startLineAdvantageComponent.startLineAdvantageComponentStateShowsAdvantageByWind.lastAverageValue = NumberFormat
.getFormat("#0.0").format(liveRaceInfoDTO.startLineAdvantageDTO.startlineAdvantageAverage);
setLiveValue(NumberFormat
.getFormat("#0.0").format(liveRaceInfoDTO.startLineAdvantageDTO.startLineAdvantage));
setAverageValue(NumberFormat
.getFormat("#0.0").format(liveRaceInfoDTO.startLineAdvantageDTO.average));
}
@Override
@@ -0,0 +1,115 @@
package com.sap.sailing.dashboards.gwt.client.startlineadvantage;
import java.util.Date;
import java.util.Iterator;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.dashboards.gwt.client.RibDashboardServiceAsync;
import com.sap.sailing.dashboards.gwt.client.actions.GetStartlineAdvantagesAction;
import com.sap.sailing.dashboards.gwt.shared.dto.StartlineAdvantagesWithMaxAndAverageDTO;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
/**
* @author Alexander Ries (D062114)
*
*/
public class StartlineAdvantagesByWindComponent extends Composite implements HasWidgets, TimeListener {
private static StartlineAdvantagesByWindComponentUiBinder uiBinder = GWT
.create(StartlineAdvantagesByWindComponentUiBinder.class);
interface StartlineAdvantagesByWindComponentUiBinder extends UiBinder<Widget, StartlineAdvantagesByWindComponent> {
}
interface StartlineAdvantagesByWindComponentStyle extends CssResource {
}
@UiField(provided = true)
LiveAverageComponent advantageMaximumLiveAverage;
@UiField(provided = true)
StartlineAdvantagesOnLineChart startlineAdvantagesOnLineChart;
@UiField
StartlineAdvantagesByWindComponentStyle style;
private RibDashboardServiceAsync ribDashboardService;
private AsyncActionsExecutor asyncActionsExecutor;
public StartlineAdvantagesByWindComponent(RibDashboardServiceAsync ribDashboardService) {
startlineAdvantagesOnLineChart = new StartlineAdvantagesOnLineChart();
advantageMaximumLiveAverage = new LiveAverageComponent(StringMessages.INSTANCE.dashboardStartlineAdvantagesByWind(), "m");
advantageMaximumLiveAverage.header.getStyle().setFontSize(14, Unit.PT);
advantageMaximumLiveAverage.liveLabel.setInnerHTML("advantage max.");
advantageMaximumLiveAverage.averageLabel.setInnerHTML("advantage max. average "+StringMessages.INSTANCE.dashboardAverageWindMinutes(15));
initWidget(uiBinder.createAndBindUi(this));
this.ribDashboardService = ribDashboardService;
this.asyncActionsExecutor = new AsyncActionsExecutor();
initSampleTimer();
}
private void loadData() {
GetStartlineAdvantagesAction getRibDashboardRaceInfoAction = new GetStartlineAdvantagesAction(
ribDashboardService, "");
asyncActionsExecutor.execute(getRibDashboardRaceInfoAction, new AsyncCallback<StartlineAdvantagesWithMaxAndAverageDTO>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(StartlineAdvantagesWithMaxAndAverageDTO result) {
startlineAdvantagesOnLineChart.setStartlineAdvantages(result.advantages);
advantageMaximumLiveAverage.setLiveValue(""+result.maximum);
advantageMaximumLiveAverage.setAverageValue(""+result.average);
}
});
}
private void initSampleTimer(){
Timer timer = new Timer(PlayModes.Live);
timer.setRefreshInterval(5000);
timer.addTimeListener(this);
timer.play();
}
@Override
public void add(Widget w) {
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
}
@Override
public void clear() {
throw new UnsupportedOperationException("The method clear() is not supported.");
}
@Override
public Iterator<Widget> iterator() {
return null;
}
@Override
public boolean remove(Widget w) {
return false;
}
@Override
public void timeChanged(Date newTime, Date oldTime) {
loadData();
}
}
@@ -0,0 +1,17 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:startlineadvantage="urn:import:com.sap.sailing.dashboards.gwt.client.startlineadvantage">
<ui:style type='com.sap.sailing.dashboards.gwt.client.startlineadvantage.StartlineAdvantagesByWindComponent.StartlineAdvantagesByWindComponentStyle'
src='StartlineAdvantagesByWindComponentStyle.css'></ui:style>
<g:HTMLPanel styleName="{style.startline_advantages_by_wind_component_container}">
<g:HTMLPanel styleName="{style.advantage_maximum_live_average}">
<startlineadvantage:LiveAverageComponent ui:field="advantageMaximumLiveAverage"></startlineadvantage:LiveAverageComponent>
</g:HTMLPanel>
<g:HTMLPanel styleName="{style.advantages_on_line_chart_container}">
<startlineadvantage:StartlineAdvantagesOnLineChart ui:field="startlineAdvantagesOnLineChart"></startlineadvantage:StartlineAdvantagesOnLineChart>
</g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
@@ -0,0 +1,21 @@
@CHARSET "UTF-8";
.startline_advantages_by_wind_component_container{
position: absolute;
height: 100%;
width: 100%;
}
.advantage_maximum_live_average{
position: absolute;
height: 30%;
width: 100%;
top: 4pt;
}
.advantages_on_line_chart_container{
position: absolute;
height: 70%;
top: 30%;
width: 100%;
}
@@ -0,0 +1,316 @@
package com.sap.sailing.dashboards.gwt.client.startlineadvantage;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.moxieapps.gwt.highcharts.client.Animation;
import org.moxieapps.gwt.highcharts.client.Animation.Easing;
import org.moxieapps.gwt.highcharts.client.AxisTitle;
import org.moxieapps.gwt.highcharts.client.Chart;
import org.moxieapps.gwt.highcharts.client.Color;
import org.moxieapps.gwt.highcharts.client.Credits;
import org.moxieapps.gwt.highcharts.client.Legend;
import org.moxieapps.gwt.highcharts.client.PlotLine.DashStyle;
import org.moxieapps.gwt.highcharts.client.Point;
import org.moxieapps.gwt.highcharts.client.Series;
import org.moxieapps.gwt.highcharts.client.Style;
import org.moxieapps.gwt.highcharts.client.ToolTip;
import org.moxieapps.gwt.highcharts.client.labels.AxisLabelsData;
import org.moxieapps.gwt.highcharts.client.labels.AxisLabelsFormatter;
import org.moxieapps.gwt.highcharts.client.labels.XAxisLabels;
import org.moxieapps.gwt.highcharts.client.labels.YAxisLabels;
import org.moxieapps.gwt.highcharts.client.plotOptions.AreaPlotOptions;
import org.moxieapps.gwt.highcharts.client.plotOptions.Marker;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.dashboards.gwt.shared.dto.StartLineAdvantageDTO;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util.Pair;
/**
* @author Alexander Ries (D062114)
*
*/
public class StartlineAdvantagesOnLineChart extends Composite implements HasWidgets {
private static StartlineAdvantagesOnLineChartUiBinder uiBinder = GWT.create(StartlineAdvantagesOnLineChartUiBinder.class);
interface StartlineAdvantagesOnLineChartUiBinder extends UiBinder<Widget, StartlineAdvantagesOnLineChart> {
}
interface StartlineAdvantagesOnLineChartStyle extends CssResource {
}
@UiField
HTMLPanel chartContainer;
@UiField
DivElement confidenceBarHeader;
@UiField
DivElement confidenceBarMinLabel;
@UiField
DivElement confidenceBarMaxLabel;
private Chart chart;
private Series series;
private static final int POINT_ADDING_ANIMATION_DURATION_IN_MILLIS = 2000;
private static final Logger logger = Logger.getLogger(StartlineAdvantagesOnLineChart.class.getName());
public StartlineAdvantagesOnLineChart() {
initWidget(uiBinder.createAndBindUi(this));
initAndAddChart();
setConfidenceColorBarLabelValues();
//TODO Remove and centralize data retrieving
}
private void initAndAddChart() {
chart = initChart();
/**
* Highcharts default chart element spacing is not consistent
* so there is a need to correct the right spacing
* of the chart to make it look visually right.
* */
setCorrectChartSpacing(chart);
setXAxisOfChart(chart);
setYAxisOfChart(chart);
series = createSeries(chart);
chartContainer.add(chart);
}
private Chart initChart() {
Chart chart = new Chart()
.setType(Series.Type.AREA)
.setChartTitleText(null)
.setLegend(new Legend().setEnabled(false))
.setToolTip(new ToolTip().setEnabled(false))
.setCredits(new Credits().setEnabled(false))
.setBackgroundColor("#FFFFFF")
.setBorderColor("#FFFFFF")
.setPlotShadow(false)
.setPlotBorderColor("#FFFFFF")
.setOption("/exporting/enabled", false)
.setShadow(false)
.setStyle(new Style().setPosition("absolute").setTop("0px").setBottom("0px").setLeft("0px").setRight("0px"))
.setAnimation(true);
chart.setSize("100%", "100%");
chart.setSizeToMatchContainer();
return chart;
}
private void setCorrectChartSpacing(Chart chart){
chart.setSpacingTop(17)
.setSpacingBottom(13)
.setSpacingRight(35);
}
private void setXAxisOfChart(Chart chart){
chart.getXAxis()
.setAxisTitle(new AxisTitle().setText(StringMessages.INSTANCE.dashboardDistanceToRCBoat()).setStyle(new Style().setFontFamily("Open Sans")
.setFontSize("14")
.setColor("black").setFontWeight("bold")))
.setLabels(new XAxisLabels()
.setFormatter(new AxisLabelsFormatter() {
public String format(AxisLabelsData axisLabelsData) {
return getAxisLabelValueForLabelData(axisLabelsData.getValueAsLong());
}
}
).setStyle(new Style().setFontFamily("Open Sans")
.setFontSize("12")
.setColor("grey")))
.setLineWidth(1)
.setLineColor("grey")
.setTickColor("grey")
.setTickInterval(50)
.setGridLineColor("white")
.setTickWidth(1)
.setGridLineWidth(0)
.setReversed(true);
}
private void setYAxisOfChart(Chart chart) {
chart.getYAxis()
.setAxisTitle(
new AxisTitle().setText(StringMessages.INSTANCE.dashboardAdvantageInSeconds()).setStyle(
new Style().setFontFamily("Open Sans").setFontSize("14").setColor("black")
.setFontWeight("bold")))
.setLabels(new YAxisLabels().setFormatter(new AxisLabelsFormatter() {
public String format(AxisLabelsData axisLabelsData) {
return String.valueOf(axisLabelsData.getValueAsLong());
}
}).setStyle(new Style().setFontFamily("Open Sans").setFontSize("12").setColor("grey")))
.setLineColor("grey").setGridLineWidth(0).setMinorGridLineWidth(0).setGridLineColor("white")
.setTickWidth(1).setTickColor("grey").setLineWidth(1).setGridLineWidth(0).setExtremes(0, 150).setStartOnTick(true).setEndOnTick(true);
}
private Series createSeries(Chart chart){
Series series = chart
.createSeries()
.setName(null)
.setPlotOptions(
new AreaPlotOptions().setDashStyle(DashStyle.SOLID).setLineWidth(1)
.setMarker(new Marker().setEnabled(false)).setShadow(false).setHoverStateEnabled(false)
.setLineColor("#FFFFFF").setFillColor("#FFFFFF"));
return series;
}
private void setConfidenceColorBarLabelValues() {
confidenceBarHeader.setInnerText("CONFIDENCE");
confidenceBarMaxLabel.setInnerText("High");
confidenceBarMinLabel.setInnerText("Low");
}
private String getAxisLabelValueForLabelData(double labelData) {
String result = String.valueOf(labelData);
com.sap.sse.common.Util.Pair<Double, Double> firstAndLastXValue = getFirstnAndLastXValueOfSeries();
if (firstAndLastXValue != null && firstAndLastXValue.getA() != null && firstAndLastXValue.getB() != null) {
chart.getXAxis().setTickInterval(firstAndLastXValue.getB()/2);
if (labelData == firstAndLastXValue.getA().doubleValue()) {
result = StringMessages.INSTANCE.dashboardRCBoat();
} else if (labelData == firstAndLastXValue.getB().doubleValue()) {
result = StringMessages.INSTANCE.dashboardPinEnd();
}
}
return result;
}
private com.sap.sse.common.Util.Pair<Double, Double> getFirstnAndLastXValueOfSeries(){
if(series != null &&
series.getPoints() != null &&
series.getPoints().length > 1){
Double firstValue = new Double(series.getPoints()[0].getX().doubleValue());
Double lastValue = new Double(series.getPoints()[series.getPoints().length-1].getX().doubleValue());
com.sap.sse.common.Util.Pair<Double, Double> firstAndLastXValue = new Pair<Double, Double>(firstValue, lastValue);
return firstAndLastXValue;
}else{
return null;
}
}
public void setStartlineAdvantages(List<StartLineAdvantageDTO> startlineAdvantages) {
for(StartLineAdvantageDTO startLineAdvantageDTO : startlineAdvantages) {
logger.log(Level.INFO, startLineAdvantageDTO.distanceToRCBoatInMeters +" "+startLineAdvantageDTO.startLineAdvantage);
}
if (series.getPoints() != null && series.getPoints().length > 0) {
updateStartlineAdvantages(startlineAdvantages, series);
} else {
addStartlineAdvantages(startlineAdvantages, series);
chart.addSeries(series , true, new Animation().setDuration(POINT_ADDING_ANIMATION_DURATION_IN_MILLIS).setEasing(Easing.SWING));
}
chart.setSizeToMatchContainer();
}
private void updateStartlineAdvantages(List<StartLineAdvantageDTO> startlineAdvantages, Series series) {
// Series newSeries = createSeries(chart);
// addStartlineAdvantages(startlineAdvantages, newSeries);
removeAllSeriesPoints(chart.getSeries()[0]);
logger.log(Level.INFO, "SERIES: " + chart.getSeries().length);
addStartlineAdvantages(startlineAdvantages, series);
// int counter = 0;
// for (Point point : series.getPoints()) {
// if(startlineAdvantages.size() -1 > counter){
// StartLineAdvantageDTO currentNewStartlineAdvantage = startlineAdvantages.get(counter);
// series.addPoint(currentNewStartlineAdvantage.distanceToRCBoatInMeters, currentNewStartlineAdvantage.startLineAdvantage);
// counter++;
// }
// }
}
private void removeAllSeriesPoints(Series series) {
for (Point point : series.getPoints()) {
series.removePoint(point);
}
}
private void addStartlineAdvantages(List<StartLineAdvantageDTO> startlineAdvantages, Series series){
//TODO Build this with forEach Consumer as soon as the bundle uses GWT 2.8 with Java 8 Support.
for (StartLineAdvantageDTO startlineAdvantage : startlineAdvantages) {
Point point = new Point(startlineAdvantage.distanceToRCBoatInMeters, startlineAdvantage.startLineAdvantage);
series.addPoint(point, false, false, false);
//new Animation().setDuration(POINT_ADDING_ANIMATION_DURATION_IN_MILLIS)
}
setConfidenceGradientColorToSeries(series, startlineAdvantages);
chart.redraw();
}
private void setConfidenceGradientColorToSeries(Series series, List<StartLineAdvantageDTO> startlineAdvantages) {
Color confidenceGradientColor = ConfidenceColorCalculator.getColorWithConfidenceGradients(startlineAdvantages);
series.setPlotOptions(
new AreaPlotOptions().setDashStyle(DashStyle.SOLID).setLineWidth(1)
.setMarker(new Marker().setEnabled(false)).setShadow(false).setHoverStateEnabled(false)
.setLineColor("#FFFFFF").setFillColor(confidenceGradientColor));
}
@Override
public void add(Widget w) {
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
}
@Override
public void clear() {
throw new UnsupportedOperationException("The method clear() is not supported.");
}
@Override
public Iterator<Widget> iterator() {
return null;
}
@Override
public boolean remove(Widget w) {
return false;
}
private static class ConfidenceColorCalculator {
private static final String LOW_CONFIDENCE_COLOR_AS_HEX = "#43cea2";
private static final String HIGHT_CONFIDENCE_COLOR_AS_HEX = "#008FFF";
public static Color getColorWithConfidenceGradients(List<StartLineAdvantageDTO> startlineAdvantages) {
Color color = new Color().setLinearGradient(200, 0, 0, 0);
double lineLenght = getBiggestDistanceToRCBoat(startlineAdvantages);
//TODO Need to find a prettier way of at adding color stops
double lastConfidence = 2;
for (StartLineAdvantageDTO startlineAdvantageDTO : startlineAdvantages) {
if (lastConfidence != startlineAdvantageDTO.confidence) {
lastConfidence = startlineAdvantageDTO.confidence;
double gradientPosition = getGradientStopPositionFromStartlineLenghtAndDistanceToRCBoat(lineLenght,
startlineAdvantageDTO.distanceToRCBoatInMeters);
logger.log(Level.INFO, "Confidence " + startlineAdvantageDTO.confidence + "gradientPosition"
+ gradientPosition);
color.addColorStop(gradientPosition,
getColorAsHexStringFromConfidence(startlineAdvantageDTO.confidence));
}
}
return color;
}
private static double getGradientStopPositionFromStartlineLenghtAndDistanceToRCBoat(double startlineLenght, double distanceToRCBoat) {
return distanceToRCBoat/startlineLenght;
}
private static String getColorAsHexStringFromConfidence(double position) {
if(position > 0.6) {
return HIGHT_CONFIDENCE_COLOR_AS_HEX;
}else {
return LOW_CONFIDENCE_COLOR_AS_HEX;
}
}
private static double getBiggestDistanceToRCBoat(List<StartLineAdvantageDTO> startlineAdvantages) {
StartLineAdvantageDTO startlineAdvantageDTO = startlineAdvantages.get(startlineAdvantages.size()-1);
return startlineAdvantageDTO.distanceToRCBoatInMeters;
}
}
}
@@ -0,0 +1,18 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:highcharts="urn:import:org.moxieapps.gwt.highcharts.client">
<ui:style
type='com.sap.sailing.dashboards.gwt.client.startlineadvantage.StartlineAdvantagesOnLineChart.StartlineAdvantagesOnLineChartStyle'
src='StartlineAdvantagesOnLineChartStyle.css'></ui:style>
<g:HTMLPanel>
<g:HTMLPanel ui:field="chartContainer" styleName="{style.advantages_on_line_chart_container}"></g:HTMLPanel>
<div class="{style.confidence_bar_container}">
<div class="{style.confidence_bar}"></div>
<div ui:field="confidenceBarHeader" class="{style.confidence_bar_header}"></div>
<div ui:field="confidenceBarMinLabel" class="{style.confidence_bar_label} {style.confidence_bar_min_label}"></div>
<div ui:field="confidenceBarMaxLabel" class="{style.confidence_bar_label} {style.confidence_bar_max_label}"></div>
</div>
</g:HTMLPanel>
</ui:UiBinder>
@@ -0,0 +1,63 @@
@CHARSET "UTF-8";
.advantages_on_line_chart_container {
position: absolute !important;
top: 0px;
bottom: 50px;
left: 0px;
right: 0px;
font-family: 'Open Sans', Arial, Verdana, sans-serif !important;
}
.confidence_bar_container {
position: absolute;
height: 50px;
width: 100%;
bottom: 0px;
background-color: white;
}
.confidence_bar{
position: absolute;
top: 0px;
left: 15px;
right: 15px;
height: 15px;
background: -moz-linear-gradient(left, #FFDD00 0%, #008FFF 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left bottom, right bottom, color-stop(0%,#FFDD00), color-stop(100%,#008FFF)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(left, #FFDD00 0%,#008FFF 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(left, #FFDD00 0%,#008FFF 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(left, #FFDD00 0%,#008FFF 100%); /* IE10+ */
background: linear-gradient(to right, #FFDD00 0%,#008FFF 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFDD00', endColorstr='#008FFF',GradientType=0 ); /* IE6*/
}
.confidence_bar_header{
position: absolute;
top: 0px;
left: 15px;
right: 15px;
height: 15px;
color: white;
font-size: 11px;
text-align: center;
vertical-align: center;
font-family: 'Open Sans', Arial, Verdana, sans-serif !important;
}
.confidence_bar_label {
position: absolute;
top: 20px;
font-size: 12px;
color: grey;
font-family: 'Open Sans', Arial, Verdana, sans-serif !important;
}
.confidence_bar_min_label {
left: 15px;
}
.confidence_bar_max_label {
right: 15px;
text-align: right;
}
@@ -0,0 +1,72 @@
package com.sap.sailing.dashboards.gwt.client.visualeffects;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.google.gwt.i18n.client.NumberFormat;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
/**
* Animates number values changes in the UI as ticking animation. Requires a method to change the value of the corresponding UI element.
*
* @author Alexander Ries (D062114)
*
*/
public abstract class NumberTickingAnimation implements NumberValueSetter, TimeListener {
private double previousNumber = 0;
int counter = 0;
Timer timer;
List<String> animationNumberStrings;
private final int ANIMATION_TIME_IN_MILLISECONDS = 500;
public NumberTickingAnimation(){
animationNumberStrings = new ArrayList<String>();
timer = new Timer(PlayModes.Live);
}
public void execute(String numberString) {
double numberAsDouble = Double.parseDouble(numberString);
animationNumberStrings.clear();
animationNumberStrings = getValuesBetweenDoubleOldAndNewNumber(numberAsDouble);
int animationTimePerNumber = ANIMATION_TIME_IN_MILLISECONDS / animationNumberStrings.size();
timer.setRefreshInterval(animationTimePerNumber);
timer.addTimeListener(this);
timer.play();
}
private List<String> getValuesBetweenDoubleOldAndNewNumber(double number) {
List<String> result = new ArrayList<String>();
double counter = previousNumber;
if (previousNumber < number) {
while (counter <= number) {
counter = counter + 0.1;
result.add(NumberFormat.getFormat("#0.0").format(counter));
}
} else {
while (counter >= number) {
counter = counter - 0.1;
result.add(NumberFormat.getFormat("#0.0").format(counter));
}
}
previousNumber = number;
return result;
}
@Override
public void timeChanged(Date newTime, Date oldTime) {
if (animationNumberStrings.size() > counter) {
String value = animationNumberStrings.get(counter);
setValueInUI(value);
counter++;
} else {
timer.pause();
timer.removeTimeListener(this);
counter = 0;
}
}
}
@@ -0,0 +1,13 @@
package com.sap.sailing.dashboards.gwt.client.visualeffects;
/**
* @author Alexander Ries (D062114)
*
*/
public interface NumberValueSetter {
/**
* Implement the new value setting of a UI Element;
*/
public void setValueInUI(String value);
}
@@ -115,6 +115,12 @@ public class VerticalWindChart extends Composite implements HasWidgets {
private void setChartOptions() {
verticalWindChart.setType(Series.Type.AREA_SPLINE).setInverted(true).setChartTitleText(" ").setMarginTop(10)
.setMarginBottom(25).setMarginRight(20)
.setBackgroundColor("#FFFFFF")
.setBorderColor("#FFFFFF")
.setPlotShadow(false)
.setPlotBorderColor("#FFFFFF")
.setOption("/exporting/enabled", false)
.setShadow(false)
.setBarPlotOptions(new BarPlotOptions().setDataLabels(new DataLabels().setEnabled(true)))
.setLegend(new Legend().setEnabled(false)).setCredits(new Credits().setEnabled(false))
.setToolTip(new ToolTip().setEnabled(false));
@@ -128,7 +134,8 @@ public class VerticalWindChart extends Composite implements HasWidgets {
.setLabels(
new XAxisLabels().setStyle(new Style().setFontFamily("Arial").setFontSize("12")
.setColor("grey"))).setLineColor("grey").setTickWidth(0.5).setLineWidth(1)
.setTickWidth(1).setTickColor("grey").setOffset(0).setMinPadding(20)
.setTickWidth(1).setTickColor("grey").setOffset(0).setMinPadding(20).setGridLineColor("white")
.setGridLineWidth(0)
.setDateTimeLabelFormats(new DateTimeLabelFormats().setMonth("%e. %b").setYear("%b"));
}
@@ -144,6 +151,8 @@ public class VerticalWindChart extends Composite implements HasWidgets {
.setLineWidth(1)
.setEndOnTick(true)
.setStartOnTick(true)
.setGridLineColor("transparent")
.setGridLineWidth(0)
.setOffset(0)
.setMaxPadding(0)
.setLabels(
@@ -174,16 +174,12 @@ public class WindBotComponent extends Composite implements HasWidgets, WindBotDa
Point[] directionPoints = convertWindFixListIntoPointsArray(windTrackInfoDTO.windFixes,
WindType.DIRECTION);
trueWindSpeedLiveAverageComponent.updateValues(
""
+ NumberFormat.getFormat("#0.0").format(
speedPoints[speedPoints.length - 1].getY().doubleValue()), ""
+ NumberFormat.getFormat("#0.0").format(movingAverageSpeed.getAverage()));
trueWindDirectionLiveAverageComponent.updateValues(
""
+ NumberFormat.getFormat("#0.0").format(
directionPoints[directionPoints.length - 1].getY().doubleValue()), ""
+ NumberFormat.getFormat("#0.0").format(movingAverageDirection.getAverage()));
trueWindSpeedLiveAverageComponent.setLiveValue(""+NumberFormat.getFormat("#0.0").format(speedPoints[speedPoints.length - 1].getY().doubleValue()));
trueWindSpeedLiveAverageComponent.setAverageValue(""+NumberFormat.getFormat("#0.0").format(movingAverageSpeed.getAverage()));
trueWindDirectionLiveAverageComponent.setLiveValue(""+NumberFormat.getFormat("#0.0").format(directionPoints[directionPoints.length - 1].getY().doubleValue()));
trueWindDirectionLiveAverageComponent.setAverageValue(""+NumberFormat.getFormat("#0.0").format(movingAverageDirection.getAverage()));
trueWindSpeedVerticalWindChart.addPointsToSeriesWithAverage(speedPoints,
movingAverageSpeed.getAverage());
trueWindDirectionVerticalWindChart.addPointsToSeriesWithAverage(directionPoints,
@@ -11,7 +11,7 @@
height: 45pt;
line-height: 45pt;
vertical-align: middle;
font-size: 15pt;
font-size: 14pt;
font-family: 'Open Sans', Arial, Verdana, sans-serif;
width: 100%;
text-align: center;
@@ -0,0 +1,15 @@
package com.sap.sailing.dashboards.gwt.server;
import com.sap.sailing.domain.tracking.TrackedRace;
/**
* Informs the listener about changes in a certain environment, where a {@link TrackedRace} with
* {@link TrackedRace#getStatus()} live is continuously required.
*
* @author Alexander Ries (D062114)
*
*/
public interface LiveTrackedRaceListener {
public void liveTrackedRaceDidChange(TrackedRace trackedRace);
}
@@ -0,0 +1,29 @@
package com.sap.sailing.dashboards.gwt.server;
import java.util.ArrayList;
import java.util.List;
import com.sap.sailing.domain.tracking.TrackedRace;
/**
* Is continuously looking for {@link TrackedRace} with {@link TrackedRace#getStatus()} live and
* notifies {@link LiveTrackedRaceListener} if the current live {@link TrackedRace} has changed.
*
*
* @author Alexander Ries (D062114)
*
*/
public interface LiveTrackedRaceProvider {
List<LiveTrackedRaceListener> listener = new ArrayList<LiveTrackedRaceListener>();
public void notifyLiveTrackedRaceListenerAboutLiveTrackedRaceChange(TrackedRace trackedRace);
default void addLiveTrackedRaceListener(LiveTrackedRaceListener liveTrackedRaceListener){
listener.add(liveTrackedRaceListener);
}
default void removeLiveTrackedRaceListener(LiveTrackedRaceListener liveTrackedRaceListener){
listener.remove(liveTrackedRaceListener);
}
}
@@ -2,35 +2,45 @@ package com.sap.sailing.dashboards.gwt.server;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.sap.sailing.dashboards.gwt.client.RibDashboardService;
import com.sap.sailing.dashboards.gwt.client.startanalysis.StartlineAdvantageType;
import com.sap.sailing.dashboards.gwt.server.startanalysis.StartAnalysisCreationController;
import com.sap.sailing.dashboards.gwt.server.startlineadvantages.StartlineAdvantagesCalculator;
import com.sap.sailing.dashboards.gwt.shared.MovingAverage;
import com.sap.sailing.dashboards.gwt.shared.ResponseMessage;
import com.sap.sailing.dashboards.gwt.shared.dto.RibDashboardRaceInfoDTO;
import com.sap.sailing.dashboards.gwt.shared.dto.StartLineAdvantageDTO;
import com.sap.sailing.dashboards.gwt.shared.dto.StartlineAdvantagesWithMaxAndAverageDTO;
import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.StartAnalysisDTO;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.common.LegType;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.tracking.GPSFix;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.tracking.TrackedLeg;
import com.sap.sailing.domain.polars.PolarDataService;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.RacingEventService;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.impl.MillisecondsTimePoint;
/**
@@ -39,7 +49,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
* @author Alexander Ries (D062114)
*
*/
public class RibDashboardServiceImpl extends RemoteServiceServlet implements RibDashboardService {
public class RibDashboardServiceImpl extends RemoteServiceServlet implements RibDashboardService, LiveTrackedRaceProvider {
/**
*
@@ -47,19 +57,14 @@ public class RibDashboardServiceImpl extends RemoteServiceServlet implements Rib
private static final long serialVersionUID = 1L;
private StartAnalysisCreationController startAnalysisCreationController;
private StartlineAdvantagesCalculator startlineAdvantagesCalculator;
/**
* Variable contains last {@link TrackedRace} that is or was live
* */
private TrackedRace runningRace;
/**
* {@link MovingAverage} of last 400 start line advantage values during the last races. See initialization at
* {@link #RibDashboardServiceImpl()}) Advantage by wind is the advantage in meters that a boat, starting a the pin
* end of the line, has, compared to a boat starting at the very right side of the line.
* */
private MovingAverage averageStartLineAdvantageByWind;
/**
* {@link MovingAverage} of last 400 start line advantage values during the last races. See initialization at
* {@link #RibDashboardServiceImpl()}) Advantage by geometry is the delta in meters of the distance from race
@@ -74,18 +79,24 @@ public class RibDashboardServiceImpl extends RemoteServiceServlet implements Rib
private static final Logger logger = Logger.getLogger(RibDashboardServiceImpl.class.getName());
public RibDashboardServiceImpl() {
context = Activator.getDefault();
racingEventServiceTracker = createAndOpenRacingEventServiceTracker(context);
baseDomainFactory = getRacingEventService().getBaseDomainFactory();
startAnalysisCreationController = new StartAnalysisCreationController(getRacingEventService());
averageStartLineAdvantageByWind = new MovingAverage(400);
averageStartLineAdvantageByGeometry = new MovingAverage(400);
this.context = Activator.getDefault();
this.racingEventServiceTracker = createAndOpenRacingEventServiceTracker(context);
this.baseDomainFactory = getRacingEventService().getBaseDomainFactory();
this.startAnalysisCreationController = new StartAnalysisCreationController(getRacingEventService());
this.startlineAdvantagesCalculator = new StartlineAdvantagesCalculator(getPolarService());
addLiveTrackedRaceListener(startlineAdvantagesCalculator);
this.averageStartLineAdvantageByGeometry = new MovingAverage(400);
}
protected RacingEventService getRacingEventService() {
return racingEventServiceTracker.getService(); // grab the service
}
private PolarDataService getPolarService() {
ServiceReference<PolarDataService> polarServiceReference = context.getServiceReference(PolarDataService.class);
PolarDataService polarDataService = context.getService(polarServiceReference);
return polarDataService;
}
protected ServiceTracker<RacingEventService, RacingEventService> createAndOpenRacingEventServiceTracker(
BundleContext context) {
@@ -108,7 +119,7 @@ public class RibDashboardServiceImpl extends RemoteServiceServlet implements Rib
TimePoint timePointOfRequest = MillisecondsTimePoint.now();
if (checkIfRaceIsStillRunning(timePointOfRequest, leaderboardName)) {
fillLiveRaceInfoDTOWithRaceData(lRInfo, timePointOfRequest);
fillLiveRaceInfoDTOWithStartLineAdavantageData(lRInfo, timePointOfRequest);
fillLiveRaceInfoDTOWithStartLineAdavantageByGeometryData(lRInfo, timePointOfRequest);
lRInfo.responseMessage = ResponseMessage.RACE_LIVE;
} else {
lRInfo.responseMessage = ResponseMessage.NO_RACE_LIVE;
@@ -154,6 +165,7 @@ public class RibDashboardServiceImpl extends RemoteServiceServlet implements Rib
for (Fleet fleet : column.getFleets()) {
TrackedRace race = column.getTrackedRace(fleet);
if (race != null) {
notifyLiveTrackedRaceListenerAboutLiveTrackedRaceChange(race);
TimePoint startOfRace = race.getStartOfRace();
// not relying on isLive() because the time window is too short
// to retrieve wind information we need to extend the time window
@@ -185,55 +197,68 @@ public class RibDashboardServiceImpl extends RemoteServiceServlet implements Rib
return result;
}
private void fillLiveRaceInfoDTOWithStartLineAdavantageData(RibDashboardRaceInfoDTO lRInfo, TimePoint timePoint)
throws NoWindException {
private void fillLiveRaceInfoDTOWithStartLineAdavantageByGeometryData(RibDashboardRaceInfoDTO lRInfo,
TimePoint timePoint) throws NoWindException {
if (runningRace != null && timePoint != null) {
StartLineAdvantageDTO startLineAdvantageDTO = new StartLineAdvantageDTO();
StartlineAdvantageType startlineAdvantageType = getStartlineAdvantageType(runningRace, timePoint);
if (startlineAdvantageType == null || startlineAdvantageType == StartlineAdvantageType.WIND) {
startLineAdvantageDTO.startLineAdvatageType = StartlineAdvantageType.WIND;
double startlineAdvantage = runningRace.getStartLine(timePoint).getAdvantage().getMeters();
startLineAdvantageDTO.startLineAdvantage = startlineAdvantage;
averageStartLineAdvantageByWind.add(startlineAdvantage);
startLineAdvantageDTO.startlineAdvantageAverage = averageStartLineAdvantageByWind.getAverage();
} else if (startlineAdvantageType == StartlineAdvantageType.GEOMETRIC) {
startLineAdvantageDTO.startLineAdvatageType = StartlineAdvantageType.GEOMETRIC;
double startlineAdvantage = runningRace.getStartLine(timePoint).getAdvantage().getMeters();
startLineAdvantageDTO.startLineAdvantage = startlineAdvantage;
averageStartLineAdvantageByGeometry.add(startlineAdvantage);
startLineAdvantageDTO.startlineAdvantageAverage = averageStartLineAdvantageByGeometry.getAverage();
}
startLineAdvantageDTO.startLineAdvatageType = StartlineAdvantageType.GEOMETRIC;
double startlineAdvantage = calculateStartlineAdvantageByGeometry();
startLineAdvantageDTO.startLineAdvantage = startlineAdvantage;
averageStartLineAdvantageByGeometry.add(startlineAdvantage);
startLineAdvantageDTO.average = averageStartLineAdvantageByGeometry.getAverage();
lRInfo.startLineAdvantageDTO = startLineAdvantageDTO;
}
}
private StartlineAdvantageType getStartlineAdvantageType(TrackedRace trackedRace, TimePoint timePoint) {
try {
LegType typeOfFirstLeg;
typeOfFirstLeg = getFirstLegTypeOfTrackedRaceAtTimePoint(trackedRace, timePoint);
switch (typeOfFirstLeg) {
case UPWIND:
return StartlineAdvantageType.WIND;
case REACHING:
return StartlineAdvantageType.GEOMETRIC;
default:
return StartlineAdvantageType.WIND;
private double calculateStartlineAdvantageByGeometry() {
double result = 0.0;
Course course = runningRace.getRace().getCourse();
if (course != null) {
Waypoint startlineWayPoint = course.getFirstLeg().getFrom();
Waypoint firstmarkWayPoint = course.getFirstLeg().getTo();
if (startlineWayPoint != null && firstmarkWayPoint != null) {
Pair<Position, Position> startlineMarkPositions = retrieveStartlineMarkPositionsFromStartLineWayPoint(startlineWayPoint);
Position firstMarkPosition = retrieveFirstMarkPositionFromFirstMarkWayPoint(firstmarkWayPoint);
if (startlineMarkPositions != null && firstMarkPosition != null) {
Distance rcToMark = firstMarkPosition.getDistance(startlineMarkPositions.getA());
Distance pinToMark = firstMarkPosition.getDistance(startlineMarkPositions.getB());
return rcToMark.getMeters() - pinToMark.getMeters();
}
}
} catch (NoWindException e) {
e.printStackTrace();
return null;
}
return result;
}
private LegType getFirstLegTypeOfTrackedRaceAtTimePoint(TrackedRace trackedRace, TimePoint timePoint)
throws NoWindException {
Iterable<TrackedLeg> trackedLegs = trackedRace.getTrackedLegs();
if (trackedLegs != null && trackedLegs.iterator().hasNext()) {
TrackedLeg firstLegInTrackedRace = trackedLegs.iterator().next();
return firstLegInTrackedRace.getLegType(timePoint);
} else {
return null;
private Pair<Position, Position> retrieveStartlineMarkPositionsFromStartLineWayPoint(Waypoint startLineWayPoint) {
Pair<Position, Position> startLineMarkPositions = null;
Iterator<Mark> markIterator = startLineWayPoint.getMarks().iterator();
if (markIterator.hasNext()) {
Mark startboat = (Mark) markIterator.next();
if (markIterator.hasNext()) {
Mark pinEnd = (Mark) markIterator.next();
TimePoint now = MillisecondsTimePoint.now();
Position startBoatPosition = getPositionFromMarkAtTimePoint(runningRace, startboat, now);
Position pinEndPosition = getPositionFromMarkAtTimePoint(runningRace, pinEnd, now);
return new Pair<Position, Position>(startBoatPosition, pinEndPosition);
}
}
return startLineMarkPositions;
}
private Position getPositionFromMarkAtTimePoint(TrackedRace trackedRace, Mark mark, TimePoint timePoint) {
GPSFixTrack<Mark, GPSFix> fixTrack = trackedRace.getTrack(mark);
return fixTrack.getEstimatedPosition(timePoint, true);
}
private Position retrieveFirstMarkPositionFromFirstMarkWayPoint(Waypoint firstMarkWayPoint) {
Position firstMarkPosition = null;
if (firstMarkWayPoint.getMarks().iterator().hasNext()) {
Mark firstMark = firstMarkWayPoint.getMarks().iterator().next();
TimePoint now = MillisecondsTimePoint.now();
firstMarkPosition = getPositionFromMarkAtTimePoint(runningRace, firstMark, now);
logger.log(Level.INFO, "Firstmark: " + firstMarkPosition);
}
return firstMarkPosition;
}
protected com.sap.sailing.domain.base.DomainFactory getBaseDomainFactory() {
@@ -263,10 +288,20 @@ public class RibDashboardServiceImpl extends RemoteServiceServlet implements Rib
logger.log(Level.INFO, "getCompetitorsInLeaderboard(...) Request.");
if (leaderboardName != null) {
Leaderboard lb = getRacingEventService().getLeaderboardByName(leaderboardName);
return baseDomainFactory.getCompetitorDTOList(lb.getCompetitorsFromBestToWorst(new MillisecondsTimePoint(
new Date())));
return baseDomainFactory.getCompetitorDTOList(lb.getCompetitorsFromBestToWorst(MillisecondsTimePoint.now()));
} else {
return null;
}
}
@Override
public StartlineAdvantagesWithMaxAndAverageDTO getAdvantagesOnStartline(String leaderboardName) {
return startlineAdvantagesCalculator.getStartLineAdvantagesAccrossLineAtTimePoint(MillisecondsTimePoint.now());
}
@Override
public void notifyLiveTrackedRaceListenerAboutLiveTrackedRaceChange(TrackedRace trackedRace) {
listener.forEach(listener -> listener.liveTrackedRaceDidChange(trackedRace));
}
}
@@ -0,0 +1,23 @@
package com.sap.sailing.dashboards.gwt.server.startlineadvantages;
import com.sap.sailing.domain.common.ManeuverType;
/**
* @author Alexander Ries (D062114)
*
*/
public class DefaultPolarValues {
private final static double TACKING_ANGLE = 40;
private final static double JIBING_ANGLE = 30;
public static double getManouvreAngle(ManeuverType maneuverType) {
double result = 0;
if (maneuverType.equals(ManeuverType.TACK)) {
result = TACKING_ANGLE * 2;
} else if (maneuverType.equals(ManeuverType.JIBE)) {
result = JIBING_ANGLE * 2;
}
return result;
}
}
@@ -0,0 +1,51 @@
package com.sap.sailing.dashboards.gwt.server.startlineadvantages;
import org.apache.commons.math.ArgumentOutsideDomainException;
import org.apache.commons.math.analysis.interpolation.SplineInterpolator;
import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction;
import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.common.impl.KnotSpeedImpl;
/**
* Contains a {@link PolynomialSplineFunction} that describes the boat speed at incoming wind angles from 0 to 180 degrees.
*
* @author Alexander Ries (D062114)
*
*/
public class DefaultPolarWindAngleBoatSpeedFunction {
private PolynomialSplineFunction windAngleBoatBearingSpeedFunction;
/**
* X and Y values for the wind angle boat speed spline function. Ranging from 0 to 180 degrees wind angle.
* */
private final double [] windAngleXValues = {0.0, 10.0, 33.0, 44.0, 55.0, 96.0, 130.0, 155.0, 180.0};
private final double [] boatBearingYValues = {0.0, 7.0, 11.0, 11.5, 12.5, 14.5, 15.0, 17.0, 11.0};
public DefaultPolarWindAngleBoatSpeedFunction() {
SplineInterpolator splineInterpolator = new SplineInterpolator();
windAngleBoatBearingSpeedFunction = splineInterpolator.interpolate(windAngleXValues, boatBearingYValues);
}
public Speed getBoatSpeedForWindAngleAndSpeed(double angle, double speed) {
Speed result = null;
try {
double boatSpeed = windAngleBoatBearingSpeedFunction.value(convert360AngleTo180RangeAngle(angle));
result = new KnotSpeedImpl(boatSpeed);
} catch (ArgumentOutsideDomainException e) {
e.printStackTrace();
}
return result;
}
private double convert360AngleTo180RangeAngle(double angle) {
double result = 0;
if (angle <= 180) {
result = angle;
}
if (angle > 180) {
result = 360 - angle;
}
return result;
}
}
@@ -0,0 +1,345 @@
package com.sap.sailing.dashboards.gwt.server.startlineadvantages;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.dashboards.gwt.server.LiveTrackedRaceListener;
import com.sap.sailing.dashboards.gwt.server.startlineadvantages.precalculation.AbstracPreCalculationDataRetriever;
import com.sap.sailing.dashboards.gwt.shared.MovingAverage;
import com.sap.sailing.dashboards.gwt.shared.dto.StartLineAdvantageDTO;
import com.sap.sailing.dashboards.gwt.shared.dto.StartlineAdvantagesWithMaxAndAverageDTO;
import com.sap.sailing.domain.common.Bearing;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.MeterDistance;
import com.sap.sailing.domain.polars.PolarDataService;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Pair;
/**
* @author Alexander Ries (D062114)
*
*/
public class StartlineAdvantagesCalculator extends AbstracPreCalculationDataRetriever implements LiveTrackedRaceListener{
private TrackedRace currentLiveTrackedRace;
private MovingAverage advantageMaximumAverage;
private PolarDataService polarDataService;
private DefaultPolarWindAngleBoatSpeedFunction defaultPolarSpeedWindAngleFunction;
private static final Logger logger = Logger.getLogger(StartlineAdvantagesCalculator.class.getName());
public StartlineAdvantagesCalculator(PolarDataService polarDataService){
this.advantageMaximumAverage = new MovingAverage(500);
this.polarDataService = polarDataService;
this.defaultPolarSpeedWindAngleFunction = new DefaultPolarWindAngleBoatSpeedFunction();
}
// Get Course Buoys
// Get Wind
// Get Maneuver Angle and Boat Speed at Angle
// Get Positions on start line with normal upwind and overlaying lay line upwind
// Calculate intersection point(s) between start line and lay lines
// Calculate duration from start line to first mark for overlaying positions
// Calculate intersection points from normal upwind start positions to first mark
// Calculate duration from two new distances for normal upwind starts
// Put all durations in one set
// Get the smallest of the durations and subtract number from every other number
public StartlineAdvantagesWithMaxAndAverageDTO getStartLineAdvantagesAccrossLineAtTimePoint(TimePoint timepoint){
StartlineAdvantagesWithMaxAndAverageDTO result = new StartlineAdvantagesWithMaxAndAverageDTO();
if (currentLiveTrackedRace != null) {
retrieveDataForCalculation(currentLiveTrackedRace);
if(isStartlineCompletelyUnderneathLaylines()) {
logger.log(Level.INFO, "Startline is completely underneath laylines");
Pair<Double, Double> advantagesRange = new Pair<Double, Double>(0.0, startlineLenghtInMeters);
result.advantages = calculateStartlineAdvantagesUnderneathLaylinesInRange(advantagesRange);
double maximum = getMaximumAdvantageOfStartlineAdvantageDTOs(result.advantages);
result.maximum = maximum;
advantageMaximumAverage.add(maximum);
result.average = advantageMaximumAverage.getAverage();
} else if (isStartlineCompletelyAboveLaylines()) {
logger.log(Level.INFO, "Startline is completely above laylines");
Pair<Double, Double> advantagesRange = new Pair<Double, Double>(0.0, startlineLenghtInMeters);
result.advantages = calculatePolarBasedStartlineAdvantagesInRange(advantagesRange);
subtractMinimumOfAllStartlineAdvantages(result.advantages);
double maximum = getMaximumAdvantageOfStartlineAdvantageDTOs(result.advantages);
result.maximum = maximum;
advantageMaximumAverage.add(maximum);
result.average = advantageMaximumAverage.getAverage();
subtractAgainstMaximumOfAllStartlineAdvantages(result.advantages, maximum);
} else {
logger.log(Level.INFO, "Layline(s) cross startline");
Position intersectionOfRightLaylineAndStartline = getIntersectionOfRightLaylineAndStartline();
Position intersectionOfleftLaylineAndStartline = getIntersectionOfLeftLaylineAndStartline();
Pair<Double, Double> polarBasedStartlineAdvatagesRange = getStartAndEndPointOfPolarBasedStartlineAdvatagesInDistancesToRCBoat(intersectionOfRightLaylineAndStartline, intersectionOfleftLaylineAndStartline);
Pair<Double, Double> pinEndStartlineAdvatagesRange = getPinEndStartlineAdvantagesRangeFromPolarAdvantagesRange(polarBasedStartlineAdvatagesRange);
result.advantages = calculatePolarBasedStartlineAdvantagesInRange(polarBasedStartlineAdvatagesRange);
subtractMinimumOfAllStartlineAdvantages(result.advantages);
double maximum = getMaximumAdvantageOfStartlineAdvantageDTOs(result.advantages);
result.maximum = maximum;
advantageMaximumAverage.add(maximum);
result.average = advantageMaximumAverage.getAverage();
subtractAgainstMaximumOfAllStartlineAdvantages(result.advantages, maximum);
addClosingZeroPointToMixedAdvantages(result.advantages, pinEndStartlineAdvatagesRange);
}
} else {
logger.log(Level.INFO, "No live race available for startlineadvantages calculation");
}
return result;
}
private boolean isBearingAboveAdvantageLines(Bearing bearing){
boolean result = false;
Bearing bearingOfRightLaylineInDeg = new DegreeBearingImpl(wind.getBearing().getDegrees() - meouvreAngle / 2);
Bearing bearingOfLeftLaylineInDeg = new DegreeBearingImpl(wind.getBearing().getDegrees() + meouvreAngle / 2);
if (bearing.getDegrees() < bearingOfRightLaylineInDeg.getDegrees() && bearing.getDegrees() > 0 ||
bearing.getDegrees() > bearingOfLeftLaylineInDeg.getDegrees() && bearing.getDegrees() < 360) {
result = true;
}
return result;
}
private boolean isBearingUnderneathAdvantageLines(Bearing bearing){
boolean result = false;
Bearing bearingOfRightLaylineInDeg = new DegreeBearingImpl(wind.getBearing().getDegrees() - meouvreAngle / 2);
Bearing bearingOfLeftLaylineInDeg = new DegreeBearingImpl(wind.getBearing().getDegrees() + meouvreAngle / 2);
logger.log(Level.INFO, "Underneath bearingOfRightLaylineInDeg?"+bearingOfRightLaylineInDeg);
logger.log(Level.INFO, "Underneath bearingOfLeftLaylineInDeg?"+bearingOfLeftLaylineInDeg);
if (bearing.getDegrees() > bearingOfRightLaylineInDeg.getDegrees() && bearing.getDegrees() < bearingOfLeftLaylineInDeg.getDegrees()) {
result = true;
}
return result;
}
private boolean isStartlineCompletelyAboveLaylines() {
boolean result = false;
Bearing bearingRCBoatToFirstMark = new DegreeBearingImpl(
startlineAndFirstMarkPositions.firstMarkPosition.getBearingGreatCircle(
startlineAndFirstMarkPositions.startBoatPosition).getDegrees());
Bearing bearingPinEndToFirstMark = new DegreeBearingImpl(
startlineAndFirstMarkPositions.firstMarkPosition.getBearingGreatCircle(
startlineAndFirstMarkPositions.pinEndPosition).getDegrees());
if (isBearingAboveAdvantageLines(bearingRCBoatToFirstMark) && isBearingAboveAdvantageLines(bearingPinEndToFirstMark)) {
result = true;
}
return result;
}
private boolean isStartlineCompletelyUnderneathLaylines() {
boolean result = false;
Bearing bearingFirstMarkToRCBoat = new DegreeBearingImpl(
startlineAndFirstMarkPositions.firstMarkPosition.getBearingGreatCircle(
startlineAndFirstMarkPositions.startBoatPosition).getDegrees());
Bearing bearingFirstMarkToPinEnd = new DegreeBearingImpl(
startlineAndFirstMarkPositions.firstMarkPosition.getBearingGreatCircle(
startlineAndFirstMarkPositions.pinEndPosition).getDegrees());
logger.log(Level.INFO, "Underneath RC?"+bearingFirstMarkToRCBoat);
logger.log(Level.INFO, "Underneath PIN?"+bearingFirstMarkToPinEnd);
if (isBearingUnderneathAdvantageLines(bearingFirstMarkToRCBoat) && isBearingUnderneathAdvantageLines(bearingFirstMarkToPinEnd)) {
result = true;
}
return result;
}
private Pair<Double, Double> getStartAndEndPointOfPolarBasedStartlineAdvatagesInDistancesToRCBoat(Position rightIntersection, Position leftIntersection) {
Pair<Double, Double> result = null;
if(rightIntersection != null && leftIntersection == null) {
double distanceFromIntersectionToRCBoatInMeters = rightIntersection.getDistance(startlineAndFirstMarkPositions.startBoatPosition).getMeters();
result = new Pair<Double, Double>(0.0, distanceFromIntersectionToRCBoatInMeters);
} else if(rightIntersection == null && leftIntersection != null) {
double distanceFromIntersectionToRCBoatInMeters = leftIntersection.getDistance(startlineAndFirstMarkPositions.startBoatPosition).getMeters();
result = new Pair<Double, Double>(distanceFromIntersectionToRCBoatInMeters, startlineLenghtInMeters);
} else if(rightIntersection != null && leftIntersection != null) {
result = new Pair<Double, Double>(0.0, startlineLenghtInMeters);
}
return result;
}
private Position getIntersectionOfRightLaylineAndStartline () {
Position result = null;
Bearing bearingOfRightLaylineInDeg = new DegreeBearingImpl(wind.getBearing().getDegrees() - meouvreAngle / 2);
result = calculateIntersectionPointsOfStartlineAndLaylineWithBearing(bearingOfRightLaylineInDeg);
return result;
}
private Position getIntersectionOfLeftLaylineAndStartline () {
Position result = null;
Bearing bearingOfRightLaylineInDeg = new DegreeBearingImpl(wind.getBearing().getDegrees() + meouvreAngle / 2);
result = calculateIntersectionPointsOfStartlineAndLaylineWithBearing(bearingOfRightLaylineInDeg);
return result;
}
private Position calculateIntersectionPointsOfStartlineAndLaylineWithBearing(Bearing bearing) {
Position result = null;
Bearing bearingOfStartlineInRad = startlineAndFirstMarkPositions.startBoatPosition
.getBearingGreatCircle(startlineAndFirstMarkPositions.pinEndPosition);
Bearing bearingOfStartlineInDeg = new DegreeBearingImpl(bearingOfStartlineInRad.getDegrees());
logger.log(Level.INFO, "bearingOfStartlineInDeg " + bearingOfStartlineInDeg);
logger.log(Level.INFO, "bearingOfLaylineInDeg " + bearing);
Position intersectionPointLaylineStartline = startlineAndFirstMarkPositions.firstMarkPosition
.getIntersection(bearing, startlineAndFirstMarkPositions.pinEndPosition,
bearingOfStartlineInDeg);
logger.log(Level.INFO, "rightIntersectionPointLaylineStartline " + intersectionPointLaylineStartline);
Bearing bearingIntersectionPointToFirstMark = new DegreeBearingImpl(
startlineAndFirstMarkPositions.firstMarkPosition.getBearingGreatCircle(
intersectionPointLaylineStartline).getDegrees());
if (bearingIntersectionPointToFirstMark.getDegrees() < bearing.getDegrees() + 1 &&
bearingIntersectionPointToFirstMark.getDegrees() > bearing.getDegrees() - 1 &&
isOnStartline(intersectionPointLaylineStartline)) {
result = intersectionPointLaylineStartline;
logger.log(Level.INFO, "Layline crosses startline");
}
logger.log(Level.INFO, "bearingLeftIntersectionPointToFirstMark.getDegrees() "
+ bearingIntersectionPointToFirstMark.getDegrees());
return result;
}
private boolean isOnStartline(Position position) {
boolean result = false;
Distance distanceToStartline = position.getDistanceToLine(startlineAndFirstMarkPositions.startBoatPosition, startlineAndFirstMarkPositions.pinEndPosition);
if (distanceToStartline.getMeters() < 1) {
result = true;
}
return result;
}
private List<StartLineAdvantageDTO> addClosingZeroPointToMixedAdvantages(List<StartLineAdvantageDTO> advantages, Pair<Double, Double> rangePinEndStartlineAdvantage) {
StartLineAdvantageDTO startLineAdvantageDTO = new StartLineAdvantageDTO();
startLineAdvantageDTO.confidence = 1.0;
if(rangePinEndStartlineAdvantage.getA() > 0) {
startLineAdvantageDTO.distanceToRCBoatInMeters = rangePinEndStartlineAdvantage.getB();
startLineAdvantageDTO.startLineAdvantage = 0.0;
advantages.add(startLineAdvantageDTO);
} else {
startLineAdvantageDTO.distanceToRCBoatInMeters = rangePinEndStartlineAdvantage.getA();
startLineAdvantageDTO.startLineAdvantage = 0.0;
advantages.add(0, startLineAdvantageDTO);
}
return advantages;
}
private Pair<Double, Double> getPinEndStartlineAdvantagesRangeFromPolarAdvantagesRange(Pair<Double, Double> rangePolarBasedStartlineAdvatages) {
Pair<Double, Double> result = null;
double pinEndStartlineAdvantagesStart;
double pinEndStartlineAdvantagesEnd;
if(rangePolarBasedStartlineAdvatages.getA().doubleValue() == 0.0 && rangePolarBasedStartlineAdvatages.getB().doubleValue() != startlineLenghtInMeters) {
pinEndStartlineAdvantagesStart = rangePolarBasedStartlineAdvatages.getB().doubleValue();
pinEndStartlineAdvantagesEnd = startlineLenghtInMeters;
result = new Pair<Double, Double>(pinEndStartlineAdvantagesStart, pinEndStartlineAdvantagesEnd);
} else if (rangePolarBasedStartlineAdvatages.getA().doubleValue() != 0.0 && rangePolarBasedStartlineAdvatages.getB().doubleValue() == startlineLenghtInMeters) {
pinEndStartlineAdvantagesStart = 0.0;
pinEndStartlineAdvantagesEnd = rangePolarBasedStartlineAdvatages.getB().doubleValue();
result = new Pair<Double, Double>(pinEndStartlineAdvantagesStart, pinEndStartlineAdvantagesEnd);
}
return result;
}
private List<StartLineAdvantageDTO> calculateStartlineAdvantagesUnderneathLaylinesInRange(
Pair<Double, Double> rangePinEndStartlineAdvantage) {
List<StartLineAdvantageDTO> result = new ArrayList<StartLineAdvantageDTO>();
if (rangePinEndStartlineAdvantage != null) {
logger.log(Level.INFO, "PinEnd startline advantages range " + rangePinEndStartlineAdvantage.getA() + " - "+ rangePinEndStartlineAdvantage.getB());
StartLineAdvantageDTO rightEdgeAdvantage = new StartLineAdvantageDTO();
rightEdgeAdvantage.confidence = 1.0;
rightEdgeAdvantage.distanceToRCBoatInMeters = rangePinEndStartlineAdvantage.getA();
StartLineAdvantageDTO leftEdgeAdvantage = new StartLineAdvantageDTO();
leftEdgeAdvantage.confidence = 1.0;
leftEdgeAdvantage.distanceToRCBoatInMeters = rangePinEndStartlineAdvantage.getB();
if (startlineAdvantageAtPinEndInMeters > 0) {
leftEdgeAdvantage.startLineAdvantage = startlineAdvantageAtPinEndInMeters;
rightEdgeAdvantage.startLineAdvantage = 0.0;
} else {
leftEdgeAdvantage.startLineAdvantage = 0.0;
rightEdgeAdvantage.startLineAdvantage = Math.abs(startlineAdvantageAtPinEndInMeters);
}
result.add(rightEdgeAdvantage);
result.add(leftEdgeAdvantage);
} else {
logger.log(Level.INFO, "PinEnd startline advantages range null");
}
return result;
}
private List<StartLineAdvantageDTO> calculatePolarBasedStartlineAdvantagesInRange(Pair<Double, Double> rangePinEndStartlineAdvantage) {
List<StartLineAdvantageDTO> result = new ArrayList<StartLineAdvantageDTO>();
if (rangePinEndStartlineAdvantage != null) {
logger.log(Level.INFO, "PolarBased startline advantages range " + rangePinEndStartlineAdvantage.getA() + " - "+ rangePinEndStartlineAdvantage.getB());
Bearing bearingOfStartlineInRad = startlineAndFirstMarkPositions.startBoatPosition
.getBearingGreatCircle(startlineAndFirstMarkPositions.pinEndPosition);
Bearing bearingOfStartlineInDeg = new DegreeBearingImpl(bearingOfStartlineInRad.getDegrees());
for(double i = rangePinEndStartlineAdvantage.getA().doubleValue(); i < rangePinEndStartlineAdvantage.getB().doubleValue()-1 ; i++) {
StartLineAdvantageDTO startlineAdvantage = new StartLineAdvantageDTO();
startlineAdvantage.confidence = 0.5;
startlineAdvantage.distanceToRCBoatInMeters = i;
Position startingPosition = startlineAndFirstMarkPositions.startBoatPosition.translateRhumb(bearingOfStartlineInDeg, new MeterDistance(i));
Distance startingPositionToFirstMarkDistance = startingPosition.getDistance(startlineAndFirstMarkPositions.firstMarkPosition);
Bearing bearingOfFirstMarkToStartPositionPositionInRad = startlineAndFirstMarkPositions.firstMarkPosition
.getBearingGreatCircle(startingPosition);
Bearing bearingOfFirstMarkToStartPositionPositionInDeg = new DegreeBearingImpl(bearingOfFirstMarkToStartPositionPositionInRad.getDegrees());
double angleToWind = Math.abs(wind.getBearing().getDifferenceTo(bearingOfFirstMarkToStartPositionPositionInDeg).getDegrees());
logger.log(Level.INFO, "angleToWind"+angleToWind);
Speed speed = defaultPolarSpeedWindAngleFunction.getBoatSpeedForWindAngleAndSpeed(angleToWind, wind.getBeaufort());
logger.log(Level.INFO, "Speed"+speed.getKnots());
logger.log(Level.INFO, "startingPositionToFirstMarkDistance.getMeters()"+startingPositionToFirstMarkDistance.getMeters());
startlineAdvantage.startLineAdvantage = (startingPositionToFirstMarkDistance.getMeters()/speed.getMetersPerSecond())*speed.getMetersPerSecond();
result.add(startlineAdvantage);
}
} else {
logger.log(Level.INFO, "PinEnd startline advantages range null");
}
return result;
}
private List<StartLineAdvantageDTO> subtractAgainstMaximumOfAllStartlineAdvantages(List<StartLineAdvantageDTO> advantages, double maximum) {
for(StartLineAdvantageDTO startLineAdvantageDTO : advantages) {
startLineAdvantageDTO.startLineAdvantage = maximum-startLineAdvantageDTO.startLineAdvantage;
}
return advantages;
}
private List<StartLineAdvantageDTO> subtractMinimumOfAllStartlineAdvantages(List<StartLineAdvantageDTO> advantages) {
double minimum = getMinimumAdvantageOfStartlineAdvantageDTOs(advantages);
for(StartLineAdvantageDTO startLineAdvantageDTO : advantages) {
startLineAdvantageDTO.startLineAdvantage = startLineAdvantageDTO.startLineAdvantage-minimum;
}
return advantages;
}
private double getMaximumAdvantageOfStartlineAdvantageDTOs(List<StartLineAdvantageDTO> advantages) {
double result = 0;
List<StartLineAdvantageDTO> sortedAdvantages = new ArrayList<StartLineAdvantageDTO>();
sortedAdvantages.addAll(advantages);
if(sortedAdvantages != null && sortedAdvantages.size() > 0) {
Collections.sort(sortedAdvantages, StartLineAdvantageDTO.startlineAdvantageComparatorByAdvantageDesc);
result = sortedAdvantages.get(0).startLineAdvantage;
}
return result;
}
private double getMinimumAdvantageOfStartlineAdvantageDTOs(List<StartLineAdvantageDTO> advantages) {
double result = 0;
List<StartLineAdvantageDTO> sortedAdvantages = new ArrayList<StartLineAdvantageDTO>();
sortedAdvantages.addAll(advantages);
if(sortedAdvantages != null && sortedAdvantages.size() > 0) {
Collections.sort(sortedAdvantages, StartLineAdvantageDTO.startlineAdvantageComparatorByAdvantageDesc);
result = sortedAdvantages.get(sortedAdvantages.size()-1).startLineAdvantage;
}
return result;
}
@Override
public void liveTrackedRaceDidChange(TrackedRace trackedRace) {
this.currentLiveTrackedRace = trackedRace;
}
@Override
public PolarDataService getPolarDataService() {
return this.polarDataService;
}
}
@@ -0,0 +1,49 @@
package com.sap.sailing.dashboards.gwt.server.startlineadvantages.precalculation;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.dashboards.gwt.server.startlineadvantages.StartlineAdvantagesCalculator;
import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.common.BoatClassMasterdata;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.tracking.TrackedRace;
/**
* @author Alexander Ries (D062114)
*
*/
public abstract class AbstracPreCalculationDataRetriever implements PreCalculationMarkRetriever,
PreCalculationStartlineAdvantageRetriever,
PreCalculationWindRetriever,
PreCalculationPolarDataRetriever {
public StartlineAndFirstMarkPositions startlineAndFirstMarkPositions;
public double startlineAdvantageAtPinEndInMeters;
public double startlineLenghtInMeters;
public Wind wind;
public double meouvreAngle;
private static final Logger logger = Logger.getLogger(StartlineAdvantagesCalculator.class.getName());
protected void retrieveDataForCalculation(TrackedRace trackedRace) {
startlineAndFirstMarkPositions = retrieveMarkPositions(trackedRace);
startlineAdvantageAtPinEndInMeters = retrieveStartlineAdvantage(trackedRace);
startlineLenghtInMeters = retrieveStartlineLenght(trackedRace);
wind = retrieveWindAtPosition(startlineAndFirstMarkPositions.startBoatPosition, trackedRace);
meouvreAngle = retrieveManouvreAngleAtWindSpeedAndBoatClass(new BoatClassImpl("Extreme40", BoatClassMasterdata.EXTREME_40), ManeuverType.TACK, wind);
printData();
}
private void printData() {
logger.log(Level.INFO, "Retrieved pre calculation data for startline advantages calculation");
logger.log(Level.INFO, "startlineAndFirstMarkPositions.startBoatPosition "+startlineAndFirstMarkPositions.startBoatPosition);
logger.log(Level.INFO, "startlineAndFirstMarkPositions.pinEndPosition "+startlineAndFirstMarkPositions.pinEndPosition);
logger.log(Level.INFO, "startlineAndFirstMarkPositions.firstMarkPosition "+startlineAndFirstMarkPositions.firstMarkPosition);
logger.log(Level.INFO, "startlineAdvantageAtPinEndInMeters "+startlineAdvantageAtPinEndInMeters);
logger.log(Level.INFO, "startlineLenghtInMeters "+startlineLenghtInMeters);
logger.log(Level.INFO, "wind.getBeaufort() "+wind.getKnots());
logger.log(Level.INFO, "wind.getBearing().getDegrees() "+wind.getBearing().getDegrees());
logger.log(Level.INFO, "meouvreAngle.getDegrees() "+meouvreAngle);
}
}
@@ -0,0 +1,75 @@
package com.sap.sailing.dashboards.gwt.server.startlineadvantages.precalculation;
import java.util.Iterator;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.impl.MillisecondsTimePoint;
/**
* @author Alexander Ries (D062114)
*
*/
public interface PreCalculationMarkRetriever {
default StartlineAndFirstMarkPositions retrieveMarkPositions(TrackedRace trackedRace) {
StartlineAndFirstMarkPositions result = new StartlineAndFirstMarkPositions();
Course course = trackedRace.getRace().getCourse();
if (course != null) {
Waypoint startlineWayPoint = course.getFirstLeg().getFrom();
Waypoint firstmarkWayPoint = course.getFirstLeg().getTo();
if (startlineWayPoint != null && firstmarkWayPoint != null) {
Pair<Position, Position> startlineMarkPositions = retrieveStartlineMarkPositionsFromStartLineWayPoint(startlineWayPoint, trackedRace);
Position firstMarkPosition = retrieveFirstMarkPositionFromFirstMarkWayPoint(firstmarkWayPoint, trackedRace);
result.startBoatPosition = startlineMarkPositions.getA();
result.pinEndPosition = startlineMarkPositions.getB();
result.firstMarkPosition = firstMarkPosition;
}
}
return result;
}
default Pair<Position, Position> retrieveStartlineMarkPositionsFromStartLineWayPoint(Waypoint startLineWayPoint, TrackedRace trackedRace) {
Pair<Position, Position> result = null;
Iterator<Mark> markIterator = startLineWayPoint.getMarks().iterator();
if (markIterator.hasNext()) {
Mark startboat = (Mark) markIterator.next();
if (markIterator.hasNext()) {
Mark pinEnd = (Mark) markIterator.next();
TimePoint now = MillisecondsTimePoint.now();
Position startBoatPosition = getPositionFromMarkAtTimePoint(trackedRace, startboat, now);
Position pinEndPosition = getPositionFromMarkAtTimePoint(trackedRace, pinEnd, now);
result = new Pair<Position, Position>(startBoatPosition, pinEndPosition);
}
}
return result;
}
default Position retrieveFirstMarkPositionFromFirstMarkWayPoint(Waypoint firstMarkWayPoint, TrackedRace trackedRace) {
Position result = null;
if (firstMarkWayPoint.getMarks().iterator().hasNext()) {
Mark firstMark = firstMarkWayPoint.getMarks().iterator().next();
TimePoint now = MillisecondsTimePoint.now();
result = getPositionFromMarkAtTimePoint(trackedRace, firstMark, now);
}
return result;
}
default Position getPositionFromMarkAtTimePoint(TrackedRace trackedRace, Mark mark, TimePoint timePoint) {
GPSFixTrack<Mark, GPSFix> fixTrack = trackedRace.getTrack(mark);
return fixTrack.getEstimatedPosition(timePoint, true);
}
class StartlineAndFirstMarkPositions {
public Position startBoatPosition;
public Position pinEndPosition;
public Position firstMarkPosition;
}
}
@@ -0,0 +1,31 @@
package com.sap.sailing.dashboards.gwt.server.startlineadvantages.precalculation;
import com.sap.sailing.dashboards.gwt.server.startlineadvantages.DefaultPolarValues;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.common.confidence.BearingWithConfidence;
import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException;
import com.sap.sailing.domain.polars.PolarDataService;
/**
* @author Alexander Ries (D062114)
*
*/
public interface PreCalculationPolarDataRetriever {
default double retrieveManouvreAngleAtWindSpeedAndBoatClass(BoatClass boatClass, ManeuverType maneuverType,
Speed windSpeed) {
double result = 0;
try {
BearingWithConfidence<Void> bearingWithConfidence = getPolarDataService().getManeuverAngle(boatClass, maneuverType, windSpeed);
result = bearingWithConfidence.getObject().getDegrees();
} catch (NotEnoughDataHasBeenAddedException | NullPointerException e) {
result = DefaultPolarValues.getManouvreAngle(ManeuverType.TACK);
e.printStackTrace();
}
return result;
}
PolarDataService getPolarDataService();
}
@@ -0,0 +1,28 @@
package com.sap.sailing.dashboards.gwt.server.startlineadvantages.precalculation;
import com.sap.sailing.domain.tracking.LineDetails;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.impl.MillisecondsTimePoint;
/**
* @author Alexander Ries (D062114)
*
*/
public interface PreCalculationStartlineAdvantageRetriever {
default double retrieveStartlineAdvantage(TrackedRace trackedRace) {
double result = 0;
LineDetails startline = trackedRace.getStartLine(MillisecondsTimePoint.now());
if (startline != null && startline.getAdvantage() != null) {
result = startline.getAdvantage().getMeters();
}
return result;
}
default double retrieveStartlineLenght(TrackedRace trackedRace) {
double result = 0;
LineDetails startline = trackedRace.getStartLine(MillisecondsTimePoint.now());
result = startline.getLength().getMeters();
return result;
}
}
@@ -0,0 +1,19 @@
package com.sap.sailing.dashboards.gwt.server.startlineadvantages.precalculation;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.impl.MillisecondsTimePoint;
/**
* @author Alexander Ries (D062114)
*
*/
public interface PreCalculationWindRetriever {
default Wind retrieveWindAtPosition(Position position, TrackedRace trackedRace) {
Wind result = null;
result = trackedRace.getWind(position, MillisecondsTimePoint.now());
return result;
}
}
@@ -0,0 +1,18 @@
package com.sap.sailing.dashboards.gwt.shared;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.dashboards.gwt.shared.dto.StartLineAdvantageDTO;
/**
* @author Alexander Ries (D062114)
*
*/
public enum StartlineAdvantageCalculationBasis implements IsSerializable {
MEASURED,
/**
* When the {@link StartLineAdvantageDTO} is calculated with the Polar API and there are not values returned
* there are used manually entered polar values to provide still a {@link StartLineAdvantageDTO}.
*/
DEFAULT_VALUES
}
@@ -0,0 +1,15 @@
package com.sap.sailing.dashboards.gwt.shared.dto;
import com.google.gwt.user.client.rpc.IsSerializable;
/**
* @author Alexander Ries (D062114)
*
*/
public class AverageDTO implements IsSerializable {
public double average;
public double collectingTimeFrameInMilliseconds;
public AverageDTO(){}
}
@@ -1,16 +1,30 @@
package com.sap.sailing.dashboards.gwt.shared.dto;
import java.io.Serializable;
import java.util.Comparator;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.dashboards.gwt.client.startanalysis.StartlineAdvantageType;
public class StartLineAdvantageDTO implements Serializable{
public class StartLineAdvantageDTO extends AverageDTO implements IsSerializable {
private static final long serialVersionUID = 502350559068890424L;
public StartlineAdvantageType startLineAdvatageType;
public double startLineAdvantage;
public double startlineAdvantageAverage;
public double distanceToRCBoatInMeters;
public StartlineAdvantageType startLineAdvatageType;
public double confidence;
public StartLineAdvantageDTO(){}
public static Comparator<StartLineAdvantageDTO> startlineAdvantageComparatorByAdvantageDesc = new Comparator<StartLineAdvantageDTO>() {
public int compare(StartLineAdvantageDTO a, StartLineAdvantageDTO b) {
return (int) (b.startLineAdvantage - a.startLineAdvantage);
}
};
public static Comparator<StartLineAdvantageDTO> startlineAdvantageComparatorByDistanceToRCBoatAsc = new Comparator<StartLineAdvantageDTO>() {
public int compare(StartLineAdvantageDTO a, StartLineAdvantageDTO b) {
return (int) (a.distanceToRCBoatInMeters - b.distanceToRCBoatInMeters);
}
};
}
@@ -0,0 +1,17 @@
package com.sap.sailing.dashboards.gwt.shared.dto;
import java.util.List;
import com.google.gwt.user.client.rpc.IsSerializable;
/**
* @author Alexander Ries (D062114)
*
*/
public class StartlineAdvantagesWithMaxAndAverageDTO extends AverageDTO implements IsSerializable {
public double maximum;
public List<StartLineAdvantageDTO> advantages;
public StartlineAdvantagesWithMaxAndAverageDTO(){}
}
@@ -9,4 +9,5 @@ Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
Require-Bundle: com.sap.sse.datamining.shared,
com.sap.sailing.domain.common
Export-Package: com.sap.sailing.datamining.shared
Export-Package: com.sap.sailing.datamining.shared,
com.sap.sailing.datamining.shared.dto
@@ -1,15 +1,15 @@
package com.sap.sailing.datamining.shared;
import java.io.Serializable;
import com.sap.sailing.datamining.shared.dto.DistanceDTO;
import com.sap.sailing.domain.common.LegType;
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
import com.sap.sse.datamining.shared.SerializationDummy;
@SuppressWarnings("unused")
public final class SailingDataMiningSerializationDummy implements Serializable {
public final class SailingDataMiningSerializationDummy implements SerializationDummy {
private static final long serialVersionUID = 2L;
private LegType legType;
private DistanceDTO distance;
private SailingDataMiningSerializationDummy() { }
@@ -0,0 +1,63 @@
package com.sap.sailing.datamining.shared.dto;
import java.io.Serializable;
public class DistanceDTO implements Serializable {
private static final long serialVersionUID = -4949861628112888523L;
private double geographicalMiles;
private double seaMiles;
private double nauticalMiles;
private double meters;
private double kilometers;
private double centralAngleDegree;
private double centralAngleRadian;
/**
* <b>Do NOT use!</b><br>
* Constructor for GWT-Serialization.
*/
@Deprecated
DistanceDTO() {
}
public DistanceDTO(double geographicalMiles, double seaMiles, double nauticalMiles, double meters,
double kilometers, double centralAngleDegree, double centralAngleRadian) {
this.geographicalMiles = geographicalMiles;
this.seaMiles = seaMiles;
this.nauticalMiles = nauticalMiles;
this.meters = meters;
this.kilometers = kilometers;
this.centralAngleDegree = centralAngleDegree;
this.centralAngleRadian = centralAngleRadian;
}
public double getGeographicalMiles() {
return geographicalMiles;
}
public double getSeaMiles() {
return seaMiles;
}
public double getNauticalMiles() {
return nauticalMiles;
}
public double getMeters() {
return meters;
}
public double getKilometers() {
return kilometers;
}
public double getCentralAngleDegree() {
return centralAngleDegree;
}
public double getCentralAngleRadian() {
return centralAngleRadian;
}
}
@@ -13,7 +13,8 @@ import com.sap.sailing.datamining.data.HasRaceResultOfCompetitorContext;
import com.sap.sailing.datamining.data.HasTrackedLegContext;
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelTrueSumAggregationProcessor;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelBoolSumAggregationProcessor;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceSumAggregationProcessor;
import com.sap.sailing.domain.common.Speed;
import com.sap.sse.datamining.DataMiningBundleService;
import com.sap.sse.datamining.DataSourceProvider;
@@ -98,7 +99,8 @@ public class Activator extends AbstractDataMiningActivator implements DataMining
@Override
public Iterable<AggregationProcessorDefinition<?, ?>> getAggregationProcessorDefinitions() {
HashSet<AggregationProcessorDefinition<?, ?>> aggregators = new HashSet<>();
aggregators.add(ParallelTrueSumAggregationProcessor.getDefinition());
aggregators.add(ParallelBoolSumAggregationProcessor.getDefinition());
aggregators.add(ParallelDistanceSumAggregationProcessor.getDefinition());
return aggregators;
}
@@ -1,5 +1,6 @@
package com.sap.sailing.datamining.data;
import com.sap.sailing.datamining.shared.dto.DistanceDTO;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.Speed;
import com.sap.sse.datamining.shared.annotations.Connector;
@@ -14,8 +15,8 @@ public interface HasRaceOfCompetitorContext {
@Connector(messageKey="Competitor")
public Competitor getCompetitor();
@Statistic(messageKey="DistanceAtStart", resultUnit=Unit.Meters, resultDecimals=0, ordinal=0)
public double getDistanceToStartLineAtStart();
@Statistic(messageKey="DistanceAtStart", resultUnit=Unit.None, resultDecimals=2, ordinal=0)
public DistanceDTO getDistanceToStartLineAtStart();
@Statistic(messageKey="DistanceToStarboardSideAtStart", resultDecimals=2, ordinal=1)
public Double getNormalizedDistanceToStarboardSideAtStart();
@@ -9,14 +9,14 @@ import com.sap.sse.datamining.components.AggregationProcessorDefinition;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
import com.sap.sse.datamining.impl.components.SimpleAggregationProcessorDefinition;
import com.sap.sse.datamining.impl.components.aggregators.AbstractParallelGroupedDataStoringAggregationProcessor;
import com.sap.sse.datamining.impl.components.aggregators.AbstractParallelGroupedDataAggregationProcessor;
import com.sap.sse.datamining.shared.GroupKey;
public class ParallelTrueSumAggregationProcessor
extends AbstractParallelGroupedDataStoringAggregationProcessor<Boolean, Double> {
public class ParallelBoolSumAggregationProcessor
extends AbstractParallelGroupedDataAggregationProcessor<Boolean, Double> {
private static final AggregationProcessorDefinition<Boolean, Double> DEFINITION =
new SimpleAggregationProcessorDefinition<>(Boolean.class, Double.class, "Sum", ParallelTrueSumAggregationProcessor.class);
new SimpleAggregationProcessorDefinition<>(Boolean.class, Double.class, "Sum", ParallelBoolSumAggregationProcessor.class);
public static AggregationProcessorDefinition<Boolean, Double> getDefinition() {
return DEFINITION;
@@ -24,14 +24,14 @@ public class ParallelTrueSumAggregationProcessor
private Map<GroupKey, Double> result;
public ParallelTrueSumAggregationProcessor(ExecutorService executor,
public ParallelBoolSumAggregationProcessor(ExecutorService executor,
Collection<Processor<Map<GroupKey, Double>, ?>> resultReceivers) {
super(executor, resultReceivers, "Sum");
result = new HashMap<>();
}
@Override
protected void storeElement(GroupedDataEntry<Boolean> element) {
protected void handleElement(GroupedDataEntry<Boolean> element) {
GroupKey key = element.getKey();
if (!result.containsKey(key)) {
result.put(key, 0.0);
@@ -43,7 +43,7 @@ public class ParallelTrueSumAggregationProcessor
}
@Override
protected Map<GroupKey, Double> aggregateResult() {
protected Map<GroupKey, Double> getResult() {
return result;
}
@@ -0,0 +1,59 @@
package com.sap.sailing.datamining.impl.components.aggregators;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import com.sap.sailing.datamining.shared.dto.DistanceDTO;
import com.sap.sse.datamining.components.AggregationProcessorDefinition;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
import com.sap.sse.datamining.impl.components.SimpleAggregationProcessorDefinition;
import com.sap.sse.datamining.impl.components.aggregators.AbstractParallelGroupedDataAggregationProcessor;
import com.sap.sse.datamining.shared.GroupKey;
public class ParallelDistanceSumAggregationProcessor extends
AbstractParallelGroupedDataAggregationProcessor<DistanceDTO, DistanceDTO> {
private static final AggregationProcessorDefinition<DistanceDTO, DistanceDTO> DEFINITION =
new SimpleAggregationProcessorDefinition<>(DistanceDTO.class, DistanceDTO.class, "Sum", ParallelDistanceSumAggregationProcessor.class);
public static AggregationProcessorDefinition<DistanceDTO, DistanceDTO> getDefinition() {
return DEFINITION;
}
private final Map<GroupKey, DistanceDTO> results;
public ParallelDistanceSumAggregationProcessor(ExecutorService executor, Collection<Processor<Map<GroupKey, DistanceDTO>, ?>> resultReceivers) {
super(executor, resultReceivers, "Sum");
results = new HashMap<>();
}
@Override
protected void handleElement(GroupedDataEntry<DistanceDTO> element) {
GroupKey key = element.getKey();
if (!results.containsKey(key)) {
results.put(key, element.getDataEntry());
} else {
results.put(key, add(results.get(key), element.getDataEntry()));
}
}
private DistanceDTO add(DistanceDTO distance1, DistanceDTO distance2) {
double geographicalMiles = distance1.getGeographicalMiles() + distance2.getGeographicalMiles();
double seaMiles = distance1.getSeaMiles() + distance2.getSeaMiles();
double nauticalMiles = distance1.getNauticalMiles() + distance2.getNauticalMiles();
double meters = distance1.getMeters() + distance2.getMeters();
double kilometers = distance1.getKilometers() + distance2.getKilometers();
double centralAngleDegree = distance1.getCentralAngleDegree() + distance2.getCentralAngleDegree();
double centralAngleRadian = distance1.getCentralAngleRadian() + distance2.getCentralAngleRadian();
return new DistanceDTO(geographicalMiles, seaMiles, nauticalMiles, meters, kilometers, centralAngleDegree, centralAngleRadian);
}
@Override
protected Map<GroupKey, DistanceDTO> getResult() {
return results;
}
}
@@ -4,9 +4,11 @@ import java.util.concurrent.TimeUnit;
import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext;
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
import com.sap.sailing.datamining.shared.dto.DistanceDTO;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.tracking.Maneuver;
@@ -39,8 +41,12 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext {
}
@Override
public double getDistanceToStartLineAtStart() {
return getTrackedRace().getDistanceToStartLine(getCompetitor(), 0).getMeters();
public DistanceDTO getDistanceToStartLineAtStart() {
Distance distance = getTrackedRace().getDistanceToStartLine(getCompetitor(), 0);
return new DistanceDTO(distance.getGeographicalMiles(), distance.getSeaMiles(),
distance.getNauticalMiles(), distance.getMeters(),
distance.getKilometers(), distance.getCentralAngleDeg(),
distance.getCentralAngleRad());
}
@Override
@@ -6,10 +6,6 @@ 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.domain.common,
Require-Bundle: com.sap.sailing.domain.common,
com.sap.sse.common
Export-Package: com.sap.sailing.declination
Import-Package: com.sap.sailing.domain.common,
com.sap.sailing.domain.common.impl,
com.sap.sailing.domain.common.quadtree
@@ -7,7 +7,7 @@
<listEntry value="1"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.sap.sailing.declination.impl.DeclinationStore"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="2015 2015 1"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="2016 2016 1"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.declination"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dhttp.proxyHost=proxy.wdf.sap.corp -Dhttp.proxyPort=8080"/>
</launchConfiguration>
@@ -32,7 +32,7 @@ public interface DeclinationService {
* constructing this service
*/
Declination getDeclination(TimePoint timePoint, Position position, long timeoutForOnlineFetchInMilliseconds) throws IOException,
ClassNotFoundException, ParseException;
ParseException;
/**
* Like {@link #getDeclination(TimePoint, Position, long)}, only that here the caller can specify a required spatial
@@ -50,5 +50,5 @@ public interface DeclinationService {
* <code>maxDistance</code> parameter
*/
Declination getDeclination(TimePoint timePoint, Position position, Distance maxDistance, long timeoutForOnlineFetchInMilliseconds) throws IOException,
ClassNotFoundException, ParseException;
ParseException;
}
@@ -42,13 +42,13 @@ public class DeclinationServiceImpl implements DeclinationService {
@Override
public Declination getDeclination(TimePoint timePoint, Position position,
long timeoutForOnlineFetchInMilliseconds) throws IOException, ClassNotFoundException, ParseException {
long timeoutForOnlineFetchInMilliseconds) throws IOException, ParseException {
return getDeclination(timePoint, position, defaultMaxDistance, timeoutForOnlineFetchInMilliseconds);
}
@Override
public Declination getDeclination(TimePoint timePoint, Position position, Distance maxDistance,
long timeoutForOnlineFetchInMilliseconds) throws IOException, ClassNotFoundException, ParseException {
long timeoutForOnlineFetchInMilliseconds) throws IOException, ParseException {
Calendar cal = new GregorianCalendar();
cal.setTime(timePoint.asDate());
Declination result = null;
@@ -98,8 +98,7 @@ public class DeclinationServiceImpl implements DeclinationService {
return result;
}
private QuadTree<Declination> getYearStore(int year) throws IOException, ClassNotFoundException,
ParseException {
private QuadTree<Declination> getYearStore(int year) throws IOException, ParseException {
QuadTree<Declination> result = yearStore.get(year);
if (result == null) {
result = persistentStore.getStoredDeclinations(year);
@@ -41,7 +41,7 @@ public class DeclinationStore {
/**
* Returns <code>null</code> if no stored declinations exist for the <code>year</code> requested.
*/
public QuadTree<Declination> getStoredDeclinations(int year) throws IOException, ClassNotFoundException, ParseException {
public QuadTree<Declination> getStoredDeclinations(int year) throws IOException, ParseException {
Declination record;
QuadTree<Declination> result = null;
InputStream is = getInputStreamForYear(year);
@@ -90,7 +90,7 @@ public class NOAAImporter {
* @throws IOException
*/
public Declination getDeclination(final Position position, final TimePoint timePoint,
long timeoutForOnlineFetchInMilliseconds) throws IOException, ClassNotFoundException, ParseException {
long timeoutForOnlineFetchInMilliseconds) throws IOException, ParseException {
final Declination[] result = new Declination[1];
Thread fetcher = new Thread("Declination fetcher for "+position+"@"+timePoint) {
@Override
@@ -10,7 +10,14 @@ import com.sap.sse.common.Timed;
*
* Note that sometimes a wind measurement is transmitted without its position. While this is useless
* for wind field interpolation, it can still serve good uses when some wind direction is better than
* no wind direction at all. In this case, {@link #getPosition()} will return <code>null</code>.
* no wind direction at all. In this case, {@link #getPosition()} will return <code>null</code>.<p>
*
* When processing wind in the scope of a {@link TrackedRace}, it should always use true, not magnetic,
* directions. However, during capturing wind, e.g., on a committee boat, sometimes it is easier for
* users to capture wind using a magnetic direction which needs to be corrected by the magnetic
* variation / declination in order to produce a true direction. It depends on the context in which
* objects of this type are produced and used whether this represents a true or magnetic wind direction.
* For conversion, use a {@link DeclinationService} instance.
*
* @author Axel Uhl (d043530)
*
@@ -16,6 +16,7 @@ public enum Permission implements com.sap.sse.security.shared.Permission {
MANAGE_STRUCTURE_IMPORT_URLS,
MANAGE_MEDIA,
MANAGE_SAILING_SERVER_INSTANCES,
MANAGE_LOCAL_SERVER_INSTANCE,
MANAGE_REPLICATION,
MANAGE_MASTERDATA_IMPORT,
MANAGE_DEVICE_CONFIGURATION,
@@ -16,6 +16,7 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RegattaRegistry;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher;
import com.sap.sailing.domain.common.RaceIdentifier;
@@ -109,6 +110,8 @@ public interface DomainObjectFactory {
*/
void loadLeaderboardGroupLinksForEvents(EventResolver eventResolver, LeaderboardGroupResolver leaderboardGroupResolver);
SailingServerConfiguration loadServerConfiguration();
Iterable<RemoteSailingServerReference> loadAllRemoteSailingServerReferences();
Regatta loadRegatta(String name, TrackedRegattaRegistry trackedRegattaRegistry);
@@ -10,6 +10,7 @@ import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.configuration.DeviceConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher;
@@ -93,6 +94,8 @@ public interface MongoObjectFactory {
*/
void removeEvent(Serializable id);
void storeServerConfiguration(SailingServerConfiguration serverConfiguration);
/**
* Stores a registered sailing server
* @param serves the servers to store
@@ -43,7 +43,12 @@ public enum CollectionNames {
* Stores the registered sailing servers.
*/
SAILING_SERVERS,
/**
* Stores the configuration of the server instance.
*/
SERVER_CONFIGURATION,
/**
* Stores regatta definitions including their series layout and fleets and race columns. Regattas can reference
* the event from the {@link #EVENTS} collection to which they belong.
@@ -35,11 +35,11 @@ import com.mongodb.util.JSON;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl;
import com.sap.sailing.domain.abstractlog.race.CompetitorResults;
import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventRestoreFactory;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent;
@@ -102,6 +102,7 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RegattaRegistry;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Venue;
import com.sap.sailing.domain.base.Waypoint;
@@ -115,6 +116,7 @@ import com.sap.sailing.domain.base.impl.EventImpl;
import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.base.impl.RemoteSailingServerReferenceImpl;
import com.sap.sailing.domain.base.impl.SailingServerConfigurationImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.base.impl.VenueImpl;
import com.sap.sailing.domain.base.impl.WaypointImpl;
@@ -930,8 +932,26 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return result;
}
@Override
public SailingServerConfiguration loadServerConfiguration() {
SailingServerConfiguration result;
DBCollection serverCollection = database.getCollection(CollectionNames.SERVER_CONFIGURATION.name());
DBObject theServer = serverCollection.findOne();
if (theServer != null) {
result = loadServerConfiguration(theServer);
} else {
// create a default configuration
result = new SailingServerConfigurationImpl(false);
}
return result;
}
private RemoteSailingServerReference loadSailingSever(DBObject serverDBObject) {
private SailingServerConfiguration loadServerConfiguration(DBObject serverDBObject) {
boolean isStandaloneServer = (Boolean) serverDBObject.get(FieldNames.SERVER_IS_STANDALONE.name());
return new SailingServerConfigurationImpl(isStandaloneServer);
}
private RemoteSailingServerReference loadRemoteSailingSever(DBObject serverDBObject) {
RemoteSailingServerReference result = null;
String name = (String) serverDBObject.get(FieldNames.SERVER_NAME.name());
String urlAsString = (String) serverDBObject.get(FieldNames.SERVER_URL.name());
@@ -950,8 +970,8 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
DBCollection serverCollection = database.getCollection(CollectionNames.SAILING_SERVERS.name());
try {
for (DBObject o : serverCollection.find()) {
if (loadSailingSever(o) != null) {
result.add(loadSailingSever(o));
if (loadRemoteSailingSever(o) != null) {
result.add(loadRemoteSailingSever(o));
}
}
} catch (Exception e) {
@@ -1323,9 +1343,9 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
} else if (eventClass.equals(RaceLogStartProcedureChangedEvent.class.getSimpleName())) {
return loadRaceLogStartProcedureChangedEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject);
} else if (eventClass.equals(RaceLogProtestStartTimeEvent.class.getSimpleName())) {
return loadRaceLogRaceLogProtestStartTimeEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject);
return loadRaceLogProtestStartTimeEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject);
} else if (eventClass.equals(RaceLogWindFixEvent.class.getSimpleName())) {
return loadRaceLogRaceLogWindFixEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject);
return loadRaceLogWindFixEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject);
} else if (eventClass.equals(RaceLogDeviceCompetitorMappingEvent.class.getSimpleName())) {
return loadRaceLogDeviceCompetitorMappingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject);
} else if (eventClass.equals(RaceLogDeviceMarkMappingEvent.class.getSimpleName())) {
@@ -1353,10 +1373,11 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
throw new IllegalStateException(String.format("Unknown RaceLogEvent type %s", eventClass));
}
private RaceLogEvent loadRaceLogRaceLogWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
private RaceLogEvent loadRaceLogWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, Integer passId, List<Competitor> competitors, DBObject dbObject) {
Wind wind = loadWind((DBObject) dbObject.get(FieldNames.WIND.name()));
return raceLogEventFactory.createWindFixEvent(createdAt, author, logicalTimePoint, id, competitors, passId, wind);
Boolean isMagnetic = (Boolean) dbObject.get(FieldNames.IS_MAGNETIC.name());
return raceLogEventFactory.createWindFixEvent(createdAt, author, logicalTimePoint, id, competitors, passId, wind, isMagnetic == null ? true : isMagnetic);
}
private RaceLogEvent loadRaceLogDeviceCompetitorMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
@@ -1450,7 +1471,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return raceLogEventFactory.createAdditionalScoringInformationEvent(createdAt, author, logicalTimePoint, id, competitors, passId, informationType);
}
private RaceLogEvent loadRaceLogRaceLogProtestStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author,
private RaceLogEvent loadRaceLogProtestStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author,
TimePoint logicalTimePoint, Serializable id, Integer passId, List<Competitor> competitors, DBObject dbObject) {
TimePoint protestStartTime = loadTimePoint(dbObject, FieldNames.RACE_LOG_PROTEST_START_TIME);
return raceLogEventFactory.createProtestStartTimeEvent(createdAt, author, logicalTimePoint, id, competitors, passId, protestStartTime);
@@ -61,7 +61,7 @@ public enum FieldNames {
BOAT_CLASS_TYPICALLY_STARTS_UPWIND,
// wind:
WIND_SOURCE_NAME, WIND_SOURCE_ID, WIND,
WIND_SOURCE_NAME, WIND_SOURCE_ID, WIND, IS_MAGNETIC,
// SwissTiming configuration parameters:
ST_CONFIG_NAME, ST_CONFIG_HOSTNAME, ST_CONFIG_PORT,
@@ -109,10 +109,13 @@ public enum FieldNames {
REGATTA_LOG_REVOKED_REASON, REGATTA_LOG_COMPETITOR_ID, REGATTA_LOG_DEVICE_MAPPING_EVENT_ID, REGATTA_LOG_CLOSING_TIMEPOINT,
REGATTA_LOG_FROM, REGATTA_LOG_TO, REGATTA_LOG_EVENT,
// sailing server
// remote server reference fields
SERVER_NAME,
SERVER_URL,
// local server instance fields
SERVER_IS_STANDALONE,
// configurations
CONFIGURATION_MATCHER, CONFIGURATION_CONFIG, CONFIGURATION_MATCHER_ID, CONFIGURATION_MATCHER_TYPE, CONFIGURATION_MATCHER_CLIENTS,
CONFIGURATION_CONFIG_ALLOWED_COURSE_AREA_NAMES, CONFIGURATION_CONFIG_MIN_ROUNDS, CONFIGURATION_CONFIG_MAX_ROUNDS, CONFIGURATION_CONFIG_RESULTS_MAIL,
@@ -19,14 +19,14 @@ import com.mongodb.DBObject;
import com.mongodb.WriteConcern;
import com.mongodb.util.JSON;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFixedMarkPassingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFixedMarkPassingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent;
@@ -37,8 +37,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartOfTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent;
import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent;
@@ -68,6 +68,7 @@ import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Venue;
import com.sap.sailing.domain.base.Waypoint;
@@ -501,6 +502,19 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
leaderboardGroupCollection.update(query, update, /* upsert */ true, /* multi */ false, WriteConcern.SAFE);
}
@Override
public void storeServerConfiguration(SailingServerConfiguration serverConfiguration) {
DBCollection serverCollection = database.getCollection(CollectionNames.SERVER_CONFIGURATION.name());
DBObject newServerConfig = new BasicDBObject();
newServerConfig.put(FieldNames.SERVER_IS_STANDALONE.name(), serverConfiguration.isStandaloneServer());
DBObject currentServerConfig = serverCollection.findOne();
if(currentServerConfig != null) {
serverCollection.update(currentServerConfig, newServerConfig, /* upsrt */ true, /* multi */ false, WriteConcern.SAFE);
} else {
serverCollection.save(newServerConfig);
}
}
@Override
public void storeSailingServer(RemoteSailingServerReference server) {
DBCollection serverCollection = database.getCollection(CollectionNames.SAILING_SERVERS.name());
@@ -935,6 +949,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
storeRaceLogEventProperties(event, result);
result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogWindFixEvent.class.getSimpleName());
result.put(FieldNames.WIND.name(), storeWind(event.getWindFix()));
result.put(FieldNames.IS_MAGNETIC.name(), event.isMagnetic());
return result;
}
@@ -191,12 +191,38 @@ public class MongoGPSFixStoreImpl implements MongoGPSFixStore {
loadTrack(track, mapping.getDevice(), mapping.getTimeRange().from(), mapping.getTimeRange().to(), true /*inclusive*/);
}
@Override
public void loadCompetitorTrack(DynamicGPSFixTrack<Competitor, GPSFixMoving> track, AbstractLog<?, ?> log,
Competitor competitor, TimePoint start, TimePoint end) throws TransformationException {
List<DeviceMapping<Competitor>> mappings = new DeviceCompetitorMappingFinder<>(log).analyze().get(competitor);
if (mappings != null) {
for (DeviceMapping<Competitor> mapping : mappings) {
final TimePoint from = Util.getLatestOfTimePoints(start, mapping.getTimeRange().from());
final TimePoint to = Util.getEarliestOfTimePoints(end, mapping.getTimeRange().to());
loadTrack(track, mapping.getDevice(), from, to, true /*inclusive*/);
}
}
}
@Override
public void loadMarkTrack(DynamicGPSFixTrack<Mark, GPSFix> track, DeviceMapping<Mark> mapping)
throws TransformationException, NoCorrespondingServiceRegisteredException {
loadTrack(track, mapping.getDevice(), mapping.getTimeRange().from(), mapping.getTimeRange().to(), true /*inclusive*/);
}
@Override
public void loadMarkTrack(DynamicGPSFixTrack<Mark, GPSFix> track, AbstractLog<?, ?> log, Mark mark,
TimePoint start, TimePoint end) throws TransformationException, NoCorrespondingServiceRegisteredException {
List<DeviceMapping<Mark>> mappings = new DeviceMarkMappingFinder<>(log).analyze().get(mark);
if (mappings != null) {
for (DeviceMapping<Mark> mapping : mappings) {
final TimePoint from = Util.getLatestOfTimePoints(start, mapping.getTimeRange().from());
final TimePoint to = Util.getEarliestOfTimePoints(end, mapping.getTimeRange().to());
loadTrack(track, mapping.getDevice(), from, to, true /*inclusive*/);
}
}
}
@Override
public void loadTrack(DynamicGPSFixTrack<WithID, ?> track, DeviceMapping<WithID> mapping)
throws NoCorrespondingServiceRegisteredException, TransformationException {
@@ -18,4 +18,5 @@ Import-Package: com.sap.sailing.domain.abstractlog.regatta.events,
com.sap.sailing.domain.persistence.racelog.tracking.impl,
com.sap.sailing.domain.tractracadapter,
com.sap.sailing.server.impl,
com.sap.sse.concurrent,
javax.servlet.http;version="2.5.0"
@@ -79,7 +79,7 @@ public class AbstractGPSFixStoreTest {
mark, 0, new MillisecondsTimePoint(from), new MillisecondsTimePoint(to)));
}
protected void testLength(Track<?> track, long expected) {
protected void testNumberOfRawFixes(Track<?> track, long expected) {
track.lockForRead();
assertEquals(expected, size(track.getRawFixes()));
track.unlockAfterRead();
@@ -40,6 +40,7 @@ import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl;
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sse.common.NoCorrespondingServiceRegisteredException;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.impl.TimeRangeImpl;
public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest {
@@ -49,6 +50,49 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest {
private Integer previouslyLoading = null;
private int numFixesReceived = 0;
@Test
public void doesRaceLoadOnlyBetweenStartAndEndOfTracking() throws TransformationException,
NoCorrespondingServiceRegisteredException, InterruptedException {
Competitor comp2 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp2", "comp2", null, null, null, null, null,
/* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null);
Mark mark2 = DomainFactory.INSTANCE.getOrCreateMark("mark2");
DeviceIdentifier markDevice = new SmartphoneImeiIdentifier("imei2");
Course course = new CourseImpl("course", Arrays.asList(new Waypoint[] { new WaypointImpl(mark),
new WaypointImpl(mark2) }));
RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, Arrays.asList(new Competitor[] { comp, comp2 }));
map(comp, device, 0, 10000);
map(mark, markDevice, 0, 10000);
store.storeFix(device, createFix(100, 10, 20, 30, 40)); // before
store.storeFix(device, createFix(1100, 10, 20, 30, 40)); // in
store.storeFix(device, createFix(2100, 10, 20, 30, 40)); // after
store.storeFix(markDevice, createFix(100, 10, 20, 30, 40));
store.storeFix(markDevice, createFix(1100, 10, 20, 30, 40));
store.storeFix(markDevice, createFix(2100, 10, 20, 30, 40));
TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE,
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, /* startDate */
null, /* endDate */null, null, null, "a", null));
final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race,
Collections.<Sideline> emptyList(), EmptyWindStore.INSTANCE, store, 0, 0, 0, /*useMarkPassingCalculator*/ false,
OneDesignRankingMetric::new, mock(RaceLogResolver.class));
trackedRace.setStartOfTrackingReceived(new MillisecondsTimePoint(1000));
trackedRace.setEndOfTrackingReceived(new MillisecondsTimePoint(2000));
trackedRace.attachRaceLog(raceLog);
trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(raceLog);
testNumberOfRawFixes(trackedRace.getTrack(comp), 1);
testNumberOfRawFixes(trackedRace.getOrCreateTrack(mark), 1);
// now extend the tracking interval of the tracked race and assert that the additional fixes are loaded
trackedRace.setEndOfTrackingReceived(new MillisecondsTimePoint(2500), /* wait for fixes to load */ true);
testNumberOfRawFixes(trackedRace.getTrack(comp), 2);
testNumberOfRawFixes(trackedRace.getOrCreateTrack(mark), 2);
trackedRace.setStartOfTrackingReceived(new MillisecondsTimePoint(0), /* wait for fixes to load */ true);
testNumberOfRawFixes(trackedRace.getTrack(comp), 3);
testNumberOfRawFixes(trackedRace.getOrCreateTrack(mark), 3);
}
@Test
public void areFixesStoredInDb() throws TransformationException, NoCorrespondingServiceRegisteredException,
InterruptedException {
@@ -88,10 +132,10 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest {
trackedRace.attachRaceLog(raceLog);
trackedRace.waitForLoadingFromGPSFixStoreToFinishRunning(raceLog);
testLength(trackedRace.getTrack(comp), 10002);
testLength(trackedRace.getTrack(comp2), 1);
testLength(trackedRace.getOrCreateTrack(mark), 1);
testLength(trackedRace.getOrCreateTrack(mark2), 1);
testNumberOfRawFixes(trackedRace.getTrack(comp), 10002);
testNumberOfRawFixes(trackedRace.getTrack(comp2), 1);
testNumberOfRawFixes(trackedRace.getOrCreateTrack(mark), 1);
testNumberOfRawFixes(trackedRace.getOrCreateTrack(mark2), 1);
}
@Test
@@ -29,7 +29,7 @@ public class WindFixesFinderTest extends RaceLogAnalyzerTest<WindFixesFinder> {
raceLog.add(event1);
List<Wind> windList = analyzer.analyze();
List<RaceLogWindFixEvent> windList = analyzer.analyze();
assertNotNull(windList);
assertEquals(0, windList.size());
}
@@ -46,10 +46,10 @@ public class WindFixesFinderTest extends RaceLogAnalyzerTest<WindFixesFinder> {
raceLog.add(event2);
raceLog.add(event3);
List<Wind> windList = analyzer.analyze();
List<RaceLogWindFixEvent> windList = analyzer.analyze();
assertNotNull(windList);
assertEquals(2, windList.size());
assertEquals(event3.getWindFix(), windList.get(0));
assertEquals(event2.getWindFix(), windList.get(1));
assertEquals(event3.getWindFix(), windList.get(0).getWindFix());
assertEquals(event2.getWindFix(), windList.get(1).getWindFix());
}
}
@@ -97,10 +97,10 @@ public interface RaceLogEventFactory {
RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, TimePoint protestStartTime);
RaceLogWindFixEvent createWindFixEvent(TimePoint eventTime, AbstractLogEventAuthor author, int currentPassId, Wind wind);
RaceLogWindFixEvent createWindFixEvent(TimePoint eventTime, AbstractLogEventAuthor author, int currentPassId, Wind wind, boolean isMagnetic);
RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author,
Serializable id, List<Competitor> competitors, int passId, Wind wind);
Serializable id, List<Competitor> competitors, int passId, Wind wind, boolean isMagnetic);
RaceLogDeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author,
DeviceIdentifier device, Competitor mappedTo, int passId, TimePoint from, TimePoint to);
@@ -69,7 +69,7 @@ public interface RaceLogEventRestoreFactory extends RaceLogEventFactory {
TimePoint logicalTimePoint, Serializable id, List<Competitor> competitors, int passId, TimePoint protestStartTime);
RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, List<Competitor> competitors, Integer passId, Wind wind);
Serializable id, List<Competitor> competitors, Integer passId, Wind wind, boolean isMagnetic);
RaceLogDeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author,
TimePoint logicalTimePoint, Serializable pId, DeviceIdentifier device, Competitor mappedTo, int passId, TimePoint from, TimePoint to);
@@ -12,4 +12,13 @@ public interface RaceLogWindFixEvent extends RaceLogEvent {
* Returns the wind fix entered by the race committee
*/
Wind getWindFix();
/**
* Usually, wind readings are expected to specify a true north-based direction. However, in some
* cases capturing a wind direction happens based on a magnetic compass and is not immediately corrected
* for the magnetic variation / declination. Should this be the case for the wind fix provided by this
* event, this method returns <code>true</code>, and a {@link DeclinationService} should be used to infer
* the true north-based wind direction.
*/
boolean isMagnetic();
}
@@ -6,24 +6,22 @@ import java.util.List;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent;
import com.sap.sailing.domain.common.Wind;
public class WindFixesFinder extends RaceLogAnalyzer<List<Wind>> {
public class WindFixesFinder extends RaceLogAnalyzer<List<RaceLogWindFixEvent>> {
public WindFixesFinder(RaceLog raceLog) {
super(raceLog);
}
@Override
protected List<Wind> performAnalysis() {
final List<Wind> windFixes = new ArrayList<Wind>();
protected List<RaceLogWindFixEvent> performAnalysis() {
final List<RaceLogWindFixEvent> windFixes = new ArrayList<>();
for (RaceLogEvent event : getAllEventsDescending()) {
if (event instanceof RaceLogWindFixEvent) {
RaceLogWindFixEvent windFixEvent = (RaceLogWindFixEvent) event;
windFixes.add(windFixEvent.getWindFix());
windFixes.add(windFixEvent);
}
}
return windFixes;
}
}
@@ -234,14 +234,14 @@ public class RaceLogEventFactoryImpl implements RaceLogEventFactory {
}
@Override
public RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Wind wind) {
return createWindFixEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList<Competitor>(), passId, wind);
public RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Wind wind, boolean isMagnetic) {
return createWindFixEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList<Competitor>(), passId, wind, isMagnetic);
}
@Override
public RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id,
List<Competitor> competitors, int passId, Wind wind) {
return new RaceLogWindFixEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, wind);
List<Competitor> competitors, int passId, Wind wind, boolean isMagnetic) {
return new RaceLogWindFixEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, wind, isMagnetic);
}
@Override
@@ -129,8 +129,8 @@ public class RaceLogEventRestoreFactoryImpl extends RaceLogEventFactoryImpl impl
@Override
public RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint,
Serializable id, List<Competitor> competitors, Integer passId, Wind wind) {
return new RaceLogWindFixEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, wind);
Serializable id, List<Competitor> competitors, Integer passId, Wind wind, boolean isMagnetic) {
return new RaceLogWindFixEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, wind, isMagnetic);
}
@Override
@@ -14,11 +14,13 @@ public class RaceLogWindFixEventImpl extends RaceLogEventImpl implements RaceLog
private static final long serialVersionUID = 7879094280634905183L;
private final Wind windFix;
private final boolean isMagnetic;
public RaceLogWindFixEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint pTimePoint,
Serializable pId, List<Competitor> pInvolvedBoats, int pPassId, Wind windFix) {
Serializable pId, List<Competitor> pInvolvedBoats, int pPassId, Wind windFix, boolean isMagnetic) {
super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId);
this.windFix = windFix;
this.isMagnetic = isMagnetic;
}
@Override
@@ -30,6 +32,11 @@ public class RaceLogWindFixEventImpl extends RaceLogEventImpl implements RaceLog
public Wind getWindFix() {
return windFix;
}
@Override
public boolean isMagnetic() {
return isMagnetic;
}
@Override
public String getShortInfo() {
@@ -177,8 +177,9 @@ public interface RaceState extends ReadonlyRaceState {
/**
* Enters a new wind fix for this race.
* @param isMagnetic TODO
*/
void setWindFix(TimePoint now, Wind wind);
void setWindFix(TimePoint now, Wind wind, boolean isMagnetic);
/**
* Marks this race state with a new {@link RaceLogAdditionalScoringInformationEvent} or revokes
@@ -200,8 +200,8 @@ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState {
}
@Override
public void setWindFix(TimePoint timePoint, Wind wind) {
raceLog.add(factory.createWindFixEvent(timePoint, author, raceLog.getCurrentPassId(), wind));
public void setWindFix(TimePoint timePoint, Wind wind, boolean isMagnetic) {
raceLog.add(factory.createWindFixEvent(timePoint, author, raceLog.getCurrentPassId(), wind, isMagnetic));
}
@Override
@@ -41,4 +41,5 @@ Require-Bundle: com.googlecode.java-diff-utils;bundle-version="1.3.0",
com.sap.sse.common,
com.sap.sse,
com.sap.sse.shared.android,
org.apache.commons.math
org.apache.commons.math,
com.sap.sailing.declination
@@ -0,0 +1,15 @@
package com.sap.sailing.domain.base;
import java.io.Serializable;
/**
* Represents the configuration of an (local) instance of a sailing server.
*
* @author Frank
*
*/
public interface SailingServerConfiguration extends Serializable {
boolean isStandaloneServer();
void setStandaloneServer(boolean isStandaloneServer);
}
@@ -187,7 +187,7 @@ public class DomainFactoryImpl extends SharedDomainFactoryImpl implements Domain
statisticsDTO.leaderOrWinner = convertToCompetitorDTO(leaderOrWinner);
GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(leaderOrWinner);
if (track != null) {
statisticsDTO.averageGPSDataSampleInterval = track.getAverageIntervalBetweenFixes();
statisticsDTO.averageGPSDataSampleInterval = track.getAverageIntervalBetweenRawFixes();
}
}
} catch (NoWindException e) {
@@ -0,0 +1,24 @@
package com.sap.sailing.domain.base.impl;
import com.sap.sailing.domain.base.SailingServerConfiguration;
public class SailingServerConfigurationImpl implements SailingServerConfiguration {
private static final long serialVersionUID = -639945748229124558L;
/** indicates if the server is running in standalone mode or not */
private boolean isStandaloneServer;
public SailingServerConfigurationImpl(boolean isStandaloneServer) {
this.isStandaloneServer = isStandaloneServer;
}
@Override
public boolean isStandaloneServer() {
return isStandaloneServer;
}
@Override
public void setStandaloneServer(boolean isStandaloneServer) {
this.isStandaloneServer = isStandaloneServer;
}
}
@@ -1372,7 +1372,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
if (trackedRace != null) {
Date timePointOfLastPositionFixAtOrBeforeQueryTimePoint = getTimePointOfLastFixAtOrBefore(competitor, trackedRace, timePoint);
if (track != null) {
entryDTO.averageSamplingInterval = track.getAverageIntervalBetweenFixes();
entryDTO.averageSamplingInterval = track.getAverageIntervalBetweenRawFixes();
}
if (timePointOfLastPositionFixAtOrBeforeQueryTimePoint != null) {
long timeDifferenceInMs = timePoint.asMillis() - timePointOfLastPositionFixAtOrBeforeQueryTimePoint.getTime();
@@ -10,6 +10,7 @@ import com.sap.sailing.domain.racelogtracking.DeviceIdentifier;
import com.sap.sailing.domain.racelogtracking.DeviceMapping;
import com.sap.sailing.domain.tracking.DynamicGPSFixTrack;
import com.sap.sse.common.NoCorrespondingServiceRegisteredException;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.TimeRange;
import com.sap.sse.common.WithID;
@@ -64,6 +65,15 @@ public enum EmptyGPSFixStore implements GPSFixStore {
@Override
public void loadTrack(DynamicGPSFixTrack<WithID, ?> track, DeviceMapping<WithID> mapping)
throws NoCorrespondingServiceRegisteredException, TransformationException {
}
@Override
public void loadCompetitorTrack(DynamicGPSFixTrack<Competitor, GPSFixMoving> track, AbstractLog<?, ?> log,
Competitor competitor, TimePoint start, TimePoint end) throws TransformationException {
}
@Override
public void loadMarkTrack(DynamicGPSFixTrack<Mark, GPSFix> track, AbstractLog<?, ?> log, Mark mark,
TimePoint start, TimePoint end) throws TransformationException, NoCorrespondingServiceRegisteredException {
}
}
@@ -12,6 +12,7 @@ import com.sap.sailing.domain.racelogtracking.DeviceIdentifier;
import com.sap.sailing.domain.racelogtracking.DeviceMapping;
import com.sap.sailing.domain.tracking.DynamicGPSFixTrack;
import com.sap.sse.common.NoCorrespondingServiceRegisteredException;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.TimeRange;
import com.sap.sse.common.WithID;
@@ -23,12 +24,40 @@ public interface GPSFixStore {
void loadCompetitorTrack(DynamicGPSFixTrack<Competitor, GPSFixMoving> track, AbstractLog<?, ?> log,
Competitor competitor) throws TransformationException;
/**
* Load all fixes within the start and end time point (inclusive) that correspond to the
* {@link DeviceCompetitorMappingEvent}s found in the {@code raceLog}.
*
* @param start
* if <code>null</code>, the start of the time range for which to load fixes is only constrained by the
* device mapping intervals
* @param end
* if <code>null</code>, the end of the time range for which to load fixes is only constrained by the
* device mapping intervals
*/
void loadCompetitorTrack(DynamicGPSFixTrack<Competitor, GPSFixMoving> track, AbstractLog<?, ?> log,
Competitor competitor, TimePoint start, TimePoint end) throws TransformationException;
/**
* Load all fixes that correspond to the {@link DeviceMarkMappingEvent}s found in the {@code raceLog}.
*/
void loadMarkTrack(DynamicGPSFixTrack<Mark, GPSFix> track, AbstractLog<?, ?> log, Mark mark) throws TransformationException,
NoCorrespondingServiceRegisteredException;
/**
* Load all fixes within the start and end time point (inclusive) that correspond to the
* {@link DeviceMarkMappingEvent}s found in the {@code raceLog}.
*
* @param start
* if <code>null</code>, the start of the time range for which to load fixes is only constrained by the
* device mapping intervals
* @param end
* if <code>null</code>, the end of the time range for which to load fixes is only constrained by the
* device mapping intervals
*/
void loadMarkTrack(DynamicGPSFixTrack<Mark, GPSFix> track, AbstractLog<?, ?> log, Mark mark, TimePoint start,
TimePoint end) throws TransformationException, NoCorrespondingServiceRegisteredException;
/**
* Load all fixes that correspond to the {@code mapping}.
*/
@@ -0,0 +1,43 @@
package com.sap.sailing.domain.tracking;
import java.io.IOException;
import java.text.ParseException;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.declination.Declination;
import com.sap.sailing.declination.DeclinationService;
import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.common.impl.WindImpl;
import com.sap.sse.common.Duration;
public class RaceLogWindFixDeclinationHelper {
private static final Logger logger = Logger.getLogger(RaceLogWindFixDeclinationHelper.class.getName());
public Wind getOptionallyDeclinationCorrectedWind(RaceLogWindFixEvent event) {
Wind wind;
if (event.isMagnetic()) {
final Wind magneticNorthBasedWindFix = event.getWindFix();
final DeclinationService declinationService = DeclinationService.INSTANCE;
Declination declination;
try {
declination = declinationService.getDeclination(magneticNorthBasedWindFix.getTimePoint(),
magneticNorthBasedWindFix.getPosition(), /* timeoutForOnlineFetchInMilliseconds */
Duration.ONE_SECOND.times(5).asMillis());
wind = new WindImpl(magneticNorthBasedWindFix.getPosition(), magneticNorthBasedWindFix.getTimePoint(),
new KnotSpeedWithBearingImpl(magneticNorthBasedWindFix.getKnots(), magneticNorthBasedWindFix
.getBearing().add(
declination.getBearingCorrectedTo(magneticNorthBasedWindFix.getTimePoint()))));
} catch (IOException | ParseException e) {
logger.log(Level.SEVERE, "Error trying to correct magnetic wind fix " + magneticNorthBasedWindFix
+ " by declination. " + "Using uncorrected magnetic wind direction instead.", e);
wind = magneticNorthBasedWindFix;
}
} else {
wind = event.getWindFix();
}
return wind;
}
}
@@ -143,12 +143,14 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
@Override
public void recordFix(Competitor competitor, GPSFixMoving fix) {
DynamicGPSFixTrack<Competitor, GPSFixMoving> track = getTrack(competitor);
if (track != null) {
if (logger != null && logger.getLevel() != null && logger.getLevel().equals(Level.FINEST)) {
logger.finest(""+competitor.getName() + ": " + fix);
if (isFixWithinStartAndEndOfTracking(fix.getTimePoint())) {
DynamicGPSFixTrack<Competitor, GPSFixMoving> track = getTrack(competitor);
if (track != null) {
if (logger != null && logger.getLevel() != null && logger.getLevel().equals(Level.FINEST)) {
logger.finest(""+competitor.getName() + ": " + fix);
}
track.addGPSFix(fix); // the track notifies this tracked race which in turn notifies its listeners
}
track.addGPSFix(fix); // the track notifies this tracked race which in turn notifies its listeners
}
}
@@ -161,12 +163,21 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
@Override
public void recordFix(Mark mark, GPSFix fix) {
if ((getStartOfTracking() == null || getStartOfTracking().compareTo(fix.getTimePoint()) <= 0) &&
(getEndOfTracking() == null || getEndOfTracking().compareTo(fix.getTimePoint()) >= 0)) {
final TimePoint fixTimePoint = fix.getTimePoint();
if (isFixWithinStartAndEndOfTracking(fixTimePoint)) {
getOrCreateTrack(mark).addGPSFix(fix);
}
}
/**
* A time point is considered "in" if it is (inclusively) between {@link #getStartOfTracking()} and {@link #getEndOfTracking()}.
* A <code>null</code> value for one of the two interval demarcations means an open-ended interval.
*/
private boolean isFixWithinStartAndEndOfTracking(final TimePoint fixTimePoint) {
return (getStartOfTracking() == null || getStartOfTracking().compareTo(fixTimePoint) <= 0) &&
(getEndOfTracking() == null || getEndOfTracking().compareTo(fixTimePoint) >= 0);
}
@Override
public void setMillisecondsOverWhichToAverageSpeed(long millisecondsOverWhichToAverageSpeed) {
this.millisecondsOverWhichToAverageSpeed = millisecondsOverWhichToAverageSpeed;
@@ -613,16 +624,28 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
@Override
public void setStartOfTrackingReceived(TimePoint startOfTrackingReceived) {
setStartOfTrackingReceived(startOfTrackingReceived, /* waitForGPSFixesToLoad */ false);
}
public void setStartOfTrackingReceived(TimePoint startOfTrackingReceived, final boolean waitForGPSFixesToLoad) {
if (!Util.equalsWithNull(startOfTrackingReceived, getStartOfTracking())) {
super.setStartOfTrackingReceived(startOfTrackingReceived);
super.setStartOfTrackingReceived(startOfTrackingReceived, waitForGPSFixesToLoad);
notifyListenersStartOfTrackingChanged(getStartOfTracking());
}
}
@Override
public void setEndOfTrackingReceived(TimePoint endOfTrackingReceived) {
setEndOfTrackingReceived(endOfTrackingReceived, /* waitForGPSFixesToLoad */ false);
}
/**
* Non-interface method, mainly for testing purposes; callers can ask to wait for the loading of fixes in the
* potentially extended tracking interval to finish before returning from this method.
*/
public void setEndOfTrackingReceived(final TimePoint endOfTrackingReceived, final boolean waitForGPSFixesToLoad) {
if (!Util.equalsWithNull(endOfTrackingReceived, getEndOfTracking())) {
super.setEndOfTrackingReceived(endOfTrackingReceived);
super.setEndOfTrackingReceived(endOfTrackingReceived, waitForGPSFixesToLoad);
notifyListenersEndOfTrackingChanged(getEndOfTracking());
}
}
@@ -757,7 +780,7 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
courseDesignChangedListener.courseDesignChanged(newCourseDesign);
}
} catch (IOException e) {
e.printStackTrace();
logger.log(Level.INFO, "Exception trying to notify race course design change listeners about course design change", e);
}
}
@@ -30,16 +30,17 @@ import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.markpassingcalculation.MarkPassingUpdateListener;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.RaceLogWindFixDeclinationHelper;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.Util.Triple;
/**
* TODO: this class could be a good place to leverage more information about a race containing in the {@link RaceLog}.
* This includes for example the {@link RaceLogRaceStatus} indicating the current race's start.
* Listens for changes on a {@link RaceLog} and forwards the relevant ones to a {@link TrackedRace}. Examples: start time changes;
* fixed mark passings changes; course design changes; wind fixes entered by the race committee.<p>
*/
public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor {
@@ -92,7 +93,8 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor {
*/
private void initializeWindTrack(RaceLog raceLog) {
WindFixesFinder windFixesFinder = new WindFixesFinder(raceLog);
for (Wind wind : windFixesFinder.analyze()) {
for (RaceLogWindFixEvent raceLogWindFixEvent : windFixesFinder.analyze()) {
Wind wind = new RaceLogWindFixDeclinationHelper().getOptionallyDeclinationCorrectedWind(raceLogWindFixEvent);
trackedRace.recordWind(wind, raceCommitteeWindSource);
}
}
@@ -123,7 +125,8 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor {
*/
private void removeAllWindFixesFromWindTrack(RaceLog raceLog) {
WindFixesFinder windFixesFinder = new WindFixesFinder(raceLog);
for (Wind wind : windFixesFinder.analyze()) {
for (RaceLogWindFixEvent raceLogWindFixEvent : windFixesFinder.analyze()) {
Wind wind = new RaceLogWindFixDeclinationHelper().getOptionallyDeclinationCorrectedWind(raceLogWindFixEvent);
trackedRace.removeWind(wind, raceCommitteeWindSource);
}
}
@@ -226,8 +229,9 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor {
@Override
public void visit(RaceLogWindFixEvent event) {
Wind wind = new RaceLogWindFixDeclinationHelper().getOptionallyDeclinationCorrectedWind(event);
// add the wind fix to the race committee WindTrack
trackedRace.recordWind(event.getWindFix(), raceCommitteeWindSource);
trackedRace.recordWind(wind, raceCommitteeWindSource);
}
@Override
@@ -205,7 +205,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
* Race start time as announced by the tracking infrastructure
*/
private TimePoint startTimeReceived;
/**
* The calculated race start time
*/
@@ -611,6 +611,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
*/
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException {
ois.defaultReadObject();
getRace().getCourse().addCourseListener(this);
raceStates = new WeakHashMap<>();
attachedRaceLogs = new ConcurrentHashMap<>();
attachedRaceExecutionOrderProviders = new ConcurrentHashMap<>();
@@ -1795,12 +1796,35 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
return startTimeReceived;
}
protected void setStartOfTrackingReceived(TimePoint startOfTracking) {
protected void setStartOfTrackingReceived(final TimePoint startOfTracking, final boolean waitForGPSFixesToLoad) {
final TimePoint oldStartOfTracking = this.startOfTrackingReceived;
this.startOfTrackingReceived = startOfTracking;
if (!Util.equalsWithNull(oldStartOfTracking, startOfTracking) &&
(startOfTracking == null || (oldStartOfTracking != null && startOfTracking.before(oldStartOfTracking)))) {
logger.info("Loading fixes after start of tracking for "+getRace()+" has been extended from "+oldStartOfTracking+" to "+startOfTracking);
loadGPSFixesForExtendedTimeRange(startOfTracking, oldStartOfTracking, waitForGPSFixesToLoad);
}
}
protected void setEndOfTrackingReceived(TimePoint endOfTracking) {
private void loadGPSFixesForExtendedTimeRange(final TimePoint start, final TimePoint end, final boolean waitForGPSFixesToLoad) {
for (final RaceLog raceLog : attachedRaceLogs.values()) {
loadFixesForLog(raceLog, /* no need to addLogToMap because log has already been added during attachRaceLog */ null,
/* startOfTimeWindowToLoad */ start, /* endOfTimeWindowToLoad */ end, waitForGPSFixesToLoad);
}
for (final RegattaLog regattaLog : attachedRegattaLogs.values()) {
loadFixesForLog(regattaLog, /* no need to addLogToMap because log has already been added during attachRaceLog */ null,
/* startOfTimeWindowToLoad */ start, /* endOfTimeWindowToLoad */ end, waitForGPSFixesToLoad);
}
}
protected void setEndOfTrackingReceived(final TimePoint endOfTracking, final boolean waitForGPSFixesToLoad) {
final TimePoint oldEndOfTracking = this.endOfTrackingReceived;
this.endOfTrackingReceived = endOfTracking;
if (!Util.equalsWithNull(oldEndOfTracking, endOfTracking) &&
(endOfTracking == null || (oldEndOfTracking != null && endOfTracking.after(oldEndOfTracking)))) {
logger.info("Loading fixes after end of tracking for "+getRace()+" has been extended from "+oldEndOfTracking+" to "+endOfTracking);
loadGPSFixesForExtendedTimeRange(oldEndOfTracking, endOfTracking, waitForGPSFixesToLoad);
}
}
/**
@@ -1839,6 +1863,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
@Override
public void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
logger.info("waypoint at zero-based index "+zeroBasedIndex+" ("+waypointThatGotAdded+") added; updating tracked race "+this+
"'s data structures...");
// expecting to hold the course's write lock
invalidateMarkPassingTimes();
LockUtil.lockForRead(getSerializationLock());
@@ -1869,6 +1895,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
}
updated(/* time point */null); // no maneuver cache invalidation required because we don't yet have mark
// passings for new waypoint
logger.info("done updating tracked race "+this+"'s data structures...");
} finally {
LockUtil.unlockAfterRead(getSerializationLock());
}
@@ -1938,6 +1965,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
@Override
public void waypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
logger.info("waypoint at zero-based index "+zeroBasedIndex+" ("+waypointThatGotRemoved+") removed; updating tracked race "+this+
"'s data structures...");
// expecting to hold the course's write lock
invalidateMarkPassingTimes();
LockUtil.lockForRead(getSerializationLock());
@@ -1994,6 +2023,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
triggerManeuverCacheRecalculation(competitor);
}
}
logger.info("done updating tracked race "+this+"'s data structures...");
} finally {
LockUtil.unlockAfterRead(getSerializationLock());
}
@@ -3135,62 +3165,110 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
}
/**
* Loads the GPS fixes as per the device registrations in the <code>log</code> into this race. The <code>log</code> is added to the
* <code>addLogToMap</code> data structure while holding this object's monitor, and all waiters on this object are notified when done
* with adding the <code>log</code> to <code>addLogToMap</code>.
* Loads the GPS fixes as per the device registrations in the <code>log</code> into this race. The <code>log</code>
* is added to the <code>addLogToMap</code> data structure while holding <code>this</code> object's monitor, and all
* waiters on <code>this</code> object are notified when done with adding the <code>log</code> to
* <code>addLogToMap</code>.
*/
private <LogT extends AbstractLog<EventT, VisitorT>, EventT extends AbstractLogEvent<VisitorT>, VisitorT> void loadFixesForLog(
final LogT log, ConcurrentHashMap<Serializable, LogT> addLogToMap) {
final LogT log, ConcurrentHashMap<Serializable, LogT> addLogToMap, final boolean waitForGPSFixesToLoad) {
if (log != null) {
// Use the new log, that possibly contains device mappings, to load GPSFix tracks from the DB
// When this tracked race is to be serialized, wait for the loading from stores to complete.
new Thread("Mongo mark and competitor track loader for tracked race " + getRace().getName() + ", log "
+ log.getId()) {
@Override
public void run() {
LockUtil.lockForRead(getSerializationLock());
LockUtil.lockForWrite(getLoadingFromGPSFixStoreLock());
synchronized (TrackedRaceImpl.this) {
loadingFromGPSFixStore = true; // indicates that the serialization lock is now safely held
addLogToMap.put(log.getId(), log);
TrackedRaceImpl.this.notifyAll();
}
try {
logger.info("Started loading competitor tracks for " + getRace().getName() + " for log " + log.getId());
for (Competitor competitor : race.getCompetitors()) {
try {
gpsFixStore.loadCompetitorTrack(
(DynamicGPSFixTrack<Competitor, GPSFixMoving>) tracks.get(competitor), log,
competitor);
} catch (TransformationException | NoCorrespondingServiceRegisteredException e) {
logger.log(Level.WARNING, "Could not load track for " + competitor, e);
}
}
logger.info("Finished loading competitor tracks for " + getRace().getName());
logger.info("Started loading mark tracks for " + getRace().getName());
for (Mark mark : getMarksFromRaceAndLogs()) {
try {
gpsFixStore.loadMarkTrack((DynamicGPSFixTrack<Mark, GPSFix>) getOrCreateTrack(mark), log, mark);
} catch (TransformationException | NoCorrespondingServiceRegisteredException e) {
logger.log(Level.WARNING, "Could not load track for " + mark, e);
}
}
logger.info("Finished loading mark tracks for " + getRace().getName());
} finally {
synchronized (TrackedRaceImpl.this) {
loadingFromGPSFixStore = false;
TrackedRaceImpl.this.notifyAll();
}
LockUtil.unlockAfterWrite(getLoadingFromGPSFixStoreLock());
LockUtil.unlockAfterRead(getSerializationLock());
}
}
}.start();
final TimePoint startOfTimeWindowToLoad = getStartOfTracking();
final TimePoint endOfTimeWindowToLoad = getEndOfTracking();
loadFixesForLog(log, addLogToMap, startOfTimeWindowToLoad, endOfTimeWindowToLoad, waitForGPSFixesToLoad);
} else {
logger.severe("Got a request to attach log for an empty log!");
}
}
/**
* Loads the GPS fixes as per the device registrations in the <code>log</code> into this race, cropped to the time
* interval specified by <code>startOfTimeWindowToLoad</code> and </code>endOfTimeWindowToLoad</code>. The
* <code>log</code> is added to the <code>addLogToMap</code> data structure (if <code>addLogToMap</code> is not
* <code>null</code>) while holding <code>this</code> object's monitor, and all waiters on <code>this</code> object
* are notified when done with adding the <code>log</code> to <code>addLogToMap</code>.
*
* @param addLogToMap
* the log will be added to this map after the {@link #loadingFromGPSFixStore} flag has been set and only when the
* loading thread has successfully acquired the write lock of {@link #getLoadingFromGPSFixStoreLock()}. When done loading,
* all waiters on <code>this</code> object will be notified. If the map is not <code>null</code>, the key used to enter
* the log is the {@link AbstractLog#getId() log's ID}.
* @param startOfTimeWindowToLoad
* the time to use to crop the beginning of the time range for which to load fixes; if <code>null</code>,
* the start of the time range will be restricted only by the device mapping intervals
* @param endOfTimeWindowToLoad
* the time to use to crop the end of the time range for which to load fixes; if <code>null</code>,
* the end of the time range will be restricted only by the device mapping intervals
*/
private <LogT extends AbstractLog<EventT, VisitorT>, EventT extends AbstractLogEvent<VisitorT>, VisitorT> void loadFixesForLog(final LogT log,
ConcurrentHashMap<Serializable, LogT> addLogToMap, final TimePoint startOfTimeWindowToLoad,
final TimePoint endOfTimeWindowToLoad, final boolean waitForGPSFixesToLoad) {
Thread t = new Thread("Mongo mark and competitor track loader for tracked race " + getRace().getName() + ", log "
+ log.getId()+" from "+startOfTimeWindowToLoad+" to "+endOfTimeWindowToLoad) {
@Override
public void run() {
LockUtil.lockForRead(getSerializationLock());
LockUtil.lockForWrite(getLoadingFromGPSFixStoreLock());
synchronized (TrackedRaceImpl.this) {
loadingFromGPSFixStore = true; // indicates that the serialization lock is now safely held
if (addLogToMap != null) {
addLogToMap.put(log.getId(), log);
}
TrackedRaceImpl.this.notifyAll();
}
try {
logger.info("Started loading competitor tracks for " + getRace().getName() + " for log " + log.getId());
for (Competitor competitor : race.getCompetitors()) {
try {
gpsFixStore.loadCompetitorTrack(
(DynamicGPSFixTrack<Competitor, GPSFixMoving>) tracks.get(competitor), log,
competitor, startOfTimeWindowToLoad, endOfTimeWindowToLoad);
} catch (TransformationException | NoCorrespondingServiceRegisteredException e) {
logger.log(Level.WARNING, "Could not load track for " + competitor, e);
}
}
logger.info("Finished loading competitor tracks for " + getRace().getName());
logger.info("Started loading mark tracks for " + getRace().getName());
for (Mark mark : getMarksFromRaceAndLogs()) {
try {
gpsFixStore.loadMarkTrack((DynamicGPSFixTrack<Mark, GPSFix>) getOrCreateTrack(mark),
log, mark, startOfTimeWindowToLoad, endOfTimeWindowToLoad);
} catch (TransformationException | NoCorrespondingServiceRegisteredException e) {
logger.log(Level.WARNING, "Could not load track for " + mark, e);
}
}
logger.info("Finished loading mark tracks for " + getRace().getName());
} finally {
synchronized (TrackedRaceImpl.this) {
loadingFromGPSFixStore = false;
TrackedRaceImpl.this.notifyAll();
}
LockUtil.unlockAfterWrite(getLoadingFromGPSFixStoreLock());
LockUtil.unlockAfterRead(getSerializationLock());
logger.info("Thread "+getName()+" done.");
}
}
};
t.start();
if (waitForGPSFixesToLoad) {
try {
t.join();
} catch (InterruptedException e) {
logger.log(Level.WARNING, "Got interrupted while waiting for loading of GPS fixes from log "+log+" to finish", e);
}
}
}
/**
* Tells if currently the race is loading GPS fixes from the {@link GPSFixStore}. Clients may {@link Object#wait()} on <code>this</code>
* object and will be notified whenever a change of this flag's value occurs.
*/
public boolean isLoadingFromGPSFixStore() {
return loadingFromGPSFixStore;
}
/**
* This can trigger fixes to be loaded, if there are {@link DeviceMapping}s in the {@code RaceLog}.
* If multiple race logs are attached, the threads that are spawned to load fixes will do so one
@@ -3198,7 +3276,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
*/
@Override
public void attachRaceLog(final RaceLog raceLog) {
loadFixesForLog(raceLog, attachedRaceLogs);
loadFixesForLog(raceLog, attachedRaceLogs, /* wait for fixes to load */ false);
}
@Override
@@ -3243,7 +3321,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
@Override
public void attachRegattaLog(RegattaLog regattaLog) {
loadFixesForLog(regattaLog, attachedRegattaLogs);
loadFixesForLog(regattaLog, attachedRegattaLogs, /* wait for fixes to load */ false);
}
@Override
@@ -1,60 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.VideoPopup"/>
<listEntry value="com.sap.sailing.gwt.ui.Simulator"/>
</listAttribute>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/gwt/Home.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.gwt.ui"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.googlecode.java-diff-utils/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.json.simple/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.udpconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mongodb/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.geocoding/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.gwt.ui&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.operationaltransformation/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.replication/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<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="-nosuperDevMode -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.ui.Search -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/EmbeddedMapAndWindChart.html com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart -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 com.sap.sailing.gwt.ui.VideoPopup"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2048m -XX:MaxPermSize=512m -Xdebug -Xrunjdwp:transport=dt_socket,address=7999,server=y"/>
</launchConfiguration>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.VideoPopup"/>
<listEntry value="com.sap.sailing.gwt.ui.Simulator"/>
</listAttribute>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/gwt/Home.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.gwt.ui"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.googlecode.java-diff-utils/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.json.simple/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.udpconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mongodb/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.geocoding/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.gwt.ui&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.operationaltransformation/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.replication/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<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="-nosuperDevMode -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.ui.Search -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/EmbeddedMapAndWindChart.html com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart -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 com.sap.sailing.gwt.ui.VideoPopup"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XstartOnFirstThread -Xmx2048m -XX:MaxPermSize=512m -Xdebug -Xrunjdwp:transport=dt_socket,address=7999,server=y"/>
</launchConfiguration>
@@ -1,78 +1,78 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9876"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart"/>
<listEntry value="com.sap.sailing.gwt.ui.RaceBoard"/>
<listEntry value="com.sap.sailing.gwt.ui.DataMining"/>
<listEntry value="com.sap.sailing.gwt.ui.LeaderboardEditing"/>
<listEntry value="com.sap.sailing.gwt.ui.Spectator"/>
<listEntry value="com.sap.sailing.gwt.regattaoverview.RegattaOverview"/>
<listEntry value="com.sap.sailing.gwt.ui.PolarSheets"/>
<listEntry value="com.sap.sailing.gwt.ui.Leaderboard"/>
<listEntry value="com.sap.sailing.gwt.ui.Simulator"/>
<listEntry value="com.sap.sailing.gwt.ui.YoutubePopup"/>
<listEntry value="com.sap.sailing.gwt.AutoPlay"/>
<listEntry value="com.sap.sailing.gwt.ui.AdminConsole"/>
<listEntry value="com.sap.sailing.gwt.home.Home"/>
<listEntry value="com.sap.sailing.gwt.ui.VideoPopup"/>
</listAttribute>
<booleanAttribute key="com.google.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/gwt/Home.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.gwt.ui"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.theme/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.googlecode.java-diff-utils/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.json.simple/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.udpconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mongodb/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.operationaltransformation/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.replication/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.geocoding/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.gwt.ui&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<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 -workDir &quot;${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work&quot; -war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9876 -startupUrl /gwt/Home.html com.sap.sailing.gwt.home.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/EmbeddedMapAndWindChart com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart -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.regattaoverview.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.home.Desktop com.sap.sailing.gwt.home.Home com.sap.sailing.gwt.ui.AdminConsole 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.regattaoverview.RegattaOverview com.sap.sailing.gwt.ui.Spectator com.sap.sailing.gwt.ui.LeaderboardEditing com.sap.sailing.gwt.ui.DataMining com.sap.sailing.gwt.ui.RaceBoard com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart"/>
<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>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9876"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart"/>
<listEntry value="com.sap.sailing.gwt.ui.RaceBoard"/>
<listEntry value="com.sap.sailing.gwt.ui.DataMining"/>
<listEntry value="com.sap.sailing.gwt.ui.LeaderboardEditing"/>
<listEntry value="com.sap.sailing.gwt.ui.Spectator"/>
<listEntry value="com.sap.sailing.gwt.regattaoverview.RegattaOverview"/>
<listEntry value="com.sap.sailing.gwt.ui.PolarSheets"/>
<listEntry value="com.sap.sailing.gwt.ui.Leaderboard"/>
<listEntry value="com.sap.sailing.gwt.ui.Simulator"/>
<listEntry value="com.sap.sailing.gwt.ui.YoutubePopup"/>
<listEntry value="com.sap.sailing.gwt.AutoPlay"/>
<listEntry value="com.sap.sailing.gwt.ui.AdminConsole"/>
<listEntry value="com.sap.sailing.gwt.home.Home"/>
<listEntry value="com.sap.sailing.gwt.ui.VideoPopup"/>
</listAttribute>
<booleanAttribute key="com.google.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/gwt/Home.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.gwt.ui"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.theme/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.googlecode.java-diff-utils/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.json.simple/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.udpconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mongodb/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.operationaltransformation/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.replication/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.geocoding/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.gwt.ui&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<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 -workDir &quot;${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work&quot; -war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9876 -startupUrl /gwt/Home.html com.sap.sailing.gwt.home.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/EmbeddedMapAndWindChart com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart -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.regattaoverview.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.home.Desktop com.sap.sailing.gwt.home.Home com.sap.sailing.gwt.ui.AdminConsole 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.regattaoverview.RegattaOverview com.sap.sailing.gwt.ui.Spectator com.sap.sailing.gwt.ui.LeaderboardEditing com.sap.sailing.gwt.ui.DataMining com.sap.sailing.gwt.ui.RaceBoard com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XstartOnFirstThread -Xms1024m -Xmx3072m"/>
</launchConfiguration>
+76 -76
View File
@@ -1,76 +1,76 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<booleanAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT_AUTO" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.RaceBoard"/>
<listEntry value="com.sap.sailing.gwt.ui.DataMining"/>
<listEntry value="com.sap.sailing.gwt.ui.LeaderboardEditing"/>
<listEntry value="com.sap.sailing.gwt.ui.Spectator"/>
<listEntry value="com.sap.sailing.gwt.regattaoverview.RegattaOverview"/>
<listEntry value="com.sap.sailing.gwt.ui.PolarSheets"/>
<listEntry value="com.sap.sailing.gwt.ui.Leaderboard"/>
<listEntry value="com.sap.sailing.gwt.ui.Simulator"/>
<listEntry value="com.sap.sailing.gwt.ui.YoutubePopup"/>
<listEntry value="com.sap.sailing.gwt.AutoPlay"/>
<listEntry value="com.sap.sailing.gwt.ui.AdminConsole"/>
<listEntry value="com.sap.sailing.gwt.home.Home"/>
<listEntry value="com.sap.sailing.gwt.ui.VideoPopup"/>
</listAttribute>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/gwt/Home.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.gwt.ui"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.theme/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.googlecode.java-diff-utils/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.json.simple/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.udpconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mongodb/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.operationaltransformation/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.replication/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.geocoding/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.gwt.ui&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<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="-nosuperDevMode -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 auto -startupUrl /gwt/Home.html com.sap.sailing.gwt.home.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.regattaoverview.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.home.Home com.sap.sailing.gwt.ui.AdminConsole 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.regattaoverview.RegattaOverview com.sap.sailing.gwt.ui.Spectator com.sap.sailing.gwt.ui.LeaderboardEditing com.sap.sailing.gwt.ui.DataMining 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="-Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
</launchConfiguration>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<booleanAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT_AUTO" value="true"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.gwt.ui.RaceBoard"/>
<listEntry value="com.sap.sailing.gwt.ui.DataMining"/>
<listEntry value="com.sap.sailing.gwt.ui.LeaderboardEditing"/>
<listEntry value="com.sap.sailing.gwt.ui.Spectator"/>
<listEntry value="com.sap.sailing.gwt.regattaoverview.RegattaOverview"/>
<listEntry value="com.sap.sailing.gwt.ui.PolarSheets"/>
<listEntry value="com.sap.sailing.gwt.ui.Leaderboard"/>
<listEntry value="com.sap.sailing.gwt.ui.Simulator"/>
<listEntry value="com.sap.sailing.gwt.ui.YoutubePopup"/>
<listEntry value="com.sap.sailing.gwt.AutoPlay"/>
<listEntry value="com.sap.sailing.gwt.ui.AdminConsole"/>
<listEntry value="com.sap.sailing.gwt.home.Home"/>
<listEntry value="com.sap.sailing.gwt.ui.VideoPopup"/>
</listAttribute>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/gwt/Home.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.gwt.ui"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.theme/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.googlecode.java-diff-utils/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.json.simple/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.udpconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mongodb/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.operationaltransformation/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.replication/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.geocoding/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.gwt.ui&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<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="-nosuperDevMode -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 auto -startupUrl /gwt/Home.html com.sap.sailing.gwt.home.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.regattaoverview.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.home.Home com.sap.sailing.gwt.ui.AdminConsole 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.regattaoverview.RegattaOverview com.sap.sailing.gwt.ui.Spectator com.sap.sailing.gwt.ui.LeaderboardEditing com.sap.sailing.gwt.ui.DataMining 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="-XstartOnFirstThread -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
</launchConfiguration>
@@ -63,6 +63,16 @@
<url-pattern>/service/sailing</url-pattern>
</servlet-mapping>
<servlet>
<display-name>Server Configuration Service</display-name>
<servlet-name>ServerConfigurationService</servlet-name>
<servlet-class>com.sap.sailing.gwt.server.ServerConfigurationServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServerConfigurationService</servlet-name>
<url-pattern>/service/serverconfiguration</url-pattern>
</servlet-mapping>
<servlet>
<display-name>Dispatch Service</display-name>
<servlet-name>DispatchService</servlet-name>
@@ -1,14 +1,11 @@
package com.sap.sailing.gwt.autoplay.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayAppActivityMapper;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayAppClientFactory;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayAppHistoryMapper;
import com.sap.sailing.gwt.common.client.SharedResources;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.EntryPointHelper;
import com.sap.sse.gwt.client.mvp.AbstractMvpEntryPoint;
public class AutoPlayEntryPoint extends AbstractMvpEntryPoint<StringMessages> {
@@ -16,9 +13,6 @@ public class AutoPlayEntryPoint extends AbstractMvpEntryPoint<StringMessages> {
@Override
public void doOnModuleLoad() {
AutoPlayAppClientFactory clientFactory = GWT.create(AutoPlayAppClientFactory.class);
EntryPointHelper.registerASyncService((ServiceDefTarget) clientFactory.getSailingService(), RemoteServiceMappingConstants.sailingServiceRemotePath);
EntryPointHelper.registerASyncService((ServiceDefTarget) clientFactory.getMediaService(), RemoteServiceMappingConstants.mediaServiceRemotePath);
AutoPlayAppHistoryMapper applicationHistoryMapper = GWT.create(AutoPlayAppHistoryMapper.class);
initMvp(clientFactory, applicationHistoryMapper, new AutoPlayAppActivityMapper(clientFactory));
Loaded 100 of 256 files, more files were not shown because too many files have changed in this diff. Show more