From 0ac740bff20fcfb912162b20c8f4c20c19eb0eb7 Mon Sep 17 00:00:00 2001 From: iMoHax Date: Wed, 5 Oct 2016 17:24:07 +0300 Subject: [PATCH] implement EDDN shipyard parser --- .../main/java/ru/trader/emdn/EMDNParser.java | 23 +++- .../java/ru/trader/emdn/entities/Body.java | 15 +++ .../java/ru/trader/emdn/entities/Ship.java | 40 +++++++ .../test/java/ru/trader/emdn/ParserTest.java | 103 ++++++++++++++++++ utils/src/test/resources/emdn/ship_v1.json | 24 ++++ utils/src/test/resources/emdn/ship_v2.json | 21 ++++ .../test/resources/emdn/shipyard-v1.0.json | 62 +++++++++++ .../test/resources/emdn/shipyard-v2.0.json | 62 +++++++++++ 8 files changed, 348 insertions(+), 2 deletions(-) create mode 100644 utils/src/main/java/ru/trader/emdn/entities/Ship.java create mode 100644 utils/src/test/resources/emdn/ship_v1.json create mode 100644 utils/src/test/resources/emdn/ship_v2.json create mode 100644 utils/src/test/resources/emdn/shipyard-v1.0.json create mode 100644 utils/src/test/resources/emdn/shipyard-v2.0.json diff --git a/utils/src/main/java/ru/trader/emdn/EMDNParser.java b/utils/src/main/java/ru/trader/emdn/EMDNParser.java index c6febba..359d639 100644 --- a/utils/src/main/java/ru/trader/emdn/EMDNParser.java +++ b/utils/src/main/java/ru/trader/emdn/EMDNParser.java @@ -44,6 +44,8 @@ public class EMDNParser { } private enum PARSERS { + V1_SHIPYARD("http://schemas.elite-markets.net/eddn/shipyard/1"), + V2_SHIPYARD("http://schemas.elite-markets.net/eddn/shipyard/2"), V1("http://schemas.elite-markets.net/eddn/commodity/1"){ @Override protected Body parseBody(JsonNode node) { @@ -191,7 +193,8 @@ public class EMDNParser { JsonNode stationName = node.get("stationName"); JsonNode timestamp = node.get("timestamp"); JsonNode commodities = node.get("commodities"); - if (systemName == null || stationName == null || timestamp == null || commodities == null){ + JsonNode ships = node.get("ships"); + if (systemName == null || stationName == null || timestamp == null || (commodities == null && ships == null)){ LOG.warn("Body EDDN message don't have required fields"); return null; } @@ -200,7 +203,12 @@ public class EMDNParser { LocalDateTime dt = LocalDateTime.parse(timestamp.asText(), DateTimeFormatter.ISO_OFFSET_DATE_TIME); Body body = new Body(starSystem, station); body.setTimestamp(dt); - body.addAll(parseCommodities(commodities)); + if (commodities != null){ + body.addAll(parseCommodities(commodities)); + } + if (ships != null){ + body.addShips(parseShips(ships)); + } return body; } @@ -235,6 +243,17 @@ public class EMDNParser { return res; } + protected Collection parseShips(JsonNode ships) { + Collection res = new ArrayList<>(); + for (Iterator iterator = ships.elements(); iterator.hasNext(); ) { + JsonNode node = iterator.next(); + String name = node.asText(); + Ship ship = new Ship(name); + res.add(ship); + } + return res; + } + private PARSERS(String schema) { this.schema = schema; } diff --git a/utils/src/main/java/ru/trader/emdn/entities/Body.java b/utils/src/main/java/ru/trader/emdn/entities/Body.java index df36ebb..2911550 100644 --- a/utils/src/main/java/ru/trader/emdn/entities/Body.java +++ b/utils/src/main/java/ru/trader/emdn/entities/Body.java @@ -9,11 +9,13 @@ public class Body { private final Station station; private LocalDateTime timestamp; private final Collection commodities; + private final Collection ships; public Body(StarSystem system, Station station) { this.system = system; this.station = station; commodities = new ArrayList<>(); + ships = new ArrayList<>(); } public StarSystem getSystem() { @@ -44,6 +46,18 @@ public class Body { commodities.addAll(items); } + public Collection getShips() { + return ships; + } + + public void add(Ship ship){ + ships.add(ship); + } + + public void addShips(Collection ships){ + this.ships.addAll(ships); + } + @Override public String toString() { return "Body{" + @@ -51,6 +65,7 @@ public class Body { ", station=" + station + ", timestamp=" + timestamp + ", commodities=" + commodities + + ", ships=" + ships + '}'; } } diff --git a/utils/src/main/java/ru/trader/emdn/entities/Ship.java b/utils/src/main/java/ru/trader/emdn/entities/Ship.java new file mode 100644 index 0000000..711f027 --- /dev/null +++ b/utils/src/main/java/ru/trader/emdn/entities/Ship.java @@ -0,0 +1,40 @@ +package ru.trader.emdn.entities; + +public class Ship { + private final String name; + private Long price; + private Long id; + + public Ship(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = price; + } + + @Override + public String toString() { + return "Ship{" + + "name='" + name + '\'' + + ", id=" + id + + ", price=" + price + + "} "; + } +} diff --git a/utils/src/test/java/ru/trader/emdn/ParserTest.java b/utils/src/test/java/ru/trader/emdn/ParserTest.java index 6125de5..da6a202 100644 --- a/utils/src/test/java/ru/trader/emdn/ParserTest.java +++ b/utils/src/test/java/ru/trader/emdn/ParserTest.java @@ -255,4 +255,107 @@ public class ParserTest extends Assert { } + @Test + public void testParseShipV1() throws Exception { + EMDNParser parser = new EMDNParser(); + + try (InputStream is = getClass().getResourceAsStream("/emdn/ship_v1.json")) { + String json = TestUtils.read(is); + Message message = parser.parse(json); + assertNotNull(message); + assertEquals("http://schemas.elite-markets.net/eddn/shipyard/1", message.getSchemaRef()); + Header header = message.getHeader(); + assertNotNull(header); + assertEquals("Marek Ce'ex", header.getUploaderId()); + assertEquals("E:D Market Connector [Mac OS]", header.getSoftwareName()); + assertEquals("2.1.6.1", header.getSoftwareVersion()); + assertEquals(LocalDateTime.of(2016, 10, 5, 13, 53, 33, 930428000), header.getGatewayTimestamp()); + Body body = message.getBody(); + assertNotNull(body); + assertEquals(LocalDateTime.of(2016, 10, 5, 13, 53, 25), body.getTimestamp()); + StarSystem system = body.getSystem(); + assertNotNull(system); + assertEquals("Venegana", system.getName()); + assertNull(system.getId()); + assertNull(system.getAddress()); + Station station = body.getStation(); + assertNotNull(station); + assertEquals("Shull Ring", station.getName()); + assertNull(station.getId()); + Collection items = body.getCommodities(); + assertNotNull(items); + assertEquals(0, items.size()); + Collection ships = body.getShips(); + assertNotNull(ships); + assertEquals(8, ships.size()); + int found = 0; + for (Ship ship : ships) { + assertNotNull(ship); + if ("Sidewinder".equals(ship.getName())){ + found++; + assertNull(ship.getId()); + assertNull(ship.getPrice()); + } else + if ("Type-7 Transporter".equals(ship.getName())){ + found++; + assertNull(ship.getId()); + assertNull(ship.getPrice()); + } + } + assertEquals("Expected ships not found", 2, found); + } + } + + + @Test + public void testParseShipV2() throws Exception { + EMDNParser parser = new EMDNParser(); + + try (InputStream is = getClass().getResourceAsStream("/emdn/ship_v2.json")) { + String json = TestUtils.read(is); + Message message = parser.parse(json); + assertNotNull(message); + assertEquals("http://schemas.elite-markets.net/eddn/shipyard/2", message.getSchemaRef()); + Header header = message.getHeader(); + assertNotNull(header); + assertEquals("Amadeus Sheperd", header.getUploaderId()); + assertEquals("E:D Market Connector [Windows]", header.getSoftwareName()); + assertEquals("2.1.7.2", header.getSoftwareVersion()); + assertEquals(LocalDateTime.of(2016, 10, 5, 13, 16, 12, 490637000), header.getGatewayTimestamp()); + Body body = message.getBody(); + assertNotNull(body); + assertEquals(LocalDateTime.of(2016, 10, 5, 13, 15, 51), body.getTimestamp()); + StarSystem system = body.getSystem(); + assertNotNull(system); + assertEquals("Sothis", system.getName()); + assertNull(system.getId()); + assertNull(system.getAddress()); + Station station = body.getStation(); + assertNotNull(station); + assertEquals("Newholm Station", station.getName()); + assertNull(station.getId()); + Collection items = body.getCommodities(); + assertNotNull(items); + assertEquals(0, items.size()); + Collection ships = body.getShips(); + assertNotNull(ships); + assertEquals(5, ships.size()); + int found = 0; + for (Ship ship : ships) { + assertNotNull(ship); + if ("SideWinder".equals(ship.getName())){ + found++; + assertNull(ship.getId()); + assertNull(ship.getPrice()); + } else + if ("Type7".equals(ship.getName())){ + found++; + assertNull(ship.getId()); + assertNull(ship.getPrice()); + } + } + assertEquals("Expected ships not found", 2, found); + } + } + } diff --git a/utils/src/test/resources/emdn/ship_v1.json b/utils/src/test/resources/emdn/ship_v1.json new file mode 100644 index 0000000..4da9943 --- /dev/null +++ b/utils/src/test/resources/emdn/ship_v1.json @@ -0,0 +1,24 @@ +{ + "header": { + "softwareVersion": "2.1.6.1", + "gatewayTimestamp": "2016-10-05T13:53:33.930428Z", + "softwareName": "E:D Market Connector [Mac OS]", + "uploaderID": "Marek Ce'ex" + }, + "$schemaRef": "http://schemas.elite-markets.net/eddn/shipyard/1", + "message": { + "systemName": "Venegana", + "ships": [ + "Sidewinder", + "Eagle", + "Asp", + "Asp Scout", + "Adder", + "Anaconda", + "Type-7 Transporter", + "Federal Gunship" + ], + "stationName": "Shull Ring", + "timestamp": "2016-10-05T13:53:25Z" + } +} \ No newline at end of file diff --git a/utils/src/test/resources/emdn/ship_v2.json b/utils/src/test/resources/emdn/ship_v2.json new file mode 100644 index 0000000..dbc81b8 --- /dev/null +++ b/utils/src/test/resources/emdn/ship_v2.json @@ -0,0 +1,21 @@ +{ + "header": { + "softwareVersion": "2.1.7.2", + "gatewayTimestamp": "2016-10-05T13:16:12.490637Z", + "softwareName": "E:D Market Connector [Windows]", + "uploaderID": "Amadeus Sheperd" + }, + "$schemaRef": "http://schemas.elite-markets.net/eddn/shipyard/2", + "message": { + "systemName": "Sothis", + "ships": [ + "Adder", + "Eagle", + "Hauler", + "SideWinder", + "Type7" + ], + "stationName": "Newholm Station", + "timestamp": "2016-10-05T13:15:51Z" + } +} \ No newline at end of file diff --git a/utils/src/test/resources/emdn/shipyard-v1.0.json b/utils/src/test/resources/emdn/shipyard-v1.0.json new file mode 100644 index 0000000..b298133 --- /dev/null +++ b/utils/src/test/resources/emdn/shipyard-v1.0.json @@ -0,0 +1,62 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "id" : "http://schemas.elite-markets.net/eddn/shipyard/1#", + "type" : "object", + "additionalProperties" : false, + "required" : [ "$schemaRef", "header", "message" ], + "properties" : { + "$schemaRef": { + "type" : "string" + }, + "header": { + "type" : "object", + "additionalProperties" : true, + "required" : [ "uploaderID", "softwareName", "softwareVersion" ], + "properties" : { + "uploaderID": { + "type" : "string" + }, + "softwareName": { + "type" : "string" + }, + "softwareVersion": { + "type" : "string" + }, + "gatewayTimestamp": { + "type" : "string", + "format" : "date-time", + "description" : "Timestamp upon receipt at the gateway. If present, this property will be overwritten by the gateway; submitters are not intended to populate this property." + } + } + }, + "message": { + "type" : "object", + + "additionalProperties" : false, + "required" : [ "systemName", "stationName", "timestamp", "ships" ], + "properties" : { + "systemName": { + "type" : "string", + "minLength" : 1 + }, + "stationName": { + "type" : "string", + "minLength" : 1 + }, + "timestamp": { + "type" : "string", + "format" : "date-time" + }, + "ships": { + "type" : "array", + "uniqueItems" : true, + "items" : { + "type" : "string", + "minLength" : 1, + "description" : "Ship name in English as displayed in-game. i.e. one of: Adder, Anaconda, Asp, Asp Scout, Cobra Mk III, Cobra MkIV, DiamondBack Scout, Diamondback Explorer, Eagle, Federal Assault Ship, Federal Corvette, Federal Dropship, Federal Gunship, Fer-de-Lance, Hauler, Imperial Clipper, Imperial Courier, Imperial Cutter, Imperial Eagle, Keelback, Orca, Python, Sidewinder, Type-6 Transporter, Type-7 Transporter, Type-9 Heavy, Viper, Viper MkIV, Vulture" + } + } + } + } + } +} diff --git a/utils/src/test/resources/emdn/shipyard-v2.0.json b/utils/src/test/resources/emdn/shipyard-v2.0.json new file mode 100644 index 0000000..9e37313 --- /dev/null +++ b/utils/src/test/resources/emdn/shipyard-v2.0.json @@ -0,0 +1,62 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "id" : "http://schemas.elite-markets.net/eddn/shipyard/2#", + "type" : "object", + "additionalProperties" : false, + "required" : [ "$schemaRef", "header", "message" ], + "properties" : { + "$schemaRef": { + "type" : "string" + }, + "header": { + "type" : "object", + "additionalProperties" : true, + "required" : [ "uploaderID", "softwareName", "softwareVersion" ], + "properties" : { + "uploaderID": { + "type" : "string" + }, + "softwareName": { + "type" : "string" + }, + "softwareVersion": { + "type" : "string" + }, + "gatewayTimestamp": { + "type" : "string", + "format" : "date-time", + "description" : "Timestamp upon receipt at the gateway. If present, this property will be overwritten by the gateway; submitters are not intended to populate this property." + } + } + }, + "message": { + "type" : "object", + "additionalProperties" : false, + "required" : [ "systemName", "stationName", "timestamp", "ships" ], + "properties" : { + "systemName": { + "type" : "string", + "minLength" : 1 + }, + "stationName": { + "type" : "string", + "minLength" : 1 + }, + "timestamp": { + "type" : "string", + "format" : "date-time" + }, + "ships": { + "type" : "array", + "minItems" : 1, + "uniqueItems" : true, + "items" : { + "type" : "string", + "minLength" : 1, + "description" : "Ship symbolic name. i.e. one of: SideWinder, Adder, Anaconda, Asp, Asp_Scout CobraMkIII, CobraMkIV, Cutter, DiamondBack, DiamondBackXL, Eagle, Empire_Courier, Empire_Eagle, Empire_Trader, Federation_Corvette, Federation_Dropship, Federation_Dropship_MkII, Federation_Gunship, FerDeLance, Hauler, Independant_Trader, Orca, Python, Type6, Type7, Type9, Viper, Viper_MkIV, Vulture" + } + } + } + } + } +}