# started to implement new RaceState + RacingProcedure logic (to be renamed and merged later)

# ManagedRaceListFragment uses new RaceState
This commit is contained in:
Lukas Niemeier
2013-11-12 22:07:25 +01:00
parent f45160375e
commit def0025720
17 changed files with 553 additions and 17 deletions
@@ -0,0 +1,6 @@
package com.sap.sailing.domain.racelog;
public interface RaceLogChangedListener {
public void eventAdded(RaceLogEvent event);
}
@@ -1,5 +1,6 @@
package com.sap.sailing.racecommittee.app.domain.racelog.impl;
package com.sap.sailing.domain.racelog.impl;
import com.sap.sailing.domain.racelog.RaceLogChangedListener;
import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogEventVisitor;
@@ -14,7 +15,6 @@ import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
import com.sap.sailing.racecommittee.app.domain.racelog.RaceLogChangedListener;
public class RaceLogChangedVisitor implements RaceLogEventVisitor {
@@ -0,0 +1,51 @@
package com.sap.sailing.domain.racelog.state;
import java.io.Serializable;
import java.util.List;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
import com.sap.sailing.domain.tracking.Wind;
public interface RaceState2 {
RaceLog getRaceLog();
RaceLogEventAuthor getAuthor();
void setRacingProcedure(RacingProcedureType racingProcedureType);
RacingProcedure2 getRacingProcedure();
RaceLogRaceStatus getStatus();
RacingProcedurePrerequisite setStartTime(TimePoint timePoint);
TimePoint getStartTime();
void setFinishingTime(TimePoint timePoint);
TimePoint getFinishingTime();
void setFinishedTime(TimePoint timePoint);
TimePoint getFinishedTime();
void setProtestTime(TimePoint timePoint);
TimePoint getProtestTime();
void setAborted(TimePoint timePoint, boolean isPostponed);
void setGeneralRecall(TimePoint timePoint);
void setFinishPositioningListChanged(List<Triple<Serializable, String, MaxPointsReason>> positionedCompetitors);
List<Triple<Serializable, String, MaxPointsReason>> getFinishPositioningList();
void setFinishPositioningConfirmed();
boolean isFinishPositioningConfirmed();
void setCourseDesign(CourseBase courseDesign);
CourseBase getCourseDesign();
void setWindFix(Wind wind);
void addChangedListener(RaceState2ChangedListener listener);
void removeChangedListener(RaceState2ChangedListener listener);
}
@@ -0,0 +1,19 @@
package com.sap.sailing.domain.racelog.state;
public interface RaceState2ChangedListener {
void onRacingProcedureChanged(RaceState2 state);
void onStatusChanged(RaceState2 state);
void onStartTimeChanged(RaceState2 state);
void onFinishingTimeChanged(RaceState2 state);
void onFinishedTimeChanged(RaceState2 state);
void onProtestTimeChanged(RaceState2 state);
void onAborted(RaceState2 state);
void onGeneralRecall(RaceState2 state);
void onFinishingPositioningsChanged(RaceState2 state);
void onFinishingPositionsConfirmed(RaceState2 state);
void onCourseDesignChanged(RaceState2 state);
void onWindFixAdded(RaceState2 state);
}
@@ -0,0 +1,14 @@
package com.sap.sailing.domain.racelog.state;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.racelog.RaceLog;
public interface RacingProcedure2 {
RaceLog getRaceLog();
RacingProcedureType getType();
RacingProcedurePrerequisite checkPrerequisitesForStart(TimePoint startTime);
}
@@ -0,0 +1,6 @@
package com.sap.sailing.domain.racelog.state;
public interface RacingProcedurePrerequisite {
}
@@ -0,0 +1,18 @@
package com.sap.sailing.domain.racelog.state.impl;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.state.RacingProcedure2;
public abstract class BaseRacingProcedure implements RacingProcedure2 {
private final RaceLog raceLog;
public BaseRacingProcedure(RaceLog raceLog) {
this.raceLog = raceLog;
}
public RaceLog getRaceLog() {
return raceLog;
}
}
@@ -0,0 +1,25 @@
package com.sap.sailing.domain.racelog.state.impl;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.state.RacingProcedurePrerequisite;
public class RRS26RacingProcedure extends BaseRacingProcedure {
public RRS26RacingProcedure(RaceLog raceLog) {
super(raceLog);
}
@Override
public RacingProcedureType getType() {
return RacingProcedureType.RRS26;
}
@Override
public RacingProcedurePrerequisite checkPrerequisitesForStart(TimePoint startTime) {
// TODO Auto-generated method stub
return null;
}
}
@@ -0,0 +1,89 @@
package com.sap.sailing.domain.racelog.state.impl;
import java.util.HashSet;
import com.sap.sailing.domain.racelog.state.RaceState2;
import com.sap.sailing.domain.racelog.state.RaceState2ChangedListener;
public class RaceState2ChangedListeners extends HashSet<RaceState2ChangedListener> implements RaceState2ChangedListener {
private static final long serialVersionUID = 2028183211903975659L;
@Override
public void onRacingProcedureChanged(RaceState2 state) {
for (RaceState2ChangedListener listener : this) {
listener.onRacingProcedureChanged(state);
}
}
@Override
public void onStatusChanged(RaceState2 state) {
for (RaceState2ChangedListener listener : this) {
listener.onStatusChanged(state);
}
}
@Override
public void onStartTimeChanged(RaceState2 state) {
for (RaceState2ChangedListener listener : this) {
listener.onStartTimeChanged(state);
}
}
@Override
public void onFinishingTimeChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onFinishedTimeChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onProtestTimeChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onAborted(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onGeneralRecall(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onFinishingPositioningsChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onFinishingPositionsConfirmed(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onCourseDesignChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onWindFixAdded(RaceState2 state) {
// TODO Auto-generated method stub
}
}
@@ -0,0 +1,222 @@
package com.sap.sailing.domain.racelog.state.impl;
import java.io.Serializable;
import java.util.List;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogChangedListener;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
import com.sap.sailing.domain.racelog.RaceLogEventFactory;
import com.sap.sailing.domain.racelog.analyzing.impl.ConfirmedFinishPositioningListFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.FinishPositioningListFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.FinishedTimeFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.FinishingTimeFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.LastPublishedCourseDesignFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.ProtestStartTimeFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer;
import com.sap.sailing.domain.racelog.analyzing.impl.RacingProcedureTypeAnalyzer;
import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder;
import com.sap.sailing.domain.racelog.impl.RaceLogChangedVisitor;
import com.sap.sailing.domain.racelog.state.RaceState2;
import com.sap.sailing.domain.racelog.state.RaceState2ChangedListener;
import com.sap.sailing.domain.racelog.state.RacingProcedure2;
import com.sap.sailing.domain.racelog.state.RacingProcedurePrerequisite;
import com.sap.sailing.domain.tracking.Wind;
public class RaceState2Impl implements RaceState2, RaceLogChangedListener {
private final RaceLog raceLog;
private final RaceLogEventAuthor author;
private final RaceLogEventFactory factory;
private final RaceState2ChangedListeners changedListeners;
private RacingProcedure2 racingProcedure;
private RacingProcedureTypeAnalyzer racingProcedureAnalyer;
private RaceStatusAnalyzer statusAnalyzer;
private StartTimeFinder startTimeAnalyzer;
private FinishingTimeFinder finishingTimeAnalyzer;
private FinishedTimeFinder finishedTimeAnalyzer;
private ProtestStartTimeFinder protestTimeAnalyzer;
private FinishPositioningListFinder finishPositioningListAnalyzer;
private ConfirmedFinishPositioningListFinder confirmedFinishPositioningListAnalyzer;
private LastPublishedCourseDesignFinder courseDesignerAnalyzer;
private RacingProcedureType cachedRacingProcedureType;
private RaceLogRaceStatus cachedRaceStatus;
public RaceState2Impl(RaceLog raceLog, RaceLogEventAuthor author, RaceLogEventFactory eventFactory,
RacingProcedureType defaultRacingProcedureType) {
this.raceLog = raceLog;
this.author = author;
this.factory = eventFactory;
this.changedListeners = new RaceState2ChangedListeners();
this.cachedRacingProcedureType = defaultRacingProcedureType;
this.cachedRaceStatus = RaceLogRaceStatus.UNKNOWN;
this.raceLog.addListener(new RaceLogChangedVisitor(this));
}
@Override
public RaceLog getRaceLog() {
return raceLog;
}
@Override
public RaceLogEventAuthor getAuthor() {
return author;
}
@Override
public void setRacingProcedure(RacingProcedureType newType) {
if (racingProcedure == null || !newType.equals(racingProcedureAnalyer.analyze())) {
raceLog.add(factory.createStartProcedureChangedEvent(MillisecondsTimePoint.now(), author, raceLog.getCurrentPassId(), newType));
}
}
@Override
public RacingProcedure2 getRacingProcedure() {
return racingProcedure;
}
@Override
public RaceLogRaceStatus getStatus() {
return cachedRaceStatus;
}
@Override
public RacingProcedurePrerequisite setStartTime(TimePoint startTime) {
RacingProcedurePrerequisite pre = racingProcedure.checkPrerequisitesForStart(startTime);
if (pre != null) {
return pre;
} else {
raceLog.add(factory.createStartTimeEvent(MillisecondsTimePoint.now(), author, raceLog.getCurrentPassId(), startTime));
return null;
}
}
@Override
public TimePoint getStartTime() {
return startTimeAnalyzer.analyze();
}
@Override
public void setFinishingTime(TimePoint timePoint) {
// set finishing time
}
@Override
public TimePoint getFinishingTime() {
return finishingTimeAnalyzer.analyze();
}
@Override
public void setFinishedTime(TimePoint timePoint) {
// set finished time
}
@Override
public TimePoint getFinishedTime() {
return finishedTimeAnalyzer.analyze();
}
@Override
public void setProtestTime(TimePoint timePoint) {
// set protest time
}
@Override
public TimePoint getProtestTime() {
return protestTimeAnalyzer.analyze();
}
@Override
public void setAborted(TimePoint timePoint, boolean isPostponed) {
// set aborted
}
@Override
public void setGeneralRecall(TimePoint timePoint) {
// set general recall
}
@Override
public void setFinishPositioningListChanged(
List<Triple<Serializable, String, MaxPointsReason>> positionedCompetitors) {
// set finishing positions
}
@Override
public List<Triple<Serializable, String, MaxPointsReason>> getFinishPositioningList() {
return finishPositioningListAnalyzer.analyze();
}
@Override
public void setFinishPositioningConfirmed() {
// set confirmed event
}
@Override
public boolean isFinishPositioningConfirmed() {
return confirmedFinishPositioningListAnalyzer.analyze() != null;
}
@Override
public void setCourseDesign(CourseBase courseDesign) {
// set course design
}
@Override
public CourseBase getCourseDesign() {
return courseDesignerAnalyzer.analyze();
}
@Override
public void setWindFix(Wind wind) {
// set wind fix
}
@Override
public void addChangedListener(RaceState2ChangedListener listener) {
changedListeners.add(listener);
}
@Override
public void removeChangedListener(RaceState2ChangedListener listener) {
changedListeners.remove(listener);
}
@Override
public void eventAdded(RaceLogEvent event) {
RacingProcedureType type = racingProcedureAnalyer.analyze();
if (!cachedRacingProcedureType.equals(type)) {
cachedRacingProcedureType = type;
createRacingProcedure();
changedListeners.onRacingProcedureChanged(this);
}
RaceLogRaceStatus status = statusAnalyzer.analyze();
if (!cachedRaceStatus.equals(status)) {
cachedRaceStatus = status;
changedListeners.onStatusChanged(this);
}
}
private void createRacingProcedure() {
this.racingProcedure = new RRS26RacingProcedure(raceLog);
}
}
@@ -8,9 +8,12 @@ import com.sap.sailing.domain.common.Named;
import com.sap.sailing.domain.common.WithID;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.state.RaceState2;
import com.sap.sailing.racecommittee.app.domain.state.RaceState;
public interface ManagedRace extends ManagedRaceIdentifier, Named, WithID {
public RaceState2 getState2();
/**
* @return the identifier of the race.
*/
@@ -14,6 +14,10 @@ import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEventFactory;
import com.sap.sailing.domain.racelog.state.RaceState2;
import com.sap.sailing.domain.racelog.state.impl.RaceState2Impl;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
import com.sap.sailing.racecommittee.app.domain.state.RaceState;
@@ -24,6 +28,7 @@ public class ManagedRaceImpl implements ManagedRace {
// private static final String TAG = ManagedRace.class.getName();
private RaceState2 state2;
private ManagedRaceIdentifier identifier;
private RaceState state;
private Collection<Competitor> competitors;
@@ -32,6 +37,8 @@ public class ManagedRaceImpl implements ManagedRace {
public ManagedRaceImpl(Context context, ManagedRaceIdentifier identifier,
RacingProcedureType defaultStartProcedureType, RaceLog raceLog) {
this(identifier, new RaceStateImpl(context, defaultStartProcedureType, raceLog));
this.state2 = new RaceState2Impl(raceLog, AppPreferences.getAuthor(context),
RaceLogEventFactory.INSTANCE, defaultStartProcedureType);
}
public ManagedRaceImpl(ManagedRaceIdentifier identifier, RaceState state) {
@@ -41,6 +48,11 @@ public class ManagedRaceImpl implements ManagedRace {
this.courseOnServer = null;
}
@Override
public RaceState2 getState2() {
return state2;
}
public Serializable getId() {
return identifier.getId();
}
@@ -1,7 +0,0 @@
package com.sap.sailing.racecommittee.app.domain.racelog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
public interface RaceLogChangedListener {
public void eventAdded(RaceLogEvent event);
}
@@ -18,6 +18,7 @@ import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogChangedListener;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogEventFactory;
import com.sap.sailing.domain.racelog.analyzing.impl.FinishPositioningListFinder;
@@ -28,10 +29,9 @@ import com.sap.sailing.domain.racelog.analyzing.impl.ProtestStartTimeFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer;
import com.sap.sailing.domain.racelog.analyzing.impl.RacingProcedureTypeAnalyzer;
import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder;
import com.sap.sailing.domain.racelog.impl.RaceLogChangedVisitor;
import com.sap.sailing.domain.tracking.Wind;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.domain.racelog.RaceLogChangedListener;
import com.sap.sailing.racecommittee.app.domain.racelog.impl.RaceLogChangedVisitor;
import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedure;
import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.StartProcedureFactory;
import com.sap.sailing.racecommittee.app.domain.state.RaceState;
@@ -215,6 +215,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
return getStatus();
}
@Override
public void eventAdded(RaceLogEvent event) {
updateStatus();
}
@@ -23,12 +23,12 @@ import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogEventVisitor;
import com.sap.sailing.domain.racelog.impl.RaceLogChangedVisitor;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.data.DataManager;
import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.domain.racelog.impl.RaceLogChangedVisitor;
import com.sap.sailing.racecommittee.app.domain.state.RaceState;
import com.sap.sailing.racecommittee.app.domain.state.RaceStateChangedListener;
import com.sap.sailing.racecommittee.app.domain.state.RaceStateEventListener;
@@ -4,9 +4,9 @@ import org.json.simple.JSONObject;
import android.app.Service;
import com.sap.sailing.domain.racelog.RaceLogChangedListener;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.domain.racelog.RaceLogChangedListener;
import com.sap.sailing.racecommittee.app.domain.racelog.impl.RaceLogEventsCallback;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
@@ -16,6 +16,8 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import com.sap.sailing.domain.racelog.state.RaceState2;
import com.sap.sailing.domain.racelog.state.RaceState2ChangedListener;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.RaceApplication;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
@@ -33,7 +35,7 @@ import com.sap.sailing.racecommittee.app.ui.comparators.BoatClassSeriesDataFleet
import com.sap.sailing.racecommittee.app.ui.comparators.NaturalNamedComparator;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.ProtestTimeDialogFragment;
public class ManagedRaceListFragment extends LoggableListFragment implements JuryFlagClickedListener, RaceStateChangedListener {
public class ManagedRaceListFragment extends LoggableListFragment implements JuryFlagClickedListener, RaceStateChangedListener, RaceState2ChangedListener {
public enum FilterMode {
ALL(R.string.race_list_filter_show_all), ACTIVE(R.string.race_list_filter_show_active);
@@ -91,7 +93,8 @@ public class ManagedRaceListFragment extends LoggableListFragment implements Jur
unregisterOnAllRaces();
registerOnAllRaces();
for (ManagedRace race : managedRacesById.values()) {
onRaceStateStatusChanged(race.getState());
//onRaceStateStatusChanged(race.getState());
onStatusChanged(race.getState2());
}
}
@@ -129,13 +132,15 @@ public class ManagedRaceListFragment extends LoggableListFragment implements Jur
private void registerOnAllRaces() {
for (ManagedRace managedRace : managedRacesById.values()) {
managedRace.getState().registerStateChangeListener(this);
//managedRace.getState().registerStateChangeListener(this);
managedRace.getState2().addChangedListener(this);
}
}
private void unregisterOnAllRaces() {
for (ManagedRace managedRace : managedRacesById.values()) {
managedRace.getState().unregisterStateChangeListener(this);
//managedRace.getState().unregisterStateChangeListener(this);
managedRace.getState2().removeChangedListener(this);
}
}
@@ -238,4 +243,76 @@ public class ManagedRaceListFragment extends LoggableListFragment implements Jur
// TODO: show protest time changes in status bar oder show update indicator!
}
@Override
public void onRacingProcedureChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onStartTimeChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onFinishingTimeChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onFinishedTimeChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onProtestTimeChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onAborted(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onGeneralRecall(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onFinishingPositioningsChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onFinishingPositionsConfirmed(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onCourseDesignChanged(RaceState2 state) {
// TODO Auto-generated method stub
}
@Override
public void onWindFixAdded(RaceState2 state) {
// TODO Auto-generated method stub
}
}