package org.openbakery.racecontrol.data;
import java.io.IOException;
import java.io.Serializable;
import java.io.Writer;
import java.util.*;
import javax.persistence.*;
import org.openbakery.racecontrol.ResultComparator;
import org.openbakery.racecontrol.persistence.FilePersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Entity
@Table(name = "racecontrol_race_entry")
public class RaceEntry implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory.getLogger(RaceEntry.class);
@Id
@GeneratedValue
@Column(name = "id")
private int id;
@Column(name = "laps")
private int laps;
@Column(name = "hours")
private int hours;
@Column(name = "qualifyingMinutes")
private int qualifyingMinutes;
@Column(name = "racers")
private int racers;
@Column(name = "track")
private String track;
@Column(name = "weather")
private Weather weather;
@Column(name = "wind")
private Wind wind;
@Transient
List<Result> results;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "race_entry_id")
private List<Driver> drivers;
@Column(name = "start_time")
private Date startTime;
@Column(name = "server_name")
private String serverName;
public RaceEntry() {
log.debug("new race entry");
startTime = new Date();
drivers = new ArrayList<Driver>();
results = new ArrayList<Result>();
}
public int getLaps() {
return laps;
}
public void setLaps(int laps) {
this.laps = laps;
}
public int getQualifyingMinutes() {
return qualifyingMinutes;
}
public void setQualifyingMinutes(int qualifyingMinutes) {
this.qualifyingMinutes = qualifyingMinutes;
}
public int getRacers() {
return racers;
}
public void setRacers(int racers) {
this.racers = racers;
}
public String getTrack() {
return track;
}
public void setTrack(String track) {
this.track = track;
}
public Weather getWeather() {
return weather;
}
public void setWeather(Weather weather) {
this.weather = weather;
}
public Wind getWind() {
return wind;
}
public void setWind(Wind wind) {
this.wind = wind;
}
public String toString() {
return track.trim() + FilePersistence.DELIMITER + Integer.toString(laps) + FilePersistence.DELIMITER + Integer.toString(hours) + FilePersistence.DELIMITER + Integer.toString(qualifyingMinutes)
+ FilePersistence.DELIMITER + Integer.toString(racers) + FilePersistence.DELIMITER + weather + FilePersistence.DELIMITER + wind;
}
public void store(Writer writer) throws IOException {
writer.write(toString());
writer.write("\n");
}
public static void storeHeader(Writer writer) throws IOException {
writer.write("RACECONTROL-SECTION: RACE\n");
writer.write("#Track" + FilePersistence.DELIMITER + " Laps" + FilePersistence.DELIMITER + " Hours" + FilePersistence.DELIMITER + " QualifyingMinutes" + FilePersistence.DELIMITER + " NumberRacers"
+ FilePersistence.DELIMITER + " Weather" + FilePersistence.DELIMITER + " Wind\n");
}
public void addDriver(Driver driver) {
log.debug("ADD Driver: {}", driver);
Driver duplicatedDriver = null;
for (Driver currentDrivers : drivers) {
if (driver.getId() == currentDrivers.getId()) {
// driver already existes
log.debug("driver already exists");
return;
}
if (driver.getName().equals(currentDrivers.getName())) {
log.debug("driver with name already exists {}", driver);
duplicatedDriver = currentDrivers;
break;
}
}
drivers.remove(duplicatedDriver);
drivers.add(driver);
log.debug("Drivers: {}", drivers);
}
public List<Driver> getDrivers() {
return drivers;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public String getServerName() {
return serverName;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}
public boolean isQualifying() {
return qualifyingMinutes > 0;
}
public boolean isPractice() {
return laps == 0;
}
public void addResult(Result newResult, Driver driver) {
if (isQualifying()) {
Result oldResult = driver.getResult();
if (oldResult == null || newResult.getBestLapTime() < oldResult.getBestLapTime()) {
if (oldResult != null) {
results.remove(oldResult);
}
ResultComparator comparator = new ResultComparator();
int position = 0;
for (Result result : results) {
if (comparator.compare(result, newResult) > 0) {
break;
}
position++;
}
newResult.setPosition(position + 1);
results.add(position, newResult);
position = 1;
for (Result result : results) {
result.setPosition(position++);
}
driver.setResult(newResult);
}
} else {
driver.setResult(newResult);
}
}
public List<Result> getResults() {
return results;
}
public int getHours() {
return hours;
}
public void setHours(int hours) {
this.hours = hours;
}
public Driver getDriverWithConnectionId(int connectionId) {
for (Driver driver : getDrivers()) {
if (driver.getConnectionId() == connectionId) {
return driver;
}
}
return null;
}
public Driver getDriverWithName(String name) {
for (Driver driver : getDrivers()) {
if (driver.getName().equals(name)) {
return driver;
}
}
return null;
}
}