Beispiel: Arbeitsablauf „RecursiveRelease“
Dieser Arbeitsablauf zur rekursiven Freigabe besteht aus dem Arbeitsablauf und dem zugehörigen Skript „serverrelease“.
Innerhalb des Arbeitsablaufs soll das Element, auf dem der Arbeitsablauf gestartet wurde, sowie alle abhängigen Elemente, rekursiv freigegeben werden.
Die Serverseitige Freigabe, die innerhalb des Skripts „serverrelease“ verwendet wird, regelt sowohl die Freigabe als auch das interne Setzen des Schreibschutzes für die betroffenen Element. Werden dabei Elemente gefunden, die bereits mit einem Schreibschutz versehen sind, kann die Serverseitigen Freigabe nicht ausgeführt werden. Diese betroffenen Elemente können über den Rückgabewert der Serverseitigen Freigabe abgerufen werden (nur im Testmodus):
handle.getProgress(true).getLockFailedElements()
Für die serverseitige Freigabe muss demnach kein rekursiver Schreibschutz über das Skript gesetzt werden. Damit die Freigabe erfolgen kann, darf aber kein Schreibschutz durch den Arbeitsablauf gesetzt sein. Der Schreibschutz auf dem Element wird über das Skript daher zunächst aufgehoben:
se.setLock(false, false);
Anschließend wird die serverseitige Freigabe über den Aufruf der Methode
AccessUtil.release(IDProvider releaseStartNode,
boolean checkOnly, boolean releaseParentPath, boolean recursive,
IDProvider.DependentReleaseType dependentType)
ausgeführt.
Im Beispiel werden die folgenden Übergabeparameter für die Serverseitige Freigabe eingestellt:
handle = AccessUtil.release(se, false, false, true,
de.espirit.firstspirit.access.store.IDProvider.DependentReleaseType.DEPENDENT_RELEASE_NEW_AND_CHANGED);
Rückgabe-Parameter:
ServerActionhandle<? extends ReleaseProgress,Boolean >
Die serverseitige Freigabe liefert ein ServerActionHandle zurück, das alle Informationen über den Freigabeprozess beinhaltet.
Innerhalb des Beispielskripts wird zunächst das Ergebnis des Freigabeprozesses abgefragt:
handle.getResult();
handle.checkAndThrow();
Anschließend werden die Fehler bei der Freigabe untersucht. Können Elemente nicht freigegeben werden, beispielsweise weil ein Schreibschutz auf dem Element bestand oder der Bearbeiter nicht die entsprechenden Rechte zur Freigabe eines Elements besaß, können diese über die Methoden
progress.getMissingPermissionElements() bzw.
progress.getLockFailedElements() abgerufen werden:
progress = handle.getProgress(true);
notReleased.addAll(progress.getMissingPermissionElements());
notReleased.addAll(progress.getLockFailedElements());
Die Fehlerbehandlung des Skripts zeigt dem Bearbeiter die Elemente an, die nicht freigegeben werden konnten:
if (!notReleased.isEmpty()) {
text = "Folgende Elemente konnten nicht freigegeben werden: " + notReleased;
requestOperation = context.requireSpecialist(OperationAgent.TYPE).getOperation(RequestOperation.TYPE);
requestOperation.setKind(RequestOperation.Kind.ERROR);
requestOperation.addOk();
requestOperation.perform(text);
}
Die Fehlermeldung wird nur im Test-Modus („checkOnly“) angezeigt. |
Skript „serverrelease“:
//!Beanshell
import de.espirit.firstspirit.common.gui.*;
import de.espirit.firstspirit.access.*;
import de.espirit.firstspirit.access.store.*;
import de.espirit.firstspirit.ui.operations.RequestOperation;
import de.espirit.firstspirit.agency.OperationAgent;
se = context.getElement();
try {
se.setLock(false, false);
handle = AccessUtil.release(se, false, false, true,
de.espirit.firstspirit.access.store.IDProvider.DependentReleaseType.DEPENDENT_RELEASE_NEW_AND_CHANGED);
handle.getResult();
handle.checkAndThrow();
Set notReleased = new HashSet();
progress = handle.getProgress(true);
notReleased.addAll(progress.getMissingPermissionElements());
notReleased.addAll(progress.getLockFailedElements());
if (!notReleased.isEmpty()) {
text = "Folgende Elemente konnten nicht freigegeben werden: " + notReleased;
requestOperation = context.requireSpecialist(OperationAgent.TYPE).getOperation(RequestOperation.TYPE);
requestOperation.setKind(RequestOperation.Kind.ERROR);
requestOperation.addOk();
requestOperation.perform(text);
}
se.refresh();
context.getGuiHost().gotoTreeNode(se);
se.setLock(true, false);
context.doTransition("->Ende");
} catch (Exception ex) {
text = "Fehler bei der Freigabe: " + ex;
requestOperation = context.requireSpecialist(OperationAgent.TYPE).getOperation(RequestOperation.TYPE);
requestOperation.setKind(RequestOperation.Kind.ERROR);
requestOperation.addOk();
requestOperation.perform(text);
context.getSession().put("error", ex.toString());
context.doTransition("->Error");
}