Archived
0

implement EDDN sender of commodity

This commit is contained in:
iMoHax
2016-10-28 11:21:23 +03:00
parent 374e1d6c62
commit bb4c5bc927
4 changed files with 212 additions and 3 deletions

View File

@@ -1,6 +1,7 @@
package ru.trader.edce.entities; package ru.trader.edce.entities;
import java.util.List;
import java.util.Objects; import java.util.Objects;
public class Commodity { public class Commodity {
@@ -8,11 +9,13 @@ public class Commodity {
private String name; private String name;
private long buyPrice; private long buyPrice;
private long sellPrice; private long sellPrice;
private long meanPrice;
private int demandBracket; private int demandBracket;
private int stockBracket; private int stockBracket;
private long stock; private long stock;
private long demand; private long demand;
private String categoryname; private String categoryname;
private List<String> statusFlags;
public long getId() { public long getId() {
return id; return id;
@@ -46,6 +49,14 @@ public class Commodity {
this.sellPrice = sellPrice; this.sellPrice = sellPrice;
} }
public long getMeanPrice() {
return meanPrice;
}
public void setMeanPrice(long meanPrice) {
this.meanPrice = meanPrice;
}
public int getDemandBracket() { public int getDemandBracket() {
return demandBracket; return demandBracket;
} }
@@ -66,6 +77,10 @@ public class Commodity {
return stockBracket != 0 ? stock : 0; return stockBracket != 0 ? stock : 0;
} }
public long getRawStock() {
return stock;
}
public void setStock(long stock) { public void setStock(long stock) {
this.stock = stock; this.stock = stock;
} }
@@ -74,6 +89,10 @@ public class Commodity {
return demandBracket != 0 ? demand : 0; return demandBracket != 0 ? demand : 0;
} }
public long getRawDemand() {
return demand;
}
public void setDemand(long demand) { public void setDemand(long demand) {
this.demand = demand; this.demand = demand;
} }
@@ -86,6 +105,14 @@ public class Commodity {
this.categoryname = categoryname; this.categoryname = categoryname;
} }
public List<String> getStatusFlags() {
return statusFlags;
}
public void setStatusFlags(List<String> statusFlags) {
this.statusFlags = statusFlags;
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;

View File

@@ -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<Boolean>() {
@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();
}
}

View File

@@ -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();
}
}

View File

@@ -9,6 +9,10 @@ public enum SUPPORT_VERSIONS {
private final String schema; private final String schema;
public String getSchema() {
return schema;
}
private SUPPORT_VERSIONS(String schema) { private SUPPORT_VERSIONS(String schema) {
this.schema = schema; this.schema = schema;
} }