XMLDomMapleData.java
上传用户:gwt600
上传日期:2021-06-03
资源大小:704k
文件大小:7k
源码类别:

游戏

开发平台:

Java

  1. /*
  2. This file is part of the OdinMS Maple Story Server
  3.     Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc> 
  4.                        Matthias Butz <matze@odinms.de>
  5.                        Jan Christian Meyer <vimes@odinms.de>
  6.     This program is free software: you can redistribute it and/or modify
  7.     it under the terms of the GNU Affero General Public License version 3
  8.     as published by the Free Software Foundation. You may not use, modify
  9.     or distribute this program under any other version of the
  10.     GNU Affero General Public License.
  11.     This program 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 Affero General Public License for more details.
  15.     You should have received a copy of the GNU Affero General Public License
  16.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18. package net.sf.odinms.provider.xmlwz;
  19. import java.awt.Point;
  20. import java.io.File;
  21. import java.io.FileInputStream;
  22. import java.io.IOException;
  23. import java.util.ArrayList;
  24. import java.util.Iterator;
  25. import java.util.List;
  26. import javax.xml.parsers.DocumentBuilder;
  27. import javax.xml.parsers.DocumentBuilderFactory;
  28. import javax.xml.parsers.ParserConfigurationException;
  29. import net.sf.odinms.provider.MapleData;
  30. import net.sf.odinms.provider.MapleDataEntity;
  31. import net.sf.odinms.provider.wz.MapleDataType;
  32. import org.w3c.dom.Document;
  33. import org.w3c.dom.NamedNodeMap;
  34. import org.w3c.dom.Node;
  35. import org.w3c.dom.NodeList;
  36. import org.xml.sax.SAXException;
  37. public class XMLDomMapleData implements MapleData {
  38. private Node node;
  39. private File imageDataDir;
  40. public XMLDomMapleData(FileInputStream fis, File imageDataDir) {
  41. try {
  42. DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
  43. DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
  44. Document document = documentBuilder.parse(fis);
  45. this.node = document.getFirstChild();
  46. } catch (ParserConfigurationException e) {
  47. throw new RuntimeException(e);
  48. } catch (SAXException e) {
  49. throw new RuntimeException(e);
  50. } catch (IOException e) {
  51. throw new RuntimeException(e);
  52. }
  53. this.imageDataDir = imageDataDir;
  54. }
  55. private XMLDomMapleData(Node node) {
  56. this.node = node;
  57. }
  58. @Override
  59. public MapleData getChildByPath(String path) {
  60. String segments[] = path.split("/");
  61. if (segments[0].equals("..")) {
  62. return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1));
  63. }
  64. Node myNode = node;
  65. for (int x = 0; x < segments.length; x++) {
  66. NodeList childNodes = myNode.getChildNodes();
  67. boolean foundChild = false;
  68. for (int i = 0; i < childNodes.getLength(); i++) {
  69. Node childNode = childNodes.item(i);
  70. if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getAttributes().getNamedItem("name").getNodeValue().equals(segments[x])) {
  71. myNode = childNode;
  72. foundChild = true;
  73. break;
  74. }
  75. }
  76. if (!foundChild) {
  77. return null;
  78. }
  79. }
  80. XMLDomMapleData ret = new XMLDomMapleData(myNode);
  81. ret.imageDataDir = new File(imageDataDir, getName() + "/" + path).getParentFile();
  82. return ret;
  83. }
  84. @Override
  85. public List<MapleData> getChildren() {
  86. List<MapleData> ret = new ArrayList<MapleData>();
  87. NodeList childNodes = node.getChildNodes();
  88. for (int i = 0; i < childNodes.getLength(); i++) {
  89. Node childNode = childNodes.item(i);
  90. if (childNode.getNodeType() == Node.ELEMENT_NODE) {
  91. XMLDomMapleData child = new XMLDomMapleData(childNode);
  92. child.imageDataDir = new File(imageDataDir, getName());
  93. ret.add(child);
  94. }
  95. }
  96. return ret;
  97. }
  98. @Override
  99. public Object getData() {
  100. NamedNodeMap attributes = node.getAttributes();
  101. MapleDataType type = getType();
  102. switch (type) {
  103. case DOUBLE:
  104. case FLOAT:
  105. case INT:
  106. case SHORT:
  107. case STRING:
  108. case UOL: {
  109. String value = attributes.getNamedItem("value").getNodeValue();
  110. switch (type) {
  111. case DOUBLE:
  112. return Double.valueOf(Double.parseDouble(value));
  113. case FLOAT:
  114. return Float.valueOf(Float.parseFloat(value));
  115. case INT:
  116. return Integer.valueOf(Integer.parseInt(value));
  117. case SHORT:
  118. return Short.valueOf(Short.parseShort(value));
  119. case STRING:
  120. case UOL:
  121. return value;
  122. }
  123. }
  124. case VECTOR: {
  125. String x = attributes.getNamedItem("x").getNodeValue();
  126. String y = attributes.getNamedItem("y").getNodeValue();
  127. return new Point(Integer.parseInt(x), Integer.parseInt(y));
  128. }
  129. case CANVAS: {
  130. String width = attributes.getNamedItem("width").getNodeValue();
  131. String height = attributes.getNamedItem("height").getNodeValue();
  132. return new FileStoredPngMapleCanvas(Integer.parseInt(width), Integer.parseInt(height), new File(
  133. imageDataDir, getName() + ".png"));
  134. }
  135. }
  136. return null;
  137. }
  138. @Override
  139. public MapleDataType getType() {
  140. String nodeName = node.getNodeName();
  141. if (nodeName.equals("imgdir")) {
  142. return MapleDataType.PROPERTY;
  143. } else if (nodeName.equals("canvas")) {
  144. return MapleDataType.CANVAS;
  145. } else if (nodeName.equals("convex")) {
  146. return MapleDataType.CONVEX;
  147. } else if (nodeName.equals("sound")) {
  148. return MapleDataType.SOUND;
  149. } else if (nodeName.equals("uol")) {
  150. return MapleDataType.UOL;
  151. } else if (nodeName.equals("double")) {
  152. return MapleDataType.DOUBLE;
  153. } else if (nodeName.equals("float")) {
  154. return MapleDataType.FLOAT;
  155. } else if (nodeName.equals("int")) {
  156. return MapleDataType.INT;
  157. } else if (nodeName.equals("short")) {
  158. return MapleDataType.SHORT;
  159. } else if (nodeName.equals("string")) {
  160. return MapleDataType.STRING;
  161. } else if (nodeName.equals("vector")) {
  162. return MapleDataType.VECTOR;
  163. } else if (nodeName.equals("null")) {
  164. return MapleDataType.IMG_0x00;
  165. }
  166. return null;
  167. }
  168. @Override
  169. public MapleDataEntity getParent() {
  170. Node parentNode = node.getParentNode();
  171. if (parentNode.getNodeType() == Node.DOCUMENT_NODE) {
  172. return null; // can't traverse outside the img file - TODO is this a problem?
  173. }
  174. XMLDomMapleData parentData = new XMLDomMapleData(parentNode);
  175. parentData.imageDataDir = imageDataDir.getParentFile();
  176. return parentData;
  177. }
  178. @Override
  179. public String getName() {
  180. return node.getAttributes().getNamedItem("name").getNodeValue();
  181. }
  182. @Override
  183. public Iterator<MapleData> iterator() {
  184. return getChildren().iterator();
  185. }
  186. }