From 77c12f6194c287be5c54ae741f336389aa054d67 Mon Sep 17 00:00:00 2001 From: iMoHax Date: Fri, 7 Oct 2016 15:54:11 +0300 Subject: [PATCH] add actual EDDN commodity/3 support --- .../ru/trader/emdn/entities/EDDNItemData.java | 5 +- .../test/java/ru/trader/emdn/ParserTest.java | 70 ++ ...commodity-v.3.json => commodity-v.3n.json} | 0 .../test/resources/emdn/commodity-v3.0.json | 106 +++ utils/src/test/resources/emdn/v3.json | 716 ++++++++++++++++++ 5 files changed, 896 insertions(+), 1 deletion(-) rename utils/src/test/resources/emdn/{commodity-v.3.json => commodity-v.3n.json} (100%) create mode 100644 utils/src/test/resources/emdn/commodity-v3.0.json create mode 100644 utils/src/test/resources/emdn/v3.json diff --git a/utils/src/main/java/ru/trader/emdn/entities/EDDNItemData.java b/utils/src/main/java/ru/trader/emdn/entities/EDDNItemData.java index e9bf3db..25bc8ec 100644 --- a/utils/src/main/java/ru/trader/emdn/entities/EDDNItemData.java +++ b/utils/src/main/java/ru/trader/emdn/entities/EDDNItemData.java @@ -71,9 +71,12 @@ public class EDDNItemData extends ItemDataBase { case V1: n = node.get("stationStock"); break; - default: + case V2: n = node.get("supply"); break; + default: + n = node.get("stock"); + break; } if (n != null && n.isNumber()){ return n.asLong(); diff --git a/utils/src/test/java/ru/trader/emdn/ParserTest.java b/utils/src/test/java/ru/trader/emdn/ParserTest.java index a181c44..4887fc9 100644 --- a/utils/src/test/java/ru/trader/emdn/ParserTest.java +++ b/utils/src/test/java/ru/trader/emdn/ParserTest.java @@ -445,4 +445,74 @@ public class ParserTest extends Assert { } } + + @Test + public void testParseV3() throws Exception { + EMDNParser parser = new EMDNParser(); + + try (InputStream is = getClass().getResourceAsStream("/emdn/v3.json")) { + String json = TestUtils.read(is); + Message message = parser.parse(json); + assertNotNull(message); + assertEquals(SUPPORT_VERSIONS.V3, message.getVersion()); + Header header = message.getHeader(); + assertNotNull(header); + assertEquals("Gorthok", header.getUploaderId()); + assertEquals("E:D Market Connector [Windows]", header.getSoftwareName()); + assertEquals("2.1.7.2", header.getSoftwareVersion()); + assertEquals(LocalDateTime.of(2016, 10, 7, 12, 40, 4, 453634000), header.getGatewayTimestamp()); + StarSystemData data = message.getImportData(); + assertNotNull(data); + assertEquals("LP 30-55", data.getName()); + Collection stations = data.getStations(); + assertNotNull(stations); + assertEquals(1, stations.size()); + StationData station = stations.iterator().next(); + assertNotNull(station); + assertEquals("Crown Platform", station.getName()); + assertEquals(LocalDateTime.of(2016, 10, 7, 12, 40, 3), station.getModifiedTime()); + Collection items = station.getCommodities(); + assertNotNull(items); + assertEquals(70, items.size()); + int found = 0; + for (ItemData item : items) { + assertNotNull(item); + if ("Insulating Membrane".equals(item.getName())){ + found++; + assertEquals(7234, item.getSellOfferPrice()); + assertEquals(24, item.getSupply()); + assertEquals(7156, item.getBuyOfferPrice()); + assertEquals(1, item.getDemand()); + assertNull(item.getId()); + assertNull(item.getGroup()); + } else + if ("Rutile".equals(item.getName())){ + found++; + assertEquals(0, item.getSellOfferPrice()); + assertEquals(0, item.getSupply()); + assertEquals(328, item.getBuyOfferPrice()); + assertEquals(11005, item.getDemand()); + assertNull(item.getId()); + assertNull(item.getGroup()); + } + } + assertEquals("Expected items not found", 2, found); + + assertNull(data.getId()); + assertNull(data.getFaction()); + assertNull(data.getGovernment()); + assertNull(data.getPower()); + assertNull(data.getPowerState()); + assertNull(station.getId()); + assertNull(station.getType()); + assertNull(station.getFaction()); + assertNull(station.getGovernment()); + assertNull(station.getEconomic()); + assertNull(station.getSubEconomic()); + assertNull(station.getServices()); + assertNull(station.getShips()); + assertNull(station.getModules()); + } + } + } diff --git a/utils/src/test/resources/emdn/commodity-v.3.json b/utils/src/test/resources/emdn/commodity-v.3n.json similarity index 100% rename from utils/src/test/resources/emdn/commodity-v.3.json rename to utils/src/test/resources/emdn/commodity-v.3n.json diff --git a/utils/src/test/resources/emdn/commodity-v3.0.json b/utils/src/test/resources/emdn/commodity-v3.0.json new file mode 100644 index 0000000..71b45f3 --- /dev/null +++ b/utils/src/test/resources/emdn/commodity-v3.0.json @@ -0,0 +1,106 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "id" : "http://schemas.elite-markets.net/eddn/commodity/3#", + "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", "commodities" ], + "properties" : { + "systemName": { + "type" : "string", + "minLength" : 1 + }, + "stationName": { + "type" : "string", + "minLength" : 1 + }, + "timestamp": { + "type" : "string", + "format" : "date-time" + }, + "commodities": { + "type" : "array", + "minItems" : 1, + "items" : { + "type" : "object", + "additionalProperties" : false, + "required" : [ "name", "meanPrice", "buyPrice", "stock", "stockBracket", "sellPrice", "demand", "demandBracket" ], + "properties" : { + "name": { + "type" : "string", + "minLength" : 1, + "description" : "Commodity name as returned by the Companion API, misspellings and all" + }, + "meanPrice": { + "type" : "integer" + }, + "buyPrice": { + "type" : "integer", + "description" : "Price to buy from the market" + }, + "stock": { + "type" : "integer" + }, + "stockBracket": { + "$ref" : "#/definitions/levelType" + }, + "sellPrice": { + "type" : "integer", + "description" : "Price to sell to the market" + }, + "demand": { + "type" : "integer" + }, + "demandBracket": { + "$ref" : "#/definitions/levelType" + }, + "statusFlags": { + "type" : "array", + "minItems" : 1, + "uniqueItems" : true, + "items" : { + "type" : "string", + "minLength" : 1 + } + } + } + } + } + } + } + }, + "definitions": { + "levelType": { + "enum" : [0, 1, 2, 3, ""], + "description" : "Note: A value of \"\" indicates that the commodity is not normally sold/purchased at this station, but is currently temporarily for sale/purchase" + } + } +} diff --git a/utils/src/test/resources/emdn/v3.json b/utils/src/test/resources/emdn/v3.json new file mode 100644 index 0000000..0241f7c --- /dev/null +++ b/utils/src/test/resources/emdn/v3.json @@ -0,0 +1,716 @@ +{ + "header": { + "softwareVersion": "2.1.7.2", + "gatewayTimestamp": "2016-10-07T12:40:04.453634Z", + "softwareName": "E:D Market Connector [Windows]", + "uploaderID": "Gorthok" + }, + "$schemaRef": "http://schemas.elite-markets.net/eddn/commodity/3", + "message": { + "commodities": [ + { + "demandBracket": 0, + "name": "Explosives", + "buyPrice": 156, + "meanPrice": 261, + "stockBracket": 2, + "demand": 1, + "sellPrice": 145, + "stock": 313 + }, + { + "demandBracket": 0, + "name": "Hydrogen Fuel", + "buyPrice": 72, + "meanPrice": 110, + "stockBracket": 2, + "demand": 1, + "sellPrice": 69, + "stock": 6440 + }, + { + "demandBracket": 3, + "name": "Hydrogen Peroxide", + "buyPrice": 0, + "meanPrice": 917, + "stockBracket": 0, + "demand": 8578, + "sellPrice": 884, + "stock": 0 + }, + { + "demandBracket": 0, + "name": "Liquid Oxygen", + "buyPrice": 102, + "meanPrice": 263, + "stockBracket": 2, + "demand": 1, + "sellPrice": 92, + "stock": 674 + }, + { + "demandBracket": 2, + "name": "Mineral Oil", + "buyPrice": 0, + "meanPrice": 181, + "stockBracket": 0, + "demand": 13577, + "sellPrice": 225, + "stock": 0 + }, + { + "demandBracket": 0, + "name": "Surface Stabilisers", + "buyPrice": 222, + "meanPrice": 467, + "stockBracket": 3, + "demand": 1, + "sellPrice": 212, + "stock": 4752 + }, + { + "demandBracket": 2, + "name": "Water", + "buyPrice": 0, + "meanPrice": 120, + "stockBracket": 0, + "demand": 2161, + "sellPrice": 110, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Clothing", + "buyPrice": 0, + "meanPrice": 285, + "stockBracket": 0, + "demand": 1160, + "sellPrice": 307, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Consumer Technology", + "buyPrice": 0, + "meanPrice": 6769, + "stockBracket": 0, + "demand": 82, + "sellPrice": 6848, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Domestic Appliances", + "buyPrice": 0, + "meanPrice": 487, + "stockBracket": 0, + "demand": 770, + "sellPrice": 611, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Animalmeat", + "buyPrice": 0, + "meanPrice": 1292, + "stockBracket": 0, + "demand": 122, + "sellPrice": 1448, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Coffee", + "buyPrice": 0, + "meanPrice": 1279, + "stockBracket": 0, + "demand": 209, + "sellPrice": 1385, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Fish", + "buyPrice": 0, + "meanPrice": 406, + "stockBracket": 0, + "demand": 590, + "sellPrice": 417, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Food Cartridges", + "buyPrice": 0, + "meanPrice": 105, + "stockBracket": 0, + "demand": 700, + "sellPrice": 184, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Fruit And Vegetables", + "buyPrice": 0, + "meanPrice": 312, + "stockBracket": 0, + "demand": 755, + "sellPrice": 307, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Grain", + "buyPrice": 0, + "meanPrice": 210, + "stockBracket": 0, + "demand": 1936, + "sellPrice": 190, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Synthetic Meat", + "buyPrice": 0, + "meanPrice": 271, + "stockBracket": 0, + "demand": 488, + "sellPrice": 208, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Tea", + "buyPrice": 0, + "meanPrice": 1467, + "stockBracket": 0, + "demand": 135, + "sellPrice": 1645, + "stock": 0 + }, + { + "demandBracket": 0, + "name": "Insulating Membrane", + "buyPrice": 7234, + "meanPrice": 7837, + "stockBracket": 2, + "demand": 1, + "sellPrice": 7156, + "stock": 24 + }, + { + "demandBracket": 0, + "name": "Polymers", + "buyPrice": 57, + "meanPrice": 171, + "stockBracket": 2, + "demand": 1, + "sellPrice": 48, + "stock": 1247 + }, + { + "demandBracket": 0, + "name": "Semiconductors", + "buyPrice": 664, + "meanPrice": 967, + "stockBracket": 2, + "demand": 1, + "sellPrice": 646, + "stock": 1680 + }, + { + "demandBracket": 0, + "name": "Superconductors", + "buyPrice": 6277, + "meanPrice": 6609, + "stockBracket": 2, + "demand": 1, + "sellPrice": 6208, + "stock": 1716 + }, + { + "demandBracket": 2, + "name": "Heliostatic Furnaces", + "buyPrice": 0, + "meanPrice": 236, + "stockBracket": 0, + "demand": 4071, + "sellPrice": 78, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Power Generators", + "buyPrice": 0, + "meanPrice": 458, + "stockBracket": 0, + "demand": 2771, + "sellPrice": 587, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Water Purifiers", + "buyPrice": 0, + "meanPrice": 258, + "stockBracket": 0, + "demand": 490, + "sellPrice": 286, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Advanced Medicines", + "buyPrice": 0, + "meanPrice": 1259, + "stockBracket": 0, + "demand": 710, + "sellPrice": 1242, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Basic Medicines", + "buyPrice": 0, + "meanPrice": 279, + "stockBracket": 0, + "demand": 666, + "sellPrice": 310, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Performance Enhancers", + "buyPrice": 0, + "meanPrice": 6816, + "stockBracket": 0, + "demand": 50, + "sellPrice": 6966, + "stock": 0 + }, + { + "demandBracket": 1, + "name": "Progenitor Cells", + "buyPrice": 0, + "meanPrice": 6779, + "stockBracket": 0, + "demand": 0, + "sellPrice": 6777, + "stock": 0 + }, + { + "demandBracket": 0, + "name": "Aluminium", + "buyPrice": 185, + "meanPrice": 340, + "stockBracket": 2, + "demand": 1, + "sellPrice": 173, + "stock": 4226 + }, + { + "demandBracket": 0, + "name": "Beryllium", + "buyPrice": 7877, + "meanPrice": 8288, + "stockBracket": 2, + "demand": 1, + "sellPrice": 7792, + "stock": 291 + }, + { + "demandBracket": 0, + "name": "Cobalt", + "buyPrice": 524, + "meanPrice": 647, + "stockBracket": 2, + "demand": 1, + "sellPrice": 503, + "stock": 2060 + }, + { + "demandBracket": 0, + "name": "Copper", + "buyPrice": 313, + "meanPrice": 481, + "stockBracket": 2, + "demand": 1, + "sellPrice": 299, + "stock": 2953 + }, + { + "demandBracket": 0, + "name": "Gallium", + "buyPrice": 4717, + "meanPrice": 5135, + "stockBracket": 2, + "demand": 1, + "sellPrice": 4664, + "stock": 419 + }, + { + "demandBracket": 0, + "name": "Gold", + "buyPrice": 9021, + "meanPrice": 9401, + "stockBracket": 2, + "demand": 1, + "sellPrice": 8925, + "stock": 168 + }, + { + "demandBracket": 0, + "name": "Indium", + "buyPrice": 5452, + "meanPrice": 5727, + "stockBracket": 2, + "demand": 1, + "sellPrice": 5392, + "stock": 3791 + }, + { + "demandBracket": 0, + "name": "Lithium", + "buyPrice": 1313, + "meanPrice": 1596, + "stockBracket": 2, + "demand": 1, + "sellPrice": 1280, + "stock": 1055 + }, + { + "demandBracket": 0, + "name": "Silver", + "buyPrice": 4422, + "meanPrice": 4775, + "stockBracket": 2, + "demand": 1, + "sellPrice": 4373, + "stock": 442 + }, + { + "demandBracket": 0, + "name": "Tantalum", + "buyPrice": 3590, + "meanPrice": 3962, + "stockBracket": 2, + "demand": 1, + "sellPrice": 3549, + "stock": 5165 + }, + { + "demandBracket": 0, + "name": "Titanium", + "buyPrice": 799, + "meanPrice": 1006, + "stockBracket": 2, + "demand": 1, + "sellPrice": 778, + "stock": 3793 + }, + { + "demandBracket": 0, + "name": "Uranium", + "buyPrice": 2332, + "meanPrice": 2705, + "stockBracket": 2, + "demand": 1, + "sellPrice": 2305, + "stock": 698 + }, + { + "demandBracket": 2, + "name": "Bauxite", + "buyPrice": 0, + "meanPrice": 120, + "stockBracket": 0, + "demand": 32326, + "sellPrice": 153, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Bertrandite", + "buyPrice": 0, + "meanPrice": 2374, + "stockBracket": 0, + "demand": 7704, + "sellPrice": 2606, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Coltan", + "buyPrice": 0, + "meanPrice": 1319, + "stockBracket": 0, + "demand": 1830, + "sellPrice": 1486, + "stock": 0 + }, + { + "demandBracket": 3, + "name": "Cryolite", + "buyPrice": 0, + "meanPrice": 2266, + "stockBracket": 0, + "demand": 19488, + "sellPrice": 2838, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Gallite", + "buyPrice": 0, + "meanPrice": 1819, + "stockBracket": 0, + "demand": 9454, + "sellPrice": 2034, + "stock": 0 + }, + { + "demandBracket": 3, + "name": "Goslarite", + "buyPrice": 0, + "meanPrice": 916, + "stockBracket": 0, + "demand": 6304, + "sellPrice": 1217, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Indite", + "buyPrice": 0, + "meanPrice": 2088, + "stockBracket": 0, + "demand": 1286, + "sellPrice": 2302, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Lepidolite", + "buyPrice": 0, + "meanPrice": 544, + "stockBracket": 0, + "demand": 3752, + "sellPrice": 631, + "stock": 0 + }, + { + "demandBracket": 3, + "name": "Lithium Hydroxide", + "buyPrice": 0, + "meanPrice": 5646, + "stockBracket": 0, + "demand": 5273, + "sellPrice": 5761, + "stock": 0 + }, + { + "demandBracket": 3, + "name": "Low Temperature Diamond", + "buyPrice": 0, + "meanPrice": 57445, + "stockBracket": 0, + "demand": 30, + "sellPrice": 57284, + "stock": 0 + }, + { + "demandBracket": 3, + "name": "Methane Clathrate", + "buyPrice": 0, + "meanPrice": 629, + "stockBracket": 0, + "demand": 13638, + "sellPrice": 555, + "stock": 0 + }, + { + "demandBracket": 3, + "name": "Painite", + "buyPrice": 0, + "meanPrice": 40508, + "stockBracket": 0, + "demand": 8, + "sellPrice": 40330, + "stock": 0 + }, + { + "demandBracket": 3, + "name": "Pyrophyllite", + "buyPrice": 0, + "meanPrice": 1565, + "stockBracket": 0, + "demand": 5426, + "sellPrice": 2011, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Rutile", + "buyPrice": 0, + "meanPrice": 299, + "stockBracket": 0, + "demand": 11005, + "sellPrice": 328, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Uraninite", + "buyPrice": 0, + "meanPrice": 836, + "stockBracket": 0, + "demand": 17489, + "sellPrice": 968, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Beer", + "buyPrice": 0, + "meanPrice": 186, + "stockBracket": 0, + "demand": 3536, + "sellPrice": 277, + "stock": 0 + }, + { + "demandBracket": 3, + "name": "Liquor", + "buyPrice": 0, + "meanPrice": 587, + "stockBracket": 0, + "demand": 1560, + "sellPrice": 1099, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Wine", + "buyPrice": 0, + "meanPrice": 260, + "stockBracket": 0, + "demand": 389, + "sellPrice": 208, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Advanced Catalysers", + "buyPrice": 0, + "meanPrice": 2947, + "stockBracket": 0, + "demand": 6948, + "sellPrice": 2953, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Hazardous Environment Suits", + "buyPrice": 0, + "meanPrice": 340, + "stockBracket": 0, + "demand": 8115, + "sellPrice": 244, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Resonating Separators", + "buyPrice": 0, + "meanPrice": 5958, + "stockBracket": 0, + "demand": 3951, + "sellPrice": 5995, + "stock": 0 + }, + { + "demandBracket": 0, + "name": "Conductive Fabrics", + "buyPrice": 344, + "meanPrice": 507, + "stockBracket": 2, + "demand": 1, + "sellPrice": 329, + "stock": 5901 + }, + { + "demandBracket": 0, + "name": "Military Grade Fabrics", + "buyPrice": 425, + "meanPrice": 708, + "stockBracket": 3, + "demand": 1, + "sellPrice": 408, + "stock": 9874 + }, + { + "demandBracket": 0, + "name": "Synthetic Fabrics", + "buyPrice": 79, + "meanPrice": 211, + "stockBracket": 2, + "demand": 1, + "sellPrice": 70, + "stock": 8668 + }, + { + "demandBracket": 0, + "name": "Biowaste", + "buyPrice": 9, + "meanPrice": 63, + "stockBracket": 2, + "demand": 1, + "sellPrice": 7, + "stock": 508 + }, + { + "demandBracket": 3, + "name": "Chemical Waste", + "buyPrice": 0, + "meanPrice": 131, + "stockBracket": 0, + "demand": 2736, + "sellPrice": 63, + "stock": 0 + }, + { + "demandBracket": 2, + "name": "Scrap", + "buyPrice": 0, + "meanPrice": 48, + "stockBracket": 0, + "demand": 2002, + "sellPrice": 67, + "stock": 0 + }, + { + "demandBracket": 3, + "name": "Non Lethal Weapons", + "buyPrice": 0, + "meanPrice": 1837, + "stockBracket": 0, + "demand": 1488, + "sellPrice": 2568, + "stock": 0 + }, + { + "demandBracket": 3, + "name": "Reactive Armour", + "buyPrice": 0, + "meanPrice": 2113, + "stockBracket": 0, + "demand": 979, + "sellPrice": 2790, + "stock": 0 + } + ], + "timestamp": "2016-10-07T12:40:03Z", + "systemName": "LP 30-55", + "stationName": "Crown Platform" + } +} \ No newline at end of file