Merge branch 'master' into permission-vertical

This commit is contained in:
Axel Uhl committed 2019-04-13 08:25:19 +02:00
commit 242513b42e
28 files changed
+578 -355

No files matched your search

@@ -1895,11 +1895,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());
String competitorBoatName = (String) dbObject.get(FieldNames.COMPETITOR_BOAT_NAME.name());
String competitorBoatSailId = (String) dbObject.get(FieldNames.COMPETITOR_BOAT_SAIL_ID.name());
// 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
@@ -1925,8 +1923,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++;
}
@@ -76,7 +76,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,
@@ -1255,7 +1255,10 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
private Document storePositionedCompetitor(CompetitorResult competitorResult) {
Document result = new Document();
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());
@@ -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);
@@ -40,7 +40,13 @@ public interface CompetitorResult extends Serializable {
Serializable getCompetitorId();
String getCompetitorDisplayName();
String getName();
String getShortName();
String getBoatName();
String getBoatSailId();
int getOneBasedRank();
@@ -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;
@@ -24,13 +26,32 @@ public class CompetitorResultImpl implements CompetitorResult {
private final String comment;
private final MergeState mergeState;
public CompetitorResultImpl(Serializable competitorId, String competitorDisplayName, int oneBasedRank,
MaxPointsReason maxPointsReason, Double score, TimePoint finishingTime, String comment,
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(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) {
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,10 +66,25 @@ 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
public int getOneBasedRank() {
return oneBasedRank;
@@ -84,8 +120,11 @@ public class CompetitorResultImpl implements CompetitorResult {
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 +147,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 +191,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 + "]";
}
}
@@ -153,8 +153,8 @@ public class MarkPassingUpdateFromRaceLogFinishPositioingListTest extends Abstra
final CompetitorResults results = new CompetitorResultsImpl();
int rank = 1;
for (Pair<Competitor, TimePoint> 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;
}
@@ -55,11 +55,13 @@ 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.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;
@@ -307,9 +309,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();
@@ -331,11 +336,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();
@@ -399,9 +407,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);
@@ -43,6 +43,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;
@@ -50,6 +51,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;
@@ -207,8 +209,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();
@@ -231,8 +237,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();
@@ -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);
}
@@ -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());
@@ -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);
@@ -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<Competitor, MaxPointsReason> 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));
}
}
@@ -1007,10 +1007,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);
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/by_short_name"
android:title="@string/sort_by_short_name" />
<item
android:id="@+id/by_boat"
android:title="@string/sort_by_boat" />
@@ -518,6 +518,7 @@
<string name="non_public_changed_title">Nicht öffentliche Events</string>
<string name="competitor_list">Teilnehmerliste</string>
<string name="sort_by_boat">nach Segelnummer</string>
<string name="sort_by_short_name">nach Kurzname</string>
<string name="sort_by_name">nach Namen</string>
<string name="sort_by_start">nach Abstand zur Startlinie</string>
<string name="sort_by_goal">nach getracktem Zieldurchgang</string>
@@ -547,6 +547,7 @@
<string name="competitor_list">Results</string>
<string name="sort_by_boat">by Sail Number</string>
<string name="sort_by_short_name">by Short Name</string>
<string name="sort_by_name">by Competitor Name</string>
<string name="sort_by_start">by Position to Start Line</string>
<string name="sort_by_goal">by Tracked Position</string>
@@ -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,17 +166,6 @@ 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();
}
@Override
public boolean equals(Object o) {
if (this == o)
@@ -143,8 +179,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;
@@ -159,7 +198,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);
@@ -15,16 +15,17 @@ 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 == null ? null : boat.getName(), boat == null ? null : boat.getSailID(),
oneBasedRank, maxPointsReason, score, finishingTime, comment, mergeState);
mId = id;
mBoat = boat;
@@ -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<CompetitorAndBoatAdapter.ViewHolder> {
private static final String TAG = CompetitorAndBoatAdapter.class.getName();
@@ -49,11 +50,7 @@ public class CompetitorAndBoatAdapter extends RecyclerView.Adapter<CompetitorAnd
ViewHelper.setColors(holder.vesselId, boat.getColor().getAsHtml());
}
}
String name = "";
if (competitor.getShortInfo() != null) {
name += competitor.getShortInfo() + " - ";
}
name += competitor.getName();
String name = CompetitorUtils.getDisplayName(competitor);
if (holder.competitor != null) {
holder.competitor.setText(name);
}
@@ -9,6 +9,7 @@ import com.sap.sailing.racecommittee.app.domain.impl.CompetitorResultWithIdImpl;
import com.sap.sailing.racecommittee.app.ui.adapters.dragandswipelist.BaseDraggableSwipeAdapter;
import com.sap.sailing.racecommittee.app.ui.adapters.dragandswipelist.BaseDraggableSwipeViewHolder;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.TrackingListFragment;
import com.sap.sailing.racecommittee.app.ui.utils.CompetitorUtils;
import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
import android.content.Context;
@@ -90,7 +91,7 @@ public class FinishListAdapter extends BaseDraggableSwipeAdapter<FinishListAdapt
ViewHelper.setColors(holder.vesselId, item.getBoat().getColor().getAsHtml());
}
}
holder.competitor.setText(item.getCompetitorDisplayName());
holder.competitor.setText(CompetitorUtils.getDisplayName(item));
Drawable warning;
switch (item.getMergeState()) {
case ERROR:
@@ -21,9 +21,11 @@ import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.domain.impl.CompetitorResultEditableImpl;
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.utils.CompetitorUtils;
import com.sap.sailing.racecommittee.app.utils.StringHelper;
import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
import com.sap.sse.common.Util;
import com.sap.sse.common.util.NaturalComparator;
import java.io.Serializable;
@@ -36,8 +38,9 @@ import java.util.Map;
public class PenaltyAdapter extends RecyclerView.Adapter<PenaltyAdapter.ViewHolder> {
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<PenaltyAdapter.ViewHold
bgId = R.attr.sap_gray_black_20;
}
holder.itemView.setBackgroundColor(ThemeHelper.getColor(mContext, bgId));
holder.mItemText.setText(item.getCompetitorDisplayName());
holder.mItemText.setText(CompetitorUtils.getDisplayName(item));
final boolean hasReason = !MaxPointsReason.NONE.equals(item.getMaxPointsReason());
holder.mItemPenalty.setVisibility(hasReason ? View.VISIBLE : View.GONE);
if (hasReason) {
@@ -156,7 +159,7 @@ public class PenaltyAdapter extends RecyclerView.Adapter<PenaltyAdapter.ViewHold
result.addAll(mCompetitor);
} else {
for (int i = 0; i < mCompetitor.size(); i++) {
if (StringHelper.on(mContext).containsIgnoreCase(mCompetitor.get(i).getCompetitorDisplayName(),
if (StringHelper.on(mContext).containsIgnoreCase(CompetitorUtils.getDisplayName(mCompetitor.get(i)),
mFilter)) {
result.add(mCompetitor.get(i));
}
@@ -169,16 +172,17 @@ public class PenaltyAdapter extends RecyclerView.Adapter<PenaltyAdapter.ViewHold
private void sortData() {
Comparator<CompetitorResultEditableImpl> 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<PenaltyAdapter.ViewHold
}
public enum OrderBy {
SAILING_NUMBER, COMPETITOR_NAME, START_LINE, FINISH_LINE
COMPETITOR_SHORT_NAME, SAILING_NUMBER, COMPETITOR_NAME, START_LINE, FINISH_LINE
}
public interface ItemListener {
@@ -212,32 +216,16 @@ public class PenaltyAdapter extends RecyclerView.Adapter<PenaltyAdapter.ViewHold
@Override
public int compare(CompetitorResultEditableImpl lhs, CompetitorResultEditableImpl rhs) {
String[] left = splitDisplayName(lhs.getCompetitorDisplayName());
String[] right = splitDisplayName(rhs.getCompetitorDisplayName());
int leftPos = mPos;
int rightPos = mPos;
if (left.length == 1) {
leftPos = 0;
switch (mPos) {
case COMPETITOR_SHORT_NAME_POSITION:
return CompetitorShortNameComparator
.compare(lhs.getShortName(), rhs.getShortName(), mNaturalComparator);
case SAILING_NUMBER_POSITION:
return CompetitorSailIdComparator
.compare(lhs.getBoatSailId(), rhs.getBoatSailId(), mNaturalComparator);
default:
return mNaturalComparator.compare(lhs.getName(), rhs.getName());
}
if (right.length == 1) {
rightPos = 0;
}
String leftItem = left[leftPos];
String rightItem = right[rightPos];
if (mPos == SAILING_NUMBER_POSITION) {
for (String leftData : Util.splitAlongWhitespaceRespectingDoubleQuotedPhrases(leftItem)) {
leftItem = leftData;
}
for (String rightData : Util.splitAlongWhitespaceRespectingDoubleQuotedPhrases(rightItem)) {
rightItem = rightData;
}
}
return mNaturalComparator.compare(leftItem, rightItem);
}
private String[] splitDisplayName(String displayName) {
return displayName.split(" - ");
}
}
@@ -1,13 +1,13 @@
package com.sap.sailing.racecommittee.app.ui.comparators;
import java.util.Comparator;
import java.util.Map;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sse.common.Util;
import com.sap.sse.common.util.NaturalComparator;
import java.util.Comparator;
import java.util.Map;
public class CompetitorSailIdComparator implements Comparator<Map.Entry<Competitor, Boat>> {
private Comparator<String> comparator;
@@ -22,22 +22,31 @@ public class CompetitorSailIdComparator implements Comparator<Map.Entry<Competit
&& rightCompetitor.getValue() != null) {
Boat left = leftCompetitor.getValue();
Boat right = rightCompetitor.getValue();
// if right is null, left will be greater
if (right == null || right.getSailID() == null) {
return 1;
}
String leftBoat = "";
for (String lh : Util.splitAlongWhitespaceRespectingDoubleQuotedPhrases(left.getSailID())) {
leftBoat = lh;
}
String rightBoat = "";
for (String rh : Util.splitAlongWhitespaceRespectingDoubleQuotedPhrases(right.getSailID())) {
rightBoat = rh;
}
return comparator.compare(leftBoat, rightBoat);
String leftSailId = left == null ? null : left.getSailID();
String rightSailId = right == null ? null : right.getSailID();
return compare(leftSailId, rightSailId, comparator);
}
return 0;
}
public static int compare(String leftSailId, String rightSailId, Comparator<String> 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);
}
}
@@ -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<Map.Entry<Competitor, Boat>> {
private NaturalComparator comparator;
public CompetitorShortNameComparator() {
this.comparator = new NaturalComparator();
}
@Override
public int compare(Map.Entry<Competitor, Boat> leftCompetitor, Map.Entry<Competitor, Boat> 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<String> 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);
}
}
@@ -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);
@@ -297,9 +298,7 @@ public class PenaltyFragment extends BaseFragment
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));
}
}
@@ -310,9 +309,7 @@ public class PenaltyFragment 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));
}
}
}
@@ -424,18 +421,19 @@ public class PenaltyFragment extends BaseFragment
private void onLoadCompetitorsSucceeded(Map<Competitor, Boat> 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<Competitor, Boat> 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
// list
for (CompetitorResult result : getRaceState().getFinishPositioningList()) {
int pos = 0;
for (int i = 0; i < mCompetitorResults.size(); i++) {
@@ -475,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);
@@ -532,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
@@ -548,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
@@ -569,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);
@@ -607,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;
}
}
@@ -677,17 +679,14 @@ public class PenaltyFragment extends BaseFragment
}
}
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());
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
builder.setTitle(item.getCompetitorDisplayName());
CompetitorResultWithIdImpl item = new CompetitorResultWithIdImpl(0, getBoat(competitor.getCompetitorId()), competitor);
AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.AppTheme_AlertDialog);
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);
@@ -755,17 +754,13 @@ public class PenaltyFragment extends BaseFragment
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));
}
}
@@ -777,9 +772,7 @@ public class PenaltyFragment extends BaseFragment
}
}
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));
}
}
@@ -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());
@@ -311,9 +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));
}
}
}
@@ -377,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;
@@ -598,15 +603,12 @@ public class TrackingListFragment extends BaseFragment
context = actionBar.getThemedContext();
}
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(item.getCompetitorDisplayName());
final CompetitorEditLayout layout = new CompetitorEditLayout(getContext(),
getRace().getState().getFinishingTime(), item, getFirstRankZeroPosition() +
/*
* 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),
false, item.getMergeState() == MergeState.ERROR);
AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.AppTheme_AlertDialog);
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 */
(item.getOneBasedRank() == 0 ? 1 : 0), false, item.getMergeState() == MergeState.ERROR);
builder.setView(layout);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
@@ -625,7 +627,7 @@ public class TrackingListFragment extends BaseFragment
@Override
public void onCancel(DialogInterface dialog) {
CompetitorResultWithIdImpl newItem = new CompetitorResultWithIdImpl(item.getId(),
getBoat(item.getCompetitorId()), item.getCompetitorId(), item.getCompetitorDisplayName(),
getBoat(item.getCompetitorId()), item.getCompetitorId(), item.getName(), item.getShortName(),
item.getOneBasedRank(), item.getMaxPointsReason(), item.getScore(), item.getFinishingTime(),
item.getComment(), MergeState.OK);
updateItem(item, newItem);
@@ -643,30 +645,23 @@ public class TrackingListFragment extends BaseFragment
}
private void moveCompetitorToFinishList(Competitor competitor) {
String name = "";
if (competitor.getShortInfo() != null) {
name += competitor.getShortInfo() + " - ";
}
name += competitor.getName();
int pos = mFinishedAdapter.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...
// 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;
for (final CompetitorResultWithIdImpl result : mFinishedData) {
if (result.getOneBasedRank() > greatestOneBasedRankSoFar) {
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, CompetitorUtils.getDisplayName(theCompetitor), pos + 1), Toast.LENGTH_SHORT).show();
}
}
@@ -716,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<Competitor, Boat> entry : getRace().getCompetitorsAndBoats().entrySet()) {
if (entry.getKey().getId().equals(item.getCompetitorId())) {
addNewCompetitorToCompetitorList(entry);
@@ -749,16 +745,13 @@ public class TrackingListFragment extends BaseFragment
}
}
private CompetitorResultWithIdImpl cloneCompetitorResultAndAdjustRank(
CompetitorResultWithIdImpl competitorToReplaceWithAdjustedPosition, final int newOneBasedRank) {
return new CompetitorResultWithIdImpl(competitorToReplaceWithAdjustedPosition.getId(),
getBoat(competitorToReplaceWithAdjustedPosition.getCompetitorId()),
competitorToReplaceWithAdjustedPosition.getCompetitorId(),
competitorToReplaceWithAdjustedPosition.getCompetitorDisplayName(), newOneBasedRank,
competitorToReplaceWithAdjustedPosition.getMaxPointsReason(),
competitorToReplaceWithAdjustedPosition.getScore(),
competitorToReplaceWithAdjustedPosition.getFinishingTime(),
competitorToReplaceWithAdjustedPosition.getComment(), MergeState.OK);
private CompetitorResultWithIdImpl cloneCompetitorResultAndAdjustRank(CompetitorResultWithIdImpl competitorToReplaceWithAdjustedPosition,
final int newOneBasedRank) {
return new CompetitorResultWithIdImpl(competitorToReplaceWithAdjustedPosition.getId(), getBoat(competitorToReplaceWithAdjustedPosition
.getCompetitorId()), competitorToReplaceWithAdjustedPosition.getCompetitorId(), competitorToReplaceWithAdjustedPosition
.getName(), competitorToReplaceWithAdjustedPosition.getShortName(), newOneBasedRank, competitorToReplaceWithAdjustedPosition
.getMaxPointsReason(), competitorToReplaceWithAdjustedPosition.getScore(), competitorToReplaceWithAdjustedPosition
.getFinishingTime(), competitorToReplaceWithAdjustedPosition.getComment(), MergeState.OK);
}
public void onLongClick(final CompetitorResultWithIdImpl item) {
@@ -825,10 +818,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());
}
@@ -836,9 +826,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;
}
@@ -851,10 +839,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);
}
@@ -863,9 +848,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, 0));
}
}
@@ -879,9 +862,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));
}
}
@@ -1005,9 +986,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);
}
@@ -1022,9 +1003,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);
}
@@ -1041,16 +1022,15 @@ public class TrackingListFragment extends BaseFragment
state = MergeState.ERROR;
}
newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(),
item.getCompetitorDisplayName(), item.getOneBasedRank(), item.getMaxPointsReason(),
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);
}
@@ -1067,16 +1047,15 @@ public class TrackingListFragment extends BaseFragment
state = MergeState.ERROR;
}
newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(),
item.getCompetitorDisplayName(), item.getOneBasedRank(), item.getMaxPointsReason(),
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);
}
@@ -1093,25 +1072,23 @@ public class TrackingListFragment extends BaseFragment
state = MergeState.ERROR;
}
newItem = new CompetitorResultWithIdImpl(item.getId(), boat, item.getCompetitorId(),
item.getCompetitorDisplayName(), item.getOneBasedRank(), item.getMaxPointsReason(),
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
@@ -1151,7 +1128,7 @@ public class TrackingListFragment extends BaseFragment
private CompetitorResultWithIdImpl updateChangedItem(Map<Serializable, String> changedCompetitor,
CompetitorResultWithIdImpl item, CompetitorResultWithIdImpl newItem) {
updateItem(item, newItem);
changedCompetitor.put(newItem.getCompetitorId(), newItem.getCompetitorDisplayName());
changedCompetitor.put(newItem.getCompetitorId(), CompetitorUtils.getDisplayName(newItem));
return newItem;
}
@@ -223,9 +223,9 @@ public class CompetitorEditLayout extends ScrollView
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);
}
@@ -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();
}
}