Beispiel: Arbeitsablauf "Delete"
Der Arbeitsablauf zum Löschen von Elementen besteht aus dem Arbeitsablauf und den zugehörigen Skripten clientdelete (zum Löschen einzelner Objekte) und serverdelete (zum Löschen von Teilbäumen).
Wird die Aktion clientdelete ausgeführt, wird das Element über das entsprechende Skript gesperrt und anschließend gelöscht. Nach dem Löschen wird der Arbeitsablauf in den nachfolgenden Status „Ende“ weitergeschaltet.
Wird die Aktion serverdelete ausgeführt, wird das Element über das entsprechende Skript rekursiv gesperrt. Über die Aktion serverdelete können damit nicht nur einzelne Elemente, sondern auch Teilbäume gelöscht werden. Das Löschen erfolgt hier über ein ServerHandle, welches einen Ergebnis-Report zurückliefert und im Fehlerfall eine Exception wirft.
Nach erfolgreichem Löschen wird der Arbeitsablauf in den nachfolgenden Status „Ende“ weitergeschaltet. Für beide Aktionen gilt: im Fehlerfall wird der Arbeitsablauf nicht in den Endstatus, sondern in einen Fehlerstatus geschaltet, der im Arbeitsablauf modelliert wurde.
Skript „clientdelete“
//!Beanshell
import de.espirit.firstspirit.common.gui.*;
import de.espirit.firstspirit.ui.operations.RequestOperation;
import de.espirit.firstspirit.agency.OperationAgent;
se = context.getElement();
try {
se.setLock(true);
se.delete();
context.doTransition("->Ende");
} catch (Exception ex) {
text = "Fehler beim Löschen: " + ex;
requestOperation = context.requireSpecialist(OperationAgent.TYPE).getOperation(RequestOperation.TYPE);
requestOperation.setKind(RequestOperation.Kind.INFO);
requestOperation.addOk();
requestOperation.perform(text);
context.getSession().put("error", ex.toString());
context.doTransition("->Error");
}
Skript „serverdelete“
//!Beanshell
import de.espirit.firstspirit.common.gui.*;
import de.espirit.firstspirit.ui.operations.RequestOperation;
import de.espirit.firstspirit.agency.OperationAgent;
se = context.getElement();
parent = se.getParent();
try {
se.setLock(false, false);
handle = de.espirit.firstspirit.access.AccessUtil.delete(se, true);
handle.getResult();
handle.checkAndThrow();
Set notDeleted = new HashSet();
progress = handle.getProgress(true);
notDeleted.addAll(progress.getDeleteFailedElements());
notDeleted.addAll(progress.getMissingPermissionElements());
notDeleted.addAll(progress.getLockFailedElements());
notDeleted.addAll(progress.getReferencedElements());
if (!notDeleted.isEmpty()) {
text = "Folgende Elemente konnten nicht gelöscht werden: " + notDeleted;
requestOperation = context.requireSpecialist(OperationAgent.TYPE).getOperation(RequestOperation.TYPE);
requestOperation.setKind(RequestOperation.Kind.INFO);
requestOperation.addOk();
requestOperation.perform(text);
}
if (parent != null) {
parent.refresh();
context.getGuiHost().gotoTreeNode(parent);
}
if (!se.isDeleted()) {
se.setLock(true, false);
}
context.doTransition("->Ende");
} catch (Exception ex) {
text = "Fehler beim Löschen: " + ex;
requestOperation = context.requireSpecialist(OperationAgent.TYPE).getOperation(RequestOperation.TYPE);
requestOperation.setKind(RequestOperation.Kind.INFO);
requestOperation.addOk();
requestOperation.perform(text);
context.getSession().put("error", ex.toString());
context.doTransition("->Error");
}