G
Guest
Gast
Hallo
Ich habe eine Klasse, die in ihrem Konstruktor eine Baumstruktur unter JDOM sehr oft modifiziert, sodass dementsprechend auch sehr viele Iteratoren (für Wandern durch den Baum) zum Einsatz kommen.
Problem ist jetzt, dass die Reihenfolge der Baumelemente mit jedem weiterem Iterator-Einsatz anscheinend immer mehr durcheinander gebracht wird, was gar nicht gut ist. Auch musste ich an einigen Stellen Kollektionen (bzw Listen) kopieren, um eine "ConcurrentModificationException" zu vermeiden.
Ich will jetzt hier nicht 800 zeilen Code posten, aber einige Schnipsel, damit Ihr euch ein besseres Bild machen könnt.
Irgendwo in dieser Methode, wird in einer Liste die Reihenfolge der Elemente ein wenig durcheinander gebracht. Liegt der Fehler beim Kopieren?
Die Methode remove(Element a) von einer Element-Instanz sieht folgendermaßen aus - vielleicht liegt der Fehler hierdrin:
Die Methoden, von denen jede die Kollektion "durchkramt", folgen dicht auf dicht - vielleicht gibt's hier SynchronisationProbleme?
Zum Schluss ein Beispiel dafür, was ich mit "falsche reihenfolge" meine.
nach deleteDataSelection:
soweit so gut...
nach deleteInformationObject:
--> das ist falsch
Ich habe eine Klasse, die in ihrem Konstruktor eine Baumstruktur unter JDOM sehr oft modifiziert, sodass dementsprechend auch sehr viele Iteratoren (für Wandern durch den Baum) zum Einsatz kommen.
Problem ist jetzt, dass die Reihenfolge der Baumelemente mit jedem weiterem Iterator-Einsatz anscheinend immer mehr durcheinander gebracht wird, was gar nicht gut ist. Auch musste ich an einigen Stellen Kollektionen (bzw Listen) kopieren, um eine "ConcurrentModificationException" zu vermeiden.
Ich will jetzt hier nicht 800 zeilen Code posten, aber einige Schnipsel, damit Ihr euch ein besseres Bild machen könnt.
Irgendwo in dieser Methode, wird in einer Liste die Reihenfolge der Elemente ein wenig durcheinander gebracht. Liegt der Fehler beim Kopieren?
Code:
/**
*löscht alle informationObject-Elemente
*/
private void deleteInformationObject() {
List l = getRoot().getChildren();
Iterator iter = l.iterator();
//Durchlauf aller Kinder vom ui-Wurzel-Element. Bei entsprechenden Kinderelementen (edit, display, select)
//lösche informationObjecte
while (iter.hasNext()) {
Element e = (Element) iter.next();
if (e.getName().equals(new String("edit"))
|| e.getName().equals(new String("display"))
|| e.getName().equals(new String("select"))) {
//display-, edit- und select-Element können beliebig viele information-Objekte unter sich haben
List l1 = e.getChildren();
//Kopieren der Liste, da sonst Fehlermeldung
ArrayList l2 = new ArrayList(l1);
Iterator iter2 = l1.iterator();
while (iter2.hasNext()) {
Element a = (Element) iter2.next();
e.[b]remove(a)[/b];
}
}
}
}
Die Methode remove(Element a) von einer Element-Instanz sieht folgendermaßen aus - vielleicht liegt der Fehler hierdrin:
Code:
//entfernt ein Element "child", und hängt die Teilbäume von "child"
//an den ehemaligen Elternknoten "parent" von "child"
public void remove(Element child) {
List l = child.getChildren();
Element parent = child.getParentElement();
child.detach();
while (!(l.isEmpty())) {
parent.addContent(0,((Element) l.remove(l.size()-1)));
}
}
Die Methoden, von denen jede die Kollektion "durchkramt", folgen dicht auf dicht - vielleicht gibt's hier SynchronisationProbleme?
Code:
deleteDataSelection();
deleteInformationObject();
dislocateControl();
insertDisplayContent();
forwardInfo();
normalize(getLevel());
Zum Schluss ein Beispiel dafür, was ich mit "falsche reihenfolge" meine.
nach deleteDataSelection:
Code:
[Element: <level0/>] 4 [Element: <level0/>] 8 [Element: <level0/>] 13
soweit so gut...
nach deleteInformationObject:
Code:
<level0/>] 13 [Element: <level0/>] 8 [Element: <level0/>] 4
--> das ist falsch