package org.oliot.epcis_client;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.URL;
import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.impl.DefaultBHttpClientConnection;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.message.BasicHttpEntityEnclosingRequest;
import org.apache.http.protocol.HttpCoreContext;
import org.apache.http.protocol.HttpProcessor;
import org.apache.http.protocol.HttpProcessorBuilder;
import org.apache.http.protocol.HttpRequestExecutor;
import org.apache.http.protocol.RequestConnControl;
import org.apache.http.protocol.RequestContent;
import org.apache.http.protocol.RequestExpectContinue;
import org.apache.http.protocol.RequestTargetHost;
import org.apache.http.protocol.RequestUserAgent;
import org.bson.BsonArray;
import org.bson.BsonDocument;
/**
* Copyright (C) 2014-16 Jaewook Byun
*
* This project is part of Oliot (oliot.org), pursuing the implementation of
* Electronic Product Code Information Service(EPCIS) v1.1 specification in
* EPCglobal.
* [http://www.gs1.org/gsmp/kc/epcglobal/epcis/epcis_1_1-standard-20140520.pdf]
*
*
* @author Jaewook Jack Byun, Ph.D student
*
* Korea Advanced Institute of Science and Technology (KAIST)
*
* Real-time Embedded System Laboratory(RESL)
*
* bjw0829@kaist.ac.kr, bjw0829@gmail.com
*/
public class EPCISClient {
private URL captureURL;
private BsonDocument epcisDocument;
public EPCISClient(URL captureURL) {
this.captureURL = captureURL;
this.epcisDocument = new BsonDocument();
this.epcisDocument.put("AggregationEvent", new BsonArray());
this.epcisDocument.put("ObjectEvent", new BsonArray());
this.epcisDocument.put("TransactionEvent", new BsonArray());
this.epcisDocument.put("TransformationEvent", new BsonArray());
this.epcisDocument.put("MasterData", new BsonArray());
}
public void addAggregationEvent(AggregationEvent event) {
epcisDocument.getArray("AggregationEvent").add(event.asBsonDocument());
}
public void addObjectEvent(ObjectEvent event) {
epcisDocument.getArray("ObjectEvent").add(event.asBsonDocument());
}
public void addTransactionEvent(TransactionEvent event) {
epcisDocument.getArray("TransactionEvent").add(event.asBsonDocument());
}
public void addTransformationEvent(TransformationEvent event) {
epcisDocument.getArray("TransformationEvent").add(event.asBsonDocument());
}
public void addMasterData(MasterData masterData) {
epcisDocument.getArray("MasterData").add(masterData.asBsonDocument());
}
public void sendDocument() {
sendPost(this.captureURL, epcisDocument);
this.epcisDocument.put("AggregationEvent", new BsonArray());
this.epcisDocument.put("ObjectEvent", new BsonArray());
this.epcisDocument.put("TransactionEvent", new BsonArray());
this.epcisDocument.put("TransformationEvent", new BsonArray());
this.epcisDocument.put("MasterData", new BsonArray());
}
/**
*
* @param address
* @param port
* @param remainingURL
* start with /
* @param message
* @throws IOException
*/
private void sendPost(URL captureURL, Object obj) {
HttpProcessor httpproc = HttpProcessorBuilder.create().add(new RequestContent()).add(new RequestTargetHost())
.add(new RequestConnControl()).add(new RequestUserAgent("Test/1.1"))
.add(new RequestExpectContinue(true)).build();
HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
HttpCoreContext coreContext = HttpCoreContext.create();
HttpHost host = new HttpHost(captureURL.getHost(), captureURL.getPort());
coreContext.setTargetHost(host);
DefaultBHttpClientConnection conn = new DefaultBHttpClientConnection(8 * 1024);
ConnectionReuseStrategy connStrategy = DefaultConnectionReuseStrategy.INSTANCE;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.flush();
oos.close();
HttpEntity[] requestBodies = {
new InputStreamEntity(new ByteArrayInputStream(baos.toByteArray()), ContentType.TEXT_PLAIN) };
for (int i = 0; i < requestBodies.length; i++) {
if (!conn.isOpen()) {
Socket socket = new Socket(host.getHostName(), host.getPort());
conn.bind(socket);
}
BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST",
captureURL.getPath());
request.setEntity(requestBodies[i]);
System.out.println(">> Request URI: " + request.getRequestLine().getUri());
httpexecutor.preProcess(request, httpproc, coreContext);
HttpResponse response = httpexecutor.execute(request, conn, coreContext);
httpexecutor.postProcess(response, httpproc, coreContext);
// System.out.println("<< Response: " +
// response.getStatusLine());
// System.out.println(EntityUtils.toString(response.getEntity()));
// System.out.println("==============");
if (!connStrategy.keepAlive(response, coreContext)) {
conn.close();
} else {
// System.out.println("Connection kept alive...");
}
}
} catch (IOException e) {
} catch (HttpException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}