package com.venky.swf.plugins.background.db.model;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import com.venky.core.io.StringReader;
import com.venky.core.util.ObjectUtil;
import com.venky.swf.db.Database;
import com.venky.swf.db.Transaction;
import com.venky.swf.db.model.reflection.ModelReflector;
import com.venky.swf.db.table.ModelImpl;
import com.venky.swf.plugins.background.core.Task;
import com.venky.swf.routing.Config;
public class DelayedTaskImpl extends ModelImpl<DelayedTask> implements Comparable<DelayedTask>{
public DelayedTaskImpl(DelayedTask proxy) {
super(proxy);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public int compareTo(DelayedTask o2) {
int ret = 0 ;
DelayedTask o1 = getProxy();
ModelReflector<DelayedTask> ref = ModelReflector.instance(DelayedTask.class);
for (String field: DelayedTask.DEFAULT_ORDER_BY_COLUMNS){
if (ret == 0){
Comparable v1 = (Comparable)ref.get(o1,field);
Comparable v2 = (Comparable)ref.get(o2,field);
ret = v1.compareTo(v2);
}
}
return ret;
}
public void execute(){
DelayedTask o = getProxy();
Transaction parentTxn = Database.getInstance().getTransactionManager().createTransaction();
try {
DelayedTask locked = Database.getTable(DelayedTask.class).lock(o.getId(),false);
if (locked != null) {
boolean success = false;
Transaction txn = null;
try {
ObjectInputStream is = new ObjectInputStream(locked.getData());
Task task = (Task)is.readObject();
is.close();
Config.instance().getLogger(getClass().getName()).info("Executing " + task.getClass().getName() + " : DelayedTask#" + o.getId() );
txn = Database.getInstance().getTransactionManager().createTransaction();
task.execute();
txn.commit();
success = true;
}catch(Exception ex){
StringWriter sw = new StringWriter();
PrintWriter w = new PrintWriter(sw);
if (Config.instance().isDevelopmentEnvironment() || ObjectUtil.isVoid(ex.getMessage())){
ex.printStackTrace(w);
}else {
w.write(ex.getMessage());
}
Config.instance().getLogger(getClass().getName()).info(sw.toString());
txn.rollback(ex);
locked.setLastError(new StringReader(sw.toString()));
locked.setNumAttempts(locked.getNumAttempts()+1);
}
if (success){
locked.destroy();
}else {
locked.save();
}
}
parentTxn.commit();
}catch (Exception ex){
parentTxn.rollback(ex);
}
}
}