package it.albertus.cycles.model;
import java.beans.Introspector;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import it.albertus.cycles.model.Bike.BikeType;
import it.albertus.cycles.resources.Messages;
import it.albertus.util.IOUtils;
import it.albertus.util.NewLine;
public class BikesCfg {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
private static final String FILE_NAME = "BIKES.CFG";
private static final int RADIX = 10;
private final Properties properties = new Properties();
public BikesCfg(final BikesInf bikesInf) {
final StringReader reader = new StringReader(createProperties(bikesInf));
try {
populateProperties(reader);
}
catch (final IOException ioe) {
throw new IllegalStateException(ioe); // No exception possible with StringReader!
}
finally {
IOUtils.closeQuietly(reader);
}
}
public BikesCfg(final String fileName) throws IOException {
FileReader fr = null;
try {
fr = new FileReader(fileName);
populateProperties(fr); // buffered internally
}
finally {
IOUtils.closeQuietly(fr);
}
System.out.println(Messages.get("msg.file.read", FILE_NAME));
}
public BikesCfg(final BikesInf originalBikesInf, final String path) throws IOException {
System.out.println(Messages.get("msg.reading.file", FILE_NAME));
final File file = new File(path + FILE_NAME);
if (!file.exists()) {
System.out.println(Messages.get("msg.file.not.found.creating.default", FILE_NAME));
writeDefaultBikesCfg(originalBikesInf, file);
System.out.println(Messages.get("msg.default.file.created", FILE_NAME));
}
FileReader fr = null;
try {
fr = new FileReader(file);
populateProperties(fr); // buffered internally
}
finally {
IOUtils.closeQuietly(fr);
}
System.out.println(Messages.get("msg.file.read", FILE_NAME));
}
private void populateProperties(final Reader reader) throws IOException {
this.properties.load(reader);
}
private void writeDefaultBikesCfg(final BikesInf originalBikesInf, final File destination) throws IOException {
final String props = createProperties(originalBikesInf);
// Salvataggio...
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter(destination);
bw = new BufferedWriter(fw);
bw.write(props);
}
finally {
IOUtils.closeQuietly(bw, fw);
}
}
private String createProperties(final BikesInf bikesInf) {
final String lineSeparator = LINE_SEPARATOR != null ? LINE_SEPARATOR : NewLine.CRLF.toString();
final StringBuilder props = new StringBuilder(Messages.get("str.cfg.header"));
for (Bike bike : bikesInf.getBikes()) {
props.append(lineSeparator).append(lineSeparator);
props.append("### ").append(bike.getType().getDisplacement()).append(" cc - " + Messages.get("str.cfg.begin") + "... ###");
// Settings
props.append(lineSeparator);
props.append("# ").append(Settings.class.getSimpleName()).append(" #");
props.append(lineSeparator);
for (Setting setting : bike.getSettings().getValues().keySet()) {
props.append(buildPropertyKey(bike.getType(), Settings.class, setting.toString()));
props.append('=');
props.append(bike.getSettings().getValues().get(setting).intValue());
props.append(lineSeparator);
}
// Gearbox
props.append(lineSeparator);
props.append("# ").append(Gearbox.class.getSimpleName()).append(" #");
props.append(lineSeparator);
for (int index = 0; index < bike.getGearbox().getRatios().length; index++) {
props.append(buildPropertyKey(bike.getType(), Gearbox.class, index));
props.append('=');
props.append(bike.getGearbox().getRatios()[index]);
props.append(lineSeparator);
}
// Torque
props.append(lineSeparator);
props.append("# ").append(Torque.class.getSimpleName()).append(" (").append(Torque.getRpm(0)).append('-').append(Torque.getRpm(Torque.LENGTH) - 1).append(" RPM) #");
props.append(lineSeparator);
for (int index = 0; index < bike.getTorque().getCurve().length; index++) {
if (index > 0 && index % 8 == 0) {
props.append("# " + Torque.getRpm(index) + " RPM");
props.append(lineSeparator);
}
props.append(buildPropertyKey(bike.getType(), Torque.class, index));
props.append('=');
props.append(bike.getTorque().getCurve()[index]);
props.append(lineSeparator);
}
props.append("### ").append(bike.getType().getDisplacement()).append(" cc - " + Messages.get("str.cfg.end") + ". ###");
}
props.append(lineSeparator).append(lineSeparator);
props.append(Messages.get("str.cfg.footer")).append(lineSeparator);
return props.toString();
}
public static String buildPropertyKey(final BikeType bikeType, final Class<? extends BikesInfElement> propertyType, final String suffix) {
return Integer.toString(bikeType.getDisplacement()) + '.' + Introspector.decapitalize(propertyType.getSimpleName()) + '.' + suffix;
}
public static String buildPropertyKey(final BikeType bikeType, final Class<? extends BikesInfElement> propertyType, final int suffix) {
return buildPropertyKey(bikeType, propertyType, Integer.toString(suffix));
}
public Properties getProperties() {
return properties;
}
public Map<String, Integer> getMap() {
final Map<String, Integer> map = new HashMap<String, Integer>();
for (final String key : properties.stringPropertyNames()) {
map.put(key, Integer.valueOf(properties.getProperty(key), RADIX));
}
return map;
}
}