diff --git a/utils/src/main/java/ru/trader/edce/entities/Commodity.java b/utils/src/main/java/ru/trader/edce/entities/Commodity.java index 475550c..d1569d8 100644 --- a/utils/src/main/java/ru/trader/edce/entities/Commodity.java +++ b/utils/src/main/java/ru/trader/edce/entities/Commodity.java @@ -1,6 +1,7 @@ package ru.trader.edce.entities; +import java.util.List; import java.util.Objects; public class Commodity { @@ -8,11 +9,13 @@ public class Commodity { private String name; private long buyPrice; private long sellPrice; + private long meanPrice; private int demandBracket; private int stockBracket; private long stock; private long demand; private String categoryname; + private List statusFlags; public long getId() { return id; @@ -46,6 +49,14 @@ public class Commodity { this.sellPrice = sellPrice; } + public long getMeanPrice() { + return meanPrice; + } + + public void setMeanPrice(long meanPrice) { + this.meanPrice = meanPrice; + } + public int getDemandBracket() { return demandBracket; } @@ -66,6 +77,10 @@ public class Commodity { return stockBracket != 0 ? stock : 0; } + public long getRawStock() { + return stock; + } + public void setStock(long stock) { this.stock = stock; } @@ -74,6 +89,10 @@ public class Commodity { return demandBracket != 0 ? demand : 0; } + public long getRawDemand() { + return demand; + } + public void setDemand(long demand) { this.demand = demand; } @@ -86,6 +105,14 @@ public class Commodity { this.categoryname = categoryname; } + public List getStatusFlags() { + return statusFlags; + } + + public void setStatusFlags(List statusFlags) { + this.statusFlags = statusFlags; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/utils/src/main/java/ru/trader/emdn/Sender.java b/utils/src/main/java/ru/trader/emdn/Sender.java new file mode 100644 index 0000000..ae02aa0 --- /dev/null +++ b/utils/src/main/java/ru/trader/emdn/Sender.java @@ -0,0 +1,92 @@ +package ru.trader.emdn; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.*; +import org.apache.http.protocol.HTTP; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.trader.edce.entities.EDPacket; +import ru.trader.emdn.entities.Converter; + +import java.io.IOException; + +public class Sender { + private final static Logger LOG = LoggerFactory.getLogger(Sender.class); + private final CloseableHttpClient httpClient; + private final Converter converter; + private String url; + + public Sender(String url) { + this(url, null); + } + + public Sender(String url, String proxyServer, int port) { + this(url, new HttpHost(proxyServer,port)); + } + + public Sender(String url, HttpHost proxy) { + this.url = url; + httpClient = createClient(proxy); + converter = new Converter(); + } + + private CloseableHttpClient createClient(HttpHost proxy){ + HttpClientBuilder builder = HttpClients.custom(); + if (proxy != null){ + builder.setProxy(proxy); + } + return builder.build(); + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public boolean send(EDPacket edcePack, String soft, String version){ + String json; + try { + json = converter.convertToCommodity(edcePack, soft, version); + } catch (IOException e) { + LOG.warn("Error on convert EDCE packet to EDDN:", e); + return false; + } + return send(json); + } + + + private boolean send(String json){ + HttpPost httpPost = new HttpPost(url); + try { + StringEntity stringEntity = new StringEntity(json); + httpPost.setEntity(stringEntity); + httpPost.setHeader(HTTP.CONTENT_TYPE, "application/json"); + return httpClient.execute(httpPost, new AbstractResponseHandler() { + @Override + public Boolean handleEntity(HttpEntity entity) throws IOException { + return true; + } + }); + } catch (IOException e) { + LOG.error("Error on send JSON to {}:", url); + LOG.error("", e); + return false; + } + } + + + + + public void close() throws IOException { + httpClient.close(); + } + + + +} diff --git a/utils/src/main/java/ru/trader/emdn/entities/Converter.java b/utils/src/main/java/ru/trader/emdn/entities/Converter.java new file mode 100644 index 0000000..ea2f92f --- /dev/null +++ b/utils/src/main/java/ru/trader/emdn/entities/Converter.java @@ -0,0 +1,86 @@ +package ru.trader.emdn.entities; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.trader.edce.entities.Commodity; +import ru.trader.edce.entities.EDPacket; + +import java.io.IOException; +import java.io.StringWriter; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class Converter { + private final static Logger LOG = LoggerFactory.getLogger(Converter.class); + + private final ObjectMapper mapper; + private final static ObjectMapper DEFAULT_MAPPER = new ObjectMapper(); + + public Converter() { + this(DEFAULT_MAPPER); + } + + public Converter(ObjectMapper mapper) { + this.mapper = mapper; + } + + @Nullable + public String convertToCommodity(EDPacket edce, String soft, String version) throws IOException { + if (edce.getCommander() == null || edce.getLastSystem() == null || edce.getLastStarport() == null + || edce.getLastStarport().getCommodities() == null || edce.getLastStarport().getCommodities().isEmpty()){ + return null; + } + + String uploaderId = edce.getCommander().getName(); + + StringWriter writer = new StringWriter(); + try (JsonGenerator generator = mapper.getFactory().createGenerator(writer)){ + generator.writeStartObject(); + generator.writeStringField("$schemaRef", SUPPORT_VERSIONS.V3.getSchema()); + generator.writeObjectFieldStart("header"); + generator.writeStringField("uploaderID", uploaderId); + generator.writeStringField("softwareName", soft); + generator.writeStringField("softwareVersion", version); + generator.writeEndObject(); //header + generator.writeObjectFieldStart("message"); + generator.writeStringField("systemName", edce.getLastSystem().getName()); + generator.writeStringField("stationName", edce.getLastStarport().getName()); + generator.writeStringField("timestamp", LocalDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + generator.writeArrayFieldStart("commodities"); + boolean hasMarketCommodity = false; + for (Commodity commodity : edce.getLastStarport().getCommodities()) { + if ("NonMarketable".equals(commodity.getCategoryname())) continue; + hasMarketCommodity = true; + generator.writeStartObject(); + generator.writeStringField("name", commodity.getName()); + generator.writeNumberField("meanPrice", commodity.getMeanPrice()); + generator.writeNumberField("buyPrice", commodity.getBuyPrice()); + generator.writeNumberField("stock", commodity.getRawStock()); + generator.writeNumberField("stockBracket", commodity.getStockBracket()); + generator.writeNumberField("sellPrice", commodity.getSellPrice()); + generator.writeNumberField("demand", commodity.getDemand()); + generator.writeNumberField("demandBracket", commodity.getDemandBracket()); + if (commodity.getStatusFlags() != null && !commodity.getStatusFlags().isEmpty()){ + generator.writeArrayFieldStart("statusFlags"); + for (String s : commodity.getStatusFlags()) { + generator.writeString(s); + } + generator.writeEndArray(); + } + generator.writeEndObject(); + } + if (!hasMarketCommodity) return null; + + generator.writeEndArray(); + generator.writeEndObject(); //message + generator.writeEndObject(); //root + generator.flush(); + } + + return writer.toString(); + } + +} diff --git a/utils/src/main/java/ru/trader/emdn/entities/SUPPORT_VERSIONS.java b/utils/src/main/java/ru/trader/emdn/entities/SUPPORT_VERSIONS.java index d3fa4f5..0af445d 100644 --- a/utils/src/main/java/ru/trader/emdn/entities/SUPPORT_VERSIONS.java +++ b/utils/src/main/java/ru/trader/emdn/entities/SUPPORT_VERSIONS.java @@ -9,14 +9,18 @@ public enum SUPPORT_VERSIONS { private final String schema; + public String getSchema() { + return schema; + } + private SUPPORT_VERSIONS(String schema) { this.schema = schema; } public static SUPPORT_VERSIONS getVersion(String schema){ for (SUPPORT_VERSIONS parser : SUPPORT_VERSIONS.values()) { - if (parser.schema.equals(schema)) return parser; - } - return null; + if (parser.schema.equals(schema)) return parser; } + return null; } +} \ No newline at end of file