Hewera-Harz
Returning Observer

sitestore ordner freigeben über Beanshell Script

Jump to solution

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

                }

    }

}

0 Kudos
1 Solution

Accepted Solutions
bIT_sosswald
Returning Responder

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. Smiley Happy

Grüße

Sandro Osswald

View solution in original post

0 Kudos
2 Replies
bIT_sosswald
Returning Responder

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. Smiley Happy

Grüße

Sandro Osswald

0 Kudos

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

                }

    }

}

0 Kudos