package org.oliot.epcis_client;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.bson.BsonArray;
import org.bson.BsonBoolean;
import org.bson.BsonDocument;
import org.bson.BsonDouble;
import org.bson.BsonInt32;
import org.bson.BsonInt64;
import org.bson.BsonString;
import org.bson.BsonValue;
/**
* 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 CaptureUtil {
public BsonDocument putEventTime(BsonDocument base, Long eventTime) {
base.put("eventTime", new BsonInt64(eventTime));
return base;
}
public BsonDocument putEventTimeZoneOffset(BsonDocument base, String eventTimeZoneOffset) {
base.put("eventTimeZoneOffset", new BsonString(eventTimeZoneOffset));
return base;
}
public BsonDocument putAction(BsonDocument base, String action) {
base.put("action", new BsonString(action));
return base;
}
public BsonDocument putRecordTime(BsonDocument base, Long recordTime) {
base.put("recordTime", new BsonInt64(recordTime));
return base;
}
public BsonDocument putParentID(BsonDocument base, String parentID) {
base.put("parentID", new BsonString(parentID));
return base;
}
public BsonDocument putEPCList(BsonDocument base, List<String> epcList) {
BsonArray bsonEPCList = new BsonArray();
for (String epc : epcList) {
bsonEPCList.add(new BsonDocument("epc", new BsonString(epc)));
}
base.put("epcList", bsonEPCList);
return base;
}
public BsonDocument putChildEPCs(BsonDocument base, List<String> childEPCs) {
BsonArray bsonEPCList = new BsonArray();
for (String epc : childEPCs) {
bsonEPCList.add(new BsonDocument("epc", new BsonString(epc)));
}
base.put("childEPCs", bsonEPCList);
return base;
}
public BsonDocument putInputEPCList(BsonDocument base, List<String> inputEPCList) {
BsonArray bsonEPCList = new BsonArray();
for (String epc : inputEPCList) {
bsonEPCList.add(new BsonDocument("epc", new BsonString(epc)));
}
base.put("inputEPCList", bsonEPCList);
return base;
}
public BsonDocument putOutputEPCList(BsonDocument base, List<String> outputEPCList) {
BsonArray bsonEPCList = new BsonArray();
for (String epc : outputEPCList) {
bsonEPCList.add(new BsonDocument("epc", new BsonString(epc)));
}
base.put("outputEPCList", bsonEPCList);
return base;
}
public BsonDocument putTransformationID(BsonDocument base, String transformationID) {
base.put("transformationID", new BsonString(transformationID));
return base;
}
public BsonDocument putBizStep(BsonDocument base, String bizStep) {
base.put("bizStep", new BsonString(bizStep));
return base;
}
public BsonDocument putDisposition(BsonDocument base, String disposition) {
base.put("disposition", new BsonString(disposition));
return base;
}
public BsonDocument putReadPoint(BsonDocument base, String readPoint) {
base.put("readPoint", new BsonDocument("id", new BsonString(readPoint)));
return base;
}
public BsonDocument putBizLocation(BsonDocument base, String bizLocation) {
base.put("bizLocation", new BsonDocument("id", new BsonString(bizLocation)));
return base;
}
public BsonDocument putBizTransactionList(BsonDocument base, Map<String, List<String>> bizTransactionList) {
BsonArray bsonBizTransactionList = new BsonArray();
for (String key : bizTransactionList.keySet()) {
List<String> list = bizTransactionList.get(key);
for (String element : list) {
bsonBizTransactionList.add(new BsonDocument(key, new BsonString(element)));
}
}
base.put("bizTransactionList", bsonBizTransactionList);
return base;
}
public BsonDocument putILMD(BsonDocument base, Map<String, String> namespaces,
Map<String, Map<String, Object>> ilmds) {
BsonDocument bsonILMD = new BsonDocument();
for (String nsKey : ilmds.keySet()) {
if (!namespaces.containsKey(nsKey))
continue;
bsonILMD.put("@" + nsKey, new BsonString(namespaces.get(nsKey)));
Map<String, Object> ilmdElementList = ilmds.get(nsKey);
for (String ilmdKey : ilmdElementList.keySet()) {
Object ilmdElement = ilmdElementList.get(ilmdKey);
// Convert element to BSON
BsonValue convertedILMDElement = convertToBsonValue(ilmdElement);
bsonILMD.put(nsKey + ":" + ilmdKey, convertedILMDElement);
}
}
base.put("ilmd", bsonILMD);
return base;
}
public BsonDocument putExtensions(BsonDocument base, Map<String, String> namespaces,
Map<String, Map<String, Object>> extensions) {
BsonDocument extension = new BsonDocument();
for (String nsKey : extensions.keySet()) {
if (!namespaces.containsKey(nsKey))
continue;
extension.put("@" + nsKey, new BsonString(namespaces.get(nsKey)));
Map<String, Object> extensionList = extensions.get(nsKey);
for (String extensionKey : extensionList.keySet()) {
Object extensionElement = extensionList.get(extensionKey);
// Convert element to BSON
BsonValue convertedExtensionElement = convertToBsonValue(extensionElement);
extension.put(nsKey + ":" + extensionKey, convertedExtensionElement);
}
}
base.put("any", extension);
return base;
}
public BsonDocument putQuantityList(BsonDocument base, List<QuantityElement> quantityList) {
BsonArray quantityArray = new BsonArray();
for (QuantityElement quantityElement : quantityList) {
BsonDocument bsonQuantityElement = new BsonDocument("epcClass",
new BsonString(quantityElement.getEpcClass()));
if (quantityElement.getQuantity() != null) {
bsonQuantityElement.put("quantity", new BsonDouble(quantityElement.getQuantity()));
}
if (quantityElement.getUom() != null) {
bsonQuantityElement.put("uom", new BsonString(quantityElement.getUom()));
}
quantityArray.add(bsonQuantityElement);
}
base.put("quantityList", quantityArray);
return base;
}
public BsonDocument putChildQuantityList(BsonDocument base, List<QuantityElement> childQuantityList) {
BsonArray quantityArray = new BsonArray();
for (QuantityElement quantityElement : childQuantityList) {
BsonDocument bsonQuantityElement = new BsonDocument("epcClass",
new BsonString(quantityElement.getEpcClass()));
if (quantityElement.getQuantity() != null) {
bsonQuantityElement.put("quantity", new BsonDouble(quantityElement.getQuantity()));
}
if (quantityElement.getUom() != null) {
bsonQuantityElement.put("uom", new BsonString(quantityElement.getUom()));
}
quantityArray.add(bsonQuantityElement);
}
base.put("childQuantityList", quantityArray);
return base;
}
public BsonDocument putInputQuantityList(BsonDocument base, List<QuantityElement> inputQuantityList) {
BsonArray quantityArray = new BsonArray();
for (QuantityElement quantityElement : inputQuantityList) {
BsonDocument bsonQuantityElement = new BsonDocument("epcClass",
new BsonString(quantityElement.getEpcClass()));
if (quantityElement.getQuantity() != null) {
bsonQuantityElement.put("quantity", new BsonDouble(quantityElement.getQuantity()));
}
if (quantityElement.getUom() != null) {
bsonQuantityElement.put("uom", new BsonString(quantityElement.getUom()));
}
quantityArray.add(bsonQuantityElement);
}
base.put("inputQuantityList", quantityArray);
return base;
}
public BsonDocument putOutputQuantityList(BsonDocument base, List<QuantityElement> outputQuantityList) {
BsonArray quantityArray = new BsonArray();
for (QuantityElement quantityElement : outputQuantityList) {
BsonDocument bsonQuantityElement = new BsonDocument("epcClass",
new BsonString(quantityElement.getEpcClass()));
if (quantityElement.getQuantity() != null) {
bsonQuantityElement.put("quantity", new BsonDouble(quantityElement.getQuantity()));
}
if (quantityElement.getUom() != null) {
bsonQuantityElement.put("uom", new BsonString(quantityElement.getUom()));
}
quantityArray.add(bsonQuantityElement);
}
base.put("outputQuantityList", quantityArray);
return base;
}
public BsonDocument putSourceList(BsonDocument base, Map<String, List<String>> sourceList) {
BsonArray bsonSourceList = new BsonArray();
for (String key : sourceList.keySet()) {
List<String> sourceArrayList = sourceList.get(key);
for (String source : sourceArrayList) {
BsonDocument bsonSource = new BsonDocument(key, new BsonString(source));
bsonSourceList.add(bsonSource);
}
}
base.put("sourceList", bsonSourceList);
return base;
}
public BsonDocument putDestinationList(BsonDocument base, Map<String, List<String>> destinationList) {
BsonArray bsonDestinationList = new BsonArray();
for (String key : destinationList.keySet()) {
List<String> destinationArrayList = destinationList.get(key);
for (String destination : destinationArrayList) {
BsonDocument bsonDestination = new BsonDocument(key, new BsonString(destination));
bsonDestinationList.add(bsonDestination);
}
}
base.put("destinationList", bsonDestinationList);
return base;
}
public BsonDocument putType(BsonDocument base, VocabularyType type) {
base.put("type", new BsonString(type.getVocabularyType()));
return base;
}
public BsonDocument putID(BsonDocument base, String id) {
base.put("id", new BsonString(id));
return base;
}
public BsonDocument putAttributes(BsonDocument base, Map<String, String> attributes) {
BsonDocument bsonAttributes = new BsonDocument();
for (String key : attributes.keySet()) {
String value = attributes.get(key);
bsonAttributes.put(encodeMongoObjectKey(key), new BsonString(value));
}
base.put("attributes", bsonAttributes);
return base;
}
public BsonDocument putChildren(BsonDocument base, List<String> children) {
BsonArray bsonChildren = new BsonArray();
for (String child : children) {
bsonChildren.add(new BsonString(child));
}
base.put("children", bsonChildren);
return base;
}
public String encodeMongoObjectKey(String key) {
key = key.replace(".", "\uff0e");
return key;
}
private BsonValue convertToBsonValue(Object o) {
BsonValue value;
if (o instanceof Integer) {
// Integer
value = new BsonInt32((Integer) o);
} else if (o instanceof Long) {
// Long
value = new BsonInt64((Long) o);
} else if (o instanceof Double) {
// Double
value = new BsonDouble((Double) o);
} else if (o instanceof Boolean) {
// Boolean
value = new BsonBoolean((Boolean) o);
} else if (o instanceof List<?>) {
BsonArray arr = new BsonArray();
@SuppressWarnings("unchecked")
Iterator<Object> it = ((List<Object>) o).iterator();
while (it.hasNext()) {
arr.add(convertToBsonValue(it.next()));
}
value = arr;
} else if (o instanceof Map) {
BsonDocument document = new BsonDocument();
@SuppressWarnings("unchecked")
Map<Object, Object> map = (Map<Object, Object>) o;
Iterator<Object> it = map.keySet().iterator();
while (it.hasNext()) {
String key = it.next().toString();
document.put(key, convertToBsonValue(map.get(key)));
}
value = document;
} else {
value = new BsonString(o.toString());
}
return value;
}
}