1 /*
2  *  CVS: $Id: JdomHelpers.java,v 1.13 2004/07/20 12:06:19 marcus Exp $
3  * 
4  *  This file is part of zuul.
5  *
6  *  zuul is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10 *
11 *  zuul is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 *  GNU General Public License for more details.
15 *
16 *  You should have received a copy of the GNU General Public License
17 *  along with zuul; if not, write to the Free Software
18 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 * 
20 *  Copyrigth 2004 by marcus, leh
21 * 
22 */
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/**
50 * 
51 * Created on Jul 14, 2004
52 * 
53 * 
54 * @version $Revision: 1.13 $
55 */
56public class JdomHelpers {
57
58    private static Element root;
59
60    /**
61     *  
62     */
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}