Merge branch 'master' of ssh://sapsailing.com/home/trac/git into bug4104

This commit is contained in:
RobinFleige committed 2018-09-13 15:04:17 +02:00
commit ec60c3d679
74 files changed
+2042 -569

No files matched your search

@@ -1,51 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.gwtplugins.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.gwtplugins.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.gwtplugins.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9875"/>
<listAttribute key="com.gwtplugins.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
<stringAttribute key="com.gwtplugins.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.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10; &lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.github.branflake2267.gwt-maps-api/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.ajaxloader/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.gwtplugins.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-nosuperDevMode -logLevel INFO -noserver -incremental -war &quot;${project_loc:com.sap.sailing.dashboards.gwt}&quot; -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -codeServerPort 9875 -startupUrl /dashboards/RibDashboard.html 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="-XX:+UseG1GC -XX:+UseStringDeduplication -Dgwt.watchFileChanges=false -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.gwtplugins.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9875"/>
<listAttribute key="com.gwtplugins.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
<stringAttribute key="com.gwtplugins.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.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10; &lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.github.branflake2267.gwt-maps-api/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.ajaxloader/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.gwtplugins.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-nosuperDevMode -logLevel INFO -noserver -incremental -war &quot;${project_loc:com.sap.sailing.dashboards.gwt}&quot; -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -codeServerPort 9875 -startupUrl /dashboards/RibDashboard.html 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="-XX:+UseG1GC -XX:+UseStringDeduplication -Dgwt.watchFileChanges=false -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work"/>
</launchConfiguration>
@@ -1,52 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.gwtplugins.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.gwtplugins.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.gwtplugins.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9875"/>
<listAttribute key="com.gwtplugins.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
<booleanAttribute key="com.gwtplugins.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
<stringAttribute key="com.gwtplugins.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.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10; &lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.github.branflake2267.gwt-maps-api/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.ajaxloader/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.gwtplugins.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-logLevel INFO -noserver -incremental -war &quot;${project_loc:com.sap.sailing.dashboards.gwt}&quot; -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -codeServerPort 9875 -startupUrl /dashboards/RibDashboard.html 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="-XX:+UseG1GC -XX:+UseStringDeduplication -Dgwt.watchFileChanges=false -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.gwtplugins.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9875"/>
<listAttribute key="com.gwtplugins.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
<booleanAttribute key="com.gwtplugins.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
<stringAttribute key="com.gwtplugins.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.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#13;&#10; &lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&quot;/&gt;&#13;&#10;&lt;/runtimeClasspathEntry&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.github.branflake2267.gwt-maps-api/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.ajaxloader/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#13;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.gwtplugins.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-logLevel INFO -noserver -incremental -war &quot;${project_loc:com.sap.sailing.dashboards.gwt}&quot; -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -codeServerPort 9875 -startupUrl /dashboards/RibDashboard.html 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="-XX:+UseG1GC -XX:+UseStringDeduplication -Dgwt.watchFileChanges=false -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work"/>
</launchConfiguration>
View File
File mode changed.
@@ -85,7 +85,7 @@ class RaceLogTrackingInvitationMailBuilder {
}
RaceLogTrackingInvitationMailBuilder addEventLogo(final Event event) {
final List<ImageDescriptor> imagesWithTag = event.findImagesWithTag(MediaTagConstants.LOGO);
final List<ImageDescriptor> imagesWithTag = event.findImagesWithTag(MediaTagConstants.LOGO.getName());
if (imagesWithTag != null && !imagesWithTag.isEmpty()) {
final ImageDescriptor imageDescriptor = imagesWithTag.get(0);
final String logoUrl = imageDescriptor.getURL().toString();
@@ -309,11 +309,11 @@ public abstract class EventBaseImpl implements EventBase {
ImageDescriptor image = migrateImageURLtoImage(url, getStartDate(), imageSizes.get(url));
String urlAsString = url.toString();
if (urlAsString.toLowerCase().indexOf("stage") > 0) {
image.addTag(MediaTagConstants.STAGE);
image.addTag(MediaTagConstants.STAGE.getName());
} else if (urlAsString.toLowerCase().indexOf("eventteaser") > 0) {
image.addTag(MediaTagConstants.TEASER);
image.addTag(MediaTagConstants.TEASER.getName());
} else {
image.addTag(MediaTagConstants.GALLERY);
image.addTag(MediaTagConstants.GALLERY.getName());
}
addImage(image);
changed = true;
@@ -322,7 +322,7 @@ public abstract class EventBaseImpl implements EventBase {
for (URL url : sponsorImageURLs) {
if (!hasMedia(images, url)) {
ImageDescriptor image = migrateImageURLtoImage(url, getStartDate(), imageSizes.get(url));
image.addTag(MediaTagConstants.SPONSOR);
image.addTag(MediaTagConstants.SPONSOR.getName());
addImage(image);
changed = true;
}
@@ -330,7 +330,7 @@ public abstract class EventBaseImpl implements EventBase {
if (logoImageURL != null && !hasMedia(images, logoImageURL)) {
ImageDescriptor image = migrateImageURLtoImage(logoImageURL, getStartDate(), imageSizes.get(logoImageURL));
image.addTag(MediaTagConstants.LOGO);
image.addTag(MediaTagConstants.LOGO.getName());
addImage(image);
changed = true;
}
@@ -0,0 +1,41 @@
package com.sap.sailing.domain.swisstimingadapter.impl;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.UnknownHostException;
import java.text.ParseException;
import java.util.Collection;
import org.junit.Test;
import com.sap.sailing.domain.swisstimingadapter.Fix;
import com.sap.sailing.domain.swisstimingadapter.RaceStatus;
import com.sap.sailing.domain.swisstimingadapter.RacingStatus;
import com.sap.sailing.domain.swisstimingadapter.SailMasterAdapter;
import com.sap.sailing.domain.swisstimingadapter.SailMasterListener;
import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage;
import com.sap.sse.common.Distance;
import com.sap.sse.common.TimePoint;
public class RPDMessageParsingTest {
@Test
public void parseRPDMessage() throws InterruptedException, ParseException, UnknownHostException, IOException {
final String rpdMessage = "RPD|8aaa6db1-2084-4067-bf0b-2c24481b42da|2,|2018-09-13T15:06:39+09:00|14:50:00|00:16:39|2|315|97|03a52cb2-8a24-49d7-aebb-7e760be763a3;5;0;35.284932;139.516334;0.0;;;270;;;;;|0a66267e-3551-48e8-9872-adee288ceea4;5;229;35.287947;139.524639;0.8;;;312;;;;;|0b9e8236-f163-478e-8db9-67a4439db253;5;0;35.242476;139.5462;0.2;;;90;;;;;|0f06f40f-09de-49f6-9024-69aca52e387b;5;0;35.250663;139.556997;0.2;;;39;;;;;|0f1a7451-d242-4e8f-90b1-b00585356c0e;3;0;35.240411;139.546359;0.0;;;203;;;;;|0f519aeb-fb96-422b-83c9-6018dead3d22;3;0;35.247031;139.512632;0.4;;;296;;;;;|118d1ea9-ff87-4591-89d9-6cc58a5251d1;3;0;35.286932;139.511812;0.8;;;306;;;;;|152ae7ba-930a-43d2-a1dd-89e6ff60a3d0;3;0;35.241575;139.537837;0.2;;;158;;;;;|16fa57f0-10f4-4ac8-8fc0-4b8c875ebd33;5;0;35.256665;139.519313;1.0;;;64;;;;;|1db8195b-f5e2-4df1-af6d-e87386d224b9;5;0;35.290532;139.517897;0.6;;;270;;;;;|1ebbc2d1-78ed-420f-beec-9fad8fd5daa4;5;0;35.293927;139.511108;0.6;;;337;;;;;|1f32b277-ad3a-4ca7-9323-bc4458b971b7;5;0;35.28621;139.517586;0.6;;;291;;;;;|23fe9e60-7a93-4d58-b5a0-b73e51fff893;3;0;35.291366;139.495241;0.0;;;124;;;;;|244c5fc7-bf67-46e0-a6f1-d4d052c873be;5;0;35.243593;139.537314;0.4;;;360;;;;;|26229b56-4775-4a96-a611-a7e1de9781fd;5;0;35.299624;139.483962;0.0;;;219;;;;;|32f27c17-4c23-4770-973f-190cf08d6aa8;5;0;35.248049;139.54433;3.9;;;231;;;;;|35e389df-91df-4002-831b-7687d53e0ae5;5;0;35.274886;139.537612;2.1;;;123;;;;;|39217d61-9712-4e2b-b273-46cb3dfe67b9;5;0;35.290478;139.517889;0.6;;;287;;;;;|3ab16d2e-3913-4eee-94d7-ba0b5ea6ba6e;5;0;35.288054;139.512915;0.2;;;248;;;;;|3b1d3b5e-6076-48d4-ac25-6af78653d25c;5;;;;;;;;;;;;|3d1dae40-7b67-4c91-b96b-cd64323e7729;3;0;35.270134;139.529297;0.0;;;138;;;;;|3ffa6395-9c48-4778-8435-23941f1468b5;3;0;35.271402;139.528498;2.1;;;75;;;;;|43c0afca-4541-407e-a838-62b0b9c6107a;5;0;35.243898;139.536739;0.4;;;203;;;;;|4949c1bc-1a64-41e7-aac0-1755e1475654;5;0;35.259178;139.493608;0.4;;;301;;;;;|4fea8d8c-7f82-480c-9be6-54b156835be3;3;57;35.255563;139.48385;0.0;;;141;;;;;|5221ccc9-a2c6-488e-a997-14b3011ea690;5;0;35.270109;139.529213;0.0;;;202;;;;;|5ab4c57a-8f62-49da-98f7-1a3b55d3aef4;3;82;35.287856;139.495553;0.0;;;90;;;;;|5edd2a5c-60dc-452d-8531-351b28c9da47;5;0;35.259076;139.493317;2.7;;;112;;;;;|5f2be0cf-c409-4cd5-8c6f-73ec04c74cec;5;0;35.288788;139.496593;0.4;;;300;;;;;|61510f24-5a80-4495-aade-6e6dfb97cff0;5;618;35.261148;139.494548;1.4;;;226;;;;;|64bc1273-8aab-4ef1-8bf9-748ccc40f2d5;5;0;35.256647;139.519281;1.2;;;68;;;;;|65fa9055-0e4f-406b-8cdb-9da6a31fbfef;5;0;35.287871;139.523833;0.6;;;248;;;;;|66733af1-355b-4b2d-863d-3cbcae89cb22;5;0;35.290807;139.507125;0.4;;;90;;;;;|6a52394f-3f3f-4a36-98ef-bbcdf623c0e1;5;0;35.250647;139.556728;0.4;;;270;;;;;|6ee5589d-79ce-4a39-93fe-6571d68a94fd;5;9042;35.252182;139.546278;11.7;;;130;;;;;|7721940e-6ae6-4157-8c42-8eb22b5ae58f;3;0;35.255564;139.483859;0.2;;;90;;;;;|81de4f19-0e37-419e-82eb-d369a040ee7c;5;0;35.284915;139.516334;0.0;;;90;;;;;|844cc0c6-e73d-41f6-9d80-5151f6878cde;5;0;35.284906;139.516346;0.0;;;270;;;;;|85fadddc-983c-4254-9273-4a1ad73b5731;5;0;35.288784;139.49661;0.4;;;270;;;;;|8b892963-e078-40ff-b6a4-67b87bdc4855;5;0;35.253099;139.51882;0.2;;;360;;;;;|922f94be-7724-4004-9d24-6a5eb7286099;5;83;35.287871;139.524114;0.6;;;238;;;;;|93926478-f928-432c-901d-431003ef0f18;5;0;35.290555;139.517883;0.6;;;270;;;;;|98e428d2-a181-4162-9060-ebdb4313cb2a;5;0;35.28807;139.512915;0.2;;;239;;;;;|9a3298d4-b405-429e-8170-9dacada0bfba;5;0;35.271545;139.529741;0.2;;;360;;;;;|9cc93765-02c2-4f5f-ad9f-14e469d4874d;3;0;35.247147;139.513394;0.0;;;321;;;;;|9d4263f5-52e6-4dcd-94c6-9ae841d06c76;3;0;35.286935;139.511785;0.6;;;270;;;;;|a03b195b-cf20-4e52-8d05-68717adea11e;3;0;35.284925;139.516377;0.0;;;90;;;;;|a3005701-0870-45cc-84db-3b678afc3a23;3;0;35.287403;139.515162;0.0;;;90;;;;;|a3269b48-739c-497e-846a-3be163457320;3;0;35.270132;139.529265;0.0;;;143;;;;;|a46cc3c5-a142-424e-9b0a-e8bdcb82f813;3;0;35.247431;139.5111;0.4;;;339;;;;;|b2ec920a-8192-4c4b-a58c-0b2e43f6e9f4;3;0;35.254888;139.484122;0.2;;;90;;;;;|b55cc804-3a74-4db4-9ed0-b0b2e931b24f;5;0;35.271023;139.530127;0.2;;;90;;;;;|c1515836-34e1-4ba6-b3bd-1edda4659d3b;5;0;35.299634;139.483991;0.0;;;360;;;;;|c4e9491d-aa36-4e20-aacf-9b4cfa3df61d;5;0;35.248233;139.512246;0.6;;;90;;;;;|ca028761-bec6-4513-9f00-e0fef2b3d606;3;273;35.271139;139.528568;0.6;;;321;;;;;|ca84e3c3-b991-4025-a24f-903135d4a7e5;3;0;35.245991;139.548126;2.5;;;222;;;;;|cf5af8a8-fe68-48b8-9dde-29b5ba8dc073;5;0;35.286219;139.517599;0.6;;;292;;;;;|cf76e9a5-8244-41f3-987a-bef529c48a74;5;0;35.250647;139.557105;0.2;;;270;;;;;|d37712aa-62b8-498d-8970-ea9a8e859ab1;3;12;35.285947;139.496245;1.2;;;81;;;;;|d4348384-01fc-40ed-818d-f7375a187e4f;5;0;35.248715;139.511822;0.0;;;244;;;;;|de02144b-771e-49ea-bc2f-f52d3d22a3dd;3;0;35.254877;139.484061;0.2;;;270;;;;;|df78084b-e9bc-475c-a418-48a5cc4d992f;5;0;35.277041;139.540017;0.6;;;143;;;;;|dfa00db0-3fa0-4524-a468-2d9d7b45a150;5;0;35.290436;139.507;0.6;;;22;;;;;|e1dbea90-bc68-4798-b3d6-c7d3bbc8bbd0;3;0;35.241517;139.53Line truncated
final SailMasterMessage message = new SailMasterMessageImpl(rpdMessage);
final SailMasterConnectorImpl connector = new SailMasterConnectorImpl(/* host */ "8.8.8.8", /* port */ 443, /* raceId */ null, /* raceName */ null, /* raceDescription */ null, /* boatClass */ null);
final boolean[] receivedPositionData = new boolean[1];
final SailMasterListener listener = new SailMasterAdapter() {
@Override
public void receivedRacePositionData(String raceID, RaceStatus raceStatus, RacingStatus racingStatus,
TimePoint timePoint, TimePoint startTime, Long millisecondsSinceRaceStart,
Integer nextMarkIndexForLeader, Distance distanceToNextMarkForLeader, Collection<Fix> fixes) {
receivedPositionData[0] = true;
}
};
connector.addSailMasterListener(listener);
connector.notifyListeners(message); // ensure that this works without exception
connector.stop();
assertTrue(receivedPositionData[0]);
}
}
@@ -45,7 +45,7 @@ public interface SailMasterConnector {
* Adds the listener and ensures that the connector is actually connected, even if no request has explicitly
* been sent, so that the connector will at least receive spontaneous events.
*/
void addSailMasterListener(SailMasterListener listener) throws UnknownHostException, IOException, InterruptedException;
void addSailMasterListener(SailMasterListener listener);
void removeSailMasterListener(SailMasterListener listener) throws IOException;
@@ -391,12 +391,16 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement
final boolean postVersion1_0 = sections[9+i].split(";", -1).length >= 14;
if (fixSections.length > 2) {
final String trackedObjectIdAsString = fixSections[fixDetailIndex++].trim();
if (trackedObjectIdAsString != null && !trackedObjectIdAsString.isEmpty()) {
if (trackedObjectIdAsString != null && !trackedObjectIdAsString.trim().isEmpty()) {
final TrackerType trackerType = TrackerType.values()[Integer.valueOf(fixSections[fixDetailIndex++])];
final Long ageOfDataInMilliseconds = 1000l * Long.valueOf(fixSections[fixDetailIndex++]);
final Position position = new DegreePosition(Double.valueOf(fixSections[fixDetailIndex++]),
Double.valueOf(fixSections[fixDetailIndex++]));
final Double speedOverGroundInKnots = Double.valueOf(fixSections[fixDetailIndex++]);
final String ageOfDataInMillisAsString = fixSections[fixDetailIndex++];
final Long ageOfDataInMilliseconds = ageOfDataInMillisAsString==null || ageOfDataInMillisAsString.trim().isEmpty() ? null : (1000l * Long.valueOf(ageOfDataInMillisAsString));
final String latDegAsString = fixSections[fixDetailIndex++];
final String lngDegAsString = fixSections[fixDetailIndex++];
final Position position = latDegAsString==null || latDegAsString.trim().isEmpty() || lngDegAsString==null || lngDegAsString.trim().isEmpty() ? null :
new DegreePosition(Double.valueOf(latDegAsString), Double.valueOf(lngDegAsString));
final String sogInKnotsAsString = fixSections[fixDetailIndex++];
final Double speedOverGroundInKnots = sogInKnotsAsString==null || sogInKnotsAsString.trim().isEmpty() ? null : Double.valueOf(sogInKnotsAsString);
final int alsIndex = postVersion1_0 ? fixDetailIndex+1 : fixDetailIndex;
final int vmgIndex = postVersion1_0 ? fixDetailIndex : fixDetailIndex+1;
final Speed averageSpeedOverGround = fixSections[alsIndex].trim().length() == 0 ? null
@@ -404,9 +408,10 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement
final Speed velocityMadeGood = fixSections[vmgIndex].trim().length() == 0 ? null : new KnotSpeedImpl(
Double.valueOf(fixSections[vmgIndex]));
fixDetailIndex += 2;
final AbstractBearing cog = new DegreeBearingImpl(
Double.valueOf(fixSections[fixDetailIndex++]));
final SpeedWithBearing speed = new KnotSpeedWithBearingImpl(speedOverGroundInKnots, cog);
final String cogAsString = fixSections[fixDetailIndex++];
final AbstractBearing cog = cogAsString==null || cogAsString.trim().isEmpty() ? null :
new DegreeBearingImpl(Double.valueOf(cogAsString));
final SpeedWithBearing speed = speedOverGroundInKnots == null || cog == null ? null : new KnotSpeedWithBearingImpl(speedOverGroundInKnots, cog);
final Integer nextMarkIndex = fixSections.length <= fixDetailIndex
|| fixSections[fixDetailIndex].trim().length() == 0 ? null : Integer
.valueOf(fixSections[fixDetailIndex]);
@@ -475,7 +480,7 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement
}
@Override
public void addSailMasterListener(SailMasterListener listener) throws UnknownHostException, IOException, InterruptedException {
public void addSailMasterListener(SailMasterListener listener) {
synchronized (listeners) {
listeners.add(listener);
}
@@ -28,7 +28,7 @@ public class VideoNode extends FiresPlaceNode {
public void onStart() {
EventDTO event = cf.getAutoPlayCtxSignalError().getEvent();
List<VideoDTO> videos = event.getVideos().stream().filter(v -> v.hasTag(MediaTagConstants.BIGSCREEN))
List<VideoDTO> videos = event.getVideos().stream().filter(v -> v.hasTag(MediaTagConstants.BIGSCREEN.getName()))
.collect(Collectors.toList());
if (videos.size() == 0) {
lastPlayed = -1;
@@ -80,9 +80,9 @@ public class IdleUpNextPresenterImpl extends AutoPlayPresenterConfigured<IdleUpN
List<SafeUri> bigScreenImages = new ArrayList<>();
for (ImageDTO imageDTO : getSlideCtx().getEvent().getImages()) {
final List<String> tags = imageDTO.getTags();
if (tags.contains(MediaTagConstants.BIGSCREEN)) {
if (tags.contains(MediaTagConstants.BIGSCREEN.getName())) {
bigScreenImages.add(UriUtils.fromString(imageDTO.getSourceRef()));
} else if (tags.contains(MediaTagConstants.TEASER) || tags.contains(MediaTagConstants.HIGHLIGHT)) {
} else if (tags.contains(MediaTagConstants.TEASER.getName()) || tags.contains(MediaTagConstants.HIGHLIGHT.getName())) {
teaserHighlight.add(UriUtils.fromString(imageDTO.getSourceRef()));
}
}
@@ -84,11 +84,11 @@ public class IdlePreEventPresenterImpl extends AutoPlayPresenterConfigured<IdleP
List<ImageDTO> teaserHighlight = new ArrayList<>();
List<ImageDTO> bigScreenImages = new ArrayList<>();
for (ImageDTO imageDTO : getSlideCtx().getEvent().getImages()) {
if (imageDTO.getTags().contains(MediaTagConstants.BIGSCREEN)) {
if (imageDTO.getTags().contains(MediaTagConstants.BIGSCREEN.getName())) {
bigScreenImages.add(imageDTO);
} else if (imageDTO.getTags().contains(MediaTagConstants.TEASER)) {
} else if (imageDTO.getTags().contains(MediaTagConstants.TEASER.getName())) {
teaserHighlight.add(imageDTO);
} else if (imageDTO.getTags().contains(MediaTagConstants.HIGHLIGHT)) {
} else if (imageDTO.getTags().contains(MediaTagConstants.HIGHLIGHT.getName())) {
teaserHighlight.add(imageDTO);
}
}
@@ -58,7 +58,7 @@ public class GetEventViewAction implements SailingAction<EventViewDTO>, IsClient
final EventViewDTO dto = new EventViewDTO();
HomeServiceUtil.mapToMetadataDTO(event, dto, context.getRacingEventService());
ImageDescriptor logoImage = event.findImageWithTag(MediaTagConstants.LOGO);
ImageDescriptor logoImage = event.findImageWithTag(MediaTagConstants.LOGO.getName());
dto.setLogoImage(logoImage != null ? HomeServiceUtil.convertToImageDTO(logoImage) : null);
dto.setOfficialWebsiteURL(event.getOfficialWebsiteURL() == null ? null : event.getOfficialWebsiteURL().toString());
URL sailorsInfoWebsiteURL = event.getSailorsInfoWebsiteURLOrFallback(context.getClientLocale());
@@ -79,7 +79,7 @@ public class GetEventOverviewStageAction implements SailingAction<ResultWithTTL<
@GwtIncompatible
public EventOverviewStageContentDTO getStageContent(SailingDispatchContext context, Event event, EventState state, TimePoint now) {
// P1: Featured video if available
List<String> videoTags = Collections.singletonList(MediaTagConstants.FEATURED);
List<String> videoTags = Collections.singletonList(MediaTagConstants.FEATURED.getName());
VideoDescriptor featuredVideo = HomeServiceUtil.getStageVideo(event, context.getClientLocale(), videoTags , false);
if (featuredVideo != null) {
return new EventOverviewVideoStageDTO(EventOverviewVideoStageDTO.Type.MEDIA,
@@ -51,7 +51,7 @@ public class GetEventSeriesViewAction implements SailingAction<EventSeriesViewDT
EventSeriesViewDTO dto = new EventSeriesViewDTO();
dto.setId(id);
ImageDescriptor logoImage = o.findImageWithTag(MediaTagConstants.LOGO);
ImageDescriptor logoImage = o.findImageWithTag(MediaTagConstants.LOGO.getName());
dto.setLogoImage(logoImage != null ? HomeServiceUtil.convertToImageDTO(logoImage) : null);
// TODO implement correctly. We currently do not show media for series.
dto.setHasMedia(false);
@@ -9,7 +9,7 @@ import com.sap.sailing.gwt.home.communication.SailingDispatchContext;
import com.sap.sailing.gwt.home.communication.event.EventLinkDTO;
import com.sap.sailing.gwt.home.communication.event.EventReferenceDTO;
import com.sap.sailing.gwt.server.HomeServiceUtil;
import com.sap.sailing.gwt.ui.shared.media.MediaConstants;
import com.sap.sse.common.media.MediaTagConstants;
import com.sap.sse.common.media.MimeType;
import com.sap.sse.gwt.dispatch.shared.caching.IsClientCacheable;
import com.sap.sse.gwt.dispatch.shared.exceptions.DispatchException;
@@ -63,7 +63,7 @@ public class GetMediaForEventAction implements SailingAction<MediaDTO>, IsClient
}
for (VideoDescriptor video : event.getVideos()) {
MimeType type = video.getMimeType();
if (MediaConstants.SUPPORTED_VIDEO_TYPES.contains(type)) {
if (MediaTagConstants.SUPPORTED_VIDEO_TYPES.contains(type)) {
SailingVideoDTO videoDTO = HomeServiceUtil.toSailingVideoDTO(eventRef, video);
media.addVideo(videoDTO);
}
@@ -10,8 +10,8 @@ public class SailingImageDTO extends ImageDTO {
private EventLinkDTO eventLink;
@Deprecated
protected SailingImageDTO() {
super();
}
public SailingImageDTO(EventLinkDTO eventLink, String imageRef, Date createdAtDate) {
@@ -12,6 +12,7 @@ public class SailingVideoDTO extends VideoDTO {
private EventReferenceDTO eventRef;
/** for GWT */
@Deprecated
protected SailingVideoDTO() {
}
@@ -19,9 +19,9 @@ import com.sap.sailing.gwt.server.EventHolder;
import com.sap.sailing.gwt.server.EventStageCandidateCalculator;
import com.sap.sailing.gwt.server.HomeServiceUtil;
import com.sap.sailing.gwt.server.RecentEventsCalculator;
import com.sap.sailing.gwt.ui.shared.media.MediaConstants;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.media.MediaTagConstants;
import com.sap.sse.common.media.MimeType;
import com.sap.sse.gwt.dispatch.shared.caching.IsClientCacheable;
import com.sap.sse.shared.media.ImageDescriptor;
@@ -63,7 +63,7 @@ public class GetStartViewAction implements SailingAction<StartViewDTO>, IsClient
if (!Util.isEmpty(videosOfEvent) && result.getVideos().size() < MAX_VIDEO_COUNT) {
VideoDescriptor youTubeRandomUrl = HomeServiceUtil.getRandomVideo(videosOfEvent);
MimeType type = youTubeRandomUrl.getMimeType();
if (MediaConstants.SUPPORTED_VIDEO_TYPES.contains(type)) {
if (MediaTagConstants.SUPPORTED_VIDEO_TYPES.contains(type)) {
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, youTubeRandomUrl.getURL().toString(), type,
youTubeRandomUrl.getCreatedAtDate().asDate());
candidate.setTitle(holder.event.getName());
@@ -91,7 +91,7 @@ public class GetStartViewAction implements SailingAction<StartViewDTO>, IsClient
}
for (VideoDescriptor videoUrl : event.getVideos()) {
MimeType type = videoUrl.getMimeType();
if (MediaConstants.SUPPORTED_VIDEO_TYPES.contains(type)) {
if (MediaTagConstants.SUPPORTED_VIDEO_TYPES.contains(type)) {
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, videoUrl.getURL().toString(), type, //
videoUrl.getCreatedAtDate().asDate()
);
@@ -38,7 +38,6 @@ import com.sap.sailing.gwt.home.communication.eventlist.EventListEventDTO;
import com.sap.sailing.gwt.home.communication.media.SailingVideoDTO;
import com.sap.sailing.gwt.home.communication.start.EventStageDTO;
import com.sap.sailing.gwt.home.communication.start.StageEventType;
import com.sap.sailing.gwt.ui.shared.media.MediaConstants;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.util.EventUtil;
import com.sap.sse.common.TimePoint;
@@ -123,11 +122,11 @@ public final class HomeServiceUtil {
}
private static ImageDescriptor findEventThumbnailImage(EventBase event) {
return event.findImageWithTag(MediaTagConstants.TEASER);
return event.findImageWithTag(MediaTagConstants.TEASER.getName());
}
public static ImageDescriptor getFeaturedImage(EventBase event) {
return event.findImageWithTag(MediaTagConstants.FEATURED);
return event.findImageWithTag(MediaTagConstants.FEATURED.getName());
}
public static String getFeaturedImageUrlAsString(EventBase event) {
@@ -141,7 +140,7 @@ public final class HomeServiceUtil {
}
public static ImageDescriptor getStageImage(final EventBase event) {
return event.findImageWithTag(MediaTagConstants.STAGE);
return event.findImageWithTag(MediaTagConstants.STAGE.getName());
}
public static List<String> getPhotoGalleryImageURLsAsString(EventBase event) {
@@ -154,14 +153,14 @@ public final class HomeServiceUtil {
}
public static List<ImageDescriptor> getPhotoGalleryImages(EventBase event) {
return event.findImagesWithTag(MediaTagConstants.GALLERY);
return event.findImagesWithTag(MediaTagConstants.GALLERY.getName());
}
public static List<ImageDescriptor> getSailingLovesPhotographyImages(EventBase event) {
final List<ImageDescriptor> acceptedImages = new LinkedList<>();
for (ImageDescriptor candidateImageUrl : event.getImages()) {
if (candidateImageUrl.hasSize() && candidateImageUrl.getHeightInPx() > MINIMUM_IMAGE_HEIGHT_FOR_SAILING_PHOTOGRAPHY_IN_PIXELS) {
if (candidateImageUrl.hasTag(MediaTagConstants.STAGE) || candidateImageUrl.hasTag(MediaTagConstants.GALLERY)) {
if (candidateImageUrl.hasTag(MediaTagConstants.STAGE.getName()) || candidateImageUrl.hasTag(MediaTagConstants.GALLERY.getName())) {
acceptedImages.add(candidateImageUrl);
}
}
@@ -201,7 +200,7 @@ public final class HomeServiceUtil {
}
public static boolean hasPhotos(Event event) {
return event.hasImageWithTag(MediaTagConstants.GALLERY);
return event.hasImageWithTag(MediaTagConstants.GALLERY.getName());
}
public static boolean hasVideos(Event event) {
@@ -229,7 +228,7 @@ public final class HomeServiceUtil {
VideoDescriptor bestMatch = null;
for (VideoDescriptor videoCandidate : event.getVideos()) {
if(!MediaConstants.SUPPORTED_VIDEO_TYPES.contains(videoCandidate.getMimeType())) {
if(!MediaTagConstants.SUPPORTED_VIDEO_TYPES.contains(videoCandidate.getMimeType())) {
continue;
}
@@ -12,6 +12,8 @@ import java.util.UUID;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
@@ -37,8 +39,10 @@ import com.sap.sse.gwt.client.controls.listedit.GenericStringListEditorComposite
import com.sap.sse.gwt.client.controls.listedit.GenericStringListInlineEditorComposite;
import com.sap.sse.gwt.client.controls.listedit.StringConstantsListEditorComposite;
import com.sap.sse.gwt.client.controls.listedit.StringListInlineEditorComposite;
import com.sap.sse.gwt.client.filestorage.FileStorageManagementGwtServiceAsync;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.VideoDTO;
import com.sap.sse.gwt.shared.filestorage.FileStorageServicePropertyErrorsDTO;
public abstract class EventDialog extends DataEntryDialogWithDateTimeBox<EventDTO> {
protected StringMessages stringMessages;
@@ -57,6 +61,7 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox<EventDT
protected ImagesListComposite imagesListComposite;
protected VideosListComposite videosListComposite;
protected ExternalLinksComposite externalLinksComposite;
private final FileStorageServiceConnectionTestObservable storageServiceAvailable = new FileStorageServiceConnectionTestObservable();
protected static class EventParameterValidator implements Validator<EventDTO> {
@@ -129,6 +134,7 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox<EventDT
StringMessages stringMessages, List<LeaderboardGroupDTO> availableLeaderboardGroups,
Iterable<LeaderboardGroupDTO> leaderboardGroupsOfEvent, DialogCallback<EventDTO> callback) {
super(stringMessages.event(), null, stringMessages.ok(), stringMessages.cancel(), validator, callback);
testFileStorageService(sailingService);
this.stringMessages = stringMessages;
this.availableLeaderboardGroupsByName = new HashMap<>();
for (final LeaderboardGroupDTO lgDTO : availableLeaderboardGroups) {
@@ -159,8 +165,8 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox<EventDT
new StringConstantsListEditorComposite.ExpandedUi(stringMessages, IconResources.INSTANCE.removeIcon(),
leaderboardGroupNames, stringMessages.selectALeaderboardGroup()));
leaderboardGroupList.addValueChangeHandler(valueChangeHandler);
imagesListComposite = new ImagesListComposite(sailingService, stringMessages);
videosListComposite = new VideosListComposite(stringMessages);
imagesListComposite = new ImagesListComposite(sailingService, stringMessages, storageServiceAvailable);
videosListComposite = new VideosListComposite(stringMessages, storageServiceAvailable);
externalLinksComposite = new ExternalLinksComposite(stringMessages);
final List<String> suggestedWindFinderSpotCollections = AvailableWindFinderSpotCollections
.getAllAvailableWindFinderSpotCollectionsInAlphabeticalOrder() == null ? Collections.emptyList()
@@ -261,4 +267,73 @@ public abstract class EventDialog extends DataEntryDialogWithDateTimeBox<EventDT
protected FocusWidget getInitialFocusWidget() {
return nameEntryField;
}
// used for ImageDialog and VideoDialog to inform user that upload is not possible
// without needing to try it first
private void testFileStorageService(FileStorageManagementGwtServiceAsync sailingService) {
sailingService.testFileStorageServiceProperties(null, LocaleInfo.getCurrentLocale().getLocaleName(),
new AsyncCallback<FileStorageServicePropertyErrorsDTO>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(FileStorageServicePropertyErrorsDTO result) {
if (result == null) {
storageServiceAvailable.testPassed();
}
}
});
}
/**
* The only purpose of this class is to hold the value of the response of the {@link EventDialog#testFileStorageService(FileStorageManagementGwtServiceAsync)} method
* It will notify all registered observers on a change and directly after the registration, if the value is already true
* The value of this will only change from false to true, so the value can also be seen as an alreadyChanged value
* If the test fails, the value will not change due its lifetime
*
* @author Robin Fleige (D067799)
*/
public class FileStorageServiceConnectionTestObservable {
private List<FileStorageServiceConnectionTestObserver> observer = new ArrayList<>();
private boolean value;
public FileStorageServiceConnectionTestObservable() {
value = false;
}
public void testPassed() {
value = true;
for (FileStorageServiceConnectionTestObserver observer : this.observer) {
observer.onFileStorageServiceTestPassed();
}
}
public boolean getValue() {
return value;
}
public void registerObserver(FileStorageServiceConnectionTestObserver observer) {
this.observer.add(observer);
if (value) {
observer.onFileStorageServiceTestPassed();
}
}
public void unregisterObserver(FileStorageServiceConnectionTestObserver observer) {
this.observer.remove(observer);
}
}
/**
* The only use of this interface is to get notified if the response of the {@link EventDialog#testFileStorageService(FileStorageManagementGwtServiceAsync)} method arrives
* Also see {@link EventDialog.FileStorageServiceConnectionTestObservable}
*
* @author Robin Fleige (D067799)
*/
public interface FileStorageServiceConnectionTestObserver {
void onFileStorageServiceTestPassed();
}
}
@@ -5,14 +5,15 @@ import java.util.Date;
import java.util.List;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.gwt.ui.adminconsole.EventDialog.FileStorageServiceConnectionTestObservable;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.ImageResizingTaskDTO;
public class ImageCreateDialog extends ImageDialog {
public ImageCreateDialog(String initialTag, SailingServiceAsync sailingService, StringMessages stringMessages, DialogCallback<ImageDTO> callback) {
super(new Date(), new ImageParameterValidator(stringMessages), sailingService, stringMessages, callback);
public ImageCreateDialog(String initialTag, SailingServiceAsync sailingService, StringMessages stringMessages, FileStorageServiceConnectionTestObservable storageServiceAvailable, DialogCallback<ImageResizingTaskDTO> dialogCallback) {
super(new Date(), sailingService, stringMessages, storageServiceAvailable, dialogCallback);
createdAtLabel = new Label(creationDate.toString());
titleTextBox = createTextBox(null);
titleTextBox.setVisibleLength(40);
@@ -1,13 +1,17 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
@@ -16,9 +20,11 @@ import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.adminconsole.EventDialog.FileStorageServiceConnectionTestObservable;
import com.sap.sailing.gwt.ui.adminconsole.EventDialog.FileStorageServiceConnectionTestObserver;
import com.sap.sailing.gwt.ui.client.SailingService;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.media.MediaConstants;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.media.MediaTagConstants;
@@ -27,12 +33,14 @@ import com.sap.sse.gwt.client.IconResources;
import com.sap.sse.gwt.client.controls.IntegerBox;
import com.sap.sse.gwt.client.controls.busyindicator.BusyIndicator;
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
import com.sap.sse.gwt.client.controls.listedit.GenericStringListInlineEditorComposite;
import com.sap.sse.gwt.client.controls.listedit.ExpandedUiWithCheckboxes;
import com.sap.sse.gwt.client.controls.listedit.StringListInlineEditorComposite;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.ImageResizingTaskDTO;
public abstract class ImageDialog extends DataEntryDialog<ImageDTO> {
public abstract class ImageDialog extends DataEntryDialog<ImageResizingTaskDTO>
implements FileStorageServiceConnectionTestObserver {
private final SailingServiceAsync sailingService;
protected final StringMessages stringMessages;
@@ -44,70 +52,165 @@ public abstract class ImageDialog extends DataEntryDialog<ImageDTO> {
protected TextBox copyrightTextBox;
protected IntegerBox widthInPxBox;
protected IntegerBox heightInPxBox;
protected StringListInlineEditorComposite tagsListEditor;
protected final StringListInlineEditorComposite tagsListEditor;
protected Image image;
private final ExpandedUiWithCheckboxes<String> expandedUi;
private final BusyIndicator busyIndicator;
protected static class ImageParameterValidator implements Validator<ImageDTO> {
private StringMessages stringMessages;
protected static class ImageParameterValidator implements Validator<ImageResizingTaskDTO> {
private final StringMessages stringMessages;
private List<CheckBox> doResize;
private final FileStorageServiceConnectionTestObservable storageServiceAvailable;
public ImageParameterValidator(StringMessages stringMessages) {
public ImageParameterValidator(StringMessages stringMessages,
FileStorageServiceConnectionTestObservable storageServiceAvailable) {
this.stringMessages = stringMessages;
this.storageServiceAvailable = storageServiceAvailable;
this.doResize = new ArrayList<CheckBox>();
}
public void setCheckBoxes(List<CheckBox> doResize) {
this.doResize = doResize;
}
/*
* author Robin Fleige (D067799)
* will return an error message if the image is too small
* will return an error message if the width-height-ratio is not fitting for a resize
* will return an error message and show a checkbox to allow resizing if the image is too big
* will disable the checkbox if there is no working FileStorageService
*/
@Override
public String getErrorMessage(ImageDTO imageToValidate) {
public String getErrorMessage(final ImageResizingTaskDTO resizingTask) {
String errorMessage = null;
Integer imageWidth = imageToValidate.getWidthInPx();
Integer imageHeight = imageToValidate.getHeightInPx();
final ImageDTO imageToValidate = resizingTask.getImage();
final Integer imageWidth = imageToValidate.getWidthInPx();
final Integer imageHeight = imageToValidate.getHeightInPx();
if (imageToValidate.getSourceRef() == null || imageToValidate.getSourceRef().isEmpty()) {
errorMessage = stringMessages.pleaseEnterNonEmptyUrl();
errorMessage = stringMessages.pleaseEnterNonEmptyUrlOrUploadImage();
} else if (imageWidth == null || imageHeight == null) {
errorMessage = stringMessages.couldNotRetrieveImageSizeYet();
} else if (imageToValidate.hasTag(MediaTagConstants.LOGO)
&& !isValidSize(imageWidth, imageHeight, MediaConstants.MIN_LOGO_IMAGE_WIDTH,
MediaConstants.MAX_LOGO_IMAGE_WIDTH, MediaConstants.MIN_LOGO_IMAGE_HEIGHT,
MediaConstants.MAX_LOGO_IMAGE_HEIGHT)) {
errorMessage = getSizeErrorMessage("Logo", MediaConstants.MIN_LOGO_IMAGE_WIDTH,
MediaConstants.MAX_LOGO_IMAGE_WIDTH, MediaConstants.MIN_LOGO_IMAGE_HEIGHT,
MediaConstants.MAX_LOGO_IMAGE_HEIGHT, stringMessages);
} else if (imageToValidate.hasTag(MediaTagConstants.TEASER)
&& !isValidSize(imageWidth, imageHeight, MediaConstants.MIN_EVENTTEASER_IMAGE_WIDTH,
MediaConstants.MAX_EVENTTEASER_IMAGE_WIDTH, MediaConstants.MIN_EVENTTEASER_IMAGE_HEIGHT,
MediaConstants.MAX_EVENTTEASER_IMAGE_HEIGHT)) {
errorMessage = getSizeErrorMessage("Event-Teaser", MediaConstants.MIN_EVENTTEASER_IMAGE_WIDTH,
MediaConstants.MAX_EVENTTEASER_IMAGE_WIDTH, MediaConstants.MIN_EVENTTEASER_IMAGE_HEIGHT,
MediaConstants.MAX_EVENTTEASER_IMAGE_HEIGHT, stringMessages);
} else if (imageToValidate.hasTag(MediaTagConstants.STAGE)
&& !isValidSize(imageWidth, imageHeight, MediaConstants.MIN_STAGE_IMAGE_WIDTH,
MediaConstants.MAX_STAGE_IMAGE_WIDTH, MediaConstants.MIN_STAGE_IMAGE_HEIGHT,
MediaConstants.MAX_STAGE_IMAGE_HEIGHT)) {
errorMessage = getSizeErrorMessage("Stage", MediaConstants.MIN_STAGE_IMAGE_WIDTH,
MediaConstants.MAX_STAGE_IMAGE_WIDTH, MediaConstants.MIN_STAGE_IMAGE_HEIGHT,
MediaConstants.MAX_STAGE_IMAGE_HEIGHT, stringMessages);
} else {
// check if image is too small for resizing
errorMessage = "";
for (MediaTagConstants mediaTag : MediaTagConstants.values()) {
if (imageToValidate.hasTag(mediaTag.getName())
&& (imageWidth < mediaTag.getMinWidth() || imageHeight < mediaTag.getMinHeight())) {
errorMessage += getImageToSmallErrorMessage(mediaTag, stringMessages) + "\n";
}
}
if (errorMessage.equals("")) {// Check if image ratio fits for resizing
errorMessage = imageRatioFits(imageToValidate);
}
if (errorMessage.equals("")) {// check for checkboxes and resizing
for (MediaTagConstants mediaTag : MediaTagConstants.values()) {
final CheckBox checkBox = getCheckBoxForTag(mediaTag.getName(), imageToValidate);
if (imageToValidate.hasTag(mediaTag.getName())
&& (imageWidth > mediaTag.getMaxWidth() || imageHeight > mediaTag.getMaxHeight())) {
if (!resizingTask.getResizingTask().contains(mediaTag)) {
errorMessage += getSizeErrorMessage(mediaTag, stringMessages) + "\n";
checkBox.setStyleName(ExpandedUiWithCheckboxes.getErrorStyle());
if (!errorMessage.equals("") && !storageServiceAvailable.getValue()) {
checkBox.setEnabled(false);
}
} else {
checkBox.setStyleName(ExpandedUiWithCheckboxes.getNormalStyle());
}
} else {
checkBox.setStyleName(ExpandedUiWithCheckboxes.getInvisibleStyle());
checkBox.setValue(false);
}
}
}
if (!errorMessage.equals("") && !storageServiceAvailable.getValue()) {
errorMessage += stringMessages.automaticResizeNeedsStorageService() + "\n";
}
}
if (errorMessage.equals("")) {
errorMessage = null;
}
return errorMessage;
}
/**
* Searches for the checkbox for the given tag and returns it
*
* @author Robin Fleige (D067799)
*
* @param tag
* the tag, the checkbox for is needed
* @param imageToValidate
* the image with a list of all tags
* @returns the fitting checkbox for the tag
*/
private CheckBox getCheckBoxForTag(final String tag, final ImageDTO imageToValidate) {
final List<String> tags = imageToValidate.getTags();
CheckBox toReturn = null;
for (int i = 0; i < tags.size(); i++) {
if (tags.get(i).equals(tag)) {
toReturn = doResize.get(i);
}
}
return toReturn == null ? new CheckBox() : toReturn;
// new checkbox instead of null, so there is no need for a null check. this will be deleted from garbage
// collector anyway
}
/**
* Calculates if
*
* @author Robin Fleige (D067799)
*
* @param imageToValidate
* the image which has to be validated
* @returns true if the imageRatio fits into the bounds of all its {@link MediaTagConstants}
*/
private String imageRatioFits(ImageDTO imageToValidate) {
String errorMessage = "";
final double ratio = ((double) imageToValidate.getWidthInPx()) / imageToValidate.getHeightInPx();
for (MediaTagConstants mediaTag : MediaTagConstants.values()) {
if (imageToValidate.hasTag(mediaTag.getName())) {
final double minRatio = ((double) mediaTag.getMaxWidth()) / mediaTag.getMinHeight();
final double maxRatio = ((double) mediaTag.getMinWidth()) / mediaTag.getMaxHeight();
if (minRatio < ratio || maxRatio > ratio) {
errorMessage += stringMessages.imageResizeError(mediaTag.getName(), minRatio, maxRatio, ratio);
}
}
}
return errorMessage;
}
private boolean isValidSize(int width, int height, int minWidth, int maxWidth, int minHeight, int maxHeight) {
return width >= minWidth && width <= maxWidth && height >= minHeight && height <= maxHeight;
private String getSizeErrorMessage(MediaTagConstants mediaTag, StringMessages stringMessages) {
String errorMessage = stringMessages.imageSizeError(mediaTag.getName(), mediaTag.getMinWidth(),
mediaTag.getMaxWidth(), mediaTag.getMinHeight(), mediaTag.getMaxHeight());
return errorMessage;
}
private String getSizeErrorMessage(String imageType, int minWidth, int maxWidth, int minHeight, int maxHeight, StringMessages stringMessages) {
String errorMessage = stringMessages.imageSizeError(imageType, minWidth, maxWidth, minHeight, maxHeight);
private String getImageToSmallErrorMessage(MediaTagConstants mediaTag, StringMessages stringMessages) {
String errorMessage = stringMessages.imageToSmallError(mediaTag.getName(), mediaTag.getMinWidth(),
mediaTag.getMinHeight());
return errorMessage;
}
}
public ImageDialog(Date creationDate, ImageParameterValidator validator, SailingServiceAsync sailingService, StringMessages stringMessages, DialogCallback<ImageDTO> callback) {
public ImageDialog(Date creationDate, SailingServiceAsync sailingService, StringMessages stringMessages,
FileStorageServiceConnectionTestObservable storageServiceAvailable,
DialogCallback<ImageResizingTaskDTO> callback) {
this(creationDate, sailingService, stringMessages, storageServiceAvailable,
new ImageParameterValidator(stringMessages, storageServiceAvailable), callback);
}
private ImageDialog(Date creationDate, SailingServiceAsync sailingService, StringMessages stringMessages,
FileStorageServiceConnectionTestObservable storageServiceAvailable, ImageParameterValidator validator,
DialogCallback<ImageResizingTaskDTO> callback) {
super(stringMessages.image(), null, stringMessages.ok(), stringMessages.cancel(), validator, callback);
this.sailingService = sailingService;
this.stringMessages = stringMessages;
this.sailingService = sailingService;
this.creationDate = creationDate;
getDialogBox().getWidget().setWidth("730px");
busyIndicator = new SimpleBusyIndicator();
imageURLAndUploadComposite = new URLFieldWithFileUpload(stringMessages);
imageURLAndUploadComposite = new URLFieldWithFileUpload(stringMessages, false);
imageURLAndUploadComposite.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
@@ -138,10 +241,19 @@ public abstract class ImageDialog extends DataEntryDialog<ImageDTO> {
validateAndUpdate();
}
});
tagsListEditor = new StringListInlineEditorComposite(Collections.<String> emptyList(),
new GenericStringListInlineEditorComposite.ExpandedUi<String>(stringMessages, IconResources.INSTANCE.removeIcon(), /* suggestValues */
MediaConstants.imageTagSuggestions, stringMessages.enterTagsForTheImage(), 30));
//the observer has to be registered after creating the URLFieldWithFileUpload
storageServiceAvailable.registerObserver(this);
expandedUi = new ExpandedUiWithCheckboxes<String>(stringMessages, IconResources.INSTANCE.removeIcon(),
/* suggestValues */ MediaTagConstants.imageTagSuggestions, stringMessages.enterTagsForTheImage(), 30,
stringMessages.allowResizing());
expandedUi.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
validateAndUpdate();
}
});
validator.setCheckBoxes(expandedUi.getCheckBoxes());
tagsListEditor = new StringListInlineEditorComposite(Collections.<String> emptyList(), expandedUi);
tagsListEditor.addValueChangeHandler(new ValueChangeHandler<Iterable<String>>() {
@Override
public void onValueChange(ValueChangeEvent<Iterable<String>> event) {
@@ -150,21 +262,34 @@ public abstract class ImageDialog extends DataEntryDialog<ImageDTO> {
});
}
/**
* Creates a {@link ImageResizingTaskDTO} which contains an {@link MediaTagConstants} for every tag that does not fit to the boundaries of the image.
* All tags that do not imply a resize will stay together on a single {@link ImageDTO} and are not stored in the {@link ImageResizingTaskDTO}.
* There will be a {@link ImageDTO} for each of the other {@link MediaTagConstants}.
* For a lookout to further progressing see {@link SailingService#resizeImage(ImageResizingTaskDTO)}
*/
@Override
protected ImageDTO getResult() {
ImageDTO result = new ImageDTO(imageURLAndUploadComposite.getURL(), creationDate);
result.setTitle(titleTextBox.getValue());
result.setSubtitle(subtitleTextBox.getValue());
result.setCopyright(copyrightTextBox.getValue());
if (widthInPxBox.getValue() != null && heightInPxBox.getValue() != null) {
result.setSizeInPx(widthInPxBox.getValue(), heightInPxBox.getValue());
}
List<String> tags = new ArrayList<String>();
for (String tag: tagsListEditor.getValue()) {
protected ImageResizingTaskDTO getResult() {
final List<String> tags = new ArrayList<String>();
for (String tag : tagsListEditor.getValue()) {
tags.add(tag);
}
result.setTags(tags);
return result;
final List<MediaTagConstants> resizingTask = new ArrayList<MediaTagConstants>();
for (int i = 0; i < tags.size(); i++) {
if (Arrays.asList(MediaTagConstants.values()).contains(MediaTagConstants.fromName(tags.get(i)))
&& expandedUi.getCheckBoxes().get(i).getValue()) {
resizingTask.add(MediaTagConstants.fromName(tags.get(i)));
}
}
final ImageDTO image = new ImageDTO(imageURLAndUploadComposite.getURL(), creationDate);
image.setTitle(titleTextBox.getValue());
image.setSubtitle(subtitleTextBox.getValue());
image.setCopyright(copyrightTextBox.getValue());
if (widthInPxBox.getValue() != null && heightInPxBox.getValue() != null) {
image.setSizeInPx(widthInPxBox.getValue(), heightInPxBox.getValue());
}
image.setTags(tags);
return new ImageResizingTaskDTO(image, resizingTask);
}
@Override
@@ -210,4 +335,9 @@ public abstract class ImageDialog extends DataEntryDialog<ImageDTO> {
protected FocusWidget getInitialFocusWidget() {
return imageURLAndUploadComposite.getInitialFocusWidget();
}
@Override
public void onFileStorageServiceTestPassed() {
imageURLAndUploadComposite.setUploadEnabled(true);
}
}
@@ -4,13 +4,15 @@ import java.util.ArrayList;
import java.util.List;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.gwt.ui.adminconsole.EventDialog.FileStorageServiceConnectionTestObservable;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.ImageResizingTaskDTO;
public class ImageEditDialog extends ImageDialog {
public ImageEditDialog(ImageDTO imageDTO, SailingServiceAsync sailingService, StringMessages stringMessages, DialogCallback<ImageDTO> callback) {
super(imageDTO.getCreatedAtDate(), new ImageParameterValidator(stringMessages), sailingService, stringMessages, callback);
public ImageEditDialog(ImageDTO imageDTO, SailingServiceAsync sailingService, StringMessages stringMessages, FileStorageServiceConnectionTestObservable storageServiceAvailable, DialogCallback<ImageResizingTaskDTO> dialogCallback) {
super(imageDTO.getCreatedAtDate(), sailingService, stringMessages, storageServiceAvailable, dialogCallback);
createdAtLabel = new Label(imageDTO.getCreatedAtDate().toString());
imageURLAndUploadComposite.setURL(imageDTO.getSourceRef());
titleTextBox = createTextBox(imageDTO.getTitle());
@@ -2,6 +2,7 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.FieldUpdater;
@@ -18,6 +19,7 @@ import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
@@ -27,17 +29,21 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.gwt.ui.adminconsole.EventDialog.FileStorageServiceConnectionTestObservable;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil;
import com.sap.sse.common.media.MediaTagConstants;
import com.sap.sse.common.util.NaturalComparator;
import com.sap.sse.gwt.client.Notification;
import com.sap.sse.gwt.client.Notification.NotificationType;
import com.sap.sse.gwt.client.celltable.BaseCelltable;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.ImageResizingTaskDTO;
/**
* /** A composite showing the list of media images
* A composite showing the list of media images
*
* @author Frank Mittag (C5163974)
*/
@@ -49,6 +55,7 @@ public class ImagesListComposite extends Composite {
private SingleSelectionModel<ImageDTO> imageSelectionModel;
private ListDataProvider<ImageDTO> imageListDataProvider;
private final Label noImagesLabel;
private final FileStorageServiceConnectionTestObservable storageServiceAvailable;
private final SimplePanel mainPanel;
private final VerticalPanel panel;
@@ -69,10 +76,11 @@ public class ImagesListComposite extends Composite {
private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
public ImagesListComposite(SailingServiceAsync sailingService, final StringMessages stringMessages) {
public ImagesListComposite(final SailingServiceAsync sailingService, final StringMessages stringMessages,
final FileStorageServiceConnectionTestObservable storageServiceAvailable) {
this.sailingService = sailingService;
this.stringMessages = stringMessages;
this.storageServiceAvailable = storageServiceAvailable;
mainPanel = new SimplePanel();
panel = new VerticalPanel();
mainPanel.setWidget(panel);
@@ -85,7 +93,7 @@ public class ImagesListComposite extends Composite {
addPhotoBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
openCreateImageDialog(MediaTagConstants.GALLERY);
openCreateImageDialog(MediaTagConstants.GALLERY.getName());
}
});
imagesControlsPanel.add(addPhotoBtn);
@@ -94,7 +102,7 @@ public class ImagesListComposite extends Composite {
addStateImageBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
openCreateImageDialog(MediaTagConstants.STAGE);
openCreateImageDialog(MediaTagConstants.STAGE.getName());
}
});
imagesControlsPanel.add(addStateImageBtn);
@@ -103,7 +111,7 @@ public class ImagesListComposite extends Composite {
addEventTeaseImageBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
openCreateImageDialog(MediaTagConstants.TEASER);
openCreateImageDialog(MediaTagConstants.TEASER.getName());
}
});
imagesControlsPanel.add(addEventTeaseImageBtn);
@@ -112,7 +120,7 @@ public class ImagesListComposite extends Composite {
addLogoImageBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
openCreateImageDialog(MediaTagConstants.LOGO);
openCreateImageDialog(MediaTagConstants.LOGO.getName());
}
});
imagesControlsPanel.add(addLogoImageBtn);
@@ -265,34 +273,74 @@ public class ImagesListComposite extends Composite {
}
private void openCreateImageDialog(String initialTag) {
ImageCreateDialog dialog = new ImageCreateDialog(initialTag, sailingService, stringMessages, new DialogCallback<ImageDTO>() {
@Override
public void cancel() {
}
ImageCreateDialog dialog = new ImageCreateDialog(initialTag, sailingService, stringMessages,
storageServiceAvailable, new DialogCallback<ImageResizingTaskDTO>() {
@Override
public void cancel() {
}
@Override
public void ok(ImageDTO newImage) {
imageListDataProvider.getList().add(newImage);
updateTableVisisbilty();
}
});
@Override
public void ok(ImageResizingTaskDTO resizingTask) {
if (resizingTask.getResizingTask().size() != 0) {
callResizingServiceAndUpdateTable(resizingTask, null);
} else {
imageListDataProvider.getList().add(resizingTask.getImage());
}
}
});
dialog.show();
}
private void openEditImageDialog(final ImageDTO selectedImage) {
ImageEditDialog dialog = new ImageEditDialog(selectedImage, sailingService, stringMessages, new DialogCallback<ImageDTO>() {
ImageEditDialog dialog = new ImageEditDialog(selectedImage, sailingService, stringMessages,
storageServiceAvailable, new DialogCallback<ImageResizingTaskDTO>() {
@Override
public void cancel() {
}
@Override
public void ok(ImageResizingTaskDTO resizingTask) {
if (resizingTask.getResizingTask().size() != 0) {
callResizingServiceAndUpdateTable(resizingTask, selectedImage);
} else {
imageListDataProvider.getList().remove(selectedImage);
imageListDataProvider.getList().add(resizingTask.getImage());
}
}
});
dialog.show();
}
/**
* Calls the resizing service and updates the imageListDataProvider with the returned ImageDTOs
*
* @author Robin Fleige (D067799)
*
* @param resizingTask
* The {@link ImageResizingTaskDTO} that contains the information about resizing. The resizingTask
* attribute should not be null or empty at this point.
* @param originalImage
* if called from {@link ImageEditDialog} contains the selected image, that will be replaced by the
* returned ImageDTOs
*/
protected void callResizingServiceAndUpdateTable(ImageResizingTaskDTO resizingTask, ImageDTO originalImage) {
sailingService.resizeImage(resizingTask, new AsyncCallback<Set<ImageDTO>>() {
@Override
public void cancel() {
public void onFailure(Throwable caught) {
Notification.notify(stringMessages.resizeUnsuccessfull(), NotificationType.ERROR);
}
@Override
public void ok(ImageDTO updatedImage) {
imageListDataProvider.getList().remove(selectedImage);
imageListDataProvider.getList().add(updatedImage);
public void onSuccess(Set<ImageDTO> result) {
for (ImageDTO image : result) {
imageListDataProvider.getList().add(image);
}
imageListDataProvider.getList().remove(originalImage);
updateTableVisisbilty();
Notification.notify(stringMessages.resizeSuccessfull(), NotificationType.SUCCESS);
}
});
dialog.show();
}
private void updateTableVisisbilty() {
@@ -442,7 +442,7 @@ public class SeriesEditDialog extends DataEntryDialog<SeriesDescriptor> {
}
@Override
public void onRowRemoved() {
public void onRowRemoved(int rowIndex) {
updateFromToListboxesSelection();
updateHintLabel();
}
@@ -322,6 +322,8 @@ public class SwissTimingEventManagementPanel extends AbstractEventManagementPane
raceIdColumn.setSortable(true);
genderColumn.setSortable(true);
raceStatusColumn.setSortable(true);
regattaNameColumn.setSortable(true);
seriesNameColumn.setSortable(true);
raceTable.addColumn(selectionColumn, selectionColumn.getHeader());
@@ -5,14 +5,15 @@ import java.util.Date;
import java.util.List;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.gwt.ui.adminconsole.EventDialog.FileStorageServiceConnectionTestObservable;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.media.MimeType;
import com.sap.sse.gwt.client.media.VideoDTO;
public class VideoCreateDialog extends VideoDialog {
public VideoCreateDialog(String initialTag, StringMessages stringMessages, DialogCallback<VideoDTO> callback) {
super(new Date(), new VideoParameterValidator(stringMessages), stringMessages, callback);
public VideoCreateDialog(String initialTag, StringMessages stringMessages, FileStorageServiceConnectionTestObservable storageServiceAvailable, DialogCallback<VideoDTO> callback) {
super(new Date(), new VideoParameterValidator(stringMessages), stringMessages, storageServiceAvailable, callback);
createdAtLabel = new Label(creationDate.toString());
titleTextBox = createTextBox(null);
titleTextBox.setVisibleLength(50);
@@ -14,9 +14,11 @@ import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.adminconsole.EventDialog.FileStorageServiceConnectionTestObservable;
import com.sap.sailing.gwt.ui.adminconsole.EventDialog.FileStorageServiceConnectionTestObserver;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.media.MediaConstants;
import com.sap.sse.common.Util;
import com.sap.sse.common.media.MediaTagConstants;
import com.sap.sse.common.media.MimeType;
import com.sap.sse.gwt.adminconsole.URLFieldWithFileUpload;
import com.sap.sse.gwt.client.GWTLocaleUtil;
@@ -27,7 +29,7 @@ import com.sap.sse.gwt.client.controls.listedit.StringListInlineEditorComposite;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.media.VideoDTO;
public abstract class VideoDialog extends DataEntryDialog<VideoDTO> {
public abstract class VideoDialog extends DataEntryDialog<VideoDTO> implements FileStorageServiceConnectionTestObserver {
protected final StringMessages stringMessages;
protected final URLFieldWithFileUpload videoURLAndUploadComposite;
protected final Date creationDate;
@@ -61,7 +63,7 @@ public abstract class VideoDialog extends DataEntryDialog<VideoDTO> {
}
}
public VideoDialog(Date createdAtDate, VideoParameterValidator validator, StringMessages stringMessages, DialogCallback<VideoDTO> callback) {
public VideoDialog(Date createdAtDate, VideoParameterValidator validator, StringMessages stringMessages, FileStorageServiceConnectionTestObservable storageServiceAvailable, DialogCallback<VideoDTO> callback) {
super(stringMessages.video(), null, stringMessages.ok(), stringMessages.cancel(), validator,
callback);
this.stringMessages = stringMessages;
@@ -83,17 +85,19 @@ public abstract class VideoDialog extends DataEntryDialog<VideoDTO> {
for (String locale : GWTLocaleUtil.getAvailableLocalesAndDefault()) {
localeListBox.addItem(GWTLocaleUtil.getDecoratedLanguageDisplayNameWithDefaultLocaleSupport(locale), locale == null ? "" : locale);
}
videoURLAndUploadComposite = new URLFieldWithFileUpload(stringMessages);
videoURLAndUploadComposite = new URLFieldWithFileUpload(stringMessages, false);
videoURLAndUploadComposite.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
validateAndUpdate();
}
});
thumbnailURLAndUploadComposite = new URLFieldWithFileUpload(stringMessages);
thumbnailURLAndUploadComposite = new URLFieldWithFileUpload(stringMessages, false);
tagsListEditor = new StringListInlineEditorComposite(Collections.<String> emptyList(),
new GenericStringListInlineEditorComposite.ExpandedUi<String>(stringMessages, IconResources.INSTANCE.removeIcon(), /* suggestValues */
MediaConstants.videoTagSuggestions, stringMessages.enterTagsForTheVideo(), 50));
MediaTagConstants.videoTagSuggestions, stringMessages.enterTagsForTheVideo(), 50));
//the observer has to be registered after creating the URLFieldWithFileUpload
storageServiceAvailable.registerObserver(this);
}
@Override
@@ -187,4 +191,10 @@ public abstract class VideoDialog extends DataEntryDialog<VideoDTO> {
protected FocusWidget getInitialFocusWidget() {
return videoURLAndUploadComposite.getInitialFocusWidget();
}
@Override
public void onFileStorageServiceTestPassed() {
videoURLAndUploadComposite.setUploadEnabled(true);
thumbnailURLAndUploadComposite.setUploadEnabled(true);
}
}
@@ -4,12 +4,13 @@ import java.util.ArrayList;
import java.util.List;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.gwt.ui.adminconsole.EventDialog.FileStorageServiceConnectionTestObservable;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.media.VideoDTO;
public class VideoEditDialog extends VideoDialog {
public VideoEditDialog(VideoDTO video, StringMessages stringMessages, DialogCallback<VideoDTO> callback) {
super(video.getCreatedAtDate(), new VideoParameterValidator(stringMessages), stringMessages, callback);
public VideoEditDialog(VideoDTO video, StringMessages stringMessages, FileStorageServiceConnectionTestObservable storageServiceAvailable, DialogCallback<VideoDTO> callback) {
super(video.getCreatedAtDate(), new VideoParameterValidator(stringMessages), stringMessages, storageServiceAvailable, callback);
createdAtLabel = new Label(video.getCreatedAtDate().toString());
videoURLAndUploadComposite.setURL(video.getSourceRef());
titleTextBox = createTextBox(video.getTitle());
@@ -27,6 +27,7 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.gwt.ui.adminconsole.EventDialog.FileStorageServiceConnectionTestObservable;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil;
import com.sap.sse.common.media.MediaTagConstants;
@@ -47,6 +48,7 @@ public class VideosListComposite extends Composite {
private SingleSelectionModel<VideoDTO> videoSelectionModel;
private ListDataProvider<VideoDTO> videoListDataProvider;
private final Label noVideosLabel;
private final FileStorageServiceConnectionTestObservable storageServiceAvailable;
private final SimplePanel mainPanel;
private final VerticalPanel panel;
@@ -67,9 +69,9 @@ public class VideosListComposite extends Composite {
private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
public VideosListComposite(final StringMessages stringMessages) {
public VideosListComposite(final StringMessages stringMessages, FileStorageServiceConnectionTestObservable storageServiceAvailable) {
this.stringMessages = stringMessages;
this.storageServiceAvailable = storageServiceAvailable;
mainPanel = new SimplePanel();
panel = new VerticalPanel();
mainPanel.setWidget(panel);
@@ -82,7 +84,7 @@ public class VideosListComposite extends Composite {
createVideoBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
openCreateVideoDialog(MediaTagConstants.GALLERY);
openCreateVideoDialog(MediaTagConstants.GALLERY.getName());
}
});
videosControlsPanel.add(createVideoBtn);
@@ -91,7 +93,7 @@ public class VideosListComposite extends Composite {
addLiveStreamBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
openCreateVideoDialog(MediaTagConstants.LIVESTREAM);
openCreateVideoDialog(MediaTagConstants.LIVESTREAM.getName());
}
});
videosControlsPanel.add(addLiveStreamBtn);
@@ -100,7 +102,7 @@ public class VideosListComposite extends Composite {
addHighlightBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
openCreateVideoDialog(MediaTagConstants.HIGHLIGHT);
openCreateVideoDialog(MediaTagConstants.HIGHLIGHT.getName());
}
});
videosControlsPanel.add(addHighlightBtn);
@@ -245,33 +247,35 @@ public class VideosListComposite extends Composite {
}
private void openCreateVideoDialog(String initialTag) {
VideoCreateDialog dialog = new VideoCreateDialog(initialTag, stringMessages, new DialogCallback<VideoDTO>() {
@Override
public void cancel() {
}
VideoCreateDialog dialog = new VideoCreateDialog(initialTag, stringMessages, storageServiceAvailable,
new DialogCallback<VideoDTO>() {
@Override
public void cancel() {
}
@Override
public void ok(VideoDTO newVideo) {
videoListDataProvider.getList().add(newVideo);
updateTableVisisbilty();
}
});
@Override
public void ok(VideoDTO newVideo) {
videoListDataProvider.getList().add(newVideo);
updateTableVisisbilty();
}
});
dialog.show();
}
private void openEditVideoDialog(final VideoDTO selectedVideo) {
VideoEditDialog dialog = new VideoEditDialog(selectedVideo, stringMessages, new DialogCallback<VideoDTO>() {
@Override
public void cancel() {
}
VideoEditDialog dialog = new VideoEditDialog(selectedVideo, stringMessages, storageServiceAvailable,
new DialogCallback<VideoDTO>() {
@Override
public void cancel() {
}
@Override
public void ok(VideoDTO updatedVideo) {
videoListDataProvider.getList().remove(selectedVideo);
videoListDataProvider.getList().add(updatedVideo);
updateTableVisisbilty();
}
});
@Override
public void ok(VideoDTO updatedVideo) {
videoListDataProvider.getList().remove(selectedVideo);
videoListDataProvider.getList().add(updatedVideo);
updateTableVisisbilty();
}
});
dialog.show();
}
@@ -250,9 +250,9 @@ public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements R
endTimeOfLivePeriod = latestOfNewestTrackingEventAndEndOfRace == null ? null :
new Date(latestOfNewestTrackingEventAndEndOfRace.getTime() + RaceTimesCalculationUtil.TIME_AFTER_LIVE);
} else {
endTimeOfLivePeriod = lastRaceTimesInfo.endOfTracking == null ? null : lastRaceTimesInfo.endOfTracking;
endTimeOfLivePeriod = lastRaceTimesInfo.endOfTracking;
if (lastRaceTimesInfo.endOfRace != null) {
// this is a failsafe, if the tracking was never finsihed, the race was always assumed to be live.
// this is a failsafe, if the tracking was never finished, the race was always assumed to be live.
Date latestAllowedTime = new Date(
lastRaceTimesInfo.endOfRace.getTime() + RaceTimesCalculationUtil.MAX_TIME_AFTER_RACE_END);
if (endTimeOfLivePeriod == null || endTimeOfLivePeriod.after(latestAllowedTime)) {
@@ -122,6 +122,7 @@ import com.sap.sse.common.mail.MailException;
import com.sap.sse.gwt.client.ServerInfoDTO;
import com.sap.sse.gwt.client.filestorage.FileStorageManagementGwtService;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.ImageResizingTaskDTO;
import com.sap.sse.gwt.client.media.VideoDTO;
import com.sap.sse.gwt.client.replication.RemoteReplicationService;
import com.sap.sse.security.ui.shared.SuccessInfo;
@@ -796,4 +797,18 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
* Checks if the given race is currently in state tracking or loading.
*/
Boolean checkIfRaceIsTracking(RegattaAndRaceIdentifier race);
/**
* Resizes an {@Link ImageDTO} that is part of an {@link ImageResizingTaskDTO} into a set of resized versions. This set only contains one image in most cases, because most {@Link ImageDTO} only hold one predefined {@link MediaTagConstants}.
* All {@link MediaTagConstants} stored in the resizingTask of the {@link ImageResizingTaskDTO} create a resize. Since no {@link MediaTagConstants} have the same defined bounds, there will be no merge of these {@Link ImageDTO}.
* Uses the {@link FileStorageService} to store the resized images.
* If an error occurs during resize or storing process, it will be tried to restore the previous state.
*
* @author Robin Fleige (D067799)
*
* @param imageResizingTask is an {@link ImageResizingTaskDTO} with the information on how the image saved in the {@Link ImageDTO} should be resized. The resizingTask attribute should not be null or empty at this point
* @return returns a set of {@Link ImageDTO}, that contain the resized variants of the {@Link ImageDTO} in toResizeImage
* @throws Exception can throw different type of exceptions
*/
Set<ImageDTO> resizeImage(ImageResizingTaskDTO imageResizingTask) throws Exception;
}
@@ -109,6 +109,7 @@ import com.sap.sse.common.Util.Triple;
import com.sap.sse.gwt.client.ServerInfoRetriever;
import com.sap.sse.gwt.client.filestorage.FileStorageManagementGwtServiceAsync;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.ImageResizingTaskDTO;
import com.sap.sse.gwt.client.media.VideoDTO;
import com.sap.sse.gwt.client.replication.RemoteReplicationServiceAsync;
import com.sap.sse.pairinglist.PairingList;
@@ -1004,4 +1005,11 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
* @see SailingService#checkIfRaceIsTracking(RegattaAndRaceIdentifier)
*/
void checkIfRaceIsTracking(RegattaAndRaceIdentifier raceIdentifier, AsyncCallback<Boolean> asyncCallback);
/**
* @see SailingService#resizeImage(ImageResizingTaskDTO)
* @param imageResizingTask the information on how the contained ImageDTO should be resized
* @param asyncCallback The callback called after finishing resizing, storing the returned ImageDTOs somewhere is proposed
*/
void resizeImage(ImageResizingTaskDTO imageResizingTask, AsyncCallback<Set<ImageDTO>> asyncCallback);
}
@@ -411,6 +411,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String successfullyUpdatedResultImportUrls();
String errorRemovingResultImportUrls(String message);
String pleaseEnterNonEmptyUrl();
String pleaseEnterNonEmptyUrlOrUploadImage();
String addResultImportUrl();
String errorAddingResultImportUrl(String message);
String remoteServerInstances();
@@ -1479,6 +1480,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String addEventLogo();
String noImagesDefinedYet();
String imageSizeError(String imageType, int minWidth, int maxWidth, int minHeight, int maxHeight);
String imageToSmallError(String imageType, int minWidth, int minHeight);
String imageResizeError(String imageType, double minRatio, double maxRatio, double ratio);
String couldNotRetrieveImageSizeYet();
@Override
String pleaseOnlyUploadContentYouHaveAllUsageRightsFor();
@@ -2098,6 +2101,10 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String swissTimingUpdateURL();
String swissTimingUpdateUsername();
String swissTimingUpdatePassword();
String allowResizing();
String resizeSuccessfull();
String resizeUnsuccessfull();
String automaticResizeNeedsStorageService();
String tag();
String tagButtons();
String tagPanel();
@@ -433,6 +433,7 @@ errorRefreshingResultImportUrlList=Error refreshing result import URL list: {0}
successfullyUpdatedResultImportUrls=Successfully updated result import URL list
errorRemovingResultImportUrls=Error removing result import URLs: {0}
pleaseEnterNonEmptyUrl=Please enter a URL.
pleaseEnterNonEmptyUrlOrUploadImage=Please enter a URL or upload an image.
addResultImportUrl=Add result import URL
errorAddingResultImportUrl=Error adding result import URL: {0}
remoteServerInstances=Remote Server Instances
@@ -1469,7 +1470,9 @@ addStageImage=Add stage image
addTeaserImage=Add teaser image
addEventLogo=Add event logo
noImagesDefinedYet=No images defined yet
imageSizeError=The size of the {0} image does not fit. The width should be between {1} and {2} px and the height between {3} and {4} px.
imageSizeError=The size of the {0} image does not fit. The width should be between {1} and {2} px and the height between {3} and {4} px. Try turning on resizing.
imageToSmallError=The size of the {0} image does not fit. The width should be at least {1} px and the height at least {2} px.
imageResizeError=Resizing of the {0} image does not work. The width/height ratio should be between {1} and {2}, but actually is {3}.
couldNotRetrieveImageSizeYet=The width and height of the image could not be retrieved yet.
pleaseOnlyUploadContentYouHaveAllUsageRightsFor=Please only upload content you have all usage rights for. Remember that content may be cropped.
registerCompetitorsOnRace=Register Competitors on Race (e.g. for split-fleet racing)
@@ -2093,6 +2096,11 @@ selectMedia=Select Media
swissTimingUpdateURL=Update URL (e.g., for start time and course change feedback)
swissTimingUpdateUsername=Username for sending updates
swissTimingUpdatePassword=Password for sending updates
allowResizing=Allow resizing
resizeSuccessfull=Resizing successfully finished
resizeUnsuccessfull=Resizing not possible
setUpStorageService=Please set up a file storage service first
automaticResizeNeedsStorageService=Automatic Resizing needs a working FileStorageService.
tag=Tag
tagButtons=Tag-Buttons
tagPanel=Tags
@@ -434,6 +434,7 @@ errorRefreshingResultImportUrlList=Fehler beim Aktualisieren der Ergebnisimport
successfullyUpdatedResultImportUrls=Ergebnisimport URL-Liste erfolgreich aktualisiert
errorRemovingResultImportUrls=Fehler beim Löschen von Ergebnisimport URLs: {0}
pleaseEnterNonEmptyUrl=Bitte gebe eine URL ein.
pleaseEnterNonEmptyUrlOrUploadImage=Bitte gebe eine URL an oder lade ein Bild hoch.
addResultImportUrl=Ergebnisimport-URL hinzufügen
errorAddingResultImportUrl=Fehler beim Hinzufügen einer Ergebnisimport URL: {0}
remoteServerInstances=Remote-Server Instanzen
@@ -1452,7 +1453,9 @@ addStageImage=Startseiten-Bild hinzufügen
addTeaserImage=Lock-Bild hinzufügen
addEventLogo=Veranstaltungs-Logo hinzufügen
noImagesDefinedYet=Noch keine Bilder vorhanden
imageSizeError=Die Größe des {0}-Bildes ist unpassend. Die Breite sollte zwischen {1} und {2} px und die Höhe zwischen {3} und {4} px sein.
imageSizeError=Die Größe des {0}-Bildes ist unpassend. Die Breite sollte zwischen {1} und {2} px und die Höhe zwischen {3} und {4} px sein. Versuche die Skalierung einzuschalten.
imageToSmallError=Die Größe des {0}-Bildes ist unpassend. Die Breite sollte mindestens {1} px und die Höhe mindestens {2} px sein.
imageResizeError=Die Skalierung des {0}-Bildes hat nicht funktionoiert. Das Breite/Höhe Verhältnis sollte zwischen {1} und {2} sein, ist aber {3}.
couldNotRetrieveImageSizeYet=Bildgröße konnte noch nicht ermittelt werden.
pleaseOnlyUploadContentYouHaveAllUsageRightsFor=Bitte nur Inhalte hochladen, für die alle Verwendungsrechte vorliegen. Bitte beachten: Bilder können verändert wiedergegeben werden.
registerCompetitorsOnRace=Teilnehmer auf dem Rennen registrieren (z.B. für Split-Fleets)
@@ -1656,7 +1659,7 @@ countdownSecond=Sek.
liveCapitalLetter=Live
watchNow=Jetzt mitverfolgen
seriesHeaderUpcoming=Demnächst
eventRegattaLeaderboardLastScoreUpdate=Letztes Ergebis-Update
eventRegattaLeaderboardLastScoreUpdate=Letztes Ergebnis-Update
eventRegattaRaceNotTracked=Nicht getrackt
footerJobs=Jobs
footerCopyright=\u00A9 2011-2018 SAP Sailing Analytics
@@ -2088,6 +2091,11 @@ selectMedia=Medium auswählen
swissTimingUpdateURL=Update URL (z.B. für Startzeit-Übertragung)
swissTimingUpdateUsername=Benutzername zum Versenden der Updates
swissTimingUpdatePassword=Passwort zum Versenden der Updates
allowResizing=Skalierung erlauben
resizeSuccessfull=Skalierung erfolgreich abgeschlossen
resizeUnsuccessfull=Skalierung nicht möglich
setUpStorageService=Bitte setze zuerst einen Datei Speicher auf
automaticResizeNeedsStorageService=Die automatische Skalierung benötigt einen funktionierenden FileStorageService.
tag=Tag
tagButtons=Tag-Buttons
tagPanel=Tags
@@ -2138,4 +2146,4 @@ tagNotEditable=Du darfst diesen Tag nicht bearbeiten!
username=Benutzername
confirm=Fortfahren
cancel=Abbrechen
close=Schließen
close=Schließen
@@ -1,5 +1,6 @@
package com.sap.sailing.gwt.ui.server;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilterInputStream;
@@ -52,6 +53,8 @@ import java.util.regex.Pattern;
import java.util.stream.StreamSupport;
import java.util.zip.GZIPInputStream;
import javax.imageio.metadata.IIOMetadata;
import javax.management.InvalidAttributeValueException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
@@ -549,12 +552,15 @@ import com.sap.sse.common.impl.DegreeBearingImpl;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.impl.TimeRangeImpl;
import com.sap.sse.common.mail.MailException;
import com.sap.sse.common.media.MediaTagConstants;
import com.sap.sse.common.media.MimeType;
import com.sap.sse.filestorage.FileStorageManagementService;
import com.sap.sse.filestorage.FileStorageService;
import com.sap.sse.filestorage.InvalidPropertiesException;
import com.sap.sse.filestorage.OperationFailedException;
import com.sap.sse.gwt.client.ServerInfoDTO;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.ImageResizingTaskDTO;
import com.sap.sse.gwt.client.media.VideoDTO;
import com.sap.sse.gwt.dispatch.servlets.ProxiedRemoteServiceServlet;
import com.sap.sse.gwt.server.filestorage.FileStorageServiceDTOUtils;
@@ -583,6 +589,8 @@ import com.sap.sse.shared.media.VideoDescriptor;
import com.sap.sse.shared.media.impl.ImageDescriptorImpl;
import com.sap.sse.shared.media.impl.VideoDescriptorImpl;
import com.sap.sse.util.HttpUrlConnectionHelper;
import com.sap.sse.util.ImageConverter;
import com.sap.sse.util.ImageConverter.ImageWithMetadata;
import com.sap.sse.util.ServiceTrackerFactory;
import com.sap.sse.util.ThreadPoolUtil;
import com.sapsailing.xrr.structureimport.eventimport.RegattaJSON;
@@ -7235,6 +7243,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet
public FileStorageServicePropertyErrorsDTO testFileStorageServiceProperties(String serviceName,
String localeInfoName) throws IOException {
try {
if (serviceName == null) {
serviceName = getActiveFileStorageServiceName();
}
FileStorageService service = getFileStorageService(serviceName);
if (service != null) {
service.testProperties();
@@ -8504,4 +8515,109 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet
}
}
}
@Override
public Set<ImageDTO> resizeImage(final ImageResizingTaskDTO resizingTask) throws Exception {
if (resizingTask.getResizingTask() == null || resizingTask.getResizingTask().size() == 0) {
throw new InvalidAttributeValueException("Resizing Task can not be null or empty");
}
final ImageConverter converter = new ImageConverter();
// calculating the fileType of the image by its uri
final String sourceRef = resizingTask.getImage().getSourceRef();
final String fileType = sourceRef.substring(sourceRef.lastIndexOf(".") + 1);
final ImageWithMetadata imageAndMetadata = converter
.loadImage(HttpUrlConnectionHelper.redirectConnection(new URL(sourceRef)).getInputStream(), fileType);
final List<BufferedImage> resizedImages = converter.convertImage(imageAndMetadata.getImage(),
resizingTask.getResizingTask());
final List<String> sourceRefs = storeImages(resizedImages, fileType, imageAndMetadata.getMetadata());
// if an error occures while storing the files, all already stored files are removed before throwing an
// exception
if (sourceRefs == null || sourceRefs.size() < resizingTask.getResizingTask().size()) {
for (String alreadyStoredFileRef : sourceRefs) {
try {
getService().getFileStorageManagementService().getActiveFileStorageService()
.removeFile(new URI(alreadyStoredFileRef));
} catch (Exception e) {
}
// Exception occured while trying to revert changes after exception
// This only keeps some trash on the FileStorage
}
throw new Exception("Error occured while storing images on the FileStorage");
}
final Set<ImageDTO> resizedImagesAsDTOs = createImageDTOsFromURLsAndResizingTask(sourceRefs, resizingTask,
resizedImages);
for (String tag : resizingTask.getImage().getTags()) {
final MediaTagConstants predefinedTag = MediaTagConstants.fromName(tag);
if (predefinedTag != null && !resizingTask.getResizingTask().contains(predefinedTag)) {
final ImageDTO image = resizingTask.getImage();
for (MediaTagConstants tagConstant : resizingTask.getResizingTask()) {
image.getTags().remove(tagConstant.getName());
}
resizedImagesAsDTOs.add(image);
}
}
return resizedImagesAsDTOs;
}
/**
* Takes a list of source URLs, the resizing task and the sizes of the resized images to create a ImageDTO for every
* resized image
*
* @author Robin Fleige (D067799)
*
* @param sourceRefs
* list of source URLs
* @param resizingTask
* the resizing task, with information about resizes and the original ImageDTO
* @param images
* the BufferedImages, used to get their width and height
* @returns a List of ImageDTOs that contains an ImageDTO per resized image
*/
private Set<ImageDTO> createImageDTOsFromURLsAndResizingTask(final List<String> sourceRefs,
final ImageResizingTaskDTO resizingTask, final List<BufferedImage> images) {
final Set<ImageDTO> imageDTOs = new HashSet<ImageDTO>();
for (int i = 0; i < sourceRefs.size(); i++) {
final ImageDTO imageDTO = resizingTask.cloneImageDTO();
for (MediaTagConstants tag : MediaTagConstants.values()) {
imageDTO.getTags().remove(tag.getName());
}
imageDTO.getTags().add(resizingTask.getResizingTask().get(i).getName());
imageDTO.setSourceRef(sourceRefs.get(i));
imageDTO.setSizeInPx(images.get(i).getWidth(), images.get(i).getHeight());
imageDTOs.add(imageDTO);
}
return imageDTOs;
}
/**
* Stores a list of BufferedImages and returns a list of URLs as Strings under which the BufferedImages are stored
*
* @author Robin Fleige (D067799)
*
* @param resizedImages
* the BufferedImages that will be stored
* @param fileType
* the format of the image, for example "png", "jpeg" or "jpg"
* @param metadata
* the metadata of the original image
* @returns a list of URLs as Strings under which the BufferedImages are stored
*/
private List<String> storeImages(final List<BufferedImage> resizedImages, final String fileType,
final IIOMetadata metadata) {
final List<String> sourceRefs = new ArrayList<>();
try {
for (final BufferedImage resizedImage : resizedImages) {
final InputStream fileStorageStream = new ImageConverter().imageWithMetadataToInputStream(resizedImage,
metadata, fileType);
sourceRefs.add(getService().getFileStorageManagementService().getActiveFileStorageService()
.storeFile(fileStorageStream, "." + fileType, new Long(fileStorageStream.available()))
.toString());
}
} catch (NoCorrespondingServiceRegisteredException | IOException | OperationFailedException
| InvalidPropertiesException e) {
logger.log(Level.SEVERE, "Could not store file. Cause: " + e.getMessage());
}
return sourceRefs;
}
}
@@ -69,7 +69,7 @@ public class EventBaseDTO extends NamedDTO implements IsSerializable {
public ImageDTO getLogoImage() {
ImageDTO result = null;
for (ImageDTO image : images) {
if (image.hasTag(MediaTagConstants.LOGO)) {
if (image.hasTag(MediaTagConstants.LOGO.getName())) {
result = image;
break;
}
@@ -1,39 +0,0 @@
package com.sap.sailing.gwt.ui.shared.media;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.sap.sse.common.media.MediaTagConstants;
import com.sap.sse.common.media.MimeType;
public final class MediaConstants {
// perfect fit would be 1440 x 580
public static final int MIN_STAGE_IMAGE_WIDTH = 1440 / 2;
public static final int MAX_STAGE_IMAGE_WIDTH = 1440 * 2;
public static final int MIN_STAGE_IMAGE_HEIGHT = 580 / 2;
public static final int MAX_STAGE_IMAGE_HEIGHT = 580 * 2;
// perfect fit would be 370 x 240
public static final int MIN_EVENTTEASER_IMAGE_WIDTH = 370 / 2;
public static final int MAX_EVENTTEASER_IMAGE_WIDTH = 370 * 3;
public static final int MIN_EVENTTEASER_IMAGE_HEIGHT = 240 / 2;
public static final int MAX_EVENTTEASER_IMAGE_HEIGHT = 240 * 3;
// perfect fit would be 140 x 140
public static final int MIN_LOGO_IMAGE_WIDTH = 140 / 2;
public static final int MAX_LOGO_IMAGE_WIDTH = 140 * 4;
public static final int MIN_LOGO_IMAGE_HEIGHT = 140 / 2;
public static final int MAX_LOGO_IMAGE_HEIGHT = 140 * 4;
public static final List<String> imageTagSuggestions = Arrays.asList(new String[] { MediaTagConstants.BIGSCREEN,MediaTagConstants.STAGE, MediaTagConstants.TEASER,
MediaTagConstants.SPONSOR, MediaTagConstants.LOGO, MediaTagConstants.GALLERY });
public static final List<String> videoTagSuggestions = Arrays.asList(new String[] { MediaTagConstants.BIGSCREEN,MediaTagConstants.LIVESTREAM, MediaTagConstants.HIGHLIGHT, MediaTagConstants.FEATURED, MediaTagConstants.STAGE });
public static final Set<MimeType> SUPPORTED_VIDEO_TYPES = new HashSet<>(Arrays.asList(MimeType.youtube, MimeType.vimeo, MimeType.mp4, MimeType.mp4panorama, MimeType.mp4panoramaflip));
private MediaConstants() {
}
}
@@ -241,6 +241,7 @@ public abstract class CanvasOverlayV3 {
public void onAdd(OverlayViewMethods methods) {
methods.getPanes().getMapPane().appendChild(canvas.getElement());
CanvasOverlayV3.this.onAttach();
methods.getPanes().getOverlayMouseTarget().appendChild(canvas.getElement());
}
};
return result;
@@ -72,6 +72,12 @@ public class Swarm implements TimeListener {
private final ColorMapper colorMapper;
private boolean clearNextFrame = false;
/**
* For a windfield that has no wind speed spread, e.g. only one wind speed source, this value will be used to define
* a {@link ValueRangeFlexibleBoundaries} for this swarm.
*/
private static double WINDSPEED_DEFAULT_SPREAD_IN_KNOTS = 0.1;
public Swarm(FullCanvasOverlay fullcanvas, MapWidget map, com.sap.sse.gwt.client.player.Timer timer,
VectorField vectorField, StreamletParameters streamletPars) {
@@ -346,10 +352,12 @@ public class Swarm implements TimeListener {
}
}
}
if (Math.abs(maxSpeedInKnots - minSpeedInKnots) <= 0.01 && minSpeedInKnots < maxSpeedInKnots) {
valueRange.setMinMax(minSpeedInKnots - 0.1, maxSpeedInKnots + 0.1);
} else if (minSpeedInKnots <= maxSpeedInKnots) {
valueRange.setMinMax(minSpeedInKnots, maxSpeedInKnots);
if (minSpeedInKnots <= maxSpeedInKnots) {
if (Math.abs(maxSpeedInKnots - minSpeedInKnots) <= WINDSPEED_DEFAULT_SPREAD_IN_KNOTS) {
valueRange.setMinMax(minSpeedInKnots - WINDSPEED_DEFAULT_SPREAD_IN_KNOTS, maxSpeedInKnots + WINDSPEED_DEFAULT_SPREAD_IN_KNOTS);
} else {
valueRange.setMinMax(minSpeedInKnots, maxSpeedInKnots);
}
}
drawSwarm();
return true;
@@ -367,12 +367,12 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
Event event = new EventImpl(eventName, eventStartDate, eventEndDate, venue, /*isPublic*/ true, UUID.randomUUID());
ImageDescriptor image1 = new ImageDescriptorImpl(imageURL, createdAt);
image1.addTag(MediaTagConstants.GALLERY);
image1.addTag(MediaTagConstants.GALLERY.getName());
event.addImage(image1);
ImageDescriptor image2 = new ImageDescriptorImpl(sponsorImageURL, createdAt);
event.addImage(image2);
image2.addTag(MediaTagConstants.SPONSOR);
image2.addTag(MediaTagConstants.SPONSOR.getName());
VideoDescriptor video1 = new VideoDescriptorImpl(videoURL, MimeType.mp4, createdAt);
event.addVideo(video1);
@@ -383,8 +383,8 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
final Event loadedEvent = dof.loadEvent(eventName);
assertEquals(2, Util.size(loadedEvent.getImages()));
assertEquals(1, Util.size(loadedEvent.getVideos()));
assertEquals(1, Util.size(loadedEvent.findImagesWithTag(MediaTagConstants.GALLERY)));
assertEquals(1, Util.size(loadedEvent.findImagesWithTag(MediaTagConstants.SPONSOR)));
assertEquals(1, Util.size(loadedEvent.findImagesWithTag(MediaTagConstants.GALLERY.getName())));
assertEquals(1, Util.size(loadedEvent.findImagesWithTag(MediaTagConstants.SPONSOR.getName())));
assertEquals(1, Util.size(loadedEvent.getVideos()));
}
@@ -82,9 +82,12 @@ public class CompetitorJsonDeserializer implements JsonDeserializer<DynamicCompe
CompetitorJsonConstants.FIELD_TEAM));
}
final DynamicBoat boat = getBoat(object, /* default ID */ competitorId);
final Double timeOnTimeFactor = (Double) object.get(CompetitorJsonConstants.FIELD_TIME_ON_TIME_FACTOR);
final Double timeOnDistanceAllowanceInSecondsPerNauticalMile = (Double) object
final Number timeOnTimeFactorAsNumber = (Number) object.get(CompetitorJsonConstants.FIELD_TIME_ON_TIME_FACTOR);
final Double timeOnTimeFactor = timeOnTimeFactorAsNumber != null ? timeOnTimeFactorAsNumber.doubleValue() : 0.0;
final Number timeOnDistanceAllowanceInSecondsPerNauticalMileAsNumber = (Number) object
.get(CompetitorJsonConstants.FIELD_TIME_ON_DISTANCE_ALLOWANCE_IN_SECONDS_PER_NAUTICAL_MILE);
final Double timeOnDistanceAllowanceInSecondsPerNauticalMile = timeOnDistanceAllowanceInSecondsPerNauticalMileAsNumber != null ?
timeOnDistanceAllowanceInSecondsPerNauticalMileAsNumber.doubleValue() : 0.0;
final DynamicCompetitor result;
if (boat == null) {
result = competitorWithBoatFactory.getOrCreateCompetitor(competitorId, name, shortName, displayColor, email,
@@ -1,5 +1,6 @@
package com.sap.sailing.server.operationaltransformation;
import java.util.ArrayList;
import java.util.logging.Logger;
import com.sap.sailing.domain.base.Competitor;
@@ -8,6 +9,7 @@ import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
import com.sap.sse.common.Util;
public class UpdateMarkPassings extends AbstractRaceOperation<Void> {
private static final long serialVersionUID = 8462323149468755367L;
@@ -19,7 +21,11 @@ public class UpdateMarkPassings extends AbstractRaceOperation<Void> {
Iterable<MarkPassing> markPassings) {
super(raceIdentifier);
this.competitor = competitor;
this.markPassings = markPassings;
// ensure that markPassings is a serializable collection; Iterable could, e.g., also
// be a TreeMap.Values collection or similar. See also bug 4746.
final ArrayList<MarkPassing> markPassingsList = new ArrayList<>();
Util.addAll(markPassings, markPassingsList);
this.markPassings = markPassingsList;
}
@Override
@@ -20,7 +20,7 @@
<plugin>
<groupId>org.eclipse.tycho.extras</groupId>
<artifactId>tycho-p2-extras-plugin</artifactId>
<version>${tycho-version}</version>
<version>1.0.0</version>
<configuration>
<sourceLocation>${basedir}</sourceLocation>
</configuration>
@@ -1,3 +1,3 @@
The former "p2admin" target definition is not tracked in the repository anymore.
Instead, it can be generated from the existing target definition via ``../scripts/createLocalTargetDef.sh``.
This script copies the existing target definition and replaces the remote URL ``http://p2.sapsailing.com/p2/sailing/`` with a local ``file://`` URL.
This script copies the existing target definition and replaces the remote URL ``https://p2.sapsailing.com/p2/sailing/`` with a local ``file://`` URL.
@@ -1,9 +1,10 @@
#!/bin/bash
source ./../../../configuration/correctFilePathInRelationToCurrentOs.sh
# generate a target definition pointing to the locally built p2 repo from the race-analysis-p2-remote target defintion
base="../definitions/race-analysis-p2"
remote_repo="http://p2.sapsailing.com/p2/sailing/"
local_repo="file://`readlink -f ../../com.sap.sailing.targetplatform.base/target/repository/ | sed -e 's/\/cygdrive\/\(.\)/\/\1:/'`"
remote_repo="https://p2.sapsailing.com/p2/sailing/"
#reading the filepath and editing it, so it fits for eclipse #currently save works for cygwin, gitbash and linux
local_repo=$(correct_file_path "`readlink -f ../../com.sap.sailing.targetplatform.base/target/repository/`")
local_repo="file:/$local_repo"
# replace remote p2-repo URL with local repo URL
sed -e "/^<repository location=\"/ s@$remote_repo@$local_repo@" -e 's/target name="Race Analysis Target"/target name="Race Analysis Local Target"/' $base-remote.target > $base-local.target
@@ -21,8 +21,14 @@
<div class="mainContent">
<h2 class="releaseHeadline">Release Notes - Administration Console</h2>
<div class="innerContent">
<h2 class="articleSubheadline">July 2018</h2>
<h2 class="articleSubheadline">September 2018</h2>
<ul class="bulletList">
<li>Added automatic resizing when adding images to an event using the ImageDialog.
It shows a check box if resizing is necessary, if you check it, the service will resize the image for you.</li>
<li>Now showing an error when trying to upload an image or video to an event and no working FileStorageService is registered.</li>
</ul>
<h2 class="articleSubheadline">August 2018</h2>
<ul class="bulletList">
<li>The mark passing editor now uses a full date/time format for the mark passing time points.</li>
<li>The TracTrac connector panel no longer shows a password visibly but uses a password text field.</li>
@@ -1,13 +1,70 @@
package com.sap.sse.common.media;
public interface MediaTagConstants {
static final String GALLERY = "Gallery";
static final String STAGE = "Stage";
static final String LOGO = "Logo";
static final String TEASER = "Teaser";
static final String SPONSOR = "Sponsor";
static final String HIGHLIGHT = "Highlight";
static final String LIVESTREAM = "Livestream";
static final String FEATURED = "Featured";
static final String BIGSCREEN = "BigScreen";
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public enum MediaTagConstants {
GALLERY("Gallery", 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE),
STAGE("Stage", 1440 / 2, 1440 * 2, 580 / 2, 580 * 2), // perfect fit would be 1440 x 580
LOGO("Logo", 140 / 2, 140 * 4, 140 / 2, 140 * 4), // perfect fit would be 140 x 140
TEASER("Teaser", 370 / 2, 370 * 3, 240 / 2, 240 * 3), // perfect fit would be 370 x 240
SPONSOR("Sponsor", 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE),
HIGHLIGHT("Highlight", 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE),
LIVESTREAM("Livestream", 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE),
FEATURED("Featured", 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE),
BIGSCREEN("BigScreen", 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE);
private final String name;
private final int minWidth;
private final int maxWidth;
private final int minHeight;
private final int maxHeight;
public static final List<String> imageTagSuggestions = Arrays.asList(new String[] { BIGSCREEN.getName(),
STAGE.getName(), TEASER.getName(), SPONSOR.getName(), LOGO.getName(), GALLERY.getName() });
public static final List<String> videoTagSuggestions = Arrays.asList(new String[] { BIGSCREEN.getName(),
LIVESTREAM.getName(), HIGHLIGHT.getName(), FEATURED.getName(), STAGE.getName() });
public static final Set<MimeType> SUPPORTED_VIDEO_TYPES = new HashSet<>(Arrays.asList(MimeType.youtube,
MimeType.vimeo, MimeType.mp4, MimeType.mp4panorama, MimeType.mp4panoramaflip));
private MediaTagConstants(String name, int minWidth, int maxWidth, int minHeight, int maxHeight) {
this.name = name;
this.minWidth = minWidth;
this.maxWidth = maxWidth;
this.minHeight = minHeight;
this.maxHeight = maxHeight;
}
public String getName() {
return name;
}
public int getMinWidth() {
return minWidth;
}
public int getMaxWidth() {
return maxWidth;
}
public int getMinHeight() {
return minHeight;
}
public int getMaxHeight() {
return maxHeight;
}
public static MediaTagConstants fromName(String name) {
MediaTagConstants toReturn = null;
for (MediaTagConstants mediaTagConstant : MediaTagConstants.values()) {
if (mediaTagConstant.getName().equals(name)) {
toReturn = mediaTagConstant;
}
}
return toReturn;
}
}
@@ -109,7 +109,7 @@ public class AmazonS3FileStorageServiceImpl extends BaseFileStorageServiceImpl i
@Override
public void removeFile(URI uri) throws InvalidPropertiesException, OperationFailedException {
String key = uri.getPath().substring(1); // remove initial slash
String key = uri.getPath().substring(uri.getPath().lastIndexOf("/")+1);
AmazonS3Client s3Client = createS3Client();
try {
s3Client.deleteObject(new DeleteObjectRequest(bucketName.getValue(), key));
@@ -123,12 +123,16 @@ public class AmazonS3FileStorageServiceImpl extends BaseFileStorageServiceImpl i
public void testProperties() throws InvalidPropertiesException {
AmazonS3Client s3 = createS3Client();
if (bucketName.getValue().equals("")) {
throw new InvalidPropertiesException("empty bucketname is not allowed");
}
// test if credentials are valid
// TODO seems to even work if credentials are not valid if bucket is publicly visible
try {
s3.doesBucketExist(bucketName.getValue());
} catch (Exception e) {
throw new InvalidPropertiesException("invalid credentials or not enough access rights for the bucket", e,
throw new InvalidPropertiesException("invalid credentials or not enough access rights for the bucket" + e.getCause(), e,
new Pair<FileStorageServiceProperty, String>(accessId, "seems to be invalid"),
new Pair<FileStorageServiceProperty, String>(accessKey, "seems to be invalid"));
}
@@ -93,4 +93,6 @@ public interface StringMessages extends Messages {
String explainReplicationServletPort();
String ok();
String setUpStorageService();
}
@@ -47,7 +47,15 @@ public class URLFieldWithFileUpload extends Composite implements HasValue<String
private boolean valueChangeHandlerInitialized = false;
private final FormPanel uploadFormPanel;
private final HorizontalPanel uploadPanel;
public URLFieldWithFileUpload(final StringMessages stringMessages) {
this(stringMessages, true);
}
public URLFieldWithFileUpload(final StringMessages stringMessages, boolean initiallyEnableUpload) {
final VerticalPanel mainPanel = new VerticalPanel();
final HorizontalPanel imageUrlPanel = new HorizontalPanel();
mainPanel.add(new Label(stringMessages.pleaseOnlyUploadContentYouHaveAllUsageRightsFor()));
@@ -83,11 +91,13 @@ public class URLFieldWithFileUpload extends Composite implements HasValue<String
imageUrlPanel.add(removePanel);
// the upload panel
FormPanel uploadFormPanel = new FormPanel();
uploadFormPanel = new FormPanel();
mainPanel.add(uploadFormPanel);
HorizontalPanel uploadPanel = new HorizontalPanel();
uploadPanel = new HorizontalPanel();
uploadPanel.setSpacing(3);
uploadFormPanel.add(uploadPanel);
if(initiallyEnableUpload) {
uploadFormPanel.add(uploadPanel);
}
uploadFormPanel.setAction("/sailingserver/fileupload");
uploadFormPanel.setEncoding(FormPanel.ENCODING_MULTIPART);
uploadFormPanel.setMethod(FormPanel.METHOD_POST);
@@ -198,4 +208,12 @@ public class URLFieldWithFileUpload extends Composite implements HasValue<String
private JSONValue parseAfterReplacingSurroundingPreElement(String jsonString) {
return JSONParser.parseStrict(jsonString.replaceFirst("<pre[^>]*>(.*)</pre>", "$1"));
}
public void setUploadEnabled(boolean uploadEnabled) {
if (uploadEnabled) {
uploadFormPanel.add(uploadPanel);
} else {
uploadFormPanel.remove(uploadPanel);
}
}
}
@@ -24,7 +24,7 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
* {@link ListEditorComposite} with the respective {@link ExpandedListEditorUi} strategy that will be passed through
* from this class's constructor to the {@link #createExpandedUi(List, ExpandedListEditorUi)} method.<p>
*
* Implementing subclasses may choose to override the {@link #onRowAdded()} and/or the {@link #onRowRemoved()} method(s)
* Implementing subclasses may choose to override the {@link #onRowAdded()} and/or the {@link #onRowRemoved(int)} method(s)
* to be notified of changes to the list.
*
* @author Lukas Niemeier
@@ -123,7 +123,7 @@ public abstract class CollapsedListEditorUi<ValueType> extends ListEditorUi<Valu
}
@Override
public void onRowRemoved() {
public void onRowRemoved(int rowIndex) {
}
}
@@ -24,7 +24,7 @@ import com.sap.sse.gwt.client.StringMessages;
* "Remove" button is shown.
* <p>
*
* Implementing subclasses may choose to override the {@link #onRowAdded()} and/or the {@link #onRowRemoved()} method(s)
* Implementing subclasses may choose to override the {@link #onRowAdded()} and/or the {@link #onRowRemoved(int)} method(s)
* to be notified of changes to the list. Alternatively or in addition, clients can
* {@link ListEditorComposite#addValueChangeHandler(com.google.gwt.event.logical.shared.ValueChangeHandler) add a value
* change handler} to the enclosing {@link ListEditorComposite}.
@@ -37,7 +37,7 @@ import com.sap.sse.gwt.client.StringMessages;
public abstract class ExpandedListEditorUi<ValueType> extends ListEditorUi<ValueType> {
private final ImageResource removeImage;
private Grid expandedValuesGrid;
protected Grid expandedValuesGrid;
private final boolean canRemoveItems;
/**
@@ -80,7 +80,7 @@ public abstract class ExpandedListEditorUi<ValueType> extends ListEditorUi<Value
}
}
private void addRow(ValueType newValue) {
protected void addRow(ValueType newValue) {
int rowIndex = expandedValuesGrid.insertRow(expandedValuesGrid.getRowCount());
if (canRemoveItems) {
PushButton removeButton = new PushButton(new Image(removeImage));
@@ -104,7 +104,7 @@ public abstract class ExpandedListEditorUi<ValueType> extends ListEditorUi<Value
context.getValue().remove(rowIndexToRemove);
context.onChange();
onRowRemoved();
onRowRemoved(rowIndexToRemove);
}
/**
@@ -136,6 +136,6 @@ public abstract class ExpandedListEditorUi<ValueType> extends ListEditorUi<Value
}
@Override
public void onRowRemoved() {
public void onRowRemoved(int rowIndex) {
}
}
@@ -0,0 +1,151 @@
package com.sap.sse.gwt.client.controls.listedit;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.gwt.client.StringMessages;
/**
* Creates the editable list with a checkbox for every list item
*
* @author Robin Fleige(D067799)
*
* @param <ValueType>
* The type of the items in the list
*/
public class ExpandedUiWithCheckboxes<ValueType> extends GenericStringListInlineEditorComposite.ExpandedUi<ValueType> {
private final List<CheckBox> checkBoxes;
private final String checkBoxText;
private final List<ChangeHandler> changeHandler = new ArrayList<>();
static final ListEditorResources ress = GWT.create(ListEditorResources.class);
/**
* Creates an editable list with checkboxes for every entry
*
* @param stringMessages
* the holder of the used strings
* @param removeImage
* the icon for removing an entry from the editor
* @param suggestValues
* values that will be suggested when entering something into the editor
* @param placeholderTextForAddTextbox
* @param textBoxSize
* the size if the textbox
* @param checkBoxText
* the text shown next to the checkboxes
*/
public ExpandedUiWithCheckboxes(StringMessages stringMessages, ImageResource removeImage,
List<String> suggestValues, String placeholderTextForAddTextbox, int textBoxSize, String checkBoxText) {
super(stringMessages, removeImage, suggestValues, placeholderTextForAddTextbox, textBoxSize);
this.checkBoxes = new ArrayList<CheckBox>();
this.checkBoxText = checkBoxText;
ress.css().ensureInjected();
}
/**
* Used for the css styles
*/
interface ListEditorResources extends ClientBundle {
@Source("ListEditor.gss")
ListEditorCSS css();
}
interface ListEditorCSS extends CssResource {
String checkBoxInvisible();
String checkBoxNormal();
String checkBoxError();
}
/**
* Returns the checkboxes,so they can be accessed from another class
*
* @returns the checkboxes
*/
public List<CheckBox> getCheckBoxes() {
return checkBoxes;
}
/**
* used to set the checkbox style from another class
*
* @returns String the StyleName of the style
*/
public static String getInvisibleStyle() {
return ress.css().checkBoxInvisible();
}
public static String getErrorStyle() {
return ress.css().checkBoxError();
}
public static String getNormalStyle() {
return ress.css().checkBoxNormal();
}
/**
* See {@link ExpandedListEditorUi#addRow(Object)}
*/
@Override
protected void addRow(ValueType newValue) {
super.addRow(newValue);
final CheckBox checkBox = new CheckBox(checkBoxText);
checkBox.setStylePrimaryName(getInvisibleStyle());
checkBox.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
CheckBox source = (CheckBox) event.getSource();
if (source.getValue()) {
source.setStylePrimaryName(getNormalStyle());
} else {
source.setStylePrimaryName(getErrorStyle());
}
for (ChangeHandler changeHandler : ExpandedUiWithCheckboxes.this.changeHandler) {
changeHandler.onChange(null);
}
}
});
checkBoxes.add(checkBox);
expandedValuesGrid.setWidget(expandedValuesGrid.getRowCount() - 1, 2, checkBox);
}
/**
* See {@link ListEditorUiStrategy#initWidget()}
*/
@Override
public Widget initWidget() {
expandedValuesGrid = new Grid(0, 3);
expandedValuesGrid.ensureDebugId("ExpandedValuesGrid");
VerticalPanel panel = new VerticalPanel();
panel.add(createAddWidget());
panel.add(expandedValuesGrid);
return panel;
}
/**
* See {@link ListEditorUiStrategy#onRowRemoved(int)}
*/
@Override
public void onRowRemoved(int rowIndex) {
checkBoxes.remove(rowIndex);
}
public void addChangeHandler(ChangeHandler handler) {
changeHandler.add(handler);
}
}
@@ -0,0 +1,23 @@
.checkBoxInvisible {
visibility : hidden;
background-color : red;
padding: 3px;
padding-right: 5px;
padding-bottom: 4px;
}
.checkBoxNormal {
visibility : visible;
background-color : white;
padding: 3px;
padding-right: 5px;
padding-bottom: 4px;
}
.checkBoxError {
visibility : visible;
background-color : red;
padding: 3px;
padding-right: 5px;
padding-bottom: 4px;
}
@@ -10,7 +10,7 @@ import com.google.gwt.user.client.ui.Widget;
* {@link ListEditorComposite#getValue() values} of the context editor that was passed to
* {@link #setContext(ListEditorComposite)} during editor initialization.<p>
*
* Objects will receive calls to {@link #onRowAdded()} when a value was added to the list, and {@link #onRowRemoved()} when
* Objects will receive calls to {@link #onRowAdded()} when a value was added to the list, and {@link #onRowRemoved(int)} when
* a value was removed from the list.<p>
*
* There are two default implementations of this interface: {@link CollapsedListEditorUi} and {@link ExpandedListEditorUi}.
@@ -54,6 +54,7 @@ public interface ListEditorUiStrategy<ValueType> {
/**
* Called by the framework after a value was removed from the list. Note that this is not the place for this UI
* strategy to actually implement the UI changes. Those are expected to already have happened before.
* @param rowIndex The index of the removed row
*/
void onRowRemoved();
void onRowRemoved(int rowIndex);
}
@@ -19,6 +19,8 @@ public interface FileStorageManagementGwtService extends RemoteService {
FileStorageServiceDTO[] getAvailableFileStorageServices(String localeInfoName);
/**
* If serviceName is null, calls {@link FileStorageManagementGwtService#getActiveFileStorageServiceName()} and uses the returned name
*
* @throws NoCorrespondingServiceRegisteredException service may have disappeared from registry in the meantime
*/
FileStorageServicePropertyErrorsDTO testFileStorageServiceProperties(String serviceName, String localeInfoName) throws NoCorrespondingServiceRegisteredException, IOException;
@@ -25,6 +25,7 @@ public abstract class AbstractMediaDTO implements IsSerializable, Comparable<Abs
protected String locale;
/** for GWT */
@Deprecated
protected AbstractMediaDTO() {
}
@@ -7,6 +7,7 @@ import com.sap.sse.common.media.MimeType;
public class ImageDTO extends AbstractMediaDTO {
/** for GWT */
@Deprecated
protected ImageDTO() {
}
@@ -0,0 +1,95 @@
package com.sap.sse.gwt.client.media;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sse.common.media.MediaTagConstants;
import com.sap.sse.common.media.MimeType;
/**
* Used to transfer an {@link ImageDTO} and a list of {@link MediaTagConstants} which store information on how to resize the image
* This class is used to validate an ImageDTO in the ImageDialog.ImageParameterValidator.
* After the validation passed, if the resizingTask is empty, it will be only used to transfer the ImageDTO.
* If the resizingTask is not empty it will be transfered to the SailingService#resizeImage,
* where it will be used to create multiple {@link ImageDTO} with sizes fitting to the {@link MediaTagConstants}
*
* @author Robin Fleige (D067799)
*
*/
public class ImageResizingTaskDTO implements IsSerializable {
private ImageDTO image;
// contains the list of resizing tasks, can not be null, if this is empty the ImageResizingTaskDTO is only an upload
// task
private List<MediaTagConstants> resizingTask;
/** for GWT */
@Deprecated
protected ImageResizingTaskDTO() {
}
/**
* Creates an {@link ImageDTO} from the parameters
*
* @param imageRef
* needed for creating ImageDTO
* @param createdAtDate
* needed for creating ImageDTO
* @param resizingTask
* stored Information about resizing
*/
public ImageResizingTaskDTO(String imageRef, Date createdAtDate, List<MediaTagConstants> resizingTask) {
this(new ImageDTO(imageRef, createdAtDate), resizingTask);
}
/**
*
* @param image
* the stored ImageDTO
* @param resizingTask
* stored Information about resizing
*/
public ImageResizingTaskDTO(ImageDTO image, List<MediaTagConstants> resizingTask) {
this.image = image;
this.resizingTask = resizingTask;
}
/**
* @returns the ImageDTO
*/
public ImageDTO getImage() {
return image;
}
/**
* @returns the List of MediaTagConstants
*/
public List<MediaTagConstants> getResizingTask() {
return resizingTask;
}
/**
* Creates a clone of the ImageDTo with new references, so they do not interfere Used for resizing to edit
* afterwards, to easily copy all data from the original ImageDTO
*
* @returns a clone of the ImageDTO
*/
public ImageDTO cloneImageDTO() {
final ImageDTO toReturn = new ImageDTO(image.getSourceRef(), image.getCreatedAtDate());
toReturn.setTitle(image.getTitle());
toReturn.setCopyright(image.getCopyright());
toReturn.setLocale(image.getLocale());
// creating a new mimetype object so they do not use the same reference
toReturn.setMimeType(MimeType.byName(image.getMimeType().name()));
toReturn.setSizeInPx(image.getWidthInPx(), image.getHeightInPx());
toReturn.setSubtitle(image.getSubtitle());
// Creating a new list, so they have the same tags, but not use the same reference to these tags, otherwise they
// could affect each other by editing this list
final List<String> tags = new ArrayList<>();
tags.addAll(image.getTags());
toReturn.setTags(tags);
return toReturn;
}
}
@@ -10,6 +10,7 @@ public class VideoDTO extends AbstractMediaDTO {
private String thumbnailRef;
/** for GWT */
@Deprecated
protected VideoDTO() {
}
@@ -34,7 +35,7 @@ public class VideoDTO extends AbstractMediaDTO {
}
public boolean isFeatured() {
return hasTag(MediaTagConstants.FEATURED);
return hasTag(MediaTagConstants.FEATURED.getName());
}
@Override
@@ -729,7 +729,7 @@ body ::-webkit-scrollbar-track {
}
.gwt-Button, .gwt-Button:visited {
font-size: 0, 9rem;
font-size: 0.9rem;
display: inline-block;
color: #fff;
border: none;
@@ -1,111 +1,111 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.gwtplugins.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.gwtplugins.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.gwtplugins.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9877"/>
<listAttribute key="com.gwtplugins.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sse.security.ui.Login"/>
<listEntry value="com.sap.sse.security.ui.Register"/>
<listEntry value="com.sap.sse.security.ui.UserManagement"/>
<listEntry value="com.sap.sse.security.ui.OAuthLogin"/>
<listEntry value="com.sap.sse.security.ui.EmailValidation"/>
<listEntry value="com.sap.sse.security.ui.EditProfile"/>
</listAttribute>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.URL" value="/security/ui/Login.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sse.security.ui"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.googlecode.java-diff-utils/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.annotations/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.json.simple/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.geocoding/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.udpconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server.gateway.serialization.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.filestorage/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.filestorage/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mongodb/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.replication/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.operationaltransformation/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server.gateway.serialization/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.simulator/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.simulator/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.tractrac.clientmodule/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mail/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.competitorimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.schema/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.freg.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingreplayadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.igtimiadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.igtimiadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.provider/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.racelogtrackingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.racelogtrackingadapter/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.manage2sail/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.manage2sail/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.structureimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.news/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.gwt.ui&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;com.sap.sse.common&quot; type=&quot;1&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.gwtplugins.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<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 -workDir &quot;${project_loc:com.sap.sse.security.ui}/.tmp/gwt-work&quot; -war &quot;${project_loc:com.sap.sse.security.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9877 -startupUrl /security/ui/Login.html -startupUrl /security/ui/EditProfile.html -startupUrl /security/ui/EmailValidation.html -startupUrl /security/ui/UserManagement.html -startupUrl /security/ui/Register.html -startupUrl /security/ui/Login.html com.sap.sse.security.ui.EditProfile com.sap.sse.security.ui.EmailValidation com.sap.sse.security.ui.OAuthLogin com.sap.sse.security.ui.UserManagement com.sap.sse.security.ui.Register com.sap.sse.security.ui.Login"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sse.security.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XX:+UseG1GC -XX:+UseStringDeduplication -Dgwt.watchFileChanges=false -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.gwtplugins.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9877"/>
<listAttribute key="com.gwtplugins.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sse.security.ui.Login"/>
<listEntry value="com.sap.sse.security.ui.Register"/>
<listEntry value="com.sap.sse.security.ui.UserManagement"/>
<listEntry value="com.sap.sse.security.ui.OAuthLogin"/>
<listEntry value="com.sap.sse.security.ui.EmailValidation"/>
<listEntry value="com.sap.sse.security.ui.EditProfile"/>
</listAttribute>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.URL" value="/security/ui/Login.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sse.security.ui"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.googlecode.java-diff-utils/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.annotations/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.json.simple/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.geocoding/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.udpconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server.gateway.serialization.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.filestorage/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.filestorage/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mongodb/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.replication/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.operationaltransformation/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server.gateway.serialization/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.simulator/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.simulator/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.tractrac.clientmodule/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mail/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.competitorimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.schema/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.freg.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingreplayadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.igtimiadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.igtimiadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.provider/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.racelogtrackingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.racelogtrackingadapter/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.manage2sail/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.manage2sail/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.structureimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.news/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.gwt.ui&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;com.sap.sse.common&quot; type=&quot;1&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.gwtplugins.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<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 -workDir &quot;${project_loc:com.sap.sse.security.ui}/.tmp/gwt-work&quot; -war &quot;${project_loc:com.sap.sse.security.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9877 -startupUrl /security/ui/Login.html -startupUrl /security/ui/EditProfile.html -startupUrl /security/ui/EmailValidation.html -startupUrl /security/ui/UserManagement.html -startupUrl /security/ui/Register.html -startupUrl /security/ui/Login.html com.sap.sse.security.ui.EditProfile com.sap.sse.security.ui.EmailValidation com.sap.sse.security.ui.OAuthLogin com.sap.sse.security.ui.UserManagement com.sap.sse.security.ui.Register com.sap.sse.security.ui.Login"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sse.security.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XX:+UseG1GC -XX:+UseStringDeduplication -Dgwt.watchFileChanges=false -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work"/>
</launchConfiguration>
@@ -1,112 +1,112 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.gwtplugins.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.gwtplugins.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.gwtplugins.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9877"/>
<listAttribute key="com.gwtplugins.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sse.security.ui.Login"/>
<listEntry value="com.sap.sse.security.ui.Register"/>
<listEntry value="com.sap.sse.security.ui.UserManagementEntryPoint"/>
<listEntry value="com.sap.sse.security.ui.OAuthLogin"/>
<listEntry value="com.sap.sse.security.ui.EmailValidation"/>
<listEntry value="com.sap.sse.security.ui.EditProfile"/>
</listAttribute>
<booleanAttribute key="com.gwtplugins.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.URL" value="/security/ui/Login.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sse.security.ui"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.googlecode.java-diff-utils/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.annotations/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.json.simple/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.geocoding/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.udpconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server.gateway.serialization.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.filestorage/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.filestorage/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mongodb/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.replication/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.operationaltransformation/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server.gateway.serialization/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.simulator/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.simulator/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.tractrac.clientmodule/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mail/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.competitorimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.schema/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.freg.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingreplayadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.igtimiadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.igtimiadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.provider/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.racelogtrackingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.racelogtrackingadapter/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.manage2sail/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.manage2sail/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.structureimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.news/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.gwt.ui&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;com.sap.sse.common&quot; type=&quot;1&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.gwtplugins.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-incremental -workDir &quot;${project_loc:com.sap.sse.security.ui}/.tmp/gwt-work&quot; -war &quot;${project_loc:com.sap.sse.security.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9877 -startupUrl /security/ui/Login.html -startupUrl /security/ui/EditProfile.html -startupUrl /security/ui/EmailValidation.html -startupUrl /security/ui/UserManagement.html -startupUrl /security/ui/Register.html -startupUrl /security/ui/Login.html com.sap.sse.security.ui.EditProfile com.sap.sse.security.ui.EmailValidation com.sap.sse.security.ui.OAuthLogin com.sap.sse.security.ui.UserManagementEntryPoint com.sap.sse.security.ui.Register com.sap.sse.security.ui.Login"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sse.security.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XX:+UseG1GC -XX:+UseStringDeduplication -Dgwt.watchFileChanges=false -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.gwtplugins.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
<booleanAttribute key="com.gwtplugins.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.CLASSIC_DEVMODE_CODE_SERVER_PORT" value="9877"/>
<listAttribute key="com.gwtplugins.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sse.security.ui.Login"/>
<listEntry value="com.sap.sse.security.ui.Register"/>
<listEntry value="com.sap.sse.security.ui.UserManagementEntryPoint"/>
<listEntry value="com.sap.sse.security.ui.OAuthLogin"/>
<listEntry value="com.sap.sse.security.ui.EmailValidation"/>
<listEntry value="com.sap.sse.security.ui.EditProfile"/>
</listAttribute>
<booleanAttribute key="com.gwtplugins.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
<stringAttribute key="com.gwtplugins.gwt.eclipse.core.URL" value="/security/ui/Login.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sse.security.ui"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.debug.ui.CONSIDER_INHERITED_MAIN" value="true"/>
<booleanAttribute key="org.eclipse.jdt.debug.ui.INCLUDE_EXTERNAL_JARS" value="true"/>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8&quot; javaProject=&quot;com.sap.sailing.gwt.ui&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.googlecode.java-diff-utils/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.annotations/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.common/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.json.simple/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.geocoding/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.declination/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.udpconnector/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server.gateway.serialization.shared.android/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.filestorage/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.filestorage/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mongodb/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.replication/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.operationaltransformation/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.expeditionconnector.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server.gateway.serialization/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.simulator/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.simulator/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.tractrac.clientmodule/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.mail/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.competitorimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.schema/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.tractracadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.freg.resultimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.swisstimingreplayadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.igtimiadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.igtimiadapter.persistence/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.datamining.provider/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.racelogtrackingadapter/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.racelogtrackingadapter/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.manage2sail/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.manage2sail/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.xrr.structureimport/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.security.ui/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.news/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining.shared/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.polars.datamining/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.gwt.ui&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry path=&quot;3&quot; projectName=&quot;com.sap.sse.common&quot; type=&quot;1&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.gwtplugins.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-incremental -workDir &quot;${project_loc:com.sap.sse.security.ui}/.tmp/gwt-work&quot; -war &quot;${project_loc:com.sap.sse.security.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9877 -startupUrl /security/ui/Login.html -startupUrl /security/ui/EditProfile.html -startupUrl /security/ui/EmailValidation.html -startupUrl /security/ui/UserManagement.html -startupUrl /security/ui/Register.html -startupUrl /security/ui/Login.html com.sap.sse.security.ui.EditProfile com.sap.sse.security.ui.EmailValidation com.sap.sse.security.ui.OAuthLogin com.sap.sse.security.ui.UserManagementEntryPoint com.sap.sse.security.ui.Register com.sap.sse.security.ui.Login"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sse.security.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XX:+UseG1GC -XX:+UseStringDeduplication -Dgwt.watchFileChanges=false -Xmx2048m -Dgwt-usearchives=false -Dgwt.persistentunitcache=false"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc:com.sap.sailing.gwt.ui}/.tmp/gwt-work"/>
</launchConfiguration>
View File
File mode changed.
@@ -0,0 +1,118 @@
package com.sap.see.pairinglist.test;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.logging.Logger;
import org.junit.Test;
/**
* Constructs randomized number sequences of equal length, for each element in the sequence using a random number
* between 0 and a given limit, say {@code c}. The sequences are then ordered numerically, such that two sequences are
* equal if all their elements are equal, and with s1 being less than s2 if the first element where s1 and s2 differ is
* less for s1. Then, by enumerating the sorted list of sequences, the number of changed elements between the previous
* and the next element is counted. This number is then related to the total number of sequence elements produced in the
* process. In addition to the {@code c} parameter the process is parameterized by the number of sequences to generate
* ({@code i}) and the length of each sequence ({@code f}).
*
* @author Axel Uhl (d043530)
*
*/
public class CommonPrefixStatsTest {
private static final Logger logger = Logger.getLogger(CommonPrefixStatsTest.class.getName());
private final Random random = new Random();
private final Comparator<int[]> sequenceComparator = (s1, s2)->{
for (int i=0; i<s1.length; i++) {
if (s1[i]>s2[i]) {
return 1;
} else if (s1[i]<s2[i]) {
return -1;
}
}
return 0;
};
/**
* Returns an array of length {@code sequenceLength} whose elements are each randomly
* picked from the inclusive interval 0..maxNumberPlusOne-1.
*/
private int[] generateSeedSequence(int maxNumberPlusOne, int sequenceLength) {
final int[] result = new int[sequenceLength];
for (int i=0; i<sequenceLength; i++) {
result[i] = random.nextInt(maxNumberPlusOne);
}
return result;
}
private List<int[]> generateSeedSequences(int howMany, int maxNumberPlusOne, int sequenceLength) {
final List<int[]> result = new ArrayList<>(howMany);
for (int i=0; i<howMany; i++) {
result.add(generateSeedSequence(maxNumberPlusOne, sequenceLength));
}
return result;
}
private List<int[]> generateSortedSeedSequences(int howMany, int maxNumberPlusOne, int sequenceLength) {
final List<int[]> result = generateSeedSequences(howMany, maxNumberPlusOne, sequenceLength);
Collections.sort(result, sequenceComparator);
return result;
}
private int countChanges(List<int[]> sequences) {
int count;
if (sequences.isEmpty()) {
count = 0;
} else {
final Iterator<int[]> iterator = sequences.iterator();
int[] previous = iterator.next();
count = previous.length; // the first sequence is all new
while (iterator.hasNext()) {
final int[] next = iterator.next();
count += countChanges(previous, next);
previous = next;
}
}
return count;
}
private int countChanges(int[] previous, int[] next) {
assert previous.length == next.length;
int changesCount = previous.length;
while (previous[previous.length-changesCount] == next[next.length-changesCount]) {
changesCount--;
}
return changesCount;
}
private int totalSeeds(List<int[]> sequences) {
return sequences.isEmpty() ? 0 : sequences.size() * sequences.iterator().next().length;
}
public double computeSavingRatio(int howMany, int maxNumberPlusOne, int sequenceLength) {
final List<int[]> sequences = generateSortedSeedSequences(howMany, maxNumberPlusOne, sequenceLength);
final int changesInSortedSequences = countChanges(sequences);
final int totalSeeds = totalSeeds(sequences);
final double savingRatio = 1.-((double) changesInSortedSequences) / (double) totalSeeds;
return savingRatio;
}
@Test
public void testOneMillionSequencesForFifteenFlightsWithEighteenCompetitors() {
final int runs = 3;
double savingRatioSum = 0.0;
for (int i=0; i<runs; i++) {
savingRatioSum += computeSavingRatio(1000000, 18, 15);
}
final double savingRatioAverage = savingRatioSum / (double) runs;
logger.info("Saving Ratio average: "+savingRatioAverage);
assertTrue(savingRatioAverage>0.2);
}
}
@@ -0,0 +1,79 @@
package com.sap.sse.test;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
import com.sap.sse.util.ImageConverter;
import com.sap.sse.util.ImageConverter.ImageWithMetadata;
/**
*
* @author Robin Fleige(D067799)
*
*/
public class ImageConverterTest {
private ImageConverter converter;
private ImageWithMetadata pngImage;
private ImageWithMetadata jpgImage;
private final byte[] onePixelPngExample = new byte[]{-119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1, 8, 2, 0, 0, 0, -112, 119, 83, -34, 0, 0, 0, 12, 73, 68, 65, 84, 120, -38, 99, 96, 96, 96, 0, 0, 0, 4, 0, 1, -56, -22, -21, -7, 0, 0, 0, 0, 73, 69, 78, 68, -82, 66, 96, -126};
private final byte[] onePixelJpgExample = new byte[]{-1, -40, -1, -32, 0, 16, 74, 70, 73, 70, 0, 1, 2, 0, 0, 1, 0, 1, 0, 0, -1, -37, 0, 67, 0, 8, 6, 6, 7, 6, 5, 8, 7, 7, 7, 9, 9, 8, 10, 12, 20, 13, 12, 11, 11, 12, 25, 18, 19, 15, 20, 29, 26, 31, 30, 29, 26, 28, 28, 32, 36, 46, 39, 32, 34, 44, 35, 28, 28, 40, 55, 41, 44, 48, 49, 52, 52, 52, 31, 39, 57, 61, 56, 50, 60, 46, 51, 52, 50, -1, -37, 0, 67, 1, 9, 9, 9, 12, 11, 12, 24, 13, 13, 24, 50, 33, 28, 33, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, -1, -64, 0, 17, 8, 0, 1, 0, 1, 3, 1, 34, 0, 2, 17, 1, 3, 17, 1, -1, -60, 0, 31, 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -1, -60, 0, -75, 16, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125, 1, 2, 3, 0, 4, 17, 5, 18, 33, 49, 65, 6, 19, 81, 97, 7, 34, 113, 20, 50, -127, -111, -95, 8, 35, 66, -79, -63, 21, 82, -47, -16, 36, 51, 98, 114, -126, 9, 10, 22, 23, 24, 25, 26, 37, 38, 39, 40, 41, 42, 52, 53, 54, 55, 56, 57, 58, 67, 68, 69, 70, 71, 72, 73, 74, 83, 84, 85, 86, 87, 88, 89, 90, 99, 100, 101, 102, 103, 104, 105, 106, 115, 116, 117, 118, 119, 120, 121, 122, -125, -124, -123, -122, -121, -120, -119, -118, -110, -109, -108, -107, -106, -105, -104, -103, -102, -94, -93, -92, -91, -90, -89, -88, -87, -86, -78, -77, -76, -75, -74, -73, -72, -71, -70, -62, -61, -60, -59, -58, -57, -56, -55, -54, -46, -45, -44, -43, -42, -41, -40, -39, -38, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -1, -60, 0, 31, 1, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -1, -60, 0, -75, 17, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119, 0, 1, 2, 3, 17, 4, 5, 33, 49, 6, 18, 65, 81, 7, 97, 113, 19, 34, 50, -127, 8, 20, 66, -111, -95, -79, -63, 9, 35, 51, 82, -16, 21, 98, 114, -47, 10, 22, 36, 52, -31, 37, -15, 23, 24, 25, 26, 38, 39, 40, 41, 42, 53, 54, 55, 56, 57, 58, 67, 68, 69, 70, 71, 72, 73, 74, 83, 84, 85, 86, 87, 88, 89, 90, 99, 100, 101, 102, 103, 104, 105, 106, 115, 116, 117, 118, 119, 120, 121, 122, -126, -125, -124, -123, -122, -121, -120, -119, -118, -110, -109, -108, -107, -106, -105, -104, -103, -102, -94, -93, -92, -91, -90, -89, -88, -87, -86, -78, -77, -76, -75, -74, -73, -72, -71, -70, -62, -61, -60, -59, -58, -57, -56, -55, -54, -46, -45, -44, -43, -42, -41, -40, -39, -38, -30, -29, -28, -27, -26, -25, -24, -23, -22, -14, -13, -12, -11, -10, -9, -8, -7, -6, -1, -38, 0, 12, 3, 1, 0, 2, 17, 3, 17, 0, 63, 0, -9, -6, 40, -94, -128, 63, -1, -39};
private final int baseSize = 100;
private final int halfSize = baseSize / 2;
private final int doubleSize = baseSize * 2;
private final int minSize = 0;
/**
* Setting up the testing environment
*/
@Before
public void setUp() {
converter = new ImageConverter();
pngImage = converter.loadImage(new ByteArrayInputStream(onePixelPngExample), "png");
jpgImage = converter.loadImage(new ByteArrayInputStream(onePixelJpgExample), "jpg");
}
/**
* Tests the calculation of the dimensions, which is used for resizing the image to a fitting size
*/
@Test
public void testCalculateDimensions() {
int[] dimensions;
dimensions = converter.calculateDimensions(baseSize, baseSize, halfSize, doubleSize, halfSize, doubleSize);
assertEquals(dimensions[0], baseSize);
assertEquals(dimensions[1], baseSize);
dimensions = converter.calculateDimensions(baseSize, baseSize, minSize, halfSize, minSize, halfSize);
assertEquals(dimensions[0], halfSize);
assertEquals(dimensions[1], halfSize);
dimensions = converter.calculateDimensions(baseSize, doubleSize, minSize, halfSize, minSize, halfSize);
assertTrue(dimensions[0] < halfSize);
assertEquals(dimensions[1], halfSize);
dimensions = converter.calculateDimensions(minSize, minSize, halfSize, baseSize, halfSize, baseSize);
assertNull(dimensions);
}
/**
* Tests the conversions that are done while resizing an image
*
* @throws IOException
*/
@Test
public void testConversions() throws IOException {
byte[] byteArray;
byteArray = converter.inputStreamToByteArray(
converter.imageWithMetadataToInputStream(jpgImage.getImage(), jpgImage.getMetadata(), "jpg"));
assertArrayEquals(onePixelJpgExample, byteArray);
byteArray = converter.inputStreamToByteArray(
converter.imageWithMetadataToInputStream(pngImage.getImage(), pngImage.getMetadata(), "png"));
assertArrayEquals(onePixelPngExample, byteArray);
}
}
@@ -0,0 +1,432 @@
package com.sap.sse.util;
import static java.lang.Math.toIntExact;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageOutputStream;
import com.sap.sse.common.Base64Utils;
import com.sap.sse.common.media.MediaTagConstants;
/**
* /** An Utility Class to help resizing an image
*
* @author Robin Fleige (D067799)
*/
public class ImageConverter {
private static final Logger logger = Logger.getLogger(ImageConverter.class.getName());
/**
* Writes a BufferedImage to an InputStream. This should only be used as a backup, if
* {@link ImageConverter#imageWithMetadataToInputStream(BufferedImage, IIOMetadata, String)} fails
*
* @param image
* The BufferedImage that should be converted
* @param imageFormat
* the format of the image, for example "png", "jpeg" or "jpg"
* @returns an InputStream with the Information of the Image
* @throws IOException
*/
private InputStream imageToInputStream(final BufferedImage image, final String imageFormat) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ImageIO.write(image, imageFormat, bos);
} catch (IOException e) {
logger.log(Level.SEVERE, e.getMessage());
}
final byte[] arr = bos.toByteArray();
return new ByteArrayInputStream(arr);
}
/**
* Resizes an BufferedImage, so it fits into the defined bounds without changing the width-height-ratio. The image
* is kept as large as possible inside this bounds.
*
* @param image
* The BufferedImage that should be resized
* @param minWidth
* the minimum width the image should have after resizing
* @param maxWidth
* the maximum width the image should have after resizing
* @param minHeight
* the minimum height the image should have after resizing
* @param maxHeight
* the maximum height the image should have after resizing
* @returns the resized BufferedImage. Returns null, if BufferedImage is null, or if the defined bounds do not fit
* the image
*/
public BufferedImage resize(final BufferedImage image, final int minWidth, final int maxWidth, final int minHeight,
final int maxHeight) {
final int[] dimensions = calculateDimensions(image.getWidth(), image.getHeight(), minWidth, maxWidth, minHeight,
maxHeight);
final BufferedImage resizedImage;
if (dimensions != null) {
resizedImage = resize(image, dimensions[0], dimensions[1]);
} else {
resizedImage = null;
}
return resizedImage;
}
/**
* Calculates the dimensions of an image, so it fits inside the defined bounds without changing the
* width-height-ratio. Keeps it as big as possible
*
* @param width
* the current width of the image that should be resized
* @param height
* the current height of the image that should be resized
* @param minWidth
* the minimum width the image should have after resizing
* @param maxWidth
* the maximum width the image should have after resizing
* @param minHeight
* the minimum height the image should have after resizing
* @param maxHeight
* the maximum height the image should have after resizing
* @returns an array of two integers, where the first entry is the fitting width and the second is the fitting
* height. returns null, if the defined bounds do not fit the current size
*/
public int[] calculateDimensions(final double width, final double height, final double minWidth,
final double maxWidth, final double minHeight, final double maxHeight) {
int[] dimensions = new int[2];
if (maxWidth >= 0 && maxHeight >= 0 && maxHeight > minHeight && maxWidth > minWidth && width > minWidth
&& height > minHeight) {
if (maxWidth <= width || maxHeight <= height) {
if (width / maxWidth > height / maxHeight) {
dimensions[1] = (int) maxWidth;
dimensions[1] = (int) (height / width * maxWidth);
if (dimensions[1] >= minHeight) {
dimensions[0] = (int) maxWidth;
} else {
dimensions = null;
}
} else {
dimensions[0] = (int) (width / height * maxHeight);
if (dimensions[0] >= minWidth) {
dimensions[1] = (int) maxHeight;
} else {
dimensions = null;
}
}
} else {
dimensions[0] = (int) width;
dimensions[1] = (int) height;
}
} else {
dimensions = null;
}
return dimensions;
}
/**
* Resizes an BufferedImage, to the width and height.
*
* @param image
* The BufferedImage that should be resized
* @param demandWidth
* the width the image should have after resizing
* @param demandHeight
* the height the image should have after resizing
* @returns the resized BufferedImage. Returns null, if BufferedImage is null
*/
private BufferedImage resize(final BufferedImage image, final int demandedWidth, final int demandedHeight) {
final BufferedImage resizedImage = new BufferedImage((int) demandedWidth, (int) demandedHeight,
image.getType());
final Graphics2D g = resizedImage.createGraphics();
final AffineTransform transform = new AffineTransform();
transform.scale((double) demandedWidth / image.getWidth(), (double) demandedHeight / image.getHeight());
final BufferedImageOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
g.drawImage(image, op, 0, 0);
g.dispose();
return resizedImage;
}
/**
* Creates an InputStream from a BufferedImage, the IIOMetadata of the image and the imageFormat
*
* @param bufferdImage
* the image that has to be written to an InputStream
* @param metadata
* the IIOMetadata that should be stored in the InputStream with the BufferedImage
* @param imageFormat
* the format of the image, for example "png", "jpeg" or "jpg"
* @throws IOException
* @returns an InputStream with the data of the BufferedImage and if possible with the IIOMetadata. Returns null if
* the image is null or the imageFormat is incorrect
*/
public InputStream imageWithMetadataToInputStream(final BufferedImage bufferdImage, final IIOMetadata metadata,
final String imageFormat) throws IOException {
byte[] bytes = null;
if (metadata != null) {
// trying to obtain OutputStream of the image with EXIF data
try (ImageOutputStream ios = ImageIO.createImageOutputStream(new ByteArrayOutputStream())) {
// the following should write the exif data of the image to all copies of the image, it should already
// work, but due to a bug the data array stays empty
final Iterator<ImageWriter> writers = ImageIO.getImageWritersBySuffix(imageFormat);
while (writers.hasNext() && bytes == null) {
final ImageWriter writer = writers.next();
if (writer != null) {
writer.setOutput(ios);
final IIOImage iioImage = new IIOImage(bufferdImage, null, metadata);
final ImageWriteParam param = writer.getDefaultWriteParam();
final IIOMetadata streamMetadata = writer.getDefaultStreamMetadata(param);
writer.write(streamMetadata, iioImage, param);
writer.dispose();
bytes = new byte[toIntExact(ios.length())];
ios.read(bytes);
if (isZeroByteArray(bytes)) {
bytes = null;
}
}
}
if (bytes == null) {
throw new Exception(
"Saving file via FileWriter did not work, not able to write file with metadata, retrying with ImageIO.write()");
}
} catch (Exception e) {
bytes = null;
logger.log(Level.INFO, e.getMessage());
} // if obtaining an OutputStream if the image with EXIF data did not work, then write it without
}
final InputStream toReturn;
if (bytes == null) {
toReturn = imageToInputStream(bufferdImage, imageFormat);
} else {// if it did work, then write the OutputStream to the FileStorageService
toReturn = new ByteArrayInputStream(bytes);
}
return toReturn;
}
/**
* Writes an inputstream into a ByteArray
*
* @param inputStream
* the inputstream that should be stored in the ByteArray
* @returns an Array of Bytes with the data of the inputstream
*/
public byte[] inputStreamToByteArray(final InputStream inputStream) {
byte[] byteArray = null;
try {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
byteArray = buffer.toByteArray();
} catch (IOException e) {
logger.log(Level.SEVERE, e.getMessage());
}
return byteArray;
}
/**
* Checks if a byte array only contains zeros
*
* @param bytes
* an byte array
* @returns true if the byte array is null, empty or only contains zeros, otherwise false
*/
private boolean isZeroByteArray(final byte[] bytes) {
boolean toReturn = true;
if (bytes != null) {
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] != 0) {
toReturn = false;
}
}
}
return toReturn;
}
/**
* Converts an InputStream that contains an image to a Base64 String
*
* @param inputStream
* the InputStream that should be converted
* @param imageFormat
* the format of the image, for example "png", "jpeg" or "jpg"
* @returns the Base64 representation of the InputStream
* @throws IOException
*/
public String convertToBase64(final InputStream inputStream, final String imageFormat) throws IOException {
return convertToBase64(bufferedImageToByteArray(loadBufferedImageFromInputStream(inputStream), imageFormat));
}
/**
* Converts an BufferedImage to a Base64 String
*
* @param image
* the image that should be converted as a BufferedImage
* @param imageFormat
* the format of the image, for example "png", "jpeg" or "jpg"
* @returns the Base64 representation of the image
* @throws IOException
*/
public String convertToBase64(final BufferedImage image, final String imageFormat) throws IOException {
return convertToBase64(bufferedImageToByteArray(image, imageFormat));
}
/**
* Converts an array of bytes to a Base64 String
*
* @param bytes
* an array of bytes
* @returns the Base64 representation of the byte array
*/
private String convertToBase64(final byte[] bytes) {
return Base64Utils.toBase64(bytes);
}
/**
* Converts an InputStream to a BufferedImage. This should only be used as a backup, if
* {@link ImageConverter#loadImage(InputStream, String)} fails
*
* @param inputStream
* @return
*/
private BufferedImage loadBufferedImageFromInputStream(final InputStream inputStream) {
BufferedImage image = null;
try {
image = ImageIO.read(inputStream);
} catch (IOException e) {
logger.log(Level.SEVERE, e.getMessage());
}
return image;
}
// looses metadata, so should not be used for storing an image, but only for showing an image
/**
* Converts an BufferedImage to a ByteArray that contains all of its information This Method does not use the
* IIOMetadata of the original image, so it should not be used to store images, but only for showing them. To also
* use the IIOMetadata of the image use the @link
* {@link ImageConverter#imageWithMetadataToInputStream(BufferedImage, IIOMetadata, String)} and then the @link
* {@link ImageConverter#inputStreamToByteArray(InputStream)} method
*
* @param image
* the image that should be converted to a ByteArray
* @param imageFormat
* the format of the image, for example "png", "jpeg" or "jpg"
* @returns an ByteArray with all the information of the image
*/
public byte[] bufferedImageToByteArray(final BufferedImage image, final String imageFormat) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ImageIO.write(image, imageFormat, baos);
} catch (IOException e) {
logger.log(Level.SEVERE, e.getMessage());
}
return baos.toByteArray();
}
/**
* Converts one BufferedImage to a list of at least one BufferedImage with different sizes as described in the given
* {@link MediaTagConstants}
*
* @param image
* the image that should be converted
* @param resizingTasks
* a List of {@link MediaTagConstants} that define to which size the image should be resized
* @returns a list of BufferedImages, that contains as many BufferedImages as resizingTask contains
* {@link MediaTagConstants}
*/
public List<BufferedImage> convertImage(final BufferedImage image, final List<MediaTagConstants> resizingTasks) {
final List<BufferedImage> resizedImages = new ArrayList<>();
for (MediaTagConstants tag : resizingTasks) {
resizedImages
.add(resize(image, tag.getMinWidth(), tag.getMaxWidth(), tag.getMinHeight(), tag.getMaxHeight()));
}
return resizedImages;
}
/**
* Loads an BufferedImage and the IIOMetadata from an InputStream that contains an image.
*
* @param inputStream
* the InputStream that contains the image and the metadata
* @param imageFormat
* the format of the image, for example "png", "jpeg" or "jpg"
* @returns an {@link ImageWithMetadata} that contains the BufferedImage and the IIOMetadata of the image If the
* loading of the IIOMetadata does not work, returns an {@link ImageWithMetadata} where metadata is null
*/
public ImageWithMetadata loadImage(final InputStream inputStream, final String imageFormat) {
// trying to receive the EXIF data and loading the image. If this does not work only the image is loaded
final ImageConverter converter = new ImageConverter();
BufferedImage image = null;
IIOMetadata metadata = null;
boolean loaded = false;
byte[] bytes = converter.inputStreamToByteArray(inputStream);
try {
final Iterator<ImageReader> readerIterator = ImageIO.getImageReadersBySuffix(imageFormat);
while (readerIterator.hasNext() && !loaded) {
final ImageReader reader = readerIterator.next();
reader.setInput(ImageIO.createImageInputStream(new ByteArrayInputStream(bytes)));
metadata = reader.getImageMetadata(0);
image = reader.read(0);
loaded = metadata != null;
}
if (!loaded) {
throw new Exception(
"Loading file via ImageReader did not work, not able to load metadata, retrying to load with ImageIO.read()");
}
} catch (Exception e) {
logger.log(Level.INFO, e.getMessage());
}
if (!loaded) {
image = converter.loadBufferedImageFromInputStream(new ByteArrayInputStream(bytes));
metadata = null;
}
try {
inputStream.close();
} catch (IOException e) {
logger.log(Level.WARNING, "Potential ressource leak");
}
return new ImageWithMetadata(image, metadata);
}
/**
* A Data Storage class to store an BufferedImage and IIOMetadata
*
* @author Robin Fleige (D067799)
*
*/
public class ImageWithMetadata {
private final BufferedImage image;
private final IIOMetadata metadata;
public ImageWithMetadata(BufferedImage image, IIOMetadata metadata) {
this.image = image;
this.metadata = metadata;
}
public BufferedImage getImage() {
return image;
}
public IIOMetadata getMetadata() {
return metadata;
}
}
}