package org.openbakery.racecontrol.persistence;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.openbakery.racecontrol.data.Driver;
import org.openbakery.racecontrol.data.Flag;
import org.openbakery.racecontrol.data.Lap;
import org.openbakery.racecontrol.data.RaceEntry;
import org.openbakery.racecontrol.data.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FilePersistence implements Persistence {
public static final String DELIMITER = ";";
private static Logger log = LoggerFactory.getLogger(FilePersistence.class);
RaceEntry raceEntry;
public FilePersistence() {
}
private void storeRaceEntry(RaceEntry race) throws PersistenceException {
if (race == null) {
throw new IllegalArgumentException("Given race is null");
}
FileWriter writer = null;
try {
String filename = getFilename(race);
writer = new FileWriter(filename);
log.info("Store results to: " + filename);
RaceEntry.storeHeader(writer);
race.store(writer);
Driver.storeHeader(writer);
for (Driver driver : raceEntry.getDrivers()) {
driver.store(writer);
}
Result.storeHeader(writer);
for (Driver driver : raceEntry.getDrivers()) {
Result result = driver.getResult();
if (result != null)
result.store(driver.getName(), writer);
}
Lap.storeHeader(writer);
for (Driver driver : raceEntry.getDrivers()) {
if (driver.getResult() != null) {
for (Lap lap : driver.getCompletedLaps(driver.getLongestAttempt())) {
lap.store(driver.getName(), writer);
}
}
}
Flag.storeHeader(writer);
for (Driver driver : raceEntry.getDrivers()) {
Result result = driver.getResult();
if (result != null) {
int numberLaps = result.getLapsCompleted();
for (Lap lap : driver.getAllLaps()) {
for (Flag flag : lap.getFlags()) {
if (lap.getNumber() <= numberLaps) {
flag.store(driver.getName(), lap.getNumber(), writer);
}
}
}
}
}
writer.close();
} catch (IOException ex) {
throw new PersistenceException(ex);
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException ex) {
throw new PersistenceException(ex);
}
}
}
}
private String getFilename(RaceEntry race) {
return getFilename(race, 0);
}
private String getFilename(RaceEntry race, int i) {
String filename = race.getTrack().trim();
if (!race.isQualifying()) {
filename += "_race";
} else {
filename += "_qual";
}
SimpleDateFormat sdf = new SimpleDateFormat("yyMMddkkmm");
filename += "_" + sdf.format(new Date());
if (i > 0) {
filename += "_" + i;
}
filename += ".rcsv";
File file = new File(filename);
if (file.exists()) {
return getFilename(race, i + 1);
}
return filename;
}
public void close() throws PersistenceException {
flush();
}
public <T> T store(T object) throws PersistenceException {
if (object instanceof RaceEntry) {
this.raceEntry = (RaceEntry) object;
}
// else if (object instanceof Driver) {
// Driver driver = (Driver) object;
// ListIterator<Driver> listIterator = drivers.listIterator();
// while (listIterator.hasNext()) {
// Driver d = listIterator.next();
// if (d.getPlayerId() == driver.getPlayerId()) {
// listIterator.remove();
// }
// }
// drivers.add(driver);
// }
return object;
}
public void flush() throws PersistenceException {
if (raceEntry != null) {
storeRaceEntry(raceEntry);
}
raceEntry = null;
}
public List<? extends Object> query(String query) throws PersistenceException {
return Collections.emptyList();
}
public List<? extends Object> queryNative(String query, String name) throws PersistenceException {
return Collections.emptyList();
}
public List<? extends Object> queryNative(String query, Map<String, String> parameters, Class<? extends Object> clazz) throws PersistenceException {
return Collections.emptyList();
}
public <T> T delete(T object) throws PersistenceException {
log.info("delete is not suppored in the file peristence");
return object;
}
@Override
public Transaction createTransaction() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public int queryNativeInt(String query, Map<String, String> parameter) throws PersistenceException {
return 0;
}
}