diff --git a/configuration/RunFortifyBuild b/configuration/RunFortifyBuild index b63a0122a6b..5bc1d23e132 100755 --- a/configuration/RunFortifyBuild +++ b/configuration/RunFortifyBuild @@ -1,3 +1,3 @@ #!/bin/bash -sourceanalyzer -b com.sap.sailing.domain -Xmx4000m -debug -logfile FortifyScan.log -extdirs /home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins -cp "/home/sailing/code/java/com.google.gwt.osgi/lib/gwt-user.jar:/home/sailing/gwt-2.7.0/validation-api-1.0.0.GA.jar:/home/sailing/gwt-2.7.0/gwt-codeserver.jar:/home/sailing/gwt-2.7.0/validation-api-1.0.0.GA-sources.jar:/home/sailing/gwt-2.7.0/gwt-user.jar:/home/sailing/gwt-2.7.0/gwt-dev.jar:/home/sailing/code/java/com.google.gwt.dev/lib/gwt-dev.jar:/home/sailing/code/java/com.tractrac.clientmodule/lib/TracAPI.jar:/home/sailing/code/java/com.sap.sailing.dashboards.gwt/WEB-INF/lib/gwt-ajaxloader.jar:/home/sailing/code/java/com.sap.sailing.dashboards.gwt/WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar:/home/sailing/code/java/com.googlecode.mgwt/lib/mgwt-2.0.0.jar:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/lib/gwt-bootstrap-2.3.2.0.jar:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/lib/gwt-ajaxloader.jar" -source 1.8 "/home/sailing/code/java/com.sap.sailing.ess40.resultimport" "/home/sailing/code/java/com.sap.sailing.manage2sail" "/home/sailing/code/java/com.sap.sailing.manage2sail.resultimport" "/home/sailing/code/java/com.tractrac.clientmodule" "/home/sailing/code/java/com.sap.sse.filestorage" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingreplayadapter" "/home/sailing/code/java/com.sap.sse.mongodb" "/home/sailing/code/java/com.sap.sailing.udpconnector" "/home/sailing/code/java/com.sap.sailing.server.gateway" "/home/sailing/code/java/com.sap.sse" "/home/sailing/code/java/com.sap.sse.datamining" "/home/sailing/code/java/com.sap.sailing.domain.racelogtrackingadapter" "/home/sailing/code/java/com.sap.sailing.datamining.shared" "/home/sailing/code/java/com.sap.sailing.domain.igtimiadapter.persistence" "/home/sailing/code/java/com.sap.sailing.monitoring" "/home/sailing/code/java/com.sap.sailing.domain" "/home/sailing/code/java/com.sap.sse.datamining.annotations" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingadapter.persistence" "/home/sailing/code/java/com.sap.sse.threadmanager" "/home/sailing/code/java/com.sap.sailing.xrr.structureimport" "/home/sailing/code/java/com.sap.sailing.freg.resultimport" "/home/sailing/code/java/com.sap.sailing.domain.igtimiadapter" "/home/sailing/code/java/com.sap.sailing.server.gateway.ess40" "/home/sailing/code/java/com.sap.sailing.xrr.schema" "/home/sailing/code/java/com.sap.sse.common" "/home/sailing/code/java/com.sap.sailing.expeditionconnector" "/home/sailing/code/java/com.sap.sailing.declination" "/home/sailing/code/java/com.sap.sailing.geocoding" "/home/sailing/code/java/com.sap.sailing.server.gateway.serialization" "/home/sailing/code/java/com.sap.sailing.kiworesultimport" "/home/sailing/code/java/com.sap.sailing.polars.datamining" "/home/sailing/code/java/com.sap.sailing.simulator" "/home/sailing/code/java/com.sap.sse.replication" "/home/sailing/code/java/com.sap.sailing.www" "/home/sailing/code/java/com.sap.sse.gwt.adminconsole" "/home/sailing/code/java/com.sap.sailing.dashboards.gwt" "/home/sailing/code/java/com.sap.sailing.news" "/home/sailing/code/java/com.sap.sailing.polars.datamining.shared" "/home/sailing/code/java/com.sap.sailing.barbados.resultimport" "/home/sailing/code/java/com.sap.sse.security.common" "/home/sailing/code/java/com.sap.sse.security.ui" "/home/sailing/code/java/com.sap.sse.shared.android" "/home/sailing/code/java/org.json.simple" "/home/sailing/code/java/com.sap.sailing.resultimport" "/home/sailing/code/java/com.sap.sse.security" "/home/sailing/code/java/com.sap.sailing.gwt.ui" "/home/sailing/code/java/com.sap.sailing.domain.tractracadapter" "/home/sailing/code/java/com.sap.sailing.server.trackfiles" "/home/sailing/code/java/com.googlecode.java-diff-utils" "/home/sailing/code/java/com.sap.sse.operationaltransformation" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingadapter" "/home/sailing/code/java/com.sap.sse.gwt.theme" "/home/sailing/code/java/com.sap.sailing.domain.persistence" "/home/sailing/code/java/com.sap.sailing.sailwave.resultimport" "/home/sailing/code/java/com.sap.sailing.xmlexport" "/home/sailing/code/java/com.sap.sse.mail" "/home/sailing/code/java/com.sap.sailing.velum.resultimport" "/home/sailing/code/java/com.sap.sse.security.userstore.mongodb" "/home/sailing/code/java/com.sap.sailing.server.gateway.serialization.shared.android" "/home/sailing/code/java/com.sap.sse.datamining.shared" "/home/sailing/code/java/org.moxieapps.gwt.highcharts" "/home/sailing/code/java/com.sap.sailing.autoload" "/home/sailing/code/java/com.googlecode.mgwt" "/home/sailing/code/java/com.sap.sailing.datamining" "/home/sailing/code/java/com.sap.sailing.polars" "/home/sailing/code/java/com.sap.sailing.www.events" "/home/sailing/code/java/com.sap.sailing.domain.common" "/home/sailing/code/java/com.sap.sailing.domain.shared.android" "/home/sailing/code/java/com.sap.sailing.domain.deckmanadapter" "/home/sailing/code/java/com.sap.sailing.server" "/home/sailing/code/java/com.sap.sse.gwt" "/home/sailing/code/java/com.sap.sailing.xrr.resultimport" "/home/sailing/code/java/com.sap.sailing.domain.tractracadapter.persistence" -#sourceanalyzer -b com.sap.sailing -Xmx10g -debug -logfile FortifyScan.log "-show-build-warnings" "-machine-output" "-cp" "/home/sailing/code/java/com.sap.sse.gwt.theme/WEB-INF/classes:/home/sailing/code/java/com.sap.sailing.dashboards.gwt/WEB-INF/classes:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/classes:/home/sailing/code/java/com.sap.sse.security.ui/WEB-INF/classes:/home/sailing/code/java/com.sap.sailing.www.events/WEB-INF/classes:/home/sailing/code/java/com.google.gwt.osgi/lib/gwt-user.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.osgi_3.10.2.v20150203-1939.jar:/home/sailing/gwt-2.7.0/validation-api-1.0.0.GA.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.osgi.npn.fragment_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/javax.servlet_3.1.0.v20140303-1611.jar:/home/sailing/gwt-2.7.0/gwt-codeserver.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.servicemix.bundles.zxing_3.1.0.1.jar:/home/sailing/gwt-2.7.0/validation-api-1.0.0.GA-sources.jar:/home/sailing/gwt-2.7.0/gwt-user.jar:/home/sailing/gwt-2.7.0/gwt-dev.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.math_2.1.0.v201105210652.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.fasterxml.jackson.core.jackson-databind_2.5.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.hamcrest.core_1.1.0.v20090501071000.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.junit4_4.8.2.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.fasterxml.jackson.core.jackson-annotations_2.5.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.rabbitmq.client_2.8.4.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/lz4-java_1.3.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.servicemix.bundles.aws-java-sdk_1.9.8.1.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.logging_1.1.3.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/javax.validation_1.0.0.GA_v201205091237.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.webapp_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.fasterxml.jackson.core.jackson-core_2.5.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.server_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.mongodb.mongo-java-driver_2.13.0.RELEASE.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.httpcomponents.httpclient_4.2.6.v201311072007.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.io_2.2.0.v201405211200.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.sun.mail.javax.mail_1.4.5.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.io_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/javax.ws.rs_1.1.1.v20130318-1750.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.jvnet.mimepull_1.9.4.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.shiro.ehcache_1.2.3.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.lang_2.6.0.v201404270220.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.shiro.core_1.2.2.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.websocket.servlet_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.beanutils_1.9.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.sun.jersey.contribs.jersey-multipart_1.17.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.websocket.client_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.objectweb.asm_5.0.1.v201404251740.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.jdom_1.1.1.v201101151400.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/routeconverter_2.12.2.201406032322.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/jackson-jaxrs_1.9.13.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.httpcomponents.httpcore_4.2.5.v201311072007.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.shiro.web_1.2.2.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.fileupload_1.2.2.v20111214-1400.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.servicemix.bundles.ehcache_2.6.9.1.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.util_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.servicemix.bundles.scribe_1.3.3.1.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.websocket.server_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/slf4j.api_1.6.4.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.sun.jersey_1.17.0.v20130314-2020.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.websocket.api_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.websocket.common_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.hyperic.sigar_1.6.4.1.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/jcl.over.slf4j_1.6.4.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.poi_3.9.0.v201405241750.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.dom4j_1.6.1.v201312101416.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.xmlbeans_2.3.0.v201405241900.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.poi.ooxml.schemas_3.9.0.v201405241750.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.poi.ooxml_3.9.0.v201405241905.jar:/home/sailing/code/java/com.google.gwt.dev/lib/gwt-dev.jar:/home/sailing/code/java/com.tractrac.clientmodule/lib/TracAPI.jar:/home/sailing/code/java/com.sap.sailing.dashboards.gwt/WEB-INF/lib/gwt-ajaxloader.jar:/home/sailing/code/java/com.sap.sailing.dashboards.gwt/WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar:/home/sailing/code/java/com.googlecode.mgwt/lib/mgwt-2.0.0.jar:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/lib/gwt-bootstrap-2.3.2.0.jar:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/lib/gwt-ajaxloader.jar" "-source" "1.8" "/home/sailing/code/java/com.sap.sailing.ess40.resultimport" "/home/sailing/code/java/com.sap.sailing.manage2sail" "/home/sailing/code/java/com.sap.sailing.manage2sail.resultimport" "/home/sailing/code/java/com.tractrac.clientmodule" "/home/sailing/code/java/com.sap.sse.filestorage" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingreplayadapter" "/home/sailing/code/java/com.sap.sse.mongodb" "/home/sailing/code/java/com.sap.sailing.udpconnector" "/home/sailing/code/java/com.sap.sailing.server.gateway" "/home/sailing/code/java/com.sap.sse" "/home/sailing/code/java/com.sap.sse.datamining" "/home/sailing/code/java/com.sap.sailing.domain.racelogtrackingadapter" "/home/sailing/code/java/com.sap.sailing.datamining.shared" "/home/sailing/code/java/com.sap.sailing.domain.igtimiadapter.persistence" "/home/sailing/code/java/com.sap.sailing.monitoring" "/home/sailing/code/java/com.sap.sailing.domain" "/home/sailing/code/java/com.sap.sse.datamining.annotations" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingadapter.persistence" "/home/sailing/code/java/com.sap.sse.threadmanager" "/home/sailing/code/java/com.sap.sailing.xrr.structureimport" "/home/sailing/code/java/com.sap.sailing.freg.resultimport" "/home/sailing/code/java/com.sap.sailing.domain.igtimiadapter" "/home/sailing/code/java/com.sap.sailing.server.gateway.ess40" "/home/sailing/code/java/com.sap.sailing.xrr.schema" "/home/sailing/code/java/com.sap.sse.common" "/home/sailing/code/java/com.sap.sailing.expeditionconnector" "/home/sailing/code/java/com.sap.sailing.declination" "/home/sailing/code/java/com.sap.sailing.geocoding" "/home/sailing/code/java/com.sap.sailing.server.gateway.serialization" "/home/sailing/code/java/com.sap.sailing.kiworesultimport" "/home/sailing/code/java/com.sap.sailing.polars.datamining" "/home/sailing/code/java/com.sap.sailing.simulator" "/home/sailing/code/java/com.sap.sse.replication" "/home/sailing/code/java/com.sap.sailing.www" "/home/sailing/code/java/com.sap.sse.gwt.adminconsole" "/home/sailing/code/java/com.sap.sailing.dashboards.gwt" "/home/sailing/code/java/com.sap.sailing.news" "/home/sailing/code/java/com.sap.sailing.polars.datamining.shared" "/home/sailing/code/java/com.sap.sailing.barbados.resultimport" "/home/sailing/code/java/com.sap.sse.security.common" "/home/sailing/code/java/com.sap.sse.security.ui" "/home/sailing/code/java/com.sap.sse.shared.android" "/home/sailing/code/java/org.json.simple" "/home/sailing/code/java/com.sap.sailing.resultimport" "/home/sailing/code/java/com.sap.sse.security" "/home/sailing/code/java/com.sap.sailing.gwt.ui" "/home/sailing/code/java/com.sap.sailing.domain.tractracadapter" "/home/sailing/code/java/com.sap.sailing.server.trackfiles" "/home/sailing/code/java/com.googlecode.java-diff-utils" "/home/sailing/code/java/com.sap.sse.operationaltransformation" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingadapter" "/home/sailing/code/java/com.sap.sse.gwt.theme" "/home/sailing/code/java/com.sap.sailing.domain.persistence" "/home/sailing/code/java/com.sap.sailing.sailwave.resultimport" "/home/sailing/code/java/com.sap.sailing.xmlexport" "/home/sailing/code/java/com.sap.sse.mail" "/home/sailing/code/java/com.sap.sailing.velum.resultimport" "/home/sailing/code/java/com.sap.sse.security.userstore.mongodb" "/home/sailing/code/java/com.sap.sailing.server.gateway.serialization.shared.android" "/home/sailing/code/java/com.sap.sse.datamining.shared" "/home/sailing/code/java/org.moxieapps.gwt.highcharts" "/home/sailing/code/java/com.sap.sailing.autoload" "/home/sailing/code/java/com.googlecode.mgwt" "/home/sailing/code/java/com.sap.sailing.datamining" "/home/sailing/code/java/com.sap.sailing.polars" "/home/sailing/code/java/com.sap.sailing.www.events" "/home/sailing/code/java/com.sap.sailing.domain.common" "/home/sailing/code/java/com.sap.sailing.domain.shared.android" "/home/sailing/code/java/com.sap.sailing.domain.deckmanadapter" "/home/sailing/code/java/com.sap.sailing.server" "/home/sailing/code/java/com.sap.sse.gwt" "/home/sailing/code/java/com.sap.sailing.xrr.resultimport" "/home/sailing/code/java/com.sap.sailing.domain.tractracadapter.persistence" +sourceanalyzer -b com.sap.sailing.domain -Xmx4000m -debug -logfile FortifyScan.log -extdirs /home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins -cp "/home/sailing/code/java/com.google.gwt.osgi/lib/gwt-user.jar:/home/sailing/gwt-2.7.0/validation-api-1.0.0.GA.jar:/home/sailing/gwt-2.7.0/gwt-codeserver.jar:/home/sailing/gwt-2.7.0/validation-api-1.0.0.GA-sources.jar:/home/sailing/gwt-2.7.0/gwt-user.jar:/home/sailing/gwt-2.7.0/gwt-dev.jar:/home/sailing/code/java/com.google.gwt.dev/lib/gwt-dev.jar:/home/sailing/code/java/com.tractrac.clientmodule/lib/TracAPI.jar:/home/sailing/code/java/com.sap.sailing.dashboards.gwt/WEB-INF/lib/gwt-ajaxloader.jar:/home/sailing/code/java/com.sap.sailing.dashboards.gwt/WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar:/home/sailing/code/java/com.googlecode.mgwt/lib/mgwt-2.0.0.jar:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/lib/gwt-ajaxloader.jar" -source 1.8 "/home/sailing/code/java/com.sap.sailing.ess40.resultimport" "/home/sailing/code/java/com.sap.sailing.manage2sail" "/home/sailing/code/java/com.sap.sailing.manage2sail.resultimport" "/home/sailing/code/java/com.tractrac.clientmodule" "/home/sailing/code/java/com.sap.sse.filestorage" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingreplayadapter" "/home/sailing/code/java/com.sap.sse.mongodb" "/home/sailing/code/java/com.sap.sailing.udpconnector" "/home/sailing/code/java/com.sap.sailing.server.gateway" "/home/sailing/code/java/com.sap.sse" "/home/sailing/code/java/com.sap.sse.datamining" "/home/sailing/code/java/com.sap.sailing.domain.racelogtrackingadapter" "/home/sailing/code/java/com.sap.sailing.datamining.shared" "/home/sailing/code/java/com.sap.sailing.domain.igtimiadapter.persistence" "/home/sailing/code/java/com.sap.sailing.monitoring" "/home/sailing/code/java/com.sap.sailing.domain" "/home/sailing/code/java/com.sap.sse.datamining.annotations" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingadapter.persistence" "/home/sailing/code/java/com.sap.sse.threadmanager" "/home/sailing/code/java/com.sap.sailing.xrr.structureimport" "/home/sailing/code/java/com.sap.sailing.freg.resultimport" "/home/sailing/code/java/com.sap.sailing.domain.igtimiadapter" "/home/sailing/code/java/com.sap.sailing.server.gateway.ess40" "/home/sailing/code/java/com.sap.sailing.xrr.schema" "/home/sailing/code/java/com.sap.sse.common" "/home/sailing/code/java/com.sap.sailing.expeditionconnector" "/home/sailing/code/java/com.sap.sailing.declination" "/home/sailing/code/java/com.sap.sailing.geocoding" "/home/sailing/code/java/com.sap.sailing.server.gateway.serialization" "/home/sailing/code/java/com.sap.sailing.kiworesultimport" "/home/sailing/code/java/com.sap.sailing.polars.datamining" "/home/sailing/code/java/com.sap.sailing.simulator" "/home/sailing/code/java/com.sap.sse.replication" "/home/sailing/code/java/com.sap.sailing.www" "/home/sailing/code/java/com.sap.sse.gwt.adminconsole" "/home/sailing/code/java/com.sap.sailing.dashboards.gwt" "/home/sailing/code/java/com.sap.sailing.news" "/home/sailing/code/java/com.sap.sailing.polars.datamining.shared" "/home/sailing/code/java/com.sap.sailing.barbados.resultimport" "/home/sailing/code/java/com.sap.sse.security.common" "/home/sailing/code/java/com.sap.sse.security.ui" "/home/sailing/code/java/com.sap.sse.shared.android" "/home/sailing/code/java/org.json.simple" "/home/sailing/code/java/com.sap.sailing.resultimport" "/home/sailing/code/java/com.sap.sse.security" "/home/sailing/code/java/com.sap.sailing.gwt.ui" "/home/sailing/code/java/com.sap.sailing.domain.tractracadapter" "/home/sailing/code/java/com.sap.sailing.server.trackfiles" "/home/sailing/code/java/com.googlecode.java-diff-utils" "/home/sailing/code/java/com.sap.sse.operationaltransformation" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingadapter" "/home/sailing/code/java/com.sap.sse.gwt.theme" "/home/sailing/code/java/com.sap.sailing.domain.persistence" "/home/sailing/code/java/com.sap.sailing.sailwave.resultimport" "/home/sailing/code/java/com.sap.sailing.xmlexport" "/home/sailing/code/java/com.sap.sse.mail" "/home/sailing/code/java/com.sap.sailing.velum.resultimport" "/home/sailing/code/java/com.sap.sse.security.userstore.mongodb" "/home/sailing/code/java/com.sap.sailing.server.gateway.serialization.shared.android" "/home/sailing/code/java/com.sap.sse.datamining.shared" "/home/sailing/code/java/org.moxieapps.gwt.highcharts" "/home/sailing/code/java/com.sap.sailing.autoload" "/home/sailing/code/java/com.googlecode.mgwt" "/home/sailing/code/java/com.sap.sailing.datamining" "/home/sailing/code/java/com.sap.sailing.polars" "/home/sailing/code/java/com.sap.sailing.www.events" "/home/sailing/code/java/com.sap.sailing.domain.common" "/home/sailing/code/java/com.sap.sailing.domain.shared.android" "/home/sailing/code/java/com.sap.sailing.domain.deckmanadapter" "/home/sailing/code/java/com.sap.sailing.server" "/home/sailing/code/java/com.sap.sse.gwt" "/home/sailing/code/java/com.sap.sailing.xrr.resultimport" "/home/sailing/code/java/com.sap.sailing.domain.tractracadapter.persistence" +#sourceanalyzer -b com.sap.sailing -Xmx10g -debug -logfile FortifyScan.log "-show-build-warnings" "-machine-output" "-cp" "/home/sailing/code/java/com.sap.sse.gwt.theme/WEB-INF/classes:/home/sailing/code/java/com.sap.sailing.dashboards.gwt/WEB-INF/classes:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/classes:/home/sailing/code/java/com.sap.sse.security.ui/WEB-INF/classes:/home/sailing/code/java/com.sap.sailing.www.events/WEB-INF/classes:/home/sailing/code/java/com.google.gwt.osgi/lib/gwt-user.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.osgi_3.10.2.v20150203-1939.jar:/home/sailing/gwt-2.7.0/validation-api-1.0.0.GA.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.osgi.npn.fragment_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/javax.servlet_3.1.0.v20140303-1611.jar:/home/sailing/gwt-2.7.0/gwt-codeserver.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.servicemix.bundles.zxing_3.1.0.1.jar:/home/sailing/gwt-2.7.0/validation-api-1.0.0.GA-sources.jar:/home/sailing/gwt-2.7.0/gwt-user.jar:/home/sailing/gwt-2.7.0/gwt-dev.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.math_2.1.0.v201105210652.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.fasterxml.jackson.core.jackson-databind_2.5.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.hamcrest.core_1.1.0.v20090501071000.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.junit4_4.8.2.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.fasterxml.jackson.core.jackson-annotations_2.5.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.rabbitmq.client_2.8.4.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/lz4-java_1.3.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.servicemix.bundles.aws-java-sdk_1.9.8.1.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.logging_1.1.3.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/javax.validation_1.0.0.GA_v201205091237.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.webapp_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.fasterxml.jackson.core.jackson-core_2.5.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.server_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.mongodb.mongo-java-driver_2.13.0.RELEASE.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.httpcomponents.httpclient_4.2.6.v201311072007.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.io_2.2.0.v201405211200.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.sun.mail.javax.mail_1.4.5.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.io_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/javax.ws.rs_1.1.1.v20130318-1750.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.jvnet.mimepull_1.9.4.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.shiro.ehcache_1.2.3.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.lang_2.6.0.v201404270220.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.shiro.core_1.2.2.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.websocket.servlet_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.beanutils_1.9.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.sun.jersey.contribs.jersey-multipart_1.17.0.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.websocket.client_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.objectweb.asm_5.0.1.v201404251740.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.jdom_1.1.1.v201101151400.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/routeconverter_2.12.2.201406032322.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/jackson-jaxrs_1.9.13.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.httpcomponents.httpcore_4.2.5.v201311072007.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.shiro.web_1.2.2.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.commons.fileupload_1.2.2.v20111214-1400.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.servicemix.bundles.ehcache_2.6.9.1.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.util_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.servicemix.bundles.scribe_1.3.3.1.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.websocket.server_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/slf4j.api_1.6.4.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/com.sun.jersey_1.17.0.v20130314-2020.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.websocket.api_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.jetty.websocket.common_9.2.2.v20140723.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.hyperic.sigar_1.6.4.1.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/jcl.over.slf4j_1.6.4.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.poi_3.9.0.v201405241750.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.dom4j_1.6.1.v201312101416.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.xmlbeans_2.3.0.v201405241900.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.poi.ooxml.schemas_3.9.0.v201405241750.jar:/home/sailing/workspace/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.apache.poi.ooxml_3.9.0.v201405241905.jar:/home/sailing/code/java/com.google.gwt.dev/lib/gwt-dev.jar:/home/sailing/code/java/com.tractrac.clientmodule/lib/TracAPI.jar:/home/sailing/code/java/com.sap.sailing.dashboards.gwt/WEB-INF/lib/gwt-ajaxloader.jar:/home/sailing/code/java/com.sap.sailing.dashboards.gwt/WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar:/home/sailing/code/java/com.googlecode.mgwt/lib/mgwt-2.0.0.jar:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar:/home/sailing/code/java/com.sap.sailing.gwt.ui/WEB-INF/lib/gwt-ajaxloader.jar" "-source" "1.8" "/home/sailing/code/java/com.sap.sailing.ess40.resultimport" "/home/sailing/code/java/com.sap.sailing.manage2sail" "/home/sailing/code/java/com.sap.sailing.manage2sail.resultimport" "/home/sailing/code/java/com.tractrac.clientmodule" "/home/sailing/code/java/com.sap.sse.filestorage" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingreplayadapter" "/home/sailing/code/java/com.sap.sse.mongodb" "/home/sailing/code/java/com.sap.sailing.udpconnector" "/home/sailing/code/java/com.sap.sailing.server.gateway" "/home/sailing/code/java/com.sap.sse" "/home/sailing/code/java/com.sap.sse.datamining" "/home/sailing/code/java/com.sap.sailing.domain.racelogtrackingadapter" "/home/sailing/code/java/com.sap.sailing.datamining.shared" "/home/sailing/code/java/com.sap.sailing.domain.igtimiadapter.persistence" "/home/sailing/code/java/com.sap.sailing.monitoring" "/home/sailing/code/java/com.sap.sailing.domain" "/home/sailing/code/java/com.sap.sse.datamining.annotations" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingadapter.persistence" "/home/sailing/code/java/com.sap.sse.threadmanager" "/home/sailing/code/java/com.sap.sailing.xrr.structureimport" "/home/sailing/code/java/com.sap.sailing.freg.resultimport" "/home/sailing/code/java/com.sap.sailing.domain.igtimiadapter" "/home/sailing/code/java/com.sap.sailing.server.gateway.ess40" "/home/sailing/code/java/com.sap.sailing.xrr.schema" "/home/sailing/code/java/com.sap.sse.common" "/home/sailing/code/java/com.sap.sailing.expeditionconnector" "/home/sailing/code/java/com.sap.sailing.declination" "/home/sailing/code/java/com.sap.sailing.geocoding" "/home/sailing/code/java/com.sap.sailing.server.gateway.serialization" "/home/sailing/code/java/com.sap.sailing.kiworesultimport" "/home/sailing/code/java/com.sap.sailing.polars.datamining" "/home/sailing/code/java/com.sap.sailing.simulator" "/home/sailing/code/java/com.sap.sse.replication" "/home/sailing/code/java/com.sap.sailing.www" "/home/sailing/code/java/com.sap.sse.gwt.adminconsole" "/home/sailing/code/java/com.sap.sailing.dashboards.gwt" "/home/sailing/code/java/com.sap.sailing.news" "/home/sailing/code/java/com.sap.sailing.polars.datamining.shared" "/home/sailing/code/java/com.sap.sailing.barbados.resultimport" "/home/sailing/code/java/com.sap.sse.security.common" "/home/sailing/code/java/com.sap.sse.security.ui" "/home/sailing/code/java/com.sap.sse.shared.android" "/home/sailing/code/java/org.json.simple" "/home/sailing/code/java/com.sap.sailing.resultimport" "/home/sailing/code/java/com.sap.sse.security" "/home/sailing/code/java/com.sap.sailing.gwt.ui" "/home/sailing/code/java/com.sap.sailing.domain.tractracadapter" "/home/sailing/code/java/com.sap.sailing.server.trackfiles" "/home/sailing/code/java/com.googlecode.java-diff-utils" "/home/sailing/code/java/com.sap.sse.operationaltransformation" "/home/sailing/code/java/com.sap.sailing.domain.swisstimingadapter" "/home/sailing/code/java/com.sap.sse.gwt.theme" "/home/sailing/code/java/com.sap.sailing.domain.persistence" "/home/sailing/code/java/com.sap.sailing.sailwave.resultimport" "/home/sailing/code/java/com.sap.sailing.xmlexport" "/home/sailing/code/java/com.sap.sse.mail" "/home/sailing/code/java/com.sap.sailing.velum.resultimport" "/home/sailing/code/java/com.sap.sse.security.userstore.mongodb" "/home/sailing/code/java/com.sap.sailing.server.gateway.serialization.shared.android" "/home/sailing/code/java/com.sap.sse.datamining.shared" "/home/sailing/code/java/org.moxieapps.gwt.highcharts" "/home/sailing/code/java/com.sap.sailing.autoload" "/home/sailing/code/java/com.googlecode.mgwt" "/home/sailing/code/java/com.sap.sailing.datamining" "/home/sailing/code/java/com.sap.sailing.polars" "/home/sailing/code/java/com.sap.sailing.www.events" "/home/sailing/code/java/com.sap.sailing.domain.common" "/home/sailing/code/java/com.sap.sailing.domain.shared.android" "/home/sailing/code/java/com.sap.sailing.domain.deckmanadapter" "/home/sailing/code/java/com.sap.sailing.server" "/home/sailing/code/java/com.sap.sse.gwt" "/home/sailing/code/java/com.sap.sailing.xrr.resultimport" "/home/sailing/code/java/com.sap.sailing.domain.tractracadapter.persistence" diff --git a/home.md b/home.md index 8efa8dbcca3..0e4fd864502 100644 --- a/home.md +++ b/home.md @@ -70,6 +70,7 @@ SAP is at the center of today’s technology revolution, developing innovations ### Security * [[Fortify Tests|wiki/info/security/fortify]] * [[SSL / HTTPS Support|wiki/info/security/ssl-support]] + * [[Permission Concept|wiki/info/security/permission-concept]] ### Miscellaneous diff --git a/java/com.sap.sailing.dashboards.gwt/.settings/com.google.gwt.eclipse.core.prefs b/java/com.sap.sailing.dashboards.gwt/.settings/com.google.gwt.eclipse.core.prefs index e4f2807cc68..c6b56bb832f 100644 --- a/java/com.sap.sailing.dashboards.gwt/.settings/com.google.gwt.eclipse.core.prefs +++ b/java/com.sap.sailing.dashboards.gwt/.settings/com.google.gwt.eclipse.core.prefs @@ -1,4 +1,4 @@ eclipse.preferences.version=1 entryPointModules= filesCopiedToWebInfLib= -gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDMgLXN0cmljdCAtbG9nTGV2ZWwgVFJBQ0VdXT48L2V4dHJhLWFyZ3M+PHZtLWFyZ3M+PCFbQ0RBVEFbLVhteDIwMjRtXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmRhc2hib2FyZHMuZ3d0LlJpYkRhc2hib2FyZDwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+ +gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDMgLXN0cmljdCAtbG9nTGV2ZWwgVFJBQ0UgLVhmcmFnbWVudENvdW50IDRdXT48L2V4dHJhLWFyZ3M+PHZtLWFyZ3M+PCFbQ0RBVEFbLVhteDIwMjRtXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmRhc2hib2FyZHMuZ3d0LlJpYkRhc2hib2FyZDwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+ diff --git a/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml b/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml index ad6c4ff7907..33797f9786f 100644 --- a/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml +++ b/java/com.sap.sailing.dashboards.gwt/WEB-INF/web.xml @@ -28,6 +28,15 @@ /service/sailing + + LocaleInjectionFilter + com.sap.sse.security.ui.server.LocaleInjectionFilter + + + LocaleInjectionFilter + *.html + + Dashboard Dispatch Service dashboardDispatch diff --git a/java/com.sap.sailing.dashboards.gwt/pom.xml b/java/com.sap.sailing.dashboards.gwt/pom.xml index 5dc9221991a..879b2042b3b 100644 --- a/java/com.sap.sailing.dashboards.gwt/pom.xml +++ b/java/com.sap.sailing.dashboards.gwt/pom.xml @@ -23,12 +23,6 @@ 1.0.0.GA sources - - com.github.gwtbootstrap - gwt-bootstrap - 2.3.2.0 - provided - diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/BravoFixTrackWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/BravoFixTrackWithContext.java index 46fd49161f5..6349f289fd7 100755 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/BravoFixTrackWithContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/BravoFixTrackWithContext.java @@ -56,7 +56,7 @@ public class BravoFixTrackWithContext implements HasBravoFixTrackContext { end = endOfRace; } return bravoFixTrack.getDistanceSpentFoiling( - getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getTrack(getRaceOfCompetitorContext().getCompetitor()), - startOfRace, end); + startOfRace, + end); } } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java index 9dc6d35b6f1..b7c85fb721c 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java @@ -96,7 +96,7 @@ public class TrackedLegOfCompetitorWithContext implements HasTrackedLegOfCompeti public Distance getDistanceSpentFoiling() { return getSomethingForLegTrackingInterval((start, end) -> { BravoFixTrack bravoFixTrack = getTrackedLegContext().getTrackedLeg().getTrackedRace().getSensorTrack(getCompetitor(), BravoFixTrack.TRACK_NAME); - return bravoFixTrack == null ? Distance.NULL : bravoFixTrack.getDistanceSpentFoiling(getTrackedLegContext().getTrackedLeg().getTrackedRace().getTrack(getCompetitor()), start, end); + return bravoFixTrack == null ? Distance.NULL : bravoFixTrack.getDistanceSpentFoiling(start, end); }); } diff --git a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/NOAAImporter.java b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/NOAAImporter.java index 2be88f09250..2e265682a56 100755 --- a/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/NOAAImporter.java +++ b/java/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/NOAAImporter.java @@ -8,6 +8,8 @@ import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilder; @@ -30,6 +32,7 @@ import com.sap.sse.common.TimePoint; * */ public class NOAAImporter { + private static final Logger logger = Logger.getLogger(NOAAImporter.class.getName()); private static final String QUERY_URL = "https://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination"; private static final String REGEXP_DECLINATION = "

Declination = ([0-9]*)° ([0-9]*)' *([EW])"; private static final String REGEXP_ANNUAL_CHANGE = "changing by *([0-9]*)° *([0-9]*)' ([EW])/year *

"; @@ -102,7 +105,7 @@ public class NOAAImporter { result.notifyAll(); } } catch (IOException | ParserConfigurationException | SAXException e) { - throw new RuntimeException(e); + logger.log(Level.FINE, "Exception while trying to load magnetic declination online", e); } } }; diff --git a/java/com.sap.sailing.domain.bravoadapter/.classpath b/java/com.sap.sailing.domain.bravoadapter/.classpath new file mode 100755 index 00000000000..eca7bdba8f0 --- /dev/null +++ b/java/com.sap.sailing.domain.bravoadapter/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/java/com.sap.sailing.domain.bravoadapter/.project b/java/com.sap.sailing.domain.bravoadapter/.project new file mode 100755 index 00000000000..b9978a06950 --- /dev/null +++ b/java/com.sap.sailing.domain.bravoadapter/.project @@ -0,0 +1,28 @@ + + + com.sap.sailing.domain.bravoadapter + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/java/com.sap.sailing.domain.bravoadapter/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sailing.domain.bravoadapter/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 00000000000..0c68a61dca8 --- /dev/null +++ b/java/com.sap.sailing.domain.bravoadapter/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/java/com.sap.sailing.domain.bravoadapter/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sailing.domain.bravoadapter/.settings/org.eclipse.pde.core.prefs new file mode 100755 index 00000000000..f29e940a005 --- /dev/null +++ b/java/com.sap.sailing.domain.bravoadapter/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/java/com.sap.sailing.domain.bravoadapter/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.bravoadapter/META-INF/MANIFEST.MF new file mode 100755 index 00000000000..596f332169f --- /dev/null +++ b/java/com.sap.sailing.domain.bravoadapter/META-INF/MANIFEST.MF @@ -0,0 +1,14 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Bravoadapter +Bundle-SymbolicName: com.sap.sailing.domain.bravoadapter +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Import-Package: org.osgi.framework;version="1.8.0" +Require-Bundle: com.sap.sailing.domain, + com.sap.sailing.server.trackfiles, + com.sap.sailing.domain.common, + com.sap.sse.common, + com.sap.sailing.server.gateway +Bundle-Activator: com.sap.sailing.domain.bravoadapter.impl.Activator diff --git a/java/com.sap.sailing.domain.bravoadapter/build.properties b/java/com.sap.sailing.domain.bravoadapter/build.properties new file mode 100755 index 00000000000..34d2e4d2dad --- /dev/null +++ b/java/com.sap.sailing.domain.bravoadapter/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/java/com.sap.sailing.domain.bravoadapter/pom.xml b/java/com.sap.sailing.domain.bravoadapter/pom.xml new file mode 100755 index 00000000000..52715b513f2 --- /dev/null +++ b/java/com.sap.sailing.domain.bravoadapter/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + root + com.sap.sailing + 1.0.0-SNAPSHOT + + com.sap.sailing.domain.bravoadapter + eclipse-plugin + diff --git a/java/com.sap.sailing.domain.bravoadapter/src/com/sap/sailing/domain/bravoadapter/impl/Activator.java b/java/com.sap.sailing.domain.bravoadapter/src/com/sap/sailing/domain/bravoadapter/impl/Activator.java new file mode 100755 index 00000000000..5c87aa644fc --- /dev/null +++ b/java/com.sap.sailing.domain.bravoadapter/src/com/sap/sailing/domain/bravoadapter/impl/Activator.java @@ -0,0 +1,17 @@ +package com.sap.sailing.domain.bravoadapter.impl; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +import com.sap.sailing.server.trackfiles.common.GPSFixImporterRegistration; + +public class Activator implements BundleActivator { + @Override + public void start(BundleContext context) throws Exception { + GPSFixImporterRegistration.register(new BravoGPSFixImporter(), context); + } + + @Override + public void stop(BundleContext context) throws Exception { + } +} diff --git a/java/com.sap.sailing.domain.bravoadapter/src/com/sap/sailing/domain/bravoadapter/impl/BravoGPSFixImporter.java b/java/com.sap.sailing.domain.bravoadapter/src/com/sap/sailing/domain/bravoadapter/impl/BravoGPSFixImporter.java new file mode 100755 index 00000000000..4803b280f54 --- /dev/null +++ b/java/com.sap.sailing.domain.bravoadapter/src/com/sap/sailing/domain/bravoadapter/impl/BravoGPSFixImporter.java @@ -0,0 +1,50 @@ +package com.sap.sailing.domain.bravoadapter.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Date; + +import com.sap.sailing.domain.common.impl.DegreeBearingImpl; +import com.sap.sailing.domain.common.impl.DegreePosition; +import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; +import com.sap.sailing.domain.common.sensordata.BravoExtendedSensorDataMetadata; +import com.sap.sailing.domain.common.tracking.DoubleVectorFix; +import com.sap.sailing.domain.common.tracking.GPSFixMoving; +import com.sap.sailing.domain.common.tracking.impl.GPSFixMovingImpl; +import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; +import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; +import com.sap.sailing.domain.trackimport.FormatNotSupportedException; +import com.sap.sailing.domain.trackimport.GPSFixImporter; +import com.sap.sailing.server.gateway.windimport.bravo.FunnyDegreeConverter; +import com.sap.sailing.server.trackfiles.impl.BravoExtendedDataImporterImpl; + +public class BravoGPSFixImporter implements GPSFixImporter { + @Override + public void importFixes(InputStream inputStream, Callback callback, boolean inferSpeedAndBearing, final String filename) + throws FormatNotSupportedException, IOException { + TrackFileImportDeviceIdentifier device = new TrackFileImportDeviceIdentifierImpl(filename, getType() + "@" + new Date()); + new BravoExtendedDataImporterImpl().importFixes(inputStream, + (Iterable fixes, TrackFileImportDeviceIdentifier deviceIdentifier)->{ + for (final DoubleVectorFix fix : fixes) { + GPSFixMoving gpsFix = new GPSFixMovingImpl( + new DegreePosition(FunnyDegreeConverter.funnyLatLng(fix.get(BravoExtendedSensorDataMetadata.LAT.getColumnIndex())), + FunnyDegreeConverter.funnyLatLng(fix.get(BravoExtendedSensorDataMetadata.LON.getColumnIndex()))), + fix.getTimePoint(), + new KnotSpeedWithBearingImpl(fix.get(BravoExtendedSensorDataMetadata.SOG.getColumnIndex()), + new DegreeBearingImpl(fix.get(BravoExtendedSensorDataMetadata.COG.getColumnIndex())))); + callback.addFix(gpsFix, device); + } + }, filename, /* sourceName */ getType(), /* downsample */ false); + } + + @Override + public Iterable getSupportedFileExtensions() { + return Arrays.asList(new String[] { "csv", "log", "txt" }); + } + + @Override + public String getType() { + return "Bravo"; + } +} diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java index ea057864d5e..ddf0f98404a 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java @@ -112,6 +112,7 @@ public enum BoatClassMasterdata { TORNADO ("Tornado Catamaran", true, 6.10, 3.02, BoatHullType.CATAMARAN, true, "Tornado", "Tornado Cat"), TOM_28_MAX ("Tom 28 MAX", true, 8.48, 2.48, BoatHullType.MONOHULL, true, "Tom 28"), TRIAS ("Trias", true, 9.20, 2.12, BoatHullType.MONOHULL, true), + TP52 ("TP52", true, 15.85, 4.35, BoatHullType.MONOHULL, true, "TP 52", "Transpac 52", "Transpac52"), VIPER_640 ("Viper 640", true, 6.43, 2.49, BoatHullType.MONOHULL, true), VO60 ("VO60", true, 19.5, 5.25, BoatHullType.MONOHULL, true, "Volvo Ocean 60", "VolvoOcean60", "W60", "Whitbread60", "Whitbread 60"), VX_ONE ("VX ONE", true, 5.79, 2.19, BoatHullType.MONOHULL, true, "VX-ONE"), diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java index a26f5c1dcf6..7ad1ac96f7b 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java @@ -25,11 +25,26 @@ public enum DetailType implements Serializable { CURRENT_HEEL_IN_DEGREES(2,DESCENDING), CURRENT_PITCH_IN_DEGREES(2,DESCENDING), CURRENT_RIDE_HEIGHT_IN_METERS(2,DESCENDING), + CURRENT_DISTANCE_FOILED_IN_METERS(0, DESCENDING), + CURRENT_DURATION_FOILED_IN_SECONDS(0, DESCENDING), CURRENT_PORT_DAGGERBOARD_RAKE(2,DESCENDING), CURRENT_STBD_DAGGERBOARD_RAKE(2,DESCENDING), CURRENT_PORT_RUDDER_RAKE(2,DESCENDING), CURRENT_STBD_RUDDER_RAKE(2,DESCENDING), CURRENT_MAST_ROTATION_IN_DEGREES(2,DESCENDING), + CURRENT_LEEWAY_IN_DEGREES(1, ASCENDING), + CURRENT_SET(1, ASCENDING), + CURRENT_DRIFT_IN_DEGREES(1, ASCENDING), + CURRENT_DEPTH_IN_METERS(1, ASCENDING), + CURRENT_RUDDER_IN_DEGREES(2, ASCENDING), + CURRENT_TACK_ANGLE_IN_DEGREES(2, ASCENDING), + CURRENT_DEFLECTOR_PERCENTAGE(2, ASCENDING), + CURRENT_DEFLECTOR_IN_MILLIMETERS(2, ASCENDING), + CURRENT_RAKE_IN_DEGREES(2, ASCENDING), + CURRENT_TARGET_HEEL_ANGLE_IN_DEGREES(2, ASCENDING), + CURRENT_FORESTAY_LOAD(2, ASCENDING), + CURRENT_FORESTAY_PRESSURE(2, ASCENDING), + CURRENT_TARGET_BOATSPEED_PERCENTAGE(2, ASCENDING), ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS(1, ASCENDING), VELOCITY_MADE_GOOD_IN_KNOTS(2, DESCENDING), GAP_TO_LEADER_IN_SECONDS(0, ASCENDING), GAP_CHANGE_SINCE_LEG_START_IN_SECONDS(0, ASCENDING), SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED(0, ASCENDING), WINDWARD_DISTANCE_TO_GO_IN_METERS(0, ASCENDING), @@ -51,8 +66,10 @@ public enum DetailType implements Serializable { MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS(1, DESCENDING), TIME_ON_TIME_FACTOR(4, DESCENDING), TIME_ON_DISTANCE_ALLOWANCE_IN_SECONDS_PER_NAUTICAL_MILE(0, ASCENDING), TOTAL_DISTANCE_TRAVELED(0, ASCENDING), TOTAL_AVERAGE_SPEED_OVER_GROUND(2, DESCENDING), - TOTAL_TIME_SAILED_IN_SECONDS(1, ASCENDING), RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS(2, - DESCENDING), RACE_CURRENT_RIDE_HEIGHT_IN_METERS(2, DESCENDING), + TOTAL_TIME_SAILED_IN_SECONDS(1, ASCENDING), + TOTAL_DURATION_FOILED_IN_SECONDS(0, DESCENDING), TOTAL_DISTANCE_FOILED_IN_METERS(0, DESCENDING), + RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS(2, DESCENDING), RACE_CURRENT_RIDE_HEIGHT_IN_METERS(2, DESCENDING), + RACE_CURRENT_DISTANCE_FOILED_IN_METERS(0, DESCENDING), RACE_CURRENT_DURATION_FOILED_IN_SECONDS(0, DESCENDING), RACE_NET_POINTS(2, ASCENDING), REGATTA_NET_POINTS(2, ASCENDING), REGATTA_NET_POINTS_SUM(2, ASCENDING), RACE_RATIO_BETWEEN_TIME_SINCE_LAST_POSITION_FIX_AND_AVERAGE_SAMPLING_INTERVAL(1, ASCENDING), RACE_DISTANCE_TO_START_FIVE_SECONDS_BEFORE_RACE_START(1, ASCENDING), RACE_SPEED_OVER_GROUND_FIVE_SECONDS_BEFORE_START(2, DESCENDING), diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceIdentifier.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DeviceIdentifier.java similarity index 96% rename from java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceIdentifier.java rename to java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DeviceIdentifier.java index 5471253c027..b29ebc77bbf 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceIdentifier.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DeviceIdentifier.java @@ -1,9 +1,7 @@ -package com.sap.sailing.domain.racelogtracking; +package com.sap.sailing.domain.common; import java.io.Serializable; -import com.sap.sailing.domain.abstractlog.race.RaceLog; - /** * Identifies any kind of tracking device. Should be implemented accordingly for different tracking * adapters, e.g. for smartphones, Igtimi trackers etc.

@@ -37,6 +35,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; * {@link Object#equals(Object)} and {@link Object#hashCode()} should be implemented so that multiple * deserializations of same device identifier (conceptually) result in objects that are be identified * as being equal through these two methods. + * * @author Fredrik Teschke * */ diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LeaderboardEntryDTO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LeaderboardEntryDTO.java index 150ec7d4087..4435b336e9f 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LeaderboardEntryDTO.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LeaderboardEntryDTO.java @@ -138,7 +138,7 @@ public class LeaderboardEntryDTO implements Serializable { return totalPointsCorrected || (reasonForMaxPoints != null && reasonForMaxPoints != MaxPointsReason.NONE); } - public Duration getTimeSailedInMillis() { + public Duration getTimeSailed() { final Duration result; if (legDetails != null) { long timeInMilliseconds = 0; @@ -159,7 +159,7 @@ public class LeaderboardEntryDTO implements Serializable { return result; } - public Distance getDistanceTraveledInMeters() { + public Distance getDistanceTraveled() { Distance result = null; if (legDetails != null) { for (LegEntryDTO legDetail : legDetails) { @@ -176,6 +176,47 @@ public class LeaderboardEntryDTO implements Serializable { return result; } + public Duration getDurationFoiled() { + final Duration result; + if (legDetails != null) { + Double acc = null; + for (LegEntryDTO legDetail : legDetails) { + if (legDetail != null) { + if (legDetail.currentDurationFoiledInSeconds != null) { + if (acc == null) { + acc = 0.0; + } + acc += legDetail.currentDurationFoiledInSeconds; + } else { + acc = null; + break; + } + } + } + result = acc == null ? null : new MillisecondsDurationImpl((long) (acc*1000.)); + } else { + result = null; + } + return result; + } + + public Distance getDistanceFoiled() { + Distance result = null; + if (legDetails != null) { + for (LegEntryDTO legDetail : legDetails) { + if (legDetail != null) { + if (legDetail.currentDistanceFoiledInMeters != null) { + if (result == null) { + result = Distance.NULL; + } + result = result.add(new MeterDistance(legDetail.currentDistanceFoiledInMeters)); + } + } + } + } + return result; + } + public int getOneBasedCurrentLegNumber() { int result = 0; if (legDetails != null && !legDetails.isEmpty()) { diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LeaderboardRowDTO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LeaderboardRowDTO.java index 4e60ad845c6..5ca9daaf00e 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LeaderboardRowDTO.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LeaderboardRowDTO.java @@ -26,6 +26,8 @@ public class LeaderboardRowDTO implements Serializable { public Double totalTimeSailedUpwindInSeconds; public Double totalTimeSailedReachingInSeconds; public Double totalDistanceTraveledInMeters; + public Double totalDurationFoiledInSeconds; + public Double totalDistanceFoiledInMeters; @Override public int hashCode() { @@ -38,6 +40,10 @@ public class LeaderboardRowDTO implements Serializable { + ((maximumSpeedOverGroundInKnots == null) ? 0 : maximumSpeedOverGroundInKnots.hashCode()); result = prime * result + ((totalDistanceTraveledInMeters == null) ? 0 : totalDistanceTraveledInMeters.hashCode()); + result = prime * result + + ((totalDurationFoiledInSeconds == null) ? 0 : totalDurationFoiledInSeconds.hashCode()); + result = prime * result + + ((totalDistanceFoiledInMeters == null) ? 0 : totalDistanceFoiledInMeters.hashCode()); result = prime * result + ((netPoints == null) ? 0 : netPoints.hashCode()); result = prime * result + ((totalTimeSailedDownwindInSeconds == null) ? 0 : totalTimeSailedDownwindInSeconds.hashCode()); @@ -87,6 +93,16 @@ public class LeaderboardRowDTO implements Serializable { return false; } else if (!totalDistanceTraveledInMeters.equals(other.totalDistanceTraveledInMeters)) return false; + if (totalDurationFoiledInSeconds == null) { + if (other.totalDurationFoiledInSeconds != null) + return false; + } else if (!totalDurationFoiledInSeconds.equals(other.totalDurationFoiledInSeconds)) + return false; + if (totalDistanceFoiledInMeters == null) { + if (other.totalDistanceFoiledInMeters != null) + return false; + } else if (!totalDistanceFoiledInMeters.equals(other.totalDistanceFoiledInMeters)) + return false; if (netPoints == null) { if (other.netPoints != null) return false; @@ -120,11 +136,11 @@ public class LeaderboardRowDTO implements Serializable { return true; } - public Distance getDistanceTraveledInMeters(String raceColumnName) { + public Distance getDistanceTraveled(String raceColumnName) { final Distance result; LeaderboardEntryDTO fieldsForRace = fieldsByRaceColumnName.get(raceColumnName); if (fieldsForRace != null) { - result = fieldsForRace.getDistanceTraveledInMeters(); + result = fieldsForRace.getDistanceTraveled(); } else { result = null; } @@ -135,7 +151,29 @@ public class LeaderboardRowDTO implements Serializable { final Duration result; LeaderboardEntryDTO fieldsForRace = fieldsByRaceColumnName.get(raceColumnName); if (fieldsForRace != null) { - result = fieldsForRace.getTimeSailedInMillis(); + result = fieldsForRace.getTimeSailed(); + } else { + result = null; + } + return result; + } + + public Distance getDistanceFoiled(String raceColumnName) { + final Distance result; + LeaderboardEntryDTO fieldsForRace = fieldsByRaceColumnName.get(raceColumnName); + if (fieldsForRace != null) { + result = fieldsForRace.getDistanceFoiled(); + } else { + result = null; + } + return result; + } + + public Duration getDurationFoiled(String raceColumnName) { + final Duration result; + LeaderboardEntryDTO fieldsForRace = fieldsByRaceColumnName.get(raceColumnName); + if (fieldsForRace != null) { + result = fieldsForRace.getDurationFoiled(); } else { result = null; } diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LegEntryDTO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LegEntryDTO.java index 255fbbb3a00..e545f1fe01a 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LegEntryDTO.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/LegEntryDTO.java @@ -44,6 +44,8 @@ public class LegEntryDTO implements Serializable { public Double currentHeelInDegrees; public Double currentPitchInDegrees; + public Double currentDistanceFoiledInMeters; + public Double currentDurationFoiledInSeconds; /** * If the competitor has already finished the leg at the time point for which this entry was created, contains the @@ -81,6 +83,8 @@ public class LegEntryDTO implements Serializable { result = prime * result + ((currentHeelInDegrees == null) ? 0 : currentHeelInDegrees.hashCode()); result = prime * result + ((currentPitchInDegrees == null) ? 0 : currentPitchInDegrees.hashCode()); result = prime * result + ((currentRideHeightInMeters == null) ? 0 : currentRideHeightInMeters.hashCode()); + result = prime * result + ((currentDurationFoiledInSeconds == null) ? 0 : currentDurationFoiledInSeconds.hashCode()); + result = prime * result + ((currentDistanceFoiledInMeters == null) ? 0 : currentDistanceFoiledInMeters.hashCode()); result = prime * result + ((currentSpeedOverGroundInKnots == null) ? 0 : currentSpeedOverGroundInKnots.hashCode()); result = prime * result + ((distanceTraveledInMeters == null) ? 0 : distanceTraveledInMeters.hashCode()); @@ -150,6 +154,16 @@ public class LegEntryDTO implements Serializable { return false; } else if (!currentRideHeightInMeters.equals(other.currentRideHeightInMeters)) return false; + if (currentDurationFoiledInSeconds == null) { + if (other.currentDurationFoiledInSeconds != null) + return false; + } else if (!currentDurationFoiledInSeconds.equals(other.currentDurationFoiledInSeconds)) + return false; + if (currentDistanceFoiledInMeters == null) { + if (other.currentDistanceFoiledInMeters != null) + return false; + } else if (!currentDistanceFoiledInMeters.equals(other.currentDistanceFoiledInMeters)) + return false; if (currentSpeedOverGroundInKnots == null) { if (other.currentSpeedOverGroundInKnots != null) return false; diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/DegreeBearingImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/DegreeBearingImpl.java index 70e37a8717f..5ea889222d9 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/DegreeBearingImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/DegreeBearingImpl.java @@ -9,7 +9,7 @@ public class DegreeBearingImpl extends AbstractBearing implements Bearing { private final double bearingDeg; /** * - * @param bearingDeg if a mount degrees over 360, then it will be mod 360 degrees + * @param bearingDeg if amount degrees over 360, then it will be mod 360 degrees */ public DegreeBearingImpl(double bearingDeg) { super(); diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/sensordata/BravoExtendedSensorDataMetadata.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/sensordata/BravoExtendedSensorDataMetadata.java index ead5e1c9db7..efd9c9a863d 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/sensordata/BravoExtendedSensorDataMetadata.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/sensordata/BravoExtendedSensorDataMetadata.java @@ -35,12 +35,17 @@ public enum BravoExtendedSensorDataMetadata implements ColumnMetadata { DEPTH(null, /* expectedInLogfile */ false), // RUDDER(null, /* expectedInLogfile */ false), // FORESTAY_LOAD(null, /* expectedInLogfile */ false), // + FORESTAY_PRESSURE(null, /* expectedInLogfile */ false), // TACK_ANGLE(null, /* expectedInLogfile */ false), // RAKE_DEG(null, /* expectedInLogfile */ false), // DEFLECTOR_PERCENTAGE(null, /* expectedInLogfile */ false), // TARGET_HEEL(null, /* expectedInLogfile */ false), // DEFLECTOR_MILLIMETERS(null, /* expectedInLogfile */ false), // TARGET_BOATSPEED_P(null, /* expectedInLogfile */ false), // + LAT("Lat", /* expectedInLogfile */ true), // + LON("Lon", /* expectedInLogfile */ true), // + COG("COG", /* expectedInLogfile */ true), // + SOG("SOG", /* expectedInLogfile */ true), // ; private final String columnName; diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/sensordata/ExpeditionExtendedSensorDataMetadata.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/sensordata/ExpeditionExtendedSensorDataMetadata.java index fa62d1d86f1..3858832e652 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/sensordata/ExpeditionExtendedSensorDataMetadata.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/sensordata/ExpeditionExtendedSensorDataMetadata.java @@ -9,28 +9,31 @@ import java.util.Objects; import com.sap.sailing.domain.common.tracking.DoubleVectorFix; /** - * Metadata that defines the column structure of BravoExtended fixes when imported as {@link com.sap.sailing.domain.common.tracking.DoubleVectorFix}. + * Metadata that defines the column structure of BravoExtended fixes when imported as + * {@link com.sap.sailing.domain.common.tracking.DoubleVectorFix}. + *

* * The current implementation only stores a subset of the information available during the import. + *

* * The first columns need to be consistent with {@link BravoSensorDataMetadata}. */ public enum ExpeditionExtendedSensorDataMetadata { HEEL("Heel", BravoExtendedSensorDataMetadata.HEEL), // - TRIM("TRIM", BravoExtendedSensorDataMetadata.PITCH), // - LEEWAY(null, BravoExtendedSensorDataMetadata.LEEWAY), // - SET(null, BravoExtendedSensorDataMetadata.SET), // - DRIFT(null, BravoExtendedSensorDataMetadata.DRIFT), // - DEPTH(null, BravoExtendedSensorDataMetadata.DEPTH), // - RUDDER(null, BravoExtendedSensorDataMetadata.RUDDER), // - FORESTAY_LOAD(null, BravoExtendedSensorDataMetadata.FORESTAY_LOAD), // + TRIM("Trim", BravoExtendedSensorDataMetadata.PITCH), // + LEEWAY("Leeway", BravoExtendedSensorDataMetadata.LEEWAY, /* expected in logfile */ true), // + SET("Set", BravoExtendedSensorDataMetadata.SET, /* expected in logfile */ true), // + DRIFT("Drift", BravoExtendedSensorDataMetadata.DRIFT, /* expected in logfile */ true), // + DEPTH("Depth", BravoExtendedSensorDataMetadata.DEPTH, /* expected in logfile */ true), // + RUDDER("Rudder", BravoExtendedSensorDataMetadata.RUDDER, /* expected in logfile */ true), // + FORESTAY_LOAD("Forestay", BravoExtendedSensorDataMetadata.FORESTAY_LOAD, /* expected in logfile */ true), // + FORESTAY_PRESSURE("ForestayPres", BravoExtendedSensorDataMetadata.FORESTAY_PRESSURE, /* expected in logfile */ true), // TACK_ANGLE(null, BravoExtendedSensorDataMetadata.TACK_ANGLE), // - RAKE_DEG(null, BravoExtendedSensorDataMetadata.RAKE_DEG), // - DEFLECTOR_PERCENTAGE(null, BravoExtendedSensorDataMetadata.DEFLECTOR_PERCENTAGE), // - TARGET_HEEL(null, BravoExtendedSensorDataMetadata.TARGET_HEEL), // - DEFLECTOR_MILLIMETERS(null, BravoExtendedSensorDataMetadata.DEFLECTOR_MILLIMETERS), // - TARGET_BOATSPEED_P(null, BravoExtendedSensorDataMetadata.TARGET_BOATSPEED_P), // - + RAKE_DEG("RakeDeg", BravoExtendedSensorDataMetadata.RAKE_DEG, /* expected in logfile */ true), // + DEFLECTOR_PERCENTAGE("DflectrPP", BravoExtendedSensorDataMetadata.DEFLECTOR_PERCENTAGE, /* expected in logfile */ true), // + TARGET_HEEL("TG Heell", BravoExtendedSensorDataMetadata.TARGET_HEEL, /* expected in logfile */ true), // + DEFLECTOR_MILLIMETERS("DflectrMM", BravoExtendedSensorDataMetadata.DEFLECTOR_MILLIMETERS, /* expected in logfile */ true), // + TARGET_BOATSPEED_P("BspTr", BravoExtendedSensorDataMetadata.TARGET_BOATSPEED_P, /* expected in logfile */ true), // ; private String columnName; @@ -44,10 +47,17 @@ public enum ExpeditionExtendedSensorDataMetadata { * the Bravo metadata. */ private final BravoExtendedSensorDataMetadata mappedToBravoField; + + private final boolean expectedInLogfile; private ExpeditionExtendedSensorDataMetadata(String columnName, BravoExtendedSensorDataMetadata mappedToBravoField) { + this(columnName, mappedToBravoField, mappedToBravoField.isExpectedInLogFile()); + } + + private ExpeditionExtendedSensorDataMetadata(String columnName, BravoExtendedSensorDataMetadata mappedToBravoField, boolean expectedInLogfile) { this.columnName = columnName; this.mappedToBravoField = mappedToBravoField; + this.expectedInLogfile = expectedInLogfile; } public String getColumnName() { @@ -62,7 +72,7 @@ public enum ExpeditionExtendedSensorDataMetadata { } public boolean isExpectedInLogFile() { - return mappedToBravoField.isExpectedInLogFile(); + return expectedInLogfile; } public static ExpeditionExtendedSensorDataMetadata byColumnName(String valueName) { diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/BravoExtendedFix.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/BravoExtendedFix.java index d12b3abb281..d38e8be6b5d 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/BravoExtendedFix.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/BravoExtendedFix.java @@ -12,12 +12,13 @@ public interface BravoExtendedFix extends BravoFix { Double getPortRudderRake(); Double getStbdRudderRake(); Bearing getMastRotation(); - Double getLeeway(); + Bearing getLeeway(); Double getSet(); - Double getDrift(); + Bearing getDrift(); Distance getDepth(); Bearing getRudder(); Double getForestayLoad(); + Double getForestayPressure(); Bearing getTackAngle(); Bearing getRake(); Double getDeflectorPercentage(); diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoExtendedFixImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoExtendedFixImpl.java index 89efcd0e6ea..4fc24390061 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoExtendedFixImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoExtendedFixImpl.java @@ -52,8 +52,9 @@ public class BravoExtendedFixImpl extends BravoFixImpl implements BravoExtendedF } @Override - public Double getLeeway() { - return fix.get(BravoExtendedSensorDataMetadata.LEEWAY.getColumnIndex()); + public Bearing getLeeway() { + final Double leeway = fix.get(BravoExtendedSensorDataMetadata.LEEWAY.getColumnIndex()); + return leeway == null ? null : new DegreeBearingImpl(leeway); } @Override @@ -62,8 +63,9 @@ public class BravoExtendedFixImpl extends BravoFixImpl implements BravoExtendedF } @Override - public Double getDrift() { - return fix.get(BravoExtendedSensorDataMetadata.DRIFT.getColumnIndex()); + public Bearing getDrift() { + final Double drift = fix.get(BravoExtendedSensorDataMetadata.DRIFT.getColumnIndex()); + return drift == null ? null : new DegreeBearingImpl(drift); } @Override @@ -83,6 +85,11 @@ public class BravoExtendedFixImpl extends BravoFixImpl implements BravoExtendedF return fix.get(BravoExtendedSensorDataMetadata.FORESTAY_LOAD.getColumnIndex()); } + @Override + public Double getForestayPressure() { + return fix.get(BravoExtendedSensorDataMetadata.FORESTAY_PRESSURE.getColumnIndex()); + } + @Override public Bearing getTackAngle() { final Double tackAngleDeg = fix.get(BravoExtendedSensorDataMetadata.TACK_ANGLE.getColumnIndex()); diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoFixImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoFixImpl.java index 8c1cc2a4012..7db57751513 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoFixImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/impl/BravoFixImpl.java @@ -27,10 +27,15 @@ public class BravoFixImpl extends SensorFixImpl implements BravoFix { @Override public Distance getRideHeight() { - double rideHeightPortHullasDouble = fix.get(BravoSensorDataMetadata.RIDE_HEIGHT_PORT_HULL.getColumnIndex()); - double rideHeightStarboardHullasDouble = fix + Double rideHeightPortHullasDouble = fix.get(BravoSensorDataMetadata.RIDE_HEIGHT_PORT_HULL.getColumnIndex()); + Double rideHeightStarboardHullAsDouble = fix .get(BravoSensorDataMetadata.RIDE_HEIGHT_STBD_HULL.getColumnIndex()); - return new MeterDistance(Math.min(rideHeightPortHullasDouble, rideHeightStarboardHullasDouble)); + return rideHeightPortHullasDouble == null ? + rideHeightStarboardHullAsDouble == null ? null : + new MeterDistance(rideHeightStarboardHullAsDouble) : + rideHeightStarboardHullAsDouble == null ? + new MeterDistance(rideHeightPortHullasDouble) : + new MeterDistance(Math.min(rideHeightPortHullasDouble, rideHeightStarboardHullAsDouble)); } @Override diff --git a/java/com.sap.sailing.domain.expeditionadapter/src/com/sap/sailing/domain/expeditionadapter/impl/ExpeditionGPSFixImporter.java b/java/com.sap.sailing.domain.expeditionadapter/src/com/sap/sailing/domain/expeditionadapter/impl/ExpeditionGPSFixImporter.java index edae24e5e61..be38baee40d 100755 --- a/java/com.sap.sailing.domain.expeditionadapter/src/com/sap/sailing/domain/expeditionadapter/impl/ExpeditionGPSFixImporter.java +++ b/java/com.sap.sailing.domain.expeditionadapter/src/com/sap/sailing/domain/expeditionadapter/impl/ExpeditionGPSFixImporter.java @@ -23,8 +23,8 @@ import com.sap.sailing.server.trackfiles.impl.ExpeditionExtendedDataImporterImpl public class ExpeditionGPSFixImporter implements GPSFixImporter { private static final String LAT_COLUMN_HEADING = ExpeditionExtendedDataImporterImpl.COL_NAME_LAT; private static final String LON_COLUMN_HEADING = ExpeditionExtendedDataImporterImpl.COL_NAME_LON; - private static final String COG_COLUMN_HEADING = "Ext_COG"; - private static final String SOG_COLUMN_HEADING = "Ext_SOG"; + private static final String COG_COLUMN_HEADING = "Cog"; + private static final String SOG_COLUMN_HEADING = "Sog"; @Override public void importFixes(InputStream inputStream, Callback callback, boolean inferSpeedAndBearing, final String sourceName) throws FormatNotSupportedException, IOException { diff --git a/java/com.sap.sailing.domain.igtimiadapter.test/src/com/sap/sailing/domain/igtimiadapter/test/FixFactoryTest.java b/java/com.sap.sailing.domain.igtimiadapter.test/src/com/sap/sailing/domain/igtimiadapter/test/FixFactoryTest.java new file mode 100755 index 00000000000..808ba392812 --- /dev/null +++ b/java/com.sap.sailing.domain.igtimiadapter.test/src/com/sap/sailing/domain/igtimiadapter/test/FixFactoryTest.java @@ -0,0 +1,46 @@ +package com.sap.sailing.domain.igtimiadapter.test; + +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.junit.Before; +import org.junit.Test; + +import com.sap.sailing.domain.igtimiadapter.datatypes.Fix; +import com.sap.sailing.domain.igtimiadapter.impl.FixFactory; +import com.sap.sse.common.Util; + +public class FixFactoryTest { + private FixFactory fixFactory; + + @Before + public void setUp() { + fixFactory = new FixFactory(); + } + + @Test + public void testUnknownFixTypes() throws ParseException { + final String[] messages = new String[] { + "{\"DC-FE-AAKG\":{\"1\":{\"t\":[1510174025500],\"1\":[170.5044476],\"2\":[-45.87697]}}}", + "{\"DC-FE-AAKG\":{\"2\":{\"t\":[1510174025500],\"1\":[1]}}}", + "{\"DC-FE-AAKG\":{\"3\":{\"t\":[1510174025500],\"1\":[10]}}}", + "{\"DC-FE-AAKG\":{\"7\":{\"t\":[1510174025500],\"1\":[187.7]}}}", + "{\"DC-FE-AAKG\":{\"11\":{\"t\":[1510174025500],\"1\":[54]}}}", + "{\"DC-FE-AAKG\":{\"12\":{\"t\":[1510174025500],\"1\":[1.852]}}}", + "{\"DC-FE-AAKG\":{\"22\":{\"t\":[1510174025500],\"1\":[263.4]}}}", + "{\"DC-FE-AAKG\":{\"23\":{\"t\":[1510174025500],\"1\":[1.852]}}}", + "{\"DC-FE-AAKG\":{\"6\":{\"t\":[1510174025500],\"1\":[0]}}}", + "{\"DC-FE-AAKG\":{\"9\":{\"t\":[1510174025500],\"1\":[0]}}}" }; + List fixes = new ArrayList<>(); + for (final String message : messages) { + JSONObject jsonObject = (JSONObject) new JSONParser().parse(message); + Util.addAll(fixFactory.createFixes(jsonObject), fixes); + } + assertTrue(!Util.isEmpty(fixes)); // this largely asserts that no exception was thrown although there were unknown fix types (22/23) + } +} diff --git a/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/FixFactory.java b/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/FixFactory.java index 71700a8136e..83d1e869d5b 100755 --- a/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/FixFactory.java +++ b/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/FixFactory.java @@ -54,9 +54,12 @@ public class FixFactory { Sensor sensor = new SensorImpl(deviceSerialNumber, fixTypeAndOptionalColonSeparatedSensorsSubId.length < 2 ? 0 : Long.valueOf(fixTypeAndOptionalColonSeparatedSensorsSubId[1])); - Fix fix = createFix(sensor, Type.valueOf(fixType), timePoint, valuesPerSubindex); - result.add(fix); - fixIndex++; + final Type ft = Type.valueOf(fixType); + if (ft != null) { + Fix fix = createFix(sensor, ft, timePoint, valuesPerSubindex); + result.add(fix); + fixIndex++; + } } } return result; diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index a2c738b79e6..3753f48e93e 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -39,6 +39,7 @@ import com.mongodb.WriteResult; import com.mongodb.util.JSON; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult.MergeState; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent; @@ -155,6 +156,7 @@ import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.VenueImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; import com.sap.sailing.domain.common.CourseDesignerMode; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.PassingInstruction; @@ -168,8 +170,8 @@ import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; -import com.sap.sailing.domain.common.dto.EventType; import com.sap.sailing.domain.common.dto.AnniversaryType; +import com.sap.sailing.domain.common.dto.EventType; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; @@ -206,7 +208,6 @@ import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongo import com.sap.sailing.domain.persistence.racelog.tracking.impl.PlaceHolderDeviceIdentifierMongoHandler; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.impl.PlaceHolderDeviceIdentifierSerializationHandler; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.ranking.RankingMetricConstructor; @@ -1601,8 +1602,15 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { final Long finishingTimePointAsMillis = (Long) dbObject.get(FieldNames.RACE_LOG_FINISHING_TIME_AS_MILLIS.name()); final TimePoint finishingTime = finishingTimePointAsMillis == null ? null : new MillisecondsTimePoint(finishingTimePointAsMillis); final String comment = (String) dbObject.get(FieldNames.LEADERBOARD_SCORE_CORRECTION_COMMENT.name()); + final String mergeStateAsString = (String) dbObject.get(FieldNames.LEADERBOARD_SCORE_CORRECTION_MERGE_STATE.name()); + final MergeState mergeState; + if (mergeStateAsString == null) { + mergeState = MergeState.OK; + } else { + mergeState = MergeState.valueOf(mergeStateAsString); + } CompetitorResultImpl positionedCompetitor = new CompetitorResultImpl( - competitorId, competitorDisplayName, rank == null ? rankCounter : rank, maxPointsReason, score, finishingTime, comment); + competitorId, competitorDisplayName, rank == null ? rankCounter : rank, maxPointsReason, score, finishingTime, comment, mergeState); positionedCompetitors.add(positionedCompetitor); rankCounter++; } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index 2a2981141c0..a3dfe0b6343 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -80,7 +80,8 @@ public enum FieldNames { LEADERBOARD_IS_MEDAL_RACE_COLUMN, LEADERBOARD_CARRIED_POINTS, LEADERBOARD_CARRIED_POINTS_BY_ID, LEADERBOARD_SCORE_CORRECTIONS, LEADERBOARD_DISCARDING_THRESHOLDS, LEADERBOARD_SCORE_CORRECTION_MAX_POINTS_REASON, LEADERBOARD_CORRECTED_SCORE, LEADERBOARD_SCORE_CORRECTION_TIMESTAMP, - LEADERBOARD_RANK, LEADERBOARD_SCORE_CORRECTION_COMMENT, LEADERBOARD_COLUMN_FACTORS, WRAPPED_REGATTA_LEADERBOARD_NAME, + LEADERBOARD_RANK, LEADERBOARD_SCORE_CORRECTION_COMMENT, LEADERBOARD_SCORE_CORRECTION_MERGE_STATE, + LEADERBOARD_COLUMN_FACTORS, WRAPPED_REGATTA_LEADERBOARD_NAME, ELMINATED_COMPETITORS, // leaderboard group diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 6c07b6ee67a..78c18534f25 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -86,6 +86,7 @@ import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.base.configuration.impl.DeviceConfigurationMatcherSingle; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.common.Bearing; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.Positioned; @@ -108,7 +109,6 @@ import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; import com.sap.sailing.domain.persistence.racelog.tracking.impl.PlaceHolderDeviceIdentifierMongoHandler; import com.sap.sailing.domain.racelog.RaceLogIdentifier; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParametersHandler; @@ -1239,6 +1239,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { result.put(FieldNames.RACE_LOG_FINISHING_TIME_AS_MILLIS.name(), competitorResult.getFinishingTime() == null ? null : competitorResult.getFinishingTime().asMillis()); result.put(FieldNames.LEADERBOARD_RANK.name(), competitorResult.getOneBasedRank()); result.put(FieldNames.LEADERBOARD_SCORE_CORRECTION_COMMENT.name(), competitorResult.getComment()); + result.put(FieldNames.LEADERBOARD_SCORE_CORRECTION_MERGE_STATE.name(), competitorResult.getMergeState().name()); return result; } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoSensorFixStoreImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoSensorFixStoreImpl.java index eb813bc3351..9459a46b8ed 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoSensorFixStoreImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoSensorFixStoreImpl.java @@ -20,6 +20,7 @@ import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.QueryBuilder; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory; @@ -30,7 +31,6 @@ import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongo import com.sap.sailing.domain.persistence.racelog.tracking.FixMongoHandler; import com.sap.sailing.domain.persistence.racelog.tracking.MongoSensorFixStore; import com.sap.sailing.domain.racelog.tracking.FixReceivedListener; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.Duration; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/PlaceHolderDeviceIdentifierMongoHandler.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/PlaceHolderDeviceIdentifierMongoHandler.java index ee3ee4fe186..ccf0364559e 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/PlaceHolderDeviceIdentifierMongoHandler.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/PlaceHolderDeviceIdentifierMongoHandler.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.persistence.racelog.tracking.impl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.impl.PlaceHolderDeviceIdentifierSerializationHandler; public class PlaceHolderDeviceIdentifierMongoHandler extends PlaceHolderDeviceIdentifierSerializationHandler diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java index 2a74622a15d..dcb29f6b6e5 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java @@ -24,6 +24,7 @@ import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.base.impl.RegattaImpl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; @@ -38,7 +39,6 @@ import com.sap.sailing.domain.racelog.tracking.SensorFixStore; import com.sap.sailing.domain.racelog.tracking.test.mock.MockDeviceAndSessionIdentifierWithGPSFixesDeserializer; import com.sap.sailing.domain.racelog.tracking.test.mock.MockSmartphoneImeiServiceFinderFactory; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java index 836726fb94e..4c9f475b7f3 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java @@ -36,6 +36,7 @@ import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; @@ -47,7 +48,6 @@ import com.sap.sailing.domain.leaderboard.impl.HighPoint; import com.sap.sailing.domain.racelog.tracking.SensorFixStore; import com.sap.sailing.domain.racelog.tracking.test.mock.MockSmartphoneImeiServiceFinderFactory; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapter; import com.sap.sailing.domain.racelogtracking.RaceLogTrackingAdapterFactory; import com.sap.sailing.domain.racelogtracking.impl.fixtracker.RaceLogFixTrackerManager; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/DeviceMappingsAndSensorFixStoreLockingTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/DeviceMappingsAndSensorFixStoreLockingTest.java index 0aff6e21645..383942f7784 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/DeviceMappingsAndSensorFixStoreLockingTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/DeviceMappingsAndSensorFixStoreLockingTest.java @@ -16,9 +16,9 @@ import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCo import com.sap.sailing.domain.abstractlog.regatta.impl.RegattaLogImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.tracking.impl.DoubleVectorFixImpl; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.impl.fixtracker.RegattaLogDeviceMappings; import com.sap.sailing.domain.racelogtracking.test.AbstractGPSFixStoreTest; import com.sap.sse.common.MultiTimeRange; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/GPSFixStoreListenerTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/GPSFixStoreListenerTest.java index bab51469897..2174d0718e8 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/GPSFixStoreListenerTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/GPSFixStoreListenerTest.java @@ -9,10 +9,10 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.Timeout; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.persistence.racelog.tracking.impl.MongoSensorFixStoreImpl; import com.sap.sailing.domain.racelog.tracking.FixReceivedListener; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.test.AbstractGPSFixStoreTest; public class GPSFixStoreListenerTest extends AbstractGPSFixStoreTest { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/RaceLogFixTrackerManagerTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/RaceLogFixTrackerManagerTest.java index a8aa39a5806..5558db801d9 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/RaceLogFixTrackerManagerTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/RaceLogFixTrackerManagerTest.java @@ -31,6 +31,7 @@ import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; @@ -45,7 +46,6 @@ import com.sap.sailing.domain.racelog.tracking.SensorFixStore; import com.sap.sailing.domain.racelog.tracking.test.mock.MockSmartphoneImeiServiceFinderFactory; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; import com.sap.sailing.domain.racelogsensortracking.SensorFixMapperFactory; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.impl.fixtracker.RaceLogFixTrackerManager; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreAndLoadTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreAndLoadTest.java index 431fc524b76..383919426b2 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreAndLoadTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreAndLoadTest.java @@ -54,7 +54,10 @@ import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.Distance; +import com.sap.sailing.domain.common.Position; +import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.TrackedRaceStatusEnum; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; @@ -75,12 +78,12 @@ import com.sap.sailing.domain.racelog.tracking.SensorFixStore; import com.sap.sailing.domain.racelog.tracking.test.mock.MockSmartphoneImeiServiceFinderFactory; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; import com.sap.sailing.domain.racelogsensortracking.SensorFixMapperFactory; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.impl.BravoDataFixMapper; import com.sap.sailing.domain.racelogtracking.impl.fixtracker.FixLoaderAndTracker; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; import com.sap.sailing.domain.tracking.BravoFixTrack; +import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.DynamicSensorFixTrack; import com.sap.sailing.domain.tracking.DynamicTrack; import com.sap.sailing.domain.tracking.DynamicTrackedRace; @@ -92,6 +95,7 @@ import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.domain.tracking.impl.SensorFixTrackImpl; +import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Timed; import com.sap.sse.common.Util.Pair; @@ -178,18 +182,12 @@ public class SensorFixStoreAndLoadTest { public void testLoadAlreadyAddedFixes() throws InterruptedException { regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp, device, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(MID_OF_TRACKING))); - addBravoFixes(); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - trackedRace.waitForLoadingToFinish(); - testNumberOfRawFixes(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME), 2); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -197,18 +195,12 @@ public class SensorFixStoreAndLoadTest { public void testAddFixesWhileTracking() throws InterruptedException { regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp, device, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(MID_OF_TRACKING))); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - addBravoFixes(); - trackedRace.waitForLoadingToFinish(); - testNumberOfRawFixes(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME), 2); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -216,18 +208,12 @@ public class SensorFixStoreAndLoadTest { public void testNoFixesAreLoadedIfNoStoredFixIsInTimeRange() throws InterruptedException { regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp, device, new MillisecondsTimePoint(AFTER_LAST_FIX), new MillisecondsTimePoint(END_OF_TRACKING))); - addBravoFixes(); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - trackedRace.waitForLoadingToFinish(); - testNumberOfRawFixes(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME), 0); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -235,18 +221,12 @@ public class SensorFixStoreAndLoadTest { public void testFixesNotInMappedTimeRangeAreIgnoredWhileTracking() throws InterruptedException { regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp, device, new MillisecondsTimePoint(AFTER_LAST_FIX), new MillisecondsTimePoint(END_OF_TRACKING))); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - addBravoFixes(); - trackedRace.waitForLoadingToFinish(); - testNumberOfRawFixes(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME), 0); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -254,18 +234,12 @@ public class SensorFixStoreAndLoadTest { public void testCompetitorWithoutMappingHasNoTrack() throws InterruptedException { regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp, device, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(MID_OF_TRACKING))); - addBravoFixes(); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - trackedRace.waitForLoadingToFinish(); - assertNull(trackedRace.getSensorTrack(comp2, BravoFixTrack.TRACK_NAME)); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -275,19 +249,13 @@ public class SensorFixStoreAndLoadTest { device, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(MID_OF_TRACKING))); regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp2, device, new MillisecondsTimePoint(MID_OF_TRACKING + 1), new MillisecondsTimePoint(END_OF_TRACKING))); - addBravoFixes(); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - trackedRace.waitForLoadingToFinish(); - testNumberOfRawFixes(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME), 2); testNumberOfRawFixes(trackedRace.getSensorTrack(comp2, BravoFixTrack.TRACK_NAME), 1); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -297,18 +265,12 @@ public class SensorFixStoreAndLoadTest { device, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(MID_OF_TRACKING))); regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp, device, new MillisecondsTimePoint(MID_OF_TRACKING + 1), new MillisecondsTimePoint(END_OF_TRACKING))); - addBravoFixes(); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - trackedRace.waitForLoadingToFinish(); - testNumberOfRawFixes(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME), 3); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -319,18 +281,12 @@ public class SensorFixStoreAndLoadTest { new MillisecondsTimePoint(MID_OF_TRACKING)); regattaLog.add(mappingEvent); regattaLog.add(new RegattaLogRevokeEventImpl(author, mappingEvent, "Test purposes")); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - addBravoFixes(); - trackedRace.waitForLoadingToFinish(); - assertNull(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME)); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -342,23 +298,16 @@ public class SensorFixStoreAndLoadTest { new MillisecondsTimePoint(END_OF_TRACKING)); regattaLog.add(mappingEvent); regattaLog.add(new RegattaLogRevokeEventImpl(author, mappingEvent, "Test purposes")); - // non-revoked mapping timestamp 100-200 regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp, device, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(MID_OF_TRACKING))); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - addBravoFixes(); - trackedRace.waitForLoadingToFinish(); - // Only Fixes from 100 to 200 may be included testNumberOfRawFixes(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME), 2); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -371,25 +320,16 @@ public class SensorFixStoreAndLoadTest { RegattaLogCloseOpenEndedDeviceMappingEventImpl closeEvent = new RegattaLogCloseOpenEndedDeviceMappingEventImpl( new MillisecondsTimePoint(4), author, mappingEventId, new MillisecondsTimePoint(MID_OF_TRACKING)); regattaLog.add(closeEvent); - addBravoFixes(); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - trackedRace.waitForLoadingToFinish(); - BravoFixTrack bravoFixTrack = trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME); - testNumberOfRawFixes(bravoFixTrack, 2); - regattaLog.add(new RegattaLogRevokeEventImpl(author, closeEvent, "Test purposes")); - trackedRace.waitForLoadingToFinish(); testNumberOfRawFixes(bravoFixTrack, 3); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -414,20 +354,14 @@ public class SensorFixStoreAndLoadTest { deviceTest, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(MID_OF_TRACKING))); regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp, device, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(MID_OF_TRACKING))); - addTestFixes(); addBravoFixes(); - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - trackedRace.waitForLoadingToFinish(); - testNumberOfRawFixes(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME), 2); testNumberOfRawFixes(trackedRace.getSensorTrack(comp, TestFixTrackImpl.TRACK_NAME), 1); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -437,21 +371,14 @@ public class SensorFixStoreAndLoadTest { deviceTest, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(MID_OF_TRACKING))); regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp, device, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(MID_OF_TRACKING))); - - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - addTestFixes(); addBravoFixes(); - trackedRace.waitForLoadingToFinish(); - testNumberOfRawFixes(trackedRace.getSensorTrack(comp, TestFixTrackImpl.TRACK_NAME), 1); testNumberOfRawFixes(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME), 2); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -461,18 +388,12 @@ public class SensorFixStoreAndLoadTest { deviceTest, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(END_OF_TRACKING))); regattaLog.add(new RegattaLogDeviceCompetitorBravoMappingEventImpl(new MillisecondsTimePoint(3), author, comp, device, new MillisecondsTimePoint(START_OF_TRACKING), new MillisecondsTimePoint(END_OF_TRACKING))); - - FixLoaderAndTracker fixLoaderAndTracker = createFixLoaderAndTracker(); - trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); - addTestFixes(); addBravoFixes(); - trackedRace.waitForLoadingToFinish(); - BravoFixTrack bravoFixTrack = trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME); assertEquals(FIX_RIDE_HEIGHT, bravoFixTrack.getFirstFixAtOrAfter(new MillisecondsTimePoint(FIX_TIMESTAMP)).getRideHeight()); @@ -480,11 +401,9 @@ public class SensorFixStoreAndLoadTest { bravoFixTrack.getFirstFixAtOrAfter(new MillisecondsTimePoint(FIX_TIMESTAMP2)).getRideHeight()); assertEquals(FIX_RIDE_HEIGHT3, bravoFixTrack.getFirstFixAtOrAfter(new MillisecondsTimePoint(FIX_TIMESTAMP3)).getRideHeight()); - TestFixTrackImpl testFixTrack = trackedRace.getSensorTrack(comp, TestFixTrackImpl.TRACK_NAME); assertEquals(FIX_TEST_VALUE, testFixTrack.getFirstFixAtOrAfter(new MillisecondsTimePoint(FIX_TIMESTAMP)).getTestValue()); - fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); } @@ -501,7 +420,6 @@ public class SensorFixStoreAndLoadTest { } private FixLoaderAndTracker createFixLoaderAndTracker() { - return new FixLoaderAndTracker(trackedRace, store, new SensorFixMapperFactory() { private TestDataFixMapper testDataFixMapper = new TestDataFixMapper(); private BravoDataFixMapper bravoDataFixMapper = new BravoDataFixMapper(); @@ -747,6 +665,50 @@ public class SensorFixStoreAndLoadTest { // only the initial 3 fixes are available testNumberOfRawFixes(trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME), 3); fixLoaderAndTracker.stop(true, /* willBeRemoved */ false); + final DynamicGPSFixTrack gpsFixTrack = trackedRace.getTrack(comp); + final DegreePosition pos1 = new DegreePosition(0, 0); + final DegreeBearingImpl course = new DegreeBearingImpl(0); + final KnotSpeedWithBearingImpl speed = new KnotSpeedWithBearingImpl(10, course); + final MillisecondsTimePoint timePoint = new MillisecondsTimePoint(FIX_TIMESTAMP); + final MillisecondsTimePoint timePoint2 = new MillisecondsTimePoint(FIX_TIMESTAMP2); + final MillisecondsTimePoint timePoint3 = new MillisecondsTimePoint(FIX_TIMESTAMP3); + final TimePoint timePointBetween2And3 = new MillisecondsTimePoint((FIX_TIMESTAMP2+FIX_TIMESTAMP3)/2); + final GPSFixMoving fix1 = new GPSFixMovingImpl(pos1, timePoint, speed); + final Position pos2 = pos1.translateGreatCircle(course, speed.travel(timePoint.until(timePoint2))); + final GPSFixMoving fix2 = new GPSFixMovingImpl(pos2, timePoint2, speed); + final Position pos3 = pos2.translateGreatCircle(course, speed.travel(timePoint2.until(timePoint3))); + final GPSFixMoving fix3 = new GPSFixMovingImpl(pos3, timePoint3, speed); + gpsFixTrack.add(fix1); + gpsFixTrack.add(fix2); + gpsFixTrack.add(fix3); + final BravoFixTrack bravoFixTrack = trackedRace.getSensorTrack(comp, BravoFixTrack.TRACK_NAME); + final Distance foilingDistance = bravoFixTrack.getDistanceSpentFoiling(timePoint, timePoint3); + final Distance distanceTraveled = gpsFixTrack.getDistanceTraveled(timePoint, timePoint3); + assertEquals(distanceTraveled.getMeters(), foilingDistance.getMeters(), 0.001); + final Duration foilingDuration = bravoFixTrack.getTimeSpentFoiling(timePoint, timePoint3); + assertEquals(timePoint.until(timePoint3).asMillis(), foilingDuration.asMillis()); + + // now insert a GPS fix which leads to an extended distance traveled as it is not exactly on the previous track + final DegreeBearingImpl temporaryCourse = new DegreeBearingImpl(90); + final GPSFixMoving fixBetween2And3 = new GPSFixMovingImpl( + pos2.translateGreatCircle(temporaryCourse, speed.add(new KnotSpeedWithBearingImpl(5, temporaryCourse)).travel(timePoint2.until(timePointBetween2And3))), + timePointBetween2And3, speed); + gpsFixTrack.add(fixBetween2And3); + final Distance distanceTraveledDifferently = gpsFixTrack.getDistanceTraveled(timePoint, timePoint3); + assertTrue(distanceTraveledDifferently.compareTo(distanceTraveled) > 0); + final Distance foilingDistanceDifferent = bravoFixTrack.getDistanceSpentFoiling(timePoint, timePoint3); + assertEquals(distanceTraveledDifferently.getMeters(), foilingDistanceDifferent.getMeters(), 0.001); + + // now overwrite fix3 by a new one with increased speed, therefore extended distance: + final SpeedWithBearing doubledSpeed = speed.add(speed); + final GPSFixMoving fix3Faster = new GPSFixMovingImpl( + pos2.translateGreatCircle(course, doubledSpeed.travel(timePoint2.until(timePoint3))), + timePoint3, doubledSpeed); + gpsFixTrack.add(fix3Faster, /* replace */ true); + final Distance distanceTraveledFaster = gpsFixTrack.getDistanceTraveled(timePoint, timePoint3); + assertTrue(distanceTraveledFaster.compareTo(distanceTraveled) > 0); + final Distance foilingDistanceFaster = bravoFixTrack.getDistanceSpentFoiling(timePoint, timePoint3); + assertEquals(distanceTraveledFaster.getMeters(), foilingDistanceFaster.getMeters(), 0.001); } @Test diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreTest.java index f14d0b29bfa..1b11a7f9f3f 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreTest.java @@ -14,6 +14,7 @@ import org.mockito.Mockito; import com.mongodb.DB; import com.mongodb.MongoException; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; @@ -30,7 +31,6 @@ import com.sap.sailing.domain.racelog.tracking.FixReceivedListener; import com.sap.sailing.domain.racelog.tracking.SensorFixStore; import com.sap.sailing.domain.racelog.tracking.test.mock.MockSmartphoneImeiServiceFinderFactory; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.Timed; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java index f449b0dc1b0..56bc80be5bc 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java @@ -24,11 +24,11 @@ import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.impl.fixtracker.FixLoaderAndTracker; import com.sap.sailing.domain.racelogtracking.test.AbstractGPSFixStoreTest; import com.sap.sailing.domain.tracking.DynamicTrackedRace; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiIdentifier.java b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiIdentifier.java index 9bfdebc3545..f0ec889b7ab 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiIdentifier.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiIdentifier.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.racelog.tracking.test.mock; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; public class SmartphoneImeiIdentifier implements DeviceIdentifier { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiJsonHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiJsonHandler.java index 3a770d9dfbb..71a6c7cfcc2 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiJsonHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiJsonHandler.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.racelog.tracking.test.mock; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler; public class SmartphoneImeiJsonHandler extends SmartphoneImeiSerializationHandler diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiMongoHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiMongoHandler.java index 1ac23ea7e8f..d102c5e0280 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiMongoHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiMongoHandler.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.racelog.tracking.test.mock; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; public class SmartphoneImeiMongoHandler extends SmartphoneImeiSerializationHandler implements DeviceIdentifierMongoHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiSerializationHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiSerializationHandler.java index eaa539c68f6..bddce674e82 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiSerializationHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.testsupport/src/com/sap/sailing/domain/racelog/tracking/test/mock/SmartphoneImeiSerializationHandler.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.racelog.tracking.test.mock; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.Util; public class SmartphoneImeiSerializationHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/PingDeviceIdentifier.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/PingDeviceIdentifier.java index 9312eb9f762..2aa2d8778f5 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/PingDeviceIdentifier.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/PingDeviceIdentifier.java @@ -2,6 +2,8 @@ package com.sap.sailing.domain.racelogtracking; import java.util.UUID; +import com.sap.sailing.domain.common.DeviceIdentifier; + /** * A device identifier used to identify a non-existent, virtual device, which is used only once as an * identifier to add a single fix to a track (i.e. pinging the location of that track's item). diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BravoDataFixMapper.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BravoDataFixMapper.java index f8165a00079..da5934327e4 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BravoDataFixMapper.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BravoDataFixMapper.java @@ -10,7 +10,7 @@ import com.sap.sailing.domain.racelog.tracking.SensorFixMapper; import com.sap.sailing.domain.tracking.BravoFixTrack; import com.sap.sailing.domain.tracking.DynamicSensorFixTrack; import com.sap.sailing.domain.tracking.DynamicTrackedRace; -import com.sap.sailing.domain.tracking.impl.BravoFixTrackImpl; +import com.sap.sailing.domain.tracking.impl.CompetitorBravoFixTrackImpl; /** * {@link SensorFixMapper} implementation to handle {@link BravoFix}es. @@ -20,7 +20,8 @@ public class BravoDataFixMapper implements SensorFixMapper getTrack(DynamicTrackedRace race, Competitor key) { return race.getOrCreateSensorTrack(key, BravoFixTrack.TRACK_NAME, - () -> new BravoFixTrackImpl(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ false)); + () -> new CompetitorBravoFixTrackImpl(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ false, + race.getTrack(key))); } @Override diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BravoExtendedDataFixMapper.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BravoExtendedDataFixMapper.java index cdb1c97f32d..15f96e22bc9 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BravoExtendedDataFixMapper.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BravoExtendedDataFixMapper.java @@ -11,7 +11,7 @@ import com.sap.sailing.domain.racelog.tracking.SensorFixMapper; import com.sap.sailing.domain.tracking.BravoFixTrack; import com.sap.sailing.domain.tracking.DynamicSensorFixTrack; import com.sap.sailing.domain.tracking.DynamicTrackedRace; -import com.sap.sailing.domain.tracking.impl.BravoFixTrackImpl; +import com.sap.sailing.domain.tracking.impl.CompetitorBravoFixTrackImpl; /** * {@link SensorFixMapper} implementation to handle {@link BravoExtendedFix}es. @@ -21,7 +21,8 @@ public class BravoExtendedDataFixMapper implements SensorFixMapper getTrack(DynamicTrackedRace race, Competitor key) { return race.getOrCreateSensorTrack(key, BravoFixTrack.TRACK_NAME, - () -> new BravoFixTrackImpl(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ true)); + () -> new CompetitorBravoFixTrackImpl(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ true, + race.getTrack(key))); } @Override diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/ExpeditionExtendedDataFixMapper.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/ExpeditionExtendedDataFixMapper.java index a0ba6a432c3..09405591969 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/ExpeditionExtendedDataFixMapper.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/ExpeditionExtendedDataFixMapper.java @@ -11,7 +11,7 @@ import com.sap.sailing.domain.racelog.tracking.SensorFixMapper; import com.sap.sailing.domain.tracking.BravoFixTrack; import com.sap.sailing.domain.tracking.DynamicSensorFixTrack; import com.sap.sailing.domain.tracking.DynamicTrackedRace; -import com.sap.sailing.domain.tracking.impl.BravoFixTrackImpl; +import com.sap.sailing.domain.tracking.impl.CompetitorBravoFixTrackImpl; /** * {@link SensorFixMapper} implementation to product {@link BravoExtendedFix}es from {@link DoubleVectorFix}es @@ -25,7 +25,8 @@ public class ExpeditionExtendedDataFixMapper implements SensorFixMapper getTrack(DynamicTrackedRace race, Competitor key) { return race.getOrCreateSensorTrack(key, BravoFixTrack.TRACK_NAME, - () -> new BravoFixTrackImpl(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ true)); + () -> new CompetitorBravoFixTrackImpl(key, BravoFixTrack.TRACK_NAME, /* hasExtendedFixes */ true, + race.getTrack(key))); } @Override diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierJsonHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierJsonHandler.java index 60d1b57dfb7..072e91a1e4f 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierJsonHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierJsonHandler.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.racelogtracking.impl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler; public class PingDeviceIdentifierJsonHandler extends PingDeviceIdentifierSerializationHandler diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierMongoHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierMongoHandler.java index efb7ecb08dc..9a5a7d37764 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierMongoHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierMongoHandler.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.racelogtracking.impl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; public class PingDeviceIdentifierMongoHandler extends PingDeviceIdentifierSerializationHandler implements DeviceIdentifierMongoHandler { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierSerializationHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierSerializationHandler.java index 415af995c85..2d1e5578407 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierSerializationHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/PingDeviceIdentifierSerializationHandler.java @@ -2,8 +2,8 @@ package com.sap.sailing.domain.racelogtracking.impl; import java.util.UUID; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifier; import com.sap.sailing.domain.racelogtracking.PingDeviceIdentifierImpl; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDMongoHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDMongoHandler.java index 8646b044541..e11f27f1d8e 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDMongoHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/SmartphoneUUIDMongoHandler.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.racelogtracking.impl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.SmartphoneUUIDSerializationHandler; public class SmartphoneUUIDMongoHandler extends SmartphoneUUIDSerializationHandler diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierJsonHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierJsonHandler.java index fcdb4f4876e..bff372f9a57 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierJsonHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierJsonHandler.java @@ -4,8 +4,8 @@ import java.util.UUID; import org.json.simple.JSONObject; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierMongoHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierMongoHandler.java index a9b1e2cd8b5..1218089453f 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierMongoHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierMongoHandler.java @@ -4,9 +4,9 @@ import java.util.UUID; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierStringSerializationHandler.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierStringSerializationHandler.java index e121abd0502..9f66f61d8e1 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierStringSerializationHandler.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/TrackFileImportDeviceIdentifierStringSerializationHandler.java @@ -2,8 +2,8 @@ package com.sap.sailing.domain.racelogtracking.impl; import java.util.UUID; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceIdentifierStringSerializationHandler; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifierImpl; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/FixLoaderAndTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/FixLoaderAndTracker.java index ddc341ea55e..d83e9517bb5 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/FixLoaderAndTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/FixLoaderAndTracker.java @@ -23,6 +23,7 @@ import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMap import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.TrackedRaceStatusEnum; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.tracking.DoubleVectorFix; @@ -33,7 +34,6 @@ import com.sap.sailing.domain.racelog.tracking.FixReceivedListener; import com.sap.sailing.domain.racelog.tracking.SensorFixMapper; import com.sap.sailing.domain.racelog.tracking.SensorFixStore; import com.sap.sailing.domain.racelogsensortracking.SensorFixMapperFactory; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMappingWithRegattaLogEvent; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.DynamicSensorFixTrack; diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RegattaLogDeviceMappings.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RegattaLogDeviceMappings.java index 07cc2cefb8b..b837aa38419 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RegattaLogDeviceMappings.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RegattaLogDeviceMappings.java @@ -22,8 +22,8 @@ import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMap import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogRevokeEvent; import com.sap.sailing.domain.abstractlog.regatta.impl.BaseRegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMappingFinder; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.DoesNotHaveRegattaLogException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sailing.domain.racelogtracking.DeviceMappingWithRegattaLogEvent; import com.sap.sailing.domain.tracking.DynamicTrack; diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java index 178e8dc026d..b818708212f 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/ConfirmedFinishPositioningListFinderTest.java @@ -12,6 +12,7 @@ import org.junit.Test; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult.MergeState; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; @@ -56,10 +57,10 @@ public class ConfirmedFinishPositioningListFinderTest extends public void testMostRecent() { RaceLogFinishPositioningConfirmedEvent event1 = createEvent(RaceLogFinishPositioningConfirmedEvent.class, 1); RaceLogFinishPositioningConfirmedEvent event2 = createEvent(RaceLogFinishPositioningConfirmedEvent.class, 2); - final CompetitorResultImpl oldResultC1 = new CompetitorResultImpl("Comp1", "Comp 1", 1, MaxPointsReason.NONE, 1.0, /* finishing time */ null, /* comment */ null); - final CompetitorResultImpl oldResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.NONE, 2.0, /* finishing time */ null, /* comment */ null); + final CompetitorResultImpl oldResultC1 = new CompetitorResultImpl("Comp1", "Comp 1", 1, MaxPointsReason.NONE, 1.0, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl oldResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.NONE, 2.0, /* finishing time */ null, /* comment */ null, MergeState.OK); final CompetitorResults olderResults = mockCompetitorResults(oldResultC1, oldResultC2); - final CompetitorResultImpl newResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.DNF, 3.0, /* finishing time */ null, /* comment */ null); + final CompetitorResultImpl newResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.DNF, 3.0, /* finishing time */ null, /* comment */ null, MergeState.OK); final CompetitorResults newerResults = mockCompetitorResults(newResultC2); when(event1.getPositionedCompetitorsIDsNamesMaxPointsReasons()).thenReturn(olderResults); when(event2.getPositionedCompetitorsIDsNamesMaxPointsReasons()).thenReturn(newerResults); @@ -74,16 +75,16 @@ public class ConfirmedFinishPositioningListFinderTest extends RaceLogFinishPositioningConfirmedEvent event2 = createEvent(/* priority */ 1, RaceLogFinishPositioningConfirmedEvent.class, 2); RaceLogFinishPositioningConfirmedEvent event3 = createEvent(/* priority */ 2, RaceLogFinishPositioningConfirmedEvent.class, 3); RaceLogFinishPositioningConfirmedEvent event4 = createEvent(/* priority */ 1, RaceLogFinishPositioningConfirmedEvent.class, 4); - final CompetitorResultImpl e1ResultC1 = new CompetitorResultImpl("Comp1", "Comp 1", 1, MaxPointsReason.DNC, 6.0, /* finishing time */ null, /* comment */ null); - final CompetitorResultImpl e1ResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.NONE, 2.0, /* finishing time */ null, /* comment */ null); + final CompetitorResultImpl e1ResultC1 = new CompetitorResultImpl("Comp1", "Comp 1", 1, MaxPointsReason.DNC, 6.0, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl e1ResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.NONE, 2.0, /* finishing time */ null, /* comment */ null, MergeState.OK); final CompetitorResults e1Results = mockCompetitorResults(e1ResultC1, e1ResultC2); - final CompetitorResultImpl e2ResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.DNF, 3.0, /* finishing time */ null, /* comment */ null); + final CompetitorResultImpl e2ResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.DNF, 3.0, /* finishing time */ null, /* comment */ null, MergeState.OK); final CompetitorResults e2Results = mockCompetitorResults(e2ResultC2); - final CompetitorResultImpl e3ResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.DSQ, 6.0, /* finishing time */ null, /* comment */ null); - final CompetitorResultImpl e3ResultC3 = new CompetitorResultImpl("Comp3", "Comp 3", 2, MaxPointsReason.DNF, 3.0, /* finishing time */ null, /* comment */ null); + final CompetitorResultImpl e3ResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.DSQ, 6.0, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl e3ResultC3 = new CompetitorResultImpl("Comp3", "Comp 3", 2, MaxPointsReason.DNF, 3.0, /* finishing time */ null, /* comment */ null, MergeState.OK); final CompetitorResults e3Results = mockCompetitorResults(e3ResultC2, e3ResultC3); - final CompetitorResultImpl e4ResultC1 = new CompetitorResultImpl("Comp1", "Comp 1", 1, /* maxPointsReason */ null, /* score */ null, /* finishing time */ null, /* comment */ null); - final CompetitorResultImpl e4ResultC4 = new CompetitorResultImpl("Comp4", "Comp 4", 2, MaxPointsReason.DNF, 3.0, /* finishing time */ null, /* comment */ null); + final CompetitorResultImpl e4ResultC1 = new CompetitorResultImpl("Comp1", "Comp 1", 1, /* maxPointsReason */ null, /* score */ null, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl e4ResultC4 = new CompetitorResultImpl("Comp4", "Comp 4", 2, MaxPointsReason.DNF, 3.0, /* finishing time */ null, /* comment */ null, MergeState.OK); final CompetitorResults e4Results = mockCompetitorResults(e4ResultC1, e4ResultC4); when(event1.getPositionedCompetitorsIDsNamesMaxPointsReasons()).thenReturn(e1Results); when(event2.getPositionedCompetitorsIDsNamesMaxPointsReasons()).thenReturn(e2Results); diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java index e9b28c32396..e43e8cece89 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/regattalog/tracking/analyzing/test/DeviceMappingFinderTest.java @@ -17,9 +17,9 @@ import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCo import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceCompetitorMappingFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.impl.CompetitorImpl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifier; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMappingWithRegattaLogEvent; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResult.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResult.java index a1743691ef4..73e556c861e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResult.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/CompetitorResult.java @@ -14,6 +14,30 @@ import com.sap.sse.common.TimePoint; * */ public interface CompetitorResult extends Serializable { + public static enum MergeState { + /** + * No merge was necessary at competitor level. + */ + OK, + + /** + * A field-wise merge was necessary because an update was received that affected this competitor result + * while locally this competitor result was in a "dirty" (modified) state. The merge was carried out + * automatically because the fields changed in the dirty state did not overlap with the fields changed + * in the version of the object received. + */ + WARNING, + + /** + * A field-wise merge was necessary because an update was received that affected this competitor result while + * locally this competitor result was in a "dirty" (modified) state. The fields changed in the dirty state + * overlap with the fields changed in the version of the object received. Field values from the local dirty state + * have been preferred or have been appended in case of {@link String}-typed fields and need manual + * intervention. + */ + ERROR + }; + Serializable getCompetitorId(); String getCompetitorDisplayName(); @@ -27,4 +51,9 @@ public interface CompetitorResult extends Serializable { TimePoint getFinishingTime(); String getComment(); + + /** + * Always returns a valid, non-{@code null} result. See {@link MergeState} for details. + */ + MergeState getMergeState(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultImpl.java index da8728f267b..d5221e451a4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/CompetitorResultImpl.java @@ -23,8 +23,11 @@ public class CompetitorResultImpl implements CompetitorResult { private final String comment; + private final MergeState mergeState; + public CompetitorResultImpl(Serializable competitorId, String competitorDisplayName, int oneBasedRank, - MaxPointsReason maxPointsReason, Double score, TimePoint finishingTime, String comment) { + MaxPointsReason maxPointsReason, Double score, TimePoint finishingTime, String comment, + MergeState mergeState) { super(); this.competitorId = competitorId; this.competitorDisplayName = competitorDisplayName; @@ -33,6 +36,7 @@ public class CompetitorResultImpl implements CompetitorResult { this.score = score; this.finishingTime = finishingTime; this.comment = comment; + this.mergeState = mergeState; } @Override @@ -70,6 +74,11 @@ public class CompetitorResultImpl implements CompetitorResult { return comment; } + @Override + public MergeState getMergeState() { + return mergeState == null ? MergeState.OK : mergeState; // default in case of having de-serialized an old version + } + @Override public int hashCode() { final int prime = 31; @@ -81,6 +90,7 @@ public class CompetitorResultImpl implements CompetitorResult { result = prime * result + ((maxPointsReason == null) ? 0 : maxPointsReason.hashCode()); result = prime * result + oneBasedRank; result = prime * result + ((score == null) ? 0 : score.hashCode()); + result = prime * result + ((mergeState == null) ? 0 : mergeState.hashCode()); return result; } @@ -122,6 +132,11 @@ public class CompetitorResultImpl implements CompetitorResult { return false; } else if (!score.equals(other.score)) return false; + if (mergeState == null) { + if (other.mergeState != null) + return false; + } else if (!mergeState.equals(other.mergeState)) + return false; return true; } @@ -129,7 +144,7 @@ public class CompetitorResultImpl implements CompetitorResult { public String toString() { return "CompetitorResultImpl [competitorId=" + competitorId + ", competitorName=" + competitorDisplayName + ", rank=" + oneBasedRank + ", maxPointsReason=" + maxPointsReason + ", score=" + score + ", finishingTime=" - + finishingTime + ", comment=" + comment + "]"; + + finishingTime + ", comment=" + comment + ", mergeState=" + mergeState + "]"; } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java index 269d14b692d..5a2a9e2c7dc 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/NoAddingRaceLogWrapper.java @@ -15,6 +15,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; +import com.sap.sailing.domain.tracking.impl.TimeRangeCache; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util.Function; @@ -263,4 +264,11 @@ public class NoAddingRaceLogWrapper implements RaceLog { public int size() { return innerRaceLog.size(); } + + @Override + public T getValueSum(TimePoint from, TimePoint to, T nullElement, + com.sap.sailing.domain.tracking.Track.Adder adder, TimeRangeCache cache, + com.sap.sailing.domain.tracking.Track.TimeRangeValueCalculator valueCalculator) { + return innerRaceLog.getValueSum(from, to, nullElement, adder, cache, valueCalculator); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java index 20501c69678..2fbd998177e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java @@ -158,6 +158,7 @@ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState { public void forceNewDependentStartTime(TimePoint now, final Duration startTimeDifference, final SimpleRaceLogIdentifier dependentOnRace) { raceLog.add(new RaceLogDependentStartTimeEventImpl(now, author, raceLog.getCurrentPassId(), dependentOnRace, startTimeDifference)); } + @Override public void setFinishingTime(TimePoint timePoint) { @@ -166,7 +167,10 @@ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState { @Override public void setFinishedTime(TimePoint timePoint) { - raceLog.add(new RaceLogRaceStatusEventImpl(timePoint, author, raceLog.getCurrentPassId(), RaceLogRaceStatus.FINISHED)); + raceLog.add(new RaceLogRaceStatusEventImpl(timePoint, author, raceLog.getCurrentPassId(), + RaceLogRaceStatus.FINISHED)); + // ensure caches are synched + forceUpdate(); } @Override diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEvent.java index 8895db1fbea..7cac1817803 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEvent.java @@ -6,7 +6,7 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDefinedMarkAnalyzer; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEventImpl.java index 88b011916d1..08f4e08c1d9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/RegattaLogDeviceMappingEventImpl.java @@ -5,7 +5,7 @@ import java.io.Serializable; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventImpl; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; import com.sap.sse.common.WithID; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/AbstractRegattaLogDeviceCompetitorSensorDataMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/AbstractRegattaLogDeviceCompetitorSensorDataMappingEventImpl.java index a0891b9273a..dbe9f1e80ac 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/AbstractRegattaLogDeviceCompetitorSensorDataMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/AbstractRegattaLogDeviceCompetitorSensorDataMappingEventImpl.java @@ -8,7 +8,7 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorSensorDataMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEventImpl; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorBravoExtendedMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorBravoExtendedMappingEventImpl.java index 43eb27f8faa..83fc2feb3e4 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorBravoExtendedMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorBravoExtendedMappingEventImpl.java @@ -4,7 +4,7 @@ import java.io.Serializable; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorBravoMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorBravoMappingEventImpl.java index 8c68721ceaf..831aa75a927 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorBravoMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorBravoMappingEventImpl.java @@ -4,7 +4,7 @@ import java.io.Serializable; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorExpeditionExtendedMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorExpeditionExtendedMappingEventImpl.java index b0049dbb1e3..eab4586d1f2 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorExpeditionExtendedMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorExpeditionExtendedMappingEventImpl.java @@ -4,7 +4,7 @@ import java.io.Serializable; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorMappingEventImpl.java index ef7aea4c628..b9c8cbce426 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceCompetitorMappingEventImpl.java @@ -8,7 +8,7 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEventImpl; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; public class RegattaLogDeviceCompetitorMappingEventImpl extends RegattaLogDeviceMappingEventImpl implements diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceMarkMappingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceMarkMappingEventImpl.java index e2da1cdca93..61312f84ba3 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceMarkMappingEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/events/impl/RegattaLogDeviceMarkMappingEventImpl.java @@ -8,7 +8,7 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEventImpl; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; public class RegattaLogDeviceMarkMappingEventImpl extends RegattaLogDeviceMappingEventImpl implements diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/BaseRegattaLogDeviceMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/BaseRegattaLogDeviceMappingFinder.java index 83cff11e8f6..62f138d79f5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/BaseRegattaLogDeviceMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/BaseRegattaLogDeviceMappingFinder.java @@ -10,8 +10,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceCompetitorMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceCompetitorMappingFinder.java index 6226305b798..c357cc9e26e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceCompetitorMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceCompetitorMappingFinder.java @@ -8,7 +8,7 @@ import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompeti import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java index 448947529dc..983684147c1 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMappingFinder.java @@ -13,7 +13,7 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogCloseOpenEndedDeviceMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sailing.domain.racelogtracking.DeviceMappingWithRegattaLogEvent; import com.sap.sailing.domain.racelogtracking.impl.DeviceMappingWithRegattaLogEventImpl; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java index b76ca947923..4e3d50a3cf8 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/regatta/tracking/analyzing/impl/RegattaLogDeviceMarkMappingFinder.java @@ -8,7 +8,7 @@ import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMapping import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceMarkMappingEventImpl; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceIdentifierSerializationHandler.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceIdentifierSerializationHandler.java index 57327658980..e3bc1a64e60 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceIdentifierSerializationHandler.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceIdentifierSerializationHandler.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.racelogtracking; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceMapping.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceMapping.java index 19fd46a3fed..afd702b188d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceMapping.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/DeviceMapping.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.util.List; import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMappingFinder; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimeRange; import com.sap.sse.common.Timed; import com.sap.sse.common.WithID; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/PlaceHolderDeviceIdentifier.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/PlaceHolderDeviceIdentifier.java index 6adb0e30b79..1c4d9c2b16c 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/PlaceHolderDeviceIdentifier.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/PlaceHolderDeviceIdentifier.java @@ -1,6 +1,7 @@ package com.sap.sailing.domain.racelogtracking; import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.common.DeviceIdentifier; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/SmartphoneUUIDIdentifier.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/SmartphoneUUIDIdentifier.java index 05d6e8e3671..2b5655a8c58 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/SmartphoneUUIDIdentifier.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/SmartphoneUUIDIdentifier.java @@ -2,6 +2,8 @@ package com.sap.sailing.domain.racelogtracking; import java.util.UUID; +import com.sap.sailing.domain.common.DeviceIdentifier; + public interface SmartphoneUUIDIdentifier extends DeviceIdentifier { String TYPE = "smartphoneUUID"; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/SmartphoneUUIDSerializationHandler.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/SmartphoneUUIDSerializationHandler.java index 8a284d26c53..2661f799f5a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/SmartphoneUUIDSerializationHandler.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/SmartphoneUUIDSerializationHandler.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.racelogtracking; import java.util.UUID; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.racelogtracking.impl.SmartphoneUUIDIdentifierImpl; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingImpl.java index 125b7c6a8b3..1a7bebc997f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingImpl.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import java.util.List; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingWithRegattaLogEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingWithRegattaLogEventImpl.java index 21096c83a03..454d2055597 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingWithRegattaLogEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/DeviceMappingWithRegattaLogEventImpl.java @@ -4,7 +4,7 @@ import java.io.Serializable; import java.util.List; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEvent; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMappingWithRegattaLogEvent; import com.sap.sse.common.TimeRange; import com.sap.sse.common.WithID; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/PlaceHolderDeviceIdentifierSerializationHandler.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/PlaceHolderDeviceIdentifierSerializationHandler.java index 383c40a7e5c..182fa4d18a5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/PlaceHolderDeviceIdentifierSerializationHandler.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/racelogtracking/impl/PlaceHolderDeviceIdentifierSerializationHandler.java @@ -1,7 +1,7 @@ package com.sap.sailing.domain.racelogtracking.impl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.PlaceHolderDeviceIdentifier; import com.sap.sse.common.Util; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/Track.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/Track.java index adada1b8209..7bffcbefe56 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/Track.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/Track.java @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.concurrent.locks.ReadWriteLock; import com.sap.sailing.domain.common.tracking.GPSFixMoving; +import com.sap.sailing.domain.tracking.impl.TimeRangeCache; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Timed; @@ -31,6 +32,29 @@ import com.sap.sse.common.scalablevalue.ScalableValue; * @author Axel Uhl (d043530) */ public interface Track extends Serializable { + /** + * An adding function to be used together with {@link Track#getValueSum(TimePoint, TimePoint, Object, Adder, TimeRangeCache, TimeRangeValueCalculator)}. + * + * @author Axel Uhl (D043530) + * + * @param + */ + static interface Adder { + /** + * Adds two elements of type {@code T}. Neither argument must be {@code null}. + */ + T add(T t1, T t2); + } + + static interface TimeRangeValueCalculator { + /** + * Calculates a value for fixes across a time range. When the method is called, + * a read lock will previously have been {@link Track#lockForRead obtained} before, + * so an implementing class does not need to worry about acquiring the lock. + */ + T calculate(TimePoint from, TimePoint to); + } + /** * Locks this track for reading by the calling thread. If the thread already holds the lock for this track, * the hold count will be incremented. Make sure to call {@link #unlockAfterRead()} in a finally @@ -209,6 +233,8 @@ public interface Track extends Serializable { */ Duration getAverageIntervalBetweenRawFixes(); + T getValueSum(TimePoint from, TimePoint to, T nullElement, Adder adder, TimeRangeCache cache, TimeRangeValueCalculator valueCalculator); + /** * @return the number of raw fixes contained in the Track. */ @@ -218,4 +244,5 @@ public interface Track extends Serializable { * Tells whether the collection of {@link #getRawFixes() raw fixes} (no outliers removed) is empty */ boolean isEmpty(); + } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TimeRangeCache.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TimeRangeCache.java new file mode 100755 index 00000000000..de43e8d22f7 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TimeRangeCache.java @@ -0,0 +1,221 @@ +package com.sap.sailing.domain.tracking.impl; + +import java.util.Comparator; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map.Entry; +import java.util.NavigableSet; + +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util; +import com.sap.sse.common.Util.Pair; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; +import com.sap.sse.util.impl.ArrayListNavigableSet; + +/** + * This cache looks "backwards." It contains pairs whose first component represents a to parameter used in + * a calculation for a time range. It is ordered by this component. The second component is a navigable, ordered set of + * pairs where the first pair component represents a from parameter used in the calculation's time range + * and the second pair component represents the result of the calculation for this parameter combination. + *

+ * + * For implementation efficiency in combination with using an {@link ArrayListNavigableSet} for the values and in order + * to be able to efficiently extend a cache entry for a single to fix, the navigable sets containing the + * from fixes and results are ordered such that earlier fixes come later in the set. This way, extending + * the cache entry for a to fix to an earlier from fix only requires appending to the set. + *

+ * + * Invalidation: When a new fix is added to the track, all cache entries for fixes at or later than the new fix's + * time point are removed from this cache. Additionally, the fix insertion may have an impact on the + * {@link #getEarliestFromAndResultAtOrAfterFrom(TimePoint, TimePoint) previous fix's} validity (track smoothing) and + * therefore on its selection for result aggregation. Therefore, if fix addition turned the previous fix invalid, the + * cache entries for the time points at or after the previous fix also need to be removed. + *

+ * + * Cache use: When a result across a time range is to be computed the calculating method should first look for a + * cache entry for the to parameter. If one is found, the earliest entry in the navigable set for the + * navigable set of from and result values that is at or after the requested from time point + * is determined. If such an entry exists, the result is remembered and the algorithm is repeated recursively, using the + * from value found in the cache as the new to value, and the from value + * originally passed to the calculating method as from again. If no entry is found in the cache entry for + * to that is at or after the requested from time, the result has to be computed "from + * scratch." + *

+ * + * If a cache entry for to is not found, the latest cache entry before it is looked up. If one is found, + * the result for the time range between the to time point requested and the to time point + * found in the cache is computed by iterating the smoothened fixes for this interval. If none is found, the result is + * computed by iterating backwards all the way to from. + *

+ * + * Once the calculating method has computed its value, it should {@link #cache(TimePoint, TimePoint, Object) add} the + * result to the cache. + * + * @author Axel Uhl (D043530) + */ +public class TimeRangeCache { + public static final int MAX_SIZE = 100; + + private final NavigableSet>>> timeRangeCache; + + /** + * The cache is to have limited size. Eviction shall happen based on a least-recently-used strategy. Usage is + * defined as having been returned by {@link #getEarliestFromAndResultAtOrAfterFrom(TimePoint, TimePoint)} or + * having been added by {@link #cache(TimePoint, TimePoint, Object)}. + *

+ * + * When an eldest entry is asked to be expunged from this map and the map has more than {@link #MAX_SIZE} elements, + * the expunging will be admitted, and the entry is removed from the {@link #timeRangeCache} core structure. Reading + * and writing this structure must happen under the {@link #lock write lock} because also reading the linked hash + * map that counts access as "use" has a modifying effect on its internal structures. + *

+ * + * The key pairs are from/to pairs. Note that this is in some sense "the opposite direction" compared to the + * alignment of the {@link #timeRangeCache} structure which has as its outer keys the "to" time point.

+ * + * Read access is to be synchronized using this field's mutex; write access only happens under the + * {@link #lock write lock} and therefore will have no contenders. + */ + private final LinkedHashMap, Void> lruCache; + + private final NamedReentrantReadWriteLock lock; + + private static final Comparator> timePointInPairComparator = new Comparator>() { + @Override + public int compare(Util.Pair o1, Util.Pair o2) { + return o1.getA().compareTo(o2.getA()); + } + }; + + public TimeRangeCache(String nameForLockLogging) { + lock = new NamedReentrantReadWriteLock("lock for TimeRangeCache for "+nameForLockLogging, /* fair */ true); + this.timeRangeCache = new ArrayListNavigableSet>>>(timePointInPairComparator); + this.lruCache = new LinkedHashMap, Void>(/* initial capacity */ 10, /* load factor */ 0.75f, + /* access-based ordering */ true) { + private static final long serialVersionUID = -6568235517111733193L; + + @Override + protected boolean removeEldestEntry(Entry, Void> eldest) { + final boolean expunge = size() > MAX_SIZE; + if (expunge) { + removeCacheEntry(eldest.getKey().getA(), eldest.getKey().getB()); + } + return expunge; + } + }; + } + + public int size() { + return lruCache.size(); + } + + private void removeCacheEntry(TimePoint from, TimePoint to) { + assert lock.getWriteHoldCount() == 1; // we can be sure we are alone here; this only happens when adding a new entry, holding the write lock + Util.Pair>> entryForTo = timeRangeCache.floor(createDummy(to)); + if (entryForTo.getA().equals(to)) { + Pair entryForFrom = entryForTo.getB().ceiling(new Util.Pair(from, null)); + if (entryForFrom.getA().equals(from)) { + entryForTo.getB().remove(entryForFrom); + if (entryForTo.getB().isEmpty()) { + timeRangeCache.remove(entryForTo); + } + } + } + } + + /** + * Looks up the entry closest to but no later than to. If not found, null is returned. If + * found, the earliest pair of from/result that is at or after from will be returned, together with + * the to value of the entry. If there is no entry that is at or after from, + * null is returned. + */ + public Util.Pair> getEarliestFromAndResultAtOrAfterFrom(TimePoint from, TimePoint to) { + LockUtil.lockForRead(lock); + try { + Util.Pair> result = null; + Util.Pair>> entryForTo = timeRangeCache.floor(createDummy(to)); + if (entryForTo != null) { + final Util.Pair fromCeiling = entryForTo.getB().ceiling(new Util.Pair(from, null)); + if (fromCeiling != null) { + result = new Util.Pair>(entryForTo.getA(), fromCeiling); + } + } + // no writer can be active because we're holding the read lock; read access on the lruCache is synchronized using + // the lruCache's mutex; this is necessary because we're using access-based LRU pinging where even getting an entry + // modifies the internal parts of the data structure which is not thread safe. + synchronized (lruCache) { + lruCache.get(new Util.Pair(from, to)); + } + return result; + } finally { + LockUtil.unlockAfterRead(lock); + } + } + + /** + * Removes all cache entries that have a to time point that is at or after timePoint. + */ + public void invalidateAllAtOrLaterThan(TimePoint timePoint) { + LockUtil.lockForWrite(lock); + try { + Util.Pair>> dummy = createDummy(timePoint); + NavigableSet>>> toRemove = timeRangeCache.tailSet(dummy, /* inclusive */ true); + for (Iterator>>> i=toRemove.iterator(); i.hasNext(); ) { + Util.Pair>> entryToRemove = i.next(); + assert entryToRemove.getA().compareTo(timePoint) >= 0; + for (Pair fromAndResult : entryToRemove.getB()) { + lruCache.remove(new Util.Pair<>(fromAndResult.getA(), entryToRemove.getA())); + } + i.remove(); + } + } finally { + LockUtil.unlockAfterWrite(lock); + } + } + + private NavigableSet> getEntryForTo(TimePoint to) { + NavigableSet> result = null; + Util.Pair>> dummyForTo = createDummy(to); + Util.Pair>> entryForTo = timeRangeCache.floor(dummyForTo); + if (entryForTo != null && entryForTo.getA().equals(to)) { + result = entryForTo.getB(); + } + return result; + } + + public void cache(TimePoint from, TimePoint to, T result) { + LockUtil.lockForWrite(lock); + try { + NavigableSet> entryForTo = getEntryForTo(to); + if (entryForTo == null) { + entryForTo = new ArrayListNavigableSet>(timePointInPairComparator); + Util.Pair>> pairForTo = new Util.Pair>>( + to, entryForTo); + timeRangeCache.add(pairForTo); + } + entryForTo.add(new Util.Pair(from, result)); + lruCache.put(new Util.Pair(from, to), null); + } finally { + LockUtil.unlockAfterWrite(lock); + } + } + + private Util.Pair>> createDummy(TimePoint to) { + return new Util.Pair>>(to, null); + } + + /** + * Removes all contents from this cache + */ + public void clear() { + LockUtil.lockForWrite(lock); + try { + timeRangeCache.clear(); + lruCache.clear(); + } finally { + LockUtil.unlockAfterWrite(lock); + } + + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java index 68fa2afef45..4f6a752bbcc 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackImpl.java @@ -11,6 +11,7 @@ import com.sap.sailing.domain.tracking.Track; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Timed; +import com.sap.sse.common.Util; import com.sap.sse.common.Util.Function; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.scalablevalue.ScalableValue; @@ -459,6 +460,64 @@ public class TrackImpl implements Track { } } + @Override + public T getValueSum(TimePoint from, TimePoint to, T nullElement, Adder adder, TimeRangeCache cache, TimeRangeValueCalculator valueCalculator) { + return getValueSumRecursively(from, to, /* recursionLevel */ 0, nullElement, adder, cache, valueCalculator); + } + + private T getValueSumRecursively(TimePoint from, TimePoint to, int recursionDepth, T nullElement, + Adder adder, TimeRangeCache cache, TimeRangeValueCalculator valueCalculator) { + T result; + if (!from.before(to)) { + result = nullElement; + } else { + boolean perfectCacheHit = false; + lockForRead(); + try { + Util.Pair> bestCacheEntry = cache.getEarliestFromAndResultAtOrAfterFrom(from, to); + if (bestCacheEntry != null) { + perfectCacheHit = true; // potentially a cache hit; but if it doesn't span the full interval, it's not perfect; see below + // compute the missing stretches between best cache entry's "from" and our "from" and the cache + // entry's "to" and our "to" + T valueFromFromToBeginningOfCacheEntry = nullElement; + T valueFromEndOfCacheEntryToTo = nullElement; + if (!bestCacheEntry.getB().getA().equals(from)) { + assert bestCacheEntry.getB().getA().after(from); + perfectCacheHit = false; + valueFromFromToBeginningOfCacheEntry = getValueSumRecursively(from, bestCacheEntry + .getB().getA(), recursionDepth + 1, nullElement, adder, cache, valueCalculator); + } + if (!bestCacheEntry.getA().equals(to)) { + assert bestCacheEntry.getA().before(to); + perfectCacheHit = false; + valueFromEndOfCacheEntryToTo = getValueSumRecursively(bestCacheEntry.getA(), to, + recursionDepth + 1, nullElement, adder, cache, valueCalculator); + } + if (valueFromEndOfCacheEntryToTo == null || bestCacheEntry.getB().getB() == null) { + result = null; + } else { + result = adder.add(adder.add(valueFromFromToBeginningOfCacheEntry, bestCacheEntry.getB().getB()), + valueFromEndOfCacheEntryToTo); + } + } else { + if (from.compareTo(to) < 0) { + result = valueCalculator.calculate(from, to); + } else { + result = nullElement; + } + } + } finally { + unlockAfterRead(); + } + if (!perfectCacheHit && recursionDepth == 0) { + cache.cache(from, to, result); + } + } + return result; + } + + + @Override public int size() { return fixes.size(); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/BearingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/BearingTest.java index 2beb3229a9b..8c82f95ade9 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/BearingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/BearingTest.java @@ -46,6 +46,16 @@ public class BearingTest { assertNull(new BearingWithConfidenceCluster(null).getAverage(null)); } + @Test + public void testNegativeAngle() { + assertEquals(-10., new DegreeBearingImpl(-10.).getDegrees(), 0.000001); + } + + @Test + public void testNegativeAngleOverflow() { + assertEquals(-10., new DegreeBearingImpl(-370.).getDegrees(), 0.000001); + } + @Test public void testZeroConfidenceLeadsToNullBearingAverage() { BearingWithConfidenceCluster cluster = new BearingWithConfidenceCluster(null); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java index cbcfa7f6b7c..61002947418 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorProviderCacheInvalidationTest.java @@ -207,27 +207,29 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard for (Competitor c : compLists[1]) { raceLog.add(new RaceLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), new LogEventAuthorImpl("Me", 0), 1, c)); } + Set allCompetitors = new HashSet<>(); + allCompetitors.addAll(compLists[0]); + allCompetitors.addAll(compLists[1]); // expected are only the competitors in the RaceLog, because only one RaceColumn is // registered, which has the competitors registered in the RaceLog. - assertRegattaAndRaceCompetitors(new HashSet<>(compLists[1])); + assertRegattaAndRaceCompetitors(allCompetitors, new HashSet<>(compLists[1])); // Now we revoke that the race log provides the competitors for R1; the competitors should then // snap back to those competitors taken from the regatta log for both, the rentire leaderboard // as well as for the race column raceLog.revokeEvent(author, usesCompetitorsFromRaceLogEvent); - assertRegattaAndRaceCompetitors(new HashSet<>(compLists[0])); + assertRegattaAndRaceCompetitors(new HashSet<>(compLists[0]), new HashSet<>(compLists[0])); // And now re-introduce per-race competitors and validate again that the cache adjusts properly: raceLog.add(new RaceLogUseCompetitorsFromRaceLogEventImpl(MillisecondsTimePoint.now(), author, MillisecondsTimePoint.now(), UUID.randomUUID(), passId)); - assertRegattaAndRaceCompetitors(new HashSet<>(compLists[1])); + assertRegattaAndRaceCompetitors(allCompetitors, new HashSet<>(compLists[1])); } - private void assertRegattaAndRaceCompetitors(Set expected) { + private void assertRegattaAndRaceCompetitors(Set expectedAllCompetitors, Set expectedForRace) { Set actual = new HashSet<>(); Util.addAll(competitorProviderFlexibleLeaderboard.getAllCompetitors(), actual); - assertEquals(expected, actual); + assertEquals(expectedAllCompetitors, actual); Set actualForRace = new HashSet<>(); - //For the race only the competitors registered on RaceLog as RaceLogUseCompetitorsFromRaceLogEvent is present - Set expectedForRace = new HashSet<>(expected); + // For the race only the competitors registered on RaceLog as RaceLogUseCompetitorsFromRaceLogEvent is present Util.addAll(competitorProviderFlexibleLeaderboard.getAllCompetitors( flexibleLeaderboard.getRaceColumnByName("R1"), flexibleLeaderboard.getFleet(LeaderboardNameConstants.DEFAULT_FLEET_NAME)), actualForRace); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java index 51cb340ece3..c8fe26bb138 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/MarkPassingUpdateFromRaceLogFinishPositioingListTest.java @@ -24,6 +24,7 @@ import org.junit.Test; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.abstractlog.race.CompetitorResult.MergeState; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent; @@ -153,7 +154,7 @@ public class MarkPassingUpdateFromRaceLogFinishPositioingListTest extends Abstra int rank = 1; for (Pair finishingTime : finishingTimes) { results.add(new CompetitorResultImpl(finishingTime.getA().getId(), finishingTime.getA().getName(), rank++, /* maxPointsReason */ - null, /* score */null, finishingTime.getB(), /* comment */null)); + null, /* score */null, finishingTime.getB(), /* comment */null, MergeState.OK)); } return results; } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackTest.java index 165585f853c..f0ce8699455 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackTest.java @@ -51,7 +51,7 @@ import com.sap.sailing.domain.common.tracking.impl.GPSFixMovingImpl; import com.sap.sailing.domain.common.tracking.impl.VeryCompactGPSFixMovingImpl; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.GPSFixTrack; -import com.sap.sailing.domain.tracking.impl.DistanceCache; +import com.sap.sailing.domain.tracking.impl.TimeRangeCache; import com.sap.sailing.domain.tracking.impl.DynamicGPSFixMovingTrackImpl; import com.sap.sailing.domain.tracking.impl.DynamicGPSFixTrackImpl; import com.sap.sailing.domain.tracking.impl.GPSFixTrackImpl; @@ -304,7 +304,7 @@ public class TrackTest { // The following getMaximumSpeedOverGround call will trigger a computeMaxSpeed(...) and a cache(...) call new Thread(()-> assertEquals(1., track.getMaximumSpeedOverGround(new MillisecondsTimePoint(0), new MillisecondsTimePoint(7200000)). - getB().getKnots(), 0.001)).start(); // produces a cache entry that ends + getB().getKnots(), 0.01)).start(); // produces a cache entry that ends // now don't release the cacheBarrier as yet but add more fixes new Thread(() -> { GPSFixMoving fix2 = new GPSFixMovingImpl(new DegreePosition(0, 0), new MillisecondsTimePoint(3600000), @@ -442,7 +442,7 @@ public class TrackTest { @Test public void testDistanceTraveledBackwardsQuery() { final Set> cacheEntries = new HashSet<>(); - final DistanceCache distanceCache = new DistanceCache("test-DistanceCache") { + final TimeRangeCache distanceCache = new TimeRangeCache("test-DistanceCache") { @Override public void cache(TimePoint from, TimePoint to, Distance distance) { super.cache(from, to, distance); @@ -453,7 +453,7 @@ public class TrackTest { DynamicGPSFixTrack track = new DynamicGPSFixTrackImpl(new Object(), /* millisecondsOverWhichToAverage */ 30000l) { private static final long serialVersionUID = -7277196393160609503L; @Override - protected DistanceCache getDistanceCache() { + protected TimeRangeCache getDistanceCache() { return distanceCache; } }; @@ -779,7 +779,7 @@ public class TrackTest { @Test public void testDistanceTraveledOnSmoothenedTrackThenAddingOutlier() { final Set invalidationCalls = new HashSet(); - final DistanceCache distanceCache = new DistanceCache("test-DistanceCache") { + final TimeRangeCache distanceCache = new TimeRangeCache("test-DistanceCache") { @Override public void invalidateAllAtOrLaterThan(TimePoint timePoint) { super.invalidateAllAtOrLaterThan(timePoint); @@ -789,7 +789,7 @@ public class TrackTest { DynamicGPSFixTrack track = new DynamicGPSFixTrackImpl(new Object(), /* millisecondsOverWhichToAverage */ 30000l) { private static final long serialVersionUID = -7277196393160609503L; @Override - protected DistanceCache getDistanceCache() { + protected TimeRangeCache getDistanceCache() { return distanceCache; } }; @@ -811,7 +811,7 @@ public class TrackTest { } invalidationCalls.clear(); assertEquals(speed.getMetersPerSecond()*(steps-1), track.getDistanceTraveled(now, start).getMeters(), 0.02); - final com.sap.sse.common.Util.Pair> fullIntervalCacheEntry = distanceCache.getEarliestFromAndDistanceAtOrAfterFrom(now, start); + final com.sap.sse.common.Util.Pair> fullIntervalCacheEntry = distanceCache.getEarliestFromAndResultAtOrAfterFrom(now, start); assertNotNull(fullIntervalCacheEntry); // no more entry for "to"-value start in cache assertEquals(start, fullIntervalCacheEntry.getA()); assertEquals(now, fullIntervalCacheEntry.getB().getA()); @@ -822,13 +822,13 @@ public class TrackTest { assertEquals(1, invalidationCalls.size()); TimePoint timePointOfLastFixBeforeOutlier = track.getLastFixBefore(timePointForOutlier).getTimePoint(); assertTrue(invalidationCalls.iterator().next().after(timePointOfLastFixBeforeOutlier)); // outlier doesn't turn its preceding element into an outlier - assertNull(distanceCache.getEarliestFromAndDistanceAtOrAfterFrom(now, start)); // no more entry for "to"-value start in cache + assertNull(distanceCache.getEarliestFromAndResultAtOrAfterFrom(now, start)); // no more entry for "to"-value start in cache invalidationCalls.clear(); final TimePoint timePointOfLastOriginalFix = track.getLastRawFix().getTimePoint(); assertEquals(speed.getMetersPerSecond() * (steps - 1), track.getDistanceTraveled(now, timePointOfLastOriginalFix).getMeters(), 0.02); final com.sap.sse.common.Util.Pair> newFullIntervalCacheEntry = distanceCache - .getEarliestFromAndDistanceAtOrAfterFrom(now, timePointOfLastOriginalFix); + .getEarliestFromAndResultAtOrAfterFrom(now, timePointOfLastOriginalFix); assertNotNull(newFullIntervalCacheEntry); // no more entry for "to"-value start in cache assertEquals(timePointOfLastOriginalFix, newFullIntervalCacheEntry.getA()); assertEquals(now, newFullIntervalCacheEntry.getB().getA()); @@ -845,7 +845,7 @@ public class TrackTest { invalidationCalls.clear(); // expect the invalidation to have started after the single cache entry, so the cache entry still has to be there: final com.sap.sse.common.Util.Pair> stillPresentFullIntervalCacheEntry = distanceCache - .getEarliestFromAndDistanceAtOrAfterFrom(now, timePointOfLastOriginalFix); + .getEarliestFromAndResultAtOrAfterFrom(now, timePointOfLastOriginalFix); assertNull(stillPresentFullIntervalCacheEntry); // no more entry for "to"-value start in cache because new temporary outlier lies in previously cached interval GPSFix polishedLastFix = track.getLastFixBefore(new MillisecondsTimePoint(Long.MAX_VALUE)); // get the last smoothened fix... // ...which now is expected to be two fixes before lateOutlier because lateOutlier has previous fixes within the time range @@ -870,7 +870,7 @@ public class TrackTest { assertTrue(timePointForLateOutlier.compareTo(fix.getTimePoint()) < 0); // expect the invalidation to have started at the fix before the outlier, leaving the previous result ending at the fix right before the outlier intact final com.sap.sse.common.Util.Pair> stillStillPresentFullIntervalCacheEntry = distanceCache - .getEarliestFromAndDistanceAtOrAfterFrom(now, timePointOfLastOriginalFix); + .getEarliestFromAndResultAtOrAfterFrom(now, timePointOfLastOriginalFix); assertNull(stillStillPresentFullIntervalCacheEntry); // still nothing in the cache track.lockForRead(); try { @@ -955,11 +955,11 @@ public class TrackTest { final Duration raceDuration = Duration.ONE_HOUR.times(48); final Speed speed = new KnotSpeedImpl(12); final Distance distancePerSample = speed.travel(fixTime, fixTime.plus(samplingInterval)); - final DistanceCache distanceCache = new DistanceCache("test-DistanceCache"); + final TimeRangeCache distanceCache = new TimeRangeCache<>("test-DistanceCache"); DynamicGPSFixTrack track = new DynamicGPSFixTrackImpl(new Object(), /* millisecondsOverWhichToAverage */ 30000l) { private static final long serialVersionUID = -7277196393160609503L; @Override - protected DistanceCache getDistanceCache() { + protected TimeRangeCache getDistanceCache() { return distanceCache; } }; @@ -980,13 +980,13 @@ public class TrackTest { queryTime = queryTime.plus(queryInterval); } } - assertTrue(distanceCache.size() <= DistanceCache.MAX_SIZE); + assertTrue(distanceCache.size() <= TimeRangeCache.MAX_SIZE); } @Test public void testDistanceCacheAccessForPartialStrip() { final Set invalidationCalls = new HashSet(); - final DistanceCache distanceCache = new DistanceCache("test-DistanceCache") { + final TimeRangeCache distanceCache = new TimeRangeCache("test-DistanceCache") { @Override public void invalidateAllAtOrLaterThan(TimePoint timePoint) { super.invalidateAllAtOrLaterThan(timePoint); @@ -996,7 +996,7 @@ public class TrackTest { DynamicGPSFixTrack track = new DynamicGPSFixTrackImpl(new Object(), /* millisecondsOverWhichToAverage */ 30000l) { private static final long serialVersionUID = -7277196393160609503L; @Override - protected DistanceCache getDistanceCache() { + protected TimeRangeCache getDistanceCache() { return distanceCache; } }; @@ -1024,11 +1024,11 @@ public class TrackTest { assertEquals(speed.getMetersPerSecond()*(steps-1), track.getDistanceTraveled(now, start).getMeters(), 0.02); assertTrue(invalidationCalls.isEmpty()); // expect a cache entry exactly for the strip's boundaries - com.sap.sse.common.Util.Pair> stripCacheEntry = distanceCache.getEarliestFromAndDistanceAtOrAfterFrom(stripFrom, stripTo); + com.sap.sse.common.Util.Pair> stripCacheEntry = distanceCache.getEarliestFromAndResultAtOrAfterFrom(stripFrom, stripTo); assertEquals(stripTo, stripCacheEntry.getA()); assertEquals(stripFrom, stripCacheEntry.getB().getA()); // expect a cache entry exactly for the full boundaries - com.sap.sse.common.Util.Pair> fullCacheEntry = distanceCache.getEarliestFromAndDistanceAtOrAfterFrom(now, start); + com.sap.sse.common.Util.Pair> fullCacheEntry = distanceCache.getEarliestFromAndResultAtOrAfterFrom(now, start); assertEquals(start, fullCacheEntry.getA()); assertEquals(now, fullCacheEntry.getB().getA()); } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 38232850d99..958fe6b4c7d 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -674,6 +674,16 @@ public class MockedTrackedRace implements DynamicTrackedRace { return null; } + @Override + public Distance getDistanceFoiled(Competitor competitor, TimePoint timePoint) { + return null; + } + + @Override + public Duration getDurationFoiled(Competitor competitor, TimePoint timePoint) { + return null; + } + @Override public Distance getWindwardDistanceToCompetitorFarthestAhead(Competitor competitor, TimePoint timePoint, WindPositionMode windPositionMode) { @@ -1155,4 +1165,10 @@ public class MockedTrackedRace implements DynamicTrackedRace { public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) { return null; } + + @Override + public SpeedWithBearing getVelocityMadeGood(Competitor competitor, TimePoint timePoint, + WindPositionMode windPositionMode, WindLegTypeAndLegBearingCache cache) { + return null; + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index 05132e8622e..3cb4725cfbf 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -60,6 +60,7 @@ import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.WindWithConfidence; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; +import com.sap.sse.common.Duration; import com.sap.sse.common.IsManagedByCache; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; @@ -360,6 +361,16 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { return null; } + @Override + public Distance getDistanceFoiled(Competitor competitor, TimePoint timePoint) { + return null; + } + + @Override + public Duration getDurationFoiled(Competitor competitor, TimePoint timePoint) { + return null; + } + @Override public Distance getWindwardDistanceToCompetitorFarthestAhead(Competitor competitor, TimePoint timePoint, WindPositionMode windPositionMode) { return null; @@ -707,4 +718,10 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) { return null; } + + @Override + public SpeedWithBearing getVelocityMadeGood(Competitor competitor, TimePoint timePoint, + WindPositionMode windPositionMode, WindLegTypeAndLegBearingCache cache) { + return null; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java index b039debafb7..abd48732d49 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java @@ -269,7 +269,7 @@ public interface Leaderboard extends LeaderboardBase, HasRaceColumns { * competitor doesn't appear in any of the race column's attached tracked races. A 0.0 score is returned * if the competitor's result for race is discarded. */ - Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint) throws NoWindException; + Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint); /** * Tells whether the contribution of raceColumn is discarded in the current leaderboard's standings for @@ -481,6 +481,26 @@ public interface Leaderboard extends LeaderboardBase, HasRaceColumns { * leaderboard */ Distance getTotalDistanceTraveled(Competitor competitor, TimePoint timePoint); + + /** + * Computes the distance the competitor has been foiling in the tracked races in this leaderboard, starting + * to count in each race when the competitor passes the start line, aggregating up to timePoint or the + * end of the last race, whichever is first. + * + * @return null if the competitor hasn't foiled any distance in any tracked race in this + * leaderboard + */ + Distance getTotalDistanceFoiled(Competitor competitor, TimePoint timePoint); + + /** + * Computes the duration the competitor has foiled in the tracked races in this leaderboard, starting + * to count in each race when the competitor passes the start line, aggregating up to timePoint or the + * end of the last race, whichever is first. + * + * @return null if the competitor hasn't foiled at any time in any tracked race in this + * leaderboard + */ + Duration getTotalDurationFoiled(Competitor competitor, TimePoint timePoint); /** * Same as {@link #getNetPoints(Competitor, RaceColumn, TimePoint)}, only that for determining the discarded @@ -568,4 +588,10 @@ public interface Leaderboard extends LeaderboardBase, HasRaceColumns { BoatClass getBoatClass(); LeaderboardType getLeaderboardType(); + + /** + * Tells if there is at least one non-{@code null} score for the given {@code competitor} in the + * leaderboard. + */ + boolean hasScores(Competitor competitor, TimePoint timePoint); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardWithCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardWithCache.java index 490ba407f71..9ec0daca615 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardWithCache.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardWithCache.java @@ -19,6 +19,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.RunnableFuture; +import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; @@ -642,8 +643,12 @@ public abstract class AbstractLeaderboardWithCache implements Leaderboard { row.totalTimeSailedReachingInSeconds = totalTimeSailedReaching==null?null:totalTimeSailedReaching.asSeconds(); final Duration totalTimeSailed = this.getTotalTimeSailed(competitor, timePoint); row.totalTimeSailedInSeconds = totalTimeSailed==null?null:totalTimeSailed.asSeconds(); - final Distance totalDistanceTraveledInMeters = this.getTotalDistanceTraveled(competitor, timePoint); - row.totalDistanceTraveledInMeters = totalDistanceTraveledInMeters==null?null:totalDistanceTraveledInMeters.getMeters(); + final Distance totalDistanceTraveled = this.getTotalDistanceTraveled(competitor, timePoint); + row.totalDistanceTraveledInMeters = totalDistanceTraveled==null?null:totalDistanceTraveled.getMeters(); + final Distance totalDistanceFoiled = this.getTotalDistanceFoiled(competitor, timePoint); + row.totalDistanceFoiledInMeters = totalDistanceFoiled==null?null:totalDistanceFoiled.getMeters(); + final Duration totalDurationFoiled = this.getTotalDurationFoiled(competitor, timePoint); + row.totalDurationFoiledInSeconds = totalDurationFoiled==null?null:totalDurationFoiled.asSeconds(); } private LeaderboardDTOCache getLeaderboardDTOCache() { @@ -821,6 +826,12 @@ public abstract class AbstractLeaderboardWithCache implements Leaderboard { result.currentHeelInDegrees = heel == null ? null : heel.getDegrees(); Bearing pitch = trackedLeg.getPitch(timePoint); result.currentPitchInDegrees = pitch == null ? null : pitch.getDegrees(); + + Distance distanceFoiled = trackedLeg.getDistanceFoiled(timePoint); + result.currentDistanceFoiledInMeters = distanceFoiled == null ? null : distanceFoiled.getMeters(); + Duration durationFoiled = trackedLeg.getDurationFoiled(timePoint); + result.currentDurationFoiledInSeconds = durationFoiled == null ? null : durationFoiled.asSeconds(); + result.currentSpeedOverGroundInKnots = speedOverGroundInKnots == null ? null : speedOverGroundInKnots; Distance distanceTraveled = trackedLeg.getDistanceTraveled(timePoint); result.distanceTraveledInMeters = distanceTraveled == null ? null : distanceTraveled.getMeters(); @@ -858,7 +869,7 @@ public abstract class AbstractLeaderboardWithCache implements Leaderboard { if (trackedLeg.hasFinishedLeg(timePoint)) { velocityMadeGood = trackedLeg.getAverageVelocityMadeGood(timePoint); } else { - velocityMadeGood = trackedLeg.getVelocityMadeGood(timePoint, WindPositionMode.EXACT); + velocityMadeGood = trackedLeg.getVelocityMadeGood(timePoint, WindPositionMode.EXACT, cache); } result.velocityMadeGoodInKnots = velocityMadeGood == null ? null : velocityMadeGood.getKnots(); Distance windwardDistanceToGo = trackedLeg.getWindwardDistanceToGo(timePoint, WindPositionMode.LEG_MIDDLE); @@ -1082,18 +1093,37 @@ public abstract class AbstractLeaderboardWithCache implements Leaderboard { @Override public Distance getTotalDistanceTraveled(Competitor competitor, TimePoint timePoint) { - Distance result = null; + return getTotals(competitor, timePoint, Distance::add, TrackedRace::getDistanceTraveled); + } + + @Override + public Distance getTotalDistanceFoiled(Competitor competitor, TimePoint timePoint) { + return getTotals(competitor, timePoint, Distance::add, TrackedRace::getDistanceFoiled); + } + + @Override + public Duration getTotalDurationFoiled(Competitor competitor, TimePoint timePoint) { + return getTotals(competitor, timePoint, Duration::plus, TrackedRace::getDurationFoiled); + } + + @FunctionalInterface + private static interface ValueFromRaceGetter { + T get(TrackedRace trackedRace, Competitor competitor, TimePoint timePoint); + } + + private T getTotals(Competitor competitor, TimePoint timePoint, BiFunction adder, ValueFromRaceGetter valueGetter) { + T result = null; for (TrackedRace trackedRace : getTrackedRaces()) { TimePoint startOfRace; if (Util.contains(trackedRace.getRace().getCompetitors(), competitor) && (startOfRace=trackedRace.getStartOfRace()) != null && !startOfRace.after(timePoint)) { - Distance distanceSailedInRace = trackedRace.getDistanceTraveled(competitor, timePoint); + T distanceSailedInRace = valueGetter.get(trackedRace, competitor, timePoint); if (distanceSailedInRace != null) { if (result == null) { result = distanceSailedInRace; } else { - result = result.add(distanceSailedInRace); + result = adder.apply(result, distanceSailedInRace); } } else { // if competitor has not finished one single race in the whole @@ -1118,4 +1148,13 @@ public abstract class AbstractLeaderboardWithCache implements Leaderboard { } } + @Override + public boolean hasScores(Competitor competitor, TimePoint timePoint) { + for (final RaceColumn raceColumn : getRaceColumns()) { + if (getTotalPoints(competitor, raceColumn, timePoint) != null) { + return true; + } + } + return false; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java index 037eb50f3be..63649e7db1b 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java @@ -425,13 +425,13 @@ public abstract class AbstractSimpleLeaderboardImpl extends AbstractLeaderboardW } @Override - public Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) throws NoWindException { + public Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) { return getNetPoints(competitor, raceColumn, getRaceColumns(), timePoint); } @Override public Double getNetPoints(Competitor competitor, RaceColumn raceColumn, - Iterable raceColumnsToConsider, TimePoint timePoint) throws NoWindException { + Iterable raceColumnsToConsider, TimePoint timePoint) { final Set discardedRaceColumns = getResultDiscardingRule() .getDiscardedRaceColumns(competitor, this, raceColumnsToConsider, timePoint); return getNetPoints(competitor, raceColumn, timePoint, discardedRaceColumns); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java index 9684c992b6e..fdbfd864643 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/CompetitorProviderFromRaceColumnsAndRegattaLike.java @@ -181,9 +181,7 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { if (allCompetitorsCache == null) { final Set result = new HashSet<>(); final Set raceDefinitions = new HashSet<>(); - boolean hasRaceColumns = false; for (RaceColumn rc : provider.getRaceColumns()) { - hasRaceColumns = true; final Pair, Iterable> allCompetitorsInRaceColumnWithRaceDefinitionsConsidered = rc.getAllCompetitorsWithRaceDefinitionsConsidered(); Util.addAll(allCompetitorsInRaceColumnWithRaceDefinitionsConsidered.getB(), result); Util.addAll(allCompetitorsInRaceColumnWithRaceDefinitionsConsidered.getA(), raceDefinitions); @@ -192,12 +190,10 @@ public class CompetitorProviderFromRaceColumnsAndRegattaLike { } } final RegattaLog regattaLog = provider.getRegattaLike().getRegattaLog(); - if (!hasRaceColumns) { - // If no race exists, the regatta log-provided competitor registrations will not have - // been considered yet; add them: - final Set regattaLogProvidedCompetitors = new CompetitorsInLogAnalyzer<>(regattaLog).analyze(); - result.addAll(regattaLogProvidedCompetitors); - } + // If no race exists, the regatta log-provided competitor registrations will not have + // been considered yet; add them: + final Set regattaLogProvidedCompetitors = new CompetitorsInLogAnalyzer<>(regattaLog).analyze(); + result.addAll(regattaLogProvidedCompetitors); // else, don't add regatta log competitors because they have been added in each column already. // The competitors are collected from the races. Those, however, will be the regatta log // competitors if the race does not define its own. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/DelegatingRegattaLeaderboardWithCompetitorElimination.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/DelegatingRegattaLeaderboardWithCompetitorElimination.java index da4d65a6790..f4da263926c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/DelegatingRegattaLeaderboardWithCompetitorElimination.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/DelegatingRegattaLeaderboardWithCompetitorElimination.java @@ -280,7 +280,7 @@ public class DelegatingRegattaLeaderboardWithCompetitorElimination extends Abstr return getFullLeaderboard().getMaxPointsReason(competitor, race, timePoint); } - public Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint) throws NoWindException { + public Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint) { return getFullLeaderboard().getNetPoints(competitor, race, timePoint); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java index 293176a8147..1609478961c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/AbstractMetaLeaderboard.java @@ -171,9 +171,16 @@ public abstract class AbstractMetaLeaderboard extends AbstractSimpleLeaderboardI @Override public int getTrackedRank(Competitor competitor, RaceColumn race, TimePoint timePoint) { - final List competitorsFromBestToWorst = ((MetaLeaderboardColumn) race).getLeaderboard().getCompetitorsFromBestToWorst(timePoint); - Util.removeAll(getSuppressedCompetitors(), competitorsFromBestToWorst); - return competitorsFromBestToWorst.indexOf(competitor)+1; + final Leaderboard leaderboard = ((MetaLeaderboardColumn) race).getLeaderboard(); + final int result; + if (leaderboard.hasScores(competitor, timePoint)) { + final List competitorsFromBestToWorst = leaderboard.getCompetitorsFromBestToWorst(timePoint); + Util.removeAll(getSuppressedCompetitors(), competitorsFromBestToWorst); + result = competitorsFromBestToWorst.indexOf(competitor)+1; + } else { + result = 0; + } + return result; } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java index 1a16c789ebc..b921d9e345c 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/masterdataimport/TopLevelMasterData.java @@ -23,6 +23,7 @@ import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.configuration.DeviceConfiguration; import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaIdentifier; @@ -33,7 +34,6 @@ import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.racelog.tracking.SensorFixStore; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.Timed; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/GPSFixStoreImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/GPSFixStoreImpl.java index a6c443554be..c16c669fe70 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/GPSFixStoreImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/impl/GPSFixStoreImpl.java @@ -9,12 +9,12 @@ import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.Regatt import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMarkMappingFinder; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.racelog.tracking.SensorFixStore; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sailing.domain.racelogtracking.DeviceMappingWithRegattaLogEvent; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java index c91cf28897b..58a500bbcb1 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptyGPSFixStore.java @@ -6,10 +6,10 @@ import java.util.function.Consumer; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.common.tracking.GPSFixMoving; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptySensorFixStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptySensorFixStore.java index cfe56fca9bd..9601bc0022c 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptySensorFixStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/EmptySensorFixStore.java @@ -4,8 +4,8 @@ import java.util.Map; import java.util.function.BooleanSupplier; import java.util.function.Consumer; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/FixReceivedListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/FixReceivedListener.java index bebc25035ca..fdf017df4ef 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/FixReceivedListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/FixReceivedListener.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.racelog.tracking; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.Timed; /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java index 61c887340ab..b83eabef87f 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/GPSFixStore.java @@ -8,10 +8,10 @@ import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompeti import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMarkMappingEvent; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.common.tracking.GPSFixMoving; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.racelogtracking.DeviceMapping; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/SensorFixStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/SensorFixStore.java index c66ed7b0a4e..e3e348c7b1c 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/SensorFixStore.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/racelog/tracking/SensorFixStore.java @@ -4,9 +4,9 @@ import java.util.Map; import java.util.function.BooleanSupplier; import java.util.function.Consumer; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.common.tracking.GPSFix; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifier.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifier.java index 9df153ea47f..c8dac9b7bfe 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifier.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifier.java @@ -2,7 +2,7 @@ package com.sap.sailing.domain.trackfiles; import java.util.UUID; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifierImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifierImpl.java index befb425a903..b925ab5c7a5 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifierImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackfiles/TrackFileImportDeviceIdentifierImpl.java @@ -5,8 +5,8 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/DoubleVectorFixImporter.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/DoubleVectorFixImporter.java index 6d58d2a02fd..a4327cdb51b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/DoubleVectorFixImporter.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/DoubleVectorFixImporter.java @@ -6,7 +6,7 @@ import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorSensorDataMappingEvent; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sse.common.TimePoint; /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java index d014f682a50..b8174ec0729 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/trackimport/GPSFixImporter.java @@ -4,8 +4,8 @@ import java.io.IOException; import java.io.InputStream; import java.util.Map; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.tracking.GPSFix; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier; /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/BravoFixTrack.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/BravoFixTrack.java index d4d152e746b..78551932bfd 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/BravoFixTrack.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/BravoFixTrack.java @@ -2,12 +2,10 @@ package com.sap.sailing.domain.tracking; import java.io.Serializable; -import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.tracking.BravoExtendedFix; import com.sap.sailing.domain.common.tracking.BravoFix; -import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.WithID; @@ -73,7 +71,7 @@ public interface BravoFixTrack extends S /** * The distance sailed foiling during the time range provided */ - Distance getDistanceSpentFoiling(GPSFixTrack gpsFixTrack, TimePoint from, TimePoint to); + Distance getDistanceSpentFoiling(TimePoint from, TimePoint to); /** * Returns {@code true}, if the track contains {@link BravoExtendedFix} instances instead of simple {@link BravoFix BravoFixes}. @@ -88,4 +86,17 @@ public interface BravoFixTrack extends S Double getPortRudderRakeIfAvailable(TimePoint timePoint); Double getStbdRudderRakeIfAvailable(TimePoint timePoint); Bearing getMastRotationIfAvailable(TimePoint timePoint); + Bearing getLeewayIfAvailable(TimePoint timePoint); + Double getSetIfAvailable(TimePoint timePoint); + Bearing getDriftIfAvailable(TimePoint timePoint); + Distance getDepthIfAvailable(TimePoint timePoint); + Bearing getRudderIfAvailable(TimePoint timePoint); + Double getForestayLoadIfAvailable(TimePoint timePoint); + Double getForestayPressureIfAvailable(TimePoint timePoint); + Bearing getTackAngleIfAvailable(TimePoint timePoint); + Bearing getRakeIfAvailable(TimePoint timePoint); + Double getDeflectorPercentageIfAvailable(TimePoint timePoint); + Bearing getTargetHeelIfAvailable(TimePoint timePoint); + Distance getDeflectorIfAvailable(TimePoint timePoint); + Double getTargetBoatspeedPIfAvailable(TimePoint timePoint); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicSensorFixTrack.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicSensorFixTrack.java index e6dd60f720c..ef5e1fead22 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicSensorFixTrack.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicSensorFixTrack.java @@ -13,5 +13,9 @@ import com.sap.sse.common.WithID; */ public interface DynamicSensorFixTrack extends SensorFixTrack, DynamicTrack { - + /** + * Invoked when this track is added to a tracked race. The method is also invoked after de-serializing the + * containing {@link TrackedRace}. This default implementation does nothing. + */ + default void addedToTrackedRace(TrackedRace trackedRace) {} } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLegOfCompetitor.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLegOfCompetitor.java index 8dea47da6b0..d2827bc0de0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLegOfCompetitor.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedLegOfCompetitor.java @@ -211,7 +211,7 @@ public interface TrackedLegOfCompetitor extends Serializable { * Same as {@link #getVelocityMadeGood(TimePoint, WindPositionMode)}, only that a cache for wind data and leg type and bearing * is passed. */ - Speed getVelocityMadeGood(TimePoint at, WindPositionMode windPositionMode, WindLegTypeAndLegBearingCache cache); + SpeedWithBearing getVelocityMadeGood(TimePoint at, WindPositionMode windPositionMode, WindLegTypeAndLegBearingCache cache); /** @@ -241,6 +241,11 @@ public interface TrackedLegOfCompetitor extends Serializable { Bearing getHeel(TimePoint at); Bearing getPitch(TimePoint at); + + Distance getDistanceFoiled(TimePoint at); + + Duration getDurationFoiled(TimePoint at); + /** * Computes the distance along the wind track to the wind-projected position of the race's overall leader. If leader * and competitor are in the same leg, this is simply the windward distance. If the leader is already one or more @@ -261,7 +266,6 @@ public interface TrackedLegOfCompetitor extends Serializable { /** * Same as {@link #getWindwardDistanceToCompetitorFarthestAhead(TimePoint, WindPositionMode, RankingInfo)}, only that a cache for leg type * calculation is passed. - * @param rankingInfo TODO */ Distance getWindwardDistanceToCompetitorFarthestAhead(TimePoint timePoint, WindPositionMode windPositionMode, RankingInfo rankingInfo, WindLegTypeAndLegBearingCache cache); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 62ca768397f..cd2cddedfcc 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -46,6 +46,7 @@ import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.common.tracking.SensorFix; +import com.sap.sailing.domain.leaderboard.caching.LeaderboardDTOCalculationReuseCache; import com.sap.sailing.domain.markpassingcalculation.MarkPassingCalculator; import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException; import com.sap.sailing.domain.polars.PolarDataService; @@ -611,7 +612,7 @@ public interface TrackedRace extends Serializable, IsManagedByCachenull if there are no mark passings for the competitor in this race * or if the competitor has not finished one of the legs in the race. @@ -623,6 +624,18 @@ public interface TrackedRace extends Serializable, IsManagedByCachenull if there are no mark passings for the competitor in this race + * or if the competitor has not finished one of the legs in the race. + */ + Distance getDistanceFoiled(Competitor competitor, TimePoint timePoint); + + /** + * @return null if there are no mark passings for the competitor in this race + * or if the competitor has not finished one of the legs in the race. + */ + Duration getDurationFoiled(Competitor competitor, TimePoint timePoint); + /** * See {@link TrackedLegOfCompetitor#getWindwardDistanceToCompetitorFarthestAhead(TimePoint, WindPositionMode, RankingInfo)} */ @@ -1021,4 +1034,42 @@ public interface TrackedRace extends Serializable, IsManagedByCache extends S private static final long serialVersionUID = 460944392510182976L; private final boolean hasExtendedFixes; + + private transient TimeRangeCache foilingTimeCache; + + private transient TimeRangeCache foilingDistanceCache; + + private transient TimeRangeCache averageRideHeightCache; + + /** + * If a GPS track was provided at construction time, remember it non-transiently. It is needed when restoring + * the object after de-serialization, so the cache invalidation listener can be re-established. + */ + private transient GPSFixTrack gpsTrack; + + private class CacheInvalidationGpsTrackListener implements GPSTrackListener { + private static final long serialVersionUID = 6395529765232404414L; + @Override + public boolean isTransient() { + return true; + } + + @Override + public void gpsFixReceived(GPSFixMoving fix, ItemType item, boolean firstFixInTrack) { + assert item == getTrackedItem(); + foilingDistanceCache.invalidateAllAtOrLaterThan(fix.getTimePoint()); + } + + @Override + public void speedAveragingChanged(long oldMillisecondsOverWhichToAverage, + long newMillisecondsOverWhichToAverage) { + } + } /** * @param trackedItem @@ -40,8 +73,69 @@ public class BravoFixTrackImpl extends S * the name of the track by which it can be obtained from the {@link TrackedRace}. */ public BravoFixTrackImpl(ItemType trackedItem, String trackName, boolean hasExtendedFixes) { + this(trackedItem, trackName, hasExtendedFixes, /* listen to GPS track for distance cache invalidation */ null); + } + + /** + * @param gpsTrack + * if not {@code null}, this track will listen on that track for changes in order to invalidate this + * track's caches; for example, if a GPS fix is added, this track may need to invalidate its + * {@link #foilingDistanceCache} accordingly because the distance traveled between the fixes may have + * changed. + */ + public BravoFixTrackImpl(ItemType trackedItem, String trackName, boolean hasExtendedFixes, GPSFixTrack gpsTrack) { super(trackedItem, trackName, BravoFixTrack.TRACK_NAME + " for " + trackedItem); this.hasExtendedFixes = hasExtendedFixes; + this.foilingTimeCache = createFoilingTimeCache(trackedItem); + this.foilingDistanceCache = createFoilingDistanceCache(trackedItem); + this.averageRideHeightCache = createAverageRideHeightCache(trackedItem); + setGpsTrack(gpsTrack); + } + + public GPSFixTrack getGpsTrack() { + return gpsTrack; + } + + /** + * Sets the {@link #gpsTrack} field and registers a cache invalidation listener + * on the {@code gpsTrack} to ensure that the foiling distance is invalidated if needed.

+ * + * Must be called only once for a non-{@code null} {@code gpsTrack}. + */ + protected void setGpsTrack(GPSFixTrack gpsTrack) { + if (gpsTrack != null) { + assert this.gpsTrack == null; + } + this.gpsTrack = gpsTrack; + if (gpsTrack != null) { + gpsTrack.addListener(new CacheInvalidationGpsTrackListener()); + } + } + + private TimeRangeCache createAverageRideHeightCache(ItemType trackedItem) { + return createTimeRangeCache(trackedItem, "averageRideHeightCache"); + } + + private TimeRangeCache createTimeRangeCache(ItemType trackedItem, final String cacheName) { + return new TimeRangeCache<>(cacheName+" for "+trackedItem); + } + + private TimeRangeCache createFoilingDistanceCache(ItemType trackedItem) { + return createTimeRangeCache(trackedItem, "foilingDistanceCache"); + } + + private TimeRangeCache createFoilingTimeCache(ItemType trackedItem) { + return createTimeRangeCache(trackedItem, "foilingTimeCache"); + } + + /** + * After reading this object from an {@link ObjectInputStream}, initialize the caches properly. + */ + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { + ois.defaultReadObject(); + this.foilingTimeCache = createFoilingTimeCache(getTrackedItem()); + this.foilingDistanceCache = createFoilingDistanceCache(getTrackedItem()); + this.averageRideHeightCache = createAverageRideHeightCache(getTrackedItem()); } @Override @@ -53,13 +147,13 @@ public class BravoFixTrackImpl extends S @Override public Bearing getHeel(TimePoint timePoint) { return getValueFromExtendedFixSkippingNullValues(timePoint, BravoFix::getHeel, - ScalableBearing::new); + NaivelyScalableBearing::new); } @Override public Bearing getPitch(TimePoint timePoint) { return getValueFromExtendedFixSkippingNullValues(timePoint, BravoFix::getPitch, - ScalableBearing::new); + NaivelyScalableBearing::new); } @Override @@ -68,26 +162,43 @@ public class BravoFixTrackImpl extends S return rideHeight != null && rideHeight.compareTo(BravoFix.MIN_FOILING_HEIGHT_THRESHOLD) >= 0; } + + @Override + public boolean add(BravoFix fix, boolean replace) { + final boolean added = super.add(fix, replace); + if (added) { + final TimePoint fixTimePoint = fix.getTimePoint(); + averageRideHeightCache.invalidateAllAtOrLaterThan(fixTimePoint); + foilingDistanceCache.invalidateAllAtOrLaterThan(fixTimePoint); + foilingTimeCache.invalidateAllAtOrLaterThan(fixTimePoint); + } + return added; + } + @Override public Distance getAverageRideHeight(TimePoint from, TimePoint to) { - final Distance result; - lockForRead(); - try { - Distance sum = Distance.NULL; - int count = 0; - for (final BravoFix fix : getFixes(from, true, to, true)) { - sum = sum.add(fix.getRideHeight()); - count++; + return getValueSum(from, to, /* nullElement */ Distance.NULL, Distance::add, averageRideHeightCache, + /* valueCalculator */ new Track.TimeRangeValueCalculator() { + @Override + public Distance calculate(TimePoint from, TimePoint to) { + Distance result; + Distance sum = Distance.NULL; + int count = 0; + for (final BravoFix fix : getFixes(from, true, to, true)) { + final Distance rideHeight = fix.getRideHeight(); + if (rideHeight != null) { + sum = sum.add(rideHeight); + count++; + } + } + if (count > 0) { + result = sum.scale(1./count); + } else { + result = null; + } + return result; } - if (count > 0) { - result = sum.scale(1./count); - } else { - result = null; - } - } finally { - unlockAfterRead(); - } - return result; + }); } private boolean isFoiling(BravoFix fix) { @@ -96,44 +207,47 @@ public class BravoFixTrackImpl extends S @Override public Duration getTimeSpentFoiling(TimePoint from, TimePoint to) { - Duration result = Duration.NULL; - lockForRead(); - try { - TimePoint last = from; - boolean isFoiling = false; - for (final BravoFix fix : getFixes(from, true, to, true)) { - final boolean fixFoils = isFoiling(fix); - if (isFoiling && fixFoils) { - result = result.plus(last.until(fix.getTimePoint())); + return getValueSum(from, to, /* nullElement */ Duration.NULL, Duration::plus, foilingTimeCache, + /* valueCalculator */ new Track.TimeRangeValueCalculator() { + @Override + public Duration calculate(TimePoint from, TimePoint to) { + Duration result = Duration.NULL; + TimePoint last = from; + boolean isFoiling = false; + for (final BravoFix fix : getFixes(from, true, to, true)) { + final boolean fixFoils = isFoiling(fix); + if (isFoiling && fixFoils) { + result = result.plus(last.until(fix.getTimePoint())); + } + last = fix.getTimePoint(); + isFoiling = fixFoils; } - last = fix.getTimePoint(); - isFoiling = fixFoils; + return result; } - } finally { - unlockAfterRead(); - } - return result; + }); } @Override - public Distance getDistanceSpentFoiling(GPSFixTrack gpsFixTrack, TimePoint from, TimePoint to) { - Distance result = Distance.NULL; - lockForRead(); - try { - TimePoint last = from; - boolean isFoiling = false; - for (final BravoFix fix : getFixes(from, true, to, true)) { - final boolean fixFoils = isFoiling(fix); - if (isFoiling && fixFoils) { - result = result.add(gpsFixTrack.getDistanceTraveled(last, fix.getTimePoint())); + public Distance getDistanceSpentFoiling(TimePoint from, TimePoint to) { + return getGpsTrack() == null ? null : + getValueSum(from, to, /* nullElement */ Distance.NULL, Distance::add, foilingDistanceCache, + /* valueCalculator */ new Track.TimeRangeValueCalculator() { + @Override + public Distance calculate(TimePoint from, TimePoint to) { + Distance result = Distance.NULL; + TimePoint last = from; + boolean isFoiling = false; + for (final BravoFix fix : getFixes(from, true, to, true)) { + final boolean fixFoils = isFoiling(fix); + if (isFoiling && fixFoils) { + result = result.add(getGpsTrack().getDistanceTraveled(last, fix.getTimePoint())); + } + last = fix.getTimePoint(); + isFoiling = fixFoils; } - last = fix.getTimePoint(); - isFoiling = fixFoils; + return result; } - } finally { - unlockAfterRead(); - } - return result; + }); } @Override @@ -212,6 +326,84 @@ public class BravoFixTrackImpl extends S NaivelyScalableBearing::new); } + @Override + public Bearing getLeewayIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getLeeway, + NaivelyScalableBearing::new); + } + + @Override + public Double getSetIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getSet, + ScalableDouble::new); + } + + @Override + public Bearing getDriftIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getDrift, + NaivelyScalableBearing::new); + } + + @Override + public Distance getDepthIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getDepth, + ScalableDistance::new); + } + + @Override + public Bearing getRudderIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getRudder, + NaivelyScalableBearing::new); + } + + @Override + public Double getForestayLoadIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getForestayLoad, + ScalableDouble::new); + } + + @Override + public Double getForestayPressureIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getForestayPressure, + ScalableDouble::new); + } + + @Override + public Bearing getTackAngleIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getTackAngle, + NaivelyScalableBearing::new); + } + + @Override + public Bearing getRakeIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getRake, + NaivelyScalableBearing::new); + } + + @Override + public Double getDeflectorPercentageIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getDeflectorPercentage, + ScalableDouble::new); + } + + @Override + public Bearing getTargetHeelIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getTargetHeel, + NaivelyScalableBearing::new); + } + + @Override + public Distance getDeflectorIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getDeflector, + ScalableDistance::new); + } + + @Override + public Double getTargetBoatspeedPIfAvailable(TimePoint timePoint) { + return getValueFromExtendedFixSkippingNullValues(timePoint, BravoExtendedFix::getTargetBoatspeedP, + ScalableDouble::new); + } + private static class NaivelyScalableBearing implements ScalableValue { private final double deg; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CompetitorBravoFixTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CompetitorBravoFixTrackImpl.java new file mode 100755 index 00000000000..261e1393c4e --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CompetitorBravoFixTrackImpl.java @@ -0,0 +1,26 @@ +package com.sap.sailing.domain.tracking.impl; + +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.common.tracking.GPSFixMoving; +import com.sap.sailing.domain.tracking.GPSFixTrack; +import com.sap.sailing.domain.tracking.TrackedRace; + +public class CompetitorBravoFixTrackImpl extends BravoFixTrackImpl { + private static final long serialVersionUID = 569731925060211875L; + + public CompetitorBravoFixTrackImpl(Competitor trackedItem, String trackName, boolean hasExtendedFixes, + GPSFixTrack gpsTrack) { + super(trackedItem, trackName, hasExtendedFixes, gpsTrack); + } + + public CompetitorBravoFixTrackImpl(Competitor trackedItem, String trackName, boolean hasExtendedFixes) { + super(trackedItem, trackName, hasExtendedFixes); + } + + @Override + public void addedToTrackedRace(TrackedRace trackedRace) { + if (this.getGpsTrack() == null) { + this.setGpsTrack(trackedRace.getTrack(getTrackedItem())); + } + } +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DistanceCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DistanceCache.java deleted file mode 100755 index e6e7d847632..00000000000 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DistanceCache.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.sap.sailing.domain.tracking.impl; - -import java.util.Comparator; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map.Entry; -import java.util.NavigableSet; - -import com.sap.sailing.domain.common.Distance; -import com.sap.sailing.domain.common.tracking.GPSFix; -import com.sap.sse.common.TimePoint; -import com.sap.sse.common.Util; -import com.sap.sse.common.Util.Pair; -import com.sap.sse.concurrent.LockUtil; -import com.sap.sse.concurrent.NamedReentrantReadWriteLock; -import com.sap.sse.util.impl.ArrayListNavigableSet; - -/** - * Computing {@link #getDistanceTraveled(TimePoint, TimePoint)} is more expensive the longer the track is and the - * higher the tracking frequency. It is called regularly, usually for the same start time. Keeping to re-evaluate - * all distances between all GPS fixes, even if they remain constant, is a waste of resources, particularly when we - * assume that usually GPS fixes are appended to a track and not usually randomly inserted, even though this can - * happen. - *

- * - * This cache looks "backwards." It contains pairs whose first component represents a to parameter used - * in {@link #getDistanceTraveled(TimePoint, TimePoint)}. It is ordered by this component. The second component is a - * navigable, ordered set of pairs where the first pair component represents a from parameter used in - * {@link #getDistanceTraveled(TimePoint, TimePoint)} and the second pair component represents the result of - * {@link #getDistanceTraveled(TimePoint, TimePoint)} for this parameter combination. Note that the cache does only - * store distances for from time points actually passed to - * {@link #getDistanceTraveled(TimePoint, TimePoint)} and does not cache all interim combinations collected while - * computing a result. As such, it differs from a typical "dynamic programming" algorithm which would store all - * in-between values too. Assuming that from values are sparse (leg start, race start, ...), there - * doesn't seem to be much use in storing all the other in-between values too. - *

- * - * For implementation efficiency in combination with using a {@link ArrayListNavigableSet} for the values and in - * order to be able to efficiently extend a cache entry for a single to fix, the navigable sets - * containing the from fixes and distances are ordered such that earlier fixes come later in the set. - * This way, extending the cache entry for a to fix to an earlier from fix only requires - * appending to the set. - *

- * - * Invalidation: When a new fix is added to this track, all distance cache entries for fixes at or later than - * the new fix's time point are removed from this cache. Additionally, the fix insertion may have an impact on the - * {@link #getEarlierFixesWhoseValidityMayBeAffected(GPSFix) previous fix's} validity (track smoothing) and - * therefore on its selection for distance aggregation. Therefore, if fix addition turned the previous fix invalid, - * the cache entries for the time points at or after the previous fix also need to be removed. - *

- * - * Cache use: When {@link #getDistanceTraveled(TimePoint, TimePoint)} is called, it first looks for a cache - * entry for the to parameter. If one is found, the earliest entry in the navigable set for the - * navigable set of from and distance values that is at or after the requested from time - * point is determined. If such an entry exists, the distance is remembered and the algorithm is repeated - * recursively, using the from value found in the cache as the new to value, and the - * from value originally passed to {@link #getDistanceTraveled(TimePoint, TimePoint)} as - * from again. If no entry is found in the cache entry for to that is at or after the - * requested from time, the distance is computed by iterating the smoothened fixes. - *

- * - * If a cache entry for to is not found, the latest cache entry before it is looked up. If one is - * found, the distance between the to time point requested and the to time point found in - * the cache is computed by iterating the smoothened fixes for this interval. If none is found, the distance is - * computed by iterating backwards all the way to from. - *

- * - * Once the {@link #getDistanceTraveled(TimePoint, TimePoint)} has computed its value, it adds the result to the - * cache. - * - * @author Axel Uhl (D043530) - */ -public class DistanceCache { - public static final int MAX_SIZE = 100; - - private final NavigableSet>>> distanceCache; - - /** - * The cache is to have limited size. Eviction shall happen based on a least-recently-used strategy. Usage is - * defined as having been returned by {@link #getEarliestFromAndDistanceAtOrAfterFrom(TimePoint, TimePoint)} or - * having been added by {@link #cache(TimePoint, TimePoint, Distance)}. - *

- * - * When an eldest entry is asked to be expunged from this map and the map has more than {@link #MAX_SIZE} elements, - * the expunging will be admitted, and the entry is removed from the {@link #distanceCache} core structure. Reading - * and writing this structure must happen under the {@link #lock write lock} because also reading the linked hash - * map that counts access as "use" has a modifying effect on its internal structures. - *

- * - * The key pairs are from/to pairs. Note that this is in some sense "the opposite direction" compared to the - * alignment of the {@link #distanceCache} structure which has as its outer keys the "to" time point.

- * - * Read access is to be synchronized using this field's mutex; write access only happens under the - * {@link #lock write lock} and therefore will have no contenders. - */ - private final LinkedHashMap, Void> lruCache; - - private final NamedReentrantReadWriteLock lock; - - private static final Comparator> timePointInPairComparator = new Comparator>() { - @Override - public int compare(Util.Pair o1, Util.Pair o2) { - return o1.getA().compareTo(o2.getA()); - } - }; - - public DistanceCache(String nameForLockLogging) { - lock = new NamedReentrantReadWriteLock("lock for DistanceCache for "+nameForLockLogging, /* fair */ true); - this.distanceCache = new ArrayListNavigableSet>>>(timePointInPairComparator); - this.lruCache = new LinkedHashMap, Void>(/* initial capacity */ 10, /* load factor */ 0.75f, - /* access-based ordering */ true) { - private static final long serialVersionUID = -6568235517111733193L; - - @Override - protected boolean removeEldestEntry(Entry, Void> eldest) { - final boolean expunge = size() > MAX_SIZE; - if (expunge) { - removeCacheEntry(eldest.getKey().getA(), eldest.getKey().getB()); - } - return expunge; - } - }; - } - - public int size() { - return lruCache.size(); - } - - private void removeCacheEntry(TimePoint from, TimePoint to) { - assert lock.getWriteHoldCount() == 1; // we can be sure we are alone here; this only happens when adding a new entry, holding the write lock - Util.Pair>> entryForTo = distanceCache.floor(createDummy(to)); - if (entryForTo.getA().equals(to)) { - Pair entryForFrom = entryForTo.getB().ceiling(new Util.Pair(from, null)); - if (entryForFrom.getA().equals(from)) { - entryForTo.getB().remove(entryForFrom); - if (entryForTo.getB().isEmpty()) { - distanceCache.remove(entryForTo); - } - } - } - } - - /** - * Looks up the entry closest to but no later than to. If not found, null is returned. If - * found, the earliest pair of from/distance that is at or after from will be returned, together with - * the to value of the entry. If there is no entry that is at or after from, - * null is returned. - */ - public Util.Pair> getEarliestFromAndDistanceAtOrAfterFrom(TimePoint from, TimePoint to) { - LockUtil.lockForRead(lock); - try { - Util.Pair> result = null; - Util.Pair>> entryForTo = distanceCache.floor(createDummy(to)); - if (entryForTo != null) { - final Util.Pair fromCeiling = entryForTo.getB().ceiling(new Util.Pair(from, null)); - if (fromCeiling != null) { - result = new Util.Pair>(entryForTo.getA(), fromCeiling); - } - } - // no writer can be active because we're holding the read lock; read access on the lruCache is synchronized using - // the lruCache's mutex; this is necessary because we're using access-based LRU pinging where even getting an entry - // modifies the internal parts of the data structure which is not thread safe. - synchronized (lruCache) { - lruCache.get(new Util.Pair(from, to)); - } - return result; - } finally { - LockUtil.unlockAfterRead(lock); - } - } - - /** - * Removes all cache entries that have a to time point that is at or after timePoint. - */ - public void invalidateAllAtOrLaterThan(TimePoint timePoint) { - LockUtil.lockForWrite(lock); - try { - Util.Pair>> dummy = createDummy(timePoint); - NavigableSet>>> toRemove = distanceCache.tailSet(dummy, /* inclusive */ true); - for (Iterator>>> i=toRemove.iterator(); i.hasNext(); ) { - Util.Pair>> entryToRemove = i.next(); - assert entryToRemove.getA().compareTo(timePoint) >= 0; - for (Pair fromAndDistance : entryToRemove.getB()) { - lruCache.remove(new Util.Pair<>(fromAndDistance.getA(), entryToRemove.getA())); - } - i.remove(); - } - } finally { - LockUtil.unlockAfterWrite(lock); - } - } - - private NavigableSet> getEntryForTo(TimePoint to) { - NavigableSet> result = null; - Util.Pair>> dummyForTo = createDummy(to); - Util.Pair>> entryForTo = distanceCache.floor(dummyForTo); - if (entryForTo != null && entryForTo.getA().equals(to)) { - result = entryForTo.getB(); - } - return result; - } - - public void cache(TimePoint from, TimePoint to, Distance distance) { - LockUtil.lockForWrite(lock); - try { - NavigableSet> entryForTo = getEntryForTo(to); - if (entryForTo == null) { - entryForTo = new ArrayListNavigableSet>(timePointInPairComparator); - Util.Pair>> pairForTo = new Util.Pair>>( - to, entryForTo); - distanceCache.add(pairForTo); - } - entryForTo.add(new Util.Pair(from, distance)); - lruCache.put(new Util.Pair(from, to), null); - } finally { - LockUtil.unlockAfterWrite(lock); - } - } - - private Util.Pair>> createDummy(TimePoint to) { - return new Util.Pair>>(to, null); - } - - /** - * Removes all contents from this cache - */ - public void clear() { - LockUtil.lockForWrite(lock); - try { - distanceCache.clear(); - lruCache.clear(); - } finally { - LockUtil.unlockAfterWrite(lock); - } - - } -} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 66312ec0b68..1639d123330 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -13,6 +13,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.NavigableSet; +import java.util.Optional; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; @@ -609,7 +610,7 @@ DynamicTrackedRace, GPSTrackListener { notifyListeners(listener -> listener.markPassingReceived(competitor, oldMarkPassings, markPassings)); } - private void notifyListeners(DynamicSensorFixTrack track) { + private void notifyListenersAboutSensorTrackAdded(DynamicSensorFixTrack track) { notifyListeners(listener -> listener.competitorSensorTrackAdded(track)); } @@ -1206,7 +1207,7 @@ DynamicTrackedRace, GPSTrackListener { } @Override - protected void addSensorTrackInternal(Pair key, + protected Optional addSensorTrackInternal(Pair key, DynamicSensorFixTrack track) { super.addSensorTrackInternal(key, track); track.addListener(new SensorFixTrackListener() { @@ -1222,6 +1223,6 @@ DynamicTrackedRace, GPSTrackListener { notifyListeners(item, trackName, fix); } }); - notifyListeners(track); + return Optional.of(()->notifyListenersAboutSensorTrackAdded(track)); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java index 815eccfdbc4..b1b9077ef62 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/GPSFixTrackImpl.java @@ -38,6 +38,7 @@ import com.sap.sailing.domain.common.tracking.WithValidityCache; import com.sap.sailing.domain.common.tracking.impl.CompactPositionHelper; import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.GPSTrackListener; +import com.sap.sailing.domain.tracking.Track; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; @@ -116,7 +117,7 @@ public abstract class GPSFixTrackImpl extends * Once the {@link #getDistanceTraveled(TimePoint, TimePoint)} has computed its value, it adds the result to the * cache. */ - private transient DistanceCache distanceCache; + private transient TimeRangeCache distanceCache; private transient MaxSpeedCache maxSpeedCache; @@ -155,7 +156,7 @@ public abstract class GPSFixTrackImpl extends this.millisecondsOverWhichToAverage = millisecondsOverWhichToAverage; this.maxSpeedForSmoothing = maxSpeedForSmoothening; this.listeners = new TrackListenerCollection>(); - this.distanceCache = new DistanceCache(trackedItem==null?"null":trackedItem.toString()); + this.distanceCache = new TimeRangeCache<>(trackedItem==null?"null":trackedItem.toString()); this.maxSpeedCache = createMaxSpeedCache(); this.validityCachingSuspended = false; this.losslessCompaction = losslessCompaction; @@ -190,7 +191,7 @@ public abstract class GPSFixTrackImpl extends private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); - distanceCache = new DistanceCache(getTrackedItem().toString()); + distanceCache = new TimeRangeCache<>(getTrackedItem().toString()); maxSpeedCache = createMaxSpeedCache(); } @@ -506,76 +507,33 @@ public abstract class GPSFixTrackImpl extends @Override public Distance getDistanceTraveled(TimePoint from, TimePoint to) { - return getDistanceTraveledRecursively(from, to, 0); - } - - private Distance getDistanceTraveledRecursively(TimePoint from, TimePoint to, int recursionDepth) { - Distance result; - if (!from.before(to)) { - result = Distance.NULL; - } else { - boolean perfectCacheHit = false; - lockForRead(); - try { - Util.Pair> bestCacheEntry = getDistanceCache() - .getEarliestFromAndDistanceAtOrAfterFrom(from, to); - if (bestCacheEntry != null) { - perfectCacheHit = true; // potentially a cache hit; but if it doesn't span the full interval, it's not perfect; see below - // compute the missing stretches between best cache entry's "from" and our "from" and the cache - // entry's "to" and our "to" - Distance distanceFromFromToBeginningOfCacheEntry = Distance.NULL; - Distance distanceFromEndOfCacheEntryToTo = Distance.NULL; - if (!bestCacheEntry.getB().getA().equals(from)) { - assert bestCacheEntry.getB().getA().after(from); - perfectCacheHit = false; - distanceFromFromToBeginningOfCacheEntry = getDistanceTraveledRecursively(from, bestCacheEntry - .getB().getA(), recursionDepth + 1); - } - if (!bestCacheEntry.getA().equals(to)) { - assert bestCacheEntry.getA().before(to); - perfectCacheHit = false; - distanceFromEndOfCacheEntryToTo = getDistanceTraveledRecursively(bestCacheEntry.getA(), to, - recursionDepth + 1); - } - result = distanceFromFromToBeginningOfCacheEntry.add(bestCacheEntry.getB().getB()).add( - distanceFromEndOfCacheEntryToTo); - } else { - double distanceInNauticalMiles = 0; - if (from.compareTo(to) < 0) { + return getValueSum(from, to, /* nullElement */ Distance.NULL, Distance::add, getDistanceCache(), + /* valueCalculator */ new Track.TimeRangeValueCalculator() { + @Override + public Distance calculate(TimePoint from, TimePoint to) { // getEstimatedPosition's current implementation returns a position equal to that of a fix at // "from" if there is one with exactly that time stamp + Distance distance = Distance.NULL; Position fromPos = getEstimatedPosition(from, /* extrapolate */false); - if (fromPos == null) { - result = Distance.NULL; - } else { + if (fromPos != null) { // TODO bug 4122: idea: use the subset to determine fromPos and toPos in one go, eliminating two expensive getEstimatedPosition calls NavigableSet subset = getGPSFixes().subSet(new DummyGPSFix(from), /* fromInclusive */false, new DummyGPSFix(to), /* toInclusive */false); for (GPSFix fix : subset) { - double distanceBetweenAdjacentFixesInNauticalMiles = fromPos.getDistance( - fix.getPosition()).getNauticalMiles(); - distanceInNauticalMiles += distanceBetweenAdjacentFixesInNauticalMiles; + Distance distanceBetweenAdjacentFixes = fromPos.getDistance( + fix.getPosition()); + distance = distance.add(distanceBetweenAdjacentFixes); fromPos = fix.getPosition(); } Position toPos = getEstimatedPosition(to, false); - distanceInNauticalMiles += fromPos.getDistance(toPos).getNauticalMiles(); - result = new NauticalMileDistance(distanceInNauticalMiles); + distance = distance.add(fromPos.getDistance(toPos)); } - } else { - result = Distance.NULL; + return distance; } - } - } finally { - unlockAfterRead(); - } - if (!perfectCacheHit && recursionDepth == 0) { - getDistanceCache().cache(from, to, result); - } - } - return result; + }); } - + @Override public Distance getRawDistanceTraveled(TimePoint from, TimePoint to) { lockForRead(); @@ -1065,7 +1023,7 @@ public abstract class GPSFixTrackImpl extends } } - protected DistanceCache getDistanceCache() { + protected TimeRangeCache getDistanceCache() { return distanceCache; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java index b5172980ecb..6bcbaf8e926 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegImpl.java @@ -44,7 +44,6 @@ import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; -import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingCache; import com.sap.sailing.domain.tracking.WindPositionMode; @@ -98,7 +97,7 @@ public class TrackedLegImpl implements TrackedLeg { } @Override - public TrackedRace getTrackedRace() { + public TrackedRaceImpl getTrackedRace() { return trackedRace; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java index c55005f065d..f2e94464680 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java @@ -29,7 +29,6 @@ import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; -import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingCache; import com.sap.sailing.domain.tracking.WindPositionMode; import com.sap.sse.common.Duration; @@ -68,7 +67,7 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor { return trackedLeg.getLeg(); } - private TrackedRace getTrackedRace() { + private TrackedRaceImpl getTrackedRace() { return getTrackedLeg().getTrackedRace(); } @@ -268,29 +267,28 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor { /** * Projects speed onto the wind direction for upwind/downwind legs to see how fast a boat travels - * "along the wind's direction." For reaching legs (neither upwind nor downwind), the speed is projected onto - * the leg's direction. - * @param windPositionMode see {@link #getWind(Position, TimePoint, Set)} + * "along the wind's direction." For reaching legs (neither upwind nor downwind), the speed is projected onto the + * leg's direction. * - * @throws NoWindException in case the wind direction is not known + * @param speed + * if {@code null} then {@code null} will be returned + * @param windPositionMode + * see {@link #getWind(Position, TimePoint, Set)} + * + * @throws NoWindException + * in case the wind direction is not known */ private SpeedWithBearing getWindwardSpeed(SpeedWithBearing speed, final TimePoint at, WindPositionMode windPositionMode, WindLegTypeAndLegBearingCache cache) { - SpeedWithBearing result = null; + final SpeedWithBearing result; if (speed != null) { Bearing projectToBearing; try { if (cache.getLegType(getTrackedLeg(), at) != LegType.REACHING) { - final Wind wind; - if (windPositionMode == WindPositionMode.EXACT) { - wind = cache.getWind(getTrackedRace(), getCompetitor(), at); - } else { - wind = getTrackedRace().getWind( - getTrackedLeg().getEffectiveWindPosition( - () -> getTrackedRace().getTrack(getCompetitor()) - .getEstimatedPosition(at, false), at, windPositionMode), at); - } + final Wind wind = getTrackedRace().getWind(windPositionMode, getTrackedLeg(), getCompetitor(), at, cache); if (wind == null) { + // This is not really likely to happen because wind==null would have let the call + // to cache.getLegType(...) fail with a NoWindException throw new NoWindException("Need at least wind direction to determine windward speed"); } projectToBearing = wind.getBearing(); @@ -307,7 +305,11 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor { projectToBearing = projectToBearing.reverse(); } result = new KnotSpeedWithBearingImpl(Math.abs(speed.getKnots() * cos), projectToBearing); + } else { + result = null; } + } else { + result = null; } return result; } @@ -645,7 +647,7 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor { } @Override - public Speed getVelocityMadeGood(TimePoint at, WindPositionMode windPositionMode, WindLegTypeAndLegBearingCache cache) { + public SpeedWithBearing getVelocityMadeGood(TimePoint at, WindPositionMode windPositionMode, WindLegTypeAndLegBearingCache cache) { if (hasStartedLeg(at)) { TimePoint timePoint; if (hasFinishedLeg(at)) { @@ -709,7 +711,7 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor { public Distance getRideHeight(TimePoint at) { final Distance result; if (hasStartedLeg(at)) { - TimePoint timePoint =hasFinishedLeg(at) ? getMarkPassingForLegEnd().getTimePoint() : at; + TimePoint timePoint = hasFinishedLeg(at) ? getMarkPassingForLegEnd().getTimePoint() : at; BravoFixTrack track = getTrackedRace() .> getSensorTrack(competitor, BravoFixTrack.TRACK_NAME); result = track == null ? null : track.getRideHeight(timePoint); @@ -719,6 +721,37 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor { return result; } + @Override + public Distance getDistanceFoiled(TimePoint at) { + final Distance result; + if (hasStartedLeg(at)) { + TimePoint timePoint = hasFinishedLeg(at) ? getMarkPassingForLegEnd().getTimePoint() : at; + BravoFixTrack track = getTrackedRace() + .> getSensorTrack(competitor, BravoFixTrack.TRACK_NAME); + result = track == null ? null + : track.getDistanceSpentFoiling(getMarkPassingForLegStart().getTimePoint(), + timePoint); + } else { + result = null; + } + return result; + } + + @Override + public Duration getDurationFoiled(TimePoint at) { + final Duration result; + if (hasStartedLeg(at)) { + TimePoint timePoint = hasFinishedLeg(at) ? getMarkPassingForLegEnd().getTimePoint() : at; + BravoFixTrack track = getTrackedRace() + .> getSensorTrack(competitor, BravoFixTrack.TRACK_NAME); + result = track == null ? null + : track.getTimeSpentFoiling(getMarkPassingForLegStart().getTimePoint(), timePoint); + } else { + result = null; + } + return result; + } + @Override public Duration getEstimatedTimeToNextMark(TimePoint timePoint, WindPositionMode windPositionMode) { return getEstimatedTimeToNextMark(timePoint, windPositionMode, new LeaderboardDTOCalculationReuseCache(timePoint)); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 0bae7f6f6e9..7df4f68bd5a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.NavigableSet; +import java.util.Optional; import java.util.Set; import java.util.Timer; import java.util.TimerTask; @@ -124,7 +125,6 @@ import com.sap.sailing.domain.ranking.RankingMetric.RankingInfo; import com.sap.sailing.domain.ranking.RankingMetricConstructor; import com.sap.sailing.domain.tracking.BravoFixTrack; import com.sap.sailing.domain.tracking.DynamicSensorFixTrack; -import com.sap.sailing.domain.tracking.DynamicTrack; import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.GPSTrackListener; import com.sap.sailing.domain.tracking.LineDetails; @@ -303,11 +303,11 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl private final ConcurrentMap> markTracks; /** - * Mapping of {@link Competitor} to generic {@link DynamicTrack} implementation. Because the same competitor could + * Mapping of {@link Competitor} to generic {@link DynamicSensorFixTrack} implementation. Because the same competitor could * be mapped to several different tracks, a combined key of competitor object and track name identifier string is * used. This identifier is usually defined within the track interface (e.g. see {@link BravoFixTrack#TRACK_NAME}). */ - private final Map, DynamicTrack> sensorTracks; + private final Map, DynamicSensorFixTrack> sensorTracks; private final Map courseSidelines; @@ -635,6 +635,9 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException { ois.defaultReadObject(); getRace().getCourse().addCourseListener(this); + for (DynamicSensorFixTrack sensorTrack : sensorTracks.values()) { + sensorTrack.addedToTrackedRace(this); + } raceStates = new WeakHashMap<>(); attachedRaceLogs = new ConcurrentHashMap<>(); attachedRegattaLogs = new ConcurrentHashMap<>(); @@ -1212,7 +1215,50 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl } private Distance getDistanceTraveled(Competitor competitor, TimePoint timePoint, boolean considerGateStart) { - final Distance result; + return getValueFromStartToTimePointOrEnd(competitor, timePoint, + (from, to)->{ + final Distance result; + final Distance preResult = getTrack(competitor).getDistanceTraveled(from, to); + if (considerGateStart && preResult != null) { + result = preResult.add(getAdditionalGateStartDistance(competitor, timePoint)); + } else { + result = preResult; + } + return result; + }); + } + + @Override + public Distance getDistanceFoiled(Competitor competitor, TimePoint timePoint) { + return getBravoValue(competitor, timePoint, BravoFixTrack::getDistanceSpentFoiling); + } + + @Override + public Duration getDurationFoiled(Competitor competitor, TimePoint timePoint) { + return getBravoValue(competitor, timePoint, BravoFixTrack::getTimeSpentFoiling); + } + + @FunctionalInterface + private static interface BravoFromToValueCalculator { + T getValue(BravoFixTrack bravoFixTrack, TimePoint from, TimePoint to); + } + + private T getBravoValue(Competitor competitor, TimePoint timePoint, BravoFromToValueCalculator bravoValueCalculator) { + return getValueFromStartToTimePointOrEnd(competitor, timePoint, + (from, to)->{ + final T result; + final BravoFixTrack bravoFixTrack = getSensorTrack(competitor, BravoFixTrack.TRACK_NAME); + if (bravoFixTrack != null) { + result = bravoValueCalculator.getValue(bravoFixTrack, from, to); + } else { + result = null; + } + return result; + }); + } + + private T getValueFromStartToTimePointOrEnd(Competitor competitor, TimePoint timePoint, Track.TimeRangeValueCalculator valueCalculator) { + final T result; NavigableSet markPassings = getMarkPassings(competitor); try { lockForRead(markPassings); @@ -1239,12 +1285,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl if (end == null) { result = null; } else { - final Distance preResult = getTrack(competitor).getDistanceTraveled(markPassings.first().getTimePoint(), end); - if (considerGateStart && preResult != null) { - result = preResult.add(getAdditionalGateStartDistance(competitor, timePoint)); - } else { - result = preResult; - } + result = valueCalculator.calculate(markPassings.first().getTimePoint(), end); } } return result; @@ -3570,12 +3611,14 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl @Override public Speed getSpeed(Competitor competitor, long millisecondsBeforeRaceStart) { + final Speed result; if (getStartOfRace() == null) { - return null; + result = null; + } else { + TimePoint beforeStart = new MillisecondsTimePoint(getStartOfRace().asMillis() - millisecondsBeforeRaceStart); + result = getTrack(competitor).getEstimatedSpeed(beforeStart); } - - TimePoint beforeStart = new MillisecondsTimePoint(getStartOfRace().asMillis() - millisecondsBeforeRaceStart); - return getTrack(competitor).getEstimatedSpeed(beforeStart); + return result; } @Override @@ -4107,40 +4150,54 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl protected > TrackT getOrCreateSensorTrack( Competitor competitor, String trackName, TrackFactory newTrackFactory) { Pair key = new Pair<>(competitor, trackName); + Optional executeAfterReleasingLock = Optional.empty(); + TrackT result; LockUtil.lockForWrite(sensorTracksLock); try { - TrackT result = getTrackInternal(key); + result = getTrackInternal(key); if (result == null && tracks.containsKey(competitor)) { // A track is only added if the given Competitor is known to participate in this race result = newTrackFactory.get(); - addSensorTrackInternal(key, result); + executeAfterReleasingLock = addSensorTrackInternal(key, result); } - return result; } finally { LockUtil.unlockAfterWrite(sensorTracksLock); } + executeAfterReleasingLock.ifPresent(r->r.run()); + return result; } protected void addSensorTrack(Competitor competitor, String trackName, DynamicSensorFixTrack track) { Pair key = new Pair<>(competitor, trackName); + Optional executeAfterReleasingLock = Optional.empty(); LockUtil.lockForWrite(sensorTracksLock); try { - if(getTrackInternal(key) != null) { + if (getTrackInternal(key) != null) { if (logger != null && logger.getLevel() != null && logger.getLevel().equals(Level.WARNING)) { logger.warning(SensorFixTrack.class.getName() + " already exists for competitor: " + competitor.getName() + "; trackName: " + trackName); } } else { - this.addSensorTrackInternal(key, track); + executeAfterReleasingLock = this.addSensorTrackInternal(key, track); } } finally { LockUtil.unlockAfterWrite(sensorTracksLock); } + executeAfterReleasingLock.ifPresent(r->r.run()); } - protected void addSensorTrackInternal(Pair key, + /** + * To call this method, the caller must have obtained the write lock of {@link #sensorTracksLock}. + * Optionally, the method may return a {@link Runnable} to execute after the lock has been released. + * This may, e.g., be a routine that notifies listeners. Callers are responsible for invoking this + * {@link Runnable} after releasing the write lock. + */ + protected Optional addSensorTrackInternal(Pair key, DynamicSensorFixTrack track) { + assert sensorTracksLock.isWriteLockedByCurrentThread(); sensorTracks.put(key, track); + track.addedToTrackedRace(this); + return Optional.empty(); } @SuppressWarnings("unchecked") @@ -4207,4 +4264,58 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl } return result; } + + @Override + public SpeedWithBearing getVelocityMadeGood(Competitor competitor, TimePoint timePoint, + WindPositionMode windPositionMode, WindLegTypeAndLegBearingCache cache) { + TrackedLegOfCompetitor trackedLeg = getTrackedLeg(competitor, timePoint); + final SpeedWithBearing result; + if (trackedLeg != null) { + result = trackedLeg.getVelocityMadeGood(timePoint, windPositionMode, cache); + } else { + // check if wind information is available; if so, compute a VMG only based on wind data: + if (windPositionMode == WindPositionMode.LEG_MIDDLE) { + result = null; + } else { + final Wind wind = getWind(windPositionMode, /* trackedLeg */ null, competitor, timePoint, cache); + result = projectOnto(getTrack(competitor).getEstimatedSpeed(timePoint), wind.getBearing()); + } + } + return result; + } + + SpeedWithBearing projectOnto(SpeedWithBearing speed, Bearing projectToBearing) { + final SpeedWithBearing result; + if (speed != null && speed.getBearing() != null && projectToBearing != null) { + double cos = Math.cos(speed.getBearing().getRadians() - projectToBearing.getRadians()); + if (cos < 0) { + projectToBearing = projectToBearing.reverse(); + } + result = new KnotSpeedWithBearingImpl(Math.abs(speed.getKnots() * cos), projectToBearing); + } else { + result = null; + } + return result; + } + + /** + * @param trackedLeg + * The caller is expected to obtain the {@link #getTrackedLeg(Competitor, TimePoint) tracked leg} the + * {@code competitor} is sailing in at time point {@code at}. If {@code null}, any + * non-{@link WindPositionMode#EXACT exact} wind position mode will use {@code null} for the wind + * position, defaulting to the "COMBINED" wind source at the middle of the course. In particular, it then + * obviously makes no real sense to request {@link WindPositionMode#LEG_MIDDLE} because no leg is known. + */ + Wind getWind(WindPositionMode windPositionMode, TrackedLegImpl trackedLeg, Competitor competitor, TimePoint at, WindLegTypeAndLegBearingCache cache) { + final Wind wind; + if (windPositionMode == WindPositionMode.EXACT) { + wind = cache.getWind(this, competitor, at); + } else { + wind = getWind(trackedLeg == null ? null : + trackedLeg.getEffectiveWindPosition( + () -> getTrack(competitor) + .getEstimatedPosition(at, false), at, windPositionMode), at); + } + return wind; + } } diff --git a/java/com.sap.sailing.expeditionconnector.common/META-INF/MANIFEST.MF b/java/com.sap.sailing.expeditionconnector.common/META-INF/MANIFEST.MF index 4327d078eb7..d41efa2965a 100755 --- a/java/com.sap.sailing.expeditionconnector.common/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.expeditionconnector.common/META-INF/MANIFEST.MF @@ -7,4 +7,5 @@ Bundle-Vendor: SAP Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ActivationPolicy: lazy Export-Package: com.sap.sailing.expeditionconnector -Require-Bundle: com.sap.sse.gwt +Require-Bundle: com.sap.sse.gwt, + com.sap.sailing.domain.common diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionDeviceIdentifier.java b/java/com.sap.sailing.expeditionconnector.common/src/com/sap/sailing/expeditionconnector/ExpeditionDeviceIdentifier.java similarity index 51% rename from java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionDeviceIdentifier.java rename to java/com.sap.sailing.expeditionconnector.common/src/com/sap/sailing/expeditionconnector/ExpeditionDeviceIdentifier.java index 74dfb46f4db..dd44b6d6f39 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionDeviceIdentifier.java +++ b/java/com.sap.sailing.expeditionconnector.common/src/com/sap/sailing/expeditionconnector/ExpeditionDeviceIdentifier.java @@ -1,9 +1,8 @@ -package com.sap.sailing.expeditionconnector.persistence; +package com.sap.sailing.expeditionconnector; import java.util.UUID; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; -import com.sap.sailing.expeditionconnector.ExpeditionDeviceConfiguration; +import com.sap.sailing.domain.common.DeviceIdentifier; public interface ExpeditionDeviceIdentifier extends DeviceIdentifier { /** diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifier.java b/java/com.sap.sailing.expeditionconnector.common/src/com/sap/sailing/expeditionconnector/ExpeditionSensorDeviceIdentifier.java similarity index 86% rename from java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifier.java rename to java/com.sap.sailing.expeditionconnector.common/src/com/sap/sailing/expeditionconnector/ExpeditionSensorDeviceIdentifier.java index 0661ed8e7de..ee56e5f788f 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifier.java +++ b/java/com.sap.sailing.expeditionconnector.common/src/com/sap/sailing/expeditionconnector/ExpeditionSensorDeviceIdentifier.java @@ -1,4 +1,4 @@ -package com.sap.sailing.expeditionconnector.persistence; +package com.sap.sailing.expeditionconnector; /** * A device identifier used to identify an installation of the regatta tool "Expedition" diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifier.java b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifier.java index 7b980adcf47..7c59f1aeae0 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifier.java +++ b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifier.java @@ -1,5 +1,7 @@ package com.sap.sailing.expeditionconnector.persistence; +import com.sap.sailing.expeditionconnector.ExpeditionDeviceIdentifier; + /** * A device identifier used to identify an installation of the regatta tool "Expedition" * regarding its basic GPS information. diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifierJsonHandler.java b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifierJsonHandler.java index 8a6b8fa2898..7139cac90c9 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifierJsonHandler.java +++ b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifierJsonHandler.java @@ -1,7 +1,7 @@ package com.sap.sailing.expeditionconnector.persistence; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler; public class ExpeditionGpsDeviceIdentifierJsonHandler extends ExpeditionGpsDeviceIdentifierSerializationHandler diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifierSerializationHandler.java b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifierSerializationHandler.java index ed3b71d187d..5965eb87869 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifierSerializationHandler.java +++ b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionGpsDeviceIdentifierSerializationHandler.java @@ -2,8 +2,8 @@ package com.sap.sailing.expeditionconnector.persistence; import java.util.UUID; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sse.common.Util; public class ExpeditionGpsDeviceIdentifierSerializationHandler { diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifierImpl.java b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifierImpl.java index 158466797d1..4ad233a9d82 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifierImpl.java +++ b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifierImpl.java @@ -2,6 +2,7 @@ package com.sap.sailing.expeditionconnector.persistence; import java.util.UUID; +import com.sap.sailing.expeditionconnector.ExpeditionSensorDeviceIdentifier; import com.sap.sailing.expeditionconnector.persistence.impl.AbstractExpeditionDeviceIdentifierImpl; public class ExpeditionSensorDeviceIdentifierImpl extends AbstractExpeditionDeviceIdentifierImpl implements ExpeditionSensorDeviceIdentifier { diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifierSerializationHandler.java b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifierSerializationHandler.java index e49cc757215..3872e9255f9 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifierSerializationHandler.java +++ b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/ExpeditionSensorDeviceIdentifierSerializationHandler.java @@ -2,8 +2,9 @@ package com.sap.sailing.expeditionconnector.persistence; import java.util.UUID; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; +import com.sap.sailing.expeditionconnector.ExpeditionSensorDeviceIdentifier; import com.sap.sse.common.Util; public class ExpeditionSensorDeviceIdentifierSerializationHandler { diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/AbstractExpeditionDeviceIdentifierImpl.java b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/AbstractExpeditionDeviceIdentifierImpl.java index 9e4e97d916e..21ff23cd0a6 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/AbstractExpeditionDeviceIdentifierImpl.java +++ b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/AbstractExpeditionDeviceIdentifierImpl.java @@ -2,7 +2,7 @@ package com.sap.sailing.expeditionconnector.persistence.impl; import java.util.UUID; -import com.sap.sailing.expeditionconnector.persistence.ExpeditionDeviceIdentifier; +import com.sap.sailing.expeditionconnector.ExpeditionDeviceIdentifier; public abstract class AbstractExpeditionDeviceIdentifierImpl implements ExpeditionDeviceIdentifier { private static final long serialVersionUID = -6605059302775505785L; diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/Activator.java b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/Activator.java index a842c2cbadd..4e988439924 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/Activator.java +++ b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/Activator.java @@ -10,8 +10,8 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; +import com.sap.sailing.expeditionconnector.ExpeditionSensorDeviceIdentifier; import com.sap.sailing.expeditionconnector.persistence.ExpeditionGpsDeviceIdentifier; -import com.sap.sailing.expeditionconnector.persistence.ExpeditionSensorDeviceIdentifier; import com.sap.sse.common.TypeBasedServiceFinder; import com.sap.sse.mongodb.MongoDBService; diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/ExpeditionGpsDeviceIdentifierMongoHandler.java b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/ExpeditionGpsDeviceIdentifierMongoHandler.java index ea21669e0cf..16387b809d9 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/ExpeditionGpsDeviceIdentifierMongoHandler.java +++ b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/ExpeditionGpsDeviceIdentifierMongoHandler.java @@ -1,8 +1,8 @@ package com.sap.sailing.expeditionconnector.persistence.impl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.expeditionconnector.persistence.ExpeditionGpsDeviceIdentifierSerializationHandler; public class ExpeditionGpsDeviceIdentifierMongoHandler extends ExpeditionGpsDeviceIdentifierSerializationHandler diff --git a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/ExpeditionSensorDeviceIdentifierMongoHandler.java b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/ExpeditionSensorDeviceIdentifierMongoHandler.java index b7e6d3f1109..a549dab7d6c 100755 --- a/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/ExpeditionSensorDeviceIdentifierMongoHandler.java +++ b/java/com.sap.sailing.expeditionconnector.persistence/src/com/sap/sailing/expeditionconnector/persistence/impl/ExpeditionSensorDeviceIdentifierMongoHandler.java @@ -1,8 +1,8 @@ package com.sap.sailing.expeditionconnector.persistence.impl; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.persistence.racelog.tracking.DeviceIdentifierMongoHandler; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.expeditionconnector.persistence.ExpeditionSensorDeviceIdentifierSerializationHandler; public class ExpeditionSensorDeviceIdentifierMongoHandler extends ExpeditionSensorDeviceIdentifierSerializationHandler diff --git a/java/com.sap.sailing.expeditionconnector.test/resources/2017Nov04VeryShort.csv b/java/com.sap.sailing.expeditionconnector.test/resources/2017Nov04VeryShort.csv new file mode 100644 index 00000000000..87bbb0618b3 --- /dev/null +++ b/java/com.sap.sailing.expeditionconnector.test/resources/2017Nov04VeryShort.csv @@ -0,0 +1,64 @@ +Boat,Utc,Bsp,Awa,Aws,Twa,Tws,Twd,RudderFwd,Leeway,Set,Drift,Hdg,AirTemp,SeaTemp,Baro,Depth,Heel,Trim,Rudder,Tab,Forestay,Downhaul,MastAng,FStayLen,MastButt,Load S,Load P,Rake,Volts,ROT,GpQual,PDOP,GpsNum,GpsAge,Altitude,GeoSep,GpsMode,Lat,Lon,Cog,Sog,DiffStn,Error,RunnerS,RunnerP,Vang,Trav,Main,KeelAng,KeelHt,Board,Oil P,RPM 1,RPM 2,Board P,Board S,DistToLn,RchTmToLn,RchDtToLn,GPS time,Twd+90,Twd-90,Downhaul2,Mk Lat,Mk Lon,Port lat,Port lon,Stbd lat,Stbd lon,HPE,RH,Lead P,Lead S,BackStay,RakeDeg,DflectrPP,TG Heell,ForestayPres,DflectrMM,User 5,User 6,User 7,User 8,User 9,User 10,User 11,User 12,User 13,User 14,User 15,User 16,User 17,User 18,User 19,User 20,User 21,User 22,User 23,User 24,User 25,User 26,User 27,User 28,User 29,User 30,User 31,TmToGun,TmToLn,TmToBurn,BelowLn,GunBlwLn,WvSigHt,WvSigPd,WvMaxHt,WvMaxPd,Slam,Motion,Mwa,Mws,Boom,Twist,TackLossT,TackLossD,TrimRate,HeelRate,DeflectorP,RudderP,RudderS,RudderToe,BspTr,FStayInner,DeflectorS,Bobstay,Outhaul,D0 P,D0 S,D1 P,D1 S,V0 P,V0 S,V1 P,V1 S +0,43043.622986,0,105.2,9.21,106.1,8.95,259.9,,-0,152.9,0.06,151.6,,,,2.8,0.92,0.01,-7.19,,1.036,,,,,,,67,,,0,,0,0,30.92,0,,-33.9085207,18.4197313,152.9,0.063,,,,,,,,,,,,,,,,,,,0.622989,180,0,,-33.8723241,18.4068248,-33.8998667,18.44635,-33.9048333,18.4433333,,,,,,1.255319,78.54628,17.899,0.964532,484.2771,-0.000027,,,,,,,,,,,,,,,,,,,,,,,,,,,0.005822,,,0.941392,,,,,,,,,,,0 +1,43043.622986,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 +2,43043.622986,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 +3,43043.622986,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 +4,43043.622986,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 +5,43043.622986,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 +6,43043.622986,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 +7,43043.622986,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 +.52,155.6,5.4,333.2,,0,58.4,0.06,179,,,,1.4,0.7,-0.05,7.17,,0.543,,,,,,,104,,,0,,0,0,35.33,0,,-33.908531,18.4197168,58.4,0.064,,,,,,,,,,,,,,,,4494.746494,,,0.305674,63.2,243.2,,,,,,,,,,,,,2.367484,98.865089,9.160931,0.494149,579.191406,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,36.141281,,4369.841626 +0,43043.305710,0,153.2,5.33,154.2,5.36,332.9,,0,58.4,0.1,179.1,,,,1.4,0.68,0.01,7.16,,0.545,,,,,,,104,,,0,,0,0,35.3,0,,-33.9085312,18.4197166,58.4,0.103,,,,,,,,,,,,,,,,4494.745257,,,0.305686,62.9,242.9,,39.5759514,2.5748167,,,,,,,,,,2.367534,98.865723,9.031358,0.493427,579.195068,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,36.384381,,4369.841628 +0,43043.305723,0,151.7,5.12,152.9,5.31,332.6,,0,58.4,0.11,178.9,,,,1.2,0.65,-0.07,7.18,,0.538,,,,,,,104,,,0,,0,0,35.32,0,,-33.9085314,18.4197169,58.4,0.11,,,,,,,,,,,,,,,,4494.744879,,,0.3057,62.6,242.6,,,,,,,,,,,,,2.367484,98.866142,8.846865,0.493583,579.195679,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,36.692521,,4369.841645 +0,43043.305734,0,150.5,4.97,151.9,5.24,332.3,,0,58.4,0.09,178.8,,,,1.2,0.63,-0.04,7.17,,0.545,,,,,,,104,,,0,,0,0,35.29,0,,-33.9085313,18.419717,58.4,0.089,,,,,,,,,,,,,,,,4494.745473,,,0.305712,62.3,242.3,,,,,,,,,,,,,2.367501,98.86599,8.596081,0.494632,579.193542,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.160375,,4369.841654 +0,43043.305745,0,150.1,4.89,151.4,5.18,332,,0,58.4,0.05,178.8,,,,1.2,0.68,-0.05,7.17,,0.542,,,,,,,104,,,0,,0,0,35.24,0,,-33.9085312,18.4197168,58.4,0.047,,,,,,,,,,,,,,,,4494.746847,,,0.305723,62.1,242.1,,,,,,,,,,,,,2.367514,98.865654,8.345397,0.494219,579.191162,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.48573,,4369.841648 +0,43043.305758,0,149.1,4.85,150.4,5.14,331.7,,0,58.4,0.05,178.9,,,,1.4,0.79,-0,7.16,,0.546,,,,,,,104,,,0,,0,0,35.17,0,,-33.9085311,18.4197165,58.4,0.046,,,,,,,,,,,,,,,,4494.747044,,,0.305735,61.7,241.7,,,,,,,,,,,,,2.367511,98.865479,8.207174,0.494884,579.190796,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.398528,,4369.841627 +0,43043.305769,0,148.1,4.77,149.6,5.12,331.3,,0,58.4,0.05,179.2,,,,1.4,0.85,-0.03,7.17,,0.545,,,,,,,104,,,0,,0,0,35.09,0,,-33.9085309,18.4197168,58.4,0.051,,,,,,,,,,,,,,,,4494.746833,,,0.305747,61.4,241.4,,,,,,,,,,,,,2.367501,98.865295,8.123696,0.493687,579.192505,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.170342,,4369.841614 +0,43043.305781,0,148.1,4.72,149.1,5.1,331.1,,0,58.4,0.06,179.6,,,,1.4,0.83,-0,7.16,,0.544,,,,,,,104,,,0,,0,0,35.02,0,,-33.9085306,18.4197173,58.4,0.062,,,,,,,,,,,,,,,,4494.746565,,,0.305758,61.1,241.1,,,,,,,,,,,,,2.367521,98.865692,8.040314,0.494814,579.191406,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,36.82654,,4369.841601 +0,43043.305793,0,148.4,4.71,149.3,5.07,331,,0,58.4,0.07,179.6,,,,1.4,0.84,-0.04,7.16,,0.547,,,,,,,104,,,0,,0,0,34.92,0,,-33.9085303,18.4197174,58.4,0.066,,,,,,,,,,,,,,,,4494.746314,,,0.30577,61.1,241.1,,,,,,,,,,,,,2.367481,98.865128,7.936176,0.494846,579.18927,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,36.81312,,4369.841594 +0,43043.305804,0,147.6,4.65,148.5,5.02,330.7,,0,58.4,0.07,179.5,,,,1.4,0.89,0.01,7.17,,0.545,,,,,,,104,,,0,,0,0,34.89,0,,-33.9085302,18.419717,58.4,0.067,,,,,,,,,,,,,,,,4494.746283,,,0.305781,60.7,240.7,,,,,,,,,,,,,2.367517,98.865089,7.759246,0.494822,579.192688,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,36.646684,,4369.84158 +0,43043.305816,0,147.2,4.62,148.1,4.98,330.5,,0,58.4,0.07,179.5,,,,1.4,0.93,0,7.16,,0.547,,,,,,,104,,,0,,0,0,34.95,0,,-33.9085303,18.4197172,58.4,0.065,,,,,,,,,,,,,,,,4494.746274,,,0.305793,60.5,240.5,,,,,,,,,,,,,2.367514,98.865921,7.594308,0.493407,579.193115,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,36.572412,,4369.841589 +0,43043.305827,0,148.9,4.69,148.9,4.98,330.6,,0,58.4,0.05,179.3,,,,1.4,0.91,0.05,7.18,,0.548,,,,,,,104,,,0,,0,0,34.99,0,,-33.9085306,18.4197173,58.4,0.051,,,,,,,,,,,,,,,,4494.746742,,,0.305804,60.5,240.5,,,,,,,,,,,,,2.367514,98.865173,7.596838,0.49495,579.186035,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,36.766499,,4369.841615 +0,43043.305839,0,152.8,4.78,151.5,4.99,331.2,,0,58.4,0.05,179.1,,,,1.4,0.85,0.04,7.2,,0.551,,,,,,,104,,,0,,0,0,34.92,0,,-33.9085307,18.4197173,58.4,0.051,,,,,,,,,,,,,,,,4494.746863,,,0.305816,61.1,241.1,,,,,,,,,,,,,2.367504,98.864769,7.629427,0.494454,579.188171,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.057669,,4369.841627 +0,43043.305851,0,153.5,4.8,152.5,4.98,331.4,,0,58.4,0.05,179.2,,,,1.4,0.84,0.07,7.16,,0.557,,,,,,,104,,,0,,0,0,34.87,0,,-33.9085305,18.4197175,58.4,0.053,,,,,,,,,,,,,,,,4494.746728,,,0.305828,61.4,241.4,,,,,,,,,,,,,2.367504,98.864746,7.608146,0.494083,579.190308,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.21491,,4369.84162 +0,43043.305862,0,154.6,4.75,153.2,4.95,331.6,,0,58.4,0.05,179.3,,,,1.4,0.86,-0.05,7.17,,0.542,,,,,,,104,,,0,,0,0,34.79,0,,-33.9085304,18.4197177,58.4,0.054,,,,,,,,,,,,,,,,4494.746707,,,0.305839,61.6,241.6,,,,,,,,,,,,,2.367477,98.864372,7.457287,0.495428,579.183655,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.620092,,4369.841617 +0,43043.305874,0,152.5,4.68,152.4,4.9,331.4,,0,58.4,0.05,179.2,,,,1.4,0.82,-0.06,7.17,,0.542,,,,,,,104,,,0,,0,0,34.74,0,,-33.9085302,18.4197176,58.4,0.049,,,,,,,,,,,,,,,,4494.746823,,,0.305851,61.4,241.4,,,,,,,,,,,,,2.367517,98.864601,7.258937,0.49545,579.187744,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.152083,,4369.841609 +0,43043.305886,0,151.2,4.7,151.4,4.89,331.1,,0,58.4,0.04,179.3,,,,1.4,0.71,-0.05,7.17,,0.543,,,,,,,104,,,0,,0,0,34.72,0,,-33.90853,18.4197174,58.4,0.041,,,,,,,,,,,,,,,,4494.747111,,,0.305862,61.2,241.2,,,,,,,,,,,,,2.367527,98.864799,7.251778,0.493887,579.18689,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.082603,,4369.841593 +0,43043.305897,0,149.2,4.78,150,4.91,330.7,,0,58.4,0.04,179.3,,,,1.4,0.58,-0.05,7.17,,0.543,,,,,,,104,,,0,,0,0,34.75,0,,-33.90853,18.4197174,58.4,0.044,,,,,,,,,,,,,,,,4494.747004,,,0.305874,60.8,240.8,,,,,,,,,,,,,2.367501,98.864571,7.301067,0.494079,579.18927,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.699507,,4369.841591 +0,43043.305909,0,148.2,4.8,149.2,4.89,330.4,,0,58.4,0.04,179.4,,,,1.4,0.51,-0.05,7.17,,0.542,,,,,,,104,,,0,,0,0,34.87,0,,-33.9085299,18.4197176,58.4,0.043,,,,,,,,,,,,,,,,4494.747033,,,0.305885,60.5,240.5,,,,,,,,,,,,,2.367507,98.864716,7.254144,0.493431,579.189026,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.528905,,4369.841588 +0,43043.305921,0,145.2,4.74,147.1,4.86,329.7,,0,58.4,0.05,179.6,,,,1.4,0.51,-0.04,7.17,,0.543,,,,,,,104,,,0,,0,0,34.93,0,,-33.9085297,18.4197177,58.4,0.049,,,,,,,,,,,,,,,,4494.74687,,,0.305897,59.9,239.9,,,,,,,,,,,,,2.367527,98.864639,7.141332,0.494522,579.183044,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.369035,,4369.841577 +0,43043.305933,0,142.7,4.65,144.8,4.82,329,,0,58.4,0.05,179.6,,,,1.4,0.53,-0.04,7.17,,0.544,,,,,,,104,,,0,,0,0,34.96,0,,-33.9085296,18.4197175,58.4,0.05,,,,,,,,,,,,,,,,4494.746803,,,0.305909,59.1,239.1,,,,,,,,,,,,,2.367504,98.864037,6.976142,0.494604,579.186462,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.286149,,4369.841565 +0,43043.305944,0,142.3,4.56,144.3,4.77,328.7,,0,58.4,0.05,179.6,,,,1.4,0.53,-0.04,7.17,,0.545,,,,,,,104,,,0,,0,0,34.89,0,,-33.9085292,18.4197173,58.4,0.048,,,,,,,,,,,,,,,,4494.746825,,,0.30592,58.7,238.7,,,,,,,,,,,,,2.367541,98.864273,6.768263,0.495198,579.184937,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.566006,,4369.84154 +0,43043.305957,0,141.1,4.46,143,4.68,328.1,,0,58.4,0.04,179.6,,,,1.4,0.49,-0.06,7.18,,0.547,,,,,,,104,,,0,,0,0,34.87,0,,-33.9085289,18.419717,58.4,0.039,,,,,,,,,,,,,,,,4494.747067,,,0.305932,58.2,238.2,,,,,,,,,,,,,2.367497,98.864983,6.428645,0.495544,579.194458,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.945739,,4369.841514 +0,43043.305968,0,141.2,4.39,142.7,4.61,327.7,,0,58.4,0.06,179.6,,,,1.4,0.44,-0.05,7.17,,0.544,,,,,,,104,,,0,,0,0,34.86,0,,-33.9085286,18.4197169,58.4,0.061,,,,,,,,,,,,,,,,4494.746729,,,0.305943,57.8,237.8,,,,,,,,,,,,,2.367521,98.865654,6.165024,0.494762,579.188416,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.349829,,4369.841498 +0,43043.305979,0,141.1,4.29,142.4,4.57,327.4,,0,58.4,0.08,179.4,,,,1.4,0.41,-0.03,7.16,,0.544,,,,,,,104,,,0,,0,0,34.91,0,,-33.9085285,18.4197166,58.4,0.082,,,,,,,,,,,,,,,,4494.745714,,,0.305955,57.5,237.5,,,,,,,,,,,,,2.367497,98.8647,6.012874,0.495066,579.189026,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.652994,,4369.84149 +0,43043.305991,0,139.7,4.16,141.2,4.53,326.8,,0,58.4,0.09,179.4,,,,1.4,0.43,-0.04,7.17,,0.544,,,,,,,104,,,0,,0,0,34.94,0,,-33.9085286,18.4197167,58.4,0.095,,,,,,,,,,,,,,,,4494.74531,,,0.305966,56.8,236.8,,,,,,,,,,,,,2.367514,98.864342,5.854272,0.494269,579.185791,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.640193,,4369.8415 +0,43043.306002,0,139.5,4.07,140.9,4.49,326.4,,0,58.4,0.07,179.4,,,,1.4,0.47,-0,7.17,,0.546,,,,,,,104,,,0,,0,0,34.94,0,,-33.9085288,18.4197167,58.4,0.073,,,,,,,,,,,,,,,,4494.745619,,,0.305978,56.5,236.5,,,,,,,,,,,,,2.367487,98.864784,5.71282,0.495704,579.18927,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.73358,,4369.841509 +0,43043.306015,0,139.6,4.04,140.5,4.48,326,,0,58.4,0.05,179.4,,,,1.4,0.5,-0.01,7.17,,0.548,,,,,,,104,,,0,,0,0,34.9,0,,-33.908529,18.4197167,58.4,0.051,,,,,,,,,,,,,,,,4494.746677,,,0.305992,56,236,,,,,,,,,,,,,2.367487,98.865372,5.657006,0.494508,579.193787,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.586456,,4369.841519 +0,43043.306026,0,139.8,4.08,140.6,4.49,325.7,,0,58.4,0.04,179.4,,,,1.4,0.51,0.13,7.17,,0.553,,,,,,,104,,,0,,0,0,34.83,0,,-33.9085289,18.4197168,58.4,0.04,,,,,,,,,,,,,,,,4494.747024,,,0.306001,55.7,235.7,,,,,,,,,,,,,2.367544,98.865784,5.693069,0.494978,579.190979,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.369375,,4369.841518 +0,43043.306038,0,140.1,4.18,140.4,4.51,325.4,,0,58.4,0.04,179.5,,,,1.4,0.58,0.04,7.17,,0.549,,,,,,,104,,,0,,0,0,34.85,0,,-33.9085289,18.4197173,58.4,0.043,,,,,,,,,,,,,,,,4494.747023,,,0.306013,55.4,235.4,,,,,,,,,,,,,2.367471,98.864349,5.787839,0.495452,579.183228,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.834913,,4369.84153 +0,43043.306049,0,143,4.26,142.4,4.5,325.7,,0,58.4,0.06,179.5,,,,1.4,0.72,0.06,7.17,,0.55,,,,,,,104,,,0,,0,0,34.93,0,,-33.9085285,18.4197174,58.4,0.06,,,,,,,,,,,,,,,,4494.746438,,,0.306024,55.7,235.7,,,,,,,,,,,,,2.367527,98.864777,5.744619,0.495404,579.191406,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.092266,,4369.841516 +0,43043.306061,0,144.1,4.31,143.2,4.48,325.7,,0,58.4,0.06,179.3,,,,1.4,0.85,0.06,7.17,,0.551,,,,,,,104,,,0,,0,0,34.99,0,,-33.9085286,18.4197174,58.4,0.061,,,,,,,,,,,,,,,,4494.746376,,,0.306039,55.7,235.7,,39.5759514,2.5748167,,,,,,,,,,2.367501,98.863998,5.652483,0.494522,579.182373,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.450637,,4369.841528 +0,43043.306073,0,146.5,4.37,145,4.49,326.1,,0,58.4,0.06,179.3,,,,1.4,0.89,0.05,7.17,,0.542,,,,,,,104,,,0,,0,0,35.04,0,,-33.9085288,18.4197175,58.4,0.063,,,,,,,,,,,,,,,,4494.746299,,,0.30605,56,236,,,,,,,,,,,,,2.367501,98.863808,5.684719,0.494808,579.183899,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.620995,,4369.84154 +0,43043.306085,0,151.8,4.45,148.6,4.5,327,,0,58.4,0.06,179.3,,,,1.3,0.84,0.07,7.17,,0.553,,,,,,,104,,,0,,0,0,34.99,0,,-33.908529,18.4197178,58.4,0.059,,,,,,,,,,,,,,,,4494.746646,,,0.306062,56.9,236.9,,,,,,,,,,,,,2.367507,98.863884,5.737547,0.496847,579.185791,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,39.067871,,4369.841558 +0,43043.306096,0,154.6,4.56,151.3,4.54,327.7,,0,58.4,0.1,179,,,,1.4,0.8,0.07,7.18,,0.549,,,,,,,104,,,0,,0,0,34.97,0,,-33.9085291,18.419718,58.4,0.1,,,,,,,,,,,,,,,,4494.74513,,,0.306071,57.6,237.6,,,,,,,,,,,,,2.367514,98.864517,5.866133,0.495148,579.187744,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,39.49511,,4369.841581 +0,43043.306108,0,154.9,4.75,152.4,4.63,328.1,,0,58.4,0.1,179.4,,,,1.4,0.79,0.07,7.19,,0.553,,,,,,,104,,,0,,0,0,34.98,0,,-33.9085292,18.4197179,58.4,0.099,,,,,,,,,,,,,,,,4494.745193,,,0.306085,58.1,238.1,,,,,,,,,,,,,2.367507,98.864769,6.238055,0.495054,579.182373,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,38.827474,,4369.841569 +0,43043.306120,0,151.6,4.95,150.9,4.76,327.8,,0,58.4,0.11,179.3,,,,1.4,0.81,0.02,7.18,,0.542,,,,,,,104,,,0,,0,0,34.92,0,,-33.9085294,18.4197178,58.4,0.115,,,,,,,,,,,,,,,,4494.74457,,,0.306097,57.9,237.9,,,,,,,,,,,,,2.367464,98.863533,6.728293,0.495422,579.184082,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,37.529799,,4369.841579 +0,43043.306131,0,145.5,5.09,146.9,4.85,326.8,,0,58.4,0.1,179.3,,,,1.4,0.8,-0.03,7.18,,0.568,,,,,,,104,,,0,,0,0,34.87,0,,-33.9085293,18.4197182,58.4,0.104,,,,,,,,,,,,,,,,4494.74531,,,0.306108,56.9,236.9,,,,,,,,,,,,,2.367484,98.863914,7.083571,0.495694,579.183655,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,36.000165,,4369.841585 +0,43043.306143,0,138.5,5.2,141.9,4.88,325.5,,0,58.4,0.14,179.6,,,,1.4,0.69,0.03,7.18,,0.54,,,,,,,104,,,0,,0,0,34.78,0,,-33.9085293,18.4197192,58.4,0.14,,,,,,,,,,,,,,,,4494.743829,,,0.30612,55.6,235.6,,,,,,,,,,,,,2.367554,98.863335,7.188333,0.49929,579.176147,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,34.716986,,4369.841608 +0,43043.306155,0,135.4,5.26,139.1,4.85,324.5,,0,58.4,0.13,180.1,,,,1.4,0.56,0.01,7.18,,0.538,,,,,,,104,,,0,,0,0,34.7,0,,-33.9085294,18.4197202,58.4,0.128,,,,,,,,,,,,,,,,4494.744186,,,0.306131,54.8,234.8,,,,,,,,,,,,,2.367584,98.860855,7.099799,0.496363,579.170105,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,34.056772,,4369.84163 +0,43043.306166,0,130.5,5.22,134.8,4.82,323.2,,0,57.5,0.13,180.1,,,,1.4,0.55,0.01,7.18,,0.545,,,,,,,104,,,0,,0,0,34.63,0,,-33.908529,18.4197211,57.3,0.121,,,,,,,,,,,,,,,,4494.744047,,,0.306143,53.5,233.5,,,,,,,,,,,,,2.367578,98.860954,6.947227,0.497447,579.166443,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,33.579793,,4369.841636 +0,43043.306178,0,130.6,5.17,134.2,4.77,322.6,,0,56.2,0.11,179.7,,,,1.3,0.58,0.01,7.18,,0.538,,,,,,,104,,,0,,0,0,34.67,0,,-33.9085293,18.4197207,56.2,0.109,,,,,,,,,,,,,,,,4494.744776,,,0.306155,52.7,232.7,,,,,,,,,,,,,2.367564,98.860756,6.770802,0.496485,579.175049,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,33.788713,,4369.841651 +0,43043.306190,0,129.7,5.08,132.6,4.74,321.8,,0,55.8,0.12,179.8,,,,1.4,0.5,0,7.17,,0.535,,,,,,,104,,,0,,0,0,34.74,0,,-33.9085298,18.41972,55.8,0.117,,,,,,,,,,,,,,,,4494.744618,,,0.306166,51.9,231.9,,,,,,,,,,,,,2.367571,99.007469,6.664012,0.497367,581.100708,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,33.518448,,4369.841646 +0,43043.306202,0,130.1,4.96,132.6,4.75,321.3,,0,55.8,0.1,179.9,,,,1.4,0.34,-0.03,7.17,,0.481,,,,,,,104,,,0,,0,0,34.66,0,,-33.9085299,18.4197202,55.8,0.1,,,,,,,,,,,,,,,,4494.744771,,,0.306178,51.4,231.4,,,,,,,,,,,,,2.365773,99.772903,6.686917,0.471604,585.662476,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,33.219946,,4369.841653 +0,43043.306213,0,132.3,4.74,133.2,4.73,321.1,,0,55.8,0.08,179.8,,,,1.6,0.21,-0.01,7.18,,0.465,,,,,,,104,,,0,,0,0,34.57,0,,-33.9085301,18.4197204,55.8,0.077,,,,,,,,,,,,,,,,4494.745837,,,0.306189,51,231,,,,,,,,,,,,,2.364245,100.821457,6.619851,0.424921,591.220581,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,33.117383,,4369.841672 +0,43043.306225,0,138.2,4.57,137.1,4.71,321.8,,0,55.8,0.06,179.5,,,,1.4,0.19,-0.04,7.17,,0.446,,,,,,,104,,,0,,0,0,34.52,0,,-33.9085308,18.4197203,55.8,0.061,,,,,,,,,,,,,,,,4494.7464,,,0.306201,51.7,231.7,,,,,,,,,,,,,2.363921,101.887444,6.54773,0.417969,595.222595,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,33.840911,,4369.841714 +0,43043.306237,0,141,4.6,139.4,4.77,322.1,,0,55.8,0.07,179.2,,,,1.4,0.29,-0,7.19,,0.439,,,,,,,104,,,0,,0,0,34.5,0,,-33.9085314,18.4197198,55.8,0.068,,,,,,,,,,,,,,,,4494.74639,,,0.306215,52,232,,,,,,,,,,,,,2.362825,102.492744,6.754865,0.394745,597.877625,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,33.863526,,4369.841735 +0,43043.306249,0,143.7,4.78,141.4,4.86,322.5,,0,55.8,0.09,179.3,,,,1.4,0.35,-0,7.18,,0.441,,,,,,,104,,,0,,0,0,34.5,0,,-33.9085316,18.41972,55.8,0.092,,,,,,,,,,,,,,,,4494.745476,,,0.306227,52.4,232.4,,,,,,,,,,,,,2.362845,102.847641,7.134893,0.394569,598.614563,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,33.25136,,4369.84175 +0,43043.306260,0,146.5,5.02,143.8,4.97,323,,0,55.8,0.09,179.3,,,,1.4,0.3,-0.02,7.17,,0.441,,,,,,,104,,,0,,0,0,34.51,0,,-33.9085316,18.4197203,55.8,0.087,,,,,,,,,,,,,,,,4494.745482,,,0.306238,52.9,232.9,,,,,,,,,,,,,2.362792,102.896881,7.545109,0.398081,598.711548,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,32.74152,,4369.841757 +0,43043.306272,0,147.8,5.33,145.2,5.1,323.4,,0,55.8,0.07,179.2,,,,1.4,0.22,-0.01,7.18,,0.445,,,,,,,104,,,0,,0,0,34.51,0,,-33.9085316,18.4197205,55.8,0.069,,,,,,,,,,,,,,,,4494.746137,,,0.306247,53.4,233.4,,,,,,,,,,,,,2.362818,102.911133,8.060515,0.397374,598.774536,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,32.456471,,4369.841769 +0,43043.306284,0,148,5.79,146,5.33,323.6,,0,55.8,0.05,179.2,,,,1.4,0.22,-0.02,7.18,,0.458,,,,,,,104,,,0,,0,0,34.48,0,,-33.9085317,18.4197209,55.8,0.056,,,,,,,,,,,,,,,,4494.746909,,,0.306262,53.6,233.6,,,,,,,,,,,,,2.362845,102.932083,8.930959,0.396582,598.878845,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,31.621008,,4369.841779 +0,43043.306295,0,146.6,6.18,145.5,5.54,323.5,,0,55.8,0.08,179.3,,,,1.4,0.31,-0.01,7.16,,0.599,,,,,,,104,,,0,,0,0,34.43,0,,-33.9085315,18.4197211,55.8,0.084,,,,,,,,,,,,,,,,4494.745723,,,0.306273,53.6,233.6,,,,,,,,,,,,,2.366752,102.944511,9.646354,0.446602,598.913452,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,29.906062,,4369.841785 +0,43043.306307,0,145.3,6.61,144.7,5.72,323.4,,0,55.8,0.08,179.5,,,,1.4,0.38,-0.02,7.19,,0.657,,,,,,,104,,,0,,0,0,34.44,0,,-33.9085314,18.4197215,55.8,0.082,,,,,,,,,,,,,,,,4494.745765,,,0.306285,53.4,233.4,,,,,,,,,,,,,2.370409,102.947891,10.227253,0.558491,598.919434,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,28.078976,,4369.841781 +0,43043.306319,0,144.3,7.06,144.2,5.91,323.3,,0,55.8,0.07,179.5,,,,1.4,0.37,-0.02,7.19,,0.672,,,,,,,104,,,0,,0,0,34.41,0,,-33.9085312,18.4197216,55.8,0.062,,,,,,,,,,,,,,,,4494.745845,,,0.306293,53.3,233.3,,,,,,,,,,,,,2.371047,102.947685,10.765502,0.580573,598.915161,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,26.559608,,4369.841778 +0,43043.306331,0,142.9,7.36,143.2,6.06,323.1,,0,55.8,0.04,179.5,,,,1.3,0.34,-0.02,7.17,,0.84,,,,,,,105,,,0,,0,0,34.44,0,,-33.9085311,18.419722,55.8,0.042,,,,,,,,,,,,,,,,4494.747071,,,0.306308,53.1,233.1,,,,,,,,,,,,,2.377057,102.942726,11.129307,0.648761,598.823792,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,25.354303,,4369.841785 diff --git a/java/com.sap.sailing.expeditionconnector.test/src/com/sap/sailing/expeditionconnector/test/UDPExpeditionReceiverTest.java b/java/com.sap.sailing.expeditionconnector.test/src/com/sap/sailing/expeditionconnector/test/UDPExpeditionReceiverTest.java index 92fa46f66a3..709e5294686 100755 --- a/java/com.sap.sailing.expeditionconnector.test/src/com/sap/sailing/expeditionconnector/test/UDPExpeditionReceiverTest.java +++ b/java/com.sap.sailing.expeditionconnector.test/src/com/sap/sailing/expeditionconnector/test/UDPExpeditionReceiverTest.java @@ -39,6 +39,7 @@ import org.junit.rules.Timeout; import com.sap.sailing.declination.Declination; import com.sap.sailing.declination.DeclinationService; +import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.WindSource; @@ -51,17 +52,16 @@ import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.common.tracking.impl.BravoExtendedFixImpl; import com.sap.sailing.domain.racelog.tracking.FixReceivedListener; import com.sap.sailing.domain.racelog.tracking.SensorFixStore; -import com.sap.sailing.domain.racelogtracking.DeviceIdentifier; import com.sap.sailing.domain.test.mock.MockedTrackedRace; import com.sap.sailing.expeditionconnector.DeviceRegistry; import com.sap.sailing.expeditionconnector.ExpeditionListener; import com.sap.sailing.expeditionconnector.ExpeditionMessage; +import com.sap.sailing.expeditionconnector.ExpeditionSensorDeviceIdentifier; import com.sap.sailing.expeditionconnector.ExpeditionTrackerFactory; import com.sap.sailing.expeditionconnector.ExpeditionWindTracker; import com.sap.sailing.expeditionconnector.UDPExpeditionReceiver; import com.sap.sailing.expeditionconnector.persistence.ExpeditionGpsDeviceIdentifier; import com.sap.sailing.expeditionconnector.persistence.ExpeditionGpsDeviceIdentifierImpl; -import com.sap.sailing.expeditionconnector.persistence.ExpeditionSensorDeviceIdentifier; import com.sap.sailing.expeditionconnector.persistence.ExpeditionSensorDeviceIdentifierImpl; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.TimePoint; diff --git a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/DeviceRegistry.java b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/DeviceRegistry.java index d34aebf0b1f..9f918719a8c 100755 --- a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/DeviceRegistry.java +++ b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/DeviceRegistry.java @@ -2,7 +2,6 @@ package com.sap.sailing.expeditionconnector; import com.sap.sailing.domain.racelog.tracking.SensorFixStore; import com.sap.sailing.expeditionconnector.persistence.ExpeditionGpsDeviceIdentifier; -import com.sap.sailing.expeditionconnector.persistence.ExpeditionSensorDeviceIdentifier; /** * Makes accessible a mapping from "Expedition" boat IDs to device UUIDs. diff --git a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/ExpeditionTrackerFactory.java b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/ExpeditionTrackerFactory.java index 1c67784bced..630d19832ef 100755 --- a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/ExpeditionTrackerFactory.java +++ b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/ExpeditionTrackerFactory.java @@ -27,7 +27,6 @@ import com.sap.sailing.expeditionconnector.impl.Activator; import com.sap.sailing.expeditionconnector.persistence.DomainObjectFactory; import com.sap.sailing.expeditionconnector.persistence.ExpeditionGpsDeviceIdentifier; import com.sap.sailing.expeditionconnector.persistence.ExpeditionGpsDeviceIdentifierImpl; -import com.sap.sailing.expeditionconnector.persistence.ExpeditionSensorDeviceIdentifier; import com.sap.sailing.expeditionconnector.persistence.ExpeditionSensorDeviceIdentifierImpl; import com.sap.sailing.expeditionconnector.persistence.MongoObjectFactory; import com.sap.sailing.expeditionconnector.persistence.PersistenceFactory; diff --git a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/ExpeditionWindTracker.java b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/ExpeditionWindTracker.java index 42d1ecd472d..843a9e4c798 100755 --- a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/ExpeditionWindTracker.java +++ b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/ExpeditionWindTracker.java @@ -87,7 +87,7 @@ public class ExpeditionWindTracker extends AbstractWindTracker implements Expedi try { Declination declination = declinationService.getDeclination(message.getTimePoint(), lastKnownPositionPerBoatID.get(message.getBoatID()), - /* timeoutForOnlineFetchInMilliseconds */5000); + /* timeoutForOnlineFetchInMilliseconds */500); if (declination != null) { windSpeed = new KnotSpeedWithBearingImpl(windSpeed.getKnots(), new DegreeBearingImpl( windSpeed.getBearing().getDegrees()).add(declination.getBearingCorrectedTo(message.getTimePoint()))); diff --git a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/UDPExpeditionReceiver.java b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/UDPExpeditionReceiver.java index b2401c9bf5e..1b6be99d92a 100755 --- a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/UDPExpeditionReceiver.java +++ b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/UDPExpeditionReceiver.java @@ -13,7 +13,6 @@ import com.sap.sailing.domain.common.tracking.impl.DoubleVectorFixImpl; import com.sap.sailing.domain.racelog.tracking.SensorFixStore; import com.sap.sailing.expeditionconnector.impl.ExpeditionMessageParser; import com.sap.sailing.expeditionconnector.persistence.ExpeditionGpsDeviceIdentifier; -import com.sap.sailing.expeditionconnector.persistence.ExpeditionSensorDeviceIdentifier; import com.sap.sailing.udpconnector.UDPReceiver; /** @@ -110,6 +109,7 @@ public class UDPExpeditionReceiver extends UDPReceiver + diff --git a/java/com.sap.sailing.feature/feature.xml b/java/com.sap.sailing.feature/feature.xml index d934cb4c3fb..4ec77eb88b3 100755 --- a/java/com.sap.sailing.feature/feature.xml +++ b/java/com.sap.sailing.feature/feature.xml @@ -416,4 +416,11 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al version="0.0.0" unpack="false"/> + + diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/LeaderboardPanelMock.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/LeaderboardPanelMock.java index ae1cbeca491..d2933a8ec39 100644 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/LeaderboardPanelMock.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/LeaderboardPanelMock.java @@ -5,6 +5,7 @@ import com.sap.sailing.domain.common.dto.LeaderboardRowDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.gwt.settings.client.leaderboard.MultiRaceLeaderboardSettings; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; +import com.sap.sailing.gwt.ui.client.FlagImageResolverImpl; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.shared.controls.AbstractSortableColumnWithMinMax; @@ -22,7 +23,8 @@ public class LeaderboardPanelMock extends MultiRaceLeaderboardPanel { super(null, null, sailingService, new AsyncActionsExecutor(), new MultiRaceLeaderboardSettings(), new CompetitorSelectionModel( /* hasMultiSelection */true), - leaderboardName, errorReporter, stringMessages, /* showRaceDetails */ true,new ClassicLeaderboardStyle()); + leaderboardName, errorReporter, stringMessages, /* showRaceDetails */ true, new ClassicLeaderboardStyle(), + FlagImageResolverImpl.get()); } @Override diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 2e5b4dfd710..a6398d346fd 100644 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -70,6 +70,7 @@ import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.WindWithConfidence; import com.sap.sailing.domain.tracking.impl.WindTrackImpl; +import com.sap.sse.common.Duration; import com.sap.sse.common.IsManagedByCache; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; @@ -406,6 +407,16 @@ public class MockedTrackedRace implements DynamicTrackedRace { return null; } + @Override + public Distance getDistanceFoiled(Competitor competitor, TimePoint timePoint) { + return null; + } + + @Override + public Duration getDurationFoiled(Competitor competitor, TimePoint timePoint) { + return null; + } + @Override public Distance getWindwardDistanceToCompetitorFarthestAhead(Competitor competitor, TimePoint timePoint, WindPositionMode windPositionMode) { return null; @@ -885,4 +896,10 @@ public class MockedTrackedRace implements DynamicTrackedRace { public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) { return null; } + + @Override + public SpeedWithBearing getVelocityMadeGood(Competitor competitor, TimePoint timePoint, + WindPositionMode windPositionMode, WindLegTypeAndLegBearingCache cache) { + return null; + } } diff --git a/java/com.sap.sailing.gwt.ui/.classpath b/java/com.sap.sailing.gwt.ui/.classpath index 25492d6c805..0c0806e47ed 100644 --- a/java/com.sap.sailing.gwt.ui/.classpath +++ b/java/com.sap.sailing.gwt.ui/.classpath @@ -5,7 +5,6 @@ - diff --git a/java/com.sap.sailing.gwt.ui/.settings/com.google.gwt.eclipse.core.prefs b/java/com.sap.sailing.gwt.ui/.settings/com.google.gwt.eclipse.core.prefs index 921d65007f4..3c1127d3fc9 100755 --- a/java/com.sap.sailing.gwt.ui/.settings/com.google.gwt.eclipse.core.prefs +++ b/java/com.sap.sailing.gwt.ui/.settings/com.google.gwt.eclipse.core.prefs @@ -1,4 +1,4 @@ eclipse.preferences.version=1 entryPointModules= filesCopiedToWebInfLib=gwt-servlet.jar -gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDE1IC1zdHJpY3QgLWxvZ0xldmVsIFRSQUNFXV0+PC9leHRyYS1hcmdzPjx2bS1hcmdzPjwhW0NEQVRBWy1YbXgyMDI0bSAtRGd3dC51c2VhcmNoaXZlcz1mYWxzZV1dPjwvdm0tYXJncz48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuQWRtaW5Db25zb2xlPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLlJhY2VCb2FyZDwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC5ob21lLkhvbWU8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuTGVhZGVyYm9hcmRFZGl0aW5nPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLkxlYWRlcmJvYXJkPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnJlZ2F0dGFvdmVydmlldy5SZWdhdHRhT3ZlcnZpZXc8L2VudHJ5LXBvaW50LW1vZHVsZT48L2d3dC1jb21waWxlLXNldHRpbmdzPg\=\= +gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDE1IC1zdHJpY3QgLWxvZ0xldmVsIFRSQUNFIC1YZnJhZ21lbnRDb3VudCA0XV0+PC9leHRyYS1hcmdzPjx2bS1hcmdzPjwhW0NEQVRBWy1YbXgyMDI0bSAtRGd3dC51c2VhcmNoaXZlcz1mYWxzZV1dPjwvdm0tYXJncz48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuQWRtaW5Db25zb2xlPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLlJhY2VCb2FyZDwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC5ob21lLkhvbWU8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuTGVhZGVyYm9hcmRFZGl0aW5nPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLkxlYWRlcmJvYXJkPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnJlZ2F0dGFvdmVydmlldy5SZWdhdHRhT3ZlcnZpZXc8L2VudHJ5LXBvaW50LW1vZHVsZT48L2d3dC1jb21waWxlLXNldHRpbmdzPg\=\= diff --git a/java/com.sap.sailing.gwt.ui/AdminConsole.css b/java/com.sap.sailing.gwt.ui/AdminConsole.css index 15c8f269e5a..9e65fc5bcdc 100644 --- a/java/com.sap.sailing.gwt.ui/AdminConsole.css +++ b/java/com.sap.sailing.gwt.ui/AdminConsole.css @@ -80,10 +80,6 @@ fieldset legend { color: #FF0000; } -.linkNoBorder { - border: none; -} - .refreshLink { border: none; position: relative; @@ -95,11 +91,6 @@ fieldset legend { vertical-align: middle; } -.boldLabel { - font-size: 14px; - font-weight: bold; -} - .boldAnchor { font-weight: bold; vertical-align: middle; diff --git a/java/com.sap.sailing.gwt.ui/AdminConsole.html b/java/com.sap.sailing.gwt.ui/AdminConsole.html index d170f37244a..d190c40335c 100644 --- a/java/com.sap.sailing.gwt.ui/AdminConsole.html +++ b/java/com.sap.sailing.gwt.ui/AdminConsole.html @@ -26,8 +26,6 @@ - - diff --git a/java/com.sap.sailing.gwt.ui/AdminConsoleDateTimePicker.css b/java/com.sap.sailing.gwt.ui/AdminConsoleDateTimePicker.css deleted file mode 100644 index f93eb68fa0b..00000000000 --- a/java/com.sap.sailing.gwt.ui/AdminConsoleDateTimePicker.css +++ /dev/null @@ -1,88 +0,0 @@ -/*! - * Extracted from Bootstrap v3.0.2 by @fat and @mdo - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - list-style: none; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.428571429; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/AdminConsoleProgressBar.css b/java/com.sap.sailing.gwt.ui/AdminConsoleProgressBar.css deleted file mode 100644 index 334d55d5173..00000000000 --- a/java/com.sap.sailing.gwt.ui/AdminConsoleProgressBar.css +++ /dev/null @@ -1,226 +0,0 @@ -/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.clearfix:after { - clear: both; -} -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 100%; - color: #ffffff; - float: left; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); -} -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} diff --git a/java/com.sap.sailing.gwt.ui/DataMining.css b/java/com.sap.sailing.gwt.ui/DataMining.css index 5f52d30e4ad..d6f22a64cb9 100644 --- a/java/com.sap.sailing.gwt.ui/DataMining.css +++ b/java/com.sap.sailing.gwt.ui/DataMining.css @@ -109,23 +109,6 @@ table { margin: 0 12px 18px 12px; } -.sapLogo { - float: left; - margin: 13px 0 0 12px; -} - -.sailingAnalyticsLabelPanel { - margin: 10px 0 0 0; -} - -.sailingAnalyticsLabel { - float: left; - color: #fff; - font-size: 14px; - font-weight: bold; - margin: 15px 0 0 0; -} - .leaderboardLabel { border-bottom: 2px solid #007dc0; font-weight: bold; diff --git a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF index 3d652f0ac0f..727f66c89e5 100644 --- a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF @@ -69,8 +69,7 @@ Import-Package: javax.servlet;version="3.1.0", Web-ContextPath: /gwt Bundle-ClassPath: WEB-INF/classes/, WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar, - WEB-INF/lib/gwt-ajaxloader.jar, - WEB-INF/lib/gwt-bootstrap-2.3.2.0.jar + WEB-INF/lib/gwt-ajaxloader.jar TrackLifecycle: true Export-Package: com.google.gwt.user.client.rpc.core.com.sap.sailing.domain.common.confidence.impl, com.google.gwt.user.client.rpc.core.com.sap.sailing.domain.common.impl, diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT.launch b/java/com.sap.sailing.gwt.ui/SailingGWT.launch index 3ec300f1256..482871f0a61 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT.launch @@ -53,6 +53,8 @@ + + diff --git a/java/com.sap.sailing.gwt.ui/Simulator.css b/java/com.sap.sailing.gwt.ui/Simulator.css index 0f78295f104..ba0f5ccc33e 100644 --- a/java/com.sap.sailing.gwt.ui/Simulator.css +++ b/java/com.sap.sailing.gwt.ui/Simulator.css @@ -27,22 +27,6 @@ html { font-size: 15px; } -.titleLabelWrapper { - position: relative; - margin-left: auto; - margin-right: auto; - width: 50%; -} - -.titleLabel { - text-align: center; - font-family: 'Open Sans', Arial, Verdana, sans-serif; - font-weight: 600 - font-size: 18px; - color: #fff; - margin: 23px 0 0 0; -} - body { background: #ebebeb; font-family: 'Open Sans', Arial, Verdana, sans-serif; @@ -81,31 +65,11 @@ table { border-collapse: separate; } -/*.RaceBoardHeaderPanel { - margin: 0 12px 14px 12px; -}*/ -.sapLogo { - float: left; - margin: 13px 0 0 12px; -} - .pioLogo { float: right; margin: 11px 20px 0 12px; } -.sailingAnalyticsLabelPanel { - margin: 10px 0 0 0; -} - -.sailingAnalyticsLabel { - float: left; - color: #fff; - font-size: 14px; - font-weight: bold; - margin: 15px 0 0 0; -} - .timePanelSettings { display: none; } diff --git a/java/com.sap.sailing.gwt.ui/Spectator.css b/java/com.sap.sailing.gwt.ui/Spectator.css index 6f55fe4310c..277654681e4 100644 --- a/java/com.sap.sailing.gwt.ui/Spectator.css +++ b/java/com.sap.sailing.gwt.ui/Spectator.css @@ -96,23 +96,6 @@ table { margin: 0 12px 18px 12px; } -.sapLogo { - float: left; - margin: 13px 0 0 12px; -} - -.sailingAnalyticsLabelPanel { - margin: 10px 0 0 0; -} - -.sailingAnalyticsLabel { - float: left; - color: #fff; - font-size: 14px; - font-weight: bold; - margin: 15px 0 0 0; -} - .leaderboardLabel { border-bottom: 2px solid #007dc0; font-weight: bold; diff --git a/java/com.sap.sailing.gwt.ui/WEB-INF/web.xml b/java/com.sap.sailing.gwt.ui/WEB-INF/web.xml index 2dd07f89431..8538c7b0804 100755 --- a/java/com.sap.sailing.gwt.ui/WEB-INF/web.xml +++ b/java/com.sap.sailing.gwt.ui/WEB-INF/web.xml @@ -53,6 +53,15 @@ /* + + LocaleInjectionFilter + com.sap.sse.security.ui.server.LocaleInjectionFilter + + + LocaleInjectionFilter + *.html + + Sailing Service SailingService diff --git a/java/com.sap.sailing.gwt.ui/build.properties b/java/com.sap.sailing.gwt.ui/build.properties index af3bac71c6f..fde222c526b 100644 --- a/java/com.sap.sailing.gwt.ui/build.properties +++ b/java/com.sap.sailing.gwt.ui/build.properties @@ -37,10 +37,8 @@ bin.includes = META-INF/,\ com.sap.sailing.gwt.ui.DataMining/,\ DataMining.css,\ DataMining.html,\ - AdminConsoleDateTimePicker.css,\ qrcode/,\ js/,\ - AdminConsoleProgressBar.css,\ AutoPlay.css,\ AutoPlay.html,\ Home.css,\ diff --git a/java/com.sap.sailing.gwt.ui/images/close.png b/java/com.sap.sailing.gwt.ui/images/close.png deleted file mode 100755 index ed7e8b88a36..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/close.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/dialogBox-bg.png b/java/com.sap.sailing.gwt.ui/images/dialogBox-bg.png deleted file mode 100644 index 720ad5597ea..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/dialogBox-bg.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/dots-vertical.png b/java/com.sap.sailing.gwt.ui/images/dots-vertical.png deleted file mode 100755 index fd2521a195d..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/dots-vertical.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/facebook-icon.png b/java/com.sap.sailing.gwt.ui/images/facebook-icon.png deleted file mode 100755 index f92eea547fc..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/facebook-icon.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/functionBar_bg.png b/java/com.sap.sailing.gwt.ui/images/functionBar_bg.png deleted file mode 100644 index 80320be7d08..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/functionBar_bg.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/appstore.png b/java/com.sap.sailing.gwt.ui/images/home/appstore.png deleted file mode 100644 index e57e024dc21..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/appstore.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/arrow-grey-right.png b/java/com.sap.sailing.gwt.ui/images/home/arrow-grey-right.png deleted file mode 100644 index cb174da3416..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/arrow-grey-right.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/autoplay.svg b/java/com.sap.sailing.gwt.ui/images/home/autoplay.svg deleted file mode 100644 index 2ef3036f68d..00000000000 --- a/java/com.sap.sailing.gwt.ui/images/home/autoplay.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - diff --git a/java/com.sap.sailing.gwt.ui/images/home/banner-background.jpg b/java/com.sap.sailing.gwt.ui/images/home/banner-background.jpg deleted file mode 100755 index 952cd2dcf53..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/banner-background.jpg and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/breadcrumb-arrow.png b/java/com.sap.sailing.gwt.ui/images/home/breadcrumb-arrow.png deleted file mode 100644 index 2c456ead3a9..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/breadcrumb-arrow.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/busy_indicator.gif b/java/com.sap.sailing.gwt.ui/images/home/busy_indicator.gif deleted file mode 100644 index ed72b117dd9..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/busy_indicator.gif and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/dropdown__button--arrow@2x.png b/java/com.sap.sailing.gwt.ui/images/home/dropdown__button--arrow@2x.png deleted file mode 100644 index 5ec5ecafb08..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/dropdown__button--arrow@2x.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/email-icon.png b/java/com.sap.sailing.gwt.ui/images/home/email-icon.png deleted file mode 100644 index 5622438bc2b..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/email-icon.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/facebook-icon.png b/java/com.sap.sailing.gwt.ui/images/home/facebook-icon.png deleted file mode 100644 index f92eea547fc..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/facebook-icon.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/facebook.svg b/java/com.sap.sailing.gwt.ui/images/home/facebook.svg deleted file mode 100644 index c12e1f9afed..00000000000 --- a/java/com.sap.sailing.gwt.ui/images/home/facebook.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/images/home/fleet-icon.png b/java/com.sap.sailing.gwt.ui/images/home/fleet-icon.png deleted file mode 100644 index a8d5e1952e9..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/fleet-icon.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/race-features-icons.png b/java/com.sap.sailing.gwt.ui/images/home/race-features-icons.png deleted file mode 100644 index a8129e7dfe5..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/race-features-icons.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/regatta-boatclass_sample.png b/java/com.sap.sailing.gwt.ui/images/home/regatta-boatclass_sample.png deleted file mode 100644 index 16dac33ad73..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/regatta-boatclass_sample.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/search-icon@2x.png b/java/com.sap.sailing.gwt.ui/images/home/search-icon@2x.png deleted file mode 100644 index 9a9c7f5b691..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/search-icon@2x.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/skip-forward.png b/java/com.sap.sailing.gwt.ui/images/home/skip-forward.png deleted file mode 100644 index 4567a884622..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/skip-forward.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/solutions-post-trimmed.png b/java/com.sap.sailing.gwt.ui/images/home/solutions-post-trimmed.png deleted file mode 100644 index afd31c1255c..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/solutions-post-trimmed.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/solutions-race.png b/java/com.sap.sailing.gwt.ui/images/home/solutions-race.png deleted file mode 100644 index 8669f2b2461..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/solutions-race.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/solutions-sap-trimmed.png b/java/com.sap.sailing.gwt.ui/images/home/solutions-sap-trimmed.png deleted file mode 100644 index d835a09e7ec..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/solutions-sap-trimmed.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/solutions-simulator-trimmed.png b/java/com.sap.sailing.gwt.ui/images/home/solutions-simulator-trimmed.png deleted file mode 100644 index 522e7eeedd4..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/solutions-simulator-trimmed.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/twitter-icon.png b/java/com.sap.sailing.gwt.ui/images/home/twitter-icon.png deleted file mode 100644 index 3777d29b9bd..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/twitter-icon.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/home/x_lightbox.png b/java/com.sap.sailing.gwt.ui/images/home/x_lightbox.png deleted file mode 100644 index 108bc616c66..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/home/x_lightbox.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/location-icon.png b/java/com.sap.sailing.gwt.ui/images/location-icon.png deleted file mode 100755 index 737b6e4e2d0..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/location-icon.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/arrow-down-grey.png b/java/com.sap.sailing.gwt.ui/images/mobile/arrow-down-grey.png deleted file mode 100644 index 85a2c447304..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/arrow-down-grey.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/arrow-grey-right.png b/java/com.sap.sailing.gwt.ui/images/mobile/arrow-grey-right.png deleted file mode 100644 index cb174da3416..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/arrow-grey-right.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-post-trimmed.png b/java/com.sap.sailing.gwt.ui/images/mobile/solutions-post-trimmed.png deleted file mode 100644 index afd31c1255c..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-post-trimmed.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-post.png b/java/com.sap.sailing.gwt.ui/images/mobile/solutions-post.png deleted file mode 100644 index 181ffb806e1..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-post.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-race.png b/java/com.sap.sailing.gwt.ui/images/mobile/solutions-race.png deleted file mode 100644 index 04d33096e98..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-race.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-in-sailing.jpg b/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-in-sailing.jpg deleted file mode 100644 index 21e0e622b58..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-in-sailing.jpg and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-sailing-buoy-pinger.png b/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-sailing-buoy-pinger.png deleted file mode 100644 index 9268583d7c9..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-sailing-buoy-pinger.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-sailing-insight.png b/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-sailing-insight.png deleted file mode 100644 index 950a8dc9b6d..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-sailing-insight.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-trimmed.png b/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-trimmed.png deleted file mode 100644 index 7ddb8892e5c..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap-trimmed.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap.png b/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap.png deleted file mode 100644 index be54e426e8e..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-sap.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-simulator.png b/java/com.sap.sailing.gwt.ui/images/mobile/solutions-simulator.png deleted file mode 100644 index 9123f6fccaf..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-simulator.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-training.png b/java/com.sap.sailing.gwt.ui/images/mobile/solutions-training.png deleted file mode 100644 index f3369a8714a..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-training.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/open.png b/java/com.sap.sailing.gwt.ui/images/open.png deleted file mode 100755 index 188ce723171..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/open.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/play-icon.png b/java/com.sap.sailing.gwt.ui/images/play-icon.png deleted file mode 100755 index 036ad2ddd79..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/play-icon.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/regatta-finished-icon.png b/java/com.sap.sailing.gwt.ui/images/regatta-finished-icon.png deleted file mode 100755 index ef28e315fa8..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/regatta-finished-icon.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/regatta-upcoming-icon.png b/java/com.sap.sailing.gwt.ui/images/regatta-upcoming-icon.png deleted file mode 100755 index 6b9c5eeb4d1..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/regatta-upcoming-icon.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/sap_66_transparent.png b/java/com.sap.sailing.gwt.ui/images/sap_66_transparent.png deleted file mode 100644 index 7e76e7fcf00..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/sap_66_transparent.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/settings.png b/java/com.sap.sailing.gwt.ui/images/settings.png deleted file mode 100644 index 6944926cdd9..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/settings.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/settingsDialog_bg.png b/java/com.sap.sailing.gwt.ui/images/settingsDialog_bg.png deleted file mode 100644 index 45f519b30b8..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/settingsDialog_bg.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/settings_black.png b/java/com.sap.sailing.gwt.ui/images/settings_black.png deleted file mode 100644 index a1969e23b01..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/settings_black.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/timeslider-speed.png b/java/com.sap.sailing.gwt.ui/images/timeslider-speed.png deleted file mode 100644 index 7c681a73bc7..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/timeslider-speed.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/titleLabelInner.png b/java/com.sap.sailing.gwt.ui/images/titleLabelInner.png deleted file mode 100644 index 04c78e98c3c..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/titleLabelInner.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/titleLabelWrapper.png b/java/com.sap.sailing.gwt.ui/images/titleLabelWrapper.png deleted file mode 100644 index 3881f73df40..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/titleLabelWrapper.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/twitter-icon.png b/java/com.sap.sailing.gwt.ui/images/twitter-icon.png deleted file mode 100755 index 3777d29b9bd..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/twitter-icon.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/weather-sunny.png b/java/com.sap.sailing.gwt.ui/images/weather-sunny.png deleted file mode 100755 index 010b1a5eccc..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/weather-sunny.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/weather-wind-direction.png b/java/com.sap.sailing.gwt.ui/images/weather-wind-direction.png deleted file mode 100755 index b293914c8a2..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/weather-wind-direction.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/images/weather-wind-speed.png b/java/com.sap.sailing.gwt.ui/images/weather-wind-speed.png deleted file mode 100755 index 7273e44e1c3..00000000000 Binary files a/java/com.sap.sailing.gwt.ui/images/weather-wind-speed.png and /dev/null differ diff --git a/java/com.sap.sailing.gwt.ui/imprint.json b/java/com.sap.sailing.gwt.ui/imprint.json index fd013e42c97..d2d6b2ff763 100644 --- a/java/com.sap.sailing.gwt.ui/imprint.json +++ b/java/com.sap.sailing.gwt.ui/imprint.json @@ -333,16 +333,6 @@ ], "key": "ASL2.0" }, - { - "name": "GWT-Bootstrap", - "version": "2.3.2.0", - "owner": "GWT-Bootstrap", - "homepage": "http://gwtbootstrap.github.com/", - "acknowledgements": [ - "Copyright ${year} GWT-Bootstrap" - ], - "key": "ASL2.0" - }, { "name": "gwt-google-apis", "version": "ajaxloader-svn", diff --git a/java/com.sap.sailing.gwt.ui/pom.xml b/java/com.sap.sailing.gwt.ui/pom.xml index 101dc398344..4bb1324f74d 100755 --- a/java/com.sap.sailing.gwt.ui/pom.xml +++ b/java/com.sap.sailing.gwt.ui/pom.xml @@ -104,12 +104,6 @@ ${project.version} sources - - com.github.gwtbootstrap - gwt-bootstrap - 2.3.2.0 - provided - com.sap.sailing com.sap.sse.security.common diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/AutoPlay.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/AutoPlay.gwt.xml index f073808c231..9f476194374 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/AutoPlay.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/AutoPlay.gwt.xml @@ -17,10 +17,6 @@ - - - - diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/nodes/IdleOverallLeaderBoardNode.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/nodes/IdleOverallLeaderBoardNode.java index acc4837e2ab..ac6488a3e9d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/nodes/IdleOverallLeaderBoardNode.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/nodes/IdleOverallLeaderBoardNode.java @@ -14,6 +14,7 @@ import com.sap.sailing.gwt.settings.client.leaderboard.MultiRaceLeaderboardSetti import com.sap.sailing.gwt.settings.client.leaderboard.RaceColumnSelectionStrategies; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; +import com.sap.sailing.gwt.ui.client.FlagImageResolverImpl; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardEntryPoint; import com.sap.sailing.gwt.ui.leaderboard.MultiRaceLeaderboardPanel; @@ -61,9 +62,11 @@ public class IdleOverallLeaderBoardNode extends FiresPlaceNode { String overallLeaderboardName = result.get(0); CompetitorSelectionProvider provider = new CompetitorSelectionModel(true); - MultiRaceLeaderboardPanel leaderboardPanel = new MultiRaceLeaderboardPanel(null,null,cf.getSailingService(), - new AsyncActionsExecutor(), leaderboardSettings,false, provider,timer,null, overallLeaderboardName, cf.getErrorReporter(), - StringMessages.INSTANCE, false,null,false,null,false,true,false,false,false,new SixtyInchLeaderBoardStyle(true)); + MultiRaceLeaderboardPanel leaderboardPanel = new MultiRaceLeaderboardPanel(null, null, + cf.getSailingService(), new AsyncActionsExecutor(), leaderboardSettings, false, + provider, timer, null, overallLeaderboardName, cf.getErrorReporter(), + StringMessages.INSTANCE, false, null, false, null, false, true, false, false, false, + new SixtyInchLeaderBoardStyle(true), FlagImageResolverImpl.get()); IdleOverallLeaderBoardPlace place = new IdleOverallLeaderBoardPlace(leaderboardPanel); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/afterliveraceloop/boats/RaceEndWithBoatsPresenterImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/afterliveraceloop/boats/RaceEndWithBoatsPresenterImpl.java index 366dc900ead..18aa4de50ec 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/afterliveraceloop/boats/RaceEndWithBoatsPresenterImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/afterliveraceloop/boats/RaceEndWithBoatsPresenterImpl.java @@ -15,6 +15,7 @@ import com.sap.sailing.gwt.autoplay.client.app.AutoPlayPresenterConfigured; import com.sap.sailing.gwt.autoplay.client.events.AutoPlayHeaderEvent; import com.sap.sailing.gwt.settings.client.leaderboard.SingleRaceLeaderboardSettings; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; +import com.sap.sailing.gwt.ui.client.FlagImageResolverImpl; import com.sap.sailing.gwt.ui.client.LeaderboardUpdateListener; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; @@ -69,7 +70,8 @@ public class RaceEndWithBoatsPresenterImpl extends AutoPlayPresenterConfigured + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResolver.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResolver.java index c88495e58d6..0fe92e2e587 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResolver.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResolver.java @@ -123,6 +123,7 @@ public class BoatClassImageResolver { boatClassIconsMap.put(BoatClassMasterdata.TEENY.getDisplayName(), imageResources.TeenyIcon()); boatClassIconsMap.put(BoatClassMasterdata.TORNADO.getDisplayName(), imageResources.TornadoIcon()); boatClassIconsMap.put(BoatClassMasterdata.TOM_28_MAX.getDisplayName(), imageResources.Tom28MaxIcon()); + boatClassIconsMap.put(BoatClassMasterdata.TP52.getDisplayName(), imageResources.TP52Icon()); boatClassIconsMap.put(BoatClassMasterdata.TRIAS.getDisplayName(), imageResources.TriasIcon()); boatClassIconsMap.put(BoatClassMasterdata.VIPER_640.getDisplayName(), imageResources.Viper640Icon()); boatClassIconsMap.put(BoatClassMasterdata.VX_ONE.getDisplayName(), imageResources.VXOneIcon()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResources.java index b249b1829a9..381d64107d4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResources.java @@ -3,316 +3,424 @@ package com.sap.sailing.gwt.common.client; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.resources.client.ImageResource.ImageOptions; public interface BoatClassImageResources extends ClientBundle { public static final BoatClassImageResources INSTANCE = GWT.create(BoatClassImageResources.class); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/GENERIC_BOATCLASS.png") + @ImageOptions(preventInlining = true) ImageResource genericBoatClass(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/12MR.png") + @ImageOptions(preventInlining = true) ImageResource _12mRIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/18FOOTER.png") + @ImageOptions(preventInlining = true) ImageResource _18FooterIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/2_4M.png") + @ImageOptions(preventInlining = true) ImageResource _2_4mIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/29ER.png") + @ImageOptions(preventInlining = true) ImageResource _29erIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/420.png") + @ImageOptions(preventInlining = true) ImageResource _420Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/470.png") + @ImageOptions(preventInlining = true) ImageResource _470Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/49ER_FX.png") + @ImageOptions(preventInlining = true) ImageResource _49erFXIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/49ER.png") + @ImageOptions(preventInlining = true) ImageResource _49erIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/505.png") + @ImageOptions(preventInlining = true) ImageResource _505mIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/5.5mR.png") + @ImageOptions(preventInlining = true) ImageResource _5_5MRIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/6MR.png") + @ImageOptions(preventInlining = true) ImageResource _6MRIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/8MR.png") + @ImageOptions(preventInlining = true) ImageResource _8MRIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/A_CAT.png") + @ImageOptions(preventInlining = true) ImageResource A_CatIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/ALBIN_EXPRESS.png") + @ImageOptions(preventInlining = true) ImageResource AlbinExpressIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/ALBIN_BALLAD.png") + @ImageOptions(preventInlining = true) ImageResource AlbinBalladIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/B_ONE.png") + @ImageOptions(preventInlining = true) ImageResource BOne(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/CADET.png") + @ImageOptions(preventInlining = true) ImageResource CadetIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/CANOE_IC.png") + @ImageOptions(preventInlining = true) ImageResource CanoeICIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/CANOE_TAIFUN.png") + @ImageOptions(preventInlining = true) ImageResource CanoeTaifunIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/CONTENDER.png") + @ImageOptions(preventInlining = true) ImageResource ContenderIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/DRAGON.png") + @ImageOptions(preventInlining = true) ImageResource DragonIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/EUROPE.png") + @ImageOptions(preventInlining = true) ImageResource EuropeIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/EXTREME40.png") + @ImageOptions(preventInlining = true) ImageResource Extreme40Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/D35.png") + @ImageOptions(preventInlining = true) ImageResource D35Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/DELPHIA_24.png") + @ImageOptions(preventInlining = true) ImageResource Delphia24Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/F16.png") + @ImageOptions(preventInlining = true) ImageResource F16Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/F18.png") + @ImageOptions(preventInlining = true) ImageResource F18Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/FARR_30.png") + @ImageOptions(preventInlining = true) ImageResource Farr30Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/FARR_280.png") + @ImageOptions(preventInlining = true) ImageResource Farr280Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/FINN.png") + @ImageOptions(preventInlining = true) ImageResource FinnIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/FLYING_DUTCHMAN.png") + @ImageOptions(preventInlining = true) ImageResource FlyingDutchmanIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/FOLKBOAT.png") + @ImageOptions(preventInlining = true) ImageResource FolkBoatIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/FUN.png") + @ImageOptions(preventInlining = true) ImageResource FUNIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/H_BOAT.png") + @ImageOptions(preventInlining = true) ImageResource H_BoatIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/HANSA_303.png") + @ImageOptions(preventInlining = true) ImageResource Hansa303Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/HOBIE.png") + @ImageOptions(preventInlining = true) ImageResource HobieIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/J22.png") + @ImageOptions(preventInlining = true) ImageResource J22Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/J24.png") + @ImageOptions(preventInlining = true) ImageResource J24Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/J70.png") + @ImageOptions(preventInlining = true) ImageResource J70Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/J80.png") + @ImageOptions(preventInlining = true) ImageResource J80Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/J88.png") - ImageResource J88Icon(); + @ImageOptions(preventInlining = true) + ImageResource J88Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/J105.png") + @ImageOptions(preventInlining = true) ImageResource J105Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/J111.png") + @ImageOptions(preventInlining = true) ImageResource J111Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/LASER2.png") + @ImageOptions(preventInlining = true) ImageResource Laser2Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/LASER_SB3.png") + @ImageOptions(preventInlining = true) ImageResource LaserSB3Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/LASER.png") + @ImageOptions(preventInlining = true) ImageResource LaserIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/LAGO_26.png") + @ImageOptions(preventInlining = true) ImageResource Lago26Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/LONGTZE.png") + @ImageOptions(preventInlining = true) ImageResource LongtzeIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/M32.png") + @ImageOptions(preventInlining = true) ImageResource M32Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/MELGES_20.png") + @ImageOptions(preventInlining = true) ImageResource Melges20Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/MELGES_24.png") + @ImageOptions(preventInlining = true) ImageResource Melges24Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/MINI_TRANSAT.png") + @ImageOptions(preventInlining = true) ImageResource MiniTransatIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/MUSTO_SKIFF.png") + @ImageOptions(preventInlining = true) ImageResource MustoSkiffIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/NACRA_15.png") + @ImageOptions(preventInlining = true) ImageResource Nacra15Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/NACRA_17.png") + @ImageOptions(preventInlining = true) ImageResource Nacra17Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/OK.png") + @ImageOptions(preventInlining = true) ImageResource OKIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/OPTIMIST.png") + @ImageOptions(preventInlining = true) ImageResource OptimistIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/PIRAT.png") + @ImageOptions(preventInlining = true) ImageResource PiratIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/PLATU_25.png") + @ImageOptions(preventInlining = true) ImageResource Platu25Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/RS_X.png") + @ImageOptions(preventInlining = true) ImageResource RSXIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/RS_FEVA.png") + @ImageOptions(preventInlining = true) ImageResource RSFevaIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/SONAR.png") + @ImageOptions(preventInlining = true) ImageResource SonarIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/SKUD18.png") + @ImageOptions(preventInlining = true) ImageResource Skud18Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/SOLING.png") + @ImageOptions(preventInlining = true) ImageResource SolingIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/STAR.png") + @ImageOptions(preventInlining = true) ImageResource StarIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/STREAMLINE.png") + @ImageOptions(preventInlining = true) ImageResource StreamlineIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/SUNBEAM22.png") + @ImageOptions(preventInlining = true) ImageResource Sunbeam22Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/SWAN_45.png") + @ImageOptions(preventInlining = true) ImageResource Swan45Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/TECHNO_293.png") + @ImageOptions(preventInlining = true) ImageResource Techno293Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/TECHNO_293_PLUS.png") + @ImageOptions(preventInlining = true) ImageResource Techno293PlusIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/TEENY.png") + @ImageOptions(preventInlining = true) ImageResource TeenyIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/TORNADO.png") + @ImageOptions(preventInlining = true) ImageResource TornadoIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/X_99.png") + @ImageOptions(preventInlining = true) ImageResource X99Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/DYAS.png") + @ImageOptions(preventInlining = true) ImageResource DyasIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/INTERNATIONAL_14.png") + @ImageOptions(preventInlining = true) ImageResource International14Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/OPENBIC.png") + @ImageOptions(preventInlining = true) ImageResource OpenBicIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/RS100.png") + @ImageOptions(preventInlining = true) ImageResource RS100Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/RS200.png") + @ImageOptions(preventInlining = true) ImageResource RS200Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/RS400.png") + @ImageOptions(preventInlining = true) ImageResource RS400Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/RS500.png") + @ImageOptions(preventInlining = true) ImageResource RS500Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/RS800.png") + @ImageOptions(preventInlining = true) ImageResource RS800Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/RSAERO.png") + @ImageOptions(preventInlining = true) ImageResource RSAEROIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/SPLASH_BLUE.png") + @ImageOptions(preventInlining = true) ImageResource SplashBlueIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/SPLASH_RED.png") + @ImageOptions(preventInlining = true) ImageResource SplashRedIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/SPLASH_GREEN.png") + @ImageOptions(preventInlining = true) ImageResource SplashGreenIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/ORC.png") + @ImageOptions(preventInlining = true) ImageResource ORCIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/PHRF.png") + @ImageOptions(preventInlining = true) ImageResource PHRFIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/KIELZUGVOGEL.png") + @ImageOptions(preventInlining = true) ImageResource KielzugvogelIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/FORMULA_KITE.png") + @ImageOptions(preventInlining = true) ImageResource FormulaKiteIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/TRIAS.png") + @ImageOptions(preventInlining = true) ImageResource TriasIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/O_JOLLE.png") + @ImageOptions(preventInlining = true) ImageResource OJolleIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/D_ONE.png") + @ImageOptions(preventInlining = true) ImageResource DOneIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/PWA.png") + @ImageOptions(preventInlining = true) ImageResource PWAIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/GC_32.png") + @ImageOptions(preventInlining = true) ImageResource GC32Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/CC_30.png") + @ImageOptions(preventInlining = true) ImageResource CC30Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/GP_26.png") + @ImageOptions(preventInlining = true) ImageResource GP26Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/VX_ONE.png") + @ImageOptions(preventInlining = true) ImageResource VXOneIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/TARTAN_10.png") + @ImageOptions(preventInlining = true) ImageResource Tartan10Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/VIPER_640.png") + @ImageOptions(preventInlining = true) ImageResource Viper640Icon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/WETA.png") + @ImageOptions(preventInlining = true) ImageResource WetaIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/TOM_28_MAX.png") + @ImageOptions(preventInlining = true) ImageResource Tom28MaxIcon(); + @Source("com/sap/sailing/gwt/ui/client/images/boatclass/TP52.png") + @ImageOptions(preventInlining = true) + ImageResource TP52Icon(); + @Source("com/sap/sailing/gwt/ui/client/images/boatclass/RUNNING.png") - ImageResource RunningIcon(); + @ImageOptions(preventInlining = true) + ImageResource RunningIcon(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java index 0574c017fda..632aa741b60 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java @@ -3,9 +3,10 @@ package com.sap.sailing.gwt.common.client; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.sap.sse.gwt.common.CommonIcons; import com.sap.sse.gwt.common.CommonSharedResources; -public interface SharedResources extends ClientBundle, CommonSharedResources { +public interface SharedResources extends ClientBundle, CommonSharedResources, CommonIcons { public static final SharedResources INSTANCE = GWT.create(SharedResources.class); @Source("main.gss") @@ -26,8 +27,6 @@ public interface SharedResources extends ClientBundle, CommonSharedResources { String buttonprimary(); String buttonprimaryoutlined(); String buttonred(); - String buttonrefresh(); - String buttonarrowdown(); String buttonsearch(); String buttonarrowrightwhite(); String label(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/main.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/main.gss index 2c330d72467..66240e21313 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/main.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/main.gss @@ -145,23 +145,8 @@ figcaption { .buttonred:hover { background-color: #d54115; } -.buttonrefresh { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAppJREFUeNrsl09o03AUx9MEi0rXSuhE66wMKoO5YlXYUc966NF5sB4UOoUdFXYdDnYaCj2VFobCpoeo61xZKQrCGIjt2jlxQ0vr0vWwTdYmzZImTZrnwSbUSbemW4tIHuTy4/d4n9/393t/YgAA5F82gw6oA+qAOqAO+J8DFt+etBrPee6gpp4e7ITLhRgwtEItLcnMyqqYI4iOG2T2QAEAoKmPnraYhbTfD3uZLIlCJhigZzqtzcZpyomJOvsqXG59N49USCalfDwmSxxbu15hSZJ5d+VyWwCLYbtd5rc2Vah8PMYuuN0UgaHKHorAUHbB7a4wqZQqprC9XZxzOFoOSBEYWiYnJwEAhJTPVwv21zN4feyokPL51MNQy5+pV0Zjy6+YIjCUW/R6G91fXnv+TIHkEg/utwywtPzooRYwVckQjstlqgAAIP6cn28JYOnL8HCzKgAAImSCASWztWS1ZjgVMjk0pAWQi9+7q/gy7/v7G/VD96uTTPRCL3q8u1vaiESUNWkjEsHMTicTOe/Yt5DPnj5VSgx6MYvrkrJmtHs8pcSglwl32Q6tUO98uHZVVe+3Gg378qtjY7tvgP/+9MmhvkE6hOMgSyIAQDUrNb1BfmX0sVY4zVlczUCQRYahQziuGfLryIgWOM2A7CfPbUWFcvbli4b9Pg7cbEsvpggMlQrJpAIpZIIB+o3JtNf+qmLAfxsfb08vnnM4antxZSeTrteLpXw8pvZifmuzOHvG1r5phiXJPycrjpXy8VitwuohuNw6E3X2tW3cAgCEnum0Cmm/X8nseib8mJigpy3mZuMceKJmwl22I2cHbmEW10XU3NuLIAhSKSwm5FKWFLNTUx3XM2v6P4kOqAPqgDqgDqgD1rVfAwAVWx4m+SNozQAAAABJRU5ErkJggg=="); -} -.buttonrefresh, -.buttonarrowdown { - background-repeat: no-repeat; - background-position: left top; - background-size: cover; - width: 2.333333333333333em; - height: 0; - padding: 2.333333333333333em 0 0 0; - border: 0; - overflow: hidden; - white-space: nowrap; -} .buttonsearch { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2NTg0MEE1MTVFN0UxMUU0QkNGMTk0Q0UzOUEwNUNFMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2NTg0MEE1MjVFN0UxMUU0QkNGMTk0Q0UzOUEwNUNFMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjY1ODQwQTRGNUU3RTExRTRCQ0YxOTRDRTM5QTA1Q0UzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjY1ODQwQTUwNUU3RTExRTRCQ0YxOTRDRTM5QTA1Q0UzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+tERf2gAAArFJREFUeNrMmE1kXFEUx28SwjAMjxCGIQwhzCoMQysVugqlhJBVyCqLbELpqtmEUFJddZFNFhVSpd20uqgw1VIhixgSIqREYiKRSExkhNTruZzhOO5999737m3m8DdzZt6773fP/Trn9cRxLBysD/QUNAaKQEP4eQI6xc/voN/Cl0lAC1VBG6Cr2M6aoHegkmX7WpkuKIPW4/R2B1oBRSEAJ0G3BoAz0DaoZbjuGEfBG+CS5kG7oFegiua+MYxYU3Gv7OyUD0AV3CFo2qHhHGhBM2efZQGcUjT4ER+YZg7JRbLF2msljEAiYFkx515nXYXYuS+s3QNQvyvghiJywpPyoAZr/4ULYFXRw5xHQKkh3HY6dmGz/fTifv2S7d+LoLbwa39Ab4gvT6BZm5MkYj3b9Rw5qojN84ZNBB+B+gnzexHOLvGs7lgFVEy6oQNI7asIax+YP2oCLBP/BrQXGHCH+RUT4ADxZcr0NzDgEfMLJsA88dsivN0wP2cCvCZ+/j8ARsw/NwGeEr+IWXNIK7kC7hNfbje1wIA1xQaeCPiL/TYRGHCSzfkfppMkx/K2Q9tMI2X6dU+e9dPmJGmzzVNWanOBorfE5viqbVWnyjSKnqNXY9E7thkp6qywlGvLY8pVVNQpc64Ja4S9ovbJA2QJMyRqm2lrkqoi7W9kKMBrmgpvPEtVN60pGZdBBYeorRnePAxnqYufa4rxFg677MQoSdlL6MtS8xtbDJkgk/6s4J7ow+qgCcVwGyFtC/CLlGBNtlpHXCFtJ3sBQesWUPe4Smc0+5wTZI/j+0GBCa488Acx+xkk7waP8Gw15ZUjoE28lybLT1jyIkTACs4kq0g+JKAV5EMDGiHTzMEQNgyqK+bk424B1EF+7hXdY/u4immNJLopgh2TLxLe4vf5fwIMADtbDGrkqxb2AAAAAElFTkSuQmCC"); + background-image: resourceUrl("search"); background-color: transparent; background-size: contain; background-position: center center; @@ -175,11 +160,6 @@ figcaption { outline: none; text-decoration: none; } -.buttonarrowdown { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALFJREFUeNrs1TEOgjAUxnFx5iDscgPvwXkYuYdXwBPgAYwrsxPGIAPPvKQkxLQO5UE0+X9J06Ff0186tImI7H45CUCAAAECBAgQIMA1s1+y+dkUpUXna/QGY0Z/q0QztCcJddyauG7UOdHA8XWXKT7khNO47rbArj5kIeQnTrubA0NIS9xioA9piTMB+pBWODPgHGmJ02H6UD/OeaZzerxc+eoAAgQIECBAgAD/AvgWYACm/8hEADYaXwAAAABJRU5ErkJggg=="); - width: 2.666666666666667em; - padding: 2.733333333333333em 0 0 0; -} .buttonarrowrightwhite:after { content: ''; display: inline-block; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/HomeBase.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/HomeBase.gwt.xml index 8bdd972094f..222dead5057 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/HomeBase.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/HomeBase.gwt.xml @@ -22,10 +22,6 @@ - - - - @@ -42,6 +38,7 @@ + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/DesktopEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/DesktopEntryPoint.java index 10fbe5ab7d1..64abf744423 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/DesktopEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/DesktopEntryPoint.java @@ -19,8 +19,6 @@ import com.sap.sailing.gwt.ui.client.ServerConfigurationServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.EntryPointHelper; import com.sap.sse.gwt.client.mvp.AbstractMvpEntryPoint; -import com.sap.sse.gwt.resources.CommonControlsCSS; -import com.sap.sse.gwt.resources.Highcharts; /** * Desktop/tablet EntryPoint for the Home module. Be aware that this EntryPoint isn't directly started but instead the @@ -33,9 +31,6 @@ public class DesktopEntryPoint extends AbstractMvpEntryPoint

diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeaderResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeaderResources.java index c4ccbc278e1..f2e43ca7729 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeaderResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeaderResources.java @@ -1,14 +1,18 @@ package com.sap.sailing.gwt.home.desktop.partials.eventheader; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; +import com.sap.sailing.gwt.home.desktop.resources.SharedDesktopResources; -public interface EventHeaderResources extends ClientBundle { +public interface EventHeaderResources extends SharedDesktopResources { public static final EventHeaderResources INSTANCE = GWT.create(EventHeaderResources.class); @Source("EventHeader.gss") LocalCss css(); + + @Source("location-icon.png") + ImageResource location(); public interface LocalCss extends CssResource { String jsdropdown(); @@ -27,7 +31,6 @@ public interface EventHeaderResources extends ClientBundle { String leaderboardquickaccess(); String eventheader(); String eventheader_breadcrumb(); - String eventheader_breadcrumbback(); String eventheader_intro(); String eventheader_intro_logo(); String eventheader_intro_logo_image(); diff --git a/java/com.sap.sailing.gwt.ui/images/home/location-icon.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/location-icon.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/location-icon.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/location-icon.png diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsrecent/EventsOverviewRecentYear.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsrecent/EventsOverviewRecentYear.ui.xml index efa584f5c1d..5321448b777 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsrecent/EventsOverviewRecentYear.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsrecent/EventsOverviewRecentYear.ui.xml @@ -3,6 +3,7 @@ + .quickFix { padding: 0px 10px; @@ -26,7 +27,7 @@
- +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsupcoming/EventsOverviewUpcoming.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsupcoming/EventsOverviewUpcoming.ui.xml index 91243e608ae..fa6d43c5f4e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsupcoming/EventsOverviewUpcoming.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsupcoming/EventsOverviewUpcoming.ui.xml @@ -3,12 +3,13 @@ +
- +

@@ -30,7 +31,7 @@
- +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsupcoming/EventsOverviewUpcomingResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsupcoming/EventsOverviewUpcomingResources.java index 26e871d5cee..b33e951f522 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsupcoming/EventsOverviewUpcomingResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsupcoming/EventsOverviewUpcomingResources.java @@ -3,12 +3,16 @@ package com.sap.sailing.gwt.home.desktop.partials.eventsupcoming; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; public interface EventsOverviewUpcomingResources extends ClientBundle { public static final EventsOverviewUpcomingResources INSTANCE = GWT.create(EventsOverviewUpcomingResources.class); @Source("EventsOverviewUpcoming.gss") LocalCss css(); + + @Source("upcoming-events-icon.png") + ImageResource upcomingEvents(); public interface LocalCss extends CssResource { String accordion(); diff --git a/java/com.sap.sailing.gwt.ui/images/home/upcoming-events-icon.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsupcoming/upcoming-events-icon.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/upcoming-events-icon.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventsupcoming/upcoming-events-icon.png diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.gss index 42758085648..719abdb726e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.gss @@ -112,16 +112,16 @@ background-repeat: no-repeat; background-position: center center; background-size: contain; - background-image: url('images/home/loggedout.svg'); + background-image: resourceUrl('loggedoutOpen'); margin-left: 1rem; cursor: pointer; } .user_menu_button.open { - background-image: url('images/home/loggedout-open.svg'); + background-image: resourceUrl('loggedout'); } .user_menu_button.loggedin { - background-image: url('images/home/loggedin.svg'); + background-image: resourceUrl('loggedin'); } .user_menu_button.loggedin.open { - background-image: url('images/home/loggedin-open.svg'); + background-image: resourceUrl('loggedinOpen'); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/HeaderResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/HeaderResources.java index d432431aaf4..3d20dc18e84 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/HeaderResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/HeaderResources.java @@ -1,10 +1,10 @@ package com.sap.sailing.gwt.home.desktop.partials.header; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.sap.sse.security.ui.authentication.generic.resource.AuthenticationResources; -public interface HeaderResources extends ClientBundle { +public interface HeaderResources extends AuthenticationResources { public static final HeaderResources INSTANCE = GWT.create(HeaderResources.class); @Source("Header.gss") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/MainMedia.css b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/MainMedia.gss similarity index 87% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/MainMedia.css rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/MainMedia.gss index 71352f498a7..5921259ba1f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/MainMedia.css +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/MainMedia.gss @@ -1,6 +1,6 @@ .media { - font-size: 15px; - font-size: 1rem; + /* @alternate */ font-size: 15px; + /* @alternate */ font-size: 1rem; } .media_swipecontainer { @@ -37,7 +37,7 @@ transform: translate(0, -50%); width: 60px; height: 60px; - background-image: url("images/home/media-controls__arrows.png"); + background-image: resourceUrl("mediaControlsArrows"); } .media_slideshow_controlsprev { @@ -59,7 +59,7 @@ } .media_slideshow_controlsfullsize { - background-image: url("images/home/media-controls__fullsize.png"); + background-image: resourceUrl("mediaControlsFullsize"); right: 0; bottom: 0; width: 40px; @@ -76,8 +76,8 @@ } .videopreview { - font-size: 15px; - font-size: 1rem; + /* @alternate */ font-size: 15px; + /* @alternate */ font-size: 1rem; margin-bottom: 2.666666666666667em; } @@ -93,7 +93,7 @@ transform: translate(-50%, 0); width: 69px; height: 69px; - background: url("images/home/video__preview--play.png"); + background: resourceUrl("videoPreviewPlay"); -webkit-background-size: contain; -moz-background-size: contain; background-size: contain; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/MainMediaResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/MainMediaResources.java index 272acae4b70..00a429faf60 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/MainMediaResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/MainMediaResources.java @@ -3,12 +3,22 @@ package com.sap.sailing.gwt.home.desktop.partials.mainmedia; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; public interface MainMediaResources extends ClientBundle { public static final MainMediaResources INSTANCE = GWT.create(MainMediaResources.class); - @Source("MainMedia.css") + @Source("MainMedia.gss") LocalCss css(); + + @Source("media-controls__arrows.png") + ImageResource mediaControlsArrows(); + + @Source("media-controls__fullsize.png") + ImageResource mediaControlsFullsize(); + + @Source("video__preview--play.png") + ImageResource videoPreviewPlay(); public interface LocalCss extends CssResource { String media(); diff --git a/java/com.sap.sailing.gwt.ui/images/home/media-controls__arrows.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/media-controls__arrows.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/media-controls__arrows.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/media-controls__arrows.png diff --git a/java/com.sap.sailing.gwt.ui/images/home/media-controls__fullsize.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/media-controls__fullsize.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/media-controls__fullsize.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/media-controls__fullsize.png diff --git a/java/com.sap.sailing.gwt.ui/images/home/video__preview--play.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/video__preview--play.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/video__preview--play.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/mainmedia/video__preview--play.png diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/media/SailingFullscreenViewer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/media/SailingFullscreenViewer.java index d68fa1042c9..1999b2af22b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/media/SailingFullscreenViewer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/media/SailingFullscreenViewer.java @@ -15,6 +15,7 @@ import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.partials.fullscreen.FullscreenContainer; import com.sap.sailing.gwt.home.shared.places.event.EventDefaultPlace; +import com.sap.sailing.gwt.home.shared.resources.SharedHomeResources; import com.sap.sse.gwt.client.controls.carousel.ImageCarousel.FullscreenViewer; /** @@ -29,7 +30,7 @@ public class SailingFullscreenViewer extends FullscreenContainer implements LeaderboardDelegate { - protected final Image autoRefreshControl = new Image("images/home/reload.svg"); - protected final Image settingsControl = new Image("images/home/settings.svg"); + protected final Image autoRefreshControl = new Image(SharedHomeResources.INSTANCE.reload().getSafeUri()); + protected final Image settingsControl = new Image(SharedHomeResources.INSTANCE.settings().getSafeUri()); private final static BusyIndicatorResources RESOURCES = GWT.create(BusyIndicatorResources.class); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboard.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboard.gss index c19abc8c77e..810a0eae1fd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboard.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboard.gss @@ -99,7 +99,7 @@ } .regattaleaderboard_meta_reload { background-color: #9f9f9f; - background-image: url("images/home/reload.svg"); + background-image: resourceUrl("reload"); } .regattaleaderboard_meta_reload_live { background-color: red; @@ -138,7 +138,7 @@ } .regattaleaderboard_meta_settings_button { background-color: #9f9f9f; - background-image: url("images/home/settings.svg"); + background-image: resourceUrl("settings"); } .regattaleaderboard_table { margin-bottom: 20px; @@ -194,7 +194,7 @@ margin-right: 0.333333333333333em; background-repeat: no-repeat; background-position: center center; - background-image: url("images/home/arrow-down-yellow.png"); + background-image: resourceUrl("arrowDownYellow"); } .regattaleaderboard_header_itemascending:before, .regattaleaderboard_header_itemdata_elementascending:before { @@ -206,7 +206,7 @@ margin-right: 0.333333333333333em; background-repeat: no-repeat; background-position: center center; - background-image: url("images/home/arrow-up-yellow.png"); + background-image: resourceUrl("arrowUpYellow"); } .regattaleaderboard_header_table { width: 100%; @@ -242,9 +242,9 @@ } .regattaleaderboard_meta_fullscreen_button { background-color: #9f9f9f; - background-image: url("images/home/fullscreen.svg"); + background-image: resourceUrl("fullscreen"); } .regattaleaderboard_meta_liveraces_button { background-color: #9f9f9f; - background-image: url("images/home/liveraces.svg"); + background-image: resourceUrl("liveraces"); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboardResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboardResources.java index 32653ee9e3d..ee43a0ba756 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboardResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/EventRegattaLeaderboardResources.java @@ -1,14 +1,21 @@ package com.sap.sailing.gwt.home.desktop.partials.old; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; +import com.sap.sailing.gwt.home.desktop.resources.SharedDesktopResources; -public interface EventRegattaLeaderboardResources extends ClientBundle { +public interface EventRegattaLeaderboardResources extends SharedDesktopResources { public static final EventRegattaLeaderboardResources INSTANCE = GWT.create(EventRegattaLeaderboardResources.class); @Source("EventRegattaLeaderboard.gss") LocalCss css(); + + @Source("arrow-down-yellow.png") + ImageResource arrowDownYellow(); + + @Source("arrow-up-yellow.png") + ImageResource arrowUpYellow(); public interface LocalCss extends CssResource { String leaderboardcompetitor(); diff --git a/java/com.sap.sailing.gwt.ui/images/home/arrow-down-yellow.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/arrow-down-yellow.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/arrow-down-yellow.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/arrow-down-yellow.png diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/arrow-up-yellow.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/arrow-up-yellow.png new file mode 100644 index 00000000000..360e4007a62 Binary files /dev/null and b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/arrow-up-yellow.png differ diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/leaderboard/OldLeaderboardDelegateFullscreenViewer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/leaderboard/OldLeaderboardDelegateFullscreenViewer.java index 6589ae44ce0..a22f9e86722 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/leaderboard/OldLeaderboardDelegateFullscreenViewer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/old/leaderboard/OldLeaderboardDelegateFullscreenViewer.java @@ -11,6 +11,7 @@ import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.home.desktop.partials.old.AbstractLeaderboardFullscreenViewer; import com.sap.sailing.gwt.home.desktop.partials.old.leaderboard.OldLeaderboard.OldLeaderboardDelegate; +import com.sap.sailing.gwt.home.desktop.resources.SharedDesktopResources; public class OldLeaderboardDelegateFullscreenViewer extends AbstractLeaderboardFullscreenViewer implements OldLeaderboardDelegate { @@ -22,7 +23,7 @@ public class OldLeaderboardDelegateFullscreenViewer extends AbstractLeaderboardF private static OldLeaderboardDelegateFullscreenViewerUiBinder uiBinder = GWT .create(OldLeaderboardDelegateFullscreenViewerUiBinder.class); - private final Image showLiveRacesControl = new Image("images/home/liveraces.svg"); + private final Image showLiveRacesControl = new Image(SharedDesktopResources.INSTANCE.liveraces().getSafeUri()); private final Label hasLiveRace = new Label(); private final Widget headerWidget; private final ContentLayout contentLayout = new ContentLayout(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceList.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceList.gss index 33566e9022b..dc3046eec7f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceList.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceList.gss @@ -72,11 +72,6 @@ min-width: 13.333333333333334em; max-width: 16.666666666666668em; } -img.race_item_flag { - vertical-align: middle; - height: 1em; - width: auto; -} .race_item_position { margin-right: 0.333333333333333em; } @@ -230,4 +225,34 @@ img.race_item_flag { } .racesListHideColumn > * { display: none !important; +} +.iconGPS, .iconWind, .iconVideo, .iconAudio{ + position: relative; + display: none; + margin-left: 0.666666666666667em; + padding-left: 2.333333333333333em; + background-size: 1.666666666666667rem 1.666666666666667rem; + background-position: left; + background-repeat: no-repeat; +} +.iconGPS { + background-image: resourceUrl('gpsFixes'); +} +.iconWind { + background-image: resourceUrl('wind'); +} +.iconVideo { + background-image: resourceUrl('video'); + border-left: 1px solid #ccc; +} +.iconAudio { + background-image: resourceUrl('audio'); + border-left: 1px solid #ccc; +} +.legend { + text-align: right; + vertical-align: baseline; + line-height: 1.333em; + padding-right:0px; + margin: 0 0 .5em; } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListColumnFactory.java index 67bff5d364b..7c065a84086 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListColumnFactory.java @@ -19,7 +19,6 @@ import com.google.gwt.safehtml.client.SafeHtmlTemplates; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeUri; -import com.google.gwt.safehtml.shared.UriUtils; import com.google.gwt.user.cellview.client.SafeHtmlHeader; import com.sap.sailing.domain.common.SortingOrder; import com.sap.sailing.gwt.home.communication.event.LiveRaceDTO; @@ -36,6 +35,7 @@ import com.sap.sailing.gwt.home.desktop.partials.racelist.RaceListResources.Loca import com.sap.sailing.gwt.home.desktop.partials.raceviewerlaunchpad.RaceviewerLaunchPadCell; import com.sap.sailing.gwt.home.desktop.partials.raceviewerlaunchpad.RaceviewerLaunchPadController; import com.sap.sailing.gwt.home.desktop.places.event.EventView; +import com.sap.sailing.gwt.home.desktop.resources.SharedDesktopResources; import com.sap.sailing.gwt.home.shared.utils.HomeSailingFlagsBuilder; import com.sap.sailing.gwt.regattaoverview.client.FlagsMeaningExplanator; import com.sap.sailing.gwt.ui.client.FlagImageResolver; @@ -57,11 +57,11 @@ public class RaceListColumnFactory { @Template("
{3}
") SafeHtml viewStateRunning(String styleNamesBar, String styleNamesProgress, SafeStyles width, String text); - @Template("") - SafeHtml windDirection(SafeStyles rotation); + @Template("") + SafeHtml windDirection(SafeStyles rotation, SafeUri imageUrl); - @Template("{4}
{5}
") - SafeHtml winner(String styleNamesFlag, String styleNamesSailId, String styleNamesText, SafeUri flagImageURL, String sailId, String name); + @SafeHtmlTemplates.Template("
{3}
{4}
") + SafeHtml winner(String styleNamesSailId, String styleNamesText, String flagImageURL, String sailId, String name); @Template("") SafeHtml imageHeader(String styleNames, SafeUri imageURL); @@ -275,7 +275,7 @@ public class RaceListColumnFactory { safeStyles.trustedNameAndValue("-webkit-transform", "rotate(" + value.getTrueWindFromDeg() + "deg)"); safeStyles.trustedNameAndValue("transform", "rotate(" + value.getTrueWindFromDeg() + "deg)"); safeStyles.width(2.75, Unit.EM).height(2.75, Unit.EM); - sb.append(TEMPLATE.windDirection(safeStyles.toSafeStyles())); + sb.append(TEMPLATE.windDirection(safeStyles.toSafeStyles(), RaceListResources.INSTANCE.compass().getSafeUri())); } } }; @@ -443,14 +443,17 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getWinnerColumn() { + public static SortableRaceListColumn getWinnerColumn(FlagImageResolver flagImageResolver) { Cell cell = new AbstractCell() { @Override public void render(Context context, SimpleCompetitorDTO value, SafeHtmlBuilder sb) { if (value != null) { - SafeUri flagImageUri = FlagImageResolver.getFlagImageUri(value.getFlagImageURL(), value.getTwoLetterIsoCountryCode()); - String flagStyle = CSS.race_item_flag(), sailIdStyle = CSS.race_item_sailid(), nameStyle = CSS.race_item_winner(); - sb.append(TEMPLATE.winner(flagStyle, sailIdStyle, nameStyle, flagImageUri, value.getSailID(), value.getName())); + SafeUri flagImageUri = flagImageResolver.getFlagImageUri(value.getFlagImageURL(), + value.getTwoLetterIsoCountryCode()); + String sailIdStyle = CSS.race_item_sailid(); + String nameStyle = CSS.race_item_winner(); + sb.append(TEMPLATE.winner( sailIdStyle, nameStyle, flagImageUri.asString(), + value.getSailID(), value.getName())); } } }; @@ -570,9 +573,9 @@ public class RaceListColumnFactory { } private static abstract class DataCountColumn extends SortableRaceListColumn { - private static final SafeUri ICON_WIND = UriUtils.fromTrustedString("images/home/icon-wind.png"); - private static final SafeUri ICON_VIDEO = UriUtils.fromTrustedString("images/home/icon-video.png"); - private static final SafeUri ICON_AUDIO = UriUtils.fromTrustedString("images/home/icon-audio.png"); + private static final SafeUri ICON_WIND = SharedDesktopResources.INSTANCE.wind().getSafeUri(); + private static final SafeUri ICON_VIDEO = SharedDesktopResources.INSTANCE.video().getSafeUri(); + private static final SafeUri ICON_AUDIO = SharedDesktopResources.INSTANCE.audio().getSafeUri(); private DataCountColumn(final SafeUri imageUri, RaceListColumnComparator comparator) { super(new SafeHtmlHeader(TEMPLATE.imageHeader(CSS.raceslist_head_itemflag(), imageUri)), new AbstractCell() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListContainer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListContainer.ui.xml index f77d773a8ae..cfb9c874016 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListContainer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListContainer.ui.xml @@ -5,44 +5,12 @@ - - .iconGPS, .iconWind, .iconVideo, .iconAudio{ - position: relative; - display: none; - margin-left: 0.666666666666667em; - padding-left: 2.333333333333333em; - background-size: 1.666666666666667rem 1.666666666666667rem; - background-position: left; - background-repeat: no-repeat; - } - .iconGPS { - background-image:url('images/home/raw_gps_fixes.png'); - } - .iconWind { - background-image:url('images/home/icon-wind.png'); - } - .iconVideo { - background-image:url('images/home/icon-video.png'); - border-left: 1px solid #ccc; - } - .iconAudio { - background-image:url('images/home/icon-audio.png'); - border-left: 1px solid #ccc; - } - .legend { - text-align: right; - vertical-align: baseline; - line-height: 1.333em; - padding-right:0px; - margin: 0 0 .5em; - } -

-
-
-
-
+
+
+
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListResources.java index 2570e15c311..a5af4cd0376 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/RaceListResources.java @@ -1,14 +1,20 @@ package com.sap.sailing.gwt.home.desktop.partials.racelist; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.DataResource; +import com.google.gwt.resources.client.DataResource.MimeType; +import com.sap.sailing.gwt.home.desktop.resources.SharedDesktopResources; -public interface RaceListResources extends ClientBundle { +public interface RaceListResources extends SharedDesktopResources { public static final RaceListResources INSTANCE = GWT.create(RaceListResources.class); @Source("RaceList.gss") LocalCss css(); + + @Source("windkompass_nord.svg") + @MimeType("image/svg+xml") + DataResource compass(); public interface LocalCss extends CssResource { String race(); @@ -22,7 +28,6 @@ public interface RaceListResources extends ClientBundle { String race_itemwind(); String race_itemname(); String race_itemwinner(); - String race_item_flag(); String race_item_position(); String race_item_sailid(); String race_item_winner(); @@ -51,5 +56,11 @@ public interface RaceListResources extends ClientBundle { String racesListIcon(); String racesListHideColumn(); + + String iconGPS(); + String iconWind(); + String iconVideo(); + String iconAudio(); + String legend(); } } diff --git a/java/com.sap.sailing.gwt.ui/images/home/windkompass_nord.svg b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/windkompass_nord.svg similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/windkompass_nord.svg rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/racelist/windkompass_nord.svg diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/raceviewerlaunchpad/RaceviewerLaunchPadCell.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/raceviewerlaunchpad/RaceviewerLaunchPadCell.java index e25cf2650e1..3dcc9d69ca6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/raceviewerlaunchpad/RaceviewerLaunchPadCell.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/raceviewerlaunchpad/RaceviewerLaunchPadCell.java @@ -12,6 +12,7 @@ import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.safehtml.shared.UriUtils; import com.sap.sailing.gwt.home.communication.race.RaceMetadataDTO; +import com.sap.sailing.gwt.home.shared.resources.SharedHomeResources; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.common.Util; @@ -21,11 +22,11 @@ public class RaceviewerLaunchPadCell> extends Abstr @Template("
{1}
") SafeHtml raceNotTracked(String styleNames, String text); - @Template("
{2}
") - SafeHtml raceviewerLaunchPad(String styleNames, String iconStyleNames, String text); + @Template("
{2}
") + SafeHtml raceviewerLaunchPad(String styleNames, String iconStyleNames, String text, SafeUri iconUrl); - @Template("
{2}
") - SafeHtml standaloneButton(String styleNames, String iconStyleNames, String text, String icon, SafeUri safeUri); + @Template("
{2}
") + SafeHtml standaloneButton(String styleNames, String iconStyleNames, String text, SafeUri iconUrl, SafeUri safeUri); } private static final CellTemplates TEMPLATE = GWT.create(CellTemplates.class); @@ -66,13 +67,13 @@ public class RaceviewerLaunchPadCell> extends Abstr switch (launchPadController.getRenderingStyle(data)) { case WATCH_LIVE_ONLY: sb.append(TEMPLATE.standaloneButton(plannedStyleNames, iconStyleNames, I18N.watchLive(), - "launch-play", UriUtils.fromString(launchPadController.getDirectLinkUrl(data)))); + SharedHomeResources.INSTANCE.launchPlay().getSafeUri(), UriUtils.fromString(launchPadController.getDirectLinkUrl(data)))); break; case WATCH_LIVE_OR_ANALYZE: - sb.append(TEMPLATE.raceviewerLaunchPad(liveStyleNames, iconStyleNames, I18N.raceDetailsToShow())); + sb.append(TEMPLATE.raceviewerLaunchPad(liveStyleNames, iconStyleNames, I18N.raceDetailsToShow(), SharedHomeResources.INSTANCE.launchLoupe().getSafeUri())); break; case ANALYZE: - sb.append(TEMPLATE.raceviewerLaunchPad(analyzeStyleNames, iconStyleNames, I18N.raceDetailsToShow())); + sb.append(TEMPLATE.raceviewerLaunchPad(analyzeStyleNames, iconStyleNames, I18N.raceDetailsToShow(), SharedHomeResources.INSTANCE.launchLoupe().getSafeUri())); break; case NOT_TRACKED: sb.append(TEMPLATE.raceNotTracked(notTrackedStyleNames, showNotTracked ? I18N.eventRegattaRaceNotTracked() : "")); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattacompetition/RegattaCompetition.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattacompetition/RegattaCompetition.gss index 1840dcd6c5e..838f946303d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattacompetition/RegattaCompetition.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattacompetition/RegattaCompetition.gss @@ -144,7 +144,7 @@ display: inline-block; width: 1em; height: 0.866666666666667em; - background: url("images/home/launch-loupe.svg") no-repeat center center; + background: resourceUrl("launchLoupe") no-repeat center center; font-size: 1.466666666666667em; position: absolute; right: 0; @@ -175,7 +175,7 @@ background-color: #8a8a8a; } .fleet_races_raceplanned .fleet_races_race_name:after { - background: url("images/home/launch-play.svg") no-repeat center center; + background: resourceUrl("launchPlay") no-repeat center center; } .fleet_races_raceuntracked .fleet_races_race_name:after { display: none; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattacompetition/RegattaCompetitionResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattacompetition/RegattaCompetitionResources.java index 25731591094..6b9b757e840 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattacompetition/RegattaCompetitionResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattacompetition/RegattaCompetitionResources.java @@ -1,10 +1,10 @@ package com.sap.sailing.gwt.home.desktop.partials.regattacompetition; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.sap.sailing.gwt.home.shared.resources.SharedHomeResources; -public interface RegattaCompetitionResources extends ClientBundle { +public interface RegattaCompetitionResources extends SharedHomeResources { public static final RegattaCompetitionResources INSTANCE = GWT.create(RegattaCompetitionResources.class); @Source("RegattaCompetition.gss") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeader.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeader.gss index c6777ba0f40..2e52f509b83 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeader.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeader.gss @@ -100,7 +100,7 @@ text-align: right; padding: 0.666666666666667em; padding-right: 5.333333333333333em; - background-image: url("images/home/arrow-down-grey.png"); + background-image: resourceUrl("arrowDownGrey"); background-size: 1.333333333333333em 1.333333333333333em; background-position: center; background-repeat: no-repeat; @@ -170,3 +170,41 @@ img.regattaheader_update_title_icon { .regattaheader_update_timestamp { font-size: 12px; } +.iconHeaderGPS, .iconHeaderWind, .iconHeaderVideo, .iconHeaderAudio { + pointer-events: none; +} +.iconHeaderGPS, .iconGPS { + background-image: resourceUrl('gpsFixes'); +} +.iconHeaderWind, .iconWind { + background-image: resourceUrl('wind'); +} +.iconHeaderVideo, .iconVideo { + background-image: resourceUrl('video'); +} +.iconHeaderAudio, .iconAudio { + background-image: resourceUrl('audio'); +} + +.iconGPS, .iconWind, .iconVideo, .iconAudio { + line-height: 1.5em; + position: relative; + height:1.666666666666667rem; + display: inline-block; + padding-left: 2.333333333333333em; + background-size: 1.666666666666667rem 1.666666666666667rem; + background-position: left bottom; + background-repeat: no-repeat; +} +.iconWind { + margin-left: 0.666666666666667em; + border-left: 1px solid #ccc; +} +.iconVideo { + padding-top: 0.277777777777778em; +} +.iconAudio { + margin-left: 0.666666666666667em; + border-left: 1px solid #ccc; + padding-top: 0.277777777777778em; +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeader.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeader.ui.xml index e8979872c35..43e5f24b5a2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeader.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeader.ui.xml @@ -12,10 +12,10 @@
-
-
-
-
+
+
+
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeaderBubbleContentLegend.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeaderBubbleContentLegend.ui.xml index 40f156ed706..51d0c39b6c8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeaderBubbleContentLegend.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeaderBubbleContentLegend.ui.xml @@ -1,48 +1,19 @@ - - .iconGPS, .iconWind, .iconVideo, .iconAudio { - line-height: 1.5em; - position: relative; - height:1.666666666666667rem; - display: inline-block; - padding-left: 2.333333333333333em; - background-size: 1.666666666666667rem 1.666666666666667rem; - background-position: left bottom; - background-repeat: no-repeat; - } - .iconGPS { - background-image:url('images/home/raw_gps_fixes.png'); - } - .iconWind { - margin-left: 0.666666666666667em; - background-image:url('images/home/icon-wind.png'); - border-left: 1px solid #ccc; - } - .iconVideo { - background-image:url('images/home/icon-video.png'); - padding-top: 0.277777777777778em; - } - .iconAudio { - margin-left: 0.666666666666667em; - background-image:url('images/home/icon-audio.png'); - border-left: 1px solid #ccc; - padding-top: 0.277777777777778em; - } - + - + - + - + - +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeaderResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeaderResources.java index 93faedeea4b..369f29552aa 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeaderResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattaheader/RegattaHeaderResources.java @@ -1,10 +1,10 @@ package com.sap.sailing.gwt.home.desktop.partials.regattaheader; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.sap.sailing.gwt.home.desktop.resources.SharedDesktopResources; -public interface RegattaHeaderResources extends ClientBundle { +public interface RegattaHeaderResources extends SharedDesktopResources { public static final RegattaHeaderResources INSTANCE = GWT.create(RegattaHeaderResources.class); @Source("RegattaHeader.gss") @@ -29,5 +29,15 @@ public interface RegattaHeaderResources extends ClientBundle { String regattaheader_update_title(); String regattaheader_update_title_icon(); String regattaheader_update_timestamp(); + + String iconHeaderGPS(); + String iconHeaderWind(); + String iconHeaderVideo(); + String iconHeaderAudio(); + + String iconGPS(); + String iconWind(); + String iconVideo(); + String iconAudio(); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/RegattaNavigation.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/RegattaNavigation.gss index d902be63d69..f42078ac10b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/RegattaNavigation.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/RegattaNavigation.gss @@ -49,7 +49,7 @@ font-size: 0.866666666666667rem; text-align: right; margin-top: 0; - background: transparent url("images/home/arrow-down-filled-black.png") no-repeat; + background: transparent resourceUrl("arrowDownFilledBlack") no-repeat; background-position: 96%; background-size: 0.923076923076923em 0.538461538461538em; border: 1px solid transparent; @@ -65,7 +65,7 @@ background-color: #f2f2f2; } .regattanavigation_filter.jsdropdownactive { - background-image: url("images/home/arrow-down-filled-yellow.png"); + background-image: resourceUrl("arrowDownFilledYellow"); } .regattanavigation_filter.jsdropdownactive .regattanavigation_filter_dropdown { display: block; @@ -98,7 +98,7 @@ text-decoration: underline; } .regattanavigation_filter_dropdown_linkactive { - background: url("images/home/dropdown__check@2x.png") no-repeat; + background: resourceUrl("dropdownCheck") no-repeat; background-position: 95%; background-size: 1.2em 0.933333333333333em; } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/RegattaNavigationResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/RegattaNavigationResources.java index 03f153c1b43..f51c44f3a33 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/RegattaNavigationResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/RegattaNavigationResources.java @@ -1,14 +1,18 @@ package com.sap.sailing.gwt.home.desktop.partials.regattanavigation; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; +import com.sap.sailing.gwt.home.desktop.resources.SharedDesktopResources; -public interface RegattaNavigationResources extends ClientBundle { +public interface RegattaNavigationResources extends SharedDesktopResources { public static final RegattaNavigationResources INSTANCE = GWT.create(RegattaNavigationResources.class); @Source("RegattaNavigation.gss") LocalCss css(); + + @Source("arrow-down-filled-yellow.png") + ImageResource arrowDownFilledYellow(); public interface LocalCss extends CssResource { String jsdropdown(); diff --git a/java/com.sap.sailing.gwt.ui/images/home/arrow-down-filled-yellow.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/arrow-down-filled-yellow.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/arrow-down-filled-yellow.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/regattanavigation/arrow-down-filled-yellow.png diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResult.css b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResult.gss similarity index 91% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResult.css rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResult.gss index c601764690a..def48028ee1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResult.css +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResult.gss @@ -2,8 +2,8 @@ * styles for search result page */ .paging { - font-size: 16px; - font-size: 1rem; + /* @alternate */ font-size: 16px; + /* @alternate */ font-size: 1rem; margin-top: 1.875em; } .paging_perpage { @@ -41,7 +41,7 @@ height: 0; overflow: hidden; border: 0; - background-image: url("images/home/paging-icons.png"); + background-image: resourceUrl("paging"); background-repeat: no-repeat; background-position: left center; background-size: cover; @@ -51,8 +51,8 @@ background-position: -2.5em center; } .dropdown { - font-size: 16px; - font-size: 1rem; + /* @alternate */ font-size: 16px; + /* @alternate */ font-size: 1rem; width: 18.75em; display: inline-block; } @@ -114,8 +114,8 @@ font-size: 1em; } .searchresult { - font-size: 16px; - font-size: 1rem; + /* @alternate */ font-size: 16px; + /* @alternate */ font-size: 1rem; } .searchresult_form { display: block; @@ -130,7 +130,7 @@ .searchresult_form_input { display: block; padding: 0.625em 0 0.5625em 2.5em; - background-image: url("images/home/search-icon-grey.png"); + background-image: resourceUrl("search"); background-repeat: no-repeat; background-color: #f6f9fc; background-position: 0.625em center; @@ -139,8 +139,8 @@ float: left; } .searchresult_form_button { - font-size: 16px; - font-size: 1rem; + /* @alternate */ font-size: 16px; + /* @alternate */ font-size: 1rem; width: 10%; float: right; text-transform: uppercase; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResult.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResult.ui.xml index 498509744ec..e92ebc875de 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResult.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResult.ui.xml @@ -23,19 +23,6 @@
-
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResultResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResultResources.java index 89f30c8ec11..2692eae107e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResultResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/SearchResultResources.java @@ -3,12 +3,19 @@ package com.sap.sailing.gwt.home.desktop.partials.searchresult; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; public interface SearchResultResources extends ClientBundle { public static final SearchResultResources INSTANCE = GWT.create(SearchResultResources.class); - @Source("SearchResult.css") + @Source("SearchResult.gss") LocalCss css(); + + @Source("paging-icons.png") + ImageResource paging(); + + @Source("search-icon-grey.png") + ImageResource search(); public interface LocalCss extends CssResource { String paging(); diff --git a/java/com.sap.sailing.gwt.ui/images/home/paging-icons.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/paging-icons.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/paging-icons.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/paging-icons.png diff --git a/java/com.sap.sailing.gwt.ui/images/home/search-icon-grey.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/search-icon-grey.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/search-icon-grey.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/searchresult/search-icon-grey.png diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeader.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeader.gss index 14a144f1b81..641972bb26a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeader.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeader.gss @@ -18,25 +18,6 @@ font-weight: 600; padding: 0.666666666666667em 0; } -.eventheader_breadcrumbback { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 1.333333333333333em; - border-right: 1px solid #cfcfcf; - background-color: #dedede; - background-image: url("images/home/breadcrumb-arrow__back.png"); - background-position: center center; - background-repeat: no-repeat; - background-size: 50%; - -webkit-transition: background-color 0.2s, border-color 0.2s; - -moz-transition: background-color 0.2s, border-color 0.2s; - transition: background-color 0.2s, border-color 0.2s; -} -.eventheader_breadcrumbback:hover { - background-color: #cfcfcf; -} .eventheader_intro { padding-left: 6em; margin: 0.666666666666667em 0; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeaderResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeaderResources.java index 58e791e8773..7cb6f8af5e2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeaderResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/seriesheader/SeriesHeaderResources.java @@ -1,10 +1,10 @@ package com.sap.sailing.gwt.home.desktop.partials.seriesheader; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.sap.sailing.gwt.home.desktop.resources.SharedDesktopResources; -public interface SeriesHeaderResources extends ClientBundle { +public interface SeriesHeaderResources extends SharedDesktopResources { public static final SeriesHeaderResources INSTANCE = GWT.create(SeriesHeaderResources.class); @Source("SeriesHeader.gss") @@ -14,7 +14,6 @@ public interface SeriesHeaderResources extends ClientBundle { String leaderboardquickaccess(); String eventheader(); String eventheader_breadcrumb(); - String eventheader_breadcrumbback(); String eventheader_intro(); String eventheader_intro_logo(); String eventheader_intro_logo_image(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtons.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtons.gss index 04d4564e036..29cd300eb8d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtons.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtons.gss @@ -13,7 +13,7 @@ } .eventheader_sharing_itememail { background-color: #f0ab00; - background-image: url("images/home/email-icon.png"); + background-image: resourceUrl("email"); } .eventheader_sharing_itememail:hover, .eventheader_sharing_itememail:focus { @@ -21,15 +21,28 @@ } .eventheader_sharing_itemtwitter { background-color: #32b5e2; - background-image: url("images/home/twitter-icon.png"); + background-image: resourceUrl("twitter"); + background-size: 20px auto; } .eventheader_sharing_itemtwitter:hover, .eventheader_sharing_itemtwitter:focus { background-color: #1faada; } .eventheader_sharing_itemfacebook { + position: relative; background-color: #3b5998; - background-image: url("images/home/facebook-icon.png"); +} +.eventheader_sharing_itemfacebook:after { + content: ""; + position: absolute; + width: 50%; + height: 50%; + top: 25%; + left: 25%; + background-image: resourceUrl("facebook"); + background-size: contain; + background-position: center; + background-repeat: no-repeat; } .eventheader_sharing_itemfacebook:hover, .eventheader_sharing_itemfacebook:focus { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtonsResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtonsResources.java index 280afd2fbec..d2b32b7e8f1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtonsResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/SharingButtonsResources.java @@ -1,14 +1,18 @@ package com.sap.sailing.gwt.home.desktop.partials.sharing; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; +import com.sap.sailing.gwt.home.shared.resources.SharedHomeResources; -public interface SharingButtonsResources extends ClientBundle { +public interface SharingButtonsResources extends SharedHomeResources { public static final SharingButtonsResources INSTANCE = GWT.create(SharingButtonsResources.class); @Source("SharingButtons.gss") LocalCss css(); + + @Source("email-icon.png") + ImageResource email(); public interface LocalCss extends CssResource { String eventheader_sharing(); diff --git a/java/com.sap.sailing.gwt.ui/images/email-icon.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/email-icon.png old mode 100755 new mode 100644 similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/email-icon.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/sharing/email-icon.png diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/socialfooter/SocialFooter.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/socialfooter/SocialFooter.ui.xml index 0dbed52ff4f..ac99eeb5050 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/socialfooter/SocialFooter.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/socialfooter/SocialFooter.ui.xml @@ -4,6 +4,7 @@ xmlns:s="urn:import:com.sap.sailing.gwt.home.client.shared"> + @@ -14,7 +15,7 @@

- +
@@ -25,7 +26,7 @@
- +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/Solutions.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/Solutions.gss index 90220b674f4..277cecd3099 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/Solutions.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/Solutions.gss @@ -94,7 +94,7 @@ background-repeat: no-repeat; background-position: right center; background-size: 40%; - background-image: url("images/home/solutions-sap-in-sailing.jpg"); + background-image: resourceUrl("sapInSailing"); } .solutions_contentsapinsailing_body .gridalternator { padding: 4em 0 4.333333333333333em; @@ -118,7 +118,7 @@ background-repeat: no-repeat; background-position: left center; background-size: 100%; - background-image: url("images/home/solutions-sap.png"); + background-image: resourceUrl("sap"); padding: 4em 0 4.333333333333333em; } @media (min-width: 45em) { @@ -139,7 +139,7 @@ padding: 4em 50% 4.333333333333333em 0; max-width: 88em; background-repeat: no-repeat; - background-image: url("images/home/solutions-sap-sailing-race-manager.png"); + background-image: resourceUrl("sapSailingRaceManager"); background-size: 40%; background-position: center right; } @@ -162,7 +162,7 @@ background-repeat: no-repeat; background-position: left center; background-size: 40%; - background-image: url("images/home/solutions-sap-sailing-insight.png"); + background-image: resourceUrl("sapSailingInsight"); padding: 4em 0 4.333333333333333em; } @media (min-width: 45em) { @@ -183,7 +183,7 @@ padding: 4em 50% 4.333333333333333em 0; max-width: 88em; background-repeat: no-repeat; - background-image: url("images/home/solutions-sap-sailing-buoy-pinger.png"); + background-image: resourceUrl("sapSailingBuoyPinger"); background-size: 40%; background-position: center right; } @@ -202,7 +202,7 @@ } .solutions_contentpost .gridalternator { background-repeat: no-repeat; - background-image: url("images/home/solutions-post.png"); + background-image: resourceUrl("post"); background-position: left center; background-size: 100%; padding: 1.666666666666667em 0; @@ -225,7 +225,7 @@ padding: 4em 50% 4.333333333333333em 0; max-width: 88em; background-repeat: no-repeat; - background-image: url("images/home/solutions-training.png"); + background-image: resourceUrl("training"); background-size: 45%; background-position: center right; } @@ -250,7 +250,7 @@ height: 100%; max-width: 80em; background-repeat: no-repeat; - background-image: url("images/home/solutions-training.png"); + background-image: resourceUrl("training"); background-size: 100% auto; background-position: center 13.333333333333334em; } @@ -262,7 +262,7 @@ } .solutions_contentsimulator .gridalternator { background-repeat: no-repeat; - background-image: url("images/home/solutions-simulator.png"); + background-image: resourceUrl("simulator"); background-position: left center; background-size: 100%; padding: 3.333333333333333em 0 3.333333333333333em; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/SolutionsResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/SolutionsResources.java index c8095d66d2c..8312d5e4ead 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/SolutionsResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/SolutionsResources.java @@ -1,16 +1,32 @@ package com.sap.sailing.gwt.home.desktop.partials.solutions; import com.google.gwt.core.client.GWT; -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.resources.client.CssResource.Shared; +import com.sap.sailing.gwt.home.shared.partials.solutions.SolutionsSharedResources; -public interface SolutionsResources extends ClientBundle { +public interface SolutionsResources extends SolutionsSharedResources { public static final SolutionsResources INSTANCE = GWT.create(SolutionsResources.class); @Source("Solutions.gss") LocalCss css(); - + + @Source("solutions-sap.png") + ImageResource sap(); + + @Source("solutions-sap-sailing-race-manager.png") + ImageResource sapSailingRaceManager(); + + @Source("solutions-post.png") + ImageResource post(); + + @Source("solutions-training.png") + ImageResource training(); + + @Source("solutions-simulator.png") + ImageResource simulator(); + @Shared public interface LocalCss extends CssResource { String solutions(); diff --git a/java/com.sap.sailing.gwt.ui/images/home/solutions-post.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/solutions-post.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/solutions-post.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/solutions-post.png diff --git a/java/com.sap.sailing.gwt.ui/images/home/solutions-sap-sailing-race-manager.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/solutions-sap-sailing-race-manager.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/solutions-sap-sailing-race-manager.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/solutions-sap-sailing-race-manager.png diff --git a/java/com.sap.sailing.gwt.ui/images/home/solutions-sap.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/solutions-sap.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/solutions-sap.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/solutions-sap.png diff --git a/java/com.sap.sailing.gwt.ui/images/home/solutions-simulator.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/solutions-simulator.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/solutions-simulator.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/solutions-simulator.png diff --git a/java/com.sap.sailing.gwt.ui/images/home/solutions-training.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/solutions-training.png similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/home/solutions-training.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/solutions/solutions-training.png diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/standings/Standings.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/standings/Standings.gss index b0307fa806e..3149bd71c5e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/standings/Standings.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/standings/Standings.gss @@ -23,7 +23,7 @@ text-align: right; padding: 0.666666666666667em; padding-right: 2.666666666666667em; - background-image: url("images/home/arrow-down-grey.png"); + background-image: resourceUrl("arrowDownGrey"); background-size: 1.333333333333333em 1.333333333333333em; background-position: center; background-repeat: no-repeat; @@ -107,7 +107,7 @@ vertical-align: middle; width: 1.066666666666667em; height: 1.066666666666667em; - background-image: url("../images/home/icon-green-check.svg"); + background-image: resourceUrl("greenCheck"); background-repeat: no-repeat; background-size: contain; margin-right: 0.333333333333333em; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/standings/StandingsList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/standings/StandingsList.java index 665c79a35be..1848086395e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/standings/StandingsList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/standings/StandingsList.java @@ -16,6 +16,7 @@ import com.sap.sailing.gwt.home.communication.event.minileaderboard.MiniLeaderbo import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.refresh.RefreshableWidget; import com.sap.sailing.gwt.home.shared.utils.LabelTypeUtil; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; @@ -35,9 +36,11 @@ public class StandingsList extends Widget implements RefreshableWidget headerNavigation) { + public StandingsList(boolean finished, PlaceNavigation headerNavigation, FlagImageResolver flagImageResolver) { this.finished = finished; + this.flagImageResolver = flagImageResolver; StandingsResources.INSTANCE.css().ensureInjected(); setElement(uiBinder.createAndBindUi(this)); setVisible(false); @@ -70,7 +73,7 @@ public class StandingsList extends Widget implements RefreshableWidget +
  • -
    +
    diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/updates/UpdatesBoxResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/updates/UpdatesBoxResources.java index 378cb4ccd58..256f5df8e53 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/updates/UpdatesBoxResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/updates/UpdatesBoxResources.java @@ -1,10 +1,10 @@ package com.sap.sailing.gwt.home.desktop.partials.updates; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.sap.sailing.gwt.home.shared.resources.SharedHomeResources; -public interface UpdatesBoxResources extends ClientBundle { +public interface UpdatesBoxResources extends SharedHomeResources { public static final UpdatesBoxResources INSTANCE = GWT.create(UpdatesBoxResources.class); @Source("UpdatesBox.gss") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/EventActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/EventActivityProxy.java index 5a01c544816..e97ba17df9a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/EventActivityProxy.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/EventActivityProxy.java @@ -1,6 +1,11 @@ package com.sap.sailing.gwt.home.desktop.places.event; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.google.gwt.activity.shared.Activity; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sailing.domain.common.dto.EventType; import com.sap.sailing.gwt.home.communication.eventview.EventViewDTO; import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator; @@ -17,6 +22,9 @@ import com.sap.sailing.gwt.home.mobile.places.event.minileaderboard.MiniLeaderbo import com.sap.sailing.gwt.home.shared.places.event.AbstractEventActivityProxy; import com.sap.sailing.gwt.home.shared.places.event.AbstractEventPlace; import com.sap.sailing.gwt.home.shared.places.event.EventContext; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; +import com.sap.sse.gwt.resources.CommonControlsCSS; +import com.sap.sse.gwt.resources.Highcharts; public class EventActivityProxy extends AbstractEventActivityProxy implements WithHeader { @@ -34,15 +42,31 @@ public class EventActivityProxy extends AbstractEventActivityProxy new EventRegattaActivity((AbstractEventRegattaPlace) place, event, clientFactory, + homePlacesNavigator, getNavigationPathDisplay(), flagImageResolver)); } if (place instanceof AbstractMultiregattaEventPlace) { - super.onSuccess(new EventMultiregattaActivity((AbstractMultiregattaEventPlace) place, event, + onSuccess(new EventMultiregattaActivity((AbstractMultiregattaEventPlace) place, event, clientFactory, homePlacesNavigator, getNavigationPathDisplay())); } } + private void withFlagImageResolver(final Function activityFactory) { + final Consumer onSuccess = super::onSuccess; + final Consumer onFailure = super::onFailure; + FlagImageResolver.get(new AsyncCallback() { + @Override + public void onSuccess(FlagImageResolver result) { + onSuccess.accept(activityFactory.apply(result)); + } + @Override + public void onFailure(Throwable caught) { + onFailure.accept(caught); + } + }); + } }); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/EventRegattaActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/EventRegattaActivity.java index 5e335393e0f..45d8156679b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/EventRegattaActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/EventRegattaActivity.java @@ -23,6 +23,7 @@ import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay; import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay.NavigationItem; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.places.event.EventContext; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardEntryPoint; import com.sap.sse.gwt.client.async.AsyncActionsExecutor; @@ -39,19 +40,20 @@ import com.sap.sse.security.ui.client.UserService; * The concrete {@link AbstractEventRegattaPlace} subclass, this instance is bound to. */ public class EventRegattaActivity extends AbstractEventActivity implements EventRegattaView.Presenter { - private EventRegattaView currentView = new TabletAndDesktopRegattaEventView(); + private EventRegattaView currentView; private final AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); private final long delayBetweenAutoAdvancesInMilliseconds = LeaderboardEntryPoint.DEFAULT_REFRESH_INTERVAL_MILLIS; public EventRegattaActivity(AbstractEventRegattaPlace place, EventViewDTO eventDTO, EventClientFactory clientFactory, - DesktopPlacesNavigator homePlacesNavigator, NavigationPathDisplay navigationPathDisplay) { + DesktopPlacesNavigator homePlacesNavigator, NavigationPathDisplay navigationPathDisplay, FlagImageResolver flagImageResolver) { super(place, eventDTO, clientFactory, homePlacesNavigator); + currentView = new TabletAndDesktopRegattaEventView(flagImageResolver); if (this.ctx.getRegattaAnalyticsManager() == null) { ctx.withRegattaAnalyticsManager(new RegattaAnalyticsDataManager( clientFactory.getSailingService(), asyncActionsExecutor, new Timer(PlayModes.Live, PlayStates.Paused, delayBetweenAutoAdvancesInMilliseconds), - clientFactory.getErrorReporter())); + clientFactory.getErrorReporter(), flagImageResolver)); } initNavigationPath(navigationPathDisplay); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/RegattaAnalyticsDataManager.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/RegattaAnalyticsDataManager.java index 511c223953c..9b093b80893 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/RegattaAnalyticsDataManager.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/RegattaAnalyticsDataManager.java @@ -5,6 +5,7 @@ import com.sap.sailing.gwt.settings.client.leaderboard.MultiCompetitorLeaderboar import com.sap.sailing.gwt.settings.client.leaderboard.MultiRaceLeaderboardSettings; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.DebugIdHelper; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.shared.charts.MultiCompetitorLeaderboardChart; @@ -32,9 +33,12 @@ public class RegattaAnalyticsDataManager { private final ErrorReporter errorReporter; private final SailingServiceAsync sailingService; private final Timer timer; + private final FlagImageResolver flagImageResolver; public RegattaAnalyticsDataManager(final SailingServiceAsync sailingService, - AsyncActionsExecutor asyncActionsExecutor, Timer timer, ErrorReporter errorReporter) { + AsyncActionsExecutor asyncActionsExecutor, Timer timer, ErrorReporter errorReporter, + FlagImageResolver flagImageResolver) { + this.flagImageResolver = flagImageResolver; this.competitorSelectionProvider = new CompetitorSelectionModel(/* hasMultiSelection */true); this.sailingService = sailingService; this.asyncActionsExecutor = asyncActionsExecutor; @@ -56,7 +60,8 @@ public class RegattaAnalyticsDataManager { competitorSelectionProvider, timer, leaderboardGroupName, leaderboardName, errorReporter, StringMessages.INSTANCE, showRaceDetails, /* competitorSearchTextBox */ null, /* showSelectionCheckbox */ true, /* raceTimesInfoProvider */ null, autoExpandLastRaceColumn, - /* adjustTimerDelay */ true, /* autoApplyTopNFilter */ false, /* showCompetitorFilterStatus */ false, /* enableSyncScroller */ true,new ClassicLeaderboardStyle()); + /* adjustTimerDelay */ true, /* autoApplyTopNFilter */ false, /* showCompetitorFilterStatus */ false, /* enableSyncScroller */ true, + new ClassicLeaderboardStyle(), flagImageResolver); } return leaderboardPanel; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java index 352da40a522..65bdfbdd1ba 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.java @@ -21,9 +21,12 @@ import com.sap.sailing.gwt.common.client.controls.tabbar.TabPanelPlaceSelectionE import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.desktop.partials.eventheader.EventHeader; import com.sap.sailing.gwt.home.desktop.partials.sailorinfo.SailorInfo; +import com.sap.sailing.gwt.home.desktop.places.event.regatta.overviewtab.RegattaOverviewTabView; +import com.sap.sailing.gwt.home.desktop.places.event.regatta.racestab.RegattaRacesTabView; import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesDefaultPlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.client.LinkUtil; @@ -40,10 +43,15 @@ public class TabletAndDesktopRegattaEventView extends Composite implements Event @UiField(provided = true) TabPanel> tabPanelUi; @UiField(provided = true) EventHeader eventHeader; + @UiField(provided = true) RegattaRacesTabView racesTabUi; + @UiField(provided = true) RegattaOverviewTabView regattaOverviewTabUi; private Presenter currentPresenter; - public TabletAndDesktopRegattaEventView() { + private final FlagImageResolver flagImageResolver; + + public TabletAndDesktopRegattaEventView(FlagImageResolver flagImageResolver) { + this.flagImageResolver = flagImageResolver; } @Override @@ -51,6 +59,8 @@ public class TabletAndDesktopRegattaEventView extends Composite implements Event this.currentPresenter = currentPresenter; tabPanelUi = new TabPanel<>(currentPresenter, historyMapper); eventHeader = new EventHeader(currentPresenter); + racesTabUi = new RegattaRacesTabView(flagImageResolver); + regattaOverviewTabUi = new RegattaOverviewTabView(flagImageResolver); initWidget(uiBinder.createAndBindUi(this)); if(currentPresenter.getEventDTO().getType() == EventType.SERIES) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.ui.xml index 86cbe0b7114..52281f92d7d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/TabletAndDesktopRegattaEventView.ui.xml @@ -10,10 +10,10 @@ - + - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/overviewtab/RegattaOverviewTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/overviewtab/RegattaOverviewTabView.java index 9683d7e519d..938fe8a873d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/overviewtab/RegattaOverviewTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/overviewtab/RegattaOverviewTabView.java @@ -31,6 +31,7 @@ import com.sap.sailing.gwt.home.shared.partials.statistics.EventStatisticsBox; import com.sap.sailing.gwt.home.shared.refresh.RefreshManager; import com.sap.sailing.gwt.home.shared.refresh.RefreshManagerWithErrorAndBusy; import com.sap.sailing.gwt.home.shared.refresh.RefreshableWidget; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; /** @@ -51,8 +52,10 @@ public class RegattaOverviewTabView extends Composite implements RegattaTabView< @UiField(provided = true) StandingsList standingsUi; @UiField(provided = true) EventStatisticsBox statisticsBoxUi; @UiField RaceOfficeSection raceOfficeSectionUi; + private final FlagImageResolver flagImageResolver; - public RegattaOverviewTabView() { + public RegattaOverviewTabView(FlagImageResolver flagImageResolver) { + this.flagImageResolver = flagImageResolver; } @Override @@ -71,7 +74,9 @@ public class RegattaOverviewTabView extends Composite implements RegattaTabView< stageUi = new EventOverviewStage(currentPresenter); statisticsBoxUi = new EventStatisticsBox(false, new DesktopStatisticsBoxView()); final HasRegattaMetadata regattaMetadata = currentPresenter.getRegattaMetadata(); - standingsUi = new StandingsList(regattaMetadata != null && regattaMetadata.getState() == RegattaState.FINISHED, currentPresenter.getRegattaLeaderboardNavigation(currentPresenter.getRegattaId())); + standingsUi = new StandingsList(regattaMetadata != null && regattaMetadata.getState() == RegattaState.FINISHED, + currentPresenter.getRegattaLeaderboardNavigation(currentPresenter.getRegattaId()), + flagImageResolver); initWidget(ourUiBinder.createAndBindUi(this)); if (!currentPresenter.showRegattaMetadata()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/racestab/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/racestab/RegattaRacesTabView.java index 16a7331997e..b2255cf55f5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/racestab/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/event/regatta/racestab/RegattaRacesTabView.java @@ -53,6 +53,7 @@ import com.sap.sailing.gwt.home.shared.refresh.ActionProvider.AbstractActionProv import com.sap.sailing.gwt.home.shared.refresh.RefreshManager; import com.sap.sailing.gwt.home.shared.refresh.RefreshManagerWithErrorAndBusy; import com.sap.sailing.gwt.home.shared.refresh.RefreshableWidget; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.gwt.dispatch.shared.commands.DTO; import com.sap.sse.gwt.dispatch.shared.commands.ResultWithTTL; @@ -94,6 +95,12 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView windSourcesCountColumn = RaceListColumnFactory.getWindSourcesCountColumn(); private final SortableRaceListColumn videoCountColumn = RaceListColumnFactory.getVideoCountColumn(); private final SortableRaceListColumn audioCountColumn = RaceListColumnFactory.getAudioCountColumn(); - private final SortableRaceListColumn winnerColumn = RaceListColumnFactory.getWinnerColumn(); + private final SortableRaceListColumn winnerColumn = RaceListColumnFactory.getWinnerColumn(flagImageResolver); private boolean hasWind; private boolean hasVideos; private boolean hasAudios; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/EventsActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/EventsActivity.java index 24d6b7c1c96..dc4f5df0ad7 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/EventsActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/EventsActivity.java @@ -10,21 +10,21 @@ import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator; import com.sap.sailing.gwt.home.shared.app.ActivityCallback; import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay; import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay.NavigationItem; +import com.sap.sailing.gwt.home.shared.app.ProvidesNavigationPath; import com.sap.sailing.gwt.home.shared.places.events.EventsPlace; import com.sap.sailing.gwt.ui.client.StringMessages; -public class EventsActivity extends AbstractActivity { +public class EventsActivity extends AbstractActivity implements ProvidesNavigationPath{ private final EventsClientFactory clientFactory; private final EventsPlace place; private final DesktopPlacesNavigator homePlacesNavigator; + private NavigationPathDisplay navigationPathDisplay; - public EventsActivity(EventsPlace place, EventsClientFactory clientFactory, DesktopPlacesNavigator homePlacesNavigator, NavigationPathDisplay navigationPathDisplay) { + public EventsActivity(EventsPlace place, EventsClientFactory clientFactory, DesktopPlacesNavigator homePlacesNavigator) { this.clientFactory = clientFactory; this.place = place; this.homePlacesNavigator = homePlacesNavigator; - - initNavigationPath(navigationPathDisplay); } private void initNavigationPath(NavigationPathDisplay navigationPathDisplay) { @@ -35,6 +35,7 @@ public class EventsActivity extends AbstractActivity { @Override public void start(final AcceptsOneWidget panel, EventBus eventBus) { + initNavigationPath(navigationPathDisplay); panel.setWidget(clientFactory.createBusyView()); clientFactory.getDispatch().execute(new GetEventListViewAction(), new ActivityCallback(clientFactory, panel) { @@ -47,4 +48,9 @@ public class EventsActivity extends AbstractActivity { } }); } + + @Override + public void setNavigationPathDisplay(NavigationPathDisplay navigationPathDisplay) { + this.navigationPathDisplay = navigationPathDisplay; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/EventsActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/EventsActivityProxy.java deleted file mode 100755 index 2aec550831c..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/events/EventsActivityProxy.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sap.sailing.gwt.home.desktop.places.events; - -import com.google.gwt.core.client.GWT; -import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator; -import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay; -import com.sap.sailing.gwt.home.shared.app.ProvidesNavigationPath; -import com.sap.sailing.gwt.home.shared.places.events.EventsPlace; -import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; - -public class EventsActivityProxy extends AbstractActivityProxy implements ProvidesNavigationPath { - - private final EventsClientFactory clientFactory; - private final EventsPlace place; - private NavigationPathDisplay navigationPathDisplay; - private final DesktopPlacesNavigator homePlacesNavigator; - - public EventsActivityProxy(EventsPlace place, EventsClientFactory clientFactory, DesktopPlacesNavigator homePlacesNavigator) { - this.place = place; - this.clientFactory = clientFactory; - this.homePlacesNavigator = homePlacesNavigator; - } - - @Override - protected void startAsync() { - GWT.runAsync(new AbstractRunAsyncCallback() { - @Override - public void onSuccess() { - super.onSuccess(new EventsActivity(place, clientFactory, homePlacesNavigator, navigationPathDisplay)); - } - }); - } - - @Override - public void setNavigationPathDisplay(NavigationPathDisplay navigationPathDisplay) { - this.navigationPathDisplay = navigationPathDisplay; - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/EventSeriesAnalyticsDataManager.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/EventSeriesAnalyticsDataManager.java index de8d3e3090e..c8bcf11c2f0 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/EventSeriesAnalyticsDataManager.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/EventSeriesAnalyticsDataManager.java @@ -11,6 +11,7 @@ import com.sap.sailing.gwt.settings.client.leaderboard.MultiRaceLeaderboardSetti import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.DebugIdHelper; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.shared.charts.MultiCompetitorLeaderboardChart; @@ -43,10 +44,13 @@ public class EventSeriesAnalyticsDataManager { private final ErrorReporter errorReporter; private final SailingServiceAsync sailingService; private final Timer timer; - private final int MAX_COMPETITORS_IN_CHART = 30; + private final int MAX_COMPETITORS_IN_CHART = 30; + private final FlagImageResolver flagImageResolver; public EventSeriesAnalyticsDataManager(final SailingServiceAsync sailingService, - AsyncActionsExecutor asyncActionsExecutor, Timer timer, ErrorReporter errorReporter) { + AsyncActionsExecutor asyncActionsExecutor, Timer timer, ErrorReporter errorReporter, + FlagImageResolver flagImageResolver) { + this.flagImageResolver = flagImageResolver; this.competitorSelectionProvider = new CompetitorSelectionModel(/* hasMultiSelection */true); this.sailingService = sailingService; this.asyncActionsExecutor = asyncActionsExecutor; @@ -67,7 +71,8 @@ public class EventSeriesAnalyticsDataManager { StringMessages.INSTANCE, showRaceDetails, /* competitorSearchTextBox */ null, /* showSelectionCheckbox */ true, /* raceTimesInfoProvider */null, autoExpandLastRaceColumn, /* adjustTimerDelay */ true, /* autoApplyTopNFilter */ false, - /* showCompetitorFilterStatus */ false, /* enableSyncScroller */ false, new ClassicLeaderboardStyle()); + /* showCompetitorFilterStatus */ false, /* enableSyncScroller */ false, new ClassicLeaderboardStyle(), + flagImageResolver); } return overallLeaderboardPanel; } @@ -93,7 +98,7 @@ public class EventSeriesAnalyticsDataManager { multiLeaderboardPanel = new MultiLeaderboardProxyPanel(parent, context, sailingService, metaLeaderboardName, asyncActionsExecutor, timer, true /* isEmbedded */, preselectedLeaderboardName, errorReporter, StringMessages.INSTANCE, - showRaceDetails, autoExpandLastRaceColumn, leaderboardSettings); + showRaceDetails, autoExpandLastRaceColumn, leaderboardSettings, flagImageResolver); } return multiLeaderboardPanel; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/SeriesActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/SeriesActivity.java index d442d37119f..3e615dad84c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/SeriesActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/SeriesActivity.java @@ -23,6 +23,7 @@ import com.sap.sailing.gwt.home.shared.places.fakeseries.AbstractSeriesPlace; import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesContext; import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesDefaultPlace; import com.sap.sailing.gwt.home.shared.places.start.StartPlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.refresh.ErrorAndBusyClientFactory; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardEntryPoint; @@ -49,7 +50,7 @@ public class SeriesActivity extends AbstractActivity implements SeriesView.Prese private final EventSeriesViewDTO series; public SeriesActivity(AbstractSeriesTabPlace place, EventSeriesViewDTO series, SeriesClientFactory clientFactory, - DesktopPlacesNavigator homePlacesNavigator, NavigationPathDisplay navigationPathDisplay) { + DesktopPlacesNavigator homePlacesNavigator, NavigationPathDisplay navigationPathDisplay, FlagImageResolver flagImageResolver) { this.currentPlace = place; this.series = series; this.ctx = new SeriesContext(place.getCtx()); @@ -61,7 +62,7 @@ public class SeriesActivity extends AbstractActivity implements SeriesView.Prese clientFactory.getSailingService(), // asyncActionsExecutor, // new Timer(PlayModes.Live, PlayStates.Paused, delayBetweenAutoAdvancesInMilliseconds), // - clientFactory.getErrorReporter())); + clientFactory.getErrorReporter(), flagImageResolver)); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/SeriesActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/SeriesActivityProxy.java index 0b2aa82fa1f..5093684a81c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/SeriesActivityProxy.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/fakeseries/SeriesActivityProxy.java @@ -1,8 +1,12 @@ package com.sap.sailing.gwt.home.desktop.places.fakeseries; import java.util.UUID; +import java.util.function.Consumer; +import java.util.function.Function; +import com.google.gwt.activity.shared.Activity; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sailing.gwt.home.client.place.event.legacy.SeriesClientFactory; import com.sap.sailing.gwt.home.communication.fakeseries.EventSeriesViewDTO; import com.sap.sailing.gwt.home.communication.fakeseries.GetEventSeriesViewAction; @@ -17,7 +21,10 @@ import com.sap.sailing.gwt.home.shared.app.ProvidesNavigationPath; import com.sap.sailing.gwt.home.shared.places.fakeseries.AbstractSeriesPlace; import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesContext; import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesDefaultPlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; +import com.sap.sse.gwt.resources.CommonControlsCSS; +import com.sap.sse.gwt.resources.Highcharts; public class SeriesActivityProxy extends AbstractActivityProxy implements ProvidesNavigationPath, WithHeader { @@ -60,8 +67,25 @@ public class SeriesActivityProxy extends AbstractActivityProxy implements Provid place = getRealPlace(series); } place = verifyAndAdjustPlace(); - super.onSuccess(new SeriesActivity((AbstractSeriesTabPlace) place, series, clientFactory, - homePlacesNavigator, navigationPathDisplay)); + + CommonControlsCSS.ensureInjected(); + Highcharts.ensureInjected(); + withFlagImageResolver(flagImageResolver -> new SeriesActivity((AbstractSeriesTabPlace) place, series, clientFactory, + homePlacesNavigator, navigationPathDisplay, flagImageResolver)); + } + private void withFlagImageResolver(final Function activityFactory) { + final Consumer onSuccess = super::onSuccess; + final Consumer onFailure = super::onFailure; + FlagImageResolver.get(new AsyncCallback() { + @Override + public void onSuccess(FlagImageResolver result) { + onSuccess.accept(activityFactory.apply(result)); + } + @Override + public void onFailure(Throwable caught) { + onFailure.accept(caught); + } + }); } }); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/morelogininformation/MoreLoginInformationActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/morelogininformation/MoreLoginInformationActivityProxy.java new file mode 100644 index 00000000000..e0f998363b3 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/morelogininformation/MoreLoginInformationActivityProxy.java @@ -0,0 +1,29 @@ +package com.sap.sailing.gwt.home.desktop.places.morelogininformation; + +import com.google.gwt.core.client.GWT; +import com.sap.sailing.gwt.home.desktop.app.DesktopClientFactory; +import com.sap.sailing.gwt.home.shared.places.morelogininformation.MoreLoginInformationPlace; +import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; + +public class MoreLoginInformationActivityProxy extends AbstractActivityProxy { + + private final MoreLoginInformationPlace currentPlace; + private final DesktopClientFactory clientFactory; + + public MoreLoginInformationActivityProxy(MoreLoginInformationPlace currentPlace, + DesktopClientFactory clientFactory) { + this.currentPlace = currentPlace; + this.clientFactory = clientFactory; + } + + @Override + protected void startAsync() { + GWT.runAsync(new AbstractRunAsyncCallback() { + @Override + public void onSuccess() { + super.onSuccess(new MoreLoginInformationActivity(currentPlace, clientFactory)); + } + }); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/start/StartActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/start/StartActivityProxy.java deleted file mode 100644 index 7d91ee4a344..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/start/StartActivityProxy.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.gwt.home.desktop.places.start; - -import com.google.gwt.core.client.GWT; -import com.sap.sailing.gwt.home.shared.places.start.StartPlace; -import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; - -public class StartActivityProxy extends AbstractActivityProxy { - - private final StartClientFactory clientFactory; - private final StartPlace place; - - public StartActivityProxy(StartPlace place, StartClientFactory clientFactory) { - this.place = place; - this.clientFactory = clientFactory; - } - - @Override - protected void startAsync() { - GWT.runAsync(new AbstractRunAsyncCallback() { - @Override - public void onSuccess() { - super.onSuccess(new StartActivity(place, clientFactory)); - } - }); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java index e16781ec729..81171480beb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java @@ -12,8 +12,10 @@ import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.common.client.controls.tabbar.TabPanel; import com.sap.sailing.gwt.common.client.controls.tabbar.TabPanelPlaceSelectionEvent; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; +import com.sap.sailing.gwt.home.desktop.places.user.profile.preferencestab.UserProfilePreferencesTabView; import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper; import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sse.security.ui.authentication.app.AuthenticationContext; import com.sap.sse.security.ui.userprofile.desktop.userheader.UserHeader; @@ -35,8 +37,14 @@ public class TabletAndDesktopUserProfileView extends Composite implements UserPr @UiField(provided = true) UserHeader headerUi; + + @UiField(provided = true) + UserProfilePreferencesTabView preferencesTabUi; - public TabletAndDesktopUserProfileView() { + private final FlagImageResolver flagImageResolver; + + public TabletAndDesktopUserProfileView(FlagImageResolver flagImageResolver) { + this.flagImageResolver = flagImageResolver; } @Override @@ -46,6 +54,8 @@ public class TabletAndDesktopUserProfileView extends Composite implements UserPr headerUi = new UserHeader(SharedResources.INSTANCE); + preferencesTabUi = new UserProfilePreferencesTabView(flagImageResolver); + initWidget(uiBinder.createAndBindUi(this)); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java index 4e862c97c4a..92b2b71c51b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java @@ -16,6 +16,7 @@ import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.places.fakeseries.AbstractSeriesPlace; import com.sap.sailing.gwt.home.shared.places.start.StartPlace; import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; import com.sap.sse.security.ui.authentication.AuthenticationPlaces; import com.sap.sse.security.ui.authentication.AuthenticationRequestEvent; @@ -31,13 +32,14 @@ public class UserProfileActivity extends AbstractActivity implements UserProfile private final StringMessages i18n_sec = StringMessages.INSTANCE; - private UserProfileView currentView = new TabletAndDesktopUserProfileView(); + private UserProfileView currentView; public UserProfileActivity(AbstractUserProfilePlace place, UserProfileClientFactory clientFactory, - DesktopPlacesNavigator homePlacesNavigator, NavigationPathDisplay navigationPathDisplay) { + DesktopPlacesNavigator homePlacesNavigator, NavigationPathDisplay navigationPathDisplay, FlagImageResolver flagImageResolver) { this.currentPlace = place; this.clientFactory = clientFactory; this.homePlacesNavigator = homePlacesNavigator; + currentView = new TabletAndDesktopUserProfileView(flagImageResolver); initNavigationPath(navigationPathDisplay); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivityProxy.java index 6fba8a17d4f..daa4f0d4b11 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivityProxy.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivityProxy.java @@ -1,6 +1,11 @@ package com.sap.sailing.gwt.home.desktop.places.user.profile; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.google.gwt.activity.shared.Activity; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator; import com.sap.sailing.gwt.home.desktop.app.WithHeader; import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay; @@ -8,6 +13,7 @@ import com.sap.sailing.gwt.home.shared.app.ProvidesNavigationPath; import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; import com.sap.sailing.gwt.home.shared.places.user.profile.UserProfileDefaultPlace; import com.sap.sailing.gwt.home.shared.places.user.profile.UserProfileDetailsPlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; public class UserProfileActivityProxy extends AbstractActivityProxy implements ProvidesNavigationPath, WithHeader { @@ -37,8 +43,22 @@ public class UserProfileActivityProxy extends AbstractActivityProxy implements P if(place instanceof UserProfileDefaultPlace) { place = new UserProfileDetailsPlace(); } - super.onSuccess(new UserProfileActivity(place, clientFactory, - homePlacesNavigator, navigationPathDisplay)); + withFlagImageResolver(flagImageResolver -> new UserProfileActivity(place, clientFactory, + homePlacesNavigator, navigationPathDisplay, flagImageResolver)); + } + private void withFlagImageResolver(final Function activityFactory) { + final Consumer onSuccess = super::onSuccess; + final Consumer onFailure = super::onFailure; + FlagImageResolver.get(new AsyncCallback() { + @Override + public void onSuccess(FlagImageResolver result) { + onSuccess.accept(activityFactory.apply(result)); + } + @Override + public void onFailure(Throwable caught) { + onFailure.accept(caught); + } + }); } }); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/preferencestab/UserProfilePreferencesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/preferencestab/UserProfilePreferencesTabView.java index 1171775ba5a..cf72424585d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/preferencestab/UserProfilePreferencesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/preferencestab/UserProfilePreferencesTabView.java @@ -6,12 +6,18 @@ import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.desktop.places.user.profile.UserProfileTabView; import com.sap.sailing.gwt.home.desktop.places.user.profile.UserProfileView; import com.sap.sailing.gwt.home.shared.places.user.profile.preferences.UserProfilePreferencesPlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sse.security.ui.authentication.app.AuthenticationContext; public class UserProfilePreferencesTabView extends Composite implements UserProfileTabView { private UserProfilePreferencesView.Presenter currentPresenter; private UserProfilePreferencesView view; + private final FlagImageResolver flagImageResolver; + + public UserProfilePreferencesTabView(FlagImageResolver flagImageResolver) { + this.flagImageResolver = flagImageResolver; + } @Override public Class getPlaceClassForActivation() { @@ -44,7 +50,7 @@ public class UserProfilePreferencesTabView extends Composite implements UserProf @Override public void setPresenter(UserProfileView.Presenter currentPresenter) { - view = new UserProfilePreferencesViewImpl(); + view = new UserProfilePreferencesViewImpl(flagImageResolver); this.currentPresenter = new UserProfilePreferencesPresenter(view, currentPresenter); } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/preferencestab/UserProfilePreferencesViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/preferencestab/UserProfilePreferencesViewImpl.java index e52c562e848..c8027487a6b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/preferencestab/UserProfilePreferencesViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/preferencestab/UserProfilePreferencesViewImpl.java @@ -7,6 +7,7 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.home.shared.places.user.profile.preferences.UserPreferences; import com.sap.sailing.gwt.home.shared.usermanagement.decorator.AuthorizedContentDecoratorDesktop; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sse.security.ui.authentication.app.NeedsAuthenticationContext; public class UserProfilePreferencesViewImpl extends Composite implements UserProfilePreferencesView { @@ -18,11 +19,17 @@ public class UserProfilePreferencesViewImpl extends Composite implements UserPro @UiField(provided = true) AuthorizedContentDecoratorDesktop decoratorUi; @UiField(provided = true) UserPreferences userPreferencesUi; + + private final FlagImageResolver flagImageResolver; + + public UserProfilePreferencesViewImpl(FlagImageResolver flagImageResolver) { + this.flagImageResolver = flagImageResolver; + } @Override public void setPresenter(Presenter presenter) { decoratorUi = new AuthorizedContentDecoratorDesktop(presenter); - userPreferencesUi = new UserPreferences(presenter.getUserPreferencesPresenter()); + userPreferencesUi = new UserPreferences(presenter.getUserPreferencesPresenter(), flagImageResolver); initWidget(uiBinder.createAndBindUi(this)); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html index 085156b1589..a931629d8fb 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html @@ -4,6 +4,28 @@

    What's New - SAP Sailing Analytics

    +
    November 2017
    +
      +
    • The language preference set in the user profile (if any), now also affects the website's language. Formerly, + this preference affected the language of notification mails only. + Be aware of the fact, that signing in will not force the page to be shown in the user's preferred language. + It will only take effect when refreshing the page manually or opening a new one, in order to prevent the + state of the currently opened page to get lost. + After a sign out (and another page reload) the language preference will stop to take effect. +
    • +
    • There are additional column types in the leaderboard that show per leg, per race and overall statistics + for distance foiled and duration foiled. This allows for quick competitor comparisons regarding these + figures which are so important for any foiling boat class. Note, that this feature is also available + on overall leaderboards, providing foiling stats across an entire season or event series. +
    • +
    • When a leaderboard belongs to a leaderboard group with an overall (series) leaderboard and the + leaderboard has no scores at all yet for a competitor, that competitor won't be assigned a score + in the overall (series) leaderboard either. This way, when an act or event has its leaderboard already + linked to the series leaderboard group, no scores will show in the series leaderboard before the + act/event starts producing scores for the competitors. +
    • +
    +
    October 2017
  • - +
    @@ -25,7 +26,7 @@
    - +
    diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/Solutions.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/Solutions.ui.xml index 52f267f3fd4..1426c91dde1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/Solutions.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/Solutions.ui.xml @@ -5,10 +5,11 @@ xmlns:sb="urn:import:com.sap.sailing.gwt.home.shared.partials.storebadges"> + + image="{res_local.sapInSailing}" showInitial="true">

    @@ -60,7 +61,7 @@ + image="{res_local.sapTrimmed}" showInitial="false">

    @@ -78,7 +79,7 @@ + image="{res_local.race}" showInitial="false">

    @@ -94,7 +95,7 @@ + image="{res_local.sapSailingInsight}" showInitial="false">

    @@ -111,7 +112,7 @@ + image="{res_local.sapSailingBuoyPinger}" showInitial="false">

    @@ -127,7 +128,7 @@ + image="{res_local.postTrimmed}" showInitial="false">

    @@ -142,7 +143,7 @@ + image="{res_local.simulatorTrimmed}" showInitial="false">

    diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/SolutionsItem.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/SolutionsItem.java index d841792ee5c..9d42fcc7031 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/SolutionsItem.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/SolutionsItem.java @@ -1,13 +1,14 @@ package com.sap.sailing.gwt.home.mobile.partials.solutions; +import com.google.gwt.resources.client.ImageResource; import com.google.gwt.uibinder.client.UiConstructor; import com.sap.sailing.gwt.home.mobile.partials.accordion.AccordionItem; public class SolutionsItem extends AccordionItem { @UiConstructor - public SolutionsItem(String title, String imageUrl, boolean showInitial) { - super(title, imageUrl, title, showInitial); + public SolutionsItem(String title, ImageResource image, boolean showInitial) { + super(title, image, title, showInitial); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/SolutionsResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/SolutionsResources.java new file mode 100644 index 00000000000..170406cf0c9 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/SolutionsResources.java @@ -0,0 +1,20 @@ +package com.sap.sailing.gwt.home.mobile.partials.solutions; + +import com.google.gwt.resources.client.ImageResource; +import com.sap.sailing.gwt.home.shared.partials.solutions.SolutionsSharedResources; + +public interface SolutionsResources extends SolutionsSharedResources { + + @Source("solutions-sap-trimmed.png") + ImageResource sapTrimmed(); + + @Source("solutions-race.png") + ImageResource race(); + + @Source("solutions-post-trimmed.png") + ImageResource postTrimmed(); + + @Source("solutions-simulator-trimmed.png") + ImageResource simulatorTrimmed(); + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-post-trimmed.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-post-trimmed.png new file mode 100644 index 00000000000..80d1b3172a4 Binary files /dev/null and b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-post-trimmed.png differ diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-race.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-race.png new file mode 100644 index 00000000000..ee141f53532 Binary files /dev/null and b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-race.png differ diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-sap-trimmed.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-sap-trimmed.png new file mode 100644 index 00000000000..9b1e60bed59 Binary files /dev/null and b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-sap-trimmed.png differ diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-simulator-trimmed.png b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-simulator-trimmed.png similarity index 93% rename from java/com.sap.sailing.gwt.ui/images/mobile/solutions-simulator-trimmed.png rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-simulator-trimmed.png index 522e7eeedd4..25ec681ee0b 100644 Binary files a/java/com.sap.sailing.gwt.ui/images/mobile/solutions-simulator-trimmed.png and b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/solutions/solutions-simulator-trimmed.png differ diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcoming.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcoming.ui.xml index e4d65742f73..50620b4e50d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcoming.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcoming.ui.xml @@ -5,11 +5,12 @@ + - +

    @@ -17,7 +18,7 @@
    - +
    diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcomingEvent.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcomingEvent.ui.xml index a881101438e..12d6ea157d0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcomingEvent.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcomingEvent.ui.xml @@ -5,6 +5,7 @@ + .holder { @@ -25,7 +26,7 @@
    diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcomingResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcomingResources.java index 408bbae56cf..8d6251cbb2d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcomingResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/EventsOverviewUpcomingResources.java @@ -3,12 +3,18 @@ package com.sap.sailing.gwt.home.mobile.partials.upcoming; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.DataResource; +import com.google.gwt.resources.client.DataResource.MimeType; public interface EventsOverviewUpcomingResources extends ClientBundle { public static final EventsOverviewUpcomingResources INSTANCE = GWT.create(EventsOverviewUpcomingResources.class); @Source("EventsOverviewUpcoming.gss") LocalCss css(); + + @Source("calender-icon-blue.svg") + @MimeType("image/svg+xml") + DataResource calendar(); public interface LocalCss extends CssResource { String accordion(); diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/calender-icon-blue.svg b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/calender-icon-blue.svg similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/mobile/calender-icon-blue.svg rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/upcoming/calender-icon-blue.svg diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBox.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBox.gss index a05bc5e5f9b..5da0d909f16 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBox.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBox.gss @@ -44,11 +44,22 @@ position: relative; color: #0a0a0a; } -.updatesbox_itemlink { - background-image: url("images/home/arrow-grey-right.png"); +.updatesbox_itemlink:before { + position: absolute; + content: ""; + right: 1em; + /* @alternate */ top: 50%; + /* @alternate */ top: calc(50% - 1.3333334em / 2); + height: 1.3333334em; + width: 1.3333334em; + background-size: 100%; + background-position: center; + background-image: resourceUrl('arrowDownGrey'); background-repeat: no-repeat; - background-size: 9px 16px; - background-position: 95% 50%; + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); } .updatesbox_itemlink:hover { text-decoration: none; @@ -68,6 +79,7 @@ background-repeat: no-repeat; -webkit-filter: grayscale(100%); filter: grayscale(100%); + background-image: resourceUrl("news"); } @media (max-width: 1190px) { .updatesbox_item_icon { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBoxItem.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBoxItem.ui.xml index c5c35020e10..ea41ccf45b9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBoxItem.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBoxItem.ui.xml @@ -4,7 +4,7 @@
  • -
    +
    diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBoxResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBoxResources.java index 046477e0f1e..283441e9247 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBoxResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/updatesBox/UpdatesBoxResources.java @@ -1,10 +1,10 @@ package com.sap.sailing.gwt.home.mobile.partials.updatesBox; import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.sap.sailing.gwt.home.shared.resources.SharedHomeResources; -public interface UpdatesBoxResources extends ClientBundle { +public interface UpdatesBoxResources extends SharedHomeResources { public static final UpdatesBoxResources INSTANCE = GWT.create(UpdatesBoxResources.class); @Source("UpdatesBox.gss") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/videogallery/VideoGallery.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/videogallery/VideoGallery.gss index a7a07165871..92274edc530 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/videogallery/VideoGallery.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/videogallery/VideoGallery.gss @@ -10,15 +10,6 @@ .videoitem .info { font-size: inherit; } -.videoitem .playicon { - position: absolute; - cursor: pointer; - width: 100%; - height: 100%; - background: url("../images/home/play-icon.svg") no-repeat; - background-size: 2.333333333333333em 2.333333333333333em; - background-position: center; -} .videoitem .videoplaceholder { height: 100%; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/videogallery/VideoGalleryResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/videogallery/VideoGalleryResources.java index 40a9853d96e..666e8555f08 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/videogallery/VideoGalleryResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/videogallery/VideoGalleryResources.java @@ -14,7 +14,6 @@ public interface VideoGalleryResources extends ClientBundle { String videoitem(); String playbutton(); String info(); - String playicon(); String videoplaceholder(); String videoplaceholder_image(); String video(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/EventActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/EventActivityProxy.java index 1a0375faa50..85013e065d7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/EventActivityProxy.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/EventActivityProxy.java @@ -1,6 +1,11 @@ package com.sap.sailing.gwt.home.mobile.places.event; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.google.gwt.activity.shared.Activity; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sailing.gwt.home.communication.eventview.EventViewDTO; import com.sap.sailing.gwt.home.desktop.places.event.multiregatta.mediatab.MultiregattaMediaPlace; import com.sap.sailing.gwt.home.desktop.places.event.multiregatta.overviewtab.MultiregattaOverviewPlace; @@ -19,6 +24,7 @@ import com.sap.sailing.gwt.home.mobile.places.event.overview.regatta.RegattaActi import com.sap.sailing.gwt.home.mobile.places.event.races.RacesActivity; import com.sap.sailing.gwt.home.shared.places.event.AbstractEventActivityProxy; import com.sap.sailing.gwt.home.shared.places.event.AbstractEventPlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; public class EventActivityProxy extends AbstractEventActivityProxy { @@ -35,17 +41,32 @@ public class EventActivityProxy extends AbstractEventActivityProxy new RegattaActivity((RegattaOverviewPlace) place, event, getNavigationPathDisplay(), clientFactory, flagImageResolver)); } else if (place instanceof RegattaRacesPlace) { super.onSuccess(new RacesActivity((RegattaRacesPlace) place, event, getNavigationPathDisplay(), clientFactory)); } else if (place instanceof MiniLeaderboardPlace) { - super.onSuccess(new MiniLeaderboardActivity((MiniLeaderboardPlace) place, event, getNavigationPathDisplay(), clientFactory)); + withFlagImageResolver(flagImageResolver -> new MiniLeaderboardActivity((MiniLeaderboardPlace) place, event, getNavigationPathDisplay(), clientFactory, flagImageResolver)); } else if (place instanceof LatestNewsPlace) { super.onSuccess(new LatestNewsActivity((LatestNewsPlace) place, event, getNavigationPathDisplay(), clientFactory)); } else if (place instanceof RegattaMediaPlace || place instanceof MultiregattaMediaPlace) { super.onSuccess(new MediaActivity(place, event, getNavigationPathDisplay(), clientFactory)); } } + + private void withFlagImageResolver(final Function activityFactory) { + final Consumer onSuccess = super::onSuccess; + final Consumer onFailure = super::onFailure; + FlagImageResolver.get(new AsyncCallback() { + @Override + public void onSuccess(FlagImageResolver result) { + onSuccess.accept(activityFactory.apply(result)); + } + @Override + public void onFailure(Throwable caught) { + onFailure.accept(caught); + } + }); + } }); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/minileaderboard/MiniLeaderboardActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/minileaderboard/MiniLeaderboardActivity.java index 6cb83f64322..e72e6a7782c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/minileaderboard/MiniLeaderboardActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/minileaderboard/MiniLeaderboardActivity.java @@ -9,12 +9,16 @@ import com.sap.sailing.gwt.home.mobile.places.event.EventViewBase; import com.sap.sailing.gwt.home.mobile.places.event.minileaderboard.MiniLeaderboardView.Presenter; import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay; import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay.NavigationItem; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; public class MiniLeaderboardActivity extends AbstractEventActivity implements Presenter { - public MiniLeaderboardActivity(MiniLeaderboardPlace place, EventViewDTO eventDTO, NavigationPathDisplay navigationPathDisplay, MobileApplicationClientFactory clientFactory) { + private final FlagImageResolver flagImageResolver; + + public MiniLeaderboardActivity(MiniLeaderboardPlace place, EventViewDTO eventDTO, NavigationPathDisplay navigationPathDisplay, MobileApplicationClientFactory clientFactory, FlagImageResolver flagImageResolver) { super(place, eventDTO, clientFactory); + this.flagImageResolver = flagImageResolver; initNavigationPath(navigationPathDisplay); } @@ -27,7 +31,7 @@ public class MiniLeaderboardActivity extends AbstractEventActivity implements MiniLeaderboardView { @@ -12,9 +13,9 @@ public class MiniLeaderboardViewImpl extends AbstractEventView implements EventViewBase.Presenter { - public RegattaActivity(RegattaOverviewPlace place, EventViewDTO eventDTO, NavigationPathDisplay navigationPathDisplay, MobileApplicationClientFactory clientFactory) { + private final FlagImageResolver flagImageResolver; + + public RegattaActivity(RegattaOverviewPlace place, EventViewDTO eventDTO, NavigationPathDisplay navigationPathDisplay, MobileApplicationClientFactory clientFactory, FlagImageResolver flagImageResolver) { super(place, eventDTO, clientFactory); + this.flagImageResolver = flagImageResolver; initNavigationPath(navigationPathDisplay); } @@ -25,7 +29,7 @@ public class RegattaActivity extends AbstractEventActivity @Override protected EventViewBase initView() { - final AbstractEventOverview view = new RegattaOverviewImpl(this); + final AbstractEventOverview view = new RegattaOverviewImpl(this, flagImageResolver); initSeriesNavigation(view); initQuickfinder(view, true); if (!isMultiRegattaEvent()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/overview/regatta/RegattaOverviewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/overview/regatta/RegattaOverviewImpl.java index 629832b022a..83403e8d3a8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/overview/regatta/RegattaOverviewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/overview/regatta/RegattaOverviewImpl.java @@ -19,6 +19,7 @@ import com.sap.sailing.gwt.home.mobile.partials.quickfinder.Quickfinder; import com.sap.sailing.gwt.home.mobile.places.QuickfinderPresenter; import com.sap.sailing.gwt.home.mobile.places.event.EventViewBase; import com.sap.sailing.gwt.home.mobile.places.event.overview.AbstractEventOverview; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; public class RegattaOverviewImpl extends AbstractEventOverview { @@ -28,8 +29,11 @@ public class RegattaOverviewImpl extends AbstractEventOverview { private EventSteps eventStepsUi; private RegattaLiveRaces liveRacesUi; - public RegattaOverviewImpl(EventViewBase.Presenter presenter) { + private final FlagImageResolver flagImageResolver; + + public RegattaOverviewImpl(EventViewBase.Presenter presenter, FlagImageResolver flagImageResolver) { super(presenter, presenter.isMultiRegattaEvent(), presenter.isMultiRegattaEvent()); + this.flagImageResolver = flagImageResolver; FlowPanel container = new FlowPanel(); if (presenter.getRegatta() != null) { this.setupProgress(container); @@ -62,7 +66,7 @@ public class RegattaOverviewImpl extends AbstractEventOverview { } private void setupMiniLeaderboard(Panel container) { - MinileaderboardBox miniLeaderboard = new MinileaderboardBox(false); + MinileaderboardBox miniLeaderboard = new MinileaderboardBox(false, flagImageResolver); miniLeaderboard.setAction(MSG.showAll(), currentPresenter.getRegattaMiniLeaderboardNavigation(getRegattaId())); if (currentPresenter.getRegatta() != null) { refreshManager.add(miniLeaderboard, new GetMiniLeaderbordAction(getEventId(), getRegattaId(), 3)); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/events/EventsActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/events/EventsActivityProxy.java deleted file mode 100755 index 4d65e26ae5f..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/events/EventsActivityProxy.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.sap.sailing.gwt.home.mobile.places.events; - -import com.google.gwt.core.client.GWT; -import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory; -import com.sap.sailing.gwt.home.shared.places.events.EventsPlace; -import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; - -public class EventsActivityProxy extends AbstractActivityProxy { - - private final MobileApplicationClientFactory clientFactory; - private final EventsPlace currentPlace; - - public EventsActivityProxy(EventsPlace place, MobileApplicationClientFactory clientFactory) { - this.currentPlace = place; - this.clientFactory = clientFactory; - } - - @Override - protected void startAsync() { - GWT.runAsync(new AbstractRunAsyncCallback() { - @Override - public void onSuccess() { - super.onSuccess(new EventsActivity(currentPlace, clientFactory)); - } - }); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/morelogininformation/MoreLoginInformationActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/morelogininformation/MoreLoginInformationActivityProxy.java new file mode 100644 index 00000000000..c02330ea929 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/morelogininformation/MoreLoginInformationActivityProxy.java @@ -0,0 +1,29 @@ +package com.sap.sailing.gwt.home.mobile.places.morelogininformation; + +import com.google.gwt.core.client.GWT; +import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory; +import com.sap.sailing.gwt.home.shared.places.morelogininformation.MoreLoginInformationPlace; +import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; + +public class MoreLoginInformationActivityProxy extends AbstractActivityProxy { + + private final MoreLoginInformationPlace currentPlace; + private final MobileApplicationClientFactory clientFactory; + + public MoreLoginInformationActivityProxy(MoreLoginInformationPlace currentPlace, + MobileApplicationClientFactory clientFactory) { + this.currentPlace = currentPlace; + this.clientFactory = clientFactory; + } + + @Override + protected void startAsync() { + GWT.runAsync(new AbstractRunAsyncCallback() { + @Override + public void onSuccess() { + super.onSuccess(new MoreLoginInformationActivity(currentPlace, clientFactory)); + } + }); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesActivity.java index 0dfb716bcac..43d87f3c873 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesActivity.java @@ -18,17 +18,20 @@ import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay.NavigationItem; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.places.fakeseries.AbstractSeriesPlace; import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesContext; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; public class SeriesActivity extends AbstractActivity implements SeriesView.Presenter { private final MobileApplicationClientFactory clientFactory; private final AbstractSeriesPlace place; private EventSeriesViewDTO series; private final NavigationPathDisplay navigationPathDisplay; + private final FlagImageResolver flagImageResolver; - public SeriesActivity(AbstractSeriesPlace place, NavigationPathDisplay navigationPathDisplay, MobileApplicationClientFactory clientFactory) { + public SeriesActivity(AbstractSeriesPlace place, NavigationPathDisplay navigationPathDisplay, MobileApplicationClientFactory clientFactory, FlagImageResolver flagImageResolver) { this.navigationPathDisplay = navigationPathDisplay; this.clientFactory = clientFactory; this.place = place; + this.flagImageResolver = flagImageResolver; } @Override @@ -46,7 +49,7 @@ public class SeriesActivity extends AbstractActivity implements SeriesView.Prese } private void initUi(final AcceptsOneWidget panel, EventBus eventBus, EventSeriesViewDTO series) { - final SeriesView view = new SeriesViewImpl(this); + final SeriesView view = new SeriesViewImpl(this, flagImageResolver); view.setQuickFinderValues(series.getDisplayName(), series.getEventsDescending()); panel.setWidget(view.asWidget()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesActivityProxy.java index 1bd0f3811f5..4ce421ea3b8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesActivityProxy.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesActivityProxy.java @@ -1,10 +1,16 @@ package com.sap.sailing.gwt.home.mobile.places.series; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.google.gwt.activity.shared.Activity; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory; import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay; import com.sap.sailing.gwt.home.shared.app.ProvidesNavigationPath; import com.sap.sailing.gwt.home.shared.places.fakeseries.AbstractSeriesPlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; public class SeriesActivityProxy extends AbstractActivityProxy implements ProvidesNavigationPath { @@ -28,7 +34,21 @@ public class SeriesActivityProxy extends AbstractActivityProxy implements Provid GWT.runAsync(new AbstractRunAsyncCallback() { @Override public void onSuccess() { - super.onSuccess(new SeriesActivity(currentPlace, navigationPathDisplay, clientFactory)); + withFlagImageResolver(flagImageResolver -> new SeriesActivity(currentPlace, navigationPathDisplay, clientFactory, flagImageResolver)); + } + private void withFlagImageResolver(final Function activityFactory) { + final Consumer onSuccess = super::onSuccess; + final Consumer onFailure = super::onFailure; + FlagImageResolver.get(new AsyncCallback() { + @Override + public void onSuccess(FlagImageResolver result) { + onSuccess.accept(activityFactory.apply(result)); + } + @Override + public void onFailure(Throwable caught) { + onFailure.accept(caught); + } + }); } }); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesViewImpl.java index 29f105b7b72..400bafadfcb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesViewImpl.java @@ -22,6 +22,7 @@ import com.sap.sailing.gwt.home.mobile.places.QuickfinderPresenter; import com.sap.sailing.gwt.home.shared.partials.statistics.EventStatisticsBox; import com.sap.sailing.gwt.home.shared.refresh.LifecycleRefreshManager; import com.sap.sailing.gwt.home.shared.refresh.RefreshManager; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; public class SeriesViewImpl extends Composite implements SeriesView { @@ -40,13 +41,13 @@ public class SeriesViewImpl extends Composite implements SeriesView { private final Presenter currentPresenter; private final RefreshManager refreshManager; - public SeriesViewImpl(SeriesView.Presenter presenter) { + public SeriesViewImpl(SeriesView.Presenter presenter, FlagImageResolver flagImageResolver) { this.currentPresenter = presenter; this.refreshManager = new LifecycleRefreshManager(this, currentPresenter.getDispatch()); EventSeriesViewDTO series = currentPresenter.getSeriesDTO(); eventHeaderUi = new SeriesHeader(series); this.setupStatisticsBox(series); - leaderboardUi = new MinileaderboardBox(true); + leaderboardUi = new MinileaderboardBox(true, flagImageResolver); initWidget(uiBinder.createAndBindUi(this)); this.setupListContent(series); this.setupEventListContent(series); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardActivity.java index 71b98f481bd..4f669b1ef93 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardActivity.java @@ -17,6 +17,7 @@ import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay.NavigationItem; import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesContext; import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesDefaultPlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; public class SeriesMiniOverallLeaderboardActivity extends AbstractActivity implements SeriesMiniOverallLeaderboardView.Presenter { @@ -24,11 +25,13 @@ public class SeriesMiniOverallLeaderboardActivity extends AbstractActivity imple private final SeriesMiniOverallLeaderboardPlace place; private EventSeriesViewDTO series; private final NavigationPathDisplay navigationPathDisplay; + private final FlagImageResolver flagImageResolver; - public SeriesMiniOverallLeaderboardActivity(SeriesMiniOverallLeaderboardPlace place, NavigationPathDisplay navigationPathDisplay, MobileApplicationClientFactory clientFactory) { + public SeriesMiniOverallLeaderboardActivity(SeriesMiniOverallLeaderboardPlace place, NavigationPathDisplay navigationPathDisplay, MobileApplicationClientFactory clientFactory, FlagImageResolver flagImageResolver) { this.navigationPathDisplay = navigationPathDisplay; this.clientFactory = clientFactory; this.place = place; + this.flagImageResolver = flagImageResolver; } @Override @@ -47,7 +50,7 @@ public class SeriesMiniOverallLeaderboardActivity extends AbstractActivity imple } private void initUi(AcceptsOneWidget panel, EventBus eventBus, EventSeriesViewDTO series) { - final SeriesMiniOverallLeaderboardView view = new SeriesMiniOverallLeaderboardViewImpl(this); + final SeriesMiniOverallLeaderboardView view = new SeriesMiniOverallLeaderboardViewImpl(this, flagImageResolver); view.setQuickFinderValues(series.getDisplayName(), series.getEventsDescending()); panel.setWidget(view.asWidget()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardActivityProxy.java index 6a78c02729b..37542e98c03 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardActivityProxy.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardActivityProxy.java @@ -1,9 +1,15 @@ package com.sap.sailing.gwt.home.mobile.places.series.minileaderboard; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.google.gwt.activity.shared.Activity; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory; import com.sap.sailing.gwt.home.shared.app.NavigationPathDisplay; import com.sap.sailing.gwt.home.shared.app.ProvidesNavigationPath; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; public class SeriesMiniOverallLeaderboardActivityProxy extends AbstractActivityProxy implements ProvidesNavigationPath { @@ -27,8 +33,23 @@ public class SeriesMiniOverallLeaderboardActivityProxy extends AbstractActivityP GWT.runAsync(new AbstractRunAsyncCallback() { @Override public void onSuccess() { - super.onSuccess(new SeriesMiniOverallLeaderboardActivity(currentPlace, navigationPathDisplay, clientFactory)); + withFlagImageResolver(flagImageResolver -> new SeriesMiniOverallLeaderboardActivity(currentPlace, navigationPathDisplay, clientFactory, flagImageResolver)); + } + private void withFlagImageResolver(final Function activityFactory) { + final Consumer onSuccess = super::onSuccess; + final Consumer onFailure = super::onFailure; + FlagImageResolver.get(new AsyncCallback() { + @Override + public void onSuccess(FlagImageResolver result) { + onSuccess.accept(activityFactory.apply(result)); + } + @Override + public void onFailure(Throwable caught) { + onFailure.accept(caught); + } + }); } }); + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardViewImpl.java index c30a3667813..71dd3b0716d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardViewImpl.java @@ -17,6 +17,7 @@ import com.sap.sailing.gwt.home.mobile.places.QuickfinderPresenter; import com.sap.sailing.gwt.home.shared.places.fakeseries.SeriesContext; import com.sap.sailing.gwt.home.shared.refresh.LifecycleRefreshManager; import com.sap.sailing.gwt.home.shared.refresh.RefreshManager; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; public class SeriesMiniOverallLeaderboardViewImpl extends Composite implements SeriesMiniOverallLeaderboardView { @@ -33,9 +34,9 @@ public class SeriesMiniOverallLeaderboardViewImpl extends Composite implements S @UiField(provided = true) MinileaderboardBox minileaderboardUi; - public SeriesMiniOverallLeaderboardViewImpl(Presenter presenter) { + public SeriesMiniOverallLeaderboardViewImpl(Presenter presenter, FlagImageResolver flagImageResolver) { this.currentPresenter = presenter; - minileaderboardUi = new MinileaderboardBox(true); + minileaderboardUi = new MinileaderboardBox(true, flagImageResolver); eventHeaderUi = new SeriesHeader(presenter.getSeriesDTO(), presenter.getSeriesNavigation()); initWidget(uiBinder.createAndBindUi(this)); RefreshManager refreshManager = new LifecycleRefreshManager(this, currentPresenter.getDispatch()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/start/StartActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/start/StartActivityProxy.java deleted file mode 100755 index 6a1003aed31..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/start/StartActivityProxy.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.sap.sailing.gwt.home.mobile.places.start; - -import com.google.gwt.core.client.GWT; -import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory; -import com.sap.sailing.gwt.home.shared.places.start.StartPlace; -import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; - -public class StartActivityProxy extends AbstractActivityProxy { - - private final MobileApplicationClientFactory clientFactory; - private final StartPlace currentPlace; - - public StartActivityProxy(StartPlace place, MobileApplicationClientFactory clientFactory) { - this.currentPlace = place; - this.clientFactory = clientFactory; - } - - @Override - protected void startAsync() { - GWT.runAsync(new AbstractRunAsyncCallback() { - @Override - public void onSuccess() { - super.onSuccess(new StartActivity(currentPlace, clientFactory)); - } - }); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileActivityProxy.java index cd5cc98ec32..ce0a9698adc 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileActivityProxy.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileActivityProxy.java @@ -1,6 +1,11 @@ package com.sap.sailing.gwt.home.mobile.places.user.profile; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.google.gwt.activity.shared.Activity; import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory; import com.sap.sailing.gwt.home.mobile.places.user.profile.details.UserProfileDetailsActivity; import com.sap.sailing.gwt.home.mobile.places.user.profile.preferences.UserProfilePreferencesActivity; @@ -8,6 +13,7 @@ import com.sap.sailing.gwt.home.mobile.places.user.profile.settings.UserProfileS import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace; import com.sap.sailing.gwt.home.shared.places.user.profile.preferences.UserProfilePreferencesPlace; import com.sap.sailing.gwt.home.shared.places.user.profile.settings.UserProfileSettingsPlace; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sse.gwt.client.mvp.AbstractActivityProxy; public class UserProfileActivityProxy extends AbstractActivityProxy { @@ -27,13 +33,27 @@ public class UserProfileActivityProxy extends AbstractActivityProxy { public void onSuccess() { if (currentPlace instanceof UserProfilePreferencesPlace) { UserProfilePreferencesPlace userProfilePrefsPlace = (UserProfilePreferencesPlace) currentPlace; - super.onSuccess(new UserProfilePreferencesActivity(userProfilePrefsPlace, clientFactory)); + withFlagImageResolver(flagImageResolver -> new UserProfilePreferencesActivity(userProfilePrefsPlace, clientFactory, flagImageResolver)); } else if(currentPlace instanceof UserProfileSettingsPlace) { super.onSuccess(new UserProfileSettingsActivity((UserProfileSettingsPlace) currentPlace, clientFactory)); } else { super.onSuccess(new UserProfileDetailsActivity(currentPlace, clientFactory)); } } + private void withFlagImageResolver(final Function activityFactory) { + final Consumer onSuccess = super::onSuccess; + final Consumer onFailure = super::onFailure; + FlagImageResolver.get(new AsyncCallback() { + @Override + public void onSuccess(FlagImageResolver result) { + onSuccess.accept(activityFactory.apply(result)); + } + @Override + public void onFailure(Throwable caught) { + onFailure.accept(caught); + } + }); + } }); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/preferences/UserProfilePreferencesActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/preferences/UserProfilePreferencesActivity.java index 52a76ca1ff3..4b1c44212c6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/preferences/UserProfilePreferencesActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/preferences/UserProfilePreferencesActivity.java @@ -7,6 +7,7 @@ import com.sap.sailing.gwt.home.mobile.places.user.profile.AbstractUserProfileAc import com.sap.sailing.gwt.home.shared.places.user.profile.preferences.UserPreferencesPresenter; import com.sap.sailing.gwt.home.shared.places.user.profile.preferences.UserPreferencesView; import com.sap.sailing.gwt.home.shared.places.user.profile.preferences.UserPreferencesView.Presenter; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.home.shared.places.user.profile.preferences.UserProfilePreferencesPlace; import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; @@ -16,10 +17,10 @@ public class UserProfilePreferencesActivity extends AbstractUserProfileActivity private final UserProfilePreferencesView currentView; public UserProfilePreferencesActivity(UserProfilePreferencesPlace place, - MobileApplicationClientFactory clientFactory) { + MobileApplicationClientFactory clientFactory, FlagImageResolver flagImageResolver) { super(clientFactory); this.userPreferencesPresenter = new UserPreferencesPresenter(clientFactory); - this.currentView = new UserProfilePreferencesViewImpl(this); + this.currentView = new UserProfilePreferencesViewImpl(this, flagImageResolver); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/preferences/UserProfilePreferencesViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/preferences/UserProfilePreferencesViewImpl.java index 40ce89ce96b..d68f284d3f6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/preferences/UserProfilePreferencesViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/preferences/UserProfilePreferencesViewImpl.java @@ -3,14 +3,15 @@ package com.sap.sailing.gwt.home.mobile.places.user.profile.preferences; import com.sap.sailing.gwt.home.mobile.places.user.profile.AbstractUserProfileView; import com.sap.sailing.gwt.home.shared.places.user.profile.preferences.UserPreferences; import com.sap.sailing.gwt.home.shared.places.user.profile.preferences.UserPreferencesView; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; public class UserProfilePreferencesViewImpl extends AbstractUserProfileView implements UserProfilePreferencesView { private final UserPreferencesView userPreferencesView; - public UserProfilePreferencesViewImpl(UserProfilePreferencesView.Presenter presenter) { + public UserProfilePreferencesViewImpl(UserProfilePreferencesView.Presenter presenter, FlagImageResolver flagImageResolver) { super(presenter); - this.userPreferencesView = new UserPreferences(presenter.getUserPreferencesPresenter()); + this.userPreferencesView = new UserPreferences(presenter.getUserPreferencesPresenter(), flagImageResolver); this.userPreferencesView.setEdgeToEdge(true); this.setViewContent(userPreferencesView); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java index e58ad8506f6..7b26afed818 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java @@ -10,7 +10,6 @@ import java.util.logging.Logger; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; -import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.Document; @@ -18,8 +17,6 @@ import com.google.gwt.place.shared.Place; import com.google.gwt.place.shared.PlaceHistoryMapper; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.RootPanel; import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.home.desktop.DesktopEntryPoint; import com.sap.sailing.gwt.home.mobile.MobileEntryPoint; @@ -35,9 +32,10 @@ import com.sap.sse.gwt.client.formfactor.DeviceDetector; * * The decision is made on the following aspects: *
      - *
    • the type of device (desktop, phone, table)
    • - *
    • the place to be shown and if the place is available for one or the other form factor
    • - *
    • the user preference that is being triggered by the user clicking "desktop version" or "mobile version" links in the page footer
    • + *
    • the type of device (desktop, phone, table)
    • + *
    • the place to be shown and if the place is available for one or the other form factor
    • + *
    • the user preference that is being triggered by the user clicking "desktop version" or "mobile version" links in + * the page footer
    • *
    */ public class SwitchingEntryPoint implements EntryPoint { @@ -51,10 +49,10 @@ public class SwitchingEntryPoint implements EntryPoint { public void onModuleLoad() { Document.get().getElementById("loading").removeFromParent(); LOG.info("Start switching entry point"); - + SharedResources.INSTANCE.mediaCss().ensureInjected(); SharedResources.INSTANCE.mainCss().ensureInjected(); - + String hash = Window.Location.getHash(); if (hash != null && hash.startsWith("#")) { hash = hash.substring(1); @@ -91,8 +89,9 @@ public class SwitchingEntryPoint implements EntryPoint { * * @param place * {@link Place} to check - * @return true if the given {@link Place} implements {@link HasMobileVersion} interface or the implemented - * {@link MobileSupport#hasMobileVersion()} method returns true, false otherwise + * @return true if the given {@link Place} implements {@link HasMobileVersion} interface or the + * implemented {@link MobileSupport#hasMobileVersion()} method returns true, false + * otherwise */ public static boolean hasMobileVersion(Place place) { return place instanceof HasMobileVersion @@ -111,12 +110,7 @@ public class SwitchingEntryPoint implements EntryPoint { // only force "not mobile" on mobile devices Cookies.setCookie(SAPSAILING_MOBILE, "false"); } - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - Window.Location.reload(); - } - }); + reloadApp(); } public static void switchToMobile() { @@ -126,48 +120,22 @@ public class SwitchingEntryPoint implements EntryPoint { // only force mobile version on desktop Cookies.setCookie(SAPSAILING_MOBILE, "true"); } - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - Window.Location.reload(); - } - }); + reloadApp(); } private void startMobile() { configureMobileHeader(); - GWT.runAsync(MobileEntryPoint.class, new RunAsyncCallback() { - @Override - public void onSuccess() { - new MobileEntryPoint().onModuleLoad(); - } - - @Override - public void onFailure(Throwable reason) { - LOG.severe("Failed to async start mobile version: " + reason.getMessage()); - RootPanel.get().add(new Label("Failed to load mobile version")); - } - }); + new MobileEntryPoint().onModuleLoad(); } private void startDesktop() { configureDesktopHeader(); - GWT.runAsync(DesktopEntryPoint.class, new RunAsyncCallback() { - @Override - public void onSuccess() { - new DesktopEntryPoint().onModuleLoad(); - } - - @Override - public void onFailure(Throwable reason) { - LOG.severe("Failed to async start desktop version: " + reason.getMessage()); - RootPanel.get().add(new Label("Failed to load desktop version")); - } - }); + new DesktopEntryPoint().onModuleLoad(); } private void configureDesktopHeader() { - setViewportToDeviceWidth(DeviceDetector.isTablet() ? SCALE_VALUE_SMALLER : SCALE_VALUE_SMALL, SCALE_VALUE_LARGE); + setViewportToDeviceWidth(DeviceDetector.isTablet() ? SCALE_VALUE_SMALLER : SCALE_VALUE_SMALL, + SCALE_VALUE_LARGE); } private void configureMobileHeader() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversariesPresenter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversariesPresenter.java index 3a53653758b..2b6a16002b7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversariesPresenter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversariesPresenter.java @@ -23,7 +23,7 @@ import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings; */ public class AnniversariesPresenter implements RefreshableWidget { - private static final String ANNOUNCEMENT_ICON = "images/mobile/icon-bottle-white.svg"; + private static final String ANNOUNCEMENT_ICON = AnniversaryResources.INSTANCE.bottle().getSafeUri().asString(); private static final StringMessages I18N = StringMessages.INSTANCE; private static final NumberFormat COUNT_FORMAT = NumberFormat.getFormat("#,###"); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalNoticeBubbleContent.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalNoticeBubbleContent.ui.xml index e3e118c6b44..21122f51d82 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalNoticeBubbleContent.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalNoticeBubbleContent.ui.xml @@ -6,13 +6,13 @@ padding: 0 1em !important; max-width: 80em; } - h2, .container > div, p > span:first-child { + .container > h2, .container > div, .container > p > span:first-child { text-transform: uppercase; } - .container > div, p > span:first-child { + .container > div, .container > p > span:first-child { text-decoration: underline; } - p > span:first-child:after { + .container > p > span:first-child:after { content: ":" } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryResources.java new file mode 100644 index 00000000000..9f40a96d1e0 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryResources.java @@ -0,0 +1,15 @@ +package com.sap.sailing.gwt.home.shared.partials.anniversary; + +import com.google.gwt.core.shared.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.DataResource; +import com.google.gwt.resources.client.DataResource.MimeType; + +public interface AnniversaryResources extends ClientBundle { + + public static final AnniversaryResources INSTANCE = GWT.create(AnniversaryResources.class); + + @Source("icon-bottle-white.svg") + @MimeType("image/svg+xml") + DataResource bottle(); +} diff --git a/java/com.sap.sailing.gwt.ui/images/mobile/icon-bottle-white.svg b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/icon-bottle-white.svg similarity index 100% rename from java/com.sap.sailing.gwt.ui/images/mobile/icon-bottle-white.svg rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/icon-bottle-white.svg diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/countdown/Countdown.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/countdown/Countdown.gss index 2d1d1467eef..5449fa3af82 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/countdown/Countdown.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/countdown/Countdown.gss @@ -13,7 +13,6 @@ height: 100%; background-size: cover; background-position: center; - background-image: url("images/home/countdown-thumbnail.png"); } .countdown_content { position: absolute; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/fullscreen/FullscreenContainer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/fullscreen/FullscreenContainer.ui.xml index 9e72e0da75c..cc87c47267e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/fullscreen/FullscreenContainer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/fullscreen/FullscreenContainer.ui.xml @@ -1,6 +1,7 @@ + .popup { position: fixed !important; @@ -93,7 +94,7 @@
    - +
    diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/message/Message.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/message/Message.ui.xml index 5e484309a8b..76ae2040949 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/message/Message.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/message/Message.ui.xml @@ -7,7 +7,7 @@
    -

    Class Hierarchy

    -

    Interface Hierarchy

    • com.tractrac.model.lib.api.metadata.IMetadata
    • diff --git a/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-frame.html b/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-frame.html index 18a467466ca..0fe045d687a 100755 --- a/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-frame.html +++ b/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-frame.html @@ -2,9 +2,9 @@ - + com.tractrac.model.lib.api - + @@ -18,10 +18,7 @@

    Classes

    diff --git a/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-summary.html b/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-summary.html index 18c6bfc535c..7e61e5ca263 100755 --- a/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-summary.html +++ b/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-summary.html @@ -2,9 +2,9 @@ - + com.tractrac.model.lib.api - + @@ -110,13 +110,6 @@ -AbstractModelTest - -
    - Abstract class that can be inherited for the test classes.
    - - - ModelLocator
    @@ -124,20 +117,6 @@ that are used for the creation of the objects.
    - -ModelLocatorTest - -
    - This test checks if an implementation of the model library implements all the - mandatory objects
    - - - -ReadParameterFileTest - -
    Class that tests reading in a Text parameter file and setting up an event
    - -
  • diff --git a/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-tree.html b/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-tree.html index 384fcbe947f..7fdce4a1148 100755 --- a/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-tree.html +++ b/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/package-tree.html @@ -2,9 +2,9 @@ - + com.tractrac.model.lib.api Class Hierarchy - + @@ -80,18 +80,7 @@ diff --git a/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/route/IControl.html b/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/route/IControl.html index 3abadff27fe..11639c54d7d 100755 --- a/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/route/IControl.html +++ b/java/com.tractrac.clientmodule/javadoc/com/tractrac/model/lib/api/route/IControl.html @@ -2,9 +2,9 @@ - + IControl - + @@ -48,7 +48,7 @@ var activeTableTab = "activeTableTab";