1
23package org.jzuul.gdk.swt;
24
25import java.io.ByteArrayInputStream;
26import java.io.ByteArrayOutputStream;
27import java.io.File;
28import java.io.FileInputStream;
29import java.io.IOException;
30import java.io.OutputStream;
31import java.nio.BufferOverflowException;
32import java.util.ArrayList;
33import java.util.Iterator;
34import java.util.List;
35import java.util.Stack;
36
37import javax.naming.BinaryRefAddr;
38
39import org.jdom.Attribute;
40import org.jdom.Content;
41import org.jdom.Document;
42import org.jdom.Element;
43import org.jdom.JDOMException;
44import org.jdom.Parent;
45import org.jdom.input.SAXBuilder;
46import org.jdom.output.Format;
47import org.jdom.output.XMLOutputter;
48
49
56public class JdomHelpers {
57
58 private static Element root;
59
60
63 public JdomHelpers() {
64 super();
65 }
66
67 public static Element getGamefileElement(Element someElement) {
68 Parent parent = someElement;
69
70 while (parent.getParent() != null)
71 parent = parent.getParent();
72 List contents = parent.getContent();
73 for (Iterator contentIter = contents.iterator(); contentIter.hasNext();) {
74 Content contentElement = (Content) contentIter.next();
75 if (contentElement instanceof Element) {
76 JdomHelpers.root = (Element) contentElement;
77 return (Element) contentElement;
78 }
79 }
80 System.err.println("WARNING: Couldn't get top level element <gamefile>");
81 return null;
82 }
83
84 public static List getFirstLevelElements(Element someElement) {
85 if (someElement == null) return null;
86 if (JdomHelpers.getRoot() != null) { return root.getChildren(); }
87 List elements = new ArrayList();
88 Parent parent = someElement;
89 while (parent.getParent() != null)
90 parent = parent.getParent();
91 List contents = parent.getContent();
92 for (Iterator contentIter = contents.iterator(); contentIter.hasNext();) {
93 Content contentElement = (Content) contentIter.next();
94 if (contentElement instanceof Element) elements.add(contentElement);
95 }
96 if (elements.size() == 0) System.err.println("WARNING: Couldn't get any elements");
97 if (elements.size() == 1) return ((Element) elements.get(0)).getChildren();
98 return elements;
99 }
00
01 public static List getFirstLevelElements(Element someElement, String name) {
02 if (someElement == null || name == null) return null;
03 List elements = getFirstLevelElements(someElement);
04 List retval = new ArrayList();
05 for (Iterator elementIter = elements.iterator(); elementIter.hasNext();) {
06 Element element = (Element) elementIter.next();
07 if (element.getName().equals(name)) retval.add(element);
08 }
09
10 return retval;
11 }
12
13 public static Element getFirstLevelElement(Element someElement, String name) {
14 if (someElement == null || name == null) return null;
15 List elements = JdomHelpers.getFirstLevelElements(someElement);
16 if (elements == null) return null;
17 for (Iterator elementIter = elements.iterator(); elementIter.hasNext();) {
18 Element anElement = (Element) elementIter.next();
19 if (anElement.getName().equals(name)) return anElement;
20 }
21 System.err.println("WARNING: couldn't find element " + name);
22 return null;
23 }
24
25 public static String[] getRoomListForMap(Element someElement, String mapName) {
26 if (someElement == null || mapName == null) return null;
27 List elements = JdomHelpers.getFirstLevelElements(someElement);
28 List rooms = null;
29 List roomNames = new ArrayList();
30 for (Iterator elementIter = elements.iterator(); elementIter.hasNext();) {
31 Element element = (Element) elementIter.next();
32 if (element.getName().equals("map") && element.getAttributeValue("name").equals(mapName))
33 rooms = element.getChildren();
34 }
35 if (rooms != null) {
36 for (Iterator roomIter = rooms.iterator(); roomIter.hasNext();) {
37 Element roomElement = (Element) roomIter.next();
38 String name = roomElement.getAttributeValue("name");
39 if (name != null) roomNames.add(name);
40 }
41 String[] retval = new String[roomNames.size()];
42 roomNames.toArray(retval);
43 return retval;
44 }
45 return null;
46 }
47
48 public static String[] getItemNames(Element someElement) {
49 if (someElement == null) return null;
50 List itemNames = new ArrayList();
51
52 Element gameobject = JdomHelpers.getFirstLevelElement(someElement, "gameobjects");
53
54 Element items = gameobject.getChild("items");
55 List gameitems = items.getChildren("gameitem");
56 for (Iterator gameItemIter = gameitems.iterator(); gameItemIter.hasNext();) {
57 Element gameitem = (Element) gameItemIter.next();
58 itemNames.add(gameitem.getAttributeValue("name"));
59 }
60 String[] retval = new String[itemNames.size()];
61 itemNames.toArray(retval);
62 return retval;
63 }
64
65 public static String[] getCharacterNames(Element someElement) {
66 if (someElement == null) return null;
67
68 List charNames = new ArrayList();
69
70 Element gameobject = JdomHelpers.getFirstLevelElement(someElement, "gameobjects");
71 Element items = gameobject.getChild("characters");
72 if (items != null) {
73 List gameitems = items.getChildren("person");
74 for (Iterator gameItemIter = gameitems.iterator(); gameItemIter.hasNext();) {
75 Element gameitem = (Element) gameItemIter.next();
76 charNames.add(gameitem.getAttributeValue("name"));
77 }
78 String[] retval = new String[charNames.size()];
79 charNames.toArray(retval);
80 return retval;
81 } else {
82 return null;
83 }
84
85 }
86
87 public static String[] getMapNames(Element someElement) {
88 if (someElement == null) return null;
89 List mapNames = new ArrayList();
90
91 List maps = JdomHelpers.getFirstLevelElements(someElement, "map");
92
93 for (Iterator gameItemIter = maps.iterator(); gameItemIter.hasNext();) {
94 Element gameitem = (Element) gameItemIter.next();
95 mapNames.add(gameitem.getAttributeValue("name"));
96 }
97 String[] retval = new String[mapNames.size()];
98 mapNames.toArray(retval);
99 return retval;
00 }
01
02 public static Attribute findAttribute(List attributes, Attribute search) {
03 System.err.println("JDOM: Searching for " + search.getName() + "=" + search.getValue());
04 for (Iterator attIter = attributes.iterator(); attIter.hasNext();) {
05 Attribute att = (Attribute) attIter.next();
06 System.err.println("JDOM: Attribute List " + att);
07 if (att.getName().equals(search.getName()) && att.getValue().equals(search.getValue())) return att;
08 }
09 return null;
10 }
11
12 public static boolean attributeEquals(List attributes1, List attributes2) {
13 Stack first = new Stack();
14 first.addAll(attributes1);
15
16 if (first.size() != attributes2.size()) return false;
17 while (first.size() != 0) {
18 Attribute a1 = (Attribute) first.pop();
19 Attribute a2 = findAttribute(attributes2, a1);
20 if (a2 == null) {
21 System.err.println("JDOM: false (4)");
22 return false;
23 }
24 System.err.println("JDOM: checking " + a1 + " == " + a2);
25 if ((!a1.getName().equals(a2.getName())) || (!a1.getValue().equals(a2.getValue()))) {
26 System.err.println("JDOM: false (3)");
27 return false;
28 }
29 }
30 return true;
31 }
32
33 public static boolean equalsDeep(Element firstElement, Element secondElement) {
34 boolean retval = true;
35 if ((firstElement == null) && (secondElement == null)) return true;
36 System.err.println("JDOM: checking " + firstElement + " == " + secondElement);
37 List contents = firstElement.getChildren();
38
39 if (contents.size() != secondElement.getChildren().size()) return false;
40
41 for (Iterator contentIter = contents.iterator(); contentIter.hasNext();) {
42 Element subElement = (Element) contentIter.next();
43 Element secondSubElement = secondElement.getChild(subElement.getName());
44 if (secondSubElement != null) {
45 if (attributeEquals(subElement.getAttributes(), secondSubElement.getAttributes())) {
46 System.err.println("JDOM: recursion " + subElement);
47 retval = equalsDeep(subElement, secondElement.getChild(subElement.getName()));
48 } else {
49 System.err.println("JDOM: false (1)");
50 return false;
51 }
52 } else {
53 System.err.println("JDOM: false (2)");
54 return false;
55 }
56 }
57 return retval;
58 }
59
60 public static boolean equals(Element firstElement, Element secondElement) {
61 List first = flattenTreeAsStrings(firstElement);
62 List second = flattenTreeAsStrings(secondElement);
63 System.err.println("Tree contains " + first.size() + " values");
64 if (first.size() != second.size()) return false;
65 first.removeAll(second);
66 if (first.size() != 0) {
67 System.err.println("Trees differ, values which are in clone but not in data:");
68 System.err.println(first);
69 return false;
70 }
71 return true;
72 }
73
74 public static List flattenTreeAsStrings(Element root) {
75 List retval = new ArrayList();
76 if (root == null) return retval;
77 List elements = root.getChildren();
78 if (elements != null && elements.size() > 0) {
79 for (Iterator elementIter = elements.iterator(); elementIter.hasNext();) {
80 Element element = (Element) elementIter.next();
81 retval.addAll(flattenTreeAsStrings(element));
82 }
83 } else {
84 retval.add(root.getName() + " " + attlistToString(root.getAttributes()) + " " + root.getText());
85 }
86 return retval;
87 }
88
89 public static String attlistToString(List attributes) {
90 String retval = "";
91 for (Iterator attIter = attributes.iterator(); attIter.hasNext();) {
92 Attribute att = (Attribute) attIter.next();
93 retval += att.getName() + "=" + att.getValue() + " ";
94 }
95 return retval;
96 }
97
98 public static Element getRoot() {
99 return JdomHelpers.root;
00 }
01
02 public static void setRoot(Element root) {
03 JdomHelpers.root = root;
04 }
05
06 public static void deepObjectDelete(String gameObjectName) {
07 List objectList = deepObjectFind(gameObjectName);
08 detachAll(objectList);
09 }
10
11 public static void deepObjectRename(String gameObjectName, String newName) {
12 List objectList = deepObjectFind(gameObjectName);
13 renameAll(objectList, newName);
14 }
15
16 public static List deepObjectFind(String gameObjectName) {
17 Element gamefile = root;
18 List retval = new ArrayList();
19
20 List maps = gamefile.getChildren("map");
21 for (Iterator mapIter = maps.iterator(); mapIter.hasNext();) {
22 Element mapElement = (Element) mapIter.next();
23 List rooms = mapElement.getChildren("room");
24 for (Iterator roomIter = rooms.iterator(); roomIter.hasNext();) {
25 Element roomElement = (Element) roomIter.next();
26 retval.addAll(findObjectElementsInContents(gameObjectName, roomElement.getChild("contents")));
27 retval.addAll(findObjectElementInEvents(gameObjectName, roomElement.getChildren("event")));
28 }
29 List transrooms = mapElement.getChildren("transitionroom");
30 for (Iterator transIter = transrooms.iterator(); transIter.hasNext();) {
31 Element transRoomElement = (Element) transIter.next();
32 retval.addAll(getPreconItems(gameObjectName, transRoomElement.getChildren("precondition")));
33
34 }
35 }
36 List player = gamefile.getChildren("player");
37 for (Iterator playerIter = player.iterator(); playerIter.hasNext();) {
38 Element playerElement = (Element) playerIter.next();
39 retval.addAll(findObjectElementsInContents(gameObjectName, playerElement.getChild("contents")));
40 retval.addAll(getItemFromTarget(gameObjectName, playerElement.getChildren("target")));
41 }
42 Element dialogs = gamefile.getChild("dialogs");
43 List dialogOwners = dialogs.getChildren("dialog-owner");
44 for (Iterator dialogOwnerIter = dialogOwners.iterator(); dialogOwnerIter.hasNext();) {
45 Element dialogOwnerElement = (Element) dialogOwnerIter.next();
46 if (dialogOwnerElement.getAttributeValue("name").equals(gameObjectName)) {
47 retval.add(dialogOwnerElement);
48 }
49 List dialogsObj = dialogOwnerElement.getChildren("dialog");
50 for (Iterator dialogIter = dialogsObj.iterator(); dialogIter.hasNext();) {
51 Element dialogElement = (Element) dialogIter.next();
52 retval.addAll(getPreconItems(gameObjectName, dialogElement.getChildren("precondition")));
53 }
54
55 }
56
57 Element gameobjects = gamefile.getChild("gameobjects");
58 Element character = gameobjects.getChild("characters");
59 List persons = character.getChildren("person");
60 for (Iterator personIter = persons.iterator(); personIter.hasNext();) {
61 Element personElement = (Element) personIter.next();
62 retval.addAll(findObjectElementInEvents(gameObjectName, personElement.getChildren("event")));
63 }
64
65 Element items = gameobjects.getChild("items");
66 List gameitems = items.getChildren("gameitem");
67 for (Iterator gameItemIter = gameitems.iterator(); gameItemIter.hasNext();) {
68 Element gameItemElement = (Element) gameItemIter.next();
69 retval.addAll(findObjectElementInEvents(gameObjectName, gameItemElement.getChildren("event")));
70 Element combinations = gameItemElement.getChild("combinations");
71 if (combinations != null) {
72 List withObjects = combinations.getChildren("with-object");
73 for (Iterator withObjIter = withObjects.iterator(); withObjIter.hasNext();) {
74 Element withObjElement = (Element) withObjIter.next();
75 if (withObjElement.getAttributeValue("name").equals(gameObjectName)) {
76 retval.add(withObjElement);
77 retval.addAll(getActionItems(gameObjectName, withObjElement.getChild("actions")));
78 }
79
80 }
81 }
82
83 }
84 System.err.println("Found " + retval.size() + " occurences of gameobject " + gameObjectName);
85 return retval;
86 }
87
88 public static List findObjectElementsInContents(String gameObjectName, Element contents) {
89 List retval = new ArrayList();
90 if (contents == null) return retval;
91 List childs = contents.getChildren();
92 for (Iterator contentIter = childs.iterator(); contentIter.hasNext();) {
93 Element itemElement = (Element) contentIter.next();
94 if (itemElement.getAttributeValue("name").equals(gameObjectName)) {
95 retval.add(itemElement);
96 }
97 }
98 return retval;
99 }
00
01 public static void detachAll(List elements) {
02 for (Iterator elementIter = elements.iterator(); elementIter.hasNext();) {
03 Element element = (Element) elementIter.next();
04 element.detach();
05 }
06 }
07
08 public static void renameAll(List elements, String newName) {
09 for (Iterator elementIter = elements.iterator(); elementIter.hasNext();) {
10 Element element = (Element) elementIter.next();
11 if (element.getAttributeValue("name") != null) {
12 element.setAttribute("name", newName);
13 } else if (element.getAttributeValue("item") != null) {
14 element.setAttribute("item", newName);
15 } else if (element.getAttributeValue("value") != null) {
16 element.setAttribute("value", newName);
17 } else if (element.getText() != null) {
18 element.setText(newName);
19 }
20 }
21 }
22
23 public static List getPreconItems(String gameObjectName, List precons) {
24 List retval = new ArrayList();
25 if (precons == null) return retval;
26 for (Iterator preconIter = precons.iterator(); preconIter.hasNext();) {
27 Element element = (Element) preconIter.next();
28 if (element.getAttributeValue("item").equals(gameObjectName)) {
29 retval.add(element);
30 }
31 }
32 return retval;
33
34 }
35
36 public static List findObjectElementInEvents(String gameObjectName, List events) {
37 List retval = new ArrayList();
38 if (events == null) return retval;
39 for (Iterator eventIter = events.iterator(); eventIter.hasNext();) {
40 Element eventElement = (Element) eventIter.next();
41 retval.addAll(getActionItems(gameObjectName, eventElement.getChild("actions")));
42 }
43 return retval;
44 }
45
46 public static List getActionItems(String gameObjectName, Element actions) {
47 List retval = new ArrayList();
48 if (actions == null) return retval;
49 List actionsElements = actions.getChildren();
50 for (Iterator actionIter = actionsElements.iterator(); actionIter.hasNext();) {
51 Element actionElement = (Element) actionIter.next();
52 String n = actionElement.getName();
53 if (n.equals("target")) {
54 List tmp = new ArrayList();
55 tmp.add(actionElement);
56 retval.addAll(getItemFromTarget(gameObjectName, tmp));
57 }
58 if (n.equals("inventory-item") || n.equals("room-item") || n.equals("delete-item")) {
59 retval.add(actionElement);
60 }
61 }
62 return retval;
63 }
64
65 public static List getItemFromTarget(String name, List target) {
66 List retval = new ArrayList();
67 if (target == null) return retval;
68 for (Iterator targetIter = target.iterator(); targetIter.hasNext();) {
69 Element targetElement = (Element) targetIter.next();
70 List conditions = targetElement.getChildren("condition");
71 for (Iterator condIter = conditions.iterator(); condIter.hasNext();) {
72 Element condElement = (Element) condIter.next();
73 if (condElement.getAttributeValue("value").equals(name)) {
74 retval.add(condElement);
75 }
76 }
77 }
78 return retval;
79
80 }
81
82}