storage-manager-trigger/src/main/java/org/gcube/contentmanager/storageserver/store/StorageStatusOperationManag...

138 lines
5.0 KiB
Java

package org.gcube.contentmanager.storageserver.store;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
public class StorageStatusOperationManager {
DBCollection ssCollection;
Logger logger=LoggerFactory.getLogger(StorageStatusOperationManager.class);
public StorageStatusOperationManager(DBCollection ssCollection){
setSsCollection(ssCollection);
}
public void putSSRecord(String consumer, long volume, int count){
logger.debug("put ss record method");
BasicDBObject doc = new BasicDBObject("consumer", consumer)
.append("volume", volume)
.append("count", count);
DBCollection collection=getSsCollection();
logger.info("put ss record ["+ consumer+" "+volume+" "+count+" ] in collection: "+collection);
collection.insert(doc);
}
public StorageStatusObject updateUser(StorageStatusObject ssRecord, String lastOperation){
String consumer= ssRecord.getConsumer();
logger.debug("check counts and volume for user "+consumer);
StorageStatusObject oldSsr=getSSRecord(consumer);
if(oldSsr != null){
logger.debug("user already present");
int partialCount=oldSsr.getCount();
logger.info(consumer+" count found on db "+partialCount);
int count = countCalculation(ssRecord.getCount(), partialCount, lastOperation);
ssRecord.setCount(count);
long partialVolume=oldSsr.getVolume();
logger.info(consumer+" volume found on db "+partialVolume);
long volume = volumeCalculation(ssRecord.getVolume(), partialVolume, lastOperation);
ssRecord.setVolume(volume);
final BasicDBObject query = new BasicDBObject("consumer", consumer);
// Creating BasicDBObjectBuilder object without arguments
DBObject documentBuilder = BasicDBObjectBuilder.start().add("volume", volume).add("count", count).get();
// get the dbobject from builder and Inserting document
getSsCollection().update(query,new BasicDBObject("$set", documentBuilder), true, false);
}else{
logger.debug("user not present on db");
putSSRecord(consumer, ssRecord.getVolume(), ssRecord.getCount());
}
return ssRecord;
}
public StorageStatusObject overwriteUser(String consumer, String count, String volume){
StorageStatusObject oldSsr=getSSRecord(consumer);
final BasicDBObject query = new BasicDBObject("consumer", consumer);
// Creating BasicDBObjectBuilder object without arguments
DBObject documentBuilder = BasicDBObjectBuilder.start()
.add("volume", volume).add("count", count).get();
// get the dbobject from builder and Inserting document
getSsCollection().update(query,new BasicDBObject("$set", documentBuilder), true, false);
StorageStatusObject newSsr=getSSRecord(consumer);
return newSsr;
}
public StorageStatusObject getSSRecord(String consumer){
BasicDBObject query = new BasicDBObject("consumer", consumer);
DBCursor cursor=getSsCollection().find(query);
DBObject obj=null;
try{
if(cursor.hasNext()){
obj=cursor.next();
}
}finally{
cursor.close();
}
if(obj!=null){
String cons=null;
if(obj.containsField("consumer")) cons=(String) obj.get("consumer");
else logger.error("incomplete record found. consumer field is missing");
long vol =0;
if(obj.containsField("volume")) vol=(long) obj.get("volume");
else logger.error("incomplete record found. volume field is missing");
int count=0;
if(obj.containsField("count")) count=(int) obj.get("count");
else logger.error("incomplete record found. count field is missing");
String id=(String)obj.get("id");
return new StorageStatusObject(id, cons, vol, count, obj);
}else{
return null;
}
}
private long volumeCalculation(long currentVolume, long partialVolume, String operation) {
logger.info("accounting: operation "+operation+" total Volume "+partialVolume+" current volume "+currentVolume);
if(operation.equalsIgnoreCase("UPLOAD") || operation.equalsIgnoreCase("COPY") || operation.equalsIgnoreCase("SOFT_COPY")){
partialVolume=partialVolume+currentVolume;
}else if(operation.equalsIgnoreCase("DELETE")){
partialVolume=partialVolume-currentVolume;
}
logger.info("new volume "+partialVolume);
return partialVolume;
}
private int countCalculation(int current, int partial, String operation) {
// int partial=Integer.parseInt(partialCount);
// int current=Integer.parseInt(currentCount);
logger.info("accounting: operation "+operation+" old count "+partial+" current count"+current);
if(operation.equalsIgnoreCase("UPLOAD")|| operation.equalsIgnoreCase("COPY") || operation.equalsIgnoreCase("SOFT_COPY"))
partial=partial+current;
else if(operation.equalsIgnoreCase("DELETE"))
partial=partial-current;
logger.info("new count: "+partial);
return partial;
}
public DBCollection getSsCollection() {
return ssCollection;
}
public DBCursor getSsCollectionList() {
return ssCollection.find();
}
public void setSsCollection(DBCollection ssCollection) {
this.ssCollection = ssCollection;
}
}