From 580d7e2a3b296c933f3892d7ba1da124be1cbabd Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 12 Nov 2012 18:16:32 +0100 Subject: [PATCH] fixed bug 1036, also notifying RaceColumnListeners about competitor display name change --- .../sap/sailing/domain/common/DetailType.java | 1 + .../DelayedLeaderboardCorrectionsImpl.java | 4 + .../domain/base/RaceColumnListener.java | 2 + .../sailing/domain/base/impl/RegattaImpl.java | 5 + .../sailing/domain/base/impl/SeriesImpl.java | 6 + .../impl/AbstractSimpleLeaderboardImpl.java | 7 + .../meta/MetaLeaderboardColumn.java | 5 + .../util/impl/RaceColumnListeners.java | 7 + .../gwt/ui/client/DetailTypeFormatter.java | 6 + .../sailing/gwt/ui/client/StringMessages.java | 2 + .../gwt/ui/client/StringMessages.properties | 4 +- .../ui/client/StringMessages_de.properties | 4 +- .../LeaderboardSettingsFactory.java | 6 + .../sailing/gwt/ui/leaderboard/LegColumn.java | 42 ++--- .../leaderboard/ManeuverCountRaceColumn.java | 168 +++++++----------- .../EditableLeaderboardPanel.java | 9 +- .../gwt/ui/server/LeaderboardDTOCache.java | 5 + .../gwt/ui/server/SailingServiceImpl.java | 40 ++--- .../sailing/gwt/ui/shared/LegEntryDTO.java | 29 +-- 19 files changed, 180 insertions(+), 172 deletions(-) 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 695dc0ead0a..10ac2e7214f 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 @@ -22,6 +22,7 @@ public enum DetailType implements Serializable { WINDWARD_DISTANCE_TO_OVERALL_LEADER(0, ASCENDING), HEAD_UP(0, ASCENDING), BEAR_AWAY(0, ASCENDING), TACK(0, ASCENDING), JIBE(0, ASCENDING), PENALTY_CIRCLE(0, ASCENDING), AVERAGE_MANEUVER_LOSS_IN_METERS(1, ASCENDING), + AVERAGE_TACK_LOSS_IN_METERS(1, ASCENDING), AVERAGE_JIBE_LOSS_IN_METERS(1, ASCENDING), MARK_PASSING(0, ASCENDING), CURRENT_LEG(0, ASCENDING), DISPLAY_LEGS(0, NONE), TIME_TRAVELED(0, ASCENDING), TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS(1, ASCENDING), diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DelayedLeaderboardCorrectionsImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DelayedLeaderboardCorrectionsImpl.java index 7ce625d2b22..3688b64d069 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DelayedLeaderboardCorrectionsImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DelayedLeaderboardCorrectionsImpl.java @@ -206,6 +206,10 @@ public class DelayedLeaderboardCorrectionsImpl implements DelayedLeaderboardCorr public void factorChanged(RaceColumn raceColumn, Double oldFactor, Double newFactor) { } + @Override + public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { + } + @Override public boolean isTransient() { return false; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java index 90546f5a979..7b7352616e5 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java @@ -21,6 +21,8 @@ public interface RaceColumnListener extends Serializable { void factorChanged(RaceColumn raceColumn, Double oldFactor, Double newFactor); + void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName); + /** * A listener can use this to specify that it must not be serialized together with other listeners. * Background: the collections holding race column listeners are usually non-transient. This will cause diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index c41758a4bbf..d52bbe09511 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -240,6 +240,11 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene raceColumnListeners.notifyListenersAboutFactorChanged(raceColumn, oldFactor, newFactor); } + @Override + public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { + raceColumnListeners.notifyListenersAboutCompetitorDisplayNameChanged(competitor, oldDisplayName, displayName); + } + @Override public boolean isTransient() { return false; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java index c418d54d20f..7d1392bdcd9 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnInSeries; @@ -233,6 +234,11 @@ public class SeriesImpl extends NamedImpl implements Series, RaceColumnListener raceColumnListeners.notifyListenersAboutFactorChanged(raceColumn, oldFactor, newFactor); } + @Override + public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { + raceColumnListeners.notifyListenersAboutCompetitorDisplayNameChanged(competitor, oldDisplayName, displayName); + } + @Override public boolean isTransient() { 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 14705915d4e..7726d1d5d78 100755 --- 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 @@ -186,7 +186,9 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race @Override public void setDisplayName(Competitor competitor, String displayName) { + String oldDisplayName = displayNames.get(competitor); displayNames.put(competitor, displayName); + getRaceColumnListeners().notifyListenersAboutCompetitorDisplayNameChanged(competitor, oldDisplayName, displayName); } @Override @@ -448,6 +450,11 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race getRaceColumnListeners().notifyListenersAboutRaceColumnRemovedFromContainer(raceColumn); } + @Override + public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { + getRaceColumnListeners().notifyListenersAboutCompetitorDisplayNameChanged(competitor, oldDisplayName, displayName); + } + @Override public boolean isTransient() { return false; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 37e6bfb5eb4..b0b0a9d18a9 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -131,6 +131,11 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R getRaceColumnListeners().notifyListenersAboutFactorChanged(raceColumn, oldFactor, newFactor); } + @Override + public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { + getRaceColumnListeners().notifyListenersAboutCompetitorDisplayNameChanged(competitor, oldDisplayName, displayName); + } + @Override public boolean isTransient() { return false; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/util/impl/RaceColumnListeners.java b/java/com.sap.sailing.domain/src/com/sap/sailing/util/impl/RaceColumnListeners.java index aba2ab75b7f..c35ed01886a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/util/impl/RaceColumnListeners.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/util/impl/RaceColumnListeners.java @@ -7,6 +7,7 @@ import java.io.Serializable; import java.util.HashSet; import java.util.Set; +import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; @@ -116,4 +117,10 @@ public class RaceColumnListeners implements Serializable { return result; } + public void notifyListenersAboutCompetitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { + for (RaceColumnListener listener : getRaceColumnListeners()) { + listener.competitorDisplayNameChanged(competitor, oldDisplayName, displayName); + } + } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java index 27e2dd05e10..437dc5493ec 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java @@ -68,6 +68,12 @@ public class DetailTypeFormatter { return stringMessages.totalTimeSailedReachingInSeconds(); case TOTAL_TIME_SAILED_IN_SECONDS: return stringMessages.totalTimeSailedInSeconds(); + case AVERAGE_MANEUVER_LOSS_IN_METERS: + return stringMessages.averageManeuverLossInMeters(); + case AVERAGE_TACK_LOSS_IN_METERS: + return stringMessages.averageTackLossInMeters(); + case AVERAGE_JIBE_LOSS_IN_METERS: + return stringMessages.averageJibeLossInMeters(); } return null; 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 c51f22b514b..4cfd8ae0cfc 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 @@ -427,4 +427,6 @@ public interface StringMessages extends Messages { String errorUpdatingIsMedalRace(String message); String maneuverLoss(); String averageManeuverLossInMeters(); + String averageTackLossInMeters(); + String averageJibeLossInMeters(); } 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 7b2c867ec20..24e38267968 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 @@ -427,4 +427,6 @@ expandLastRace=Always expand last race shown factor=Factor errorUpdatingIsMedalRace=Error updating the medal race setting: {0} maneuverLoss=Maneuver loss -averageManeuverLossInMeters=\u2205 Maneuver Loss \ No newline at end of file +averageManeuverLossInMeters=\u2205 Maneuver Loss +averageTackLossInMeters=\u2205 Tack Loss +averageJibeLossInMeters=\u2205 Jibe Loss \ No newline at end of file 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 670e1c4b1f0..df3d931cb4b 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 @@ -428,4 +428,6 @@ expandLastRace=Immer letztes gezeigtes Rennen expandieren factor=Faktor errorUpdatingIsMedalRace=Fehler beim Ändern der Medaillenrennen-Einstellung: {0} maneuverLoss=Manöververlust -averageManeuverLossInMeters=\u2205 Manöververlust \ No newline at end of file +averageManeuverLossInMeters=\u2205 Manöververlust +averageTackLossInMeters=\u2205 Wendeverlust +averageJibeLossInMeters=\u2205 Halseverlust \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsFactory.java index 2a187d1f812..0b5f8091b33 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardSettingsFactory.java @@ -50,8 +50,11 @@ public class LeaderboardSettingsFactory { case Live: List maneuverDetails = new ArrayList(); maneuverDetails.add(DetailType.TACK); + maneuverDetails.add(DetailType.AVERAGE_TACK_LOSS_IN_METERS); maneuverDetails.add(DetailType.JIBE); + maneuverDetails.add(DetailType.AVERAGE_JIBE_LOSS_IN_METERS); maneuverDetails.add(DetailType.PENALTY_CIRCLE); + maneuverDetails.add(DetailType.AVERAGE_MANEUVER_LOSS_IN_METERS); List legDetails = new ArrayList(); legDetails.add(DetailType.DISTANCE_TRAVELED); legDetails.add(DetailType.AVERAGE_SPEED_OVER_GROUND_IN_KNOTS); @@ -108,8 +111,11 @@ public class LeaderboardSettingsFactory { } List maneuverDetails = new ArrayList(); maneuverDetails.add(DetailType.TACK); + maneuverDetails.add(DetailType.AVERAGE_TACK_LOSS_IN_METERS); maneuverDetails.add(DetailType.JIBE); + maneuverDetails.add(DetailType.AVERAGE_JIBE_LOSS_IN_METERS); maneuverDetails.add(DetailType.PENALTY_CIRCLE); + maneuverDetails.add(DetailType.AVERAGE_MANEUVER_LOSS_IN_METERS); List legDetails = new ArrayList(); legDetails.add(DetailType.DISTANCE_TRAVELED); legDetails.add(DetailType.AVERAGE_SPEED_OVER_GROUND_IN_KNOTS); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java index 62f12d77401..3116eb09283 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java @@ -9,6 +9,7 @@ import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.user.cellview.client.Header; import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.InvertibleComparator; +import com.sap.sailing.domain.common.ManeuverType; import com.sap.sailing.domain.common.SortingOrder; import com.sap.sailing.domain.common.impl.InvertibleComparatorAdapter; import com.sap.sailing.gwt.ui.client.StringMessages; @@ -133,24 +134,24 @@ public class LegColumn extends ExpandableSortableColumn { LegEntryDTO entry = getLegEntry(row); if (entry != null) { StringBuilder result = new StringBuilder(); - if (entry.numberOfTacks != null) { - result.append(entry.numberOfTacks); + if (entry.numberOfManeuvers.get(ManeuverType.TACK) != null) { + result.append(entry.numberOfManeuvers.get(ManeuverType.TACK)); result.append(" "); result.append(stringMessages.tacks()); } - if (entry.numberOfJibes != null) { + if (entry.numberOfManeuvers.get(ManeuverType.JIBE) != null) { if (result.length() > 0) { result.append(", "); } - result.append(entry.numberOfJibes); + result.append(entry.numberOfManeuvers.get(ManeuverType.JIBE)); result.append(" "); result.append(stringMessages.jibes()); } - if (entry.numberOfPenaltyCircles != null) { + if (entry.numberOfManeuvers.get(ManeuverType.PENALTY_CIRCLE) != null) { if (result.length() > 0) { result.append(", "); } - result.append(entry.numberOfPenaltyCircles); + result.append(entry.numberOfManeuvers.get(ManeuverType.PENALTY_CIRCLE)); result.append(" "); result.append(stringMessages.penaltyCircles()); } @@ -168,9 +169,9 @@ public class LegColumn extends ExpandableSortableColumn { result.append(getFormatter().format(fieldValue)); } LegEntryDTO entry = getLegEntry(row); - if (entry != null && entry.numberOfPenaltyCircles != null && (int) entry.numberOfPenaltyCircles != 0) { + if (entry != null && entry.numberOfManeuvers.get(ManeuverType.PENALTY_CIRCLE) != null && (int) entry.numberOfManeuvers.get(ManeuverType.PENALTY_CIRCLE) != 0) { result.append(" ("); - result.append(entry.numberOfPenaltyCircles); + result.append(entry.numberOfManeuvers.get(ManeuverType.PENALTY_CIRCLE)); result.append("P)"); } return result.toString(); @@ -181,28 +182,21 @@ public class LegColumn extends ExpandableSortableColumn { LegEntryDTO entry = getLegEntry(row); Double result = null; if (entry != null) { - if (entry.numberOfTacks != null) { - result = (double) entry.numberOfTacks; - } - if (entry.numberOfJibes != null) { - if (result == null) { - result = (double) entry.numberOfJibes; - } else { - result += (double) entry.numberOfJibes; - } - } - if (entry.numberOfPenaltyCircles != null) { - if (result == null) { - result = (double) entry.numberOfPenaltyCircles; - } else { - result += (double) entry.numberOfPenaltyCircles; + for (ManeuverType maneuverType : new ManeuverType[] { ManeuverType.TACK, ManeuverType.JIBE, + ManeuverType.PENALTY_CIRCLE }) { + if (entry.numberOfManeuvers.get(maneuverType) != null) { + if (result == null) { + result = (double) entry.numberOfManeuvers.get(maneuverType); + } else { + result += (double) entry.numberOfManeuvers.get(maneuverType); + } } } } return result; } - } + public LegColumn(LeaderboardPanel leaderboardPanel, String raceName, int legIndex, SortingOrder preferredSortingOrder, StringMessages stringMessages, List legDetailSelection, String headerStyle, String columnStyle, String detailHeaderStyle, String detailColumnStyle) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/ManeuverCountRaceColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/ManeuverCountRaceColumn.java index 9fdcd489a2c..2c95a79f999 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/ManeuverCountRaceColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/ManeuverCountRaceColumn.java @@ -11,8 +11,8 @@ import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.cellview.client.Header; import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.InvertibleComparator; +import com.sap.sailing.domain.common.ManeuverType; import com.sap.sailing.domain.common.impl.InvertibleComparatorAdapter; -import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.leaderboard.LegDetailColumn.LegDetailField; import com.sap.sailing.gwt.ui.shared.LeaderboardDTO; @@ -46,28 +46,42 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn im private class NumberOfTacks extends AbstractManeuverDetailField { @Override protected Double getFromNonNullEntry(LeaderboardEntryDTO entry) { - return ManeuverCountRaceColumn.this.getTotalNumberOfTacks(entry); + return ManeuverCountRaceColumn.this.getTotalNumberOfManeuvers(entry, ManeuverType.TACK); + } + } + + private class AverageTackLossInMeters extends AbstractManeuverDetailField { + @Override + protected Double getFromNonNullEntry(LeaderboardEntryDTO entry) { + return ManeuverCountRaceColumn.this.getAverageManeuverLossInMeters(entry, ManeuverType.TACK); } } private class NumberOfJibes extends AbstractManeuverDetailField { @Override protected Double getFromNonNullEntry(LeaderboardEntryDTO entry) { - return ManeuverCountRaceColumn.this.getTotalNumberOfJibes(entry); + return ManeuverCountRaceColumn.this.getTotalNumberOfManeuvers(entry, ManeuverType.JIBE); + } + } + + private class AverageJibeLossInMeters extends AbstractManeuverDetailField { + @Override + protected Double getFromNonNullEntry(LeaderboardEntryDTO entry) { + return ManeuverCountRaceColumn.this.getAverageManeuverLossInMeters(entry, ManeuverType.JIBE); } } private class NumberOfPenaltyCircles extends AbstractManeuverDetailField { @Override protected Double getFromNonNullEntry(LeaderboardEntryDTO entry) { - return ManeuverCountRaceColumn.this.getTotalNumberOfPenaltyCircles(entry); + return ManeuverCountRaceColumn.this.getTotalNumberOfManeuvers(entry, ManeuverType.PENALTY_CIRCLE); } } private class AverageManeuverLossInMeters extends AbstractManeuverDetailField { @Override protected Double getFromNonNullEntry(LeaderboardEntryDTO entry) { - return ManeuverCountRaceColumn.this.getAverageManeuverLossInMeters(entry); + return ManeuverCountRaceColumn.this.getAverageManeuverLossInMeters(entry, ManeuverType.TACK, ManeuverType.JIBE); } } @@ -84,118 +98,68 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn im this.minmaxRenderer = new MinMaxRenderer(this, getComparator()); } - public Double getAverageManeuverLossInMeters(LeaderboardEntryDTO row) { - Double maneuverLossInMetersSum = null; + private Double getAverageManeuverLossInMeters(LeaderboardEntryDTO row, ManeuverType... maneuverTypes) { int count = 0; + double totalLossInMeters = 0.0; if (row != null && row.legDetails != null) { for (LegEntryDTO legDetail : row.legDetails) { if (legDetail != null) { if (legDetail.averageManeuverLossInMeters != null) { - if (maneuverLossInMetersSum == null) { - maneuverLossInMetersSum = (double) legDetail.averageManeuverLossInMeters; - } else { - maneuverLossInMetersSum += (double) legDetail.averageManeuverLossInMeters; + for (ManeuverType maneuverType : maneuverTypes) { + final Integer maneuverCount = legDetail.numberOfManeuvers.get(maneuverType); + if (maneuverCount != null && maneuverCount != 0) { + totalLossInMeters += legDetail.averageManeuverLossInMeters.get(maneuverType) * maneuverCount; + count += maneuverCount; + } } - Triple maneuverCounts = getTotalNumberOfTacksJibesAndPenaltyCircles(row); - count += maneuverCounts.getA()+maneuverCounts.getB()+maneuverCounts.getC(); } } } } - return maneuverLossInMetersSum == null ? null : maneuverLossInMetersSum / count; + return count == 0 ? null : totalLossInMeters / count; } - private Double getTotalNumberOfTacks(LeaderboardEntryDTO row) { - Double totalNumberOfTacks = null; + private Double getTotalNumberOfManeuvers(LeaderboardEntryDTO row, ManeuverType maneuverType) { + Double totalNumberOfManeuvers = null; if (row != null && row.legDetails != null) { for (LegEntryDTO legDetail : row.legDetails) { if (legDetail != null) { - if (legDetail.numberOfTacks != null) { - if (totalNumberOfTacks == null) { - totalNumberOfTacks = (double) legDetail.numberOfTacks; + if (legDetail.numberOfManeuvers.get(maneuverType) != null) { + if (totalNumberOfManeuvers == null) { + totalNumberOfManeuvers = (double) legDetail.numberOfManeuvers.get(maneuverType); } else { - totalNumberOfTacks += (double) legDetail.numberOfTacks; + totalNumberOfManeuvers += (double) legDetail.numberOfManeuvers.get(maneuverType); } } } } } - return totalNumberOfTacks; + return totalNumberOfManeuvers; } - private Double getTotalNumberOfJibes(LeaderboardEntryDTO row) { - Double totalNumberOfJibes = null; - if (row != null && row.legDetails != null) { - for (LegEntryDTO legDetail : row.legDetails) { - if (legDetail != null) { - if (legDetail.numberOfJibes != null) { - if (totalNumberOfJibes == null) { - totalNumberOfJibes = (double) legDetail.numberOfJibes; - } else { - totalNumberOfJibes += (double) legDetail.numberOfJibes; - } - } - } - } - } - return totalNumberOfJibes; - } - - private Double getTotalNumberOfPenaltyCircles(LeaderboardEntryDTO row) { - Double totalNumberOfPnaltyCicles = null; - if (row != null && row.legDetails != null) { - for (LegEntryDTO legDetail : row.legDetails) { - if (legDetail != null) { - if (legDetail.numberOfPenaltyCircles != null) { - if (totalNumberOfPnaltyCicles == null) { - totalNumberOfPnaltyCicles = (double) legDetail.numberOfPenaltyCircles; - } else { - totalNumberOfPnaltyCicles += (double) legDetail.numberOfPenaltyCircles; - } - } - } - } - } - return totalNumberOfPnaltyCicles; - } - - private Triple getTotalNumberOfTacksJibesAndPenaltyCircles(LeaderboardRowDTO row) { + private Map getTotalNumberOfTacksJibesAndPenaltyCircles(LeaderboardRowDTO row) { LeaderboardEntryDTO fieldsForRace = row.fieldsByRaceColumnName.get(getRaceName()); return getTotalNumberOfTacksJibesAndPenaltyCircles(fieldsForRace); } - private Triple getTotalNumberOfTacksJibesAndPenaltyCircles(LeaderboardEntryDTO fieldsForRace) { - Double totalNumberOfTacks = null; - Double totalNumberOfJibes = null; - Double totalNumberOfPenaltyCircles = null; + private Map getTotalNumberOfTacksJibesAndPenaltyCircles(LeaderboardEntryDTO fieldsForRace) { + Map totalNumberOfManeuvers = new HashMap(); + for (ManeuverType maneuverType : new ManeuverType[] { ManeuverType.TACK, ManeuverType.JIBE, ManeuverType.PENALTY_CIRCLE }) { + totalNumberOfManeuvers.put(maneuverType, 0.0); + } if (fieldsForRace != null && fieldsForRace.legDetails != null) { for (LegEntryDTO legDetail : fieldsForRace.legDetails) { if (legDetail != null) { - if (legDetail.numberOfTacks != null) { - if (totalNumberOfTacks == null) { - totalNumberOfTacks = (double) legDetail.numberOfTacks; - } else { - totalNumberOfTacks += legDetail.numberOfTacks; - } - } - if (legDetail.numberOfJibes != null) { - if (totalNumberOfJibes == null) { - totalNumberOfJibes = (double) legDetail.numberOfJibes; - } else { - totalNumberOfJibes += (double) legDetail.numberOfJibes; - } - } - if (legDetail.numberOfPenaltyCircles != null) { - if (totalNumberOfPenaltyCircles == null) { - totalNumberOfPenaltyCircles = (double) legDetail.numberOfPenaltyCircles; - } else { - totalNumberOfPenaltyCircles += (double) legDetail.numberOfPenaltyCircles; + for (ManeuverType maneuverType : new ManeuverType[] { ManeuverType.TACK, ManeuverType.JIBE, ManeuverType.PENALTY_CIRCLE }) { + if (legDetail.numberOfManeuvers.get(maneuverType) != null) { + totalNumberOfManeuvers.put(maneuverType, + totalNumberOfManeuvers.get(maneuverType) + (double) legDetail.numberOfManeuvers.get(maneuverType)); } } } } } - return new Triple(totalNumberOfTacks, totalNumberOfJibes, totalNumberOfPenaltyCircles); + return totalNumberOfManeuvers; } private String getRaceName() { @@ -251,25 +215,14 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn im public Double getDoubleValue(LeaderboardRowDTO row) { Double result = null; - Triple tacksJibesAndPenalties = getTotalNumberOfTacksJibesAndPenaltyCircles(row); - Double totalNumberOfTacks = tacksJibesAndPenalties.getA(); - Double totalNumberOfJibes = tacksJibesAndPenalties.getB(); - Double totalNumberOfPenaltyCircles = tacksJibesAndPenalties.getC(); - if (totalNumberOfTacks != null) { - result = (double) totalNumberOfTacks; - } - if (totalNumberOfJibes != null) { - if (result == null) { - result = (double) totalNumberOfJibes; - } else { - result += (double) totalNumberOfJibes; - } - } - if (totalNumberOfPenaltyCircles != null) { - if (result == null) { - result = (double) totalNumberOfPenaltyCircles; - } else { - result += (double) totalNumberOfPenaltyCircles; + Map tacksJibesAndPenalties = getTotalNumberOfTacksJibesAndPenaltyCircles(row); + for (Double maneuverCount : tacksJibesAndPenalties.values()) { + if (maneuverCount != null) { + if (result == null) { + result = maneuverCount; + } else { + result += maneuverCount; + } } } return result; @@ -293,6 +246,16 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn im new FormattedDoubleLegDetailColumn(stringMessages.penaltyCircle(), "", new NumberOfPenaltyCircles(), DetailType.PENALTY_CIRCLE.getPrecision(), DetailType.PENALTY_CIRCLE.getDefaultSortingOrder(), detailHeaderStyle, detailColumnStyle)); + result.put(DetailType.AVERAGE_TACK_LOSS_IN_METERS, + new FormattedDoubleLegDetailColumn(stringMessages.averageTackLossInMeters(), + stringMessages.distanceInMetersUnit(), new AverageTackLossInMeters(), + DetailType.AVERAGE_TACK_LOSS_IN_METERS.getPrecision(), DetailType.AVERAGE_TACK_LOSS_IN_METERS.getDefaultSortingOrder(), + detailHeaderStyle, detailColumnStyle)); + result.put(DetailType.AVERAGE_JIBE_LOSS_IN_METERS, + new FormattedDoubleLegDetailColumn(stringMessages.averageJibeLossInMeters(), + stringMessages.distanceInMetersUnit(), new AverageJibeLossInMeters(), + DetailType.AVERAGE_JIBE_LOSS_IN_METERS.getPrecision(), DetailType.AVERAGE_JIBE_LOSS_IN_METERS.getDefaultSortingOrder(), + detailHeaderStyle, detailColumnStyle)); result.put(DetailType.AVERAGE_MANEUVER_LOSS_IN_METERS, new FormattedDoubleLegDetailColumn(stringMessages.averageManeuverLossInMeters(), stringMessages.distanceInMetersUnit(), new AverageManeuverLossInMeters(), @@ -302,7 +265,8 @@ public class ManeuverCountRaceColumn extends ExpandableSortableColumn im } public static DetailType[] getAvailableManeuverDetailColumnTypes() { - return new DetailType[] { DetailType.TACK, DetailType.JIBE, DetailType.PENALTY_CIRCLE }; + return new DetailType[] { DetailType.TACK, DetailType.AVERAGE_TACK_LOSS_IN_METERS, + DetailType.JIBE, DetailType.AVERAGE_JIBE_LOSS_IN_METERS, DetailType.PENALTY_CIRCLE, DetailType.AVERAGE_MANEUVER_LOSS_IN_METERS }; } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboardedit/EditableLeaderboardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboardedit/EditableLeaderboardPanel.java index 40826112b15..dc94c943d64 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboardedit/EditableLeaderboardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboardedit/EditableLeaderboardPanel.java @@ -221,7 +221,8 @@ public class EditableLeaderboardPanel extends LeaderboardPanel { } getLeaderboard().competitorDisplayNames.put(row.competitor, value == null || value.trim().length() == 0 ? null : value.trim()); cell.setViewData(row, null); // ensure that getValue() is called again - EditableLeaderboardPanel.this.getData().getList().set(rowIndex, row); + EditableLeaderboardPanel.this.getData().getList().set( + EditableLeaderboardPanel.this.getData().getList().indexOf(row), row); } }); } @@ -672,9 +673,10 @@ public class EditableLeaderboardPanel extends LeaderboardPanel { private List> getCellListForEditableCompetitorColumn() { List> result = new ArrayList>(); result.add(new HasCell() { + private final ButtonCell cell = new ButtonCell(); @Override public Cell getCell() { - return new ButtonCell(); + return cell; } @Override @@ -707,9 +709,10 @@ public class EditableLeaderboardPanel extends LeaderboardPanel { } }); result.add(new HasCell() { + private final EditTextCell cell = new EditTextCell(); @Override public EditTextCell getCell() { - return new EditTextCell(); + return cell; } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/LeaderboardDTOCache.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/LeaderboardDTOCache.java index 3bacee1f230..e90a6cd0502 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/LeaderboardDTOCache.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/LeaderboardDTOCache.java @@ -288,6 +288,11 @@ public class LeaderboardDTOCache { public void factorChanged(RaceColumn raceColumn, Double oldFactor, Double newFactor) { removeFromCache(leaderboard); } + + @Override + public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { + removeFromCache(leaderboard); + } }; leaderboard.addRaceColumnListener(raceColumnListener); synchronized (raceColumnListeners) { 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 809c8dc6da6..72380bc8c18 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 @@ -60,6 +60,7 @@ import com.sap.sailing.domain.common.CountryCode; import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.LegType; +import com.sap.sailing.domain.common.ManeuverType; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NoWindError; import com.sap.sailing.domain.common.NoWindException; @@ -831,37 +832,34 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S .getMeters(); List maneuvers = trackedLeg.getManeuvers(timePoint, waitForLatestAnalyses); if (maneuvers != null) { - result.numberOfTacks = 0; - result.numberOfJibes = 0; - result.numberOfPenaltyCircles = 0; - int maneuverCount = 0; - double totalManeuverLossInMeters = 0.0; + result.numberOfManeuvers = new HashMap(); + result.numberOfManeuvers.put(ManeuverType.TACK, 0); + result.numberOfManeuvers.put(ManeuverType.JIBE, 0); + result.numberOfManeuvers.put(ManeuverType.PENALTY_CIRCLE, 0); + Map totalManeuverLossInMeters = new HashMap(); + totalManeuverLossInMeters.put(ManeuverType.TACK, 0.0); + totalManeuverLossInMeters.put(ManeuverType.JIBE, 0.0); + totalManeuverLossInMeters.put(ManeuverType.PENALTY_CIRCLE, 0.0); for (Maneuver maneuver : maneuvers) { switch (maneuver.getType()) { case TACK: - result.numberOfTacks++; - if (maneuver.getManeuverLoss() != null) { - maneuverCount++; - totalManeuverLossInMeters += maneuver.getManeuverLoss().getMeters(); - } - break; case JIBE: - result.numberOfJibes++; - if (maneuver.getManeuverLoss() != null) { - maneuverCount++; - totalManeuverLossInMeters += maneuver.getManeuverLoss().getMeters(); - } - break; case PENALTY_CIRCLE: - result.numberOfPenaltyCircles++; if (maneuver.getManeuverLoss() != null) { - maneuverCount++; - totalManeuverLossInMeters += maneuver.getManeuverLoss().getMeters(); + result.numberOfManeuvers.put(maneuver.getType(), result.numberOfManeuvers.get(maneuver.getType())+1); + totalManeuverLossInMeters.put(maneuver.getType(), + totalManeuverLossInMeters.get(maneuver.getType()) + maneuver.getManeuverLoss().getMeters()); } break; } } - result.averageManeuverLossInMeters = maneuverCount == 0 ? null : (totalManeuverLossInMeters/maneuverCount); + result.averageManeuverLossInMeters = new HashMap(); + for (ManeuverType maneuverType : new ManeuverType[] { ManeuverType.TACK, ManeuverType.JIBE, ManeuverType.PENALTY_CIRCLE }) { + if (result.numberOfManeuvers.get(maneuverType) != 0) { + result.averageManeuverLossInMeters.put(maneuverType, + totalManeuverLossInMeters.get(maneuverType)/result.numberOfManeuvers.get(maneuverType)); + } + } } } return result; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LegEntryDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LegEntryDTO.java index 9f88b55601e..ddb815c4fc0 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LegEntryDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LegEntryDTO.java @@ -1,6 +1,9 @@ package com.sap.sailing.gwt.ui.shared; +import java.util.Map; + import com.google.gwt.user.client.rpc.IsSerializable; +import com.sap.sailing.domain.common.ManeuverType; /** * Holds data about one competitor's performance in one leg of one race represented in the @@ -35,10 +38,8 @@ public class LegEntryDTO implements IsSerializable { public Long timeInMilliseconds; public boolean started; public boolean finished; - public Integer numberOfJibes; - public Integer numberOfTacks; - public Double averageManeuverLossInMeters; - public Integer numberOfPenaltyCircles; + public Map numberOfManeuvers; + public Map averageManeuverLossInMeters; public Double averageCrossTrackErrorInMeters; @Override @@ -55,9 +56,7 @@ public class LegEntryDTO implements IsSerializable { + ((estimatedTimeToNextWaypointInSeconds == null) ? 0 : estimatedTimeToNextWaypointInSeconds.hashCode()); result = prime * result + (finished ? 1231 : 1237); result = prime * result + ((gapToLeaderInSeconds == null) ? 0 : gapToLeaderInSeconds.hashCode()); - result = prime * result + ((numberOfJibes == null) ? 0 : numberOfJibes.hashCode()); - result = prime * result + ((numberOfPenaltyCircles == null) ? 0 : numberOfPenaltyCircles.hashCode()); - result = prime * result + ((numberOfTacks == null) ? 0 : numberOfTacks.hashCode()); + result = prime * result + ((numberOfManeuvers == null) ? 0 : numberOfManeuvers.hashCode()); result = prime * result + rank; result = prime * result + (started ? 1231 : 1237); result = prime * result + (int) (timeInMilliseconds ^ (timeInMilliseconds >>> 32)); @@ -102,20 +101,10 @@ public class LegEntryDTO implements IsSerializable { return false; } else if (!gapToLeaderInSeconds.equals(other.gapToLeaderInSeconds)) return false; - if (numberOfJibes == null) { - if (other.numberOfJibes != null) + if (numberOfManeuvers == null) { + if (other.numberOfManeuvers != null) return false; - } else if (!numberOfJibes.equals(other.numberOfJibes)) - return false; - if (numberOfPenaltyCircles == null) { - if (other.numberOfPenaltyCircles != null) - return false; - } else if (!numberOfPenaltyCircles.equals(other.numberOfPenaltyCircles)) - return false; - if (numberOfTacks == null) { - if (other.numberOfTacks != null) - return false; - } else if (!numberOfTacks.equals(other.numberOfTacks)) + } else if (!numberOfManeuvers.equals(other.numberOfManeuvers)) return false; if (rank != other.rank) return false;