storage-manager-trigger/src/main/java/org/gcube/contentmanager/storageserver/parse/JsonParser.java

172 lines
6.7 KiB
Java

package org.gcube.contentmanager.storageserver.parse;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.bson.types.ObjectId;
import org.gcube.contentmanager.storageserver.accounting.Report;
import org.gcube.contentmanager.storageserver.accounting.ReportConfig;
import org.gcube.contentmanager.storageserver.accounting.ReportException;
import org.gcube.contentmanager.storageserver.accounting.ReportFactory;
import org.gcube.contentmanager.storageserver.data.CubbyHole;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mongodb.DBObject;
public class JsonParser extends Thread{
final static Logger logger=LoggerFactory.getLogger(JsonParser.class);
final static int MINUTE_DECREMENT=-2;
private CubbyHole c;
private int number;
private Report report;
private String previousInsert;
public JsonParser(CubbyHole c, int number){
this.c=c;
this.number=number;
// init the accounting report
try {
init();
} catch (ReportException e) {
throw new RuntimeException("Accounting report Exception initialization");
}
}
private void init() throws ReportException{
report=new ReportFactory().getReport(ReportConfig.ACCOUNTING_TYPE);
}
public void run() {
while(true){
DBObject x=c.get();
logger.info("Consumer #" + this.number + " got: " + x);
// retrieve object fields
DBObject obj=(DBObject)x.get("o");
String op=(String) x.get("op");
String filename=(String) obj.get("filename");
String type=(String) obj.get("type");
String name=(String) obj.get("name");
String owner=(String) obj.get("owner");
String creationTime=(String) obj.get("creationTime");
String lastAccess=null;
// logger.info("obj.get(lastAccess) "+obj.get("lastAccess"));
if(obj.get("lastAccess") != null) lastAccess=(String)obj.get("lastAccess");
// logger.info("last Access field: "+lastAccess);
String lastOperation=null;
// logger.info("obj.get(lastAccess) "+obj.get("lastOperation"));
if(obj.get("lastOperation") != null) lastOperation=(String)obj.get("lastOperation");
// logger.info("last OPERATION field: "+lastOperation);
String lastUser=null;
// logger.info("obj.get(lastUser) "+obj.get("lastUser"));
if(obj.get("lastUser") != null) lastUser=(String)obj.get("lastUser");
int linkCount=0;
// logger.info("obj.get(lastUser) "+obj.get("lastUser"));
if(obj.get("linkCount") != null) linkCount=(int)obj.get("linkCount");
// logger.info("last USER field: "+lastUser);
String delete=null;
// logger.info("obj.get(OnDeleting) "+obj.get("onDeleting"));
if(obj.get("onDeleting") != null) delete=(String)obj.get("onDeleting");
// logger.info("delete field: "+delete);
ObjectId objectId=(ObjectId)obj.get("_id");
String id = objectId.toString();
long length=-1;
if(obj.get("length")!=null) length=(long)obj.get("length");
logger.info("[recordCheck] operation: "+op+" name: "+name+" type: "+type+" path: "+filename+" length: "+length+" owner: "+owner+"\n\t cretionTime: "+creationTime+ " id: "+id+" lastOperation "+lastOperation+" lastUser: "+lastUser+" lastAccess: "+lastAccess);
if(((length >0) && ((filename!=null) || (linkCount > 0)))){
//call to the accounting library
String scope=null;
if(filename!=null)
scope=retrieveScopeFromRemoteFilePath(filename);
else{
String pathString=(String)obj.get("onScope");
scope=retrieveScopeFromRemoteFilePath(pathString);
}
if(delete!=null){
lastOperation="DELETE";
}
// operation=mappingOperationField(op, id, delete, lastAccess);
// report(op, filename, owner, creationTime, delete, id, length,scope, operation);
logger.info(" operation accounted "+lastOperation);
logger.info("\n[accountingCall] operation: "+lastOperation+"\n\t name: "+name+"\n\t type: "+type+"\n\t path: "+filename+"\n\t length: "+length+"\n\t owner: "+owner+"\n\t cretionTime: "+creationTime+"\n\t id: "+id+"\n\t scope: "+scope+"\n\t lastOperation "+lastOperation+"\n\t lastUser: "+lastUser+"\n\t lastAccess: "+lastAccess);
// }else if(op.equals("i")){
// previousInsert=id;
}else{
logger.info("operation is not accounted");
}
}
}
private void report(String op, String filename, String owner,
String creationTime, String delete, String id, long length,
String scope, String operation) {
report.init(owner, scope, creationTime);
// report.timeUpdate();
report.ultimate(owner, null, operation, length+"", filename, id);
report.send();
}
private String mappingOperationField(String op, String id, String onDeleting, String lastRead) throws ParseException {
logger.info("delete field: "+onDeleting);
if(op.equals("u")){
if((onDeleting != null) && (onDeleting.equals("true"))){
logger.info("found delete field");
return "DELETE";
}else if(lastRead !=null){
SimpleDateFormat sdf = new SimpleDateFormat("dd MM yyyy 'at' hh:mm:ss z");
Date dateLastRead = sdf.parse(lastRead);
// Calendar calendarLastRead = Calendar.getInstance();
// calendarLastRead.setTime(dateLastRead);
// calendarLastRead.set(Calendar.MINUTE, -5);
Calendar now=Calendar.getInstance();
logger.info("now: "+sdf.format(now.getTime()));
now.add(Calendar.MINUTE, MINUTE_DECREMENT);
// logger.info("now decreased -5 min: "+sdf.format(dateNow));
// logger.info("lastRead is "+sdf.format(dateLastRead)+" now,5 min decreased is"+sdf.format(dateNow));
logger.info("now decreased -5 min: "+sdf.format(now.getTime()));
logger.info("lastRead is "+sdf.format(dateLastRead)+" now,5 min decreased is"+sdf.format(now.getTime()));
if(now.getTime().compareTo(dateLastRead) < 0){
logger.info("It is a read");
return "READ";
}else{
logger.info("It isn't a read");
return "UPDATE";
}
}else
return "UPDATE";
}else if(op.equals("i")){
return "INSERT";
}else if(op.equals("d")){
return "DELETE";
}
return op;
}
private String retrieveScopeFromRemoteFilePath(String filename) {
String[] split=filename.split("/");
if(split.length>0){
String scope=null;
int i=1;
if(split[1].equals("VOLATILE")){
i=2;
}
scope="/"+split[i];
i++;
while((!split[i].equals("home")) && (!split[i].equals("public"))){
scope=scope+"/"+split[i];
i++;
}
logger.info("retieved scope: "+scope);
return scope;
}else logger.error("Scope bad format: scope not retrieved from string: "+filename);
return null;
}
}