package org.oliot.epcis.service.capture.mongodb;
import java.util.HashMap;
import java.util.List;
import org.bson.BsonBoolean;
import org.bson.BsonDocument;
import org.bson.BsonString;
import org.oliot.epcis.configuration.Configuration;
import org.oliot.epcis.converter.mongodb.AggregationEventWriteConverter;
import org.oliot.epcis.converter.mongodb.MasterDataWriteConverter;
import org.oliot.epcis.converter.mongodb.ObjectEventWriteConverter;
import org.oliot.epcis.converter.mongodb.QuantityEventWriteConverter;
import org.oliot.epcis.converter.mongodb.TransactionEventWriteConverter;
import org.oliot.epcis.converter.mongodb.TransformationEventWriteConverter;
import org.oliot.epcis.service.subscription.TriggerEngine;
import org.oliot.model.epcis.AggregationEventType;
import org.oliot.model.epcis.EPCISEventListExtensionType;
import org.oliot.model.epcis.ObjectEventType;
import org.oliot.model.epcis.QuantityEventType;
import org.oliot.model.epcis.TransactionEventType;
import org.oliot.model.epcis.TransformationEventType;
import org.oliot.model.epcis.VocabularyType;
import com.mongodb.MongoBulkWriteException;
import com.mongodb.client.MongoCollection;
/**
* Copyright (C) 2014-2016 Jaewook Byun
*
* This project is part of Oliot open source (http://oliot.org). Oliot EPCIS
* v1.2.x is Java Web Service complying with Electronic Product Code Information
* Service (EPCIS) v1.2.
*
* @author Jaewook 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 MongoCaptureUtil {
public HashMap<String, Object> capture(List<BsonDocument> bsonDocumentList) {
HashMap<String, Object> retMsg = new HashMap<String, Object>();
MongoCollection<BsonDocument> collection = Configuration.mongoDatabase.getCollection("EventData",
BsonDocument.class);
try {
collection.insertMany(bsonDocumentList);
} catch (MongoBulkWriteException e) {
retMsg.put("error", e.getMessage());
return retMsg;
}
retMsg.put("eventCaptured", bsonDocumentList.size());
return retMsg;
}
public BsonDocument convert(Object event, String userID, String accessModifier, Integer gcpLength) {
BsonDocument object2Save = null;
String type = null;
if (event instanceof AggregationEventType) {
type = "AggregationEvent";
AggregationEventWriteConverter wc = new AggregationEventWriteConverter();
object2Save = wc.convert((AggregationEventType) event, gcpLength);
} else if (event instanceof ObjectEventType) {
type = "ObjectEvent";
ObjectEventWriteConverter wc = new ObjectEventWriteConverter();
object2Save = wc.convert((ObjectEventType) event, gcpLength);
} else if (event instanceof QuantityEventType) {
type = "QuantityEvent";
QuantityEventWriteConverter wc = new QuantityEventWriteConverter();
object2Save = wc.convert((QuantityEventType) event, gcpLength);
} else if (event instanceof TransactionEventType) {
type = "TransactionEvent";
TransactionEventWriteConverter wc = new TransactionEventWriteConverter();
object2Save = wc.convert((TransactionEventType) event, gcpLength);
} else if (event instanceof EPCISEventListExtensionType) {
type = "TransformationEvent";
TransformationEventWriteConverter wc = new TransformationEventWriteConverter();
object2Save = wc.convert(((EPCISEventListExtensionType) event).getTransformationEvent(), gcpLength);
}
if (object2Save == null)
return null;
if (Configuration.isTriggerSupported == true) {
TriggerEngine.examineAndFire(type, object2Save);
}
if (userID != null && accessModifier != null) {
object2Save.put("userID", new BsonString(userID));
object2Save.put("accessModifier", new BsonString(accessModifier));
}
return object2Save;
}
public String capture(Object event, String userID, String accessModifier, Integer gcpLength) {
MongoCollection<BsonDocument> collection = Configuration.mongoDatabase.getCollection("EventData",
BsonDocument.class);
BsonDocument object2Save = null;
String type = null;
if (event instanceof AggregationEventType) {
type = "AggregationEvent";
AggregationEventWriteConverter wc = new AggregationEventWriteConverter();
object2Save = wc.convert((AggregationEventType) event, gcpLength);
} else if (event instanceof ObjectEventType) {
type = "ObjectEvent";
ObjectEventWriteConverter wc = new ObjectEventWriteConverter();
object2Save = wc.convert((ObjectEventType) event, gcpLength);
} else if (event instanceof QuantityEventType) {
type = "QuantityEvent";
QuantityEventWriteConverter wc = new QuantityEventWriteConverter();
object2Save = wc.convert((QuantityEventType) event, gcpLength);
} else if (event instanceof TransactionEventType) {
type = "TransactionEvent";
TransactionEventWriteConverter wc = new TransactionEventWriteConverter();
object2Save = wc.convert((TransactionEventType) event, gcpLength);
} else if (event instanceof TransformationEventType) {
type = "TransformationEvent";
TransformationEventWriteConverter wc = new TransformationEventWriteConverter();
object2Save = wc.convert((TransformationEventType) event, gcpLength);
}
if (object2Save == null)
return null;
if (Configuration.isTriggerSupported == true) {
TriggerEngine.examineAndFire(type, object2Save);
}
if (userID != null && accessModifier != null) {
object2Save.put("userID", new BsonString(userID));
object2Save.put("accessModifier", new BsonString(accessModifier));
}
collection.insertOne(object2Save);
Configuration.logger.info(" Event Saved ");
/*
* if (!object2Save.containsKey("errorDeclaration")) { if (userID !=
* null && accessModifier != null) { object2Save.put("userID", new
* BsonString(userID)); object2Save.put("accessModifier", new
* BsonString(accessModifier)); } collection.insertOne(object2Save);
* Configuration.logger.info(" Event Saved "); } else { // Error
* Declaration Mechanism BsonDocument filter = object2Save.clone(); //
* Make 'otherwise identical' event filter filter =
* makeOtherwiseIdenticalFilter(filter); boolean isReplacing =
* replaceErroneousEvents(collection, filter, object2Save); if
* (isReplacing == true) { Configuration.logger.info(
* " Error Declaration succeed"); } else { Configuration.logger.info(
* " Error Declaration failed"); return
* "[ERROR] Error Declaration failed"; } }
*/
return null;
}
@SuppressWarnings("unused")
private BsonDocument makeOtherwiseIdenticalFilter(BsonDocument filter) {
filter.remove("errorDeclaration");
filter.put("errorDeclaration", new BsonDocument("$exists", new BsonBoolean(false)));
filter.remove("recordTime");
return filter;
}
@SuppressWarnings("unused")
private boolean replaceErroneousEvents(MongoCollection<BsonDocument> collection, BsonDocument filter,
BsonDocument object2Save) {
boolean isReplacing = false;
while (true) {
Object result = collection.findOneAndReplace(filter, object2Save);
if (result == null)
break;
else {
isReplacing = true;
}
}
return isReplacing;
}
public String capture(VocabularyType vocabulary, String userID, String accessModifier, Integer gcpLength) {
MasterDataWriteConverter mdConverter = new MasterDataWriteConverter();
if (mdConverter.capture(vocabulary, gcpLength) != 0) {
return "[ERROR] Vocabulary Capture Failed";
} else {
return null;
}
}
}