package gr.ntua.ivml.mint.concurrent.queue.util; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import org.bson.types.ObjectId; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.util.JSON; public class OAIRepositoryManager { private DBCollection registry; private DBCollection reports; private DBCollection conflicts; public OAIRepositoryManager(){ this.registry = MongoDB.getDB().getCollection("registry"); this.reports = MongoDB.getDB().getCollection("reports"); this.conflicts = MongoDB.getDB().getCollection("conflicts"); } public boolean itemExists(String hash, String orgName){ boolean result = false; BasicDBObject query = new BasicDBObject(); query.put("id", hash); query.put("SetSpec", orgName); BasicDBObject res = (BasicDBObject)this.registry.findOne(query); //System.out.println(res); if(res != null){ result = true; }else{ result = false; } return result; } public void deleteReportsByOrg(String orgName){ BasicDBObject query = new BasicDBObject(); query.put("orgName", orgName); this.reports.remove(query); } public void deleteDocumentsByOrg(String orgName){ BasicDBObject query = new BasicDBObject(); query.put("SetSpec", orgName); this.registry.remove(query); } public void deleteConflictedItemsByOrg(String orgName){ BasicDBObject query = new BasicDBObject(); query.put("orgName", orgName); this.conflicts.remove(query); } public String initReport(String orgName, String type, String publicationDate, String publicationId) throws ParseException{ BasicDBObject doc = new BasicDBObject(); doc.put("orgName", orgName); doc.put("type", type); doc.put("publicationId", publicationId); //doc.put(key, val); DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); java.util.Date date = new java.util.Date(); String dateTime = dateFormat.format(date); String[] dates = dateTime.split(" "); BasicDBObject times = new BasicDBObject(); times.put("date", dates[0]); times.put("time", dates[1]); doc.put("created", times); DateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date date1 = dateFormat1.parse(publicationDate); String pubDate = dateFormat1.format(date1); String[] pubDates = pubDate.split(" "); BasicDBObject pubTimes = new BasicDBObject(); pubTimes.put("date", pubDates[0]); pubTimes.put("time", pubDates[1]); doc.put("publicationDate", pubTimes); doc.put("InsertedNumber", 0); doc.put("ConflictsNumber", 0); doc.put("TotalItems", 0); this.reports.insert(doc); return doc.getString("_id"); } public void closeReport(String documentId){ ObjectId oId = new ObjectId(documentId); BasicDBObject doc = (BasicDBObject)this.reports.findOne(oId); DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); java.util.Date date = new java.util.Date(); String dateTime = dateFormat.format(date); String[] dates = dateTime.split(" "); BasicDBObject times = new BasicDBObject(); times.put("date", dates[0]); times.put("time", dates[1]); doc.put("closed", times); this.reports.save(doc); } public String fetchReport(String reportId){ String res = null; ObjectId oId = new ObjectId(reportId); BasicDBObject doc = (BasicDBObject)this.reports.findOne(oId); if(doc != null){ String name = doc.getString("orgName"); int countC = this.countConflictedItemsByOrgName(name); int countI = this.countImportedItemsByOrgName(name); this.increaseConflictedItems(reportId, countC); this.increaseInsertedItems(reportId, countI); this.increaseTotalItems(reportId, countI+countC); doc = (BasicDBObject)this.reports.findOne(oId); res = JSON.serialize(doc); } return res; } private int countImportedItemsByOrgName(String orgName){ int res = 0; BasicDBObject query = new BasicDBObject(); query.put("SetSpec", orgName); res = this.registry.find(query).count(); return res; } private int countConflictedItemsByOrgName(String orgName){ int res = 0; BasicDBObject query = new BasicDBObject(); query.put("orgName", orgName); res = this.conflicts.find(query).count(); return res; } private void increaseTotalItems(String reportId, int n){ BasicDBObject updateQuery = new BasicDBObject("$set", new BasicDBObject("TotalItems", n)); this.reports.update(new BasicDBObject("_id", new ObjectId(reportId)), updateQuery); } private void increaseConflictedItems(String reportId, int n){ BasicDBObject updateQuery = new BasicDBObject("$set", new BasicDBObject("ConflictsNumber", n)); this.reports.update(new BasicDBObject("_id", new ObjectId(reportId)), updateQuery); } private void increaseInsertedItems(String reportId, int n){ BasicDBObject updateQuery = new BasicDBObject("$set", new BasicDBObject("InsertedNumber", n)); this.reports.update(new BasicDBObject("_id", new ObjectId(reportId)), updateQuery); } public void increaseTotalItems(String reportId){ BasicDBObject updateQuery = new BasicDBObject("$inc", new BasicDBObject("TotalItems", 1)); this.reports.update(new BasicDBObject("_id", new ObjectId(reportId)), updateQuery); } public void increaseConflictedItems(String reportId){ BasicDBObject updateQuery = new BasicDBObject("$inc", new BasicDBObject("ConflictsNumber", 1)); this.reports.update(new BasicDBObject("_id", new ObjectId(reportId)), updateQuery); } public void increaseInsertedItems(String reportId){ BasicDBObject updateQuery = new BasicDBObject("$inc", new BasicDBObject("InsertedNumber", 1)); this.reports.update(new BasicDBObject("_id", new ObjectId(reportId)), updateQuery); } public void addItem(String hash, String value, String SetSpec, String prefix){ BasicDBObject doc = new BasicDBObject(); doc.put("id", hash); doc.put("value", value); doc.put("SetSpec", SetSpec); doc.put("prefix", prefix); DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); java.util.Date date = new java.util.Date(); String dateTime = dateFormat.format(date); String[] dates = dateTime.split(" "); BasicDBObject times = new BasicDBObject(); times.put("date", dates[0]); times.put("time", dates[1]); doc.put("datestamp", times); this.registry.insert(doc); } public void addConflictedItem(String hash, String reportId, String orgName){ BasicDBObject doc = new BasicDBObject(); doc.put("hash", hash); doc.put("reportId", reportId); doc.put("orgName", orgName); this.conflicts.insert(doc); } }