try {
restoring = true;
//restore users
logger.info("Restoring Users");
Query query = pmgr.createQuery("from au.edu.qut.yawl.admintool.model.Resource" +
" where IsOfResourceType = 'Human'");
for (Iterator it = query.iterate(); it.hasNext();) {
HumanResource user = (HumanResource) it.next();
logger.debug("Restoring user '" + user.getRsrcID() + "'");
UserList.getInstance().addUser(
user.getRsrcID(),
user.getPassword(),
user.getIsAdministrator());
}
//Lachlan: later we delete these loaded services and reload them anew
//this seems kind of redundant, don't you think?
logger.info("Restoring Services");
query = pmgr.createQuery("from au.edu.qut.yawl.elements.YAWLServiceReference");
for (Iterator it = query.iterate(); it.hasNext();) {
YAWLServiceReference service = (YAWLServiceReference) it.next();
addYawlService(service);
}
logger.info("Restoring Specifications - Starts");
query = pmgr.createQuery("from au.edu.qut.yawl.engine.YSpecFile");
for (Iterator it = query.iterate(); it.hasNext();) {
YSpecFile spec = (YSpecFile) it.next();
String xml = spec.getXML();
{
logger.debug("Restoring specification " + spec.getId());
File f = File.createTempFile("yawltemp", null);
BufferedWriter buf = new BufferedWriter(new FileWriter(f));
buf.write(xml, 0, xml.length());
buf.close();
addSpecifications(f.getAbsolutePath());
f.delete();
}
}
logger.info("Restoring Specifications - Ends");
logger.info("Restoring process instances - Starts");
query = pmgr.createQuery("from au.edu.qut.yawl.engine.YNetRunner order by case_id");
for (Iterator it = query.iterate(); it.hasNext();) {
YNetRunner runner = (YNetRunner) it.next();
runners.add(runner);
}
HashMap map = new HashMap();
for (int i = 0; i < runners.size(); i++) {
YNetRunner runner = (YNetRunner) runners.get(i);
String id = runner.get_caseID();
query = pmgr.createQuery("select from au.edu.qut.yawl.engine.YLogIdentifier where case_id = '" + id + "'");
for (Iterator it = query.iterate(); it.hasNext();) {
YLogIdentifier ylogid = (YLogIdentifier) it.next();
map.put(ylogid.getIdentifier(), ylogid);
}
}
YawlLogServletInterface.getInstance().setListofcases(map);
int checkedrunners = 0;
Vector storedrunners = (Vector) runners.clone();
while (checkedrunners < runners.size()) {
for (int i = 0; i < runners.size(); i++) {
YNetRunner runner = (YNetRunner) runners.get(i);
if (runner.getContainingTaskID() == null) {
//This is a root net runner
YSpecification specification = getSpecification(runner.getYNetID());
if (specification != null) {
YNet net = (YNet) specification.getRootNet().clone();
runner.setNet(net);
runnermap.put(runner.get_standin_caseIDForNet().toString(), runner);
} else {
/* This occurs when a specification has been unloaded, but the case is still there
This case is not persisted, since we must have the specification stored as well.
*/
// todo AJH Sort this
pmgr.deleteObject(runner);
storedrunners.remove(runner);
}
checkedrunners++;
} else {
//This is not a root net, but a decomposition
// Find the parent runner
String myid = runner.get_standin_caseIDForNet().toString();
String parentid = myid.substring(0, myid.lastIndexOf("."));
YNetRunner parentrunner = (YNetRunner) runnermap.get(parentid);
if (parentrunner != null) {
YNet parentnet = parentrunner.getNet();
YCompositeTask task = (YCompositeTask) parentnet.getNetElement(runner.getContainingTaskID());
runner.setTask(task);
YNet net = (YNet) task.getDecompositionPrototype().clone();
runner.setNet(net);
runnermap.put(runner.get_standin_caseIDForNet().toString(), runner);
checkedrunners++;
}
}
}
}
runners = storedrunners;
for (int i = 0; i < runners.size(); i++) {
YNetRunner runner = (YNetRunner) runners.get(i);
YNet net = runner.getNet();
P_YIdentifier pid = runner.get_standin_caseIDForNet();
if (runner.getContainingTaskID() == null) {
// This is a root net runner
YIdentifier id = restoreYID(pmgr, runnermap, idtoid, pid, null, runner.getYNetID(), net);
runner.set_caseIDForNet(id);
addRunner(runner);
}
YIdentifier yid = new YIdentifier(runner.get_caseID());
YWorkItemRepository.getInstance().setNetRunnerToCaseIDBinding(runner, yid);
Set busytasks = runner.getBusyTaskNames();
for (Iterator busyit = busytasks.iterator(); busyit.hasNext();) {
String name = (String) busyit.next();
YExternalNetElement element = net.getNetElement(name);
runner.addBusyTask(element);
}
Set enabledtasks = runner.getEnabledTaskNames();
for (Iterator enabit = enabledtasks.iterator(); enabit.hasNext();) {
String name = (String) enabit.next();
YExternalNetElement element = net.getNetElement(name);
if (element instanceof YTask) {
YTask externalTask = (YTask) element;
runner.addEnabledTask(externalTask);
}
}
}
// restore case & exception observers (where they exist)
for (int i = 0; i < runners.size(); i++) {
YNetRunner runner = (YNetRunner) runners.get(i);
runner.restoreObservers();
}
logger.info("Restoring process instances - Ends");
logger.info("Restoring work items - Starts");
query = pmgr.createQuery("from au.edu.qut.yawl.engine.YWorkItem");
for (Iterator it = query.iterate(); it.hasNext();) {
YWorkItem witem = (YWorkItem) it.next();
if (witem.getStatus().equals(YWorkItem.statusEnabled)) {
witem.setStatus(YWorkItem.statusEnabled);
}