Questions & Answers

SOLVED
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

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

Type a product name