/* * Created on Feb 4, 2006 * */ package org.openbakery.racecontrol.data; import java.io.IOException; import java.io.Serializable; import java.io.Writer; import java.util.Date; import java.util.LinkedList; import java.util.List; import javax.persistence.*; import org.openbakery.racecontrol.persistence.FilePersistence; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Entity @Table(name = "racecontrol_lap") public class Lap implements Comparable<Lap>, Cloneable, Serializable { private static Logger log = LoggerFactory.getLogger(Lap.class); /** * */ private static final long serialVersionUID = 4789495926121897235L; @Id @GeneratedValue private int id; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "driver_id") private Driver driver; @ManyToOne @JoinColumn(name = "performed_by_driver_id") private Driver performedByDriver; @Column(name = "split1") private int split1; @Column(name = "split2") private int split2; @Column(name = "split3") private int split3; @Column(name = "split4") private int split4; private int time; private int number; private boolean pit; @Column(name = "driver_position") private int position; @Column(name = "total_time") private int totalTime; private boolean finished; private int penalty = -1; @Column(name = "number_stops") private int numberStops = -1; @Embedded @AttributeOverrides( { @AttributeOverride(name = "rearLeft", column = @Column(name = "tyre_rear_left")), @AttributeOverride(name = "rearRight", column = @Column(name = "tyre_rear_right")), @AttributeOverride(name = "frontLeft", column = @Column(name = "tyre_front_left")), @AttributeOverride(name = "frontRight", column = @Column(name = "tyre_front_right")) }) private Tyres tyres = new Tyres(); private int work = -1; @Column(name = "pit_stop_time") private long pitStopTime = -1L; @Column(name = "old_penalty") private int oldPenalty; @Column(name = "new_penalty") private int newPenalty; @Column(name = "created_at") private Date createdAt = new Date(); @Transient private LinkedList<Flag> flags = new LinkedList<Flag>(); private int attempt; public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } public Lap() { this(1, 0); } public Lap(int attempt, int number) { this.attempt = attempt; this.number = number; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public boolean isPit() { return pit; } public void setPit(boolean pit) { this.pit = pit; } public int getSplit(int i) { switch (i) { case 0: return split1; case 1: return split2; case 2: return split3; case 3: return split4; } return 0; } public int getTime() { return time; } public boolean isFinished() { return totalTime > 0; } public void addSplit(int split, int time) { int sumSplits = 0; if (split > 1) { sumSplits = split1 + split2 + split3 + split4; } setSplitTime(split, time - sumSplits); } private void setSplitTime(int split, int time) { switch (split) { case 1: split1 = time; break; case 2: split2 = time; break; case 3: split3 = time; break; case 4: split4 = time; break; } } public String toString() { String result = "Lap [number: " + number + ", time: " + getTime(); result += ", split1: " + split1; result += ", split2: " + split2; result += ", split3: " + split3; result += ", split4: " + split4; result += ", pit: " + pit + "]"; return result; } public String toString(String lfsWorldName) { String result = null; if (lfsWorldName != null) { result = lfsWorldName; result += FilePersistence.DELIMITER; result += Integer.toString(number); result += FilePersistence.DELIMITER; result += time; result += FilePersistence.DELIMITER; result += Integer.toString(split1); result += FilePersistence.DELIMITER; result += Integer.toString(split2); result += FilePersistence.DELIMITER; result += Integer.toString(split3); result += FilePersistence.DELIMITER; result += Integer.toString(split4); result += FilePersistence.DELIMITER; result += totalTime; result += FilePersistence.DELIMITER; result += Integer.toString(position); result += FilePersistence.DELIMITER; result += Boolean.toString(pit); result += FilePersistence.DELIMITER; if (penalty > -1) { result += Integer.toString(penalty); } result += FilePersistence.DELIMITER; if (numberStops > -1) { result += Integer.toString(numberStops); } result += FilePersistence.DELIMITER; if (tyres != null) { result += Integer.toString(tyres.getRearLeft()); result += FilePersistence.DELIMITER; result += Integer.toString(tyres.getRearRight()); result += FilePersistence.DELIMITER; result += Integer.toString(tyres.getFrontLeft()); result += FilePersistence.DELIMITER; result += Integer.toString(tyres.getFrontRight()); } else { result += FilePersistence.DELIMITER; result += FilePersistence.DELIMITER; result += FilePersistence.DELIMITER; } result += FilePersistence.DELIMITER; if (work > -1) { result += Integer.toString(work); } result += FilePersistence.DELIMITER; if (pitStopTime > -1) { result += Long.toString(pitStopTime); } result += FilePersistence.DELIMITER; if (performedByDriver != null) { result += performedByDriver.getName(); } result += FilePersistence.DELIMITER; if (oldPenalty > -1) { result += Integer.toString(oldPenalty); } result += FilePersistence.DELIMITER; if (newPenalty > -1) { result += Integer.toString(newPenalty); } } return result; } public void store(String lfsWorldName, Writer writer) throws IOException { log.debug("lfsWorldName {}, isFinished {}, position {}", new Object[] {lfsWorldName, isFinished(), position}); if (lfsWorldName != null && isFinished() && position > 0) { writer.write(toString(lfsWorldName)); writer.write("\n"); } } public static void storeHeader(Writer writer) throws IOException { writer.write("RACECONTROL-SECTION: LAPS\n"); writer.write("#number" + FilePersistence.DELIMITER + "time" + FilePersistence.DELIMITER + "split1" + FilePersistence.DELIMITER + "split2" + FilePersistence.DELIMITER + "split3" + FilePersistence.DELIMITER + "split4" + FilePersistence.DELIMITER + "totalTime" + FilePersistence.DELIMITER + "position" + FilePersistence.DELIMITER + "pit" + FilePersistence.DELIMITER + "penalty" + FilePersistence.DELIMITER + "numberStops" + FilePersistence.DELIMITER + "rearLeft" + FilePersistence.DELIMITER + "rearRight" + FilePersistence.DELIMITER + "frontLeft" + FilePersistence.DELIMITER + "frontRight" + FilePersistence.DELIMITER + "work" + FilePersistence.DELIMITER + "pitStopTime" + FilePersistence.DELIMITER + "performedByDriver" + FilePersistence.DELIMITER + "oldPenalty" + FilePersistence.DELIMITER + "newPenalty\n"); } public int compareTo(Lap lap) { return (totalTime - lap.getTotalTime()); } public Lap clone() { Lap lap = new Lap(attempt, number); lap.split1 = split1; lap.split2 = split2; lap.split3 = split3; lap.split4 = split4; lap.pit = pit; lap.position = position; lap.totalTime = totalTime; lap.penalty = penalty; lap.numberStops = numberStops; lap.tyres = tyres.clone(); lap.work = work; lap.pitStopTime = -pitStopTime; lap.performedByDriver = performedByDriver; lap.oldPenalty = oldPenalty; lap.newPenalty = newPenalty; return lap; } public int getTotalTime() { return totalTime; } public int getNumberStops() { return numberStops; } public void setNumberStops(int numberStops) { this.numberStops = numberStops; } public int getPenalty() { return penalty; } public void setPenalty(int penalty) { this.penalty = penalty; } public int getWork() { return work; } public void setWork(int work) { this.work = work; } public long getPitStopTime() { return pitStopTime; } public void setPitStopTime(long pitStopTime) { this.pitStopTime = pitStopTime; } public Flag getCurrentFlag() { if (flags.size() > 0) { return flags.getLast(); } return null; } public void addFlag(Flag flag) { flags.add(flag); } public List<Flag> getFlags() { return flags; } public int getNewPenalty() { return newPenalty; } public void setNewPenalty(int newPenalty) { this.newPenalty = newPenalty; } public int getOldPenalty() { return oldPenalty; } public void setOldPenalty(int oldPenalty) { this.oldPenalty = oldPenalty; } public void setTime(int time) { this.time = time; int sumSplits = split1 + split2 + split3 + split4; if (split2 == 0) { split2 = time - sumSplits; } else if (split3 == 0) { split3 = time - sumSplits; } else if (split4 == 0) { split4 = time - sumSplits; } } public void setTotalTime(int totalTime) { this.totalTime = totalTime; } public Tyres getTyres() { return tyres; } public void setTyres(Tyres tyres) { this.tyres = tyres; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAttempt() { return attempt; } public void setAttempt(int joins) { this.attempt = joins; } public Driver getDriver() { return driver; } public void setDriver(Driver driver) { this.driver = driver; } public Date getCreatedAt() { return this.createdAt; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + attempt; result = prime * result + ((driver == null) ? 0 : driver.hashCode()); result = prime * result + (finished ? 1231 : 1237); result = prime * result + ((flags == null) ? 0 : flags.hashCode()); result = prime * result + id; result = prime * result + newPenalty; result = prime * result + number; result = prime * result + numberStops; result = prime * result + oldPenalty; result = prime * result + penalty; result = prime * result + (pit ? 1231 : 1237); result = prime * result + (int) (pitStopTime ^ (pitStopTime >>> 32)); result = prime * result + position; result = prime * result + split1; result = prime * result + split2; result = prime * result + split3; result = prime * result + split4; result = prime * result + time; result = prime * result + totalTime; result = prime * result + ((tyres == null) ? 0 : tyres.hashCode()); result = prime * result + work; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Lap other = (Lap) obj; if (attempt != other.attempt) return false; if (driver == null) { if (other.driver != null) return false; } else if (!driver.equals(other.driver)) return false; if (finished != other.finished) return false; if (flags == null) { if (other.flags != null) return false; } else if (!flags.equals(other.flags)) return false; if (id != other.id) return false; if (newPenalty != other.newPenalty) return false; if (number != other.number) return false; if (numberStops != other.numberStops) return false; if (oldPenalty != other.oldPenalty) return false; if (penalty != other.penalty) return false; if (pit != other.pit) return false; if (pitStopTime != other.pitStopTime) return false; if (position != other.position) return false; if (split1 != other.split1) return false; if (split2 != other.split2) return false; if (split3 != other.split3) return false; if (split4 != other.split4) return false; if (time != other.time) return false; if (totalTime != other.totalTime) return false; if (tyres == null) { if (other.tyres != null) return false; } else if (!tyres.equals(other.tyres)) return false; if (work != other.work) return false; return true; } public boolean isEmpty() { return (split1 == 0 && time == 0); } public Driver getPerformedByDriver() { return performedByDriver; } public void setPerformedByDriver(Driver performedByDriver) { this.performedByDriver = performedByDriver; } }