package org.oliot.epcis_client;
import java.util.List;
import java.util.Map;
import org.bson.BsonArray;
import org.bson.BsonDateTime;
import org.bson.BsonDocument;
import org.bson.BsonDouble;
import org.bson.BsonString;
import org.bson.BsonValue;
/**
* Copyright (C) 2014-17 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 BsonDateTime(eventTime));
return base;
}
public BsonDocument putEventTimeZoneOffset(BsonDocument base, String eventTimeZoneOffset) {
base.put("eventTimeZoneOffset", new BsonString(eventTimeZoneOffset));
return base;
}
public BsonDocument putEventType(BsonDocument base, String eventType) {
base.put("eventType", new BsonString(eventType));
return base;
}
public BsonDocument putAction(BsonDocument base, String action) {
base.put("action", new BsonString(action));
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;
}
private BsonDocument convertToExtensionDocument(Map<String, String> namespaces, BsonDocument extension) {
BsonDocument ext = new BsonDocument();
for (String key : extension.keySet()) {
String[] namespaceAndKey = key.split("#");
if (namespaceAndKey.length != 2)
continue;
String namespace = namespaceAndKey[0];
if (!namespaces.containsKey(namespace))
continue;
ext.put("@" + encodeMongoObjectKey(namespace), new BsonString(namespaces.get(namespace)));
BsonValue extValue = extension.get(key);
if (extValue instanceof BsonDocument) {
ext.put(encodeMongoObjectKey(key), convertToExtensionDocument(namespaces, extValue.asDocument()));
} else {
ext.put(encodeMongoObjectKey(key), extValue);
}
}
return ext;
}
public BsonDocument putILMD(BsonDocument base, Map<String, String> namespaces, BsonDocument ilmds) {
BsonDocument bsonILMD = convertToExtensionDocument(namespaces, ilmds);
BsonDocument any = new BsonDocument();
any.put("any", bsonILMD);
base.put("ilmd", any);
return base;
}
public BsonDocument putExtensions(BsonDocument base, Map<String, String> namespaces, BsonDocument extensions) {
BsonDocument extension = convertToExtensionDocument(namespaces, extensions);
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;
}
}