Anonymous
Not applicable

[Beanshell] Counter zählt falsch

Hallo,

ich habe ein Skript, dass rekursive die Inhaltsordner in einem Projekt durchgeht und in eine Map speichert. Nach dem ersten Durchlauf wird jeweils der erste Ordner der Map auf Unterordner und Seiten geprüft und anschließend aus der Map entfernt.  Zum Speichern in der Map habe ich einen Counter der als Key für die Map dient. Dieser erhöht sich jedes mal, wenn ein Ordner in die Map gespeichert wird. Nach dem 5. Durchlauf ist der Counter == 52, nach dem 6. Durchlauf ist der Counter == 49, nach dem 51. Durchlauf ist der Counter == 13 und ich erhalte eine java.lang.NullPointerException, weil mein Skript auf den Ordner mit dem Key 52 zu greifen will, der aber wegen dem falschen Counter nicht vorhanden ist.

0 Kudos
8 Replies
marro
Crownpeak employee

Hallo Fabian,

zunächst würde mich einmal interessieren, wie das Skript aufgerufen wird. Wo kommen die folderMap und die pageMap initial her?

Dann ist mir noch folgender Fehler in Deinem Skript aufgefallen:

//hier muss getNextSibling() verwendet werden, da über getFirstChild() das LANG-Attribut angesprochen wird

currentPage = currentFolder.getFirstChild().getNextSibling();

getFirstChild() liefert Dir bereits das erste Kind (Page oder PageFolder). Über getNextSibling() würdest Du Dir somit das zweite Kind holen und das erste überspringen. Vermutlich hat Dich die Ausagbe von getFirstChild() in die Irre geführt. Die toString-Methode auf dem Element, die ja bei Ausgabe automatisch aufgerufen wird, gibt das LANG-Attribut aus. Nichtsdestotrotz ist das Element aber vom Typ Page bzw. PageFolder.

Viele Grüße

Donato

0 Kudos
Anonymous
Not applicable

folderMap und pageMap kommen beim ersten Aufruf aus einem anderen Skript. Dort werden sie mit den Seiten und Ordnern des root Verzeichnises gefüllt und in als Property in den context geschrieben:
context.setProperty("folderMap", folderMap)
Zu Beginn des aktuellen Skripts hole ich sie dann mit folderMap = context.getProperty("folderMap").

0 Kudos
marro
Crownpeak employee

Hallo Fabian,

mir ist immer noch nicht ganz klar, wie das Skript aufgerufen wird. Du schreibst, dass der erste Aufruf aus einem anderen Skript erfolgt, in dem zuvor auch die Seiten und Ordner des Root-Verzeichnisses (des PageStores vermute ich) in den Context geschrieben werden. Wie werden dann die weiteren Durchläufe gestartet? Könntest Du vielleicht die beiden Skripte komplett anhängen und dazu schreiben, wie Du sie aufrufst? Dann könnte ich versuchen, das bei mir nachzustellen. Meine Vermutung geht gerade in die Richtung, dass die Context-Variablen zwischen den Aufrufen verloren gehen.

Viele Grüße

Donato

0 Kudos
marro
Crownpeak employee

Noch eine Frage: Wäre es nicht sinnvoller, dem Skript eine Methode zu spendieren, die rekursiv aufgerufen wird, wodurch der komplette PageStore-Baum mit nur einem einzigen Skriptaufruf abgehandelt wird?

Anonymous
Not applicable

Anbei die Skripte. S1 wird einaml über eine Seitenvorlage aufgerufen und ruft dann S2 auf. S2 wiederum ruft sich selbst auf. In Skript2 geht es momentan um den Bereich von Z.74 - Z.124. Die von die angesprochenen Fehler (LANG-Attribut) habe ich noch nicht angepasst. Die if-Abfrage zum weiteren sortieren überhalb von Z.74 habe ich noch nicht überarbeitet.

0 Kudos
Anonymous
Not applicable

Mit einem Funktionsaufruf war's wirklich einfacher.

0 Kudos

Hallo Fabian,

ist dieses Posting noch aktuell? Hast du die Skripte lediglich neu strukturiert und benötigst du noch weitere Hilfe oder konnte Donato dir mit seinen Antworten bereits weiterhelfen? In diesem Fall wäre es super, wenn du seine richtige Antwort entsprechend markierst.

Solltest du zwischenzeitlich eine eigene Lösung gefunden haben, wäre es toll, wenn du diese hier bereitstellst.

Viele Grüße

Michaela

0 Kudos
Anonymous
Not applicable

Ist nicht mehr aktuell, Neustrukturierung hat geholfen.

0 Kudos