diff --git a/utils/pom.xml b/utils/pom.xml index 28eb071..4f47e59 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -60,6 +60,11 @@ org.zeromq jzmq + + net.sf.opencsv + opencsv + 2.3 + diff --git a/utils/src/main/java/ru/trader/maddavo/CSVParseHandler.java b/utils/src/main/java/ru/trader/maddavo/CSVParseHandler.java new file mode 100644 index 0000000..d9a4444 --- /dev/null +++ b/utils/src/main/java/ru/trader/maddavo/CSVParseHandler.java @@ -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); +} diff --git a/utils/src/main/java/ru/trader/maddavo/ParseHandler.java b/utils/src/main/java/ru/trader/maddavo/ParseHandler.java new file mode 100644 index 0000000..c13df81 --- /dev/null +++ b/utils/src/main/java/ru/trader/maddavo/ParseHandler.java @@ -0,0 +1,8 @@ +package ru.trader.maddavo; + +import java.io.IOException; + +public interface ParseHandler { + + public void parse(String str) throws IOException; +} diff --git a/utils/src/main/java/ru/trader/maddavo/StationHandler.java b/utils/src/main/java/ru/trader/maddavo/StationHandler.java new file mode 100644 index 0000000..dcb844f --- /dev/null +++ b/utils/src/main/java/ru/trader/maddavo/StationHandler.java @@ -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 adding = new ArrayList<>(); + Collection 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 addServices, Collection 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); + } +} diff --git a/utils/src/main/java/ru/trader/maddavo/SystemHandler.java b/utils/src/main/java/ru/trader/maddavo/SystemHandler.java new file mode 100644 index 0000000..b70c8fc --- /dev/null +++ b/utils/src/main/java/ru/trader/maddavo/SystemHandler.java @@ -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); + } + } + } +} diff --git a/utils/src/test/java/ru/trader/maddavo/StationImportTest.java b/utils/src/test/java/ru/trader/maddavo/StationImportTest.java new file mode 100644 index 0000000..5b7f4a6 --- /dev/null +++ b/utils/src/test/java/ru/trader/maddavo/StationImportTest.java @@ -0,0 +1,134 @@ +package ru.trader.maddavo; + +import org.junit.Assert; +import org.junit.Test; +import ru.trader.core.Market; +import ru.trader.core.Place; +import ru.trader.core.SERVICE_TYPE; +import ru.trader.core.Vendor; +import ru.trader.store.simple.SimpleMarket; + +import java.util.Collection; + +public class StationImportTest extends Assert { + + private static final String CSVStrings = + "'1 GEMINORUM','Collins Settlement',2585,'?','M','Y','N','2015-02-27 04:50:41'\n" + + "'1 GEMINORUM','Zholobov Orbital',3428,'?','M','N','N','2015-02-27 04:51:21'\n" + + "'1 HYDRAE','Arber Terminal',0,'?','M','N','N','2015-02-27 04:54:28'\n" + + "'1 HYDRAE','Feustel Port',null,'?','-','N','Y','2015-02-27 04:54:46'\n" + + "'1 HYDRAE','Hieb Orbital',160,'?','M','Y','N','2015-02-27 04:52:17'\n" + + "'1 HYDRAE','Afanasyev Port',200,'?','M','Y','N','2015-02-27 04:52:55'\n" + + "'1 HYDRAE','Hutton Port',279,'?','L','Y','Y','2015-02-27 04:53:31'\n" + + "'1 HYDRAE','Yurchikhin Port',369,'?','M','N','N','2015-02-27 04:54:08'\n" + + "'1 HYDRAE','Voss Hub',823,'Y','L','Y','Y','2015-02-27 04:55:18'\n" + + "'1 HYDRAE','Hornby Dock',1457,'?','L','Y','Y','2015-02-27 04:55:56'\n" + + "'1 HYDRAE','Whitney Station',2106,'?','M','N','N','2015-02-27 04:56:35'\n" + + "'1 I CENTAURI','Armstrong Ring',1093,'?','L','Y','Y','2015-02-27 04:57:33'\n" + + "'1 I CENTAURI','Ampere Dock',1498,'Y','L','Y','Y','2015-02-25 01:31:54'\n" + + "'1 KAPPA CYGNI','Hauck Enterprise',0,'?','M','?','?','2015-02-23 23:54:35'\n" + + "'1 KAPPA CYGNI','Kinsey Ring',0,'?','M','Y','?','2015-02-24 14:31:52'\n" + + "'1 KAPPA CYGNI','Wohler Port',0,'?','L','?','?','2015-02-23 23:54:35'\n" + + "'10 CANUM VENATICORUM','Litke Port',0,'?','M','Y','?','2015-02-23 23:54:35'\n" + + "'10 CANUM VENATICORUM','Collins Port',16,'?','M','Y','?','2015-02-23 23:54:35'\n" + + "'10 CANUM VENATICORUM','He Port',495,'?','L','Y','?','2015-02-23 23:54:35'\n" + + "'10 CANUM VENATICORUM','Trevithick Hub',957,'N','L','N','N','2015-02-25 01:31:54'\n" + + "'10 CANUM VENATICORUM','Spedding Park',1369,'?','M','?','?','2015-02-23 23:54:35'\n" + + "'10 CANUM VENATICORUM','Creamer Hub',1812,'?','M','?','?','2015-02-23 23:54:35'\n" + + "'10 G. CANIS MAJORIS','Rushd Enterprise',0,'?','L','Y','Y','2015-02-27 05:01:06'"; + + private static final String[] lines = CSVStrings.split("\\n"); + + private Market createMarket(){ + Market market = new SimpleMarket(); + market.addPlace("1 Hydrae",0,0,0); + market.addPlace("1 Kappa Cygni",0,0,0); + Place system = market.addPlace("10 CANUM VENATICORUM", 0, 0, 0); + Vendor station = system.addVendor("Trevithick Hub"); + station.setDistance(2000); + station.add(SERVICE_TYPE.MARKET); + station.add(SERVICE_TYPE.BLACK_MARKET); + station.add(SERVICE_TYPE.OUTFIT); + station.add(SERVICE_TYPE.MEDIUM_LANDPAD); + + station = system.addVendor("Litke Port"); + station.setDistance(2000); + station.add(SERVICE_TYPE.BLACK_MARKET); + station.add(SERVICE_TYPE.OUTFIT); + station.add(SERVICE_TYPE.SHIPYARD); + + + system = market.addPlace("Test sys", 0, 0, 0); + system.addVendor("Test stat"); + + return market; + } + + @Test + public void testImport() throws Exception { + Market market = createMarket(); + StationHandler handler = new StationHandler(market); + for (String line : lines) { + handler.parse(line); + } + + Collection vendors = market.getVendors(); + assertEquals("Vendors count distinct", 19, vendors.size()); + + Vendor station = market.get("1 Hydrae").get("Hieb Orbital"); + assertNotNull(station); + assertEquals(160, station.getDistance(), 0.00001); + assertFalse(station.has(SERVICE_TYPE.BLACK_MARKET)); + assertTrue(station.has(SERVICE_TYPE.MEDIUM_LANDPAD)); + assertFalse(station.has(SERVICE_TYPE.LARGE_LANDPAD)); + assertTrue(station.has(SERVICE_TYPE.MARKET)); + assertFalse(station.has(SERVICE_TYPE.SHIPYARD)); + assertFalse(station.has(SERVICE_TYPE.OUTFIT)); + assertFalse(station.has(SERVICE_TYPE.MUNITION)); + + station = market.get("1 Hydrae").get("Voss Hub"); + assertNotNull(station); + assertEquals(823, station.getDistance(), 0.00001); + assertTrue(station.has(SERVICE_TYPE.BLACK_MARKET)); + assertTrue(station.has(SERVICE_TYPE.MEDIUM_LANDPAD)); + assertTrue(station.has(SERVICE_TYPE.LARGE_LANDPAD)); + assertTrue(station.has(SERVICE_TYPE.MARKET)); + assertTrue(station.has(SERVICE_TYPE.SHIPYARD)); + assertFalse(station.has(SERVICE_TYPE.OUTFIT)); + assertFalse(station.has(SERVICE_TYPE.MUNITION)); + + station = market.get("1 Hydrae").get("Feustel Port"); + assertNotNull(station); + assertEquals(0, station.getDistance(), 0.00001); + assertFalse(station.has(SERVICE_TYPE.BLACK_MARKET)); + assertFalse(station.has(SERVICE_TYPE.MEDIUM_LANDPAD)); + assertFalse(station.has(SERVICE_TYPE.LARGE_LANDPAD)); + assertFalse(station.has(SERVICE_TYPE.MARKET)); + assertTrue(station.has(SERVICE_TYPE.SHIPYARD)); + assertFalse(station.has(SERVICE_TYPE.OUTFIT)); + assertFalse(station.has(SERVICE_TYPE.MUNITION)); + + station = market.get("10 CANUM VENATICORUM").get("Trevithick Hub"); + assertNotNull(station); + assertEquals(957, station.getDistance(), 0.00001); + assertFalse(station.has(SERVICE_TYPE.BLACK_MARKET)); + assertTrue(station.has(SERVICE_TYPE.MEDIUM_LANDPAD)); + assertTrue(station.has(SERVICE_TYPE.LARGE_LANDPAD)); + assertFalse(station.has(SERVICE_TYPE.MARKET)); + assertFalse(station.has(SERVICE_TYPE.SHIPYARD)); + assertTrue(station.has(SERVICE_TYPE.OUTFIT)); + assertFalse(station.has(SERVICE_TYPE.MUNITION)); + + station = market.get("10 CANUM VENATICORUM").get("Litke Port"); + assertNotNull(station); + assertEquals(2000, station.getDistance(), 0.00001); + assertTrue(station.has(SERVICE_TYPE.BLACK_MARKET)); + assertTrue(station.has(SERVICE_TYPE.MEDIUM_LANDPAD)); + assertFalse(station.has(SERVICE_TYPE.LARGE_LANDPAD)); + assertTrue(station.has(SERVICE_TYPE.MARKET)); + assertTrue(station.has(SERVICE_TYPE.SHIPYARD)); + assertTrue(station.has(SERVICE_TYPE.OUTFIT)); + assertFalse(station.has(SERVICE_TYPE.MUNITION)); + + } +} diff --git a/utils/src/test/java/ru/trader/maddavo/SystemImportTest.java b/utils/src/test/java/ru/trader/maddavo/SystemImportTest.java new file mode 100644 index 0000000..ba60f9e --- /dev/null +++ b/utils/src/test/java/ru/trader/maddavo/SystemImportTest.java @@ -0,0 +1,61 @@ +package ru.trader.maddavo; + +import org.junit.Assert; +import org.junit.Test; +import ru.trader.core.Market; +import ru.trader.core.Place; +import ru.trader.store.simple.SimpleMarket; + +import java.util.Collection; + +public class SystemImportTest extends Assert { + + private static final String CSVStrings = + "'DJOWENET',37.6875,-23.96875,117.0,'Gamma','2014-11-27 11:33:44'\n" + + "'DJUHTI',-6.8125,92.65625,24.8125,'Gamma','2014-11-27 11:33:44'\n" + + "'DJUHTY',-17.84375,-131.375,-32.1875,'Gamma','2014-11-27 11:33:44'\n" + + "'DK LEONIS',24.90625,61.15625,-36.1875,'Gamma','2014-11-27 11:33:44'\n" + + "'DK URSAE MAJORIS',-48.96875,66.03125,-63.9375,'Gamma','2014-11-27 11:33:44'\n" + + "'DN DRACONIS',-27.09375,21.625,0.78125,'Beta1','2014-10-21 17:16:31'\n" + + "'DO CANUM VENATICORUM',-28.125,80.375,-22.03125,'Release 1.00-EDStar','2015-01-12 15:20:07'\n" + + "'DOBUNN',-55.25,5.25,118.5625,'Gamma','2014-11-27 11:33:44'\n" + + "'DOCLEACHI',76.96875,-2.9375,21.15625,'Gamma','2014-11-27 11:33:44'\n" + + "'DOGONEJA',,,,'Gamma','2014-11-27 11:33:44'\n" + + "'DOHKWIBUR',109.71875,16.875,-95.96875,'Gamma','2014-11-27 11:33:44'"; + + private static final String[] lines = CSVStrings.split("\\n"); + + private Market createMarket(){ + Market market = new SimpleMarket(); + market.addPlace("1 Hydrae",0,0,0); + market.addPlace("Djuhty",15,20,30); + market.addPlace("DOGONEJA",15,20,30); + + return market; + } + + @Test + public void testImport() throws Exception { + Market market = createMarket(); + SystemHandler handler = new SystemHandler(market); + for (String line : lines) { + handler.parse(line); + } + + Collection systems = market.get(); + assertEquals("Systems count distinct", 12, systems.size()); + + Place system = market.get("Djuhty"); + assertNotNull(system); + assertEquals(system.getX(), -17.84375, 0.0); + assertEquals(system.getY(), -131.375, 0.0); + assertEquals(system.getZ(), -32.1875, 0.0); + + system = market.get("DOGONEJA"); + assertNotNull(system); + assertEquals(system.getX(), 15, 0.0); + assertEquals(system.getY(), 20, 0.0); + assertEquals(system.getZ(), 30, 0.0); + + } +}