Search the FirstSpirit Knowledge Base
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.
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
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").
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
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?
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.
Mit einem Funktionsaufruf war's wirklich einfacher.
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
Ist nicht mehr aktuell, Neustrukturierung hat geholfen.