Search the FirstSpirit Knowledge Base
Hallo Zusammen,
ich habe hier ein Beanshell Script, das auf dem Server läuft.
Es soll bei uns im Projekt das Löschen von Seiten in Abhängigkeit von einem vorgegebenen Zeitraum ermöglichen.
Über den Metadatenreiter für eine Seitenreferenz kann ein "Verfallsdatum" für die Seitenreferenz angegeben werden.
Das Delete Sript ist eine Aktion eines Publizierungsauftrags und wird vor dem "generate" ausgeführt. Bei Ausführung eines Auftrages wird über das Script das "Verfallsdatum" in den Metadaten ausgelesen und mit dem jetztigen Datum verglichen. Liegt das "Verfallsdatum" vor dem Auftragsdatum, soll die PageRef aus dem Sitestore gelöscht werden und der geänderte Sitestore Grundlage für die Publizierung werden.
Das Löschen aus dem Sitestore klappt auch prima, da aber nach dem Löschen der Status des ParentFolders der gelöschten PageRef auf "nicht freigegeben" wechselt, wird die publizierte Seite auf dem FS Server und damit auf unserem Staging Server nicht gelöscht. Erst wenn ich danach manuell den Ordner freigebe, wird bei der nächsten Publizierung die Löschung der publizierten Seite durchgeführt.
Ich habe daher versucht den Ordner nach dem Löschen der PageRef freizugeben (s.u. "ordner.setLock(false,false);"). Leider klappt das noch nicht.
Ich muss irgendwie an den Order der zu löschenden PageRef kommen und diesen nach dem Löschen der PageRef aus dem Sitestore freigeben.
Über sachdienliche Hinweise würde ich mich freuen 🙂
Grüße
Petra Hewera-Harz
Der Code des "Delete-Scriptes":
//!Beanshell
import java.util.*;
import java.lang.Long;
import de.espirit.firstspirit.access.ReferenceEntry;
import de.espirit.firstspirit.storage.*;
import de.espirit.firstspirit.access.*;
import de.espirit.firstspirit.access.project.*;
import de.espirit.firstspirit.agency.StoreAgent;
import de.espirit.firstspirit.access.store.*;
import de.espirit.firstspirit.access.store.Store.Type;
import de.espirit.firstspirit.access.store.sitestore.*;
import de.espirit.firstspirit.access.store.pagestore.*;
connection.getProjectById(context.getProject().getId()).getUserService();
today = new Date();
storeAgent = context.requestSpecialist(StoreAgent.TYPE);
siteStore = (SiteStoreRoot)storeAgent.getStore(Type.SITESTORE);
List<StoreElement> children = siteStore.getChildren(StoreElement.class, true).toList();
for (StoreElement child : children) {
//Erstmal nur für PageRefs!
if (child instanceof PageRef) {
metaEnd = child.getMetaFormData().get(null, "pt_metaend").get();
ordner = child.getParent(); //soll den ParentFolder der PageRef liefern
if(metaEnd == null) {
//Nichts soll passieren -> keine Frist gesetzt
} else if (metaEnd.before(today)) {
child.delete();
ordner.setLock(false,false); // soll den ParentFodler der gelöschten PageRef freigeben
//damit die Änderungen im Sitestore bei der jetzt laufenden Publizierung berücksichtigt werden, wird die Startzeit neu gesetzt
// sonst würden die Änderungen erst bei der nächsten Publizierung wirksam
context.setStartTime(new Date());
} else if (metaEnd.after(today)) {
//Nichts soll passieren -> Frist noch nicht erreicht
}
}
}
Hallo Frau Hewera-Harz,
ordner.setLock(false, false);
gibt den Ordner nicht frei, sondern unlockt lediglich den Ordner. (Siehe JavaDoc)
Zum Freigeben müsste
ordner.release(false)
bzw. wenn auch alle Kindelemente des Ordners freigeben werden sollen
ordner.release(true)
verwendet werden. (Siehe JavaDoc)
Vielleicht war es das ja schon.
Grüße
Sandro Osswald
Hallo Frau Hewera-Harz,
ordner.setLock(false, false);
gibt den Ordner nicht frei, sondern unlockt lediglich den Ordner. (Siehe JavaDoc)
Zum Freigeben müsste
ordner.release(false)
bzw. wenn auch alle Kindelemente des Ordners freigeben werden sollen
ordner.release(true)
verwendet werden. (Siehe JavaDoc)
Vielleicht war es das ja schon.
Grüße
Sandro Osswald
Hallo Herr Osswald,
jetzt funktioniert es.
Die Freigabe wird wie von Ihnen angemerkt über "ordner.release()" geregelt.
Bei meinen Test habe ich aber festgestellt, dass nur "ordner.release()" einen Fehler wirft, da FS vorher das Element gelockt haben will (das gilt auch für child.delete).
Vielen Dank für die Hilfe
Grüße
Petra Hewera-Harz
Und falls jemand ein solches Script auch mal benötigt 🙂
Der funktionierende Code lautet folgendermaßen:
//!Beanshell
import java.util.*;
import java.lang.Long;
import de.espirit.firstspirit.access.ReferenceEntry;
import de.espirit.firstspirit.storage.*;
import de.espirit.firstspirit.access.*;
import de.espirit.firstspirit.access.project.*;
import de.espirit.firstspirit.agency.StoreAgent;
import de.espirit.firstspirit.access.store.*;
import de.espirit.firstspirit.access.store.Store.Type;
import de.espirit.firstspirit.access.store.sitestore.*;
import de.espirit.firstspirit.access.store.pagestore.*;
connection.getProjectById(context.getProject().getId()).getUserService();
today = new Date();
storeAgent = context.requestSpecialist(StoreAgent.TYPE);
siteStore = (SiteStoreRoot)storeAgent.getStore(Type.SITESTORE);
List<StoreElement> children = siteStore.getChildren(StoreElement.class, true).toList();
for (StoreElement child : children) {
//Erstmal nur für PageRefs!
if (child instanceof PageRef) {
metaEnd = child.getMetaFormData().get(null, "pt_metaend").get();
ordner = child.getParent();
if(metaEnd == null) {
//Nichts soll passieren -> keine Frist gesetzt
} else if (metaEnd.before(today)) {
child.setLock(true); //lock für das delete
child.delete(); //PageRef löschen
ordner.setLock(true); //lock für das release
ordner.release(false); //ParentFolder der gelöschten PageRef freigeben
context.setStartTime(new Date()); //neue Startzeit für die Publizierung
} else if (metaEnd.after(today)) {
//Nichts soll passieren -> Frist noch nicht erreicht
}
}
}