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

This commit is contained in:
Lennart Hensler committed 2015-11-15 11:43:12 +01:00
commit bd2d67f346
679 files changed
+12413 -6059

No files matched your search

+67
View File
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>java</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
</buildSpec>
<natures>
</natures>
<filteredResources>
<filter>
<id>1447316122256</id>
<name></name>
<type>10</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-true-com\.sap\..*</arguments>
</matcher>
</filter>
<filter>
<id>1447316122263</id>
<name></name>
<type>10</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-true-com\.google.*</arguments>
</matcher>
</filter>
<filter>
<id>1447316122270</id>
<name></name>
<type>10</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-true-com\.tractrac\..*</arguments>
</matcher>
</filter>
<filter>
<id>1447316122279</id>
<name></name>
<type>10</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-true-org\.json\..*</arguments>
</matcher>
</filter>
<filter>
<id>1447316122293</id>
<name></name>
<type>10</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-true-org\.moxieapps\..*</arguments>
</matcher>
</filter>
<filter>
<id>1447316122310</id>
<name></name>
<type>10</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-true-org\.openqa\..*</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
@@ -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="-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;&#13;&#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;&#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&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.sailing.dashboards.gwt/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.dashboards.gwt/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.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.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.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.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 id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&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.google.gwt.osgi/lib/gwt-servlet.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 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 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.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.sse.gwt.adminconsole/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.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;&#13;&#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;&#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&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.sailing.dashboards.gwt/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.dashboards.gwt/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.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.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.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.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 id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&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.google.gwt.osgi/lib/gwt-servlet.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 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 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.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.sse.gwt.adminconsole/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.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>
@@ -158,6 +158,7 @@ public class RibDashboardPanel extends Composite implements RibDashboardDataRetr
private void addWindBotComponentsAsDataRetrieverListener(WindBotDataRetrieverProvider windBotDataRetrieverProvider) {
for (WindBotComponent windBotComponent : windBotComponents) {
logger.log(Level.INFO, "Registering WindBotDataRetrieverListener");
windBotDataRetrieverProvider.addWindBotDataRetrieverListener(windBotComponent);
}
}
@@ -178,8 +179,19 @@ public class RibDashboardPanel extends Composite implements RibDashboardDataRetr
}
@Override
public void numberOfWindBotsChanged(List<String> windBotIDs,
public void numberOfWindBotsReceivedChanged(List<String> windBotIDs,
WindBotDataRetrieverProvider windBotDataRetrieverProvider) {
if(windBotIDs != null) {
logger.log(Level.INFO, "Number of available windbots changed to "+windBotIDs.size());
} else {
logger.log(Level.INFO, "Number of available windbots changed. WindBots List is null");
}
initWindBotComponents(windBotIDs, windBotDataRetrieverProvider);
}
@Override
public void numberOfWindBotsReceivedIsZero() {
windloadinghintleft.setInnerText(stringConstants.dashboardWindBotNotAvailable());
windloadinghintright.setInnerText(stringConstants.dashboardWindBotNotAvailable());
}
}
@@ -3,5 +3,6 @@ package com.sap.sailing.dashboards.gwt.client.dataretriever;
import java.util.List;
public interface NumberOfWindBotsChangeListener {
public void numberOfWindBotsChanged(List<String> windBotIDs, WindBotDataRetrieverProvider windBotDataRetrieverProvider);
public void numberOfWindBotsReceivedChanged(List<String> windBotIDs, WindBotDataRetrieverProvider windBotDataRetrieverProvider);
public void numberOfWindBotsReceivedIsZero();
}
@@ -89,8 +89,7 @@ public class RibDashboardDataRetriever implements TimeListener, RaceSelectionPro
@Override
public void onFailure(Throwable caught) {
logger.log(Level.INFO, "Failed to received RibDashboardRaceInfoDTO");
logger.log(Level.INFO, caught.getMessage());
logger.log(Level.INFO, "Failed to received RibDashboardRaceInfoDTO, "+caught.getMessage());
}
});
}
@@ -70,21 +70,26 @@ public class WindBotDataRetriever implements TimeListener, WindBotDataRetrieverP
public void onSuccess(WindInfoForRaceDTO result) {
logger.log(Level.INFO, "Received WindInfoForRaceDTO");
if (result != null) {
if(windBotIDsInLiveRace.size() != getWindBotIdsFrom(result).size()){
windBotIDsInLiveRace = getWindBotIdsFrom(result);
notifyListenersAboutNumberOfWindBotChange(windBotIDsInLiveRace);
logger.log(Level.INFO, "Number of Windbots changed");
int numberOfReceivedExpeditionSources = getWindBotIdsFrom(result).size();
if (numberOfReceivedExpeditionSources > 0) {
if (windBotIDsInLiveRace.size() != numberOfReceivedExpeditionSources) {
windBotIDsInLiveRace = getWindBotIdsFrom(result);
notifyListenersAboutNumberOfWindBotChange(windBotIDsInLiveRace);
logger.log(Level.INFO, "Number of Windbots changed to "+numberOfReceivedExpeditionSources);
}
notifyWindBotDataRetrieverListeners(result);
} else {
notifyListenersAboutNumberOfWindBotsReceivedIsZero();
logger.log(Level.INFO, "WindInfoForRaceDTO is not containing wind from windbots");
}
notifyWindBotDataRetrieverListeners(result);
} else {
logger.log(Level.INFO, "WindInfoForRaceDTO is null");
logger.log(Level.INFO, "WindInfoForRaceDTO is null");
}
}
@Override
public void onFailure(Throwable caught) {
logger.log(Level.INFO, "Failed to received WindInfoForRaceDTO");
logger.log(Level.INFO, caught.getMessage());
logger.log(Level.INFO, "Failed to received WindInfoForRaceDTO, "+caught.getMessage());
}
});
}
@@ -109,7 +114,13 @@ public class WindBotDataRetriever implements TimeListener, WindBotDataRetrieverP
private void notifyListenersAboutNumberOfWindBotChange(List<String> windBotIDs) {
for (NumberOfWindBotsChangeListener numberOfWindBotsChangeListener : numberOfWindBotsChangeListeners) {
numberOfWindBotsChangeListener.numberOfWindBotsChanged(windBotIDs, this);
numberOfWindBotsChangeListener.numberOfWindBotsReceivedChanged(windBotIDs, this);
}
}
private void notifyListenersAboutNumberOfWindBotsReceivedIsZero() {
for (NumberOfWindBotsChangeListener numberOfWindBotsChangeListener : numberOfWindBotsChangeListeners) {
numberOfWindBotsChangeListener.numberOfWindBotsReceivedIsZero();
}
}
@@ -126,6 +137,7 @@ public class WindBotDataRetriever implements TimeListener, WindBotDataRetrieverP
public void notifyWindBotDataRetrieverListeners(WindInfoForRaceDTO windInfoForRaceDTO) {
logger.log(Level.INFO, "Notifing WindBotDataRetrieverListener about new WindInfoForRaceDTO");
for (WindBotDataRetrieverListener windBotDataRetrieverListener : windBotDataRetrieverListeners) {
logger.log(Level.INFO, "Notifying WindBotDataRetrieverListener");
windBotDataRetrieverListener.updateWindBotUI(windInfoForRaceDTO);
}
}
@@ -143,13 +155,14 @@ public class WindBotDataRetriever implements TimeListener, WindBotDataRetrieverP
if(result != null) {
loadWindBotData(finaloldTime, finalNewTime, result);
} else {
logger.log(Level.INFO, "RegattaAndRaceIdentifier is null");
logger.log(Level.INFO, "Can´t load wind data");
notifyListenersAboutNumberOfWindBotsReceivedIsZero();
logger.log(Level.INFO, "Can´t load wind data because RegattaAndRaceIdentifier for race which takes wind is null");
}
}
@Override
public void onFailure(Throwable caught) {
notifyListenersAboutNumberOfWindBotsReceivedIsZero();
logger.log(Level.INFO, " Failed to received RegattaAndRaceIdentifier from race that takes wind fixes now");
logger.log(Level.INFO, caught.getMessage());
}
@@ -47,8 +47,7 @@ public class EventLogo extends Image {
@Override
public void onFailure(Throwable caught) {
logger.log(Level.INFO, "Failed to received EventDTO");
logger.log(Level.INFO, caught.getMessage());
logger.log(Level.INFO, "Failed to received EventDTO, "+caught.getMessage());
eventLogo.getElement().getStyle().setVisibility(Visibility.HIDDEN);
}
});
@@ -21,6 +21,8 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.dashboards.gwt.client.startanalysis.rankingtable.StartAnalysisStartRankTable;
import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.StartAnalysisDTO;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.gwt.ui.client.CompetitorColorProvider;
import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -65,7 +67,8 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star
private SailingServiceAsync sailingServiceAsync;
private StringMessages stringMessages;
private final CompetitorSelectionModel competitorSelectionModel;
private final CompetitorColorProvider colorProvider;
private final double WIND_LINE_ADVANTAGE_DIV_WIDTH_IN_PT = 185;
private final double GEOMETRIC_LINE_ADVANTAGE_DIV_WIDTH_IN_PT = 210;
private final int TABLE_MARGIN_IN_PT = 10;
@@ -78,7 +81,8 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star
stringMessages = StringMessages.INSTANCE;
resources.combinedWindPanelStyle().ensureInjected();
this.sailingServiceAsync = sailingServiceAsync;
competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */true);
colorProvider = new CompetitorColorProviderImpl();
competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */true, colorProvider);
competitorSelectionModel.setCompetitors(startAnalysisDTO.getCompetitorDTOsFromStartAnaylsisCompetitorDTOs(),
raceMap);
initWidget(uiBinder.createAndBindUi(this));
@@ -146,7 +150,7 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star
AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor();
RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingServiceAsync,
asyncActionsExecutor, null, Collections.singletonList(startAnalysisDTO.regattaAndRaceIdentifier), 5000l /* requestInterval */);
raceMap = new RaceMap(sailingServiceAsync, asyncActionsExecutor, null, timer, competitorSelectionModel,
raceMap = new RaceMap(sailingServiceAsync, asyncActionsExecutor, null, timer, competitorSelectionModel,
StringMessages.INSTANCE, false, false, false, false, startAnalysisDTO.regattaAndRaceIdentifier,
resources.combinedWindPanelStyle(), /* showHeaderPanel */ true);
raceMap.onRaceSelectionChange(Collections.singletonList(startAnalysisDTO.regattaAndRaceIdentifier));
@@ -201,8 +201,7 @@ public class StartlineAnalysisComponent extends Composite implements HasWidgets
@Override
public void onFailure(Throwable caught) {
logger.log(Level.INFO, "Failed to received startanalysis list");
logger.log(Level.INFO, caught.getMessage());
logger.log(Level.INFO, "Failed to received startanalysis list, "+caught.getMessage());
}
});
}
@@ -266,8 +265,7 @@ public class StartlineAnalysisComponent extends Composite implements HasWidgets
@Override
public void onFailure(Throwable caught) {
logger.log(Level.INFO, "Failed to received competitors for leaderboard name");
logger.log(Level.INFO, caught.getMessage());
logger.log(Level.INFO, "Failed to received competitors for leaderboard name, "+caught.getMessage());
}
});
}
@@ -86,8 +86,7 @@ public class StartlineAdvantagesByWindComponent extends Composite implements Has
@Override
public void onFailure(Throwable caught) {
logger.log(Level.INFO, "Failed to received StartlineAdvantagesWithMaxAndAverageDTO");
logger.log(Level.INFO, caught.getMessage());
logger.log(Level.INFO, "Failed to received StartlineAdvantagesWithMaxAndAverageDTO, "+caught.getMessage());
}
});
}
@@ -169,12 +169,13 @@ public class WindBotComponent extends Composite implements HasWidgets, WindBotDa
* */
@Override
public void updateWindBotUI(WindInfoForRaceDTO windInfoForRaceDTO) {
logger.log(Level.INFO, "WindBotComponent with id "+windBotId+" got notified about new WindInfoForRaceDTO");
if (windInfoForRaceDTO != null) {
WindTrackInfoDTO windTrackInfoDTO = getWindTrackInfoDTOFromAndWindBotID(windInfoForRaceDTO, windBotId);
if (windTrackInfoDTO != null) {
logger.log(Level.INFO, "WindInfoForRaceDTO contains WindTrackInfoDTO for Windbot id "+ windBotId);
if (windTrackInfoDTO.windFixes != null && windTrackInfoDTO.windFixes.size() > 0) {
if (windTrackInfoDTO.windFixes != null) {
if (windTrackInfoDTO.windFixes.size() > 0) {
logger.log(Level.INFO, "Upating UI with Wind Fixes for WindBot id "+ windBotId);
Point[] speedPoints = convertWindFixListIntoPointsArray(windTrackInfoDTO.windFixes, WindType.SPEED);
Point[] directionPoints = convertWindFixListIntoPointsArray(windTrackInfoDTO.windFixes,
@@ -192,12 +193,17 @@ public class WindBotComponent extends Composite implements HasWidgets, WindBotDa
movingAverageDirection.getAverage());
locationPointerCompass.windBotPositionChanged(windTrackInfoDTO.windFixes
.get(windTrackInfoDTO.windFixes.size() - 1).position);
} else {
logger.log(Level.INFO, "WindTrackInfoDTO.windFixes is empty");
}
} else {
logger.log(Level.INFO, "WindTrackInfoDTO.windFixes is null or empty");
logger.log(Level.INFO, "WindTrackInfoDTO.windFixes is null");
}
} else {
logger.log(Level.INFO, "WindInfoForRaceDTO does not contains WindTrackInfoDTO for Windbot id "+ windBotId);
}
} else {
logger.log(Level.INFO, "WindInfoForRaceDTO is null");
}
}
@@ -240,7 +240,7 @@ public class RibDashboardServiceImpl extends RemoteServiceServlet implements Rib
}
private Pair<Position, Position> retrieveStartlineMarkPositionsFromStartLineWayPoint(Waypoint startLineWayPoint) {
Pair<Position, Position> startLineMarkPositions = null;
Pair<Position, Position> result = null;
Iterator<Mark> markIterator = startLineWayPoint.getMarks().iterator();
if (markIterator.hasNext()) {
Mark startboat = (Mark) markIterator.next();
@@ -249,10 +249,12 @@ public class RibDashboardServiceImpl extends RemoteServiceServlet implements Rib
TimePoint now = MillisecondsTimePoint.now();
Position startBoatPosition = getPositionFromMarkAtTimePoint(runningRace, startboat, now);
Position pinEndPosition = getPositionFromMarkAtTimePoint(runningRace, pinEnd, now);
return new Pair<Position, Position>(startBoatPosition, pinEndPosition);
if(startBoatPosition != null && pinEndPosition != null) {
result = new Pair<Position, Position>(startBoatPosition, pinEndPosition);
}
}
}
return startLineMarkPositions;
return result;
}
private Position getPositionFromMarkAtTimePoint(TrackedRace trackedRace, Mark mark, TimePoint timePoint) {
@@ -254,7 +254,7 @@ public class StartlineAdvantagesCalculator extends AbstracPreCalculationDataRet
StartLineAdvantageDTO leftEdgeAdvantage = new StartLineAdvantageDTO();
leftEdgeAdvantage.confidence = 1.0;
leftEdgeAdvantage.distanceToRCBoatInMeters = rangePinEndStartlineAdvantage.getB();
if (startlineAdvantageAtPinEndInMeters > 0) {
if (startlineAdvantageAtPinEndInMeters >= 0) {
leftEdgeAdvantage.startLineAdvantage = startlineAdvantageAtPinEndInMeters;
rightEdgeAdvantage.startLineAdvantage = 0.0;
} else {
@@ -290,7 +290,7 @@ public class StartlineAdvantagesCalculator extends AbstracPreCalculationDataRet
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();
startlineAdvantage.startLineAdvantage = Math.abs((startingPositionToFirstMarkDistance.getMeters()/speed.getMetersPerSecond())*speed.getMetersPerSecond());
result.add(startlineAdvantage);
}
} else {
@@ -26,6 +26,10 @@ public abstract class AbstractLeaderboardDTO implements Serializable {
public Map<CompetitorDTO, LeaderboardRowDTO> rows;
public boolean hasCarriedPoints;
public int[] discardThresholds;
/**
* Set to the non-<code>null</code> regatta name if this DTO represents a <code>RegattaLeaderboard</code>.
*/
public String regattaName;
public String displayName;
public UUID defaultCourseAreaId;
@@ -0,0 +1,64 @@
package com.sap.sailing.domain.common.dto;
import java.io.Serializable;
import com.sap.sse.common.Color;
public class BoatDTO extends NamedDTO implements Serializable {
private static final long serialVersionUID = -4076992788294272162L;
private String sailId;
private Color color;
// for GWT
BoatDTO() {}
public BoatDTO(String name, String sailId) {
this(name, sailId, null);
}
public BoatDTO(String name, String sailId, Color color) {
super(name);
this.sailId = sailId;
this.color = color;
}
public Color getColor() {
return color;
}
public String getSailId() {
return sailId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((color == null) ? 0 : color.hashCode());
result = prime * result + ((sailId == null) ? 0 : sailId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
BoatDTO other = (BoatDTO) obj;
if (color == null) {
if (other.color != null)
return false;
} else if (!color.equals(other.color))
return false;
if (sailId == null) {
if (other.sailId != null)
return false;
} else if (!sailId.equals(other.sailId))
return false;
return true;
}
}
@@ -14,10 +14,12 @@ public interface CompetitorDTO extends Serializable, MappableToDevice {
String getCountryName();
String getSailID();
String getIdAsString();
String getSailID();
BoatDTO getBoat();
BoatClassDTO getBoatClass();
String getName();
@@ -21,9 +21,9 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
private String threeLetterIocCountryCode;
private Color color;
private String email;
private String sailID;
private String idAsString;
private BoatClassDTO boatClass;
private BoatDTO boat;
private String imageURL;
private String flagImageURL;
private Double timeOnTimeFactor;
@@ -32,17 +32,18 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
public CompetitorDTOImpl() {}
public CompetitorDTOImpl(String name, Color color, String email, String twoLetterIsoCountryCode, String threeLetterIocCountryCode,
String countryName, String sailID, String idAsString, String imageURL, String flagImageURL, BoatClassDTO boatClass, Double timeOnTimeFactor, Duration timeOnDistanceAllowancePerNauticalMile) {
String countryName, String idAsString, String imageURL, String flagImageURL,
BoatDTO boat, BoatClassDTO boatClass, Double timeOnTimeFactor, Duration timeOnDistanceAllowancePerNauticalMile) {
super(name);
this.color = color;
this.email = email;
this.twoLetterIsoCountryCode = twoLetterIsoCountryCode;
this.threeLetterIocCountryCode = threeLetterIocCountryCode;
this.countryName = countryName;
this.sailID = sailID;
this.idAsString = idAsString;
this.imageURL = imageURL;
this.flagImageURL = flagImageURL;
this.boat = boat;
this.boatClass = boatClass;
this.timeOnTimeFactor = timeOnTimeFactor;
this.timeOnDistanceAllowancePerNauticalMile = timeOnDistanceAllowancePerNauticalMile;
@@ -53,8 +54,8 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((boatClass == null) ? 0 : boatClass.hashCode());
result = prime * result + ((boat == null) ? 0 : boat.hashCode());
result = prime * result + ((idAsString == null) ? 0 : idAsString.hashCode());
result = prime * result + ((sailID == null) ? 0 : sailID.hashCode());
result = prime * result + ((color == null) ? 0 : color.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((threeLetterIocCountryCode == null) ? 0 : threeLetterIocCountryCode.hashCode());
@@ -79,16 +80,16 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
return false;
} else if (!boatClass.equals(other.boatClass))
return false;
if (boat == null) {
if (other.boat != null)
return false;
} else if (!boat.equals(other.boat))
return false;
if (idAsString == null) {
if (other.idAsString != null)
return false;
} else if (!idAsString.equals(other.idAsString))
return false;
if (sailID == null) {
if (other.sailID != null)
return false;
} else if (!sailID.equals(other.sailID))
return false;
if (threeLetterIocCountryCode == null) {
if (other.threeLetterIocCountryCode != null)
return false;
@@ -144,7 +145,7 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
@Override
public String getSailID() {
return sailID;
return boat.getSailId();
}
@Override
@@ -198,4 +199,9 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
public Duration getTimeOnDistanceAllowancePerNauticalMile() {
return timeOnDistanceAllowancePerNauticalMile;
}
@Override
public BoatDTO getBoat() {
return boat;
}
}
@@ -70,6 +70,12 @@ public class PreviousCompetitorDTOImpl implements CompetitorDTO {
" need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization");
}
@Override
public BoatDTO getBoat() {
throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+
" need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization");
}
@Override
public Color getColor() {
throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+
@@ -157,7 +157,7 @@ public class RaceColumnDTO extends NamedDTO implements Serializable {
public boolean isLive(FleetDTO fleet, long serverTimePointAsMillis) {
boolean result = false;
final RaceDTO raceDTO = racesPerFleet.get(fleet);
if(raceDTO != null) {
if (raceDTO != null) {
result = raceDTO.isLive(serverTimePointAsMillis);
}
return result;
@@ -169,7 +169,7 @@ public class RaceColumnDTO extends NamedDTO implements Serializable {
public boolean hasLiveRaces(long serverTimePointAsMillis) {
boolean result = false;
for(FleetDTO fleet: fleets) {
for (FleetDTO fleet: fleets) {
result |= isLive(fleet, serverTimePointAsMillis);
}
return result;
@@ -29,6 +29,7 @@ import com.sap.sailing.domain.abstractlog.impl.AllEventsOfTypeFinder;
import com.sap.sailing.domain.abstractlog.impl.LastEventOfTypeFinder;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastPublishedCourseDesignFinder;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseDesignChangedEventImpl;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent;
@@ -42,6 +43,8 @@ import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDeviceMarkMa
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor;
import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl;
import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogRegisterCompetitorEventImpl;
import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer;
@@ -275,21 +278,25 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter {
@Override
public void pingMark(RaceLog raceLog, Mark mark, GPSFix gpsFix, RacingEventService service) {
DeviceMarkMappingEventFactory<RaceLogEventVisitor, RaceLogEvent> raceLogEventFactory =
(DeviceIdentifier dev, TimePoint timePoint) -> new RaceLogDeviceMarkMappingEventImpl(timePoint, service
.getServerAuthor(), raceLog.getCurrentPassId(), mark, dev, timePoint, timePoint);
pingMark(
raceLog,
mark,
gpsFix,
service,
(DeviceIdentifier dev, TimePoint timePoint) -> new RaceLogDeviceMarkMappingEventImpl(timePoint, service
.getServerAuthor(), raceLog.getCurrentPassId(), mark, dev, timePoint, timePoint),
raceLogEventFactory,
new PingDeviceIdentifierImpl());
}
@Override
public void pingMark(RegattaLog regattaLog, Mark mark, GPSFix gpsFix, RacingEventService service) {
pingMark(regattaLog, mark, gpsFix, service,
DeviceMarkMappingEventFactory<RegattaLogEventVisitor, RegattaLogEvent> regattaLogEventFactory =
(DeviceIdentifier dev, TimePoint timePoint) -> new RegattaLogDeviceMarkMappingEventImpl(timePoint,
timePoint, service.getServerAuthor(), UUID.randomUUID(), mark, dev, timePoint, timePoint),
timePoint, service.getServerAuthor(), UUID.randomUUID(), mark, dev, timePoint, timePoint);
pingMark(regattaLog, mark, gpsFix, service,
regattaLogEventFactory,
new PingDeviceIdentifierImpl());
}
@@ -1,5 +1,6 @@
package com.sap.sailing.domain.base;
import com.sap.sse.common.Color;
import com.sap.sse.common.Named;
import com.sap.sse.datamining.annotations.Dimension;
@@ -8,4 +9,6 @@ public interface Boat extends Named {
@Dimension(messageKey="SailID")
String getSailID();
Color getColor();
}
@@ -7,6 +7,7 @@ import java.util.Set;
import com.sap.sailing.domain.base.BoatChangeListener;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sse.common.Color;
import com.sap.sse.common.Util;
import com.sap.sse.common.impl.NamedImpl;
@@ -14,12 +15,18 @@ public class BoatImpl extends NamedImpl implements DynamicBoat {
private static final long serialVersionUID = 3489730487528955788L;
private final BoatClass boatClass;
private String sailID;
private final Color color;
private transient Set<BoatChangeListener> listeners;
public BoatImpl(String name, BoatClass boatClass, String sailID) {
this(name, boatClass, sailID, null);
}
public BoatImpl(String name, BoatClass boatClass, String sailID, Color color) {
super(name);
this.boatClass = boatClass;
this.sailID = sailID;
this.color = color;
this.listeners = new HashSet<BoatChangeListener>();
}
@@ -38,6 +45,11 @@ public class BoatImpl extends NamedImpl implements DynamicBoat {
return sailID;
}
@Override
public Color getColor() {
return color;
}
@Override
public void setSailId(String newSailId) {
final String oldSailId = this.sailID;
@@ -18,6 +18,7 @@ import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.common.dto.BoatClassDTO;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTOImpl;
import com.sap.sse.common.Color;
@@ -243,9 +244,10 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
competitorDTO = new CompetitorDTOImpl(c.getName(), c.getColor(), c.getEmail(), countryCode == null ? ""
: countryCode.getTwoLetterISOCode(), countryCode == null ? ""
: countryCode.getThreeLetterIOCCode(), countryCode == null ? "" : countryCode.getName(),
c.getBoat().getSailID(), c.getId().toString(),
c.getId().toString(),
c.getTeam().getImage() == null ? null : c.getTeam().getImage().toString(),
c.getFlagImage() == null ? null : c.getFlagImage().toString(),
new BoatDTO(c.getBoat().getName(), c.getBoat().getSailID(), c.getBoat().getColor()),
new BoatClassDTO(c.getBoat().getBoatClass()
.getName(), c.getBoat().getBoatClass().getDisplayName(), c.getBoat().getBoatClass().getHullLength().getMeters()),
c.getTimeOnTimeFactor(), c.getTimeOnDistanceAllowancePerNauticalMile());
@@ -2,6 +2,7 @@ package com.sap.sailing.domain.swisstimingadapter.impl;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -196,7 +197,7 @@ public class DomainFactoryImpl implements DomainFactory {
Iterable<Competitor> competitors = createCompetitorList(startList, race.getRaceID(), race.getBoatClass());
logger.info("Creating RaceDefinitionImpl for race "+race.getRaceID());
BoatClass boatClass = race.getBoatClass() != null ? race.getBoatClass() : getRaceTypeFromRaceID(race.getRaceID()).getBoatClass();
RaceDefinition result = new RaceDefinitionImpl(race.getRaceName(), domainCourse, boatClass, competitors, race.getRaceID());
RaceDefinition result = new RaceDefinitionImpl(race.getRaceName(), domainCourse, boatClass, competitors, /* competitorsAndTheirBoats */ Collections.emptyMap(), race.getRaceID());
regatta.addRace(result);
return result;
}
@@ -24,6 +24,7 @@ import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.common.dto.BoatClassDTO;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTOImpl;
import com.sap.sailing.domain.common.dto.FleetDTO;
@@ -232,8 +233,8 @@ public class LeaderboardDTODiffingTest {
@Test
public void testCompetitorListChange() {
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
/* imageURL */ null, /* flagImageURL */ null, new BoatClassDTO("505", 5.05), /* timeOnTimeFactor */ null,
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "912p09871203987",
/* imageURL */ null, /* flagImageURL */ null, new BoatDTO("LSC", "GER 1234"), new BoatClassDTO("505", 5.05), /* timeOnTimeFactor */ null,
/* timeOnDistanceAllowancePerNauticalMile */ null);
newVersion.competitors.add(13, somebodyNew); // insert a competitor; this should mess up all others' indexes; check if this works
CompetitorDTO wolfgang = getPreviousCompetitorByName("HUNGER +JESS");
@@ -253,8 +254,8 @@ public class LeaderboardDTODiffingTest {
Util.addAll(newVersion.getSuppressedCompetitors(), newSuppressedCompetitors);
newVersion.setSuppressedCompetitors(newSuppressedCompetitors);
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
/* imageURL */ null, /* flagImageURL */ null, new BoatClassDTO("505", 5.05), /* timeOnTimeFactor */ null,
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "912p09871203987",
/* imageURL */ null, /* flagImageURL */ null, new BoatDTO("LSC", "GER 1234"), new BoatClassDTO("505", 5.05), /* timeOnTimeFactor */ null,
/* timeOnDistanceAllowancePerNauticalMile */ null);
newVersion.setSuppressed(newVersion.competitors.get(13), true); // suppress an existing competitor; compaction should reduce this to a single number only
newVersion.setSuppressed(somebodyNew, true); // check that mixed mode with existing and new competitors works as well
@@ -276,8 +277,8 @@ public class LeaderboardDTODiffingTest {
@Test
public void testDisplayNameChange() {
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
/* imageURL */ null, /* flagImageURL */ null, new BoatClassDTO("505", 5.05), /* timeOnTimeFactor */ null,
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "912p09871203987",
/* imageURL */ null, /* flagImageURL */ null, new BoatDTO("LSC", "GER 1234"), new BoatClassDTO("505", 5.05), /* timeOnTimeFactor */ null,
/* timeOnDistanceAllowancePerNauticalMile */ null);
newVersion.competitors.add(somebodyNew);
newVersion.competitorDisplayNames = new HashMap<CompetitorDTO, String>(newVersion.competitorDisplayNames);
@@ -306,8 +307,8 @@ public class LeaderboardDTODiffingTest {
List<CompetitorDTO> newOrdering = new ArrayList<CompetitorDTO>(newVersion.getCompetitorsFromBestToWorst(r9));
newVersion.setCompetitorsFromBestToWorst(r9, newOrdering);
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
/* imageURL */ null, /* flagImageURL */ null, new BoatClassDTO("505", 5.05), /* timeOnTimeFactor */ null,
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "912p09871203987",
/* imageURL */ null, /* flagImageURL */ null, new BoatDTO("LSC", "GER 1234"), new BoatClassDTO("505", 5.05), /* timeOnTimeFactor */ null,
/* timeOnDistanceAllowancePerNauticalMile */ null);
newVersion.competitors.add(somebodyNew);
newOrdering.add(somebodyNew);
@@ -165,7 +165,7 @@ public abstract class AbstractTracTracLiveTest extends StoredTrackBasedTest {
}
public static URI getCourseDesignUpdateURI() throws URISyntaxException {
return new URI("http://tracms.traclive.dk/update_course");
return new URI("http://" + TracTracConnectionConstants.HOST_NAME + "/update_course");
}
public static String getTracTracUsername() {
@@ -0,0 +1,71 @@
package com.sap.sailing.domain.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.tractracadapter.impl.DomainFactoryImpl;
public class DomainFactoryImplTest {
private DomainFactoryImpl domainFactory;
@Before
public void setUp() {
domainFactory = new DomainFactoryImpl(DomainFactory.INSTANCE);
}
@Test
public void testGetDominantBoatClass_TestNullCollection() {
Assert.assertEquals(null, domainFactory.getDominantBoatClass(null));
}
@Test
public void testGetDominantBoatClass_TestEmptyCollection() {
List<String> emptyList = new ArrayList<>();
Assert.assertEquals(null, domainFactory.getDominantBoatClass(emptyList));
}
@Test
public void testGetDominantBoatClass_TestWithOneObject() {
List<String> list = new ArrayList<>();
list.add("LSR");
Assert.assertEquals("Laser Int.", domainFactory.getDominantBoatClass(list).getDisplayName());
}
@Test
public void testGetDominantBoatClass_TestWithTheSameCount() {
List<String> list = new ArrayList<>();
list.add("LSR");
list.add("18.Footer");
String result = domainFactory.getDominantBoatClass(list).getDisplayName();
if(!(result == "Laser Int." || result == "18Footer")) {
Assert.assertEquals("Laser Int.", result);
}
}
@Test
public void testGetDominantBoatClass_TestWithMoreThanOneObject() {
List<String> list = new ArrayList<>();
list.add("LSR");
list.add("18.Footer");
list.add("LSR");
String result = domainFactory.getDominantBoatClass(list).getDisplayName();
Assert.assertEquals("Laser Int.", result);
}
@Test
public void testGetDominantBoatClass_TestWithSynonymNames() {
List<String> list = new ArrayList<>();
list.add("LSR");
list.add("18.Footer");
list.add("18.Footer");
list.add("Laser Int.");
list.add("Laser");
String result = domainFactory.getDominantBoatClass(list).getDisplayName();
Assert.assertEquals("Laser Int.", result);
}
}
@@ -5,6 +5,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course;
@@ -75,6 +76,11 @@ public class MockedTrackedRaceWithFixedRank extends MockedTrackedRace {
return null;
}
}
@Override
public Boat getBoatOfCompetitorById(Serializable competitorID) {
return null;
}
}
@Override
@@ -4,6 +4,7 @@ import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course;
@@ -50,6 +51,10 @@ public class MockedTrackedRaceWithFixedRankAndManyCompetitors extends MockedTrac
public Serializable getId() {
return null;
}
@Override
public Boat getBoatOfCompetitorById(Serializable competitorID) {
return null;
}
};
}
@@ -9,10 +9,13 @@ import java.net.URISyntaxException;
import java.net.URL;
import java.text.ParseException;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Nationality;
@@ -41,13 +44,14 @@ import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.domain.tractracadapter.impl.DomainFactoryImpl;
import com.sap.sailing.domain.tractracadapter.impl.RaceCourseReceiver;
import com.sap.sailing.domain.tractracadapter.impl.Simulator;
import com.tractrac.model.lib.api.data.IPosition;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.tractrac.model.lib.api.data.IPosition;
import com.tractrac.model.lib.api.event.CreateModelException;
import com.tractrac.model.lib.api.event.ICompetitor;
import com.tractrac.model.lib.api.event.IEvent;
import com.tractrac.model.lib.api.event.IRace;
import com.tractrac.model.lib.impl.event.Race;
import com.tractrac.subscription.lib.api.IEventSubscriber;
import com.tractrac.subscription.lib.api.IRaceSubscriber;
import com.tractrac.subscription.lib.api.SubscriberInitializationException;
@@ -199,7 +203,7 @@ public interface DomainFactory {
* @param raceLogResolver TODO
*/
DynamicTrackedRace getOrCreateRaceDefinitionAndTrackedRace(DynamicTrackedRegatta trackedRegatta, UUID raceId,
String raceName, Iterable<com.sap.sailing.domain.base.Competitor> competitors, BoatClass boatClass,
String raceName, Iterable<com.sap.sailing.domain.base.Competitor> competitors, BoatClass boatClass, Map<Competitor, Boat> competitorBoats,
Course course, Iterable<Sideline> sidelines, WindStore windStore, long delayToLiveInMillis,
long millisecondsOverWhichToAverageWind, DynamicRaceDefinitionSet raceDefinitionSetToUpdate,
URI courseDesignUpdateURI, UUID tracTracEventUuid, String tracTracUsername, String tracTracPassword, boolean ignoreTracTracMarkPassings, RaceLogResolver raceLogResolver);
@@ -254,6 +258,8 @@ public interface DomainFactory {
*/
RaceDefinition getAndWaitForRaceDefinition(UUID raceId, long timeoutInMilliseconds);
Map<Competitor, Boat> getBoatsInfoForCompetitors(IRace race, BoatClass defaultBoatClass);
Util.Pair<Iterable<com.sap.sailing.domain.base.Competitor>, BoatClass> getCompetitorsAndDominantBoatClass(IRace race);
RaceTrackingConnectivityParameters createTrackingConnectivityParameters(URL paramURL, URI liveURI, URI storedURI,
@@ -280,7 +286,7 @@ public interface DomainFactory {
MetadataParser getMetadataParser();
BoatClass getDominantBoatClass(List<String> competitorClassNames);
BoatClass getDominantBoatClass(Iterable<String> competitorClassNames);
List<Sideline> createSidelines(String raceMetadataString, Iterable<? extends TracTracControlPoint> allEventControlPoints);
@@ -7,6 +7,8 @@ import com.sap.sailing.domain.common.MarkType;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.domain.tractracadapter.impl.RaceCourseReceiver;
import com.sap.sse.common.Named;
import com.sap.sse.common.Util;
import com.tractrac.model.lib.api.event.IRaceCompetitor;
/**
* TracTrac objects can be augmented by what TracTrac calls a "DataSheet." These optional data sheets can provide
@@ -53,4 +55,10 @@ public interface MetadataParser {
Map<String, Iterable<TracTracControlPoint>> parseSidelinesFromRaceMetadata(String raceMetadataString,
Iterable<? extends TracTracControlPoint> controlPoints);
/**
* Parses the boat name, boad id and the boat color for a competitor (entry) of a race.
* @param competitor
* @return a Triple containing the boat name, boat id and boat color or null if no metadata is availalble
*/
Util.Triple<String, String, String> parseCompetitorBoat(IRaceCompetitor competitor);
}
@@ -21,6 +21,7 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore;
@@ -78,6 +79,7 @@ import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.impl.RGBColor;
import com.sap.sse.util.WeakIdentityHashMap;
import com.tractrac.model.lib.api.data.IPosition;
import com.tractrac.model.lib.api.event.CreateModelException;
@@ -503,7 +505,7 @@ public class DomainFactoryImpl implements DomainFactory {
@Override
public DynamicTrackedRace getOrCreateRaceDefinitionAndTrackedRace(DynamicTrackedRegatta trackedRegatta, UUID raceId,
String raceName, Iterable<Competitor> competitors, BoatClass boatClass, Course course,
String raceName, Iterable<Competitor> competitors, BoatClass boatClass, Map<Competitor, Boat> competitorBoats, Course course,
Iterable<Sideline> sidelines, WindStore windStore, long delayToLiveInMillis,
long millisecondsOverWhichToAverageWind, DynamicRaceDefinitionSet raceDefinitionSetToUpdate,
URI tracTracUpdateURI, UUID tracTracEventUuid, String tracTracUsername, String tracTracPassword, boolean ignoreTracTracMarkPassings, RaceLogResolver raceLogResolver) {
@@ -511,7 +513,7 @@ public class DomainFactoryImpl implements DomainFactory {
RaceDefinition raceDefinition = raceCache.get(raceId);
if (raceDefinition == null) {
logger.info("Creating RaceDefinitionImpl for race "+raceName);
raceDefinition = new RaceDefinitionImpl(raceName, course, boatClass, competitors, raceId);
raceDefinition = new RaceDefinitionImpl(raceName, course, boatClass, competitors, competitorBoats, raceId);
} else {
logger.info("Already found RaceDefinitionImpl for race "+raceName);
}
@@ -566,9 +568,25 @@ public class DomainFactoryImpl implements DomainFactory {
/* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(),
raceDefinitionSetToUpdate, useMarkPassingCalculator, raceLogResolver);
}
@Override
public Map<Competitor, Boat> getBoatsInfoForCompetitors(IRace race, BoatClass defaultBoatClass) {
final Map<Competitor, Boat> competitorBoatInfos = new HashMap<>();
for (IRaceCompetitor rc : race.getRaceCompetitors()) {
Util.Triple<String, String, String> competitorBoatInfo = getMetadataParser().parseCompetitorBoat(rc);
Competitor existingCompetitor = getOrCreateCompetitor(rc.getCompetitor());
if (existingCompetitor != null && competitorBoatInfo != null) {
Boat boatOfCompetitor = new BoatImpl(competitorBoatInfo.getA(), defaultBoatClass,
competitorBoatInfo.getB(), new RGBColor(competitorBoatInfo.getC()));
competitorBoatInfos.put(existingCompetitor, boatOfCompetitor);
}
}
return competitorBoatInfos;
}
@Override
public com.sap.sse.common.Util.Pair<Iterable<Competitor>, BoatClass> getCompetitorsAndDominantBoatClass(IRace race) {
public Util.Pair<Iterable<Competitor>, BoatClass> getCompetitorsAndDominantBoatClass(IRace race) {
List<ICompetitorClass> competitorClasses = new ArrayList<ICompetitorClass>();
final List<Competitor> competitors = new ArrayList<Competitor>();
for (IRaceCompetitor rc : race.getRaceCompetitors()) {
@@ -578,7 +596,7 @@ public class DomainFactoryImpl implements DomainFactory {
competitorClasses.add(rc.getCompetitor().getCompetitorClass());
}
BoatClass dominantBoatClass = getDominantBoatClass(competitorClasses);
com.sap.sse.common.Util.Pair<Iterable<Competitor>, BoatClass> competitorsAndDominantBoatClass = new com.sap.sse.common.Util.Pair<Iterable<Competitor>, BoatClass>(
Util.Pair<Iterable<Competitor>, BoatClass> competitorsAndDominantBoatClass = new com.sap.sse.common.Util.Pair<Iterable<Competitor>, BoatClass>(
competitors, dominantBoatClass);
return competitorsAndDominantBoatClass;
}
@@ -593,24 +611,19 @@ public class DomainFactoryImpl implements DomainFactory {
}
@Override
public BoatClass getDominantBoatClass(List<String> competitorClassNames) {
Map<BoatClass, Integer> countsPerBoatClass = new HashMap<BoatClass, Integer>();
BoatClass dominantBoatClass = null;
int numberOfCompetitorsInDominantBoatClass = 0;
for (String competitorClassName : competitorClassNames) {
BoatClass boatClass = getOrCreateBoatClass(competitorClassName);
Integer boatClassCount = countsPerBoatClass.get(boatClass);
if (boatClassCount == null) {
boatClassCount = 0;
}
boatClassCount = boatClassCount + 1;
countsPerBoatClass.put(boatClass, boatClassCount);
if (boatClassCount > numberOfCompetitorsInDominantBoatClass) {
numberOfCompetitorsInDominantBoatClass = boatClassCount;
dominantBoatClass = boatClass;
public BoatClass getDominantBoatClass(Iterable<String> competitorClassNames) {
if (competitorClassNames == null) {
return null;
} else {
Collection<BoatClass> boatClasses = new ArrayList<>();
for (String competitorClassName : competitorClassNames) {
BoatClass boatClass = getOrCreateBoatClass(competitorClassName);
boatClasses.add(boatClass);
}
return Util.getDominantObject(boatClasses);
}
return dominantBoatClass;
}
@Override
@@ -19,6 +19,7 @@ import com.sap.sailing.domain.tractracadapter.MetadataParser;
import com.sap.sailing.domain.tractracadapter.TracTracControlPoint;
import com.sap.sse.common.Util;
import com.sap.sse.common.impl.NamedImpl;
import com.tractrac.model.lib.api.event.IRaceCompetitor;
/**
* TracTrac objects can be augmented by what TracTrac calls a "DataSheet." These optional data sheets can provide
@@ -204,5 +205,29 @@ public class MetadataParserImpl implements MetadataParser {
}
return result;
}
@Override
public Util.Triple<String, String, String> parseCompetitorBoat(IRaceCompetitor competitor) {
Util.Triple<String, String, String> result = null;
String parsedBoatName = null;
String parsedBoatId = null;
String parsedColor = null;
String raceCompetitorMetadataString = competitor.getMetadata() != null ? competitor.getMetadata().getText() : null;
if (raceCompetitorMetadataString != null) {
Map<String, String> competitorMetadata = parseMetadata(raceCompetitorMetadataString);
for (Entry<String, String> entry : competitorMetadata.entrySet()) {
if (entry.getKey().startsWith("boatName")) {
parsedBoatName = entry.getValue();
} else if (entry.getKey().startsWith("boatId")) {
parsedBoatId = entry.getValue();
} else if (entry.getKey().startsWith("boatColor")) {
parsedColor = entry.getValue();
}
}
if (parsedBoatName != null && parsedBoatId != null && parsedColor != null) {
result = new Util.Triple<String, String, String>(parsedBoatName, parsedBoatId, parsedColor);
}
}
return result;
}
}
@@ -9,6 +9,7 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
@@ -156,9 +157,10 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<IControlRoute,
logger.log(Level.INFO, "Received course for non-existing race "+tractracRace.getName()+". Creating RaceDefinition.");
// create race definition and add to event
com.sap.sse.common.Util.Pair<Iterable<Competitor>, BoatClass> competitorsAndDominantBoatClass = getDomainFactory().getCompetitorsAndDominantBoatClass(tractracRace);
Map<Competitor, Boat> competitorBoats = getDomainFactory().getBoatsInfoForCompetitors(tractracRace, competitorsAndDominantBoatClass.getB());
trackedRace = getDomainFactory().getOrCreateRaceDefinitionAndTrackedRace(
getTrackedRegatta(), tractracRace.getId(), tractracRace.getName(), competitorsAndDominantBoatClass.getA(),
competitorsAndDominantBoatClass.getB(), course, sidelines, windStore, delayToLiveInMillis,
competitorsAndDominantBoatClass.getB(), competitorBoats, course, sidelines, windStore, delayToLiveInMillis,
millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate, tracTracUpdateURI,
getTracTracEvent().getId(), tracTracUsername, tracTracPassword, useInternalMarkPassingAlgorithm, raceLogResolver);
needToUpdateRaceTimes = true;
@@ -25,4 +25,10 @@ public interface RaceDefinition extends Named, WithID {
Iterable<Competitor> getCompetitors();
Competitor getCompetitorById(Serializable competitorID);
/**
* Gets the boat used by the competitor for this race.
*/
Boat getBoatOfCompetitorById(Serializable competitorID);
}
@@ -1,257 +1,257 @@
package com.sap.sailing.domain.base.impl;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.racelog.impl.RaceLogIdentifierImpl;
import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.Util;
public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implements RaceColumn {
private static final long serialVersionUID = -7801617988982540470L;
private static final Logger logger = Logger.getLogger(AbstractRaceColumn.class.getName());
private TrackedRaces trackedRaces;
private Map<Fleet, RaceIdentifier> raceIdentifiers;
private Map<Fleet, RaceLog> raceLogs;
private transient RaceLogStore raceLogStore;
private RegattaLikeIdentifier regattaLikeParent;
public AbstractRaceColumn() {
this.trackedRaces = new TrackedRaces();
this.raceIdentifiers = new HashMap<Fleet, RaceIdentifier>();
this.raceLogs = new HashMap<Fleet, RaceLog>();
}
@Override
public synchronized void setRaceLogInformation(RaceLogStore raceLogStore, RegattaLikeIdentifier regattaLikeParent) {
this.raceLogStore = raceLogStore;
this.regattaLikeParent = regattaLikeParent;
for (final Fleet fleet : getFleets()) {
reloadRaceLog(fleet);
}
}
@Override
public RaceLog getRaceLog(Fleet fleet) {
synchronized (raceLogs) {
return raceLogs.get(fleet);
}
}
@Override
public RaceLogIdentifier getRaceLogIdentifier(Fleet fleet) {
return new RaceLogIdentifierImpl(regattaLikeParent, getName(), fleet);
}
@Override
public TrackedRace getTrackedRace(Fleet fleet) {
return trackedRaces.get(fleet);
}
@Override
public void setTrackedRace(Fleet fleet, TrackedRace trackedRace) {
TrackedRace previouslyLinkedRace = this.trackedRaces.get(fleet);
if (trackedRace != previouslyLinkedRace) {
releaseTrackedRace(fleet);
synchronized (this) {
if (trackedRace != null) {
this.trackedRaces.put(fleet, trackedRace);
this.setRaceIdentifier(fleet, trackedRace.getRaceIdentifier());
logger.info(String.format("Linked race column %s with tracked race %s.", this.getName(),
trackedRace.getRace() == null ? "null" : trackedRace.getRace().getName()));
}
}
if (trackedRace != null) {
final RaceLog raceLog = getRaceLog(fleet);
if (raceLog != null) {
trackedRace.attachRaceLog(raceLog);
}
trackedRace.attachRaceExecutionProvider(getRaceExecutionOrderProvider());
getRaceColumnListeners().notifyListenersAboutTrackedRaceLinked(this, fleet, trackedRace);
}
}
}
@Override
public RaceIdentifier getRaceIdentifier(Fleet fleet) {
return raceIdentifiers.get(fleet);
}
@Override
public void setRaceIdentifier(Fleet fleet, RaceIdentifier raceIdentifier) {
if (raceIdentifier != null) {
this.raceIdentifiers.put(fleet, raceIdentifier);
}
}
@Override
public synchronized void releaseTrackedRace(Fleet fleet) {
TrackedRace previouslyLinkedRace = this.trackedRaces.get(fleet);
this.trackedRaces.remove(fleet);
if (previouslyLinkedRace != null && regattaLikeParent != null) {
RaceLogIdentifier identifier = getRaceLogIdentifier(fleet);
previouslyLinkedRace.detachRaceLog(identifier.getIdentifier());
previouslyLinkedRace.detachRaceExecutionOrderProvider(getRaceExecutionOrderProvider());
getRaceColumnListeners().notifyListenersAboutTrackedRaceUnlinked(this, fleet, previouslyLinkedRace);
}
}
@Override
public void removeRaceIdentifier(Fleet fleet) {
releaseTrackedRace(fleet);
this.raceIdentifiers.remove(fleet);
}
@Override
public Fleet getFleetOfCompetitor(Competitor competitor) {
for (final Fleet fleet : getFleets()) {
if (Util.contains(getAllCompetitors(fleet), competitor)) {
return fleet;
}
}
return null;
}
@Override
public Fleet getFleetByName(String fleetName) {
for (Fleet fleet : getFleets()) {
if (fleet.getName().equals(fleetName)) {
return fleet;
}
}
return null;
}
@Override
public boolean hasTrackedRaces() {
return !trackedRaces.isEmpty();
}
@Override
public TrackedRace getTrackedRace(Competitor competitor) {
for (TrackedRace trackedRace : trackedRaces.values()) {
if (Util.contains(trackedRace.getRace().getCompetitors(), competitor)) {
return trackedRace;
}
}
return null;
}
@Override
public String toString() {
return getName();
}
@Override
public void reloadRaceLog(Fleet fleet) {
synchronized(raceLogs) {
RaceLogIdentifier identifier = getRaceLogIdentifier(fleet);
RaceLog newOrLoadedRaceLog = raceLogStore.getRaceLog(identifier, /*ignoreCache*/ true);
RaceLog raceLogAvailable = raceLogs.get(fleet);
if (raceLogAvailable == null) {
RaceColumnRaceLogReplicator listener = new RaceColumnRaceLogReplicator(this, identifier);
// FIXME Wouldn't this skip any listener notifications that a merge below would trigger if the race log already existed?
// FIXME For example, how about the race log-provided score corrections that need application to the leaderboard and replication?
newOrLoadedRaceLog.addListener(listener);
raceLogs.put(fleet, newOrLoadedRaceLog);
final TrackedRace trackedRace = getTrackedRace(fleet);
if (trackedRace != null) {
// need to attach race log
trackedRace.attachRaceLog(newOrLoadedRaceLog);
}
} else {
// now add all race log events from newOrLoadedRaceLog that are not already in raceLogAvailable
raceLogAvailable.merge(newOrLoadedRaceLog);
}
}
}
/**
* When deserializing, replication listeners are registered on all race logs.
*/
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject();
for (Entry<Fleet, RaceLog> entry : raceLogs.entrySet()) {
Fleet fleet = entry.getKey();
RaceLog raceLog = entry.getValue();
raceLog.addListener(new RaceColumnRaceLogReplicator(this, getRaceLogIdentifier(fleet)));
// now comes a little secrecy (see bug 2506) about how, after de-serialization, the connections
// between race column, race log, tracked race and the listener pumping stuff from the race log
// into the tracked race are re-established. The race log's listener structure is transient, and so
// is the tracked race's attachedRaceLogs field and the logListener field. The collections and the
// DynamicTrackedRaceLogListener are re-established after de-serialization in corresponding readObject(...)
// methods. However, the connections are not. That's what we need to do here, simply by invoking:
ois.registerValidation(() -> {
TrackedRace trackedRace = getTrackedRace(fleet);
if (trackedRace != null) {
trackedRace.attachRaceLog(raceLog);
}
}, /* prio */ 0);
// because this will add the race log to the tracked race's attachedRaceLogs collection again, and
// the new DynamicTrackedRaceLogListener that the readObject(...) method had constructed for the
// tracked race will be added as a listener to the race log whose listeners collection otherwise would
// only hold the RaceColumnRaceLogReplicator object added above.
}
}
@Override
public void setMasterDataExportOngoingThreadFlag(boolean flagValue) {
trackedRaces.setMasterDataExportOngoingThreadFlag(flagValue);
}
@Override
public Iterable<Competitor> getAllCompetitors() {
Set<Competitor> result = new HashSet<>();
for (Fleet fleet : getFleets()) {
TrackedRace trackedRace = getTrackedRace(fleet);
if (trackedRace != null) {
Util.addAll(trackedRace.getRace().getCompetitors(), result);
} else {
// if no tracked race is found, use competitors from race log; this assumes that if a tracked
// race exists, its competitors set takes precedence over what's in the race log. Usually,
// the tracked race will have the same competitors as those in the race log, or more because
// those from the regatta log are added to the tracked race as well.
Set<Competitor> viaRaceLog = new RegisteredCompetitorsAnalyzer<>(getRaceLog(fleet)).analyze();
result.addAll(viaRaceLog);
}
}
return result;
}
@Override
public Iterable<Competitor> getAllCompetitors(final Fleet fleet) {
final Iterable<Competitor> result;
TrackedRace trackedRace = getTrackedRace(fleet);
if (trackedRace != null) {
result = trackedRace.getRace().getCompetitors();
} else {
// if no tracked race is found, use competitors from race log; this assumes that if a tracked
// race exists, its competitors set takes precedence over what's in the race log. Usually,
// the tracked race will have the same competitors as those in the race log, or more because
// those from the regatta log are added to the tracked race as well.
Set<Competitor> viaRaceLog = new RegisteredCompetitorsAnalyzer<>(getRaceLog(fleet)).analyze();
result = viaRaceLog;
}
return result;
}
}
package com.sap.sailing.domain.base.impl;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.racelog.impl.RaceLogIdentifierImpl;
import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.Util;
public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implements RaceColumn {
private static final long serialVersionUID = -7801617988982540470L;
private static final Logger logger = Logger.getLogger(AbstractRaceColumn.class.getName());
private TrackedRaces trackedRaces;
private Map<Fleet, RaceIdentifier> raceIdentifiers;
private Map<Fleet, RaceLog> raceLogs;
private transient RaceLogStore raceLogStore;
private RegattaLikeIdentifier regattaLikeParent;
public AbstractRaceColumn() {
this.trackedRaces = new TrackedRaces();
this.raceIdentifiers = new HashMap<Fleet, RaceIdentifier>();
this.raceLogs = new HashMap<Fleet, RaceLog>();
}
@Override
public synchronized void setRaceLogInformation(RaceLogStore raceLogStore, RegattaLikeIdentifier regattaLikeParent) {
this.raceLogStore = raceLogStore;
this.regattaLikeParent = regattaLikeParent;
for (final Fleet fleet : getFleets()) {
reloadRaceLog(fleet);
}
}
@Override
public RaceLog getRaceLog(Fleet fleet) {
synchronized (raceLogs) {
return raceLogs.get(fleet);
}
}
@Override
public RaceLogIdentifier getRaceLogIdentifier(Fleet fleet) {
return new RaceLogIdentifierImpl(regattaLikeParent, getName(), fleet);
}
@Override
public TrackedRace getTrackedRace(Fleet fleet) {
return trackedRaces.get(fleet);
}
@Override
public void setTrackedRace(Fleet fleet, TrackedRace trackedRace) {
TrackedRace previouslyLinkedRace = this.trackedRaces.get(fleet);
if (trackedRace != previouslyLinkedRace) {
releaseTrackedRace(fleet);
synchronized (this) {
if (trackedRace != null) {
this.trackedRaces.put(fleet, trackedRace);
this.setRaceIdentifier(fleet, trackedRace.getRaceIdentifier());
logger.info(String.format("Linked race column %s with tracked race %s.", this.getName(),
trackedRace.getRace() == null ? "null" : trackedRace.getRace().getName()));
}
}
if (trackedRace != null) {
final RaceLog raceLog = getRaceLog(fleet);
if (raceLog != null) {
trackedRace.attachRaceLog(raceLog);
}
trackedRace.attachRaceExecutionProvider(getRaceExecutionOrderProvider());
getRaceColumnListeners().notifyListenersAboutTrackedRaceLinked(this, fleet, trackedRace);
}
}
}
@Override
public RaceIdentifier getRaceIdentifier(Fleet fleet) {
return raceIdentifiers.get(fleet);
}
@Override
public void setRaceIdentifier(Fleet fleet, RaceIdentifier raceIdentifier) {
if (raceIdentifier != null) {
this.raceIdentifiers.put(fleet, raceIdentifier);
}
}
@Override
public synchronized void releaseTrackedRace(Fleet fleet) {
TrackedRace previouslyLinkedRace = this.trackedRaces.get(fleet);
this.trackedRaces.remove(fleet);
if (previouslyLinkedRace != null && regattaLikeParent != null) {
RaceLogIdentifier identifier = getRaceLogIdentifier(fleet);
previouslyLinkedRace.detachRaceLog(identifier.getIdentifier());
previouslyLinkedRace.detachRaceExecutionOrderProvider(getRaceExecutionOrderProvider());
getRaceColumnListeners().notifyListenersAboutTrackedRaceUnlinked(this, fleet, previouslyLinkedRace);
}
}
@Override
public void removeRaceIdentifier(Fleet fleet) {
releaseTrackedRace(fleet);
this.raceIdentifiers.remove(fleet);
}
@Override
public Fleet getFleetOfCompetitor(Competitor competitor) {
for (final Fleet fleet : getFleets()) {
if (Util.contains(getAllCompetitors(fleet), competitor)) {
return fleet;
}
}
return null;
}
@Override
public Fleet getFleetByName(String fleetName) {
for (Fleet fleet : getFleets()) {
if (fleet.getName().equals(fleetName)) {
return fleet;
}
}
return null;
}
@Override
public boolean hasTrackedRaces() {
return !trackedRaces.isEmpty();
}
@Override
public TrackedRace getTrackedRace(Competitor competitor) {
for (TrackedRace trackedRace : trackedRaces.values()) {
if (Util.contains(trackedRace.getRace().getCompetitors(), competitor)) {
return trackedRace;
}
}
return null;
}
@Override
public String toString() {
return getName();
}
@Override
public void reloadRaceLog(Fleet fleet) {
synchronized(raceLogs) {
RaceLogIdentifier identifier = getRaceLogIdentifier(fleet);
RaceLog newOrLoadedRaceLog = raceLogStore.getRaceLog(identifier, /*ignoreCache*/ true);
RaceLog raceLogAvailable = raceLogs.get(fleet);
if (raceLogAvailable == null) {
RaceColumnRaceLogReplicator listener = new RaceColumnRaceLogReplicator(this, identifier);
// FIXME Wouldn't this skip any listener notifications that a merge below would trigger if the race log already existed?
// FIXME For example, how about the race log-provided score corrections that need application to the leaderboard and replication?
newOrLoadedRaceLog.addListener(listener);
raceLogs.put(fleet, newOrLoadedRaceLog);
final TrackedRace trackedRace = getTrackedRace(fleet);
if (trackedRace != null) {
// need to attach race log
trackedRace.attachRaceLog(newOrLoadedRaceLog);
}
} else {
// now add all race log events from newOrLoadedRaceLog that are not already in raceLogAvailable
raceLogAvailable.merge(newOrLoadedRaceLog);
}
}
}
/**
* When deserializing, replication listeners are registered on all race logs.
*/
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject();
for (Entry<Fleet, RaceLog> entry : raceLogs.entrySet()) {
Fleet fleet = entry.getKey();
RaceLog raceLog = entry.getValue();
raceLog.addListener(new RaceColumnRaceLogReplicator(this, getRaceLogIdentifier(fleet)));
// now comes a little secrecy (see bug 2506) about how, after de-serialization, the connections
// between race column, race log, tracked race and the listener pumping stuff from the race log
// into the tracked race are re-established. The race log's listener structure is transient, and so
// is the tracked race's attachedRaceLogs field and the logListener field. The collections and the
// DynamicTrackedRaceLogListener are re-established after de-serialization in corresponding readObject(...)
// methods. However, the connections are not. That's what we need to do here, simply by invoking:
ois.registerValidation(() -> {
TrackedRace trackedRace = getTrackedRace(fleet);
if (trackedRace != null) {
trackedRace.attachRaceLog(raceLog);
}
}, /* prio */ 0);
// because this will add the race log to the tracked race's attachedRaceLogs collection again, and
// the new DynamicTrackedRaceLogListener that the readObject(...) method had constructed for the
// tracked race will be added as a listener to the race log whose listeners collection otherwise would
// only hold the RaceColumnRaceLogReplicator object added above.
}
}
@Override
public void setMasterDataExportOngoingThreadFlag(boolean flagValue) {
trackedRaces.setMasterDataExportOngoingThreadFlag(flagValue);
}
@Override
public Iterable<Competitor> getAllCompetitors() {
final Set<Competitor> result = new HashSet<>();
for (Fleet fleet : getFleets()) {
TrackedRace trackedRace = getTrackedRace(fleet);
if (trackedRace != null) {
Util.addAll(trackedRace.getRace().getCompetitors(), result);
} else {
// if no tracked race is found, use competitors from race log; this assumes that if a tracked
// race exists, its competitors set takes precedence over what's in the race log. Usually,
// the tracked race will have the same competitors as those in the race log, or more because
// those from the regatta log are added to the tracked race as well.
Set<Competitor> viaRaceLog = new RegisteredCompetitorsAnalyzer<>(getRaceLog(fleet)).analyze();
result.addAll(viaRaceLog);
}
}
return result;
}
@Override
public Iterable<Competitor> getAllCompetitors(final Fleet fleet) {
final Iterable<Competitor> result;
final TrackedRace trackedRace = getTrackedRace(fleet);
if (trackedRace != null) {
result = trackedRace.getRace().getCompetitors();
} else {
// if no tracked race is found, use competitors from race log; this assumes that if a tracked
// race exists, its competitors set takes precedence over what's in the race log. Usually,
// the tracked race will have the same competitors as those in the race log, or more because
// those from the regatta log are added to the tracked race as well.
Set<Competitor> viaRaceLog = new RegisteredCompetitorsAnalyzer<>(getRaceLog(fleet)).analyze();
result = viaRaceLog;
}
return result;
}
}
@@ -2,10 +2,15 @@ package com.sap.sailing.domain.base.impl;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Logger;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course;
@@ -13,23 +18,37 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sse.common.impl.NamedImpl;
public class RaceDefinitionImpl extends NamedImpl implements RaceDefinition {
private static final Logger logger = Logger.getLogger(RaceDefinitionImpl.class.getName());
private static final long serialVersionUID = -1900955198751393727L;
private final Course course;
private final LinkedHashMap<Serializable, Competitor> competitorsById;
private final Set<Competitor> competitors;
private final Map<Serializable, Boat> competitorBoats;
private final BoatClass boatClass;
private final Serializable id;
public RaceDefinitionImpl(String name, Course course, BoatClass boatClass, Iterable<? extends Competitor> competitors) {
this(name, course, boatClass, competitors, /* use name as default ID */ name);
this(name, course, boatClass, competitors, Collections.emptyMap());
}
public RaceDefinitionImpl(String name, Course course, BoatClass boatClass, Iterable<? extends Competitor> competitors,
Map<Competitor, Boat> competitorsAndTheirBoats) {
this(name, course, boatClass, competitors, competitorsAndTheirBoats, /* use name as default ID */ name);
}
public RaceDefinitionImpl(String name, Course course, BoatClass boatClass, Iterable<? extends Competitor> competitors, Serializable id) {
this(name, course, boatClass, competitors, /* per-race boats for competitors */ Collections.emptyMap(), id);
}
public RaceDefinitionImpl(String name, Course course, BoatClass boatClass, Iterable<? extends Competitor> competitors,
Map<Competitor, Boat> competitorsAndTheirBoats, Serializable id) {
super(name);
assert name != null;
this.course = course;
this.competitors = new HashSet<>();
this.competitorsById = new LinkedHashMap<>();
this.competitorBoats = new HashMap<>();
for (Competitor competitor : competitors) {
Competitor competitorWithEqualID = competitorsById.put(competitor.getId(), competitor);
this.competitors.add(competitor);
@@ -37,6 +56,15 @@ public class RaceDefinitionImpl extends NamedImpl implements RaceDefinition {
throw new IllegalArgumentException("Two distinct competitors with equal ID "+competitor.getId()+" are not allowed within the single race "+name);
}
}
for (Entry<Competitor, Boat> competitorAndBoat : competitorsAndTheirBoats.entrySet()) {
Competitor competitor = competitorsById.get(competitorAndBoat.getKey().getId()); // only assign boat if competitor is part of race
if (competitor != null && competitorAndBoat.getValue() != null) {
competitorBoats.put(competitor.getId(), competitorAndBoat.getValue());
} else {
logger.warning("Trying to set boat "+competitorAndBoat.getValue()+" for competitor "+competitorAndBoat.getKey()+
" which is not part of race "+getName()+"'s set of competitors");
}
}
this.boatClass = boatClass;
this.id = id;
}
@@ -66,4 +94,8 @@ public class RaceDefinitionImpl extends NamedImpl implements RaceDefinition {
return boatClass;
}
@Override
public Boat getBoatOfCompetitorById(Serializable competitorID) {
return competitorBoats.get(competitorID);
}
}
@@ -877,5 +877,4 @@ public interface TrackedRace extends Serializable, IsManagedByCache<SharedDomain
default Iterable<Mark> getMarksFromRaceAndLogs() {
return getMarks();
}
}
@@ -113,5 +113,4 @@ public abstract class AbstractRaceChangeListener implements RaceChangeListener {
public void waypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
defaultAction();
}
}
@@ -678,7 +678,7 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
final boolean result;
if (takesWindFixWithTimePoint(wind.getTimePoint())) {
result = getOrCreateWindTrack(windSource).add(wind);
updated(/* time point */null); // wind events shouldn't advance race time
updated(wind.getTimePoint());
triggerManeuverCacheRecalculationForAllCompetitors();
notifyListeners(wind, windSource);
} else {
@@ -826,5 +826,4 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
public DynamicGPSFixTrack<Mark, GPSFix> getTrack(Mark mark) {
return (DynamicGPSFixTrack<Mark, GPSFix>) super.getTrack(mark);
}
}
@@ -963,32 +963,32 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
@Override
public boolean isLive(TimePoint at) {
final Date startOfLivePeriod;
final Date endOfLivePeriod;
final TimePoint startOfLivePeriod;
final TimePoint endOfLivePeriod;
if (!hasGPSData() || !hasWindData()) {
startOfLivePeriod = null;
endOfLivePeriod = null;
} else {
if (getStartOfRace() == null) {
startOfLivePeriod = getStartOfTracking().asDate();
startOfLivePeriod = getStartOfTracking();
} else {
startOfLivePeriod = new Date(getStartOfRace().asMillis() - TimingConstants.PRE_START_PHASE_DURATION_IN_MILLIS);
startOfLivePeriod = getStartOfRace().minus(TimingConstants.PRE_START_PHASE_DURATION_IN_MILLIS);
}
if (getEndOfRace() == null) {
if (getTimePointOfNewestEvent() != null) {
endOfLivePeriod = new Date(getTimePointOfNewestEvent().asMillis()
+ TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS);
endOfLivePeriod = getTimePointOfNewestEvent().plus(
TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS);
} else {
endOfLivePeriod = null;
}
} else {
endOfLivePeriod = new Date(getEndOfRace().asMillis() + TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS);
endOfLivePeriod = getEndOfRace().plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS);
}
}
// if an empty timepoint is given then take the start of the race
if (at == null) {
at = new MillisecondsTimePoint(startOfLivePeriod.getTime()+1);
at = startOfLivePeriod.plus(1);
}
// whenLastTrackedRaceWasLive is null if there is no tracked race for fleet, or the tracked race hasn't started yet at the server time
@@ -996,8 +996,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
final boolean result =
startOfLivePeriod != null &&
endOfLivePeriod != null &&
startOfLivePeriod.getTime() <= at.asMillis() &&
at.asMillis() <= endOfLivePeriod.getTime();
!startOfLivePeriod.after(at) &&
!at.after(endOfLivePeriod);
return result;
}
@@ -0,0 +1,274 @@
package com.sap.sailing.gwt.home.shared.dispatch;
import java.net.URL;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import junit.framework.Assert;
import org.junit.Test;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.gwt.dispatch.client.Action;
import com.sap.sailing.gwt.dispatch.client.DispatchAsync;
import com.sap.sailing.gwt.dispatch.client.DispatchContext;
import com.sap.sailing.gwt.dispatch.client.Result;
import com.sap.sailing.gwt.dispatch.client.caching.CachingDispatch;
import com.sap.sailing.gwt.dispatch.client.caching.HasClientCacheTotalTimeToLive;
import com.sap.sailing.gwt.dispatch.client.caching.IsClientCacheable;
import com.sap.sailing.gwt.dispatch.client.exceptions.DispatchException;
public class CacheDispatchTest {
private CachingDispatch<DispatchContextMock> cd = new CachingDispatch<DispatchContextMock>(new DispatchMock(),
false, 200);
@Test
public void testCacheCleanup() {
final ResultHolder holder = new ResultHolder();
checkIfCached(holder, new SomeDefaultCacheAction(), 20);
checkIfCached(holder, new SomeDefaultCacheAction(), 20);
checkIfCached(holder, new SomeDefaultCacheAction(), 20);
Assert.assertEquals("One element in cache", 3, cd.ttlItemsInCache());
wait(210);
cd.cleanupExpiredItems();
Assert.assertEquals("No element in cache", 0, cd.ttlItemsInCache());
}
@Test
public void testNoCache() {
final ResultHolder holder = new ResultHolder();
SomeNoCacheAction action = new SomeNoCacheAction();
cd.execute(action, new SimpleCallback<SomeResult>() {
@Override
public void onSuccess(SomeResult result) {
holder.value = result;
}
});
wait(100);
cd.execute(action, new SimpleCallback<SomeResult>() {
@Override
public void onSuccess(SomeResult result) {
Assert.assertNotSame("Not caching, should not be same", holder.value, result);
}
});
}
@Test
public void testDefaultCache() {
ResultHolder holder = new ResultHolder();
SomeDefaultCacheAction action = new SomeDefaultCacheAction();
checkIfCached(holder, action, 100);
checkIfExpired(holder, action, 110);
}
@Test
public void testActionWithTTLLongerThanDefaultCache() {
ResultHolder holder = new ResultHolder();
SomeDefaultProvidingTTLCacheAction action = new SomeDefaultProvidingTTLCacheAction(300);
checkIfCached(holder, action, 210);
checkIfExpired(holder, action, 100);
}
@Test
public void testActionWithTTLShorterThanDefaultCache() {
ResultHolder holder = new ResultHolder();
SomeDefaultProvidingTTLCacheAction action = new SomeDefaultProvidingTTLCacheAction(100);
checkIfCached(holder, action, 50);
checkIfExpired(holder, action, 60);
}
@Test
public void testResultWithTTLShorterThanDefaultCache() {
ResultHolder holder = new ResultHolder();
SomeResultWithTTLCacheAction action = new SomeResultWithTTLCacheAction(100);
checkIfCached(holder, action, 50);
checkIfExpired(holder, action, 60);
}
@Test
public void testResultWithTTLLongerThanDefaultCache() {
ResultHolder holder = new ResultHolder();
SomeResultWithTTLCacheAction action = new SomeResultWithTTLCacheAction(300);
checkIfCached(holder, action, 250);
checkIfExpired(holder, action, 60);
}
@Test
public void testActionResultWithTTL() {
ResultHolder holder = new ResultHolder();
SomeActionAndResultWithTTLCacheAction action = new SomeActionAndResultWithTTLCacheAction(50, 300);
checkIfCached(holder, action, 200);
checkIfExpired(holder, action, 110);
}
private <R extends Result, A extends Action<R, DispatchContextMock>> void checkIfCached(final ResultHolder holder,
A action, int waitTime) {
cd.execute(action, new SimpleCallback<R>() {
@Override
public void onSuccess(Result result) {
holder.value = result;
}
});
wait(waitTime);
cd.execute(action, new SimpleCallback<R>() {
@Override
public void onSuccess(Result result) {
Assert.assertSame("Should be the same", holder.value, result);
}
});
}
private <R extends Result, A extends Action<R, DispatchContextMock>> void checkIfExpired(final ResultHolder holder,
A action, int waitTime) {
wait(waitTime);
cd.execute(action, new SimpleCallback<R>() {
@Override
public void onSuccess(Result result) {
Assert.assertNotSame("Should have expired, should not be same", holder.value, result);
}
});
}
private class SomeNoCacheAction implements Action<SomeResult, DispatchContextMock> {
@Override
public SomeResult execute(DispatchContextMock ctx) throws DispatchException {
return new SomeResult();
}
}
private class SomeDefaultCacheAction implements Action<SomeResult, DispatchContextMock>, IsClientCacheable {
private String instanceIdentifier = UUID.randomUUID().toString();
@Override
public SomeResult execute(DispatchContextMock ctx) throws DispatchException {
return new SomeResult();
}
@Override
public void cacheInstanceKey(StringBuilder key) {
key.append(instanceIdentifier);
}
}
private class SomeDefaultProvidingTTLCacheAction extends SomeDefaultCacheAction implements IsClientCacheable,
HasClientCacheTotalTimeToLive {
private int ttl;
public SomeDefaultProvidingTTLCacheAction(int ttl) {
this.ttl = ttl;
}
@Override
public int cacheTotalTimeToLiveMillis() {
return ttl;
}
}
private class SomeResultWithTTLCacheAction implements Action<SomeResultWithTTL, DispatchContextMock>,
IsClientCacheable {
private String instanceIdentifier = UUID.randomUUID().toString();
private int ttl;
public SomeResultWithTTLCacheAction(int ttl) {
this.ttl = ttl;
}
@Override
public SomeResultWithTTL execute(DispatchContextMock ctx) throws DispatchException {
return new SomeResultWithTTL(ttl);
}
@Override
public void cacheInstanceKey(StringBuilder key) {
key.append(instanceIdentifier);
}
}
private class SomeActionAndResultWithTTLCacheAction implements Action<SomeResultWithTTL, DispatchContextMock>,
IsClientCacheable,
HasClientCacheTotalTimeToLive {
private String instanceIdentifier = UUID.randomUUID().toString();
private int actionTTL;
private int resultTTL;
public SomeActionAndResultWithTTLCacheAction(int actionTTL, int resultTTL) {
this.actionTTL = actionTTL;
this.resultTTL = resultTTL;
}
@Override
public SomeResultWithTTL execute(DispatchContextMock ctx) throws DispatchException {
return new SomeResultWithTTL(resultTTL);
}
@Override
public void cacheInstanceKey(StringBuilder key) {
key.append(instanceIdentifier);
}
@Override
public int cacheTotalTimeToLiveMillis() {
return actionTTL;
}
}
private class SomeResult implements Result {
}
private class SomeResultWithTTL implements Result, HasClientCacheTotalTimeToLive {
private int ttl;
public SomeResultWithTTL(int ttl) {
super();
this.ttl = ttl;
}
@Override
public int cacheTotalTimeToLiveMillis() {
return ttl;
}
}
private class ResultHolder {
Result value;
}
private class DispatchContextMock implements DispatchContext {
@Override
public HttpServletRequest getRequest() {
return null;
}
@Override
public URL getRequestBaseURL() throws DispatchException {
return null;
}
}
private abstract class SimpleCallback<T> implements AsyncCallback<T> {
@Override
public void onFailure(Throwable caught) {
}
}
private void wait(int millis) {
try {
Thread.sleep(millis);
} catch (Exception e) {
}
}
private class DispatchMock implements DispatchAsync<DispatchContextMock> {
@Override
public <R extends Result, A extends Action<R, DispatchContextMock>> void execute(A action,
AsyncCallback<R> callback) throws DispatchException {
action.execute(new DispatchContextMock());
}
}
}
@@ -1,6 +1,7 @@
eclipse.preferences.version=1
encoding//src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.properties=UTF-8
encoding//src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_de.properties=UTF-8
encoding//src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_ru.properties=UTF-8
encoding//src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_zh.properties=UTF-8
encoding//src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties=UTF-8
encoding//src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties=UTF-8
+69 -1
View File
@@ -25,7 +25,71 @@
</script>
<script src="com.sap.sailing.gwt.home.Home/com.sap.sailing.gwt.home.Home.nocache.js"></script>
<style type="text/css">
.loading {
position: absolute;
top: 80px;
bottom: 0;
left: 0;
right: 0;
font-size: 120%;
}
.loading > .sapsailing {
margin: 40px;
color: #008fcc;
font-weight: bold;
}
.loading > .waitmessage {
margin: 60px 40px;
}
.signal {
border:3px solid #6a6a6a;
border-radius: 50%;
position: relative;
height:300px;
width:300px;
margin: 0px auto;
opacity:0;
-webkit-animation: pulsate 2s ease-out;
animation: pulsate 2s ease-out;
-webkit-animation-iteration-count:infinite;
animation-iteration-count:infinite;
-webkit-transform: translate(-50%, -50%);
}
@-webkit-keyframes pulsate {
0% {
-webkit-transform:scale(.1);
transform:scale(.1);
opacity: 0.0;
}
50% {
opacity:1;
}
100% {
-webkit-transform:scale(1.2);
transform:scale(1.2);
opacity:0;
}
}
@keyframes pulsate {
0% {
-webkit-transform:scale(.1);
transform:scale(.1);
opacity: 0.0;
}
50% {
opacity:1;
}
100% {
-webkit-transform:scale(1.2);
transform:scale(1.2);
opacity:0;
}
}
</style>
</head>
<body>
<iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
@@ -35,6 +99,10 @@
Your web browser must have JavaScript enabled in order for this
application to display correctly.</div>
</noscript>
<div id="loading" class="loading">
<p class="sapsailing">SAP Sailing Analytics</p>
<p class="waitmessage">Loading, please wait...</p>
<div class="signal"></div>
</div>
</body>
</html>
@@ -68,7 +68,10 @@ Bundle-ClassPath: WEB-INF/classes/,
WEB-INF/lib/gwt-ajaxloader.jar,
WEB-INF/lib/gwt-bootstrap-2.3.2.0.jar
TrackLifecycle: true
Export-Package: com.sap.sailing.gwt.ui.actions,
Export-Package: com.google.gwt.user.client.rpc.core.com.sap.sailing.domain.common.confidence.impl,
com.google.gwt.user.client.rpc.core.com.sap.sailing.domain.common.impl,
com.google.gwt.user.client.rpc.core.com.sap.sailing.domain.common.tracking.impl,
com.sap.sailing.gwt.ui.actions,
com.sap.sailing.gwt.ui.client,
com.sap.sailing.gwt.ui.client.shared.charts,
com.sap.sailing.gwt.ui.client.shared.racemap,
@@ -73,7 +73,7 @@
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-superDevMode -incremental -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/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.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.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/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.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>
+1 -10
View File
@@ -76,21 +76,12 @@
<servlet>
<display-name>Dispatch Service</display-name>
<servlet-name>DispatchService</servlet-name>
<servlet-class>com.sap.sailing.gwt.ui.server.dispatch.DispatchRPCImpl</servlet-class>
<servlet-class>com.sap.sailing.gwt.home.server.servlets.DispatchRPCServletImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DispatchService</servlet-name>
<url-pattern>/service/dispatch</url-pattern>
</servlet-mapping>
<servlet>
<display-name>Home Service</display-name>
<servlet-name>HomeService</servlet-name>
<servlet-class>com.sap.sailing.gwt.server.HomeServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HomeService</servlet-name>
<url-pattern>/service/home</url-pattern>
</servlet-mapping>
<servlet>
<display-name>Media Service</display-name>
Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 KiB

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 KiB

After

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 612 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="#999" d="M10 0C4.5 0 0 1.4 0 3.1V5l7.5 7.5v6.2c0 .7 1.1 1.3 2.5 1.3s2.5-.6 2.5-1.3v-6.2L20 5V3.1C20 1.4 15.5 0 10 0zM1.8 2.7c.5-.3 1.2-.5 1.9-.7 1.8-.5 4-.8 6.3-.8s4.5.3 6.3.7c.8.2 1.4.5 1.9.7.3.2.5.3.6.4-.1.1-.2.2-.6.4-.5.3-1.1.5-1.9.7-1.8.6-4 .9-6.3.9s-4.5-.3-6.3-.7c-.7-.2-1.4-.5-1.9-.8-.3-.1-.4-.3-.5-.4.1-.1.2-.2.5-.4z"/></svg>

After

Width:  |  Height:  |  Size: 404 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.8 19.8"><path fill="#F0AB00" d="M19.5 18.3l-5.1-5.1c1.1-1.4 1.8-3.1 1.8-5.1 0-4.5-3.6-8.1-8.1-8.1S0 3.6 0 8.1s3.6 8.1 8.1 8.1c1.9 0 3.7-.7 5.1-1.8l5.1 5.1c.2.2.4.3.6.3.2 0 .5-.1.6-.3.4-.3.4-.9 0-1.2zM8.1 14.4c-3.5 0-6.3-2.8-6.3-6.3s2.8-6.3 6.3-6.3 6.3 2.8 6.3 6.3-2.8 6.3-6.3 6.3z"/></svg>

After

Width:  |  Height:  |  Size: 345 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 KiB

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 KiB

+216 -219
View File
@@ -1,227 +1,224 @@
<?xml version="1.0" encoding="UTF-8"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>root</artifactId>
<groupId>com.sap.sailing</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>com.sap.sailing.gwt.ui</artifactId>
<packaging>eclipse-plugin</packaging>
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>root</artifactId>
<groupId>com.sap.sailing</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>com.sap.sailing.gwt.ui</artifactId>
<packaging>eclipse-plugin</packaging>
<repositories>
<repository>
<id>sonatype</id>
<url>http://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<repositories>
<repository>
<id>sonatype</id>
<url>http://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<dependencies>
<!-- The following dependency needs re-declaration with the desired version because
gwt-maps-api declares it with no version specifier which may be resolved to an
incorrect version.
-->
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>${gwt.version}</version>
</dependency>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-dev</artifactId>
<version>${gwt.version}</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<!-- This dependency is required because the GWT Maven Plugin searches
other GWT modules only in Maven dependencies -->
<groupId>com.github.branflake2267</groupId>
<artifactId>gwt-maps-api</artifactId>
<version>3.9.0-build-17</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.moxieapps.gwt</groupId>
<artifactId>org.moxieapps.gwt.highcharts</artifactId>
<version>1.6.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sailing.domain.common</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.common</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.gwt</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.gwt.theme</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.gwt.adminconsole</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sailing.datamining.shared</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.datamining.shared</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.datamining.annotations</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sailing.polars.datamining.shared</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.github.gwtbootstrap</groupId>
<artifactId>gwt-bootstrap</artifactId>
<version>2.3.2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.security.common</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.security.ui</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
</dependencies>
<dependencies>
<!-- The following dependency needs re-declaration with the desired version
because gwt-maps-api declares it with no version specifier which may be resolved
to an incorrect version. -->
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>${gwt.version}</version>
</dependency>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-dev</artifactId>
<version>${gwt.version}</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<!-- This dependency is required because the GWT Maven Plugin searches
other GWT modules only in Maven dependencies -->
<groupId>com.github.branflake2267</groupId>
<artifactId>gwt-maps-api</artifactId>
<version>3.9.0-build-17</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.moxieapps.gwt</groupId>
<artifactId>org.moxieapps.gwt.highcharts</artifactId>
<version>1.6.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sailing.domain.common</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.common</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.gwt</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.gwt.theme</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.gwt.adminconsole</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sailing.datamining.shared</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.datamining.shared</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.datamining.annotations</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sailing.polars.datamining.shared</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.github.gwtbootstrap</groupId>
<artifactId>gwt-bootstrap</artifactId>
<version>2.3.2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.security.common</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>com.sap.sailing</groupId>
<artifactId>com.sap.sse.security.ui</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>sources</classifier>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>${gwt.version}</version>
<executions>
<!-- GWT version detected from dependencyManagement -->
<execution>
<configuration>
<!-- <userAgents>chrome</userAgents> -->
<modules>
<module>com.sap.sailing.gwt.home.Home</module>
<module>com.sap.sailing.gwt.AutoPlay</module>
<module>com.sap.sailing.gwt.ui.AdminConsole</module>
<module>com.sap.sailing.gwt.ui.Leaderboard</module>
<module>com.sap.sailing.gwt.ui.LeaderboardEditing</module>
<module>com.sap.sailing.gwt.ui.RaceBoard</module>
<module>com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart</module>
<module>com.sap.sailing.gwt.ui.Spectator</module>
<module>com.sap.sailing.gwt.ui.DataMining</module>
<module>com.sap.sailing.gwt.ui.VideoPopup</module>
<module>com.sap.sailing.gwt.ui.YoutubePopup</module>
<module>com.sap.sailing.gwt.ui.Simulator</module>
<module>com.sap.sailing.gwt.regattaoverview.RegattaOverview</module>
</modules>
<!-- uncomment the following for PRETTY-printed, non-obfuscated output format
<style>PRETTY</style>
-->
<gen>${basedir}/.generated</gen>
<webappDirectory>${basedir}</webappDirectory>
<warSourceDirectory>${basedir}/src/main/resources</warSourceDirectory>
<!-- Uncomment the following to obtain details split-point reports
<compileReport>true</compileReport>
<detailedSoyc>true</detailedSoyc>
-->
</configuration>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-source-plugin</artifactId>
<version>${tycho-version}</version>
<executions>
<execution>
<id>plugin-source</id>
<phase>generate-sources</phase>
<goals>
<goal>plugin-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</dependencies>
<profiles>
<profile>
<id>debug.no-gwt-compile</id>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>${gwt.version}</version>
<executions>
<execution>
<configuration combine.self="override">
<modules>
</modules>
</configuration>
<goals>
<goal>help</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>${gwt.version}</version>
<executions>
<!-- GWT version detected from dependencyManagement -->
<execution>
<configuration>
<!-- <userAgents>chrome</userAgents> -->
<modules>
<module>com.sap.sailing.gwt.home.Home</module>
<module>com.sap.sailing.gwt.AutoPlay</module>
<module>com.sap.sailing.gwt.ui.AdminConsole</module>
<module>com.sap.sailing.gwt.ui.Leaderboard</module>
<module>com.sap.sailing.gwt.ui.LeaderboardEditing</module>
<module>com.sap.sailing.gwt.ui.RaceBoard</module>
<module>com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart</module>
<module>com.sap.sailing.gwt.ui.Spectator</module>
<module>com.sap.sailing.gwt.ui.DataMining</module>
<module>com.sap.sailing.gwt.ui.VideoPopup</module>
<module>com.sap.sailing.gwt.ui.YoutubePopup</module>
<module>com.sap.sailing.gwt.ui.Simulator</module>
<module>com.sap.sailing.gwt.regattaoverview.RegattaOverview</module>
</modules>
<!-- uncomment the following for PRETTY-printed, non-obfuscated output
format <style>PRETTY</style> -->
<gen>${basedir}/.generated</gen>
<webappDirectory>${basedir}</webappDirectory>
<warSourceDirectory>${basedir}/src/main/resources</warSourceDirectory>
<!-- Uncomment the following to obtain details split-point reports
<compileReport>true</compileReport> <detailedSoyc>true</detailedSoyc> -->
</configuration>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-source-plugin</artifactId>
<version>${tycho-version}</version>
<executions>
<execution>
<id>plugin-source</id>
<phase>generate-sources</phase>
<goals>
<goal>plugin-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>debug.no-gwt-compile</id>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>${gwt.version}</version>
<executions>
<execution>
<configuration combine.self="override">
<modules>
</modules>
</configuration>
<goals>
<goal>help</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.autoplay.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Document;
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;
@@ -8,7 +9,7 @@ import com.sap.sailing.gwt.common.client.SharedResources;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.mvp.AbstractMvpEntryPoint;
public class AutoPlayEntryPoint extends AbstractMvpEntryPoint<StringMessages> {
public class AutoPlayEntryPoint extends AbstractMvpEntryPoint<StringMessages, AutoPlayAppClientFactory> {
@Override
public void doOnModuleLoad() {
@@ -19,6 +20,7 @@ public class AutoPlayEntryPoint extends AbstractMvpEntryPoint<StringMessages> {
SharedResources.INSTANCE.mediaCss().ensureInjected();
SharedResources.INSTANCE.mainCss().ensureInjected();
Document.get().getBody().addClassName(SharedResources.INSTANCE.mainCss().desktop());
}
@Override
@@ -6,8 +6,6 @@ import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.web.bindery.event.shared.EventBus;
import com.sap.sailing.gwt.autoplay.client.place.start.StartPlace;
import com.sap.sailing.gwt.ui.client.HomeService;
import com.sap.sailing.gwt.ui.client.HomeServiceAsync;
import com.sap.sailing.gwt.ui.client.MediaService;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
@@ -16,9 +14,8 @@ import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sse.gwt.client.EntryPointHelper;
import com.sap.sse.security.ui.client.SecureClientFactoryImpl;
public abstract class AbstractApplicationClientFactory extends SecureClientFactoryImpl implements AutoPlayAppClientFactory {
public abstract class AbstractApplicationClientFactory extends SecureClientFactoryImpl<ApplicationTopLevelView> implements AutoPlayAppClientFactory {
private final SailingServiceAsync sailingService;
private final HomeServiceAsync homeService;
private final MediaServiceAsync mediaService;
private final PlaceNavigator navigator;
@@ -26,10 +23,8 @@ public abstract class AbstractApplicationClientFactory extends SecureClientFacto
super(root, eventBus, placeController);
this.navigator = navigator;
sailingService = GWT.create(SailingService.class);
homeService = GWT.create(HomeService.class);
mediaService = GWT.create(MediaService.class);
EntryPointHelper.registerASyncService((ServiceDefTarget) sailingService, RemoteServiceMappingConstants.sailingServiceRemotePath);
EntryPointHelper.registerASyncService((ServiceDefTarget) homeService, RemoteServiceMappingConstants.homeServiceRemotePath);
EntryPointHelper.registerASyncService((ServiceDefTarget) mediaService, RemoteServiceMappingConstants.mediaServiceRemotePath);
}
@@ -43,11 +38,6 @@ public abstract class AbstractApplicationClientFactory extends SecureClientFacto
return sailingService;
}
@Override
public HomeServiceAsync getHomeService() {
return homeService;
}
@Override
public MediaServiceAsync getMediaService() {
return mediaService;
@@ -41,4 +41,5 @@ public class DesktopApplicationClientFactory extends AbstractApplicationClientFa
public ErrorView createErrorView(String errorMessage, Throwable errorReason) {
return null;
}
}
@@ -12,10 +12,13 @@ import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
@@ -37,6 +40,7 @@ import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettingsFactory;
import com.sap.sailing.gwt.ui.raceboard.RaceBoardPanel;
import com.sap.sailing.gwt.ui.raceboard.RaceBoardViewConfiguration;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.RaceboardDataDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.Timer;
@@ -162,12 +166,13 @@ public class AutoPlayController implements RaceTimesInfoProviderListener {
}
}
private RaceBoardPanel createRaceBoardPanel(String leaderboardName, RegattaAndRaceIdentifier raceToShow) {
private RaceBoardPanel createRaceBoardPanel(String leaderboardName, RegattaAndRaceIdentifier raceToShow, Map<CompetitorDTO, BoatDTO> competitorsAndTheirBoats) {
RaceSelectionModel raceSelectionModel = new RaceSelectionModel();
List<RegattaAndRaceIdentifier> singletonList = Collections.singletonList(raceToShow);
raceSelectionModel.setSelection(singletonList);
RaceBoardPanel raceBoardPanel = new RaceBoardPanel(sailingService, mediaService, userService, asyncActionsExecutor,
raceboardTimer, raceSelectionModel, leaderboardName, null, /* event */null, raceboardViewConfig,
competitorsAndTheirBoats, raceboardTimer, raceSelectionModel, leaderboardName, null, /* event */null, raceboardViewConfig,
errorReporter, StringMessages.INSTANCE, userAgent, raceTimesInfoProvider, /* showMapControls */false);
return raceBoardPanel;
}
@@ -279,23 +284,35 @@ public class AutoPlayController implements RaceTimesInfoProviderListener {
private void showRaceBoard() {
if (activeTvView != AutoPlayModes.Raceboard) {
playerView.clear();
RaceBoardPanel raceBoardPanel = createRaceBoardPanel(leaderboardName, currentLiveRace);
raceBoardPanel.setSize("100%", "100%");
if (showWindChart) {
raceBoardPanel.setWindChartVisible(true);
}
FlowPanel timePanel = createTimePanel(raceBoardPanel);
sailingService.getRaceboardData(currentLiveRace.getRegattaName(), currentLiveRace.getRaceName(),
leaderboardName, null, null, new AsyncCallback<RaceboardDataDTO>() {
@Override
public void onSuccess(RaceboardDataDTO result) {
playerView.clear();
RaceBoardPanel raceBoardPanel = createRaceBoardPanel(leaderboardName, currentLiveRace, result.getCompetitorAndTheirBoats());
raceBoardPanel.setSize("100%", "100%");
if (showWindChart) {
raceBoardPanel.setWindChartVisible(true);
}
FlowPanel timePanel = createTimePanel(raceBoardPanel);
final Button toggleButton = raceBoardPanel.getTimePanel().getAdvancedToggleButton();
toggleButton.setVisible(false);
playerView.getDockPanel().addSouth(timePanel, 67);
playerView.getDockPanel().add(raceBoardPanel);
activeTvView = AutoPlayModes.Raceboard;
leaderboardTimer.pause();
raceboardTimer.setPlayMode(PlayModes.Live);
isInitialScreen = false;
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error while loading data for raceboard: " + caught.getMessage());
}
});
final Button toggleButton = raceBoardPanel.getTimePanel().getAdvancedToggleButton();
toggleButton.setVisible(false);
playerView.getDockPanel().addSouth(timePanel, 67);
playerView.getDockPanel().add(raceBoardPanel);
activeTvView = AutoPlayModes.Raceboard;
leaderboardTimer.pause();
raceboardTimer.setPlayMode(PlayModes.Live);
isInitialScreen = false;
}
}
@@ -31,11 +31,11 @@ public class DateUtil {
}
public static boolean isSameDayOfMonth(Date date1, Date date2) {
return getMonth(date1) == getMonth(date2);
return isSameMonth(date1, date2) && getDayOfMonth(date1) == getDayOfMonth(date2);
}
public static boolean isSameMonth(Date date1, Date date2) {
return getMonth(date1) == getMonth(date2);
return isSameYear(date1, date2) && getMonth(date1) == getMonth(date2);
}
public static boolean isSameYear(Date date1, Date date2) {
@@ -14,6 +14,8 @@ public interface SharedResources extends ClientBundle {
MediaCss mediaCss();
public interface MainCss extends CssResource{
String mobile();
String desktop();
String wrapper();
String navbar();
String navbar_button();
@@ -65,6 +67,7 @@ public interface SharedResources extends ClientBundle {
String slideto();
String slidetonav();
String slidetoactive();
String fleetcorner();
}
public interface MediaCss extends CssResource{
@@ -77,4 +77,8 @@ public class BreadcrumbPane extends Widget {
}
});
}
public void clear() {
breadcrumDiv.removeAllChildren();
}
}
@@ -7,6 +7,8 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.place.shared.Place;
@@ -22,6 +24,7 @@ import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.common.client.controls.tabbar.TabView.State;
import com.sap.sailing.gwt.home.shared.ExperimentalFeatures;
/**
* Defines whole layout for site, including the header with the breadcrumbs and tab bar, and the content.
@@ -42,6 +45,7 @@ public class TabPanel<PRESENTER> extends Composite {
@UiField
TabBar tabBar;
@UiField BreadcrumbPane breadcrumbs;
@UiField DivElement breadcrumbsContainer;
@UiField FlowPanel tabExtension;
private TabView<Place, PRESENTER> currentTab;
@@ -53,6 +57,10 @@ public class TabPanel<PRESENTER> extends Composite {
this.presenter = presenter;
this.historyMapper = historyMapper;
initWidget(ourUiBinder.createAndBindUi(this));
if(ExperimentalFeatures.USE_NAVIGATION_PATH_DISPLAY_ON_DESKTOP) {
breadcrumbsContainer.getStyle().setDisplay(Display.NONE);
}
}
public TabView<?, PRESENTER> getCurrentTab() {
@@ -35,14 +35,10 @@
float: right;
margin-left: 0.5em;
}
.busy {
width: 32px;
margin: 2em auto 10em;
}
</ui:style>
<g:FlowPanel>
<g:HTMLPanel addStyleNames="{style.header}">
<div class="{res.mediaCss.grid}">
<div ui:field="breadcrumbsContainer" class="{res.mediaCss.grid}">
<div class="{res.mediaCss.small12} {res.mediaCss.columns}">
<c:BreadcrumbPane ui:field="breadcrumbs"
addStyleNames="{style.breadcrumb}" />
@@ -58,8 +54,6 @@
</div>
</g:HTMLPanel>
<g:SimplePanel ui:field="tabContentPanelUi"
addStyleNames="{style.content}">
<b:SimpleBusyIndicator addStyleNames="{style.busy}" busy="true" />
</g:SimplePanel>
addStyleNames="{style.content}" />
</g:FlowPanel>
</ui:UiBinder>
@@ -0,0 +1,7 @@
package com.sap.sailing.gwt.common.client.formfactor;
public enum DeviceCategory {
DESKTOP,
TABLET,
MOBILE
}
@@ -0,0 +1,69 @@
package com.sap.sailing.gwt.common.client.formfactor;
import java.util.logging.Logger;
import com.google.gwt.regexp.shared.RegExp;
import com.google.gwt.user.client.Window.Navigator;
public class DeviceDetector {
private static Logger LOG = Logger.getLogger(DeviceDetector.class.getName());
private static final RegExp isMobileRegExp = RegExp.compile(
"Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile Safari", "i");
private static final RegExp tabletBlacklistRegExp = RegExp.compile(
"iPad|" // Apple ;-)
+ "Nexus 7|Nexus 10|Nexus 9|" // Google Tablets
+ "PlayBook|" // Blackberry
+ "KFAPWI|" // Kindle Fire HD
+ "FZ-B|" // Panasonic ToughPad
+ "SGP|" // Sony Xperia Tablets
+ "GT-P|SM-T|SM-P|" // Galaxy Tab (https://en.wikipedia.org/wiki/Samsung_Galaxy ; http://forum.xda-developers.com/wiki/Samsung/Model_naming_scheme)
+ "Tablet" // Firefox on Android
, "i");
private static DeviceCategory deviceCategory;
public static DeviceCategory getDeviceCategory() {
if(deviceCategory == null) {
deviceCategory = calculateDeviceCategory();
}
return deviceCategory;
}
private static DeviceCategory calculateDeviceCategory() {
boolean isMobile = isMobileRegExp.test(Navigator.getUserAgent());
LOG.info("Navigator user agent matched mobile regex: " + isMobile);
if(!isMobile) {
return DeviceCategory.DESKTOP;
}
boolean isTablet = tabletBlacklistRegExp.test(Navigator.getUserAgent());
LOG.info("Navigator user agent matched tablet regex: " + isTablet);
return isTablet ? DeviceCategory.TABLET : DeviceCategory.MOBILE;
}
/**
* Uses regular expression and user agent to detect mobile device.
*
* @return
*/
public static boolean isMobile() {
return getDeviceCategory() == DeviceCategory.MOBILE;
}
/**
* Uses regular expression and user agent to detect tablet device.
*
* @return
*/
public static boolean isTablet() {
return getDeviceCategory() == DeviceCategory.TABLET;
}
/**
* Convinience method
*
* @return
*/
public static boolean isDesktop() {
return getDeviceCategory() == DeviceCategory.DESKTOP;
}
}
@@ -0,0 +1,64 @@
package com.sap.sailing.gwt.common.client.formfactor;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.HeadElement;
import com.google.gwt.dom.client.MetaElement;
import com.sap.sse.common.Util;
/**
* Utility class to add meta tags to the {@link Document#getHead() document head}.
*/
public abstract class MetaTagUtil {
private static final String TAG_NAME_VIEWPORT = "viewport";
private static final String CONTENT_SEPARATOR = ",";
private static final String CONTENT_PROPERTY_VALUE_SEPARATOR = "=";
private static final String CONTENT_PROPERTY_WIDTH = "width";
private static final String CONTENT_PROPERTY_INITIAL_SCALE = "initial-scale";
private static final String CONTENT_PROPERTY_MAXIMUM_SCALE = "maximum-scale";
public static final String WIDTH_VALUE_DEVICE_WIDTH = "device-width";
public static final String SCALE_VALUE_SMALL = "0.5";
public static final String SCALE_VALUE_SMALLER = "0.75";
public static final String SCALE_VALUE_NORMAL = "1";
public static final String SCALE_VALUE_LARGE = "2";
/**
* Appends a {@code viewport} meta tag to the {@link HeadElement head} using {@code width=device-width}.
*
* @param initialScaleValue value to use for meta tag content property {@code initial-scale}
* @param maximumScaleValue value to use for meta tag content property {@code maximum-scale}
*
* @see MetaTagUtil#setViewport(String, String, String)
*/
public static void setViewportToDeviceWidth(String initialScaleValue, String maximumScaleValue) {
MetaTagUtil.setViewport(WIDTH_VALUE_DEVICE_WIDTH, initialScaleValue, maximumScaleValue);
}
/**
* Appends a {@code viewport} meta tag to the {@link HeadElement head}.
*
* @param widthValue value to use for meta tag content property {@code width}
* @param initialScaleValue value to use for meta tag content property {@code initial-scale}
* @param maximumScaleValue value to use for meta tag content property {@code maximum-scale}
*/
public static void setViewport(String widthValue, String initialScaleValue, String maximumScaleValue) {
String width = content(CONTENT_PROPERTY_WIDTH, widthValue);
String initialScale = content(CONTENT_PROPERTY_INITIAL_SCALE, initialScaleValue);
String maximumScale = content(CONTENT_PROPERTY_MAXIMUM_SCALE, maximumScaleValue);
appendMetaElement(TAG_NAME_VIEWPORT, Util.join(CONTENT_SEPARATOR, width, initialScale, maximumScale));
}
private static String content(String property, String value) {
return property + CONTENT_PROPERTY_VALUE_SEPARATOR + value;
}
private static void appendMetaElement(String name, String content) {
MetaElement metaElement = Document.get().createMetaElement();
metaElement.setName(name);
metaElement.setContent(content);
Document.get().getHead().appendChild(metaElement);
}
}
@@ -179,21 +179,53 @@ public interface TextMessages extends Messages {
String sharingTwitter();
String socialFooterShare();
String socialFooterTitle();
String solutionsSAPNav();
String solutionsSISHeadline();
String solutionsSAPHeadline();
String solutionsRaceHeadline();
String solutionsPostHeadline();
String solutionsTrainingHeadline();
String solutionsSimulatorHeadline();
String sapInSailing();
String contentSapInSailing1();
String contentSapInSailing2();
String contentSapInSailing3();
String contentSapInSailing4();
String contentSapInSailing5();
String contentSapInSailing6();
String contentSapInSailing7();
String contentSapInSailing8();
String contentSapInSailing9();
String contentSapInSailing10();
String contentSapInSailing11();
String contentSapInSailing12();
String solutionsSAPText1();
String solutionsSAPText2();
String solutionsRaceNav();
String solutionsRaceHeadline();
String solutionsRaceText();
String solutionsPostNav();
String solutionsPostHeadline();
String solutionsPostText();
String solutionsTrainingNav();
String solutionsTrainingHeadline();
String solutionsTrainingText();
String solutionsSimulatorNav();
String solutionsSimulatorHeadline();
String solutionsSimulatorText();
String sapSailingAnalytics();
String contentSapSailingAnalytics1();
String contentSapSailingAnalytics2();
String sapSailingAnalyticsReadMore();
String sapSailingRaceManager();
String contentSapSailingRaceManager();
String sapSailingRaceManagerReadMore();
String postRaceAnalytics();
String contentPostRaceAnalytics1();
String contentPostRaceAnalytics2();
String i18nDeSolutionsTrainingHeadline();
String i18nDeSolutionsTrainingText();
String strategySimulator();
String contentStrategySimulator();
String strategySimulatorReadMore();
}
@@ -134,7 +134,7 @@ leaderboardQuickAccessLabel=Leaderboard Quick Access
mainEventShowAll=Show All Events
mainEventTitle=Latest Events from the Sailing World
mainMediaSubtitle=Get lost in the latest and most beautiful impressions from your favorite sailing event.
mainMediaTitle=Sailing loves Photography
mainMediaTitle=Photographers love Sailing
mainMediaVideosSubtitle=Immerse yourself in the world of sailing and check out our latest events for more videos.
mainMediaVideosTitle=Recent Video Entries
mainSponsorsReadMore=Read More
@@ -168,19 +168,55 @@ sharingFacebook=Share on Facebook
sharingTwitter=Tweet about it
socialFooterShare=Share this on
socialFooterTitle=Recommend SAP Sailing Analytics
solutionsSAPNav=SAP Sailing Analytics
# SOLUTIONS
solutionsSISHeadline=SAP in Sailing
solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsPostHeadline=Post-Race Analytics
solutionsTrainingHeadline=Training Diary
solutionsSimulatorHeadline=Strategy Simulator
sapInSailing=SAP in Sailing
contentSapInSailing1=Sailing provides the perfect platform for SAP to showcase solutions and help the sport run like never before. SAP’s involvement in the sport has transformed the sailing experience by providing tools, which:
contentSapInSailing2=Help sailors analyze performance and optimize strategy
contentSapInSailing3=Bring fans closer to the action
contentSapInSailing4=Provide the media with information and insights to deliver a greater informed commentary
contentSapInSailing5=SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including:
contentSapInSailing6=Official Technology Partner of Travemünder Woche
contentSapInSailing7=Technical Partner of the European Sailing Leagues
contentSapInSailing8=Title sponsor of the SAP Extreme Sailing Team
contentSapInSailing9=Official Technical Partner of the Extreme Sailing Series
contentSapInSailing10=Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany
contentSapInSailing11=Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week)
contentSapInSailing12=Title sponsor of the SAP 5O5 World Championships
solutionsSAPText1=By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing.
solutionsSAPText2=SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere.
solutionsRaceNav=Race Committee App
solutionsRaceHeadline=Race Committee App
solutionsRaceText=The SAP Race Committee App delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter.
solutionsPostNav=Post-Race Analytics
solutionsPostHeadline=Post-Race Analytics
solutionsPostText=Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.<br> SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas.
solutionsTrainingNav=Training Diary
solutionsTrainingHeadline=SAP Sail Better \u2013 STG Training Diary
solutionsTrainingText=The STG Training Diary supports the daily documentation and analysis of an athlete\u2019s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel.
solutionsSimulatorNav=Strategy Simulator
solutionsSimulatorHeadline=Strategy Simulator
solutionsSimulatorText=Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions.
sapSailingAnalytics=SAP Sailing Analytics
contentSapSailingAnalytics1=By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing.
contentSapSailingAnalytics2=SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere.
sapSailingAnalyticsReadMore=Read More
sapSailingRaceManager=SAP Sailing Race Manager
contentSapSailingRaceManager=The SAP Sailing Race Manager delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter.
sapSailingRaceManagerReadMore=Learn More
postRaceAnalytics=Post-Race Analytics
contentPostRaceAnalytics1=Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.
contentPostRaceAnalytics2=SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas.
i18nDeSolutionsTrainingHeadline=SAP Sail Better – STG Training Diary
i18nDeSolutionsTrainingText=The STG Training Diary supports the daily documentation and analysis of an athlete’s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel.
strategySimulator=Strategy Simulator
contentStrategySimulator=Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions.
strategySimulatorReadMore=Learn More
@@ -134,7 +134,7 @@ leaderboardQuickAccessLabel=Ergebnisliste Schnellzugang
mainEventShowAll=Zeige alle Veranstaltungen
mainEventTitle=Die letzten Veranstaltungen aus der Segelwelt
mainMediaSubtitle=Hier gibt es die aktuellsten und schönsten Impressionen aus deiner beliebtesten Segelveranstaltung.
mainMediaTitle=Segeln liebt Fotografie
mainMediaTitle=Fotografen lieben Segeln
mainMediaVideosSubtitle=Tauche ein in die Welt des Segelns und besuche auch die anderen Veranstaltungen für mehr Videos.
mainMediaVideosTitle= Die Letzten Videoeinträge
mainSponsorsReadMore=Lese mehr
@@ -168,19 +168,55 @@ sharingFacebook=Auf Facebook teilen
sharingTwitter=Twittern
socialFooterShare=Teile es auf
socialFooterTitle=Empfehle SAP Sailing Analytics
solutionsSAPNav=SAP Sailing Analytics
# SOLUTIONS
solutionsSISHeadline=SAP im Segelsport
solutionsSAPHeadline=SAP Sailing Analytics
solutionsSAPText1=Bei Echtzeitanalysen rund um Rennplätze, Schnelligkeit, Manöver, Verhalten etc., SAP hilf dabei zu vereinfachen und den Mythos von der Komplexität des Segelns zu nehmen.
solutionsSAPText2=SAP Sailing Analytics ermöglicht Einsichten und Transparenz in die Welt des Segelns durch Nutzung der Cloud und In-Memory Technologien, Erheben von GPS und Windmessungen in echtzeit und den Inhalt auf verschiedenen Oberflächen von überall zu visualisieren.
solutionsRaceNav=Race Committee App
solutionsRaceHeadline=Race Committee App
solutionsRaceText=Die SAP Race Committee App bietet mehr Effizienz und Kontrolle für die Rennleiter durch Automatisieren und vereinfachen der manuellen Aufgaben und der Kommunikation während laufender Segelregatten. Die Race Committee App hilft Aufgaben zu vereinfachen und Segelveranstaltungen zu leiten, um das Segel Komitee besser Handeln zu lassen.
solutionsPostNav=Nachträgliche Rennen Analyse.
solutionsPostHeadline=Nachträgliche Rennen Analyse
solutionsPostText=Zugang zu gesammelten Daten bei Segelveranstaltungen geben Seglern die Möglichkeit die eigene Performance zu beurteilen und zu analysieren, um Strategien zu entwickeln und besser zu segeln.<br> SAP Business Analytics Lösungen stellen Seglern, Trainern, Fans und Medien Tools zu verfügung, um die historischen Daten über mehrere Regatten und Rennen anzusehen und zu analysieren. SAP HANA erlaubt es ihnen über Verhaltensmuster, Tendenzen und Segelprofilen in einem einfachen, schnellen und effizienten Weg zu erlernen, damit sie ihre Performance und Entwicklung der Strategien in zukünftigen Regatten zu optimieren.
solutionsTrainingNav=Training Tagebuch
solutionsTrainingHeadline=SAP Segelt Besser \u2013 STG Training Tagebuch
solutionsTrainingText=Das STG Trainingstagebuch unterstützt die tägliche Dokumentation und Analyse von der physischen Kondition und Trainingserfolge eines Athleten in Wassertraining, physischen Training, Boot Arbeiten, Theorie und andere Aufgaben wie Bildung oder Reisen.
solutionsSimulatorNav=Strategie Simulator
solutionsSimulatorHeadline=Strategie Simulator
solutionsSimulatorText=Die richtige Strategie zu wählen kann einen großen Vorteil während eines Rennens bringen. Der Strategie Simulator vereinfacht ausschlaggebend die besten Segelstrategien für verschiedene Windkonditionen und Wasserströmungen. Seit dem der Wind und die Strömung während der Simulation direkt geändert werden kann, kann die Strategie sogar für unsichere Wetterverhältnisse einfach bewertet werden.
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsPostHeadline=Analysen nach den Rennen
solutionsTrainingHeadline=Trainingstagebuch
solutionsSimulatorHeadline=Strategie-Simulator
sapInSailing=SAP im Segelsport
contentSapInSailing1=Der Segelsport bietet SAP eine perfekte Plattform, um seine Lösungen zu demonstrieren und dem Sport zu neuen Bestleistungen zu verhelfen. SAPs Unterstützung hat das Segelerlebnis vollkommen verwandelt. Tools von SAP:
contentSapInSailing2=helfen Seglern, ihre Leistung zu analysieren und ihre Strategie zu optimieren
contentSapInSailing3=bringen Fans näher an das Geschehen heran
contentSapInSailing4=stellen Informationen und Einblicke für die Medien bereit, um eine besser informierte Berichterstattung zu ermöglichen
contentSapInSailing5=SAP ist bereits seit vielen Jahren mit dem Segelsport verbunden und hat ein Portfolio zahlreicher Teams und Regatten aufgebaut, darunter:
contentSapInSailing6=Offizieller Technologiepartner der Travemünder Woche
contentSapInSailing7=Technischer Partner der Europäischen Segelligen
contentSapInSailing8=Titelsponsor des SAP Extreme Sailing Teams
contentSapInSailing9=Offizieller technischer Partner der Extreme Sailing Series
contentSapInSailing10=Premium-Partner der deutschen Segel-Nationalmannschaft Audi Sailing Team Germany
contentSapInSailing11=Premium-Partner der Kieler Woche, der größten Regatta der Welt
contentSapInSailing12=Titelsponsor der SAP 5O5 World Championships
solutionsSAPText1=Durch die Bereitstellung von Echtzeit-Analysen zu Ranglisten, Geschwindigkeiten, Manövern, Kursen etc. trägt SAP dazu bei, die komplexe Welt des Segelns einfacher und verständlicher zu machen.
solutionsSAPText2=SAP Sailing Analytics nutzt Cloud- und In-Memory-Technologie, verarbeitet GPS- und Winddaten in Echtzeit und visualisiert Inhalte in verschiedenen Frontends, die von überall zugänglich sind, um transparente Einblicke in die Welt des Segelns zu liefern.
solutionsRaceText=Der SAP Sailing Race Manager bietet Rennveranstaltern mehr Effizienz und Kontrolle, indem er ihre manuellen Aufgaben sowie die Kommunikation während Regatten automatisiert und vereinfacht. Diese App unterstützt die Durchführung und Abwicklung von Segelrennen und hilft Rennleitungen dadurch, intelligenter zu arbeiten.
solutionsPostText=Daten von den Segelveranstaltungen bieten Seglern die Möglichkeit, ihre Leistungen zu analysieren und zu bewerten, damit sie ihre Strategien verfeinern und letztendlich besser segeln können.<br> Lösungen von SAP Business Analytics geben Seglern, Trainern, Fans und Medien die Mittel in die Hand, um historische Daten von vielen Regatten und Rennen abzurufen und zu analysieren. Mit SAP HANA sind Informationen über Leistungsmuster, Trends und Segler-Profile einfach, schnell und effizient abrufbar, so dass Segler ihre eigene Leistung optimieren und Erfolgsstrategien für zukünftige Regatten entwickeln können.
solutionsTrainingText=Das STG Trainingstagebuch unterstützt die tägliche Dokumentation und Analyse der Kondition und Trainingsaktivitäten eines Sportlers, sowohl in Bereichen wie Training auf dem Wasser, Körpertraining, Arbeit auf dem Boot, Mentaltraining und Theorie als auch bei anderen Aktivitäten wie Weiterbildung oder Reisen.
solutionsSimulatorText=Während eines Rennens hängt viel von der Wahl der richtigen Strategie ab. Der Strategy Simulator vereinfacht die Ermittlung der besten Segelstrategie für diverse Wind- und Strömungsbedingungen. Da Wind und Strömung sofort in der Simulation geändert werden können, lässt sich die Robustheit einer Strategie selbst für unsichere Wetterbedingungen problemlos bewerten.
sapSailingAnalytics=SAP Sailing Analytics
contentSapSailingAnalytics1=Durch die Bereitstellung von Echtzeit-Analysen zu Ranglisten, Geschwindigkeiten, Manövern, Kursen etc. trägt SAP dazu bei, die komplexe Welt des Segelns einfacher und verständlicher zu machen.
contentSapSailingAnalytics2=SAP Sailing Analytics nutzt Cloud- und In-Memory-Technologie, verarbeitet GPS- und Winddaten in Echtzeit und visualisiert Inhalte in verschiedenen Frontends, die von überall zugänglich sind, um transparente Einblicke in die Welt des Segelns zu liefern.
sapSailingAnalyticsReadMore=Mehr lesen
sapSailingRaceManager=SAP Sailing Race Manager
contentSapSailingRaceManager=Der SAP Sailing Race Manager bietet Rennveranstaltern mehr Effizienz und Kontrolle, indem sie ihre manuellen Aufgaben und die Kommunikation während Regatten automatisiert und vereinfacht. Die Race Committee App unterstützt die Durchführung und Abwicklung von Segelrennen und hilft Rennleitungen dadurch, intelligenter zu arbeiten.
sapSailingRaceManagerReadMore=Mehr erfahren
postRaceAnalytics=Analysen nach den Rennen
contentPostRaceAnalytics1=Daten von den Segelveranstaltungen bieten Seglern die Möglichkeit, ihre Leistungen zu analysieren und zu bewerten, um ihre Strategien zu verfeinern und letztendlich besser zu segeln.
contentPostRaceAnalytics2=Lösungen von SAP Business Analytics geben Seglern, Trainern, Fans und Medien die Mittel in die Hand, um historische Daten von vielen Regatten und Rennen abzurufen und zu analysieren. Mit SAP HANA sind Informationen über Leistungsmuster, Trends und Segler-Profile einfach, schnell und effizient abrufbar, so dass Segler ihre eigene Leistung optimieren und Erfolgsstrategien für zukünftige Regatten entwickeln können.
i18nDeSolutionsTrainingHeadline=SAP Sail Better – STG Trainingstagebuch
i18nDeSolutionsTrainingText=Das STG Trainingstagebuch unterstützt die tägliche Dokumentation und Analyse der Kondition und Trainingsaktivitäten eines Sportlers, sowohl in Bereichen wie Training auf dem Wasser, Körpertraining, Arbeit auf dem Boot, Mentaltraining und Theorie als auch bei anderen Aktivitäten wie Weiterbildung oder Reisen.
strategySimulator=Strategie-Simulator
contentStrategySimulator=Während eines Rennens hängt viel von der Wahl der richtigen Strategie ab. Der Strategie-Simulator vereinfacht die Ermittlung der besten Segelstrategie für diverse Wind- und Strömungsbedingungen. Da Wind und Strömung sofort in der Simulation geändert werden können, lässt sich die Robustheit einer Strategie selbst für unsichere Wetterbedingungen problemlos bewerten.
strategySimulatorReadMore=Mehr erfahren
@@ -0,0 +1,222 @@
chartSelectionHint=Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart.
chooseALanguage=Choose a language
events=Events
home=Home
aboutUs=About us
contact=Contact
sponsoring=Sponsoring
solutions=Решения
german=Deutsch
english=English
fullEventSchedule=Full event schedule
officalEventWebsite=Official event website
leg=Leg
races=Races
moreInfo=More info
viewAnalysis=View analysis
overallLeaderboard=Overall leaderboard
pleaseEnterASearchTerm=Please enter a search term.
pleaseTryAgain=Please try again...
reloadPage=Reload page
errorMessageLoadingData=An error occured while loading the data for this page.
errorMessageNoSuchLeaderboard=Could not find a leaderboard with this name.
raceNotScheduled=Not scheduled.
regattaDetails=Regatta details
regatta=Regatta
competitorsAnalytics=Competitors Analytics
chooseChart=Choose chart type
series=Series
regattaLeaderboards=Regatta leaderboards
features=Features
releaseNotes=Release notes
whatsNew=What''s new
overview=Overview
sapSailing=SAP Sailing
search=Search
startSimulator=Start Simulator
countdownStartingInDays=Days
countdownDays=Days
countdownHours=Hrs
countdownMinutes=Min
countdownSeconds=Sec
countdownDay=Day
countdownHour=Hour
countdownMinute=Min
countdownSecond=Sec
live=Live
finished=Finished
watchNow=Watch now
lastUpdate=Last Update
leaderboard=Leaderboard
boxNewsUpdateMoreLink=Report news
boxNewsUpdateTitle=News Update
boxUpcomingRacesCountdownStarted1=Started
boxUpcomingRacesCountdownStarted2=hrs and
boxUpcomingRacesCountdownStarted3=minutes ago
boxUpcomingRacesCountdownStarting1=Starting in
boxUpcomingRacesCountdownStarting2=hrs and
boxUpcomingRacesCountdownStarting3=minutes
boxUpcomingRacesMoreLink=Event Schedule
boxUpcomingRacesTitle=Upcoming Races Today
boxWeather=Weather
boxWeatherUnit=KTS
defaultTitle=SAP Sailing Analytics
eventHeaderMedia=Media
eventHeaderOverview=Overview
eventHeaderRaces=Schedule
eventHeaderRegattas=Regattas
seriesHeaderOverview=About the Series
seriesHeaderUpcoming=Upcoming
seriesHeaderRecent=Recent Events
seriesHeaderLeaderboard=Leaderboard
seriesOverviewHeaderRecent=Latest Series Events
seriesOverviewReadMore=More
eventsOverviewRecentEvents=Events
eventsOverviewRecentCountries=Countries
eventsOverviewRecentSailors=Sailors
eventsOverviewRecentTrackedRaces=Tracked Races
eventResultsHeadline=Winners and Results
eventResultsBoatClassesDropDown=All Boat Classes
eventOverviewMoreEvents=More Events
eventOverviewRecentEvents=Recent Events
eventOverviewUpcomingDate=Date
eventOverviewUpcomingEvent=Event
eventOverviewUpcomingLocation=Location
eventOverviewUpcomingSchedule=Upcoming Schedule
eventOverviewUpcomingSeries=Series
eventOverviewUpcomingTeaser=More Events To Be Announced Soon!
eventQuickfinderTitle=Event Quick-Finder
eventRegattaHeaderLeaderboard=Leaderboard
eventRegattaHeaderRaceRaces=Races
eventRegattaListAllBoatClasses=All boat classes
eventRegattaLeaderboardCompetitor=Competitor
eventRegattaLeaderboardExtendLeaderboard=Extend Leaderboard
eventRegattaLeaderboardFinishedMessage=No more races
eventRegattaLeaderboardLastScoreUpdate=Last Score Update
eventRegattaLeaderboardName=Name
eventRegattaLeaderboardRegattaRank=Regatta Rank
eventRegattaLeaderboardTotalPoints=Total Points
eventRegattaRaceWatch=Watch live
eventRegattaRaceAnalyse=Analyze Race
eventRegattaRaceNotTracked=Not Tracked
eventRegattaRaceFinished=Finished at:
eventRegattaRaceStarted=Started at:
eventRegattaRaceScheduled=Scheduled for:
eventRegattaRaceRace=Race
eventRegattaRaceWind=Wind Strength:
eventRegattaRaceWinner=Winner
eventRegattaRaceLeader=Leader
eventRegattaRacesLegendGps=Tracking
eventRegattaRacesLegendWind=Wind Data
eventRegattaRacesLegendVideo=Video
eventRegattaRacesLegendAudio=Audio
eventSponsorsTitle=Event Sponsorships
footerJobs=Jobs
footerCopyright=\u00A9 2015 SAP Sailing Analytics
footerLanguage=SAP Sailing in
footerLegal=Legal Disclosure
footerPrivacy=Privacy
footerFeedback=Feedback
headerEvents=Events
headerHome=Home
headerLogo=Sailing Analytics
headerSearch=Search
headerSearchPlaceholder=Search
headerSolutions=Solutions
headerSponsoring=Sponsoring
latestRaceResultsHeadline=Latest Official Race Results
latestRaceResultsIsNew=New
latestRaceResultsIsUpdated=Updated
latestRaceResultsRaceCountLabel=Result after
latestRaceResultsRaceCountUnit=races
latestRaceResultsRefresh=refresh
leaderboardQuickAccessLabel=Leaderboard Quick Access
mainEventShowAll=Show All Events
mainEventTitle=Latest Events from the Sailing World
mainMediaSubtitle=Get lost in the latest and most beautiful impressions from your favorite sailing event.
mainMediaTitle=Sailing loves Photography
mainMediaVideosSubtitle=Immerse yourself in the world of sailing and check out our latest events for more videos.
mainMediaVideosTitle=Recent Video Entries
mainSponsorsReadMore=Read More
mediaTeaserPhotosTitle=Photos
mediaTeaserVideosTitle=Videos
regattaCompetitors=Competitors
regattaRaces=Races
regattaTracked=Tracked
regattaRegattaStarts=Regatta will start
regattaPts=Pts.
regattaCourse=Course
regattaArea=Area
regattaFinishedAt=Finished at
regattaScheduledAt=Scheduled at
regattaStartedAt=Started at
regattasResultsTitle=Winner and Results
searchResultHeaderButton=Search
searchResultHeaderLabel=Your Search
searchResultsFound=result(s) found for
searchResultHeaderPlaceholder=Type in your searchkey
searchResultMore=More
searchResultSearch=Search
searchResultSearchAgain=Search again
searchResultSortLabel=Sort by
searchResultSortNewest=Recent
searchResultSortOldest=Oldest
searchResultSortRelevance=Relevance
searchResultCount=About 2,450 results where found for 'Schnitzel'
sharingEmail=Send an email
sharingFacebook=Share on Facebook
sharingTwitter=Tweet about it
socialFooterShare=Share this on
socialFooterTitle=Recommend SAP Sailing Analytics
# SOLUTIONS
solutionsSISHeadline=Компания SAP и парусный спорт
solutionsSAPHeadline=Инструмент аналитики парусного спорта от компании SAP
solutionsRaceHeadline=Менеджер регат SAP
solutionsPostHeadline=Пост-регатная аналитика
solutionsTrainingHeadline=Дневник тренировок
solutionsSimulatorHeadline=Тренажер стратегий
sapInSailing=Компания SAP и парусный спорт
contentSapInSailing1=Парусный спорт предоставляет отличную платформу для компании SAP, демонстрируя возможные решения и помогая этому виду спорта развиваться как никогда. Участие SAP в этом виде спорта изменило впечатления от занятий парусным спортом, предлагая средства, которые:
contentSapInSailing2=Помогают яхтсменам анализировать достижения и оптимизировать стратегию
contentSapInSailing3=Позволяют болельщикам быть ближе к действию
contentSapInSailing4=Обеспечивают СМИ информацией и аналитическими оценками для подачи более информативных комментариев
contentSapInSailing5=Компания SAP имеет давние связи с парусным спортом и ее серьезный портфолио включает сотрудничество с различными командами и регатами, например:
contentSapInSailing6=Официальный технологический партнер Travemьnder Woche
contentSapInSailing7=Технический партнер Европейских лиг парусного спорта
contentSapInSailing8=Генеральный спонсор экстремальной команды по парусному спорту
contentSapInSailing9=Официальный технический партнер экстремальной серии парусного спорта
contentSapInSailing10=Премиум-партнер национальной команды Германии по парусному спорту, Германская команда Audi по парусному спорту
contentSapInSailing11=Премиум-партнер крупнейшей регаты мира, Kieler Woche (Kiel Week)
contentSapInSailing12=Генеральный спонсор чемпионатов мира SAP 5O5
solutionsSAPText1=Предоставляя аналитические данные о рейтинге, скоростях, маневрах, координатах и т.п. регат в реальном времени, компания SAP помогает освещать сложный парусный спорт в более простой и доступной форме.
solutionsSAPText2=Инструмент аналитики парусного спорта от компании SAP предоставляет аналитическую информацию и транспарентность миру парусного спорта, используя Технологию облака и памяти, обрабатывая данные GPS и измерения ветра в реальном времени и визуализируя содержимое в различных внешних интерфейсах, доступных из любой точки мира.
solutionsRaceText=Приложение «Комитет регат» SAP предоставляет возможность организаторам регат действовать эффективнее и лучше управлять ситуацией путем автоматизаци и упрощения задач, которые они делают вручную, а также их общения во время проведения яхтенных регат. Приложение «Комитет регат» помогает улучшить проведение регат и управление ими, чтобы помочь комитетам регат работать с более полной отдачей.
solutionsPostText=Доступ к данным, собираемым во время мероприятий, связанных с парусным спортом, дает яхтсменам возможность оценить и проанализировать свои показатели, что поможет им разработать стратегии и улучшить свои показатели в парусном спорте.<br> Решения бизнес-аналитики от компании SAP предоставляют яхтсменам, тренерам, болельщикам и средствам массовой информации инструменты для просмотра и анализа архивных данных по многим регатам и гонкам. Платформа SAP HANA позволяет им узнать о типовых действиях, тенденциях и профилях яхтсменов просто, быстро и эффективно с целью оптимизации своих собственных достижений и разработки успешных стратегий для будущих регат.
solutionsTrainingText=Дневник тренировок STG поддерживает работу с ежедневной документацией и анализ физического состояния и тренировочных усилий спортсменов в таких областях как тренировки на воде, физические тренировки, практика хождения под парусом, психическая подготовка, теория, а также другие виды деятельности, такие как образование или путешествия.
solutionsSimulatorText=Выбор правильной стратегии может дать большое конкурентное преимущество во время гонки. Тренажер стратегий SAP упрощает определение лучшей стратегии хождения под парусом для различных ветровых режимов и водных течений. Поскольку ветер и течение в тренажере можно быстро изменять, надежность стратегии можно легко оценить даже в условиях изменчивой погоды.
sapSailingAnalytics=Инструмент аналитики парусного спорта от компании SAP
contentSapSailingAnalytics1=Предоставляя аналитические данные о рейтинге, скоростях, маневрах, координатах и т.п. регат в реальном времени, компания SAP помогает освещать сложный парусный спорт в более простой и доступной форме.
contentSapSailingAnalytics2=Инструмент аналитики парусного спорта от компании SAP предоставляет аналитическую информацию и транспарентность миру парусного спорта, используя Технологию облака и памяти, обрабатывая данные GPS и измерения ветра в реальном времени и визуализируя содержимое в различных внешних интерфейсах, доступных из любой точки мира.
sapSailingAnalyticsReadMore=Читать далее
sapSailingRaceManager=Менеджер регат SAP
contentSapSailingRaceManager=Менеджер регат SAP предоставляет возможность организаторам регат действовать эффективнее и лучше управлять ситуацией путем автоматизаци и упрощения задач, которые они делают вручную, а также их общения во время проведения яхтенных регат. Приложение «Комитет регат» помогает улучшить проведение регат и управление ими, чтобы помочь комитетам регат работать с более полной отдачей.
sapSailingRaceManagerReadMore=Читать далее
postRaceAnalytics=Пост-регатная аналитика
contentPostRaceAnalytics1=Доступ к данным собираемым во время мероприятий, связанных с парусным спортом, дает яхтсменам возможность оценить и проанализировать свои показатели, что поможет им разработать стратегии и улучшить свои показатели в парусном спорте.
contentPostRaceAnalytics2=Решения бизнес-аналитики от компании SAP предоставляют яхтсменам, тренерам, болельщикам и средствам массовой информации инструменты для просмотра и анализа архивных данных по многим регатам и гонкам. Платформа SAP HANA позволяет им узнать о типовых действиях, тенденциях и профилях яхтсменов просто, быстро и эффективно с целью оптимизации своих собственных достижений и разработки успешных стратегий для будущих регат.
i18nDeSolutionsTrainingHeadline=Инструмент от SAP "Улучши свои показатели в парусном спорте"– Дневник тренировок STG
i18nDeSolutionsTrainingText=Дневник тренировок STG поддерживает работу с ежедневной документацией и анализ физического состояния и тренировочных усилий спортсменов в таких областях как тренировки на воде, физические тренировки, практика хождения под парусом, психическая подготовка, теория, а также другие виды деятельности, такие как образование или путешествия.
strategySimulator=Тренажер стратегий
contentStrategySimulator=Выбор правильной стратегии может дать большое конкурентное преимущество во время гонки. Тренажер стратегий SAP упрощает определение лучшей стратегии хождения под парусом для различных ветровых режимов и водных течений. Поскольку ветер и течение в тренажере можно быстро изменять, надежность стратегии можно легко оценить даже в условиях изменчивой погоды.
strategySimulatorReadMore=Читать далее
@@ -167,18 +167,55 @@ sharingEmail=Send an email
sharingFacebook=Share on Facebook
sharingTwitter=Tweet about it
socialFooterTitle=Recommend SAP Sailing Analytics
solutionsSAPText1=By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing.
solutionsSAPText2=SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere.
solutionsRaceNav=Race Committee App
solutionsRaceHeadline=Race Committee App
solutionsRaceText=The SAP Race Committee App delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter.
solutionsPostNav=Post-Race Analytics
solutionsPostHeadline=Post-Race Analytics
solutionsPostText=Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.<br> SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas.
solutionsTrainingNav=Training Diary
solutionsTrainingHeadline=SAP Sail Better \u2013 STG Training Diary
solutionsTrainingText=The STG Training Diary supports the daily documentation and analysis of an athlete\u2019s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel.
solutionsSimulatorNav=Strategy Simulator
solutionsSimulatorHeadline=Strategy Simulator
solutionsSimulatorText=Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions.
# SOLUTIONS (解决方案)
solutionsSISHeadline=SAP 航海应用
solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsPostHeadline=赛后分析
solutionsTrainingHeadline=Training Diary
solutionsSimulatorHeadline=Strategy Simulator
sapInSailing=SAP 航海应用
contentSapInSailing1=Sailing 为 SAP 提供了一个理想的平台来展示解决方案,并以前所未有的方式进行这项运动。SAP 参与这项运动,并通过提供工具来改变航海体验,这些工具:
contentSapInSailing2=帮助水手分析性能和优化策略
contentSapInSailing3=让航海爱好者更近距离地感受这项运动
contentSapInSailing4=向媒体提供信息和见解,从而发表更明智的评论
contentSapInSailing5=SAP 长期参与航海运动,与多个团队和航海赛事建立了合作关系,包括:
contentSapInSailing6=Travemünder Woche 的官方技术合作伙伴
contentSapInSailing7=欧洲帆船联赛的技术合作伙伴
contentSapInSailing8=SAP 极限帆船队的冠名赞助商
contentSapInSailing9=极限帆船系列赛的官方技术合作伙伴
contentSapInSailing10=德国国家帆船队、德国奥迪帆船队的金牌合作伙伴
contentSapInSailing11=全球最大规模帆船比赛 Kieler Woche (Kiel Week) 的金牌合作伙伴
contentSapInSailing12=SAP 505 世界锦标赛冠名赞助商
solutionsSAPText1=通过对比赛排名、速度、策略、方位等进行实时分析,SAP 可以帮助简化和阐明航海运动的复杂性。
solutionsSAPText2=SAP Sailing Analytics 利用云和内存技术、实时处理 GPS 和风力测量数据,以及在可以从任意位置访问的各个前端上对内容进行可视化,提供对航海世界的见解和了解。
solutionsRaceText=SAP Race Committee 应用程序通过自动化和简化赛事组织者的手动任务并在举行帆船赛事期间实现沟通,为其提供了更高的效率和控制。Race Committee 应用程序有助于简化赛事的举行和管理,帮助赛事委员会更加智能地举办比赛。
solutionsPostText=访问帆船比赛中收集的数据让水手和教练有机会评估和分析其表现,从而有助于制定策略并在帆船赛事中发挥更高水平。 <br> SAP Business Analytics 解决方案为水手、教练、帆船爱好者和媒体提供了工具来浏览和评估多个季节和赛事的历史数据。 SAP HANA 平台能够以一种简单、快速、高效的方式让他们了解表现模式、趋势和水手资料,以优化其自身表现以及为今后的赛事制定成功策略。
solutionsTrainingText=STG Training Diary 支持在水上训练、体能训练、帆船作业、心理、理论以及培训或旅行等其他活动方面对运动员的体能情况和训练进行日常记录和分析。
solutionsSimulatorText=在帆船比赛中,选择正确的策略可以提供巨大的竞争优势。Strategy Simulator 简化了多种风力情况和水流下最佳航行策略的制定过程。由于风和水流在模拟中会随时改变,甚至可以针对不确定的天气条件来轻松评估策略的稳固性。
sapSailingAnalytics=SAP Sailing Analytics
contentSapSailingAnalytics1=通过对比赛排名、速度、策略、方位等进行实时分析,SAP 可以帮助简化和阐明航海运动的复杂性。
contentSapSailingAnalytics2=SAP Sailing Analytics 利用云和内存技术、实时处理 GPS 和风力测量数据,以及在可以从任意位置访问的各个前端上对内容进行可视化,提供对航海世界的见解和了解。
sapSailingAnalyticsReadMore=阅读更多
sapSailingRaceManager=SAP Sailing Race Manager
contentSapSailingRaceManager=SAP Sailing Race Manager 通过自动化和简化赛事组织者的手动任务并在举行帆船赛事期间实现沟通,为其提供了更高的效率和控制。Race Committee 应用程序有助于简化赛事的举行和管理,帮助赛事委员会更加智能地举办比赛。
sapSailingRaceManagerReadMore=了解更多
postRaceAnalytics=赛后分析
contentPostRaceAnalytics1=访问帆船比赛中收集的数据让水手有机会评估和分析其表现,从而有助于制定策略并在帆船赛事中发挥更高水平。
contentPostRaceAnalytics2=SAP Business Analytics 解决方案为水手、教练、帆船爱好者和媒体提供了工具来浏览和分析多个赛事的历史数据。 SAP HANA 平台能够以一种简单、快速、高效的方式让他们了解表现模式、趋势和水手资料,以优化其自身表现以及为今后的赛事制定成功策略。
i18nDeSolutionsTrainingHeadline=SAP Sail Better – STG Training Diary
i18nDeSolutionsTrainingText=STG Training Diary 支持在水上训练、体能训练、帆船作业、心理、理论以及培训或旅行等其他活动方面对运动员的体能情况和训练进行日常记录和分析。
strategySimulator=Strategy Simulator
contentStrategySimulator=在帆船比赛中,选择正确的策略可以提供巨大的竞争优势。Strategy Simulator 简化了多种风力情况和水流下最佳航行策略的制定过程。由于风和水流在模拟中会随时改变,甚至可以针对不确定的天气条件来轻松评估策略的稳固性。
strategySimulatorReadMore=了解更多
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Could not determine the version of your GWT SDK; using the module DTD
from GWT 1.6.4. You may want to change this. -->
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN" "http://gwtproject.org/doctype/2.7.0/gwt-module.dtd">
<module>
<inherits name='com.google.gwt.user.User' />
<inherits name="com.google.gwt.logging.Logging" />
<source path='client' />
</module>
@@ -0,0 +1,12 @@
package com.sap.sailing.gwt.dispatch.client;
import com.google.gwt.core.shared.GwtIncompatible;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.gwt.dispatch.client.exceptions.DispatchException;
public interface Action<R extends Result, CTX extends DispatchContext> extends IsSerializable {
@GwtIncompatible
R execute(CTX ctx) throws DispatchException;
}
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.shared.dispatch;
package com.sap.sailing.gwt.dispatch.client;
import java.util.Collection;
@@ -0,0 +1,10 @@
package com.sap.sailing.gwt.dispatch.client;
import com.google.gwt.user.client.rpc.IsSerializable;
/**
* Data transfer object marker interface used in generic transport results in dispatch action/ results
*/
public interface DTO extends IsSerializable {
}
@@ -0,0 +1,9 @@
package com.sap.sailing.gwt.dispatch.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface DispatchAsync<CTX extends DispatchContext> {
<R extends Result, A extends Action<R, CTX>> void execute(A action, AsyncCallback<R> callback);
}
@@ -0,0 +1,17 @@
package com.sap.sailing.gwt.dispatch.client;
import java.net.URL;
import javax.servlet.http.HttpServletRequest;
import com.google.gwt.core.shared.GwtIncompatible;
import com.sap.sailing.gwt.dispatch.client.exceptions.DispatchException;
public interface DispatchContext {
@GwtIncompatible
HttpServletRequest getRequest();
@GwtIncompatible
URL getRequestBaseURL() throws DispatchException;
}
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.shared.dispatch;
package com.sap.sailing.gwt.dispatch.client;
import java.util.ArrayList;
import java.util.Collection;
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.shared.dispatch;
package com.sap.sailing.gwt.dispatch.client;
import com.google.gwt.user.client.rpc.IsSerializable;
@@ -0,0 +1,49 @@
package com.sap.sailing.gwt.dispatch.client;
import com.sap.sailing.gwt.dispatch.client.caching.HasClientCacheTotalTimeToLive;
import com.sap.sse.common.Duration;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
public class ResultWithTTL<T extends DTO> implements Result, HasClientCacheTotalTimeToLive {
/** max millis the result might be loaded earlier so we do batches **/
public static final Duration MAX_TIME_TO_LOAD_EARLIER = Duration.ONE_SECOND.times(5);
/** Time to live*/
private Duration ttl;
private T dto;
@SuppressWarnings("unused")
private ResultWithTTL() {
}
public ResultWithTTL(long ttl, T dto) {
this(new MillisecondsDurationImpl(ttl), dto);
}
public ResultWithTTL(Duration ttl, T dto) {
this.ttl = ttl;
this.dto = dto;
}
public T getDto() {
return dto;
}
public Duration getTtl() {
return ttl;
}
public long getTtlMillis() {
return ttl.asMillis();
}
/**
* Reduce the total time to live value for cache by the time needed so the refresh manager can batch calls. Result
* will not be negative.
*/
@Override
public int cacheTotalTimeToLiveMillis() {
return (int) Math.max(0, getTtlMillis() - MAX_TIME_TO_LOAD_EARLIER.asMillis());
}
}
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.shared.dispatch;
package com.sap.sailing.gwt.dispatch.client;
import java.util.Date;
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.shared.dispatch;
package com.sap.sailing.gwt.dispatch.client;
import java.util.Collection;
import java.util.Set;
@@ -0,0 +1,32 @@
package com.sap.sailing.gwt.dispatch.client;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class StringsResult implements DTO, Result {
private ArrayList<String> values = new ArrayList<>();
public StringsResult() {
}
public StringsResult(Collection<String> values) {
this.values.addAll(values);
}
public void addValue(String value) {
if (value != null) {
this.values.add(value);
}
}
public List<String> getValues() {
return values;
}
public boolean isEmpty() {
return this.values.isEmpty();
}
}
@@ -1,22 +1,22 @@
package com.sap.sailing.gwt.home.shared.dispatch;
package com.sap.sailing.gwt.dispatch.client.batching;
import java.util.logging.Logger;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.gwt.ui.shared.dispatch.Action;
import com.sap.sailing.gwt.ui.shared.dispatch.BatchResult;
import com.sap.sailing.gwt.ui.shared.dispatch.NonBatchableAction;
import com.sap.sailing.gwt.ui.shared.dispatch.Result;
import com.sap.sailing.gwt.dispatch.client.Action;
import com.sap.sailing.gwt.dispatch.client.DispatchAsync;
import com.sap.sailing.gwt.dispatch.client.DispatchContext;
import com.sap.sailing.gwt.dispatch.client.Result;
public class AutomaticBatchingDispatch implements DispatchAsync {
public class AutomaticBatchingDispatch<CTX extends DispatchContext> implements DispatchAsync<CTX> {
private static final Logger LOG = Logger.getLogger(AutomaticBatchingDispatch.class.getName());
private final DispatchAsync executionContext;
private final DispatchAsync<CTX> executionContext;
private DispatchCallStack currentCallstack;
private DispatchCallStack<CTX> currentCallstack;
/**
* Creates a batching dispatch service using the given dispatch implementation.
@@ -27,7 +27,7 @@ public class AutomaticBatchingDispatch implements DispatchAsync {
* the underlying service implementation to use
*
*/
public AutomaticBatchingDispatch(DispatchAsync service) {
public AutomaticBatchingDispatch(DispatchAsync<CTX> service) {
this.executionContext = service;
}
@@ -36,13 +36,13 @@ public class AutomaticBatchingDispatch implements DispatchAsync {
* loop.
*/
@Override
public <R extends Result, A extends Action<R>> void execute(A action, AsyncCallback<R> callback) {
public <R extends Result, A extends Action<R, CTX>> void execute(A action, AsyncCallback<R> callback) {
if(action instanceof NonBatchableAction) {
executionContext.execute(action, callback);
return;
}
if (this.currentCallstack == null) {
this.currentCallstack = new DispatchCallStack();
this.currentCallstack = new DispatchCallStack<CTX>();
this.triggerExecution();
}
this.currentCallstack.addCall(action, callback);
@@ -55,11 +55,12 @@ public class AutomaticBatchingDispatch implements DispatchAsync {
*/
private void triggerExecution() {
Scheduler.get().scheduleFinally(new ScheduledCommand() {
@Override
public void execute() {
LOG.fine("executing batch callstack ");
final DispatchCallStack callStackInExecution = AutomaticBatchingDispatch.this.currentCallstack;
final DispatchCallStack<CTX> callStackInExecution = AutomaticBatchingDispatch.this.currentCallstack;
AutomaticBatchingDispatch.this.currentCallstack = null;
AutomaticBatchingDispatch.this.executionContext.execute(callStackInExecution.getBatchAction(),
new AsyncCallback<BatchResult>() {
@@ -77,6 +78,6 @@ public class AutomaticBatchingDispatch implements DispatchAsync {
});
}
});
};
}
}
@@ -1,36 +1,41 @@
package com.sap.sailing.gwt.ui.shared.dispatch;
package com.sap.sailing.gwt.dispatch.client.batching;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.gwt.core.shared.GwtIncompatible;
import com.sap.sailing.gwt.dispatch.client.Action;
import com.sap.sailing.gwt.dispatch.client.DispatchContext;
import com.sap.sailing.gwt.dispatch.client.Result;
import com.sap.sailing.gwt.dispatch.client.exceptions.DispatchException;
public class BatchAction implements Action<BatchResult> {
public class BatchAction<CTX extends DispatchContext> implements Action<BatchResult, CTX> {
private static final Logger logger = Logger.getLogger(BatchAction.class.getName());
private Action<?>[] actions;
private Action<?, CTX>[] actions;
@SuppressWarnings("unused")
private BatchAction() {
}
public BatchAction(Action<?>... actions) {
@SafeVarargs
public BatchAction(Action<?, CTX>... actions) {
this.actions = actions;
}
public Action<?>[] getActions() {
public Action<?, CTX>[] getActions() {
return actions;
}
@Override
@GwtIncompatible
public BatchResult execute(DispatchContext ctx) throws DispatchException {
public BatchResult execute(CTX ctx) throws DispatchException {
final int nrOfActions = getActions().length;
final ArrayList<Result> results = new ArrayList<Result>(nrOfActions);
final ArrayList<DispatchException> exceptions = new ArrayList<DispatchException>(nrOfActions);
for (Action<?> a : getActions()) {
for (Action<?, CTX> a : getActions()) {
Result result = null;
long start = System.currentTimeMillis();
try {
@@ -1,9 +1,12 @@
package com.sap.sailing.gwt.ui.shared.dispatch;
package com.sap.sailing.gwt.dispatch.client.batching;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import com.sap.sailing.gwt.dispatch.client.Result;
import com.sap.sailing.gwt.dispatch.client.exceptions.DispatchException;
public class BatchResult implements Result {
private LinkedList<Result> results = new LinkedList<Result>();
@@ -1,14 +1,15 @@
package com.sap.sailing.gwt.home.shared.dispatch;
package com.sap.sailing.gwt.dispatch.client.batching;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.gwt.ui.shared.dispatch.Action;
import com.sap.sailing.gwt.ui.shared.dispatch.Result;
import com.sap.sailing.gwt.dispatch.client.Action;
import com.sap.sailing.gwt.dispatch.client.DispatchContext;
import com.sap.sailing.gwt.dispatch.client.Result;
/**
* The convenience class wrapping an synchronous call.
*
*/
public final class DispatchCall<A extends Action<R>, R extends Result> {
public final class DispatchCall<A extends Action<R, CTX>, R extends Result, CTX extends DispatchContext> {
private final A action;
@@ -19,7 +20,7 @@ public final class DispatchCall<A extends Action<R>, R extends Result> {
this.callback = callback;
}
public Action<?> getAction() {
public Action<?, CTX> getAction() {
return action;
}
Loaded 100 of 679 files, more files were not shown because too many files have changed in this diff. Show more