package org.oliot.epcis.serde.mongodb; import java.util.GregorianCalendar; import java.util.HashSet; import java.util.List; import org.bson.BsonArray; import org.bson.BsonDocument; import org.bson.BsonInt64; import org.bson.BsonString; import org.oliot.epcis.configuration.Configuration; import org.oliot.epcis.service.registry.DiscoveryServiceAgent; import org.oliot.model.epcis.BusinessLocationType; import org.oliot.model.epcis.BusinessTransactionListType; import org.oliot.model.epcis.BusinessTransactionType; import org.oliot.model.epcis.DestinationListType; import org.oliot.model.epcis.EPC; import org.oliot.model.epcis.EPCISEventExtensionType; import org.oliot.model.epcis.EPCListType; import org.oliot.model.epcis.ILMDExtensionType; import org.oliot.model.epcis.ILMDType; import org.oliot.model.epcis.QuantityElementType; import org.oliot.model.epcis.QuantityListType; import org.oliot.model.epcis.ReadPointType; import org.oliot.model.epcis.SourceDestType; import org.oliot.model.epcis.SourceListType; import org.oliot.model.epcis.TransformationEventExtensionType; import org.oliot.model.epcis.TransformationEventType; import static org.oliot.epcis.serde.mongodb.MongoWriterUtil.*; /** * Copyright (C) 2014 Jaewook Jack 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 TransformationEventWriteConverter { public BsonDocument convert(TransformationEventType transformationEventType, Integer gcpLength) { BsonDocument dbo = new BsonDocument(); // Base Extension if (transformationEventType.getBaseExtension() != null) { EPCISEventExtensionType baseExtensionType = transformationEventType.getBaseExtension(); BsonDocument baseExtension = getBaseExtensionObject(baseExtensionType); dbo.put("baseExtension", baseExtension); } // Event Time if (transformationEventType.getEventTime() != null) dbo.put("eventTime", new BsonInt64(transformationEventType.getEventTime().toGregorianCalendar().getTimeInMillis())); // Event Time Zone if (transformationEventType.getEventTimeZoneOffset() != null) dbo.put("eventTimeZoneOffset", new BsonString(transformationEventType.getEventTimeZoneOffset())); // Record Time : according to M5 GregorianCalendar recordTime = new GregorianCalendar(); long recordTimeMilis = recordTime.getTimeInMillis(); dbo.put("recordTime", new BsonInt64(recordTimeMilis)); // Input EPCList if (transformationEventType.getInputEPCList() != null) { EPCListType epcs = transformationEventType.getInputEPCList(); List<EPC> epcList = epcs.getEpc(); BsonArray epcDBList = new BsonArray(); for (int i = 0; i < epcList.size(); i++) { BsonDocument epcDB = new BsonDocument(); epcDB.put("epc", new BsonString(MongoWriterUtil.getInstanceEPC(epcList.get(i).getValue(), gcpLength))); epcDBList.add(epcDB); } dbo.put("inputEPCList", epcDBList); } // Output EPCList List<EPC> outputList = null; if (transformationEventType.getOutputEPCList() != null) { EPCListType epcs = transformationEventType.getOutputEPCList(); outputList = epcs.getEpc(); BsonArray epcDBList = new BsonArray(); for (int i = 0; i < outputList.size(); i++) { BsonDocument epcDB = new BsonDocument(); epcDB.put("epc", new BsonString(MongoWriterUtil.getInstanceEPC(outputList.get(i).getValue(), gcpLength))); epcDBList.add(epcDB); } dbo.put("outputEPCList", epcDBList); } // TransformationID if (transformationEventType.getTransformationID() != null) { dbo.put("transformationID", new BsonString(transformationEventType.getTransformationID())); } // BizStep if (transformationEventType.getBizStep() != null) dbo.put("bizStep", new BsonString(transformationEventType.getBizStep())); // Disposition if (transformationEventType.getDisposition() != null) dbo.put("disposition", new BsonString(transformationEventType.getDisposition())); // ReadPoint if (transformationEventType.getReadPoint() != null) { ReadPointType readPointType = transformationEventType.getReadPoint(); BsonDocument readPoint = getReadPointObject(readPointType, gcpLength); dbo.put("readPoint", readPoint); } // BizLocation if (transformationEventType.getBizLocation() != null) { BusinessLocationType bizLocationType = transformationEventType.getBizLocation(); BsonDocument bizLocation = getBizLocationObject(bizLocationType, gcpLength); dbo.put("bizLocation", bizLocation); } // BizTransaction if (transformationEventType.getBizTransactionList() != null) { BusinessTransactionListType bizListType = transformationEventType.getBizTransactionList(); List<BusinessTransactionType> bizList = bizListType.getBizTransaction(); BsonArray bizTranList = getBizTransactionObjectList(bizList); dbo.put("bizTransactionList", bizTranList); } // Input Quantity List if (transformationEventType.getInputQuantityList() != null) { QuantityListType qetl = transformationEventType.getInputQuantityList(); List<QuantityElementType> qetList = qetl.getQuantityElement(); BsonArray quantityList = getQuantityObjectList(qetList, gcpLength); dbo.put("inputQuantityList", quantityList); } // Output Quantity List if (transformationEventType.getOutputQuantityList() != null) { QuantityListType qetl = transformationEventType.getOutputQuantityList(); List<QuantityElementType> qetList = qetl.getQuantityElement(); BsonArray quantityList = getQuantityObjectList(qetList, gcpLength); dbo.put("outputQuantityList", quantityList); } // Source List if (transformationEventType.getSourceList() != null) { SourceListType sdtl = transformationEventType.getSourceList(); List<SourceDestType> sdtList = sdtl.getSource(); BsonArray dbList = getSourceDestObjectList(sdtList, gcpLength); dbo.put("sourceList", dbList); } // Dest List if (transformationEventType.getDestinationList() != null) { DestinationListType sdtl = transformationEventType.getDestinationList(); List<SourceDestType> sdtList = sdtl.getDestination(); BsonArray dbList = getSourceDestObjectList(sdtList, gcpLength); dbo.put("destinationList", dbList); } // ILMD if (transformationEventType.getIlmd() != null) { ILMDType ilmd = transformationEventType.getIlmd(); if (ilmd.getExtension() != null) { ILMDExtensionType ilmdExtension = ilmd.getExtension(); BsonDocument map2Save = getILMDExtensionMap(ilmdExtension); if (map2Save != null) dbo.put("ilmd", map2Save); if (outputList != null) { MasterDataWriteConverter mdConverter = new MasterDataWriteConverter(); mdConverter.capture(outputList, map2Save); } } } // Vendor Extension if (transformationEventType.getAny() != null) { List<Object> objList = transformationEventType.getAny(); BsonDocument map2Save = getAnyMap(objList); if (map2Save != null && map2Save.isEmpty() == false) dbo.put("any", map2Save); } // Extension if (transformationEventType.getExtension() != null) { TransformationEventExtensionType oee = transformationEventType.getExtension(); BsonDocument extension = getTransformationEventExtensionObject(oee); dbo.put("extension", extension); } if (Configuration.isServiceRegistryReportOn == true) { HashSet<String> candidateSet = getCandidateEPCSet(transformationEventType); DiscoveryServiceAgent dsa = new DiscoveryServiceAgent(); int updatedEPCCount = dsa.registerEPC(candidateSet); Configuration.logger.info(updatedEPCCount + " EPC(s) are registered to Discovery Service"); } return dbo; } private HashSet<String> getCandidateEPCSet(TransformationEventType transformationEventType) { HashSet<String> candidateSet = new HashSet<String>(); // Input EPC List if (transformationEventType.getInputEPCList() != null) { EPCListType epcs = transformationEventType.getInputEPCList(); List<EPC> epcList = epcs.getEpc(); for (int i = 0; i < epcList.size(); i++) { candidateSet.add(epcList.get(i).getValue()); } } // Input Quantity if (transformationEventType.getInputQuantityList() != null) { if (transformationEventType.getInputEPCList() != null) { QuantityListType qetl = transformationEventType.getInputQuantityList(); List<QuantityElementType> qetList = qetl.getQuantityElement(); for (int i = 0; i < qetList.size(); i++) { QuantityElementType qet = qetList.get(i); if (qet.getEpcClass() != null) candidateSet.add(qet.getEpcClass().toString()); } } } // Output EPC List if (transformationEventType.getOutputEPCList() != null) { EPCListType epcs = transformationEventType.getOutputEPCList(); List<EPC> epcList = epcs.getEpc(); for (int i = 0; i < epcList.size(); i++) { candidateSet.add(epcList.get(i).getValue()); } } // Output Quantity if (transformationEventType.getOutputQuantityList() != null) { if (transformationEventType.getOutputQuantityList() != null) { QuantityListType qetl = transformationEventType.getOutputQuantityList(); List<QuantityElementType> qetList = qetl.getQuantityElement(); for (int i = 0; i < qetList.size(); i++) { QuantityElementType qet = qetList.get(i); if (qet.getEpcClass() != null) candidateSet.add(qet.getEpcClass().toString()); } } } return candidateSet; } }