diff --git a/.gitignore b/.gitignore index df16a1f9bab..00de9eb7a46 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ sailing_debug0* /mobile/com.sap.sailing.racecommittee.glue/bin/jarlist.cache /java/com.sap.sailing.server.gateway.serialization.test/.settings/*.prefs .DS_Store +java/com.sap.sailing.simulator/bin/com/sap/sailing/simulator/Simulator.gwt.xml diff --git a/configuration/buildAndUpdateProduct.sh b/configuration/buildAndUpdateProduct.sh index e697a672c96..aa78622d84e 100755 --- a/configuration/buildAndUpdateProduct.sh +++ b/configuration/buildAndUpdateProduct.sh @@ -48,6 +48,10 @@ cd $PROJECT_HOME active_branch=$(git symbolic-ref -q HEAD) active_branch=`basename $active_branch` +HEAD_SHA=$(git show-ref --head -s | head -1) +HEAD_DATE=$(date "+%Y%m%d%H%M") +VERSION_INFO="$HEAD_SHA-$active_branch-$HEAD_DATE" + MAVEN_SETTINGS=$PROJECT_HOME/configuration/maven-settings.xml MAVEN_SETTINGS_PROXY=$PROJECT_HOME/configuration/maven-settings-proxy.xml @@ -64,7 +68,7 @@ proxy=0 extra='' if [ $# -eq 0 ]; then - echo "buildAndUpdateProduct [-g -t -o -c -m -n -l ] [build|install|all|hot-deploy]" + echo "buildAndUpdateProduct [-g -t -o -c -m -n -l ] [build|install|all|hot-deploy|remote-deploy]" echo "" echo "-g Disable GWT compile, no gwt files will be generated, old ones will be preserved." echo "-t Disable tests" @@ -76,15 +80,22 @@ if [ $# -eq 0 ]; then echo " com.sap.sailing.monitoring. Only works if there is a fully built server available." echo "-l Telnet port the OSGi server is running. Optional but enables fully automatic hot-deploy." echo "-s Name of server you want to use as target for install or hot-deploy. This overrides default behaviour." + echo "-w Target for remote-deploy. Must comply with the following format: user@server." echo "" echo "build: builds the server code using Maven to $PROJECT_HOME (log to $START_DIR/build.log)" echo "install: installs product and configuration to $SERVERS_HOME/$active_branch. Overwrites any configuration by using config from branch." echo "all: calls build and then install" + echo "" echo "hot-deploy: performs hot deployment of named bundle into OSGi server" + echo "Example: $0 -n com.sap.sailing.www -l 14888 hot-deploy" + echo "" + echo "remote-deploy: performs hot deployment of named bundle into OSGi server" + echo "Example: $0 -w trac@sapsailing.com remote-deploy" echo "" echo "Active branch is $active_branch" echo "Project home is $PROJECT_HOME" echo "Server home is $SERVERS_HOME" + echo "Version info: $VERSION_INFO" echo "P2 home is $p2PluginRepository" exit 2 fi @@ -93,7 +104,7 @@ echo PROJECT_HOME is $PROJECT_HOME echo SERVERS_HOME is $SERVERS_HOME echo BRANCH is $active_branch -options=':gtocpm:n:l:s:' +options=':gtocpm:n:l:s:w:' while getopts $options option do case $option in @@ -107,8 +118,9 @@ do l) OSGI_TELNET_PORT=$OPTARG;; s) TARGET_SERVER_NAME=$OPTARG HAS_OVERWRITTEN_TARGET=1;; + w) REMOTE_SERVER_LOGIN=$OPTARG;; \?) echo "Invalid option" - exit 2;; + exit 4;; esac done @@ -324,31 +336,27 @@ if [[ "$@" == "install" ]] || [[ "$@" == "all" ]]; then mkdir $ACDIR/configuration fi - # seems that initial scripts not there - if [ ! -f "$ACDIR/start" ]; then - cp -v $PROJECT_HOME/java/target/start $ACDIR - cp -v $PROJECT_HOME/java/target/http2udpmirror $ACDIR - cp -v $PROJECT_HOME/java/target/configuration/logging.properties $ACDIR/configuration - fi - cd $ACDIR rm -rf $ACDIR/plugins/*.* rm -rf $ACDIR/org.eclipse.* rm -rf $ACDIR/configuration/org.eclipse.* - if [[ $HAS_OVERWRITTEN_TARGET -eq 0 ]]; then - rm -rf $ACDIR/start - rm -rf $ACDIR/stop - + if [[ $HAS_OVERWRITTEN_TARGET -eq 0 ]] && [ ! -f $ACDIR/no-overwrite ]; then cp -v $p2PluginRepository/configuration/config.ini configuration/ + mkdir -p configuration/jetty/etc cp -v $PROJECT_HOME/java/target/configuration/jetty/etc/jetty.xml configuration/jetty/etc cp -v $PROJECT_HOME/java/target/configuration/jetty/etc/realm.properties configuration/jetty/etc cp -v $PROJECT_HOME/java/target/configuration/monitoring.properties configuration/ cp -v $PROJECT_HOME/configuration/mongodb.cfg $ACDIR/ + cp -v $PROJECT_HOME/java/target/start $ACDIR/ cp -v $PROJECT_HOME/java/target/stop $ACDIR/ + cp -v $PROJECT_HOME/java/target/udpmirror $ACDIR/ + + cp -v $PROJECT_HOME/java/target/http2udpmirror $ACDIR + cp -v $PROJECT_HOME/java/target/configuration/logging.properties $ACDIR/configuration fi cp -r -v $p2PluginRepository/configuration/org.eclipse.equinox.simpleconfigurator configuration/ @@ -359,7 +367,80 @@ if [[ "$@" == "install" ]] || [[ "$@" == "all" ]]; then # Make sure this script is up2date at least for the next run cp -v $PROJECT_HOME/configuration/buildAndUpdateProduct.sh $ACDIR/ - cp -v $PROJECT_HOME/java/target/udpmirror $ACDIR/ - + echo $VERSION_INFO > $ACDIR/configuration/jetty/version.txt echo "Installation complete. You may now start the server using ./start" fi + +if [[ "$@" == "remote-deploy" ]]; then + read -s -n1 -p "Which server do you want to deploy ([d]ev,[t]est,[p]rod1,p[r]od2): " answer + case $answer in + "D" | "d") SERVER="dev";; + "T" | "t") SERVER="test";; + "P" | "p") SERVER="prod1";; + "R" | "r") SERVER="prod2";; + *) echo "Aborting..." + exit;; + esac + + echo "Will deploy server $SERVER" + + read -s -n1 -p "Did you want me to start a LOCAL build (without tests) for $SERVERS_HOME/$SERVER before deploying (y/n)? " answer + case $answer in + "Y" | "y") BUILD=1;; + *) echo "Not building anything. You have been warned!" + esac + + if [[ $BUILD -eq 1 ]]; then + ACDIR=$PWD + cd $HOME/code + git co dev + configuration/buildAndUpdateProduct.sh -t build + read -s -n1 -p "Has the build been successful (y/n)? " answer + case $answer in + "Y" | "y") OK=1;; + *) echo "Aborting..." + exit;; + esac + cd $ACDIR + echo "" + fi + + SSH_CMD="ssh $REMOTE_SERVER_LOGIN" + SCP_CMD="scp -r" + + REMOTE_HOME=`ssh $REMOTE_SERVER_LOGIN 'echo $HOME/servers'` + REMOTE_SERVER="$REMOTE_HOME/$SERVER" + + read -s -n1 -p "I will deploy $SERVERS_HOME/$SERVER to $REMOTE_SERVER_LOGIN:$REMOTE_SERVER. Is this correct (y/n)? " answer + case $answer in + "Y" | "y") OK=1;; + *) echo "Aborting... nothing has been changed on remote server!" + exit;; + esac + + echo "" + echo "Starting deployment to $REMOTE_HOME/$SERVER..." + + $SSH_CMD "rm -rf $REMOTE_SERVER/plugins/*.*" + $SSH_CMD "rm -rf $REMOTE_SERVER/org.eclipse*.*" + $SSH_CMD "rm -rf $REMOTE_SERVER/configuration/org.eclipse*.*" + + $SCP_CMD $SERVERS_HOME/$SERVER/org.eclipse* $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/ + $SCP_CMD $SERVERS_HOME/$SERVER/configuration/org.eclipse* $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration + $SCP_CMD $SERVERS_HOME/$SERVER/plugins/*.jar $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/plugins/ + + echo "Deployed successfully. I did NOT change any configuration, only code." + + read -s -n1 -p "Do you want me to restart the remote server (y/n)? " answer + case $answer in + "Y" | "y") OK=1;; + *) echo "Aborting... deployment should be ready by now!" + exit;; + esac + + echo "" + $SSH_CMD "$REMOTE_SERVER/stop" + $SSH_CMD "$REMOTE_SERVER/start" + + echo "Restarted remote server. Please check." +fi diff --git a/configuration/tmuxManagementConsole.sh b/configuration/tmuxManagementConsole.sh index 7f829e2c0c6..4d4370a1a56 100755 --- a/configuration/tmuxManagementConsole.sh +++ b/configuration/tmuxManagementConsole.sh @@ -1,44 +1,44 @@ -#!/bin/bash - -command -v tmux >/dev/null 2>&1 || { echo "I require tmux but it's not installed. Aborting." >&2; exit 1; } - -sn=sailing - -SERVERS_DIR=/home/trac/servers - -TMUX_ACTIVE=`tmux has-session -t $sn 2>/dev/null` -if [ $? -eq 0 ]; then - echo "Session exists...not configuring a new one" -else - echo "Session does not exist...creating a new one with name $sn" - cd /home/trac/git - tmux new-session -s "$sn" -n "BUILD" -d - - counter=1 - for dir in dev test prod1 prod2; do - cd $SERVERS_DIR/$dir - tmux new-window -t "$sn:$counter" -n `basename $dir` "bash -c './start'; bash" - counter=$[counter + 1] - done - - cd /home/trac/servers/prod1 - tmux new-window -t "$sn:$counter" -n "UDP" "bash -c './udpmirror -v 2012 localhost 2010 localhost 2011 localhost 2013 localhost 2014'; bash" - - cd /opt/mongodb/bin - tmux new-window -t "$sn:$[counter+1]" -n "GOAccess" "bash -c 'goaccess -f /var/log/httpd/access_log'; bash" - - cd /opt/ - tmux new-window -t "$sn:$[counter+2]" -n "ATop" "bash -c 'apachetop -f /var/log/httpd/access_log'; bash" - - cd /home/trac/servers - tmux new-window -t "$sn:$[counter+3]" -n "Logs" "bash -c 'ls -lah'; bash" - - cd /home/trac/servers/prod1 - tmux new-window -t "$sn:$[counter+4]" -n "STListener" "bash -c './swisstiminglistener 3500 3501'; bash" - - tmux select-window -t "$sn:0" -fi - -if [[ "$1" != "unattended" ]]; then - tmux -2 attach-session -t "$sn" -fi +#!/bin/bash + +command -v tmux >/dev/null 2>&1 || { echo "I require tmux but it's not installed. Aborting." >&2; exit 1; } + +sn=sailing + +SERVERS_DIR=/home/trac/servers + +TMUX_ACTIVE=`tmux has-session -t $sn 2>/dev/null` +if [ $? -eq 0 ]; then + echo "Session exists...not configuring a new one" +else + echo "Session does not exist...creating a new one with name $sn" + cd /home/trac/git + tmux new-session -s "$sn" -n "BUILD" -d + + counter=1 + for dir in dev test prod1 prod2; do + cd $SERVERS_DIR/$dir + tmux new-window -t "$sn:$counter" -n `basename $dir` "bash -c './start'; bash" + counter=$[counter + 1] + done + + cd /home/trac/servers/prod1 + tmux new-window -t "$sn:$counter" -n "UDP" "bash -c './udpmirror -v 2012 localhost 2010 localhost 2011 localhost 2013 localhost 2014'; bash" + + cd /opt/mongodb/bin + tmux new-window -t "$sn:$[counter+1]" -n "GOAccess" "bash -c 'goaccess -f /var/log/httpd/access_log'; bash" + + cd /opt/ + tmux new-window -t "$sn:$[counter+2]" -n "ATop" "bash -c 'apachetop -f /var/log/httpd/access_log'; bash" + + cd /home/trac/servers + tmux new-window -t "$sn:$[counter+3]" -n "Logs" "bash -c 'ls -lah'; bash" + + cd /home/trac/servers/prod1 + tmux new-window -t "$sn:$[counter+4]" -n "STListener" "bash -c './swisstiminglistener 3500 3501'; bash" + + tmux select-window -t "$sn:0" +fi + +if [[ "$1" != "unattended" ]]; then + tmux -2 attach-session -t "$sn" +fi diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/ScoringSchemeType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/ScoringSchemeType.java index 491b5be22da..b49b524d5cb 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/ScoringSchemeType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/ScoringSchemeType.java @@ -2,5 +2,5 @@ package com.sap.sailing.domain.common; public enum ScoringSchemeType { LOW_POINT, HIGH_POINT, HIGH_POINT_ESS_OVERALL, HIGH_POINT_LAST_BREAKS_TIE, - HIGH_POINT_FIRST_GETS_TEN, LOW_POINT_WINNER_GETS_ZERO + HIGH_POINT_FIRST_GETS_TEN, HIGH_POINT_FIRST_GETS_ONE, LOW_POINT_WINNER_GETS_ZERO } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java index 312d7bfbfed..b2a12be2795 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java @@ -2,10 +2,13 @@ package com.sap.sailing.domain.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -13,17 +16,22 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ExecutionException; import org.junit.Before; import org.junit.Test; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.TimePoint; +import com.sap.sailing.domain.common.dto.LeaderboardDTO; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; @@ -33,7 +41,9 @@ import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors; +import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; public class LeaderboardOfflineTest extends AbstractLeaderboardTest { private Set testRaces; @@ -100,6 +110,51 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { leaderboard.addRace(testRaces.iterator().next(), columnName, /* medalRace */ false, defaultFleet); assertTrue(leaderboard.getRaceColumnByName(columnName).isMedalRace()); } + + @Test + public void testRepeatedLeaderboardDTOCacheInvalidation() throws NoWindException, InterruptedException, ExecutionException { + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl( + new int[] { 5, 8 }), new LowPoint(), null); + Fleet defaultFleet = leaderboard.getFleet(null); + final String columnName = "abc"; + setupRaces(1, 0); + leaderboard.addRaceColumn(columnName, /* medalRace */ true); + leaderboard.addRace(testRaces.iterator().next(), columnName, /* medalRace */ false, defaultFleet); + final Set emptySet = Collections.emptySet(); + final MillisecondsTimePoint now = MillisecondsTimePoint.now(); + final TrackedRegattaRegistry trackedRegattaRegistry = new TrackedRegattaRegistry() { + @Override + public DynamicTrackedRegatta getOrCreateTrackedRegatta(Regatta regatta) { + return null; + } + @Override + public DynamicTrackedRegatta getTrackedRegatta(Regatta regatta) { + return null; + } + @Override + public void removeTrackedRegatta(Regatta regatta) {} + + @Override + public Regatta getRememberedRegattaForRace(Serializable raceID) { + return null; + } + @Override + public boolean isRaceBeingTracked(RaceDefinition r) { + return true; + } + }; + LeaderboardDTO leaderboardDTO = leaderboard.getLeaderboardDTO(now, emptySet, trackedRegattaRegistry, DomainFactory.INSTANCE); + assertNotNull(leaderboardDTO); + assertSame(leaderboardDTO, leaderboard.getLeaderboardDTO(now, emptySet, trackedRegattaRegistry, DomainFactory.INSTANCE)); // assert it's cached + leaderboard.getRaceColumnByName(columnName).releaseTrackedRace(defaultFleet); // this should clear the cache + LeaderboardDTO leaderboardDTO2 = leaderboard.getLeaderboardDTO(now, emptySet, trackedRegattaRegistry, DomainFactory.INSTANCE); + assertNotSame(leaderboardDTO, leaderboardDTO2); + assertSame(leaderboardDTO2, leaderboard.getLeaderboardDTO(now, emptySet, trackedRegattaRegistry, DomainFactory.INSTANCE)); // and cached again + leaderboard.getRaceColumnByName(columnName).setTrackedRace(defaultFleet, testRaces.iterator().next()); // clear cache again; requires listener(s) to still be attached + LeaderboardDTO leaderboardDTO3 = leaderboard.getLeaderboardDTO(now, emptySet, trackedRegattaRegistry, DomainFactory.INSTANCE); + assertNotSame(leaderboardDTO2, leaderboardDTO3); + assertSame(leaderboardDTO3, leaderboard.getLeaderboardDTO(now, emptySet, trackedRegattaRegistry, DomainFactory.INSTANCE)); // and cached again + } @Test public void testMaxPointsDiscard() throws NoWindException { 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 c0816107934..e4e4f97cb06 100755 --- 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 @@ -3,6 +3,7 @@ package com.sap.sailing.domain.test.mock; import java.io.Serializable; import java.util.List; import java.util.NavigableSet; +import java.util.TreeSet; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -191,8 +192,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public NavigableSet getMarkPassings(Competitor competitor) { - // TODO Auto-generated method stub - return null; + return new TreeSet(); } @Override diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithFixedRank.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithFixedRank.java index a39362bb385..18ee0bc4be7 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithFixedRank.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithFixedRank.java @@ -1,6 +1,7 @@ package com.sap.sailing.domain.test.mock; import java.io.Serializable; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -8,6 +9,8 @@ import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.TimePoint; @@ -33,6 +36,11 @@ public class MockedTrackedRaceWithFixedRank extends MockedTrackedRace { private class MockedRaceDefinition implements RaceDefinition { private static final long serialVersionUID = 6812543850545870357L; + private final Course course; + + public MockedRaceDefinition() { + course = new CourseImpl("Test Course", Arrays.asList(new Waypoint[0])); + } @Override public String getName() { @@ -41,7 +49,7 @@ public class MockedTrackedRaceWithFixedRank extends MockedTrackedRace { @Override public Course getCourse() { - return null; + return course; } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 893059bbfb5..a625bd8469a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -101,7 +101,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem @Override public synchronized void releaseTrackedRace(Fleet fleet) { - trackedRaces.remove(fleet); + setTrackedRace(fleet, null); } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java index 375e7a9c9dc..fba4a42561e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java @@ -56,6 +56,7 @@ import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.impl.HighPoint; import com.sap.sailing.domain.leaderboard.impl.HighPointExtremeSailingSeriesOverall; import com.sap.sailing.domain.leaderboard.impl.HighPointFirstGets10LastBreaksTie; +import com.sap.sailing.domain.leaderboard.impl.HighPointFirstGets1LastBreaksTie; import com.sap.sailing.domain.leaderboard.impl.HighPointLastBreaksTie; import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.LowPointWinnerGetsZero; @@ -320,6 +321,8 @@ public class DomainFactoryImpl implements DomainFactory { return new HighPointExtremeSailingSeriesOverall(); case HIGH_POINT_LAST_BREAKS_TIE: return new HighPointLastBreaksTie(); + case HIGH_POINT_FIRST_GETS_ONE: + return new HighPointFirstGets1LastBreaksTie(); case HIGH_POINT_FIRST_GETS_TEN: return new HighPointFirstGets10LastBreaksTie(); case LOW_POINT_WINNER_GETS_ZERO: diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java index a09b9a63e5e..dccab7703f0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java @@ -180,94 +180,101 @@ public class LeaderboardCacheManager { * is updated accordingly. */ private void registerAsListener(final Leaderboard leaderboard) { - for (TrackedRace trackedRace : leaderboard.getTrackedRaces()) { - registerListener(leaderboard, trackedRace); - } - final CacheInvalidationUponScoreCorrectionListener scoreCorrectionListener = new CacheInvalidationUponScoreCorrectionListener(leaderboard); - leaderboard.getScoreCorrection().addScoreCorrectionListener(scoreCorrectionListener); - synchronized (scoreCorrectionListeners) { - scoreCorrectionListeners.put(leaderboard, scoreCorrectionListener); - } - final RaceColumnListener raceColumnListener = new RaceColumnListener() { - private static final long serialVersionUID = 8165124797028386317L; - - @Override - public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { - removeFromCache(leaderboard); + // only add as listener again if not yet added + if (!scoreCorrectionListeners.containsKey(leaderboard)) { + for (TrackedRace trackedRace : leaderboard.getTrackedRaces()) { registerListener(leaderboard, trackedRace); } - - /** - * This listener must not be serialized. See also bug 952. - */ - @Override - public boolean isTransient() { - return true; + final CacheInvalidationUponScoreCorrectionListener scoreCorrectionListener = new CacheInvalidationUponScoreCorrectionListener( + leaderboard); + leaderboard.getScoreCorrection().addScoreCorrectionListener(scoreCorrectionListener); + synchronized (scoreCorrectionListeners) { + scoreCorrectionListeners.put(leaderboard, scoreCorrectionListener); } - - @Override - public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { - removeFromCache(leaderboard); - Map> listenersMap = invalidationListenersPerLeaderboard.get(leaderboard); - if (listenersMap != null) { - Set listeners = listenersMap.get(trackedRace); - if (listeners != null) { - for (CacheInvalidationListener listener : listeners) { - listener.removeFromTrackedRace(); + final RaceColumnListener raceColumnListener = new RaceColumnListener() { + private static final long serialVersionUID = 8165124797028386317L; + + @Override + public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + removeFromCache(leaderboard); + registerListener(leaderboard, trackedRace); + } + + /** + * This listener must not be serialized. See also bug 952. + */ + @Override + public boolean isTransient() { + return true; + } + + @Override + public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + removeFromCache(leaderboard); + Map> listenersMap = invalidationListenersPerLeaderboard + .get(leaderboard); + if (listenersMap != null) { + Set listeners = listenersMap.get(trackedRace); + if (listeners != null) { + for (CacheInvalidationListener listener : listeners) { + listener.removeFromTrackedRace(); + } } } } - } - @Override - public void isMedalRaceChanged(RaceColumn raceColumn, boolean newIsMedalRace) { - removeFromCache(leaderboard); - } + @Override + public void isMedalRaceChanged(RaceColumn raceColumn, boolean newIsMedalRace) { + removeFromCache(leaderboard); + } - @Override - public boolean canAddRaceColumnToContainer(RaceColumn raceColumn) { - return true; - } + @Override + public boolean canAddRaceColumnToContainer(RaceColumn raceColumn) { + return true; + } - @Override - public void raceColumnAddedToContainer(RaceColumn raceColumn) { - removeFromCache(leaderboard); - } + @Override + public void raceColumnAddedToContainer(RaceColumn raceColumn) { + removeFromCache(leaderboard); + } - @Override - public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { - removeFromCache(leaderboard); - } + @Override + public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { + removeFromCache(leaderboard); + } - @Override - public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { - removeFromCache(leaderboard); - } + @Override + public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { + removeFromCache(leaderboard); + } - @Override - public void factorChanged(RaceColumn raceColumn, Double oldFactor, Double newFactor) { - removeFromCache(leaderboard); - } + @Override + public void factorChanged(RaceColumn raceColumn, Double oldFactor, Double newFactor) { + removeFromCache(leaderboard); + } - @Override - public void resultDiscardingRuleChanged(ThresholdBasedResultDiscardingRule oldDiscardingRule, - ThresholdBasedResultDiscardingRule newDiscardingRule) { - removeFromCache(leaderboard); - } + @Override + public void resultDiscardingRuleChanged(ThresholdBasedResultDiscardingRule oldDiscardingRule, + ThresholdBasedResultDiscardingRule newDiscardingRule) { + removeFromCache(leaderboard); + } - @Override - public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { - removeFromCache(leaderboard); + @Override + public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, + String displayName) { + removeFromCache(leaderboard); + } + + @Override + public void raceLogEventAdded(RaceColumn raceColumn, RaceLogIdentifier raceLogIdentifier, + RaceLogEvent event) { + removeFromCache(leaderboard); + } + }; + leaderboard.addRaceColumnListener(raceColumnListener); + synchronized (raceColumnListeners) { + raceColumnListeners.put(leaderboard, raceColumnListener); } - - @Override - public void raceLogEventAdded(RaceColumn raceColumn, RaceLogIdentifier raceLogIdentifier, RaceLogEvent event) { - removeFromCache(leaderboard); - } - }; - leaderboard.addRaceColumnListener(raceColumnListener); - synchronized (raceColumnListeners) { - raceColumnListeners.put(leaderboard, raceColumnListener); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java index 9c8fae22556..383c51cb4ef 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LeaderboardDTOCache.java @@ -88,7 +88,6 @@ public class LeaderboardDTOCache implements LeaderboardCache { } }; this.leaderboardCacheManager = new LeaderboardCacheManager(this); - this.leaderboardCacheManager.add(leaderboard); } @Override @@ -159,6 +158,7 @@ public class LeaderboardDTOCache implements LeaderboardCache { } }); computeLeadearboardByNameExecutor.execute(future); + this.leaderboardCacheManager.add(leaderboard); // ensure the leaderboard is tracked for changes to invalidate leaderboardCache.put(key, future); } else { cacheHit = true; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets1LastBreaksTie.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets1LastBreaksTie.java new file mode 100755 index 00000000000..7e545cb0d2b --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/HighPointFirstGets1LastBreaksTie.java @@ -0,0 +1,34 @@ +package com.sap.sailing.domain.leaderboard.impl; + +import java.util.List; + +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.common.MaxPointsReason; +import com.sap.sailing.domain.common.ScoringSchemeType; +import com.sap.sailing.domain.common.impl.Util.Pair; +import com.sap.sailing.domain.leaderboard.NumberOfCompetitorsInLeaderboardFetcher; + +public class HighPointFirstGets1LastBreaksTie extends HighPointFirstGetsFixedScore { + private static final long serialVersionUID = 1L; + + public HighPointFirstGets1LastBreaksTie() { + super(1.0); + } + + @Override + public ScoringSchemeType getType() { + return ScoringSchemeType.HIGH_POINT_FIRST_GETS_ONE; + } + + @Override + public Double getPenaltyScore(RaceColumn raceColumn, Competitor competitor, MaxPointsReason maxPointsReason, Integer numberOfCompetitorsInRace, + NumberOfCompetitorsInLeaderboardFetcher numberOfCompetitorsInLeaderboardFetcher) { + return -1.0; + } + + @Override + public int compareByBetterScore(List> o1Scores, List> o2Scores, boolean nullScoresAreBetter) { + return 0; + } +} 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 b658309d6f4..bd81bb318d9 100755 --- 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 @@ -670,7 +670,9 @@ DynamicTrackedRace, GPSTrackListener { @Override public void detachRaceLog() { - logListener.removeFrom(attachedRaceLog); + if (attachedRaceLog != null) { + logListener.removeFrom(attachedRaceLog); + } super.detachRaceLog(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java index f4f83a1e7ad..2676d8a4570 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java @@ -49,7 +49,9 @@ public class DynamicTrackedRaceLogListener implements RaceLogEventVisitor { // Maybe something like this is needed: // TODO: // ??? trackedRace.setStatus(new TrackedRaceStatusImpl(TrackedRaceStatusEnum.PREPARED, 0.0)); - raceLog.removeListener(this); + if (raceLog != null) { + raceLog.removeListener(this); + } } private void analyze() { 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 b9ca81addb1..461803089be 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+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDMgLXN0cmljdCAtbG9nTGV2ZWwgVFJBQ0VdXT48L2V4dHJhLWFyZ3M+PHZtLWFyZ3M+PCFbQ0RBVEFbLVhteDc1MG1dXT48L3ZtLWFyZ3M+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLkFkbWluQ29uc29sZTwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5MZWFkZXJib2FyZDwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5MZWFkZXJib2FyZEVkaXRpbmc8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuUmFjZUJvYXJkPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLlNwZWN0YXRvcjwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5Vc2VyTWFuYWdlbWVudDwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5UdlZpZXc8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuVmlkZW9Qb3B1cDwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5Zb3V0dWJlUG9wdXA8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuUG9sYXJTaGVldHM8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuUmVnYXR0YU92ZXJ2aWV3PC9lbnRyeS1wb2ludC1tb2R1bGU+PC9nd3QtY29tcGlsZS1zZXR0aW5ncz4\= +gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDMgLXN0cmljdCAtbG9nTGV2ZWwgVFJBQ0VdXT48L2V4dHJhLWFyZ3M+PHZtLWFyZ3M+PCFbQ0RBVEFbLVhteDIwMjRtIC1EZ3d0LnVzZWFyY2hpdmVzPWZhbHNlXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5BZG1pbkNvbnNvbGU8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuTGVhZGVyYm9hcmQ8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuTGVhZGVyYm9hcmRFZGl0aW5nPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLlJhY2VCb2FyZDwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5TcGVjdGF0b3I8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuVXNlck1hbmFnZW1lbnQ8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuVHZWaWV3PC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLlZpZGVvUG9wdXA8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuWW91dHViZVBvcHVwPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLlBvbGFyU2hlZXRzPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLlJlZ2F0dGFPdmVydmlldzwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5TaW11bGF0b3I8L2VudHJ5LXBvaW50LW1vZHVsZT48L2d3dC1jb21waWxlLXNldHRpbmdzPg\=\= diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java index a01f0d8d18b..429558e9cbb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java @@ -13,6 +13,7 @@ import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor; import com.sap.sailing.gwt.ui.client.AbstractEntryPoint; import com.sap.sailing.gwt.ui.client.RegattaDisplayer; import com.sap.sailing.gwt.ui.client.RegattaRefresher; +import com.sap.sailing.gwt.ui.client.shared.panels.SystemInformationPanel; import com.sap.sailing.gwt.ui.client.shared.panels.UserStatusPanel; import com.sap.sailing.gwt.ui.shared.RegattaDTO; @@ -122,6 +123,10 @@ public class AdminConsoleEntryPoint extends AbstractEntryPoint implements Regatt } }); fillRegattas(); + + SystemInformationPanel sysinfoPanel = new SystemInformationPanel(sailingService, this); + sysinfoPanel.ensureDebugId("SystemInformation"); + rootPanel.add(sysinfoPanel); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 3ede22af652..f5759d1b721 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -299,4 +299,6 @@ public interface SailingService extends RemoteService { List getRegattaOverviewEntriesForEvent(String eventIdAsString); EventDTO getEventByIdAsString(String eventIdAsString); + + String getBuildVersion(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index 32b9fd6e489..738633dd582 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -436,6 +436,8 @@ public interface SailingServiceAsync { void getEventByIdAsString(String eventIdAsString, AsyncCallback asyncCallback); void updateRegatta(RegattaIdentifier regattaIdentifier, String defaultCourseAreaId, AsyncCallback callback); + + void getBuildVersion(AsyncCallback callback); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 6e6af2c13c7..3d21119251f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -449,6 +449,7 @@ public interface StringMessages extends Messages { String sideToWhichMarkAtLegStartWasRounded(); String raceIsLive(String raceName); String racesAreLive(String raceNames); + String scoringSchemeHighPointFirstGetsOne(); String scoringSchemeHighPointFirstGetsTen(); String knotsUnit(); String averageJibeLossInMetersTooltip(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index b9b7c037af8..6dc8270422a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -490,6 +490,7 @@ sideToWhichMarkAtLegStartWasRoundedTooltip=Side to which the mark at leg start w raceIsLive=Race {0} is live racesAreLive=Races {0} are live knotsUnit=kts +scoringSchemeHighPointFirstGetsOne=High Point, winner gets 1 point scoringSchemeHighPointFirstGetsTen=High Point, winner gets 10 points knotsUnit=kts generatePolarSheet=Generate Polar Sheet diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 52a54d147cb..1151dbed673 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -490,6 +490,7 @@ sideToWhichMarkAtLegStartWasRounded=Tonne gerundet an sideToWhichMarkAtLegStartWasRoundedTooltip=Seite, an der die Bahnmarke am Schenkelstart gerundet wurde raceIsLive=Rennen {0} ist live racesAreLive=Rennen {0} sind live +scoringSchemeHighPointFirstGetsOne=High Point System, Gewinner erhält 1 Punkt scoringSchemeHighPointFirstGetsTen=High Point System, Gewinner erhält 10 Punkte knotsUnit=kn generatePolarSheet=Polardiagramm erstellen diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/panels/SystemInformationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/panels/SystemInformationPanel.java new file mode 100644 index 00000000000..1ad20a82b81 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/panels/SystemInformationPanel.java @@ -0,0 +1,41 @@ +package com.sap.sailing.gwt.ui.client.shared.panels; + +import com.google.gwt.dom.client.Style; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.client.ErrorReporter; +import com.sap.sailing.gwt.ui.client.SailingServiceAsync; + +public class SystemInformationPanel extends FlowPanel { + + private final Label buildVersionText; + + public SystemInformationPanel(final SailingServiceAsync sailingService, final ErrorReporter errorReporter) { + super(); + + buildVersionText = new Label(""); + addFloatingWidget(buildVersionText); + + sailingService.getBuildVersion(new AsyncCallback() { + + @Override + public void onSuccess(String result) { + buildVersionText.setText("Version: " + result); + } + + @Override + public void onFailure(Throwable caught) { + buildVersionText.setText("Version: " + "Unknown"); + } + }); + } + + private void addFloatingWidget(Widget w) { + w.getElement().getStyle().setFloat(Style.Float.LEFT); + w.getElement().getStyle().setPadding(3, Style.Unit.PX); + add(w); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/ScoringSchemeTypeFormatter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/ScoringSchemeTypeFormatter.java index 18b39cf4e12..d3a2d0fc004 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/ScoringSchemeTypeFormatter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/ScoringSchemeTypeFormatter.java @@ -14,6 +14,8 @@ public class ScoringSchemeTypeFormatter { return stringMessages.scoringSchemeHighPointEssOverall(); case HIGH_POINT_LAST_BREAKS_TIE: return stringMessages.scoringSchemeHighPointLastBreaksTie(); + case HIGH_POINT_FIRST_GETS_ONE: + return stringMessages.scoringSchemeHighPointFirstGetsOne(); case HIGH_POINT_FIRST_GETS_TEN: return stringMessages.scoringSchemeHighPointFirstGetsTen(); case LOW_POINT_WINNER_GETS_ZERO: diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 59f3307d23c..ca5131c7ace 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -1,5 +1,8 @@ package com.sap.sailing.gwt.ui.server; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; @@ -2789,4 +2792,17 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S protected com.sap.sailing.domain.base.DomainFactory getBaseDomainFactory() { return baseDomainFactory; } + + public String getBuildVersion() { + String version = "Unknown or Development"; + File versionfile = new File(System.getProperty("jetty.home") + File.separator + "version.txt"); + if (versionfile.exists()) { + try { + version = new BufferedReader(new FileReader(versionfile)).readLine(); + } catch (Exception ex) { + logger.severe("Could not load file " + versionfile.getAbsolutePath()); + } + } + return version; + } } \ No newline at end of file diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestLeaderboardCreation.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestLeaderboardCreation.java index 852f290f3aa..190c3970354 100755 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestLeaderboardCreation.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestLeaderboardCreation.java @@ -3,11 +3,9 @@ package com.sap.sailing.selenium.test.adminconsole; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import org.junit.Before; import org.junit.Test; import com.sap.sailing.selenium.test.AbstractSeleniumTest; -import com.sap.sailing.selenium.test.DatabaseHelper; import com.sap.sailing.selenium.test.adminconsole.pages.AdminConsolePage; import com.sap.sailing.selenium.test.adminconsole.pages.FlexibleLeaderboardCreationDialog; import com.sap.sailing.selenium.test.adminconsole.pages.LeaderboardConfigurationPanel; diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/pages/LeaderboardConfigurationPanel.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/pages/LeaderboardConfigurationPanel.java index a3588736b17..0e912ff88a3 100755 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/pages/LeaderboardConfigurationPanel.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/pages/LeaderboardConfigurationPanel.java @@ -1,7 +1,6 @@ package com.sap.sailing.selenium.test.adminconsole.pages; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.openqa.selenium.By; diff --git a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml index 7d1ba633b4d..46d528f9ecc 100644 --- a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml +++ b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml @@ -58,15 +58,6 @@ RCCompetitors /rc/competitors - - - RCRegattaRaceStates - com.sap.sailing.server.gateway.impl.rc.RegattaRaceStatesJsonGetServlet - - - RCRegattaRaceStates - /rc/regattaRaceStates - @@ -97,6 +88,15 @@ /events + + EventRaceStatesServlet + com.sap.sailing.server.gateway.impl.EventRaceStatesJsonGetServlet + + + EventRaceStatesServlet + /eventRaceStates + + RegattasJsonGetServlet com.sap.sailing.server.gateway.impl.RegattasJsonGetServlet diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RegattaRaceStatesJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java similarity index 97% rename from java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RegattaRaceStatesJsonGetServlet.java rename to java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java index 5dfd893a104..d3defd9d998 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RegattaRaceStatesJsonGetServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java @@ -1,4 +1,4 @@ -package com.sap.sailing.server.gateway.impl.rc; +package com.sap.sailing.server.gateway.impl; import java.io.IOException; import java.util.Calendar; @@ -32,10 +32,10 @@ import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer; import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; -public class RegattaRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { +public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = -4820965681871902242L; - private final static Logger logger = Logger.getLogger(RegattaRaceStatesJsonGetServlet.class.getName()); + private final static Logger logger = Logger.getLogger(EventRaceStatesJsonGetServlet.class.getName()); private static final String PARAM_NAME_EVENTID = "eventId"; private static final String PARAM_NAME_FILTER_BY_COURSEAREA = "filterByCourseArea"; diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index d560c6e4c5d..970eba9adc3 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -1,31 +1,31 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.simulator/.classpath b/java/com.sap.sailing.simulator/.classpath index 50da4ce691f..ee5f16d7e71 100644 --- a/java/com.sap.sailing.simulator/.classpath +++ b/java/com.sap.sailing.simulator/.classpath @@ -1,9 +1,10 @@ - - - - - - - - - + + + + + + + + + + diff --git a/java/com.sap.sailing.simulator/.project b/java/com.sap.sailing.simulator/.project index 5fcae835e7d..3f09d9050b0 100644 --- a/java/com.sap.sailing.simulator/.project +++ b/java/com.sap.sailing.simulator/.project @@ -1,28 +1,39 @@ - - - com.sap.sailing.simulator - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - + + + com.sap.sailing.simulator + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + com.google.gdt.eclipse.core.webAppProjectValidator + + + + + com.google.gwt.eclipse.core.gwtProjectValidator + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + com.google.gwt.eclipse.core.gwtNature + + diff --git a/java/com.sap.sailing.simulator/bin/com/sap/sailing/simulator/Simulator.gwt.xml b/java/com.sap.sailing.simulator/bin/com/sap/sailing/simulator/Simulator.gwt.xml deleted file mode 100755 index 818a5a2adf1..00000000000 --- a/java/com.sap.sailing.simulator/bin/com/sap/sailing/simulator/Simulator.gwt.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - -