mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-08 21:30:57 +00:00
Initial implementation to gather regattas/live races for mobile
This commit is contained in:
1 parent
c3260155d6
commit
c1cd61b419
9 files changed
+161
-37
No files matched your search
+4
-3
@@ -1,7 +1,8 @@
|
||||
package com.sap.sailing.gwt.home.client.place.event.partials.racelist;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.cell.client.AbstractCell;
|
||||
import com.google.gwt.cell.client.Cell;
|
||||
@@ -229,13 +230,13 @@ public abstract class AbstractRaceList<T extends RaceMetadataDTO> extends Compos
|
||||
this.initWidget(cellTableContainer);
|
||||
}
|
||||
|
||||
protected void setTableData(List<T> data) {
|
||||
protected void setTableData(Collection<T> data) {
|
||||
Column<T, ?> sortColumn = (this.cellTable == null ? null : this.cellTable.getCurrentlySortedColumn());
|
||||
this.cellTable = new SortedCellTable<T>(data.size(), CleanCellTableResources.INSTANCE);
|
||||
this.cellTableContainer.setWidget(this.cellTable);
|
||||
this.initTableStyle();
|
||||
this.initTableColumns();
|
||||
this.cellTable.setList(data);
|
||||
this.cellTable.setList(new ArrayList<>(data));
|
||||
if (sortColumn != null && this.cellTable.getColumnIndex(sortColumn) >= 0) {
|
||||
this.cellTable.sortColumn(sortColumn);
|
||||
}
|
||||
|
||||
+2
-13
@@ -293,14 +293,14 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
|
||||
continue;
|
||||
}
|
||||
|
||||
RegattaMetadataDTO regattaDTO = createRegattaMetadataDTO(leaderboardGroup, leaderboard);
|
||||
RegattaMetadataDTO regattaDTO = HomeServiceUtil.toRegattaMetadataDTO(leaderboardGroup, leaderboard);
|
||||
regattaDTO.setStartDate(regatta.getStartDate() != null ? regatta.getStartDate().asDate() : null);
|
||||
regattaDTO.setEndDate(regatta.getEndDate() != null ? regatta.getEndDate().asDate() : null);
|
||||
regattaDTO.setState(HomeServiceUtil.calculateRegattaState(regattaDTO));
|
||||
dto.getRegattas().add(regattaDTO);
|
||||
|
||||
} else if(leaderboard instanceof FlexibleLeaderboard) {
|
||||
RegattaMetadataDTO regattaDTO = createRegattaMetadataDTO(leaderboardGroup, leaderboard);
|
||||
RegattaMetadataDTO regattaDTO = HomeServiceUtil.toRegattaMetadataDTO(leaderboardGroup, leaderboard);
|
||||
|
||||
regattaDTO.setStartDate(null);
|
||||
regattaDTO.setEndDate(null);
|
||||
@@ -347,17 +347,6 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
|
||||
|
||||
return dto;
|
||||
}
|
||||
|
||||
private RegattaMetadataDTO createRegattaMetadataDTO(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard) {
|
||||
RegattaMetadataDTO regattaDTO = new RegattaMetadataDTO(leaderboard.getName(), leaderboard.getName());
|
||||
regattaDTO.setBoatCategory(leaderboardGroup.getDisplayName() != null ? leaderboardGroup.getDisplayName() : leaderboardGroup.getName());
|
||||
regattaDTO.setCompetitorsCount(HomeServiceUtil.calculateCompetitorsCount(leaderboard));
|
||||
regattaDTO.setRaceCount(HomeServiceUtil.calculateRaceCount(leaderboard));
|
||||
regattaDTO.setTrackedRacesCount(HomeServiceUtil.calculateTrackedRaceCount(leaderboard));
|
||||
regattaDTO.setBoatClass(HomeServiceUtil.calculateBoatClass(leaderboard));
|
||||
|
||||
return regattaDTO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EventSeriesViewDTO getEventSeriesViewById(UUID id) {
|
||||
|
||||
+11
@@ -476,4 +476,15 @@ public final class HomeServiceUtil {
|
||||
}
|
||||
return LocaleMatch.NO_MATCH;
|
||||
}
|
||||
|
||||
public static RegattaMetadataDTO toRegattaMetadataDTO(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard) {
|
||||
RegattaMetadataDTO regattaDTO = new RegattaMetadataDTO(leaderboard.getName(), leaderboard.getName());
|
||||
regattaDTO.setBoatCategory(leaderboardGroup.getDisplayName() != null ? leaderboardGroup.getDisplayName() : leaderboardGroup.getName());
|
||||
regattaDTO.setCompetitorsCount(HomeServiceUtil.calculateCompetitorsCount(leaderboard));
|
||||
regattaDTO.setRaceCount(HomeServiceUtil.calculateRaceCount(leaderboard));
|
||||
regattaDTO.setTrackedRacesCount(HomeServiceUtil.calculateTrackedRaceCount(leaderboard));
|
||||
regattaDTO.setBoatClass(HomeServiceUtil.calculateBoatClass(leaderboard));
|
||||
|
||||
return regattaDTO;
|
||||
}
|
||||
}
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
package com.sap.sailing.gwt.ui.shared.dispatch.event;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.TreeSet;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.google.gwt.core.shared.GwtIncompatible;
|
||||
import com.sap.sailing.gwt.server.HomeServiceUtil;
|
||||
import com.sap.sailing.gwt.ui.shared.dispatch.Action;
|
||||
import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext;
|
||||
import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL;
|
||||
import com.sap.sailing.gwt.ui.shared.dispatch.event.RacesActionUtil.RaceCallback;
|
||||
import com.sap.sailing.gwt.ui.shared.eventview.RegattaMetadataDTO;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
|
||||
public class GetRegattasAndLiveRacesForEventAction implements Action<ResultWithTTL<RegattasAndLiveRacesDTO>> {
|
||||
private static final Logger logger = Logger.getLogger(GetRegattasAndLiveRacesForEventAction.class.getName());
|
||||
|
||||
private UUID eventId;
|
||||
|
||||
public GetRegattasAndLiveRacesForEventAction() {
|
||||
}
|
||||
|
||||
public GetRegattasAndLiveRacesForEventAction(UUID eventId) {
|
||||
this.eventId = eventId;
|
||||
}
|
||||
|
||||
@Override
|
||||
@GwtIncompatible
|
||||
public ResultWithTTL<RegattasAndLiveRacesDTO> execute(DispatchContext context) {
|
||||
long start = System.currentTimeMillis();
|
||||
final ArrayList<Pair<RegattaMetadataDTO, TreeSet<LiveRaceDTO>>> regattasWithRaces = new ArrayList<>();
|
||||
|
||||
RacesActionUtil.forRacesOfEvent(context, eventId, new RaceCallback() {
|
||||
@Override
|
||||
public void doForRace(RaceContext context) {
|
||||
LiveRaceDTO liveRace = context.getLiveRaceOrNull();
|
||||
if(liveRace == null) {
|
||||
Pair<RegattaMetadataDTO, TreeSet<LiveRaceDTO>> regatta = ensureRegatta(regattasWithRaces, context);
|
||||
regatta.getB().add(liveRace);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
RegattasAndLiveRacesDTO result = new RegattasAndLiveRacesDTO(regattasWithRaces);
|
||||
long duration = System.currentTimeMillis() - start;
|
||||
logger.log(Level.INFO, "Calculating live races for event "+ eventId + " took: "+ duration + "ms");
|
||||
return new ResultWithTTL<RegattasAndLiveRacesDTO>(1000 * 60 * 2, result);
|
||||
}
|
||||
|
||||
protected Pair<RegattaMetadataDTO, TreeSet<LiveRaceDTO>> ensureRegatta(ArrayList<Pair<RegattaMetadataDTO, TreeSet<LiveRaceDTO>>> regattasWithRaces,
|
||||
RaceContext context) {
|
||||
String regattaName = context.getRegattaName();
|
||||
for(Pair<RegattaMetadataDTO, TreeSet<LiveRaceDTO>> regatta : regattasWithRaces) {
|
||||
if(regatta.getA().getId().equals(regattaName)) {
|
||||
return regatta;
|
||||
}
|
||||
}
|
||||
Pair<RegattaMetadataDTO, TreeSet<LiveRaceDTO>> newEntry = new Pair<RegattaMetadataDTO, TreeSet<LiveRaceDTO>>(HomeServiceUtil.toRegattaMetadataDTO(context.getLeaderboardGroup(), context.getLeaderboard()), new TreeSet<LiveRaceDTO>());
|
||||
regattasWithRaces.add(newEntry);
|
||||
return newEntry;
|
||||
}
|
||||
}
|
||||
+20
-1
@@ -1,11 +1,14 @@
|
||||
package com.sap.sailing.gwt.ui.shared.dispatch.event;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.sap.sailing.gwt.ui.shared.race.FlagStateDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO;
|
||||
import com.sap.sse.common.Util;
|
||||
|
||||
public class LiveRaceDTO extends RaceMetadataDTO {
|
||||
public class LiveRaceDTO extends RaceMetadataDTO implements Comparable<LiveRaceDTO> {
|
||||
|
||||
private FlagStateDTO flagState;
|
||||
|
||||
@@ -44,4 +47,20 @@ public class LiveRaceDTO extends RaceMetadataDTO {
|
||||
public void setProgress(RaceProgressDTO progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(LiveRaceDTO o) {
|
||||
Date thisStart = getStart();
|
||||
Date otherStart = o.getStart();
|
||||
if(Util.equalsWithNull(thisStart, otherStart)) {
|
||||
return 0;
|
||||
}
|
||||
if(thisStart == null) {
|
||||
return 1;
|
||||
}
|
||||
if(otherStart == null) {
|
||||
return -1;
|
||||
}
|
||||
return -thisStart.compareTo(otherStart);
|
||||
}
|
||||
}
|
||||
+4
-14
@@ -1,28 +1,18 @@
|
||||
package com.sap.sailing.gwt.ui.shared.dispatch.event;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Collection;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import com.sap.sailing.gwt.ui.shared.dispatch.DTO;
|
||||
|
||||
public class LiveRacesDTO implements DTO {
|
||||
private ArrayList<LiveRaceDTO> races = new ArrayList<>();
|
||||
private TreeSet<LiveRaceDTO> races = new TreeSet<>();
|
||||
|
||||
public List<LiveRaceDTO> getRaces() {
|
||||
public Collection<LiveRaceDTO> getRaces() {
|
||||
return races;
|
||||
}
|
||||
|
||||
public void addRace(LiveRaceDTO race) {
|
||||
for(int i = 0; i < races.size(); i++) {
|
||||
LiveRaceDTO foundRace = races.get(i);
|
||||
Date foundStart = foundRace.getStart();
|
||||
Date newStart = race.getStart();
|
||||
if(foundStart == null || (newStart != null && foundStart.compareTo(newStart) < 0)) {
|
||||
races.add(i, race);
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.races.add(race);
|
||||
}
|
||||
|
||||
|
||||
+23
-4
@@ -30,6 +30,7 @@ import com.sap.sailing.domain.common.racelog.Flags;
|
||||
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
|
||||
import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sailing.domain.tracking.WindTrack;
|
||||
@@ -56,9 +57,11 @@ public class RaceContext {
|
||||
private final ReadonlyRaceState state;
|
||||
private final Event event;
|
||||
private final long TIME_TO_SHOW_CANCELED_RACES_AS_LIVE = 5 * 60 * 1000; // 5 min
|
||||
private final LeaderboardGroup leaderboardGroup;
|
||||
|
||||
public RaceContext(Event event, Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet) {
|
||||
public RaceContext(Event event, LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet) {
|
||||
this.event = event;
|
||||
this.leaderboardGroup = leaderboardGroup;
|
||||
this.leaderboard = leaderboard;
|
||||
this.raceColumn = raceColumn;
|
||||
this.raceDefinition = raceColumn.getRaceDefinition(fleet);
|
||||
@@ -72,7 +75,7 @@ public class RaceContext {
|
||||
return !LeaderboardNameConstants.DEFAULT_FLEET_NAME.equals(fleet.getName());
|
||||
}
|
||||
|
||||
private String getRegattaName() {
|
||||
public String getRegattaName() {
|
||||
if (leaderboard instanceof RegattaLeaderboard) {
|
||||
Regatta regatta = ((RegattaLeaderboard) leaderboard).getRegatta();
|
||||
return regatta.getName();
|
||||
@@ -272,9 +275,16 @@ public class RaceContext {
|
||||
}
|
||||
|
||||
public void addLiveRace(LiveRacesDTO result) {
|
||||
LiveRaceDTO liveRaceDTO = getLiveRaceOrNull();
|
||||
if(liveRaceDTO != null) {
|
||||
result.addRace(liveRaceDTO);
|
||||
}
|
||||
}
|
||||
|
||||
public LiveRaceDTO getLiveRaceOrNull() {
|
||||
TimePoint startTime = getStartTime();
|
||||
TimePoint finishTime = getFinishTime();
|
||||
// a race is of 'public interest' of a race is a combination of it's 'live' state
|
||||
// a race is of 'public interest' of a race is a combination of it's 'live' state
|
||||
// and special flags states indicating how the postponed/canceled races will be continued
|
||||
if(isLiveOrOfPublicInterest(startTime, finishTime)) {
|
||||
// the start time is always given for live races
|
||||
@@ -292,8 +302,9 @@ public class RaceContext {
|
||||
liveRaceDTO.setProgress(getProgressOrNull());
|
||||
liveRaceDTO.setWind(getWindOrNull());
|
||||
|
||||
result.addRace(liveRaceDTO);
|
||||
return liveRaceDTO;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean isLiveOrOfPublicInterest(TimePoint startTime, TimePoint finishTime) {
|
||||
@@ -381,4 +392,12 @@ public class RaceContext {
|
||||
public RegattaAndRaceIdentifier getRaceIdentifier() {
|
||||
return trackedRace.getRaceIdentifier();
|
||||
}
|
||||
|
||||
public Leaderboard getLeaderboard() {
|
||||
return leaderboard;
|
||||
}
|
||||
|
||||
public LeaderboardGroup getLeaderboardGroup() {
|
||||
return leaderboardGroup;
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -25,7 +25,7 @@ public final class RacesActionUtil {
|
||||
for (Leaderboard lb : lg.getLeaderboards()) {
|
||||
for(RaceColumn raceColumn : lb.getRaceColumns()) {
|
||||
for(Fleet fleet : raceColumn.getFleets()) {
|
||||
callback.doForRace(new RaceContext(event, lb, raceColumn, fleet));
|
||||
callback.doForRace(new RaceContext(event, lg, lb, raceColumn, fleet));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -38,7 +38,8 @@ public final class RacesActionUtil {
|
||||
Leaderboard lb = context.getRacingEventService().getLeaderboardByName(regattaName);
|
||||
for(RaceColumn raceColumn : lb.getRaceColumns()) {
|
||||
for(Fleet fleet : raceColumn.getFleets()) {
|
||||
callback.doForRace(new RaceContext(event, lb, raceColumn, fleet));
|
||||
// TODO LeaderboardGroup
|
||||
callback.doForRace(new RaceContext(event, null, lb, raceColumn, fleet));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
package com.sap.sailing.gwt.ui.shared.dispatch.event;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import com.sap.sailing.gwt.ui.shared.dispatch.DTO;
|
||||
import com.sap.sailing.gwt.ui.shared.eventview.RegattaMetadataDTO;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
|
||||
public class RegattasAndLiveRacesDTO implements DTO {
|
||||
|
||||
private ArrayList<Pair<RegattaMetadataDTO, TreeSet<LiveRaceDTO>>> regattasWithRaces;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private RegattasAndLiveRacesDTO() {
|
||||
}
|
||||
|
||||
public RegattasAndLiveRacesDTO(ArrayList<Pair<RegattaMetadataDTO, TreeSet<LiveRaceDTO>>> regattasWithRaces) {
|
||||
super();
|
||||
this.regattasWithRaces = regattasWithRaces;
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public List<Pair<RegattaMetadataDTO, Set<LiveRaceDTO>>> getRegattasWithRaces() {
|
||||
return (List)regattasWithRaces;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user