Archived
0

implement parsing systems and stations Maddavo's files

This commit is contained in:
iMoHax
2015-02-28 17:53:06 +03:00
parent 15d3c4a0b9
commit 0888b5a4a9
7 changed files with 349 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
package ru.trader.maddavo;
import au.com.bytecode.opencsv.CSVParser;
import ru.trader.core.Market;
import java.io.IOException;
public abstract class CSVParseHandler implements ParseHandler {
private final CSVParser parser;
protected final Market market;
protected CSVParseHandler(Market market) {
this.market = market;
parser = new CSVParser(',', '\'');
}
@Override
public void parse(String str) throws IOException {
String[] values = parser.parseLine(str);
for (int i = 0; i < values.length; i++) {
String value = values[i];
if ("?".equals(value) || "-".equals(value)){
values[i] = "";
}
}
doWork(values);
}
protected abstract void doWork(String[] values);
}

View File

@@ -0,0 +1,8 @@
package ru.trader.maddavo;
import java.io.IOException;
public interface ParseHandler {
public void parse(String str) throws IOException;
}

View File

@@ -0,0 +1,66 @@
package ru.trader.maddavo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.trader.core.Market;
import ru.trader.core.Place;
import ru.trader.core.SERVICE_TYPE;
import ru.trader.core.Vendor;
import java.util.ArrayList;
import java.util.Collection;
public class StationHandler extends CSVParseHandler {
private final static Logger LOG = LoggerFactory.getLogger(StationHandler.class);
protected StationHandler(Market market) {
super(market);
}
@Override
protected void doWork(String[] values) {
//unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size,market,shipyard,modified
Place system = market.get(values[0]);
if (system == null){
LOG.warn("Not found system {}", values[0]);
return;
}
double distance = 0;
try {
distance = Double.valueOf(values[2]);
} catch (NumberFormatException ex){
LOG.warn("Distance {} - is not correct", values[2]);
}
Collection<SERVICE_TYPE> adding = new ArrayList<>();
Collection<SERVICE_TYPE> removing = new ArrayList<>();
if ("Y".equals(values[3])) adding.add(SERVICE_TYPE.BLACK_MARKET);
if ("N".equals(values[3])) removing.add(SERVICE_TYPE.BLACK_MARKET);
if ("M".equals(values[4])) {adding.add(SERVICE_TYPE.MEDIUM_LANDPAD); removing.add(SERVICE_TYPE.LARGE_LANDPAD);}
if ("L".equals(values[4])) {adding.add(SERVICE_TYPE.MEDIUM_LANDPAD); adding.add(SERVICE_TYPE.LARGE_LANDPAD);}
if ("Y".equals(values[5])) adding.add(SERVICE_TYPE.MARKET);
if ("N".equals(values[5])) removing.add(SERVICE_TYPE.MARKET);
if ("Y".equals(values[6])) adding.add(SERVICE_TYPE.SHIPYARD);
if ("N".equals(values[6])) removing.add(SERVICE_TYPE.SHIPYARD);
updateStation(system, values[1], distance, adding, removing);
}
private void updateStation(Place system, String name, double distance, Collection<SERVICE_TYPE> addServices, Collection<SERVICE_TYPE> removeServices){
Vendor station = system.get(name);
if (station == null){
LOG.debug("{} - is new station, adding", name);
station = system.addVendor(name);
}
if (distance > 0 && distance != station.getDistance()) {
station.setDistance(distance);
}
addServices.forEach(station::add);
removeServices.forEach(station::remove);
}
}

View File

@@ -0,0 +1,45 @@
package ru.trader.maddavo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.trader.core.Market;
import ru.trader.core.Place;
public class SystemHandler extends CSVParseHandler {
private final static Logger LOG = LoggerFactory.getLogger(SystemHandler.class);
protected SystemHandler(Market market) {
super(market);
}
@Override
protected void doWork(String[] values) {
//unq:name,pos_x,pos_y,pos_z,name@Added.added_id,modified
double x = Double.NaN, y = Double.NaN, z = Double.NaN;
try {
x = Double.valueOf(values[1]);
y = Double.valueOf(values[2]);
z = Double.valueOf(values[3]);
} catch (NumberFormatException ex){
LOG.warn("Position {}, {}, {} - is not correct", values[1], values[2], values[3]);
}
updateSystem(market, values[0], x, y, z);
}
private void updateSystem(Market market, String name, double x, double y, double z){
Place system = market.get(name);
if (system == null){
LOG.debug("{} - is new system, adding", name);
market.addPlace(name, x, y, z);
} else {
if (!Double.isNaN(x) && !Double.isNaN(y) && !Double.isNaN(z) &&
(x != system.getX() || y != system.getY() || z != system.getZ())){
system.setPosition(x, y, z);
}
}
}
}