Merge remote-tracking branch 'origin/master' into dataMining
No files matched your search
@@ -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="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" path="1" type="4"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.dashboards.gwt"/> </runtimeClasspathEntry> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-servlet.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-user.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.moxieapps.gwt.highcharts/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt.adminconsole/src" path="3" type="2"/> "/>
|
||||
</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 "${project_loc:com.sap.sailing.dashboards.gwt}" -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" path="1" type="4"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.dashboards.gwt"/> </runtimeClasspathEntry> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-servlet.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-user.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.moxieapps.gwt.highcharts/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt.adminconsole/src" path="3" type="2"/> "/>
|
||||
</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 "${project_loc:com.sap.sailing.dashboards.gwt}" -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" path="1" type="4"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.dashboards.gwt"/> </runtimeClasspathEntry> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-servlet.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-user.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.moxieapps.gwt.highcharts/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt.adminconsole/src" path="3" type="2"/> "/>
|
||||
</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 "${project_loc:com.sap.sailing.dashboards.gwt}" -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" path="1" type="4"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.dashboards.gwt"/> </runtimeClasspathEntry> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-servlet.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-user.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.moxieapps.gwt.highcharts/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt.adminconsole/src" path="3" type="2"/> "/>
|
||||
</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 "${project_loc:com.sap.sailing.dashboards.gwt}" -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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
|
||||
|
||||
@@ -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 "${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work" -war "${project_loc:com.sap.sailing.gwt.ui}" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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 "${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work" -war "${project_loc:com.sap.sailing.gwt.ui}" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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>
|
||||
@@ -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>
|
||||
|
||||
|
After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 270 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 233 KiB After Width: | Height: | Size: 187 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
Before Width: | Height: | Size: 286 KiB After Width: | Height: | Size: 311 KiB |
|
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 |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 179 KiB |
|
After Width: | Height: | Size: 162 KiB |
|
After Width: | Height: | Size: 281 KiB |
|
After Width: | Height: | Size: 612 KiB |
@@ -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;
|
||||
}
|
||||
|
||||