From 59f3c0c13501314b35cfd935a4e77d743ddc9faa Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Wed, 8 Aug 2018 21:59:47 +0200 Subject: [PATCH 01/12] competitor results shall always get a name and a boat --- .../abstractlog/race/CompetitorResult.java | 8 +- .../race/impl/CompetitorResultImpl.java | 74 +++++++++++++++---- 2 files changed, 67 insertions(+), 15 deletions(-) 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 73e556c861e..71b2b8ee7a7 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 @@ -40,7 +40,13 @@ public interface CompetitorResult extends Serializable { Serializable getCompetitorId(); - String getCompetitorDisplayName(); + String getName(); + + String getShortName(); + + String getBoatName(); + + String getBoatSailId(); int getOneBasedRank(); 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 d5221e451a4..4a3e799544e 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 @@ -11,7 +11,9 @@ public class CompetitorResultImpl implements CompetitorResult { private final Serializable competitorId; - private final String competitorDisplayName; + private final String competitorName; + + private final String competitorShortName; private final int oneBasedRank; @@ -25,12 +27,20 @@ public class CompetitorResultImpl implements CompetitorResult { private final MergeState mergeState; - public CompetitorResultImpl(Serializable competitorId, String competitorDisplayName, int oneBasedRank, - MaxPointsReason maxPointsReason, Double score, TimePoint finishingTime, String comment, - MergeState mergeState) { + private final String boatName; + + private final String boatSailId; + + + public CompetitorResultImpl(Serializable competitorId, String competitorName, String competitorShortName, + String boatName, String boatSailId, int oneBasedRank, MaxPointsReason maxPointsReason, Double score, + TimePoint finishingTime, String comment, MergeState mergeState) { super(); this.competitorId = competitorId; - this.competitorDisplayName = competitorDisplayName; + this.competitorName = competitorName; + this.competitorShortName = competitorShortName; + this.boatName = boatName; + this.boatSailId = boatSailId; this.oneBasedRank = oneBasedRank; this.maxPointsReason = maxPointsReason; this.score = score; @@ -45,8 +55,23 @@ public class CompetitorResultImpl implements CompetitorResult { } @Override - public String getCompetitorDisplayName() { - return competitorDisplayName; + public String getName() { + return competitorName; + } + + @Override + public String getShortName() { + return competitorShortName; + } + + @Override + public String getBoatName() { + return boatName; + } + + @Override + public String getBoatSailId() { + return boatSailId; } @Override @@ -79,13 +104,23 @@ public class CompetitorResultImpl implements CompetitorResult { return mergeState == null ? MergeState.OK : mergeState; // default in case of having de-serialized an old version } + public String getCompetitorDisplayName() { + if (competitorShortName != null) { + return competitorShortName + " - " + competitorName; + } + return competitorName; + } + @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((comment == null) ? 0 : comment.hashCode()); - result = prime * result + ((competitorDisplayName == null) ? 0 : competitorDisplayName.hashCode()); + result = prime * result + ((competitorName == null) ? 0 : competitorName.hashCode()); + result = prime * result + ((competitorShortName == null) ? 0 : competitorShortName.hashCode()); result = prime * result + ((competitorId == null) ? 0 : competitorId.hashCode()); + result = prime * result + ((boatName == null) ? 0 : boatName.hashCode()); + result = prime * result + ((boatSailId == null) ? 0 : boatSailId.hashCode()); result = prime * result + ((finishingTime == null) ? 0 : finishingTime.hashCode()); result = prime * result + ((maxPointsReason == null) ? 0 : maxPointsReason.hashCode()); result = prime * result + oneBasedRank; @@ -108,16 +143,26 @@ public class CompetitorResultImpl implements CompetitorResult { return false; } else if (!comment.equals(other.comment)) return false; - if (competitorDisplayName == null) { - if (other.competitorDisplayName != null) + if (competitorName == null) { + if (other.competitorName != null) return false; - } else if (!competitorDisplayName.equals(other.competitorDisplayName)) + } else if (!competitorName.equals(other.competitorName)) return false; if (competitorId == null) { if (other.competitorId != null) return false; } else if (!competitorId.equals(other.competitorId)) return false; + if (boatName == null) { + if (other.boatName != null) + return false; + } else if (!boatName.equals(other.boatName)) + return false; + if (boatSailId == null) { + if (other.boatSailId != null) + return false; + } else if (!boatSailId.equals(other.boatSailId)) + return false; if (finishingTime == null) { if (other.finishingTime != null) return false; @@ -142,9 +187,10 @@ public class CompetitorResultImpl implements CompetitorResult { @Override public String toString() { - return "CompetitorResultImpl [competitorId=" + competitorId + ", competitorName=" + competitorDisplayName + ", rank=" - + oneBasedRank + ", maxPointsReason=" + maxPointsReason + ", score=" + score + ", finishingTime=" - + finishingTime + ", comment=" + comment + ", mergeState=" + mergeState + "]"; + return "CompetitorResultImpl [competitorId=" + competitorId + ", competitorName=" + competitorName + + ", competitorShortName=" + competitorShortName + ", boatName=" + boatName+ ", boatSailId=" + + boatSailId + ", rank=" + oneBasedRank + ", maxPointsReason=" + maxPointsReason + ", score="+ score + + ", finishingTime=" + finishingTime + ", comment=" + comment + ", mergeState=" + mergeState + "]"; } } From 5bd74b5068d6a57ee14c5c119c8e9968432b5616 Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Wed, 8 Aug 2018 22:00:48 +0200 Subject: [PATCH 02/12] serialization and persistence adjusted --- .../impl/DomainObjectFactoryImpl.java | 24 +++++++++++++++++-- .../domain/persistence/impl/FieldNames.java | 2 +- ...LogFinishPositioningEventDeserializer.java | 9 +++++-- ...ceLogFinishPositioningEventSerializer.java | 8 ++++++- 4 files changed, 37 insertions(+), 6 deletions(-) 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 749cf0d754d..826693f2d67 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 @@ -1863,6 +1863,25 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { if (competitorDisplayName == null) { competitorDisplayName = "loaded competitor"; } + String competitorShortName = (String) dbObject.get(FieldNames.COMPETITOR_SHORT_NAME.name()); + // The Competitor short name is a new field in the list. Therefore the short name might be null for existing + // events. In this case a standard short name is set. + if (competitorShortName == null) { + competitorShortName = "loaded competitor short"; + } + String competitorBoatName = (String) dbObject.get(FieldNames.COMPETITOR_BOAT_NAME.name()); + // The Competitor boat is a new field in the list. Therefore the name might be null for existing events. + // In this case a standard boat name is set. + if (competitorBoatName == null) { + competitorBoatName = "loaded competitor boat"; + } + String competitorBoatSailId = (String) dbObject.get(FieldNames.COMPETITOR_BOAT_SAIL_ID.name()); + // The Competitor boat is a new field in the list. Therefore the boat id might be null for existing events. + // In this case a standard name is set. + if (competitorBoatSailId == null) { + competitorBoatSailId = "loaded competitor boat id"; + } + // At this point we do not retrieve the competitor object since at any point in time, especially after a // server restart, the DomainFactory and its competitor // cache might be empty. But at this time the race log is loaded from database, so the competitor would be @@ -1886,8 +1905,9 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } else { mergeState = MergeState.valueOf(mergeStateAsString); } - CompetitorResultImpl positionedCompetitor = new CompetitorResultImpl( - competitorId, competitorDisplayName, rank == null ? rankCounter : rank, maxPointsReason, score, finishingTime, comment, mergeState); + CompetitorResultImpl positionedCompetitor = new CompetitorResultImpl(competitorId, competitorDisplayName, + competitorShortName, competitorBoatName, competitorBoatSailId, 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 b557b018195..2f57cd81076 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 @@ -74,7 +74,7 @@ public enum FieldNames { // SwissTiming configuration parameters: ST_CONFIG_NAME, ST_CONFIG_HOSTNAME, ST_CONFIG_PORT, - COMPETITOR_ID, COMPETITOR_DISPLAY_NAME, + COMPETITOR_ID, COMPETITOR_DISPLAY_NAME, COMPETITOR_SHORT_NAME, COMPETITOR_BOAT_NAME, COMPETITOR_BOAT_SAIL_ID, // leaderboard: LEADERBOARD_NAME, LEADERBOARD_DISPLAY_NAME, LEADERBOARD_SUPPRESSED_COMPETITORS, LEADERBOARD_SUPPRESSED_COMPETITOR_IDS, diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningEventDeserializer.java index 9177477c343..0fb7f9668dc 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogFinishPositioningEventDeserializer.java @@ -49,7 +49,10 @@ public abstract class RaceLogFinishPositioningEventDeserializer extends BaseRace JSONObject jsonPositionedCompetitor = Helpers.toJSONObjectSafe(object); Serializable competitorId = (Serializable) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_ID); competitorId = UUIDHelper.tryUuidConversion(competitorId); - final String competitorDisplayName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_NAME); + final String competitorName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_NAME); + final String competitorShortName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_SHORT_NAME); + final String competitorBoatName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_BOAT_NAME); + final String competitorBoatSailId = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_COMPETITOR_BOAT_SAIL_ID); final String maxPointsReasonName = (String) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON); final MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName); final Number rank = (Number) jsonPositionedCompetitor.get(RaceLogFinishPositioningConfirmedEventSerializer.FIELD_RANK); @@ -65,7 +68,9 @@ public abstract class RaceLogFinishPositioningEventDeserializer extends BaseRace mergeState = MergeState.valueOf(mergeStateAsString); } CompetitorResultImpl positionedCompetitor = new CompetitorResultImpl( - competitorId, competitorDisplayName, rank == null ? rankCounter : rank.intValue(), maxPointsReason, score, finishingTime, comment, mergeState); + competitorId, competitorName, competitorShortName, competitorBoatName, competitorBoatSailId, + rank == null ? rankCounter : rank.intValue(), maxPointsReason, score, finishingTime, comment, + mergeState); rankCounter++; positionedCompetitors.add(positionedCompetitor); } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningEventSerializer.java index 3940a8018fc..e7b6e36213c 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogFinishPositioningEventSerializer.java @@ -14,6 +14,9 @@ public abstract class RaceLogFinishPositioningEventSerializer extends BaseRaceLo public static final String FIELD_POSITIONED_COMPETITORS = "positionedCompetitors"; public static final String FIELD_COMPETITOR_ID = "competitorId"; public static final String FIELD_COMPETITOR_NAME = "competitorName"; + public static final String FIELD_COMPETITOR_SHORT_NAME = "competitorShortName"; + public static final String FIELD_COMPETITOR_BOAT_NAME = "competitorBoatName"; + public static final String FIELD_COMPETITOR_BOAT_SAIL_ID = "competitorBoatSailId"; public static final String FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON = "maxPointsReason"; public static final String FIELD_SCORE = "score"; public static final String FIELD_COMMENT = "comment"; @@ -42,7 +45,10 @@ public abstract class RaceLogFinishPositioningEventSerializer extends BaseRaceLo for (CompetitorResult positionedCompetitor : positionedCompetitors) { JSONObject jsonPositionedCompetitor = new JSONObject(); jsonPositionedCompetitor.put(FIELD_COMPETITOR_ID, positionedCompetitor.getCompetitorId().toString()); - jsonPositionedCompetitor.put(FIELD_COMPETITOR_NAME, positionedCompetitor.getCompetitorDisplayName()); + jsonPositionedCompetitor.put(FIELD_COMPETITOR_NAME, positionedCompetitor.getName()); + jsonPositionedCompetitor.put(FIELD_COMPETITOR_SHORT_NAME, positionedCompetitor.getShortName()); + jsonPositionedCompetitor.put(FIELD_COMPETITOR_BOAT_NAME, positionedCompetitor.getBoatName()); + jsonPositionedCompetitor.put(FIELD_COMPETITOR_BOAT_SAIL_ID, positionedCompetitor.getBoatSailId()); jsonPositionedCompetitor.put(FIELD_SCORE_CORRECTIONS_MAX_POINTS_REASON, positionedCompetitor.getMaxPointsReason().name()); jsonPositionedCompetitor.put(FIELD_SCORE, positionedCompetitor.getScore()); jsonPositionedCompetitor.put(FIELD_COMMENT, positionedCompetitor.getComment()); From 26eea4e2e298b416b2233dcbd0f8099e11e354c0 Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Wed, 8 Aug 2018 22:01:30 +0200 Subject: [PATCH 03/12] mongo persistence adjusted as well --- .../domain/persistence/impl/MongoObjectFactoryImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 408e806b9fc..fb06dc2c478 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 @@ -1234,7 +1234,10 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { private DBObject storePositionedCompetitor(CompetitorResult competitorResult) { DBObject result = new BasicDBObject(); result.put(FieldNames.COMPETITOR_ID.name(), competitorResult.getCompetitorId()); - result.put(FieldNames.COMPETITOR_DISPLAY_NAME.name(), competitorResult.getCompetitorDisplayName()); + result.put(FieldNames.COMPETITOR_DISPLAY_NAME.name(), competitorResult.getName()); + result.put(FieldNames.COMPETITOR_SHORT_NAME.name(), competitorResult.getShortName()); + result.put(FieldNames.COMPETITOR_BOAT_NAME.name(), competitorResult.getBoatName()); + result.put(FieldNames.COMPETITOR_BOAT_SAIL_ID.name(), competitorResult.getBoatSailId()); result.put(FieldNames.LEADERBOARD_SCORE_CORRECTION_MAX_POINTS_REASON.name(), competitorResult.getMaxPointsReason() == null ? null : competitorResult.getMaxPointsReason().name()); result.put(FieldNames.LEADERBOARD_CORRECTED_SCORE.name(), competitorResult.getScore()); result.put(FieldNames.RACE_LOG_FINISHING_TIME_AS_MILLIS.name(), competitorResult.getFinishingTime() == null ? null : competitorResult.getFinishingTime().asMillis()); From aa1ca28f9fcdb3d003524603d85bb57d214d221c Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Wed, 8 Aug 2018 22:02:29 +0200 Subject: [PATCH 04/12] editable and id competitors adjusted as well --- .../impl/CompetitorResultEditableImpl.java | 83 +++++++++++++++---- .../impl/CompetitorResultWithIdImpl.java | 14 ++-- 2 files changed, 73 insertions(+), 24 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultEditableImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultEditableImpl.java index 03e6f9674b0..d769ea33e87 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultEditableImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultEditableImpl.java @@ -10,20 +10,40 @@ public class CompetitorResultEditableImpl implements CompetitorResult { private static final long serialVersionUID = 3928498127285186791L; private Serializable mCompetitorId; - private String mCompetitorDisplayName; private int mOneBasedRank; private MaxPointsReason mMaxPointsReason; private Double mScore; private TimePoint mFinishingTime; private String mComment; private MergeState mMergeState; + private String mCompetitorName; + private String mCompetitorShortName; + private String mBoatName; + private String mBoatSailId; private boolean mDirty; private boolean mChecked; public CompetitorResultEditableImpl(CompetitorResult result) { mCompetitorId = result.getCompetitorId(); - mCompetitorDisplayName = result.getCompetitorDisplayName(); + mCompetitorName = result.getName(); + mCompetitorShortName = result.getShortName(); + mBoatName = result.getBoatName(); + mBoatSailId = result.getBoatSailId(); + mOneBasedRank = result.getOneBasedRank(); + mMaxPointsReason = result.getMaxPointsReason(); + mScore = result.getScore(); + mFinishingTime = result.getFinishingTime(); + mComment = result.getComment(); + mMergeState = result.getMergeState(); + } + + public void setValue(CompetitorResult result) { + mCompetitorId = result.getCompetitorId(); + mCompetitorName = result.getName(); + mCompetitorShortName = result.getShortName(); + mBoatName = result.getBoatName(); + mBoatSailId = result.getBoatSailId(); mOneBasedRank = result.getOneBasedRank(); mMaxPointsReason = result.getMaxPointsReason(); mScore = result.getScore(); @@ -42,12 +62,39 @@ public class CompetitorResultEditableImpl implements CompetitorResult { } @Override - public String getCompetitorDisplayName() { - return mCompetitorDisplayName; + public String getName() { + return mCompetitorName; } - public void setCompetitorDisplayName(String competitorDisplayName) { - mCompetitorDisplayName = competitorDisplayName; + public void setName(String name) { + mCompetitorName = name; + } + + @Override + public String getShortName() { + return mCompetitorShortName; + } + + public void setShortName(String shortName) { + mCompetitorShortName = shortName; + } + + @Override + public String getBoatName() { + return mBoatName; + } + + public void setBoatName(String name) { + mBoatName = name; + } + + @Override + public String getBoatSailId() { + return mBoatSailId; + } + + public void setBoatSailId(String id) { + mBoatSailId = id; } @Override @@ -119,15 +166,11 @@ public class CompetitorResultEditableImpl implements CompetitorResult { this.mMergeState = mergeState; } - public void setValue(CompetitorResult result) { - mCompetitorId = result.getCompetitorId(); - mCompetitorDisplayName = result.getCompetitorDisplayName(); - mOneBasedRank = result.getOneBasedRank(); - mMaxPointsReason = result.getMaxPointsReason(); - mScore = result.getScore(); - mFinishingTime = result.getFinishingTime(); - mComment = result.getComment(); - mMergeState = result.getMergeState(); + public String getCompetitorDisplayName() { + if (mCompetitorShortName != null) { + return mCompetitorShortName + " - " + mCompetitorName; + } + return mCompetitorName; } @Override @@ -143,7 +186,11 @@ public class CompetitorResultEditableImpl implements CompetitorResult { return false; if (mCompetitorId != null ? !mCompetitorId.equals(that.mCompetitorId) : that.mCompetitorId != null) return false; - if (mCompetitorDisplayName != null ? !mCompetitorDisplayName.equals(that.mCompetitorDisplayName) : that.mCompetitorDisplayName != null) + if (mCompetitorName != null ? !mCompetitorName.equals(that.mCompetitorName) : that.mCompetitorName != null) + return false; + if (mBoatName != null ? !mBoatName.equals(that.mBoatName) : that.mBoatName != null) + return false; + if (mBoatSailId != null ? !mBoatSailId.equals(that.mBoatSailId) : that.mBoatSailId != null) return false; if (mMaxPointsReason != that.mMaxPointsReason) return false; @@ -158,7 +205,9 @@ public class CompetitorResultEditableImpl implements CompetitorResult { @Override public int hashCode() { int result = mCompetitorId != null ? mCompetitorId.hashCode() : 0; - result = 31 * result + (mCompetitorDisplayName != null ? mCompetitorDisplayName.hashCode() : 0); + result = 31 * result + (mCompetitorName != null ? mCompetitorName.hashCode() : 0); + result = 31 * result + (mBoatName != null ? mBoatName.hashCode() : 0); + result = 31 * result + (mBoatSailId != null ? mBoatSailId.hashCode() : 0); result = 31 * result + mOneBasedRank; result = 31 * result + (mMaxPointsReason != null ? mMaxPointsReason.hashCode() : 0); result = 31 * result + (mScore != null ? mScore.hashCode() : 0); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultWithIdImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultWithIdImpl.java index a3f80a50d7f..f3005e9f219 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultWithIdImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultWithIdImpl.java @@ -15,15 +15,15 @@ public class CompetitorResultWithIdImpl extends CompetitorResultImpl { private Boat mBoat; public CompetitorResultWithIdImpl(long id, Boat boat, CompetitorResult result) { - this(id, boat, result.getCompetitorId(), result.getCompetitorDisplayName(), result.getOneBasedRank(), - result.getMaxPointsReason(), result.getScore(), result.getFinishingTime(), result.getComment(), - result.getMergeState()); + this(id, boat, result.getCompetitorId(), result.getName(), result.getShortName(), + result.getOneBasedRank(), result.getMaxPointsReason(), result.getScore(), result.getFinishingTime(), + result.getComment(), result.getMergeState()); } - public CompetitorResultWithIdImpl(long id, Boat boat, Serializable competitorId, String competitorDisplayName, - int oneBasedRank, MaxPointsReason maxPointsReason, Double score, - TimePoint finishingTime, String comment, MergeState mergeState) { - super(competitorId, competitorDisplayName, oneBasedRank, maxPointsReason, score, finishingTime, comment, mergeState); + public CompetitorResultWithIdImpl(long id, Boat boat, Serializable competitorId, String competitorName, + String shortName, int oneBasedRank, MaxPointsReason maxPointsReason, Double score, TimePoint finishingTime, + String comment, MergeState mergeState) { + super(competitorId, competitorName, shortName, boat.getName(), boat.getSailID(), oneBasedRank, maxPointsReason, score, finishingTime, comment, mergeState); mId = id; mBoat = boat; From d8ebd28736765c796e4e38a5b874d4d57c3fdcb4 Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Wed, 8 Aug 2018 22:03:49 +0200 Subject: [PATCH 05/12] competitorresult creation adjusted + convenience constructor --- .../race/impl/CompetitorResultImpl.java | 9 +- .../fragments/raceinfo/PenaltyFragment.java | 36 +++---- .../raceinfo/TrackingListFragment.java | 101 ++++++++---------- .../app/ui/layouts/CompetitorEditLayout.java | 5 +- 4 files changed, 72 insertions(+), 79 deletions(-) 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 4a3e799544e..174d962dcf4 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 @@ -26,11 +26,16 @@ public class CompetitorResultImpl implements CompetitorResult { private final String comment; private final MergeState mergeState; - + private final String boatName; private final String boatSailId; + public CompetitorResultImpl(CompetitorResult item) { + this(item.getCompetitorId(), item.getName(), item.getShortName(), item.getBoatName(), item.getBoatSailId(), + item.getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), item.getFinishingTime(), + item.getComment(), item.getMergeState()); + } public CompetitorResultImpl(Serializable competitorId, String competitorName, String competitorShortName, String boatName, String boatSailId, int oneBasedRank, MaxPointsReason maxPointsReason, Double score, @@ -73,7 +78,7 @@ public class CompetitorResultImpl implements CompetitorResult { public String getBoatSailId() { return boatSailId; } - + @Override public int getOneBasedRank() { return oneBasedRank; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PenaltyFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PenaltyFragment.java index 576fc017022..da41c1d003b 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PenaltyFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PenaltyFragment.java @@ -295,8 +295,7 @@ public class PenaltyFragment extends BaseFragment implements PopupMenu.OnMenuIte mDraftData.clear(); if (getRaceState().getFinishPositioningList() != null) { for (CompetitorResult item : getRaceState().getFinishPositioningList()) { - mDraftData.add(new CompetitorResultImpl(item.getCompetitorId(), item.getCompetitorDisplayName(), item.getOneBasedRank(), item - .getMaxPointsReason(), item.getScore(), item.getFinishingTime(), item.getComment(), item.getMergeState())); + mDraftData.add(new CompetitorResultImpl(item)); } } @@ -307,8 +306,7 @@ public class PenaltyFragment extends BaseFragment implements PopupMenu.OnMenuIte mConfirmedData.clear(); if (getRaceState().getConfirmedFinishPositioningList() != null) { for (CompetitorResult item : getRaceState().getConfirmedFinishPositioningList()) { - mConfirmedData.add(new CompetitorResultImpl(item.getCompetitorId(), item.getCompetitorDisplayName(), item.getOneBasedRank(), item - .getMaxPointsReason(), item.getScore(), item.getFinishingTime(), item.getComment(), item.getMergeState())); + mConfirmedData.add(new CompetitorResultImpl(item)); } } } @@ -419,14 +417,15 @@ public class PenaltyFragment extends BaseFragment implements PopupMenu.OnMenuIte private void onLoadCompetitorsSucceeded(Map data) { mCompetitorResults.clear(); - for (Competitor item : data.keySet()) { // add loaded competitors - String name = ""; - if (item.getShortInfo() != null) { - name += item.getShortInfo() + " - "; - } - name += item.getName(); - CompetitorResult result = new CompetitorResultImpl(item.getId(), name, 0, MaxPointsReason.NONE, - /* score */ null, /* finishingTime */ null, /* comment */ null, MergeState.OK); + + for (Map.Entry item : data.entrySet()) { + Competitor competitor = item.getKey(); + Boat boat = item.getValue(); + + CompetitorResult result = new CompetitorResultImpl(competitor.getId(), competitor.getName(), + competitor.getShortName(), boat.getName(), boat.getSailID(), 0, MaxPointsReason.NONE, + /* score */ null, /* finishingTime */ null, /* comment */ null, + MergeState.OK); mCompetitorResults.add(new CompetitorResultEditableImpl(result)); } if (getRaceState() != null && getRaceState().getFinishPositioningList() != null) { // mix with finish position list @@ -671,9 +670,7 @@ public class PenaltyFragment extends BaseFragment implements PopupMenu.OnMenuIte } } competitor.setMergeState(MergeState.OK); - CompetitorResultWithIdImpl item = new CompetitorResultWithIdImpl(0, getBoat(competitor.getCompetitorId()), competitor.getCompetitorId(), competitor - .getCompetitorDisplayName(), competitor.getOneBasedRank(), competitor.getMaxPointsReason(), competitor.getScore(), competitor - .getFinishingTime(), competitor.getComment(), competitor.getMergeState()); + CompetitorResultWithIdImpl item = new CompetitorResultWithIdImpl(0, getBoat(competitor.getCompetitorId()), competitor); AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.AppTheme_AlertDialog); builder.setTitle(item.getCompetitorDisplayName()); final CompetitorEditLayout layout = new CompetitorEditLayout(getActivity(), item, mCompetitorResults.getFirstRankZeroPosition() + @@ -743,15 +740,13 @@ public class PenaltyFragment extends BaseFragment implements PopupMenu.OnMenuIte boolean found = false; for (CompetitorResult published : results) { if (item.getCompetitorId().equals(published.getCompetitorId())) { - result.add(new CompetitorResultImpl(item.getCompetitorId(), item.getCompetitorDisplayName(), item.getOneBasedRank(), item - .getMaxPointsReason(), item.getScore(), item.getFinishingTime(), item.getComment(), item.getMergeState())); + result.add(new CompetitorResultImpl(item)); found = true; break; } } if (!found && item.isDirty()) { - result.add(new CompetitorResultImpl(item.getCompetitorId(), item.getCompetitorDisplayName(), item.getOneBasedRank(), item - .getMaxPointsReason(), item.getScore(), item.getFinishingTime(), item.getComment(), item.getMergeState())); + result.add(new CompetitorResultImpl(item)); } } @@ -763,8 +758,7 @@ public class PenaltyFragment extends BaseFragment implements PopupMenu.OnMenuIte } } if (!found) { - result.add(new CompetitorResultImpl(item.getCompetitorId(), item.getCompetitorDisplayName(), item.getOneBasedRank(), item - .getMaxPointsReason(), item.getScore(), item.getFinishingTime(), item.getComment(), item.getMergeState())); + result.add(new CompetitorResultImpl(item)); } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java index 574b191e5c2..19e62b59771 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java @@ -315,8 +315,7 @@ public class TrackingListFragment extends BaseFragment mConfirmedData.clear(); if (getRaceState().getConfirmedFinishPositioningList() != null) { for (CompetitorResult item : getRaceState().getConfirmedFinishPositioningList()) { - mConfirmedData.add(new CompetitorResultImpl(item.getCompetitorId(), item.getCompetitorDisplayName(), item.getOneBasedRank(), item - .getMaxPointsReason(), item.getScore(), item.getFinishingTime(), item.getComment(), item.getMergeState())); + mConfirmedData.add(new CompetitorResultImpl(item)); } } } @@ -603,11 +602,7 @@ public class TrackingListFragment extends BaseFragment } private void moveCompetitorToFinishList(Competitor competitor) { - String name = ""; - if (competitor.getShortInfo() != null) { - name += competitor.getShortInfo() + " - "; - } - name += competitor.getName(); + int pos = mAdapter.getFirstRankZeroPosition(); // FIXME mFinishedData.size()+1 also counts penalized competitors before which the competitor is to be inserted! I just wonder how the position shown in the app seems correct... int greatestOneBasedRankSoFar = 0; @@ -616,14 +611,15 @@ public class TrackingListFragment extends BaseFragment greatestOneBasedRankSoFar = result.getOneBasedRank(); } } - mFinishedData.add(pos, new CompetitorResultWithIdImpl(mId, getBoat(competitor.getId()), competitor.getId(), name, - greatestOneBasedRankSoFar + 1, MaxPointsReason.NONE, - /* score */ null, /* finishingTime */ null, /* comment */ null, MergeState.OK)); + CompetitorResultWithIdImpl theCompetitor = new CompetitorResultWithIdImpl(mId, getBoat(competitor.getId()), competitor.getId(), + competitor.getName(), competitor.getShortName(), greatestOneBasedRankSoFar + 1, MaxPointsReason.NONE, + /* score */ null, /* finishingTime */ null, /* comment */ null, MergeState.OK); + mFinishedData.add(pos, theCompetitor); mId++; setPublishButton(); mFinishedAdapter.notifyItemInserted(pos); if (mDots.size() > 0) { - Toast.makeText(getActivity(), getString(R.string.added_to_result_list, name, pos + 1), Toast.LENGTH_SHORT).show(); + Toast.makeText(getActivity(), getString(R.string.added_to_result_list, theCompetitor.getCompetitorDisplayName(), pos + 1), Toast.LENGTH_SHORT).show(); } } @@ -709,7 +705,7 @@ public class TrackingListFragment extends BaseFragment final int newOneBasedRank) { return new CompetitorResultWithIdImpl(competitorToReplaceWithAdjustedPosition.getId(), getBoat(competitorToReplaceWithAdjustedPosition .getCompetitorId()), competitorToReplaceWithAdjustedPosition.getCompetitorId(), competitorToReplaceWithAdjustedPosition - .getCompetitorDisplayName(), newOneBasedRank, competitorToReplaceWithAdjustedPosition + .getName(), competitorToReplaceWithAdjustedPosition.getShortName(), newOneBasedRank, competitorToReplaceWithAdjustedPosition .getMaxPointsReason(), competitorToReplaceWithAdjustedPosition.getScore(), competitorToReplaceWithAdjustedPosition .getFinishingTime(), competitorToReplaceWithAdjustedPosition.getComment(), MergeState.OK); } @@ -761,9 +757,10 @@ public class TrackingListFragment extends BaseFragment builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { - CompetitorResultWithIdImpl newItem = new CompetitorResultWithIdImpl(item.getId(), getBoat(item.getCompetitorId()), item - .getCompetitorId(), item.getCompetitorDisplayName(), item.getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), item - .getFinishingTime(), item.getComment(), MergeState.OK); + CompetitorResultWithIdImpl newItem = new CompetitorResultWithIdImpl(item.getId(), + getBoat(item.getCompetitorId()), item.getCompetitorId(), item.getName(), item.getShortName(), + item.getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), item.getFinishingTime(), + item.getComment(), MergeState.OK); updateItem(item, newItem); } }); @@ -823,9 +820,7 @@ public class TrackingListFragment extends BaseFragment protected void setMaxPointsReasonForItem(CompetitorResultWithIdImpl item, CharSequence maxPointsReasonName) { MaxPointsReason maxPointsReason = MaxPointsReason.valueOf(maxPointsReasonName.toString()); - CompetitorResultWithIdImpl newItem = new CompetitorResultWithIdImpl(item.getId(), getBoat(item.getCompetitorId()), item - .getCompetitorId(), item.getCompetitorDisplayName(), item.getOneBasedRank(), maxPointsReason, item.getScore(), item - .getFinishingTime(), item.getComment(), item.getMergeState()); + CompetitorResultWithIdImpl newItem = new CompetitorResultWithIdImpl(item.getId(), getBoat(item.getCompetitorId()), item); updateItem(item, newItem); getRaceState().setFinishPositioningListChanged(MillisecondsTimePoint.now(), getCompetitorResults()); } @@ -833,8 +828,7 @@ public class TrackingListFragment extends BaseFragment private CompetitorResults getCompetitorResults() { CompetitorResults result = new CompetitorResultsImpl(); for (CompetitorResultWithIdImpl item : mFinishedData) { - result.add(new CompetitorResultImpl(item.getCompetitorId(), item.getCompetitorDisplayName(), item.getOneBasedRank(), item - .getMaxPointsReason(), item.getScore(), item.getFinishingTime(), item.getComment(), item.getMergeState())); + result.add(new CompetitorResultImpl(item)); } return result; } @@ -847,9 +841,7 @@ public class TrackingListFragment extends BaseFragment boolean found = false; for (CompetitorResult newItem : mFinishedData) { if (oldItem.getCompetitorId().equals(newItem.getCompetitorId())) { - CompetitorResult temp = new CompetitorResultImpl(newItem.getCompetitorId(), newItem.getCompetitorDisplayName(), newItem - .getOneBasedRank(), newItem.getMaxPointsReason(), newItem.getScore(), newItem.getFinishingTime(), newItem - .getComment(), newItem.getMergeState()); + CompetitorResult temp = new CompetitorResultImpl(newItem); if (!oldItem.equals(temp)) { result.add(temp); } @@ -858,8 +850,7 @@ public class TrackingListFragment extends BaseFragment } } if (!found) { - result.add(new CompetitorResultImpl(oldItem.getCompetitorId(), oldItem.getCompetitorDisplayName(), 0, oldItem - .getMaxPointsReason(), oldItem.getScore(), oldItem.getFinishingTime(), oldItem.getComment(), oldItem.getMergeState())); + result.add(new CompetitorResultImpl(oldItem)); } } @@ -873,8 +864,7 @@ public class TrackingListFragment extends BaseFragment } } if (!found) { - result.add(new CompetitorResultImpl(newItem.getCompetitorId(), newItem.getCompetitorDisplayName(), newItem.getOneBasedRank(), newItem - .getMaxPointsReason(), newItem.getScore(), newItem.getFinishingTime(), newItem.getComment(), newItem.getMergeState())); + result.add(new CompetitorResultImpl(newItem)); } } @@ -998,9 +988,9 @@ public class TrackingListFragment extends BaseFragment } else { state = MergeState.ERROR; } - newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item - .getCompetitorDisplayName(), result.getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), item - .getFinishingTime(), item.getComment(), getMergeState(item, state)); + newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getName(), + item.getShortName(), result.getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), + item.getFinishingTime(), item.getComment(), getMergeState(item, state)); item = updateChangedItem(changedCompetitor, item, newItem); } @@ -1015,9 +1005,9 @@ public class TrackingListFragment extends BaseFragment } else { state = MergeState.ERROR; } - newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item - .getCompetitorDisplayName(), item.getOneBasedRank(), result.getMaxPointsReason(), item.getScore(), item - .getFinishingTime(), item.getComment(), getMergeState(item, state)); + newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getName(), + item.getShortName(), item.getOneBasedRank(), result.getMaxPointsReason(), item.getScore(), + item.getFinishingTime(), item.getComment(), getMergeState(item, state)); item = updateChangedItem(changedCompetitor, item, newItem); } @@ -1033,15 +1023,16 @@ public class TrackingListFragment extends BaseFragment } else { state = MergeState.ERROR; } - newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item - .getCompetitorDisplayName(), item.getOneBasedRank(), item.getMaxPointsReason(), result.getScore(), item - .getFinishingTime(), item.getComment(), getMergeState(item, state)); + newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), + item.getName(), item.getShortName(), item.getOneBasedRank(), item.getMaxPointsReason(), + result.getScore(), item.getFinishingTime(), item.getComment(), + getMergeState(item, state)); item = updateChangedItem(changedCompetitor, item, newItem); } } else if (result.getScore() != null) { - newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item - .getCompetitorDisplayName(), item.getOneBasedRank(), item.getMaxPointsReason(), result.getScore(), item - .getFinishingTime(), item.getComment(), getMergeState(item, MergeState.ERROR)); + newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getName(), + item.getShortName(), item.getOneBasedRank(), item.getMaxPointsReason(), result.getScore(), + item.getFinishingTime(), item.getComment(), getMergeState(item, MergeState.ERROR)); item = updateChangedItem(changedCompetitor, item, newItem); } @@ -1057,15 +1048,16 @@ public class TrackingListFragment extends BaseFragment } else { state = MergeState.ERROR; } - newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getCompetitorDisplayName(), item - .getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), result.getFinishingTime(), item - .getComment(), getMergeState(item, state)); + newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), + item.getName(), item.getShortName(), item.getOneBasedRank(), item.getMaxPointsReason(), + item.getScore(), result.getFinishingTime(), item.getComment(), + getMergeState(item, state)); item = updateChangedItem(changedCompetitor, item, newItem); } } else if (result.getFinishingTime() != null) { - newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getCompetitorDisplayName(), item - .getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), result.getFinishingTime(), item - .getComment(), getMergeState(item, MergeState.ERROR)); + newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getName(), + item.getShortName(), item.getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), + result.getFinishingTime(), item.getComment(), getMergeState(item, MergeState.ERROR)); item = updateChangedItem(changedCompetitor, item, newItem); } @@ -1081,23 +1073,24 @@ public class TrackingListFragment extends BaseFragment } else { state = MergeState.ERROR; } - newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getCompetitorDisplayName(), item - .getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), item.getFinishingTime(), - item.getComment() + " ## " + result.getComment(), getMergeState(item, state)); + newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), + item.getName(), item.getShortName(), item.getOneBasedRank(), item.getMaxPointsReason(), + item.getScore(), item.getFinishingTime(), + item.getComment() + " ## " + result.getComment(), getMergeState(item, state)); item = updateChangedItem(changedCompetitor, item, newItem); } } else if (result.getComment() != null) { - newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getCompetitorDisplayName(), item - .getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), item.getFinishingTime(), result - .getComment(), getMergeState(item, MergeState.ERROR)); + newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getName(), + item.getShortName(), item.getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), + item.getFinishingTime(), result.getComment(), getMergeState(item, MergeState.ERROR)); item = updateChangedItem(changedCompetitor, item, newItem); } // check merge state if (!item.getMergeState().equals(result.getMergeState())) { - newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getCompetitorDisplayName(), item - .getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), item.getFinishingTime(), item - .getComment(), getMergeState(item, result.getMergeState())); + newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(), item.getName(), + item.getShortName(), item.getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), + item.getFinishingTime(), item.getComment(), getMergeState(item, result.getMergeState())); item = updateChangedItem(changedCompetitor, item, newItem); } } else { // unknown result, so it will be added diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/layouts/CompetitorEditLayout.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/layouts/CompetitorEditLayout.java index ddb4a83ee84..43747f97db6 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/layouts/CompetitorEditLayout.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/layouts/CompetitorEditLayout.java @@ -219,8 +219,9 @@ public class CompetitorEditLayout extends ScrollView implements DatePickerDialog if (mComment != null) { comment = mComment.getText().toString(); } - CompetitorResult result = new CompetitorResultImpl(mCompetitor.getCompetitorId(), mCompetitor - .getCompetitorDisplayName(), oneBaseRank, maxPointsReason, score, finishingTime, comment, MergeState.OK); + CompetitorResult result = new CompetitorResultImpl(mCompetitor.getCompetitorId(), mCompetitor.getName(), + mCompetitor.getShortName(), mCompetitor.getBoatName(), mCompetitor.getBoatSailId(), oneBaseRank, + maxPointsReason, score, finishingTime, comment, MergeState.OK); return new CompetitorResultWithIdImpl(mCompetitor.getId(), mCompetitor.getBoat(), result); } From bd6fc8f0e2d2698df92b6d64ede4439f788eb548 Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Wed, 8 Aug 2018 22:04:15 +0200 Subject: [PATCH 06/12] tests adjusted --- ...firmedFinishPositioningListFinderTest.java | 20 ++++++++-------- ...teFromRaceLogFinishPositioingListTest.java | 4 ++-- ...ingAndRetrievingRaceLogInLeaderboards.java | 24 ++++++++++++++----- ...tStoringAndRetrievingRaceLogInRegatta.java | 14 +++++++++-- 4 files changed, 42 insertions(+), 20 deletions(-) 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 b818708212f..c06c40decb3 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 @@ -57,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, MergeState.OK); - final CompetitorResultImpl oldResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.NONE, 2.0, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl oldResultC1 = new CompetitorResultImpl("Comp1", "Comp 1", "Comp 1 Short", "Comp 1 Boat", "Comp 1 Boat Id", 1, MaxPointsReason.NONE, 1.0, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl oldResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", "Comp 2 Short", "Comp 2 Boat", "Comp 2 Boat Id", 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, MergeState.OK); + final CompetitorResultImpl newResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", "Comp 3 Short", "Comp 3 Boat", "Comp 3 Boat Id", 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); @@ -75,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, MergeState.OK); - final CompetitorResultImpl e1ResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", 2, MaxPointsReason.NONE, 2.0, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl e1ResultC1 = new CompetitorResultImpl("Comp1", "Comp 1", "Comp 1 Short", "Comp 1 Boat", "Comp 1 Boat Id", 1, MaxPointsReason.DNC, 6.0, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl e1ResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", "Comp 2 Short", "Comp 2 Boat", "Comp 2 Boat Id", 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, MergeState.OK); + final CompetitorResultImpl e2ResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", "Comp 2 Short", "Comp 2 Boat", "Comp 2 Boat Id", 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, MergeState.OK); - final CompetitorResultImpl e3ResultC3 = new CompetitorResultImpl("Comp3", "Comp 3", 2, MaxPointsReason.DNF, 3.0, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl e3ResultC2 = new CompetitorResultImpl("Comp2", "Comp 2", "Comp 2 Short", "Comp 2 Boat", "Comp 2 Boat Id", 2, MaxPointsReason.DSQ, 6.0, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl e3ResultC3 = new CompetitorResultImpl("Comp3", "Comp 3", "Comp 3 Short", "Comp 3 Boat", "Comp 3 Boat Id", 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, MergeState.OK); - final CompetitorResultImpl e4ResultC4 = new CompetitorResultImpl("Comp4", "Comp 4", 2, MaxPointsReason.DNF, 3.0, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl e4ResultC1 = new CompetitorResultImpl("Comp1", "Comp 1", "Comp 1 Short", "Comp 1 Boat", "Comp 1 Boat Id", 1, /* maxPointsReason */ null, /* score */ null, /* finishing time */ null, /* comment */ null, MergeState.OK); + final CompetitorResultImpl e4ResultC4 = new CompetitorResultImpl("Comp4", "Comp 4", "Comp 4 Short", "Comp 4 Boat", "Comp 4 Boat Id", 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.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 44ed836b1e9..2f1d3391dfb 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 @@ -153,8 +153,8 @@ public class MarkPassingUpdateFromRaceLogFinishPositioingListTest extends Abstra final CompetitorResults results = new CompetitorResultsImpl(); 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, MergeState.OK)); + results.add(new CompetitorResultImpl(finishingTime.getA().getId(), finishingTime.getA().getName(), finishingTime.getA().getShortName(), + "BoatName", "BoatSailId", rank++, /* maxPointsReason */ null, /* score */null, finishingTime.getB(), /* comment */null, MergeState.OK)); } return results; } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index 192545561a3..bf2d19b0d49 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -56,11 +56,14 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartProcedureChanged import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogWindFixEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.SimpleRaceLogIdentifierImpl; +import com.sap.sailing.domain.base.Boat; +import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; 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.impl.BoatClassImpl; import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.Wind; @@ -308,9 +311,12 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", "SAP", Color.RED, "someone@nowhere.de", null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null, null); + Boat storedBoat = DomainFactory.INSTANCE.getOrCreateBoat(UUID.randomUUID(), "SAP Extreme Sailing Team", + new BoatClassImpl("X40", false), "123", Color.RED); CompetitorResults storedPositioningList = new CompetitorResultsImpl(); - storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), /* rank */ - 1, MaxPointsReason.NONE, /* score */ null, /* finishingTimePoint */null, /* comment */null, MergeState.OK)); + storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), storedCompetitor.getShortName(), + storedBoat.getName(), storedBoat.getSailID(), /* rank */ 1, MaxPointsReason.NONE, /* score */ null, /* finishingTimePoint */null, + /* comment */null, MergeState.OK)); RaceLogFinishPositioningConfirmedEvent event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, storedPositioningList); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); RaceLog loadedRaceLog = retrieveRaceLog(); @@ -332,11 +338,14 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", "SAP", Color.RED, "someone@nowhere.de", null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null, null); + Boat storedBoat = DomainFactory.INSTANCE.getOrCreateBoat(UUID.randomUUID(), "SAP Extreme Sailing Team", + new BoatClassImpl("X40", false), "123", Color.RED); CompetitorResults storedPositioningList = new CompetitorResultsImpl(); final TimePoint finishingTimePoint = MillisecondsTimePoint.now(); final String comment = "This is a comment"; - storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), /* rank */ - 1, MaxPointsReason.NONE, /* score */ 12.3, finishingTimePoint, comment, MergeState.OK)); + storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), storedCompetitor.getShortName(), + storedBoat.getName(), storedBoat.getSailID(), /* rank */ 1, MaxPointsReason.NONE, /* score */ 12.3, finishingTimePoint, comment, + MergeState.OK)); RaceLogFinishPositioningConfirmedEvent event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, storedPositioningList); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); RaceLog loadedRaceLog = retrieveRaceLog(); @@ -402,9 +411,12 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFinishPositioningListChangeEvent() { Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", "SAP", Color.RED, "someone@nowhere.de", null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null, null); + Boat storedBoat = DomainFactory.INSTANCE.getOrCreateBoat(UUID.randomUUID(), "SAP Extreme Sailing Team", + new BoatClassImpl("X40", false), "123", Color.RED); CompetitorResults storedPositioningList = new CompetitorResultsImpl(); - storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), /* rank */ - 1, MaxPointsReason.NONE, /* score */ null, /* finishingTimePoint */null, /* comment */null, MergeState.OK)); + storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), storedCompetitor.getShortName(), + storedBoat.getName(), storedBoat.getSailID(), /* rank */ 1, MaxPointsReason.NONE, /* score */ null, /* finishingTimePoint */null, + /* comment */null, MergeState.OK)); RaceLogFinishPositioningListChangedEvent event = new RaceLogFinishPositioningListChangedEventImpl(now, author, 0, storedPositioningList); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java index b9c1cd421de..ccdf1bb0299 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java @@ -44,6 +44,7 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogRaceStatusEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartProcedureChangedEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogWindFixEventImpl; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.DomainFactory; @@ -51,6 +52,7 @@ import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; +import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.MaxPointsReason; @@ -208,8 +210,12 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin public void testStoreAndRetrieveRegattaWithRaceLogFinishPositioningListChangeEvent() { Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", "SAP", Color.RED, "someone@nowhere.de", null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null, null); + Boat storedBoat = DomainFactory.INSTANCE.getOrCreateBoat(UUID.randomUUID(), "SAP Extreme Sailing Team", + new BoatClassImpl("X40", false), "123", Color.RED); CompetitorResults storedPositioningList = new CompetitorResultsImpl(); - storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), /* rank */ 1, MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, /* comment */ null, MergeState.OK)); + storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), storedCompetitor.getShortName(), + storedBoat.getName(), storedBoat.getSailID(), /* rank */ 1, MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, + /* comment */ null, MergeState.OK)); RaceLogFinishPositioningListChangedEvent event = new RaceLogFinishPositioningListChangedEventImpl(now, author, 0, storedPositioningList); addAndStoreRaceLogEvent(regatta, raceColumnName, event); RaceLog loadedRaceLog = retrieveRaceLog(); @@ -232,8 +238,12 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin public void testStoreAndRetrieveRegattaWithRaceLogFinishPositioningConfirmedEvent() { Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", "SAP", Color.RED, "someone@nowhere.de", null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null, null); + Boat storedBoat = DomainFactory.INSTANCE.getOrCreateBoat(UUID.randomUUID(), "SAP Extreme Sailing Team", + new BoatClassImpl("X40", false), "123", Color.RED); CompetitorResults storedPositioningList = new CompetitorResultsImpl(); - storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), /* rank */ 1, MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, /* comment */ null, MergeState.OK)); + storedPositioningList.add(new CompetitorResultImpl(storedCompetitor.getId(), storedCompetitor.getName(), storedCompetitor.getShortName(), + storedBoat.getName(), storedBoat.getSailID(), /* rank */ 1, MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, + /* comment */ null, MergeState.OK)); RaceLogFinishPositioningConfirmedEvent event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, storedPositioningList); addAndStoreRaceLogEvent(regatta, raceColumnName, event); RaceLog loadedRaceLog = retrieveRaceLog(); From d1a061533a45265c64314c997a4027872c8c5580 Mon Sep 17 00:00:00 2001 From: Manuel Zedel Date: Mon, 13 Aug 2018 10:03:56 +0200 Subject: [PATCH 07/12] more test fixes --- ...StoringAndRetrievingRaceLogInLeaderboards.java | 1 - ...shPositioningConfirmedEventSerializerTest.java | 10 ++++++++-- .../server/test/ApplyScoresFromRaceLogTest.java | 15 ++++++++++++--- .../sailing/server/test/MasterDataImportTest.java | 10 ++++++++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index bf2d19b0d49..aeacb2f2c2a 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -57,7 +57,6 @@ import com.sap.sailing.domain.abstractlog.race.impl.RaceLogStartTimeEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogWindFixEventImpl; import com.sap.sailing.domain.abstractlog.race.impl.SimpleRaceLogIdentifierImpl; import com.sap.sailing.domain.base.Boat; -import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.DomainFactory; diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java index 05d53fda162..d3607f336c2 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogFinishPositioningConfirmedEventSerializerTest.java @@ -21,8 +21,10 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmed import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultImpl; import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogFinishPositioningConfirmedEventImpl; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.SharedDomainFactory; +import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.impl.CompetitorJsonDeserializer; @@ -34,6 +36,7 @@ import com.sap.sailing.server.gateway.serialization.impl.NationalityJsonSerializ import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer; import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogFinishPositioningConfirmedEventSerializer; +import com.sap.sse.common.Color; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -68,8 +71,11 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest { @Test public void testSerializeAndDeserializeRaceLogFinishPositioningConfirmedEvent() throws JsonDeserializationException { - positioningList.add(new CompetitorResultImpl(UUID.randomUUID(), "SAP Extreme", /* rank */ 1, - MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, /* comment */ null, MergeState.OK)); + Boat storedBoat = DomainFactory.INSTANCE.getOrCreateBoat(UUID.randomUUID(), "SAP Extreme Sailing Team", + new BoatClassImpl("X40", false), "123", Color.RED); + positioningList.add(new CompetitorResultImpl(UUID.randomUUID(), "SAP Extreme", "SAP Ext", storedBoat.getName(), + storedBoat.getSailID(), /* rank */ 1, MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, + /* comment */ null, MergeState.OK)); event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, positioningList); JSONObject jsonConfirmationEvent = serializer.serialize(event); RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer.deserialize(jsonConfirmationEvent); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/ApplyScoresFromRaceLogTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/ApplyScoresFromRaceLogTest.java index aa097b482ff..443930af151 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/ApplyScoresFromRaceLogTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/ApplyScoresFromRaceLogTest.java @@ -23,11 +23,13 @@ import com.sap.sailing.domain.abstractlog.race.impl.CompetitorResultsImpl; import com.sap.sailing.domain.abstractlog.race.state.RaceState; import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateImpl; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedureFactoryImpl; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.configuration.impl.EmptyRegattaConfiguration; +import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.TeamImpl; @@ -94,13 +96,16 @@ public class ApplyScoresFromRaceLogTest extends LeaderboardScoringAndRankingTest final Map mprs = new HashMap<>(); int oneBasedRank = 1; final CompetitorResults results = new CompetitorResultsImpl(); + Boat storedBoat = DomainFactory.INSTANCE.getOrCreateBoat(UUID.randomUUID(), "SAP Extreme Sailing Team", + new BoatClassImpl("X40", false), "123", Color.RED); for (final Competitor c : competitors) { final MaxPointsReason mpr = new MaxPointsReason[] { null, MaxPointsReason.NONE, MaxPointsReason.DNF, MaxPointsReason.OCS }[oneBasedRank%4]; final Double score = oneBasedRank%5 == 0 ? null : 20*Math.random(); scores.put(c, score); mprs.put(c, mpr); - results.add(new CompetitorResultImpl(c.getId(), c.getName(), - oneBasedRank++, mpr, score, /* finishingTime */ null, /* comment */ null, MergeState.OK)); + results.add(new CompetitorResultImpl(c.getId(), c.getName(), c.getShortName(), storedBoat.getName(), + storedBoat.getSailID(), oneBasedRank++, mpr, score, /* finishingTime */ null, /* comment */ null, + MergeState.OK)); } final RaceLog f1RaceLog = f1Column.getRaceLog(f1Column.getFleets().iterator().next()); final LogEventAuthorImpl author = new LogEventAuthorImpl("Axel", 0); @@ -229,6 +234,10 @@ public class ApplyScoresFromRaceLogTest extends LeaderboardScoringAndRankingTest private void setResultForCompetitor(final Competitor competitor, int oneBasedRank, final CompetitorResults results, MaxPointsReason maxPointsReason, Double explicitScore) { - results.add(new CompetitorResultImpl(competitor.getId(), competitor.getName(), oneBasedRank, maxPointsReason, explicitScore, /* finishingTime */ null, /* comment */ null, MergeState.OK)); + Boat storedBoat = DomainFactory.INSTANCE.getOrCreateBoat(UUID.randomUUID(), "SAP Extreme Sailing Team", + new BoatClassImpl("X40", false), "123", Color.RED); + results.add(new CompetitorResultImpl(competitor.getId(), competitor.getName(), + competitor.getShortName(), storedBoat.getName(), storedBoat.getSailID(), oneBasedRank, + maxPointsReason, explicitScore, /* finishingTime */ null, /* comment */ null, MergeState.OK)); } } diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index 1c79016d831..d46a3ae9f36 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -927,10 +927,16 @@ public class MasterDataImportTest { // Add a competitor-related race log event to ensure that no competitor resolution is attempted while receiving TimePoint logTimePoint2 = logTimePoint.plus(10); CompetitorResults positionedCompetitors = new CompetitorResultsImpl(); + Boat storedBoat = DomainFactory.INSTANCE.getOrCreateBoat(UUID.randomUUID(), "SAP Extreme Sailing Team", + new BoatClassImpl("X40", false), "123", Color.RED); positionedCompetitors.add(new CompetitorResultImpl( - competitor.getId(), competitor.getName(), /* rank */ 1, MaxPointsReason.DNS, /* score */ null, /* finishingTime */ null, /* comment */ null, MergeState.OK)); + competitor.getId(), competitor.getName(), competitor.getShortName(), storedBoat.getName(), + storedBoat.getSailID(), /* rank */ 1, MaxPointsReason.DNS, /* score */ null, /* finishingTime */ null, + /* comment */ null, MergeState.OK)); positionedCompetitors.add(new CompetitorResultImpl( - competitor2.getId(), competitor2.getName(), /* rank */ 2, MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, /* comment */ null, MergeState.OK)); + competitor2.getId(), competitor2.getName(), competitor.getShortName(), storedBoat.getName(), + storedBoat.getSailID(), /* rank */ 2, MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, + /* comment */ null, MergeState.OK)); RaceLogFinishPositioningConfirmedEvent finishPositioningConfirmedEvent = new RaceLogFinishPositioningConfirmedEventImpl( logTimePoint2, author, 1, positionedCompetitors); raceColumn.getRaceLog(testFleet1).add(finishPositioningConfirmedEvent); From 8221e94e75521651ea6d94a52fcf16e6c300c293 Mon Sep 17 00:00:00 2001 From: Robert Benedikt Date: Fri, 12 Apr 2019 12:18:57 +0200 Subject: [PATCH 08/12] Consider nullability for boat in competitor --- .../app/domain/impl/CompetitorResultWithIdImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultWithIdImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultWithIdImpl.java index 74c05bac24d..a5d7beea4e1 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultWithIdImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultWithIdImpl.java @@ -23,7 +23,9 @@ public class CompetitorResultWithIdImpl extends CompetitorResultImpl { public CompetitorResultWithIdImpl(long id, Boat boat, Serializable competitorId, String competitorName, String shortName, int oneBasedRank, MaxPointsReason maxPointsReason, Double score, TimePoint finishingTime, String comment, MergeState mergeState) { - super(competitorId, competitorName, shortName, boat.getName(), boat.getSailID(), oneBasedRank, maxPointsReason, score, finishingTime, comment, mergeState); + super(competitorId, competitorName, shortName, + boat == null ? null : boat.getName(), boat == null ? null : boat.getSailID(), + oneBasedRank, maxPointsReason, score, finishingTime, comment, mergeState); mId = id; mBoat = boat; From ebc4c1ead6937ba3f5c199ab543ad5e3642ead59 Mon Sep 17 00:00:00 2001 From: Robert Benedikt Date: Fri, 12 Apr 2019 16:11:05 +0200 Subject: [PATCH 09/12] Add workaround to reset rank if competitor is removed from finish list --- .../domain/abstractlog/race/impl/CompetitorResultImpl.java | 6 ++++++ .../app/ui/fragments/raceinfo/TrackingListFragment.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) 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 174d962dcf4..061c6a100b0 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 @@ -37,6 +37,12 @@ public class CompetitorResultImpl implements CompetitorResult { item.getComment(), item.getMergeState()); } + public CompetitorResultImpl(CompetitorResult item, int oneBasedRank) { + this(item.getCompetitorId(), item.getName(), item.getShortName(), item.getBoatName(), item.getBoatSailId(), + oneBasedRank, item.getMaxPointsReason(), item.getScore(), item.getFinishingTime(), + item.getComment(), item.getMergeState()); + } + public CompetitorResultImpl(Serializable competitorId, String competitorName, String competitorShortName, String boatName, String boatSailId, int oneBasedRank, MaxPointsReason maxPointsReason, Double score, TimePoint finishingTime, String comment, MergeState mergeState) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java index c5f539f12e9..ce34b96b448 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java @@ -840,7 +840,7 @@ public class TrackingListFragment extends BaseFragment } } if (!found) { - result.add(new CompetitorResultImpl(oldItem)); + result.add(new CompetitorResultImpl(oldItem, 0)); } } From 28d111b1d8c9a16a9812bf9fffbf895367ced861 Mon Sep 17 00:00:00 2001 From: Robert Benedikt Date: Fri, 12 Apr 2019 17:20:26 +0200 Subject: [PATCH 10/12] Print competitor short name and enable sorting --- .../race/impl/CompetitorResultImpl.java | 7 - .../res/menu/sort_menu.xml | 3 + .../res/values-de/strings.xml | 1 + .../res/values/strings.xml | 1 + .../impl/CompetitorResultEditableImpl.java | 7 - .../ui/adapters/CompetitorAndBoatAdapter.java | 25 ++- .../app/ui/adapters/FinishListAdapter.java | 3 +- .../app/ui/adapters/PenaltyAdapter.java | 70 ++++---- .../CompetitorSailIdComparator.java | 45 +++-- .../CompetitorShortNameComparator.java | 44 +++++ .../fragments/raceinfo/PenaltyFragment.java | 163 +++++++++--------- .../raceinfo/TrackingListFragment.java | 21 ++- .../app/ui/utils/CompetitorUtils.java | 56 ++++++ 13 files changed, 272 insertions(+), 174 deletions(-) create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/comparators/CompetitorShortNameComparator.java create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/utils/CompetitorUtils.java 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 061c6a100b0..80c87e9e097 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 @@ -115,13 +115,6 @@ public class CompetitorResultImpl implements CompetitorResult { return mergeState == null ? MergeState.OK : mergeState; // default in case of having de-serialized an old version } - public String getCompetitorDisplayName() { - if (competitorShortName != null) { - return competitorShortName + " - " + competitorName; - } - return competitorName; - } - @Override public int hashCode() { final int prime = 31; diff --git a/mobile/com.sap.sailing.racecommittee.app/res/menu/sort_menu.xml b/mobile/com.sap.sailing.racecommittee.app/res/menu/sort_menu.xml index 243c09a43da..f76a950248c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/menu/sort_menu.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/menu/sort_menu.xml @@ -1,6 +1,9 @@ + diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml index 0bb0d1926ab..5606dc94af4 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml @@ -518,6 +518,7 @@ Nicht öffentliche Events Teilnehmerliste nach Segelnummer + nach Kurzname nach Namen nach Abstand zur Startlinie nach getracktem Zieldurchgang diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml index 676b5209d14..415847248a3 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml @@ -547,6 +547,7 @@ Results by Sail Number + by Short Name by Competitor Name by Position to Start Line by Tracked Position diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultEditableImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultEditableImpl.java index 186537b2c4d..9cc8ad39097 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultEditableImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/CompetitorResultEditableImpl.java @@ -166,13 +166,6 @@ public class CompetitorResultEditableImpl implements CompetitorResult { this.mMergeState = mergeState; } - public String getCompetitorDisplayName() { - if (mCompetitorShortName != null) { - return mCompetitorShortName + " - " + mCompetitorName; - } - return mCompetitorName; - } - @Override public boolean equals(Object o) { if (this == o) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/CompetitorAndBoatAdapter.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/CompetitorAndBoatAdapter.java index 6d5e3c7d9ab..a53398b7277 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/CompetitorAndBoatAdapter.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/CompetitorAndBoatAdapter.java @@ -1,14 +1,5 @@ package com.sap.sailing.racecommittee.app.ui.adapters; -import java.util.List; -import java.util.Map; - -import com.sap.sailing.android.shared.logging.ExLog; -import com.sap.sailing.android.shared.util.ViewHelper; -import com.sap.sailing.domain.base.Boat; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.racecommittee.app.R; - import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -16,6 +7,16 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import com.sap.sailing.android.shared.logging.ExLog; +import com.sap.sailing.android.shared.util.ViewHelper; +import com.sap.sailing.domain.base.Boat; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.racecommittee.app.R; +import com.sap.sailing.racecommittee.app.ui.utils.CompetitorUtils; + +import java.util.List; +import java.util.Map; + public class CompetitorAndBoatAdapter extends RecyclerView.Adapter { private static final String TAG = CompetitorAndBoatAdapter.class.getName(); @@ -49,11 +50,7 @@ public class CompetitorAndBoatAdapter extends RecyclerView.Adapter { - private static final int SAILING_NUMBER_POSITION = 0; - private static final int COMPETITOR_NAME_POSITION = 1; + private static final int COMPETITOR_SHORT_NAME_POSITION = 0; + private static final int SAILING_NUMBER_POSITION = 1; + private static final int COMPETITOR_NAME_POSITION = 2; private final Context mContext; private final ItemListener mListener; @@ -71,7 +74,7 @@ public class PenaltyAdapter extends RecyclerView.Adapter comparator = null; switch (mOrderBy) { - case SAILING_NUMBER: - comparator = new DisplayNameComparator(SAILING_NUMBER_POSITION); - break; - - case COMPETITOR_NAME: - comparator = new DisplayNameComparator(COMPETITOR_NAME_POSITION); - break; - - default: - break; + case COMPETITOR_SHORT_NAME: + comparator = new DisplayNameComparator(COMPETITOR_SHORT_NAME_POSITION); + break; + case SAILING_NUMBER: + comparator = new DisplayNameComparator(SAILING_NUMBER_POSITION); + break; + case COMPETITOR_NAME: + comparator = new DisplayNameComparator(COMPETITOR_NAME_POSITION); + break; + default: + break; } if (mFiltered != null && comparator != null) { @@ -188,7 +192,7 @@ public class PenaltyAdapter extends RecyclerView.Adapter> { private Comparator comparator; @@ -22,22 +22,31 @@ public class CompetitorSailIdComparator implements Comparator comparator) { + if (leftSailId == null && rightSailId == null) { + return 0; + } + if (leftSailId == null) { + return -1; + } + if (rightSailId == null) { + return 1; + } + String leftBoat = ""; + for (String lh : Util.splitAlongWhitespaceRespectingDoubleQuotedPhrases(leftSailId)) { + leftBoat = lh; + } + String rightBoat = ""; + for (String rh : Util.splitAlongWhitespaceRespectingDoubleQuotedPhrases(rightSailId)) { + rightBoat = rh; + } + return comparator.compare(leftBoat, rightBoat); + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/comparators/CompetitorShortNameComparator.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/comparators/CompetitorShortNameComparator.java new file mode 100644 index 00000000000..b2a18695954 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/comparators/CompetitorShortNameComparator.java @@ -0,0 +1,44 @@ +package com.sap.sailing.racecommittee.app.ui.comparators; + +import android.text.TextUtils; + +import com.sap.sailing.domain.base.Boat; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sse.common.util.NaturalComparator; + +import java.util.Comparator; +import java.util.Map; + +public class CompetitorShortNameComparator implements Comparator> { + + private NaturalComparator comparator; + + public CompetitorShortNameComparator() { + this.comparator = new NaturalComparator(); + } + + @Override + public int compare(Map.Entry leftCompetitor, Map.Entry rightCompetitor) { + if (leftCompetitor != null && leftCompetitor.getKey() != null && rightCompetitor != null + && rightCompetitor.getKey() != null) { + Competitor left = leftCompetitor.getKey(); + Competitor right = rightCompetitor.getKey(); + return compare(left.getShortName(), right.getShortName(), comparator); + } + return 0; + } + + public static int compare(String leftShortName, String rightShortName, + Comparator comparator) { + if (TextUtils.isEmpty(leftShortName) && TextUtils.isEmpty(rightShortName)) { + return 0; + } + if (TextUtils.isEmpty(leftShortName)) { + return -1; + } + if (TextUtils.isEmpty(rightShortName)) { + return 1; + } + return comparator.compare(leftShortName, rightShortName); + } +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PenaltyFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PenaltyFragment.java index 2994fb2dbd0..bac84a35336 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PenaltyFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/PenaltyFragment.java @@ -62,6 +62,7 @@ import com.sap.sailing.racecommittee.app.ui.adapters.StringArraySpinnerAdapter; import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; import com.sap.sailing.racecommittee.app.ui.layouts.CompetitorEditLayout; import com.sap.sailing.racecommittee.app.ui.layouts.HeaderLayout; +import com.sap.sailing.racecommittee.app.ui.utils.CompetitorUtils; import com.sap.sailing.racecommittee.app.ui.views.SearchView; import com.sap.sailing.racecommittee.app.utils.ThemeHelper; import com.sap.sse.common.Util; @@ -130,11 +131,11 @@ public class PenaltyFragment extends BaseFragment RaceFragment fragment = TrackingListFragment.newInstance(new Bundle(), 1); int viewId = R.id.race_content; switch (getRaceState().getStatus()) { - case FINISHED: - viewId = getFrameId(getActivity(), R.id.finished_edit, R.id.finished_content, true); - break; - default: - break; + case FINISHED: + viewId = getFrameId(getActivity(), R.id.finished_edit, R.id.finished_content, true); + break; + default: + break; } replaceFragment(fragment, viewId); } @@ -238,17 +239,17 @@ public class PenaltyFragment extends BaseFragment if (procedure instanceof ConfigurableStartModeFlagRacingProcedure) { ConfigurableStartModeFlagRacingProcedure racingProcedure = getRaceState().getTypedRacingProcedure(); switch (racingProcedure.getStartModeFlag()) { - case BLACK: - selection = mPenaltyAdapter.getPosition(MaxPointsReason.BFD.name()); - break; + case BLACK: + selection = mPenaltyAdapter.getPosition(MaxPointsReason.BFD.name()); + break; - case UNIFORM: - selection = mPenaltyAdapter.getPosition(MaxPointsReason.UFD.name()); - break; + case UNIFORM: + selection = mPenaltyAdapter.getPosition(MaxPointsReason.UFD.name()); + break; - default: - // nothing - break; + default: + // nothing + break; } } if (getRaceState().getStatus() == RaceLogRaceStatus.FINISHED) { @@ -257,34 +258,34 @@ public class PenaltyFragment extends BaseFragment mPenaltyDropDown.setSelection(selection); } switch (getRaceState().getStatus()) { - case FINISHED: - if (mHeader != null) { - if (AppUtils.with(getActivity()).isPhone()) { - mHeader.setVisibility(View.VISIBLE); - mHeader.setHeaderOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - sendIntent(AppConstants.INTENT_ACTION_CLEAR_TOGGLE); - sendIntent(AppConstants.INTENT_ACTION_SHOW_SUMMARY_CONTENT); - } - }); - } else { - mHeader.setVisibility(View.GONE); + case FINISHED: + if (mHeader != null) { + if (AppUtils.with(getActivity()).isPhone()) { + mHeader.setVisibility(View.VISIBLE); + mHeader.setHeaderOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sendIntent(AppConstants.INTENT_ACTION_CLEAR_TOGGLE); + sendIntent(AppConstants.INTENT_ACTION_SHOW_SUMMARY_CONTENT); + } + }); + } else { + mHeader.setVisibility(View.GONE); + } } - } - case FINISHING: - if (mListButton != null) { - mListButton.setImageDrawable(BitmapHelper.getAttrDrawable(getActivity(), R.attr.list_both_24dp)); - } - if (mListButtonLayout != null) { - mListButtonLayout.setVisibility(View.VISIBLE); - } - break; + case FINISHING: + if (mListButton != null) { + mListButton.setImageDrawable(BitmapHelper.getAttrDrawable(getActivity(), R.attr.list_both_24dp)); + } + if (mListButtonLayout != null) { + mListButtonLayout.setVisibility(View.VISIBLE); + } + break; - default: - if (mListButtonLayout != null) { - mListButtonLayout.setVisibility(View.GONE); - } + default: + if (mListButtonLayout != null) { + mListButtonLayout.setVisibility(View.GONE); + } } if (mListButtonLayout != null) { mSearchView.isEditSmall(mListButtonLayout.getVisibility() == View.VISIBLE); @@ -432,7 +433,7 @@ public class PenaltyFragment extends BaseFragment mCompetitorResults.add(new CompetitorResultEditableImpl(result)); } if (getRaceState() != null && getRaceState().getFinishPositioningList() != null) { // mix with finish position - // list + // list for (CompetitorResult result : getRaceState().getFinishPositioningList()) { int pos = 0; for (int i = 0; i < mCompetitorResults.size(); i++) { @@ -472,21 +473,25 @@ public class PenaltyFragment extends BaseFragment public boolean onMenuItemClick(MenuItem item) { OrderBy orderBy = OrderBy.SAILING_NUMBER; switch (item.getItemId()) { - case R.id.by_name: - orderBy = OrderBy.COMPETITOR_NAME; - break; + case R.id.by_short_name: + orderBy = OrderBy.COMPETITOR_SHORT_NAME; + break; - case R.id.by_start: - orderBy = OrderBy.START_LINE; - break; + case R.id.by_name: + orderBy = OrderBy.COMPETITOR_NAME; + break; - case R.id.by_goal: - orderBy = OrderBy.FINISH_LINE; - loadLeaderboardResult(); - break; + case R.id.by_start: + orderBy = OrderBy.START_LINE; + break; - default: - break; + case R.id.by_goal: + orderBy = OrderBy.FINISH_LINE; + loadLeaderboardResult(); + break; + + default: + break; } mAdapter.setOrderedBy(orderBy); @@ -529,7 +534,7 @@ public class PenaltyFragment extends BaseFragment setMergeState(item, MergeState.ERROR); } item.setMaxPointsReason(result.getMaxPointsReason()); - changedCompetitor.put(item.getCompetitorId(), item.getCompetitorDisplayName()); + changedCompetitor.put(item.getCompetitorId(), CompetitorUtils.getDisplayName(item)); } // check score @@ -545,12 +550,12 @@ public class PenaltyFragment extends BaseFragment setMergeState(item, MergeState.ERROR); } item.setScore(result.getScore()); - changedCompetitor.put(item.getCompetitorId(), item.getCompetitorDisplayName()); + changedCompetitor.put(item.getCompetitorId(), CompetitorUtils.getDisplayName(item)); } } else if (result.getScore() != null) { setMergeState(item, MergeState.ERROR); item.setScore(result.getScore()); - changedCompetitor.put(item.getCompetitorId(), item.getCompetitorDisplayName()); + changedCompetitor.put(item.getCompetitorId(), CompetitorUtils.getDisplayName(item)); } // check score @@ -566,18 +571,18 @@ public class PenaltyFragment extends BaseFragment setMergeState(item, MergeState.ERROR); } item.setComment(item.getComment() + " ## " + result.getComment()); - changedCompetitor.put(item.getCompetitorId(), item.getCompetitorDisplayName()); + changedCompetitor.put(item.getCompetitorId(), CompetitorUtils.getDisplayName(item)); } } else if (result.getComment() != null) { setMergeState(item, MergeState.ERROR); item.setComment(result.getComment()); - changedCompetitor.put(item.getCompetitorId(), item.getCompetitorDisplayName()); + changedCompetitor.put(item.getCompetitorId(), CompetitorUtils.getDisplayName(item)); } // check merge state if (!item.getMergeState().equals(result.getMergeState())) { setMergeState(item, result.getMergeState()); - changedCompetitor.put(item.getCompetitorId(), item.getCompetitorDisplayName()); + changedCompetitor.put(item.getCompetitorId(), CompetitorUtils.getDisplayName(item)); } } else { item.setValue(result); @@ -604,26 +609,26 @@ public class PenaltyFragment extends BaseFragment private void setMergeState(CompetitorResultEditableImpl item, MergeState newState) { switch (item.getMergeState()) { - case ERROR: - if (newState != MergeState.ERROR) { + case ERROR: + if (newState != MergeState.ERROR) { + break; + } + item.setDirty(true); + item.setMergeState(newState); break; - } - item.setDirty(true); - item.setMergeState(newState); - break; - case WARNING: - if (newState != MergeState.WARNING && newState != MergeState.ERROR) { + case WARNING: + if (newState != MergeState.WARNING && newState != MergeState.ERROR) { + break; + } + item.setDirty(true); + item.setMergeState(newState); break; - } - item.setDirty(true); - item.setMergeState(newState); - break; - case OK: - item.setDirty(true); - item.setMergeState(newState); - break; + case OK: + item.setDirty(true); + item.setMergeState(newState); + break; } } @@ -676,12 +681,12 @@ public class PenaltyFragment extends BaseFragment competitor.setMergeState(MergeState.OK); CompetitorResultWithIdImpl item = new CompetitorResultWithIdImpl(0, getBoat(competitor.getCompetitorId()), competitor); AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.AppTheme_AlertDialog); - builder.setTitle(item.getCompetitorDisplayName()); + builder.setTitle(CompetitorUtils.getDisplayName(item)); final CompetitorEditLayout layout = new CompetitorEditLayout(getActivity(), item, mCompetitorResults.getFirstRankZeroPosition() + - /* - * allow for setting rank as the new last in the list in case the competitor did not have a rank so far - */ + /* + * allow for setting rank as the new last in the list in case the competitor did not have a rank so far + */ (item.getOneBasedRank() == 0 ? 1 : 0), competitor.getMergeState() == MergeState.ERROR); builder.setView(layout); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java index ce34b96b448..23ae25a2c02 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java @@ -61,9 +61,11 @@ import com.sap.sailing.racecommittee.app.ui.adapters.dragandswipelist.ItemTouchH import com.sap.sailing.racecommittee.app.ui.comparators.CompetitorGoalPassingComparator; import com.sap.sailing.racecommittee.app.ui.comparators.CompetitorNameComparator; import com.sap.sailing.racecommittee.app.ui.comparators.CompetitorSailIdComparator; +import com.sap.sailing.racecommittee.app.ui.comparators.CompetitorShortNameComparator; import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; import com.sap.sailing.racecommittee.app.ui.layouts.CompetitorEditLayout; import com.sap.sailing.racecommittee.app.ui.layouts.HeaderLayout; +import com.sap.sailing.racecommittee.app.ui.utils.CompetitorUtils; import com.sap.sailing.racecommittee.app.ui.views.SearchView; import com.sap.sailing.racecommittee.app.utils.StringHelper; import com.sap.sailing.racecommittee.app.utils.ThemeHelper; @@ -90,10 +92,11 @@ public class TrackingListFragment extends BaseFragment private static final int COMPETITOR_LOADER = 0; private static final int LEADERBOARD_ORDER_LOADER = 2; - private static final int SORT_SAIL_NUMBER = 0; - private static final int SORT_NAME = 1; - private static final int SORT_GOAL = 2; - private static final int SORT_START = 3; + private static final int SORT_SHORT_NAME = 0; + private static final int SORT_SAIL_NUMBER = 1; + private static final int SORT_NAME = 2; + private static final int SORT_GOAL = 3; + private static final int SORT_START = 4; private RecyclerView mFinishView; private FinishListAdapter mFinishedAdapter; @@ -224,6 +227,7 @@ public class TrackingListFragment extends BaseFragment public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mComparators = new ArrayList<>(); + mComparators.add(SORT_SHORT_NAME, new CompetitorShortNameComparator()); mComparators.add(SORT_SAIL_NUMBER, new CompetitorSailIdComparator()); mComparators.add(SORT_NAME, new CompetitorNameComparator()); mComparators.add(SORT_GOAL, new CompetitorGoalPassingComparator()); @@ -375,6 +379,9 @@ public class TrackingListFragment extends BaseFragment @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { + case R.id.by_short_name: + mComparator = mComparators.get(SORT_SHORT_NAME); + break; case R.id.by_name: mComparator = mComparators.get(SORT_NAME); break; @@ -597,7 +604,7 @@ public class TrackingListFragment extends BaseFragment } } AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.AppTheme_AlertDialog); - builder.setTitle(item.getCompetitorDisplayName()); + builder.setTitle(CompetitorUtils.getDisplayName(item)); final CompetitorEditLayout layout = new CompetitorEditLayout(getActivity(), getRace().getState().getFinishingTime(), item, mFinishedAdapter.getFirstRankZeroPosition() + /* allow for setting rank as the new last in the list in case the competitor did not have a rank so far */ @@ -654,7 +661,7 @@ public class TrackingListFragment extends BaseFragment setPublishButton(); mFinishedAdapter.notifyItemInserted(pos); if (mDots.size() > 0) { - Toast.makeText(getActivity(), getString(R.string.added_to_result_list, theCompetitor.getCompetitorDisplayName(), pos + 1), Toast.LENGTH_SHORT).show(); + Toast.makeText(getActivity(), getString(R.string.added_to_result_list, CompetitorUtils.getDisplayName(theCompetitor), pos + 1), Toast.LENGTH_SHORT).show(); } } @@ -1120,7 +1127,7 @@ public class TrackingListFragment extends BaseFragment private CompetitorResultWithIdImpl updateChangedItem(Map changedCompetitor, CompetitorResultWithIdImpl item, CompetitorResultWithIdImpl newItem) { updateItem(item, newItem); - changedCompetitor.put(newItem.getCompetitorId(), newItem.getCompetitorDisplayName()); + changedCompetitor.put(newItem.getCompetitorId(), CompetitorUtils.getDisplayName(newItem)); return newItem; } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/utils/CompetitorUtils.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/utils/CompetitorUtils.java new file mode 100644 index 00000000000..7ba93a0536f --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/utils/CompetitorUtils.java @@ -0,0 +1,56 @@ +package com.sap.sailing.racecommittee.app.ui.utils; + +import android.support.annotation.Nullable; +import android.text.TextUtils; + +import com.sap.sailing.domain.abstractlog.race.CompetitorResult; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CompetitorWithBoat; + +public class CompetitorUtils { + + public static final String DELIMITER_SHORT_NAME = " / "; + public static final String DELIMITER_SAIL_ID = " - "; + + public static String getDisplayName(Competitor competitor) { + String shortName = competitor.getShortName(); + String sailIdOrBoatName = null; + if (competitor.hasBoat() && competitor instanceof CompetitorWithBoat) { + CompetitorWithBoat competitorWithBoat = (CompetitorWithBoat) competitor; + String sailId = competitorWithBoat.getBoat().getSailID(); + if (TextUtils.isEmpty(sailId)) { + sailIdOrBoatName = competitorWithBoat.getBoat().getName(); + } else { + sailIdOrBoatName = sailId; + } + } + return getDisplayName(shortName, sailIdOrBoatName, competitor.getName()); + } + + public static String getDisplayName(CompetitorResult competitor) { + String shortName = competitor.getShortName(); + String sailIdOrBoatName; + String sailId = competitor.getBoatSailId(); + if (TextUtils.isEmpty(sailId)) { + sailIdOrBoatName = competitor.getBoatName(); + } else { + sailIdOrBoatName = sailId; + } + return getDisplayName(shortName, sailIdOrBoatName, competitor.getName()); + } + + private static String getDisplayName(@Nullable String shortName, + @Nullable String sailIdOrBoatName, String name) { + StringBuilder builder = new StringBuilder(); + if (!TextUtils.isEmpty(shortName)) { + builder.append(shortName); + builder.append(DELIMITER_SHORT_NAME); + } + if (!TextUtils.isEmpty(sailIdOrBoatName)) { + builder.append(sailIdOrBoatName); + builder.append(DELIMITER_SAIL_ID); + } + builder.append(name); + return builder.toString(); + } +} From b4725a26dfb4324e9cdeda551cefaa489a89cc7d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 13 Apr 2019 00:55:22 +0200 Subject: [PATCH 11/12] revert harmful effects of commit 95a8272918ff5ce2b9c38c313a465bbee59ab372 regarding removing of competitors from finish list whose rank was set to 0 Change-Id: Ie7031d0fcac60b9809aa09df86e1204f197dee14 --- .../app/ui/fragments/raceinfo/TrackingListFragment.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) mode change 100644 => 100755 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java old mode 100644 new mode 100755 index 23ae25a2c02..4fe9797c08e --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/TrackingListFragment.java @@ -711,11 +711,12 @@ public class TrackingListFragment extends BaseFragment } public void onItemRemove(int position, CompetitorResultWithIdImpl item) { - if (position < 0) { // not found - return; + if (position >= 0) { // found + mFinishedData.remove(position); + adjustRanks(position, getFirstRankZeroPosition()); + setPublishButton(); + mFinishedAdapter.notifyItemRemoved(position); } - adjustRanks(position, getFirstRankZeroPosition()); - setPublishButton(); for (Map.Entry entry : getRace().getCompetitorsAndBoats().entrySet()) { if (entry.getKey().getId().equals(item.getCompetitorId())) { addNewCompetitorToCompetitorList(entry); From 5b06852534374475eb804ebaed01c7c8e8de348d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 13 Apr 2019 01:18:11 +0200 Subject: [PATCH 12/12] don't unnecessarily initialize non-existing fields with made-up values; leave null Change-Id: I73f53ee8e7e5022d1a135d8a7b2997d97c771a03 --- .../impl/DomainObjectFactoryImpl.java | 21 ------------------- 1 file changed, 21 deletions(-) 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 a2b502c5b63..e8ce7198bc3 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 @@ -1887,30 +1887,9 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { Document dbObject = (Document) object; final Serializable competitorId = (Serializable) dbObject.get(FieldNames.COMPETITOR_ID.name()); String competitorDisplayName = (String) dbObject.get(FieldNames.COMPETITOR_DISPLAY_NAME.name()); - // The Competitor name is a new field in the list. Therefore the name might be null for existing events. In - // this case a standard name is set. - if (competitorDisplayName == null) { - competitorDisplayName = "loaded competitor"; - } String competitorShortName = (String) dbObject.get(FieldNames.COMPETITOR_SHORT_NAME.name()); - // The Competitor short name is a new field in the list. Therefore the short name might be null for existing - // events. In this case a standard short name is set. - if (competitorShortName == null) { - competitorShortName = "loaded competitor short"; - } String competitorBoatName = (String) dbObject.get(FieldNames.COMPETITOR_BOAT_NAME.name()); - // The Competitor boat is a new field in the list. Therefore the name might be null for existing events. - // In this case a standard boat name is set. - if (competitorBoatName == null) { - competitorBoatName = "loaded competitor boat"; - } String competitorBoatSailId = (String) dbObject.get(FieldNames.COMPETITOR_BOAT_SAIL_ID.name()); - // The Competitor boat is a new field in the list. Therefore the boat id might be null for existing events. - // In this case a standard name is set. - if (competitorBoatSailId == null) { - competitorBoatSailId = "loaded competitor boat id"; - } - // At this point we do not retrieve the competitor object since at any point in time, especially after a // server restart, the DomainFactory and its competitor // cache might be empty. But at this time the race log is loaded from database, so the competitor would be