sebbec
I'm new here

Exception bei setLock(): lock is not supported for release store elements

Jump to solution

Hallo zusammen,

aktuell arbeiten wir an einem Script, dass alle Inhaltsseiten mit einem bestimmten Seitentemplate auf ein anderes Template ändern. Hierfür benutzen wir folgende Methode:

private static int migrateSiteTemplateOfAll(PageTemplate sourceSiteTemplate, PageTemplate targetSiteTemplate) throws LockException, ElementDeletedException {

     int count = 0;

     /* Iterierung über alle Referenzen auf die Seitevorlage */

     for(ReferenceEntry referenceEntry:sourceSiteTemplate.getIncomingReferences()){

          // Prüfen ob es sich um eine Inhaltsseite handelt

          if(referenceEntry.getStoreType().equals(Store.Type.PAGESTORE) && (referenceEntry.getReferencedObject() instanceof Page)){

               Page page = (Page)referenceEntry.getReferencedObject();

               try {

                    logger.info("Diese Seite wird grade umgebogen " + page.getUid());

                    boolean isReleased = page.isReleased();

                    page.setLock(true, true);

                    //Vorlage umbiegen

                    page.setTemplate(targetSiteTemplate);

                    page.save(fs_comment_switch);

                    if (isReleased) {

                         page.release(true);

                    }

                    count++;

               }finally{

                    if(page != null){

                         page.setLock(false, true);

                    }

               }

          }

     }

     return count;

}

Nun gibt es ab und zu eine UnsupportedOperationException schon beim ersten setLock in Zeile 11.:

Exception in thread "main" java.lang.UnsupportedOperationException: lock is not supported for release store elements

     at de.espirit.firstspirit.store.access.DefaultStoreElement.setLock(DefaultStoreElement.java:452)

     at de.espirit.firstspirit.store.access.DefaultStoreElement.setLock(DefaultStoreElement.java:446)

     at com.nord.fs.migration.StartSiteMigration.migrateSiteTemplateOfAll(StartSiteMigration.java:74)

     at com.nord.fs.migration.StartSiteMigration.main(StartSiteMigration.java:31)

Warum und wann diese Exception auftritt kann ich mir nicht erklären, da sie nach nach keinem Muster auftritt. Nach einer Exception ist es z.B händisch möglich im SiteArchitect das Template zu ändern.

Grundsätzlich gibt es folgenden Teil in der setLock Methode, der diese Exception hervorruft:

if (this.getStore().isRelease()) {

    throw new UnsupportedOperationException("lock is not supported for release store elements");

}

Warum nun this.getStore().isRelease() nun manchmal true oder false ist, verstehe ich nicht. Hatte auch schon in der Doku und im Forum geschaut und bin nicht fündig geworden.

Vielleicht erkennt ja hier jemand das Problem und kann mir weiterhelfen. Ich hoffe ich habe euch hierfür genug Informationen geliefert, falls nicht bitte Bescheid geben.

Vielen Danke schon mal im Voraus!

Lieben Gruß,

Sebastian

1 Solution

Accepted Solutions
bIT_sosswald
Returning Responder

Hallo Sebastian,

die Exception kommt, da versucht wird ein Objekt aus dem Released-State zu ändern. Diese Elemente sind sozusagen "read only" und können somit nicht geändert werden.

Warum genau dir die ReferencedEntries aus getIncommingReferences() teilweise Objekte aus dem Released store zurückgeben, kann ich dir gerade nicht genau sagen.

Versuche mal dir explizit die Page aus dem Current-State zu holen und dann die Operation auf diesem Objekt durchzuführen, etwa wie folgt:

PageStoreRoot notReleasedPageStoreRoot = (PageStoreRoot) targetSiteTemplate.getProject().getUserService().getStore(Store.Type.PAGESTORE, false);

...

Page currentPage = (Page) notReleasedPageStoreRoot.getStoreElement(page.getId());

(Unschöner Code, weil du dir hier jedes Mal den Store erneut holst, aber zur schnellen Überprüfung, ob es dein Problem löst, sollte es reichen. 🙂 )

Siehe hierzu auch: UserService (FirstSpirit Access-API)

Ich hoffe die Idee hilft dir.

Beste Grüße

Sandro

View solution in original post

0 Kudos
3 Replies
bIT_sosswald
Returning Responder

Hallo Sebastian,

die Exception kommt, da versucht wird ein Objekt aus dem Released-State zu ändern. Diese Elemente sind sozusagen "read only" und können somit nicht geändert werden.

Warum genau dir die ReferencedEntries aus getIncommingReferences() teilweise Objekte aus dem Released store zurückgeben, kann ich dir gerade nicht genau sagen.

Versuche mal dir explizit die Page aus dem Current-State zu holen und dann die Operation auf diesem Objekt durchzuführen, etwa wie folgt:

PageStoreRoot notReleasedPageStoreRoot = (PageStoreRoot) targetSiteTemplate.getProject().getUserService().getStore(Store.Type.PAGESTORE, false);

...

Page currentPage = (Page) notReleasedPageStoreRoot.getStoreElement(page.getId());

(Unschöner Code, weil du dir hier jedes Mal den Store erneut holst, aber zur schnellen Überprüfung, ob es dein Problem löst, sollte es reichen. 🙂 )

Siehe hierzu auch: UserService (FirstSpirit Access-API)

Ich hoffe die Idee hilft dir.

Beste Grüße

Sandro

0 Kudos

Die Erklärung für das Verhalten ist, das auch Seiten im Freigabestand eine Referenz auf ihr Template haben. Und damit haben also Templates auch eingehende Referenzen aus dem Freigabestand. Die Überprüfung, welche Variante du gerade betrachtest, kannst du in Zeile 8 einfügen:

if (!page.getStore().isRelease()) { ... }

Peter
0 Kudos

Vielen Dank für die Antworten. Das Script läuft nun ohne Probleme durch und tut was es soll.