Initial implementation to gather regattas/live races for mobile

This commit is contained in:
Steffen Schaefer committed 2015-06-16 12:46:41 +02:00
1 parent c3260155d6
commit c1cd61b419
9 files changed
+161 -37

No files matched your search

@@ -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);
}
@@ -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) {
@@ -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;
}
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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);
}
@@ -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;
}
}
@@ -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));
}
}
}
@@ -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;
}
}