package vooga.towerdefense.gameeditor.gamemaker.xmlwriters; import java.util.ArrayList; import java.util.List; import org.w3c.dom.Element; import util.XMLTool; /** * This class is responsible for reading in a data string containing information * about actions, their parameters, and their sub-actions. The class reads this * string, and then can return a root Element for an xml file. * * An example of the data string can be shown below: * * Action1 param1 param2 * Action3 param1 param2 param3 * Action4 param1 * Action5 param1 * Action2 param1 param2 param3 param4 * * This data string is then converted to the following XML. * * <actions> * <action1> * <parameter>param1</parameter> * <parameter>param2</parameter> * <action3> * <parameter>param1</parameter> * <parameter>param2</parameter> * <parameter>param3</parameter> * <action4> * <parameter>param1</parameter> * </action4> * </action3> * <action5> * <parameter>param1</parameter> * </action5> * </action1> * <action2> * <parameter>param1</parameter> * <parameter>param2</parameter> * <parameter>param3</parameter> * <parameter>param4</parameter> * </action2> * </actions> * * @author Erick Gonzalez */ public class ActionXMLWriter { private static final String PARAM_TAG = "parameter"; private static final char TAB = '\t'; private static final String WHITESPACE_REGEX = "\\s+"; private int myIndex; private XMLTool myXMLTool; /** * * @param xmlTool an xml tool containing a document being written to */ public ActionXMLWriter (XMLTool xmlTool) { myIndex = 0; myXMLTool = xmlTool; } /** * * @param rootElement the root XML element * @param dataString the string of actions * @return the rootElement, now containing all its appropriate subElements. */ public Element parse (Element rootElement, String dataString) { String[] dataArray = dataString.split("\n"); while (myIndex < dataArray.length) { myXMLTool.addChild(rootElement, parse(dataArray, 0)); } return rootElement; } private Element parse (String[] dataArray, int numTabs) { String actionString = dataArray[myIndex++]; String actionName = getActionName(actionString); List<String> params = getParams(actionString); Element currentElement = myXMLTool.makeElement(actionName); for (String param : params) { Element parameterElement = myXMLTool.makeElement(PARAM_TAG, param); myXMLTool.addChild(currentElement, parameterElement); } while (myIndex < dataArray.length) { String next = dataArray[myIndex]; if (countTabs(next) > numTabs) { Element child = parse(dataArray, numTabs + 1); myXMLTool.addChild(currentElement, child); } else { break; } } return currentElement; } private String getActionName (String actionString) { String[] actionSplitString = actionString.trim().split(WHITESPACE_REGEX); return actionSplitString[0]; } private List<String> getParams (String actionString) { String[] actionSplitString = actionString.trim().split(WHITESPACE_REGEX); List<String> params = new ArrayList<String>(); for (int i = 1; i < actionSplitString.length; ++i) { params.add(actionSplitString[i]); } return params; } private int countTabs (String s) { int count = 0; for (int i = 0; i < s.length(); ++i) { if (s.charAt(i) == TAB) { count++; } } return count; } }