home *** CD-ROM | disk | FTP | other *** search
- package nanoxml;
-
- import java.io.IOException;
- import java.io.Reader;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Properties;
- import java.util.Vector;
-
- public class XMLElement {
- public static final int NANOXML_MAJOR_VERSION = 1;
- public static final int NANOXML_MINOR_VERSION = 4;
- private Properties attributes;
- private Vector children;
- private String tagName;
- private String contents;
- private Properties conversionTable;
- private boolean skipLeadingWhitespace;
- private int lineNr;
-
- public XMLElement() {
- this(new Properties(), false, true);
- }
-
- public XMLElement(Properties var1) {
- this(var1, false, true);
- }
-
- public XMLElement(Properties var1, boolean var2) {
- this(var1, var2, true);
- }
-
- private XMLElement(Properties var1, boolean var2, boolean var3) {
- this.skipLeadingWhitespace = var2;
- this.tagName = null;
- this.contents = null;
- this.attributes = new Properties();
- this.children = new Vector();
- this.conversionTable = var1;
- this.lineNr = 0;
- if (var3) {
- this.conversionTable.put("lt", "<");
- this.conversionTable.put("gt", ">");
- this.conversionTable.put("quot", "\"");
- this.conversionTable.put("apos", "'");
- this.conversionTable.put("amp", "&");
- }
-
- }
-
- public XMLElement(boolean var1) {
- this(new Properties(), var1, true);
- }
-
- public int countChildren() {
- return this.children.size();
- }
-
- private String decodeString(String var1, int var2) {
- StringBuffer var3 = new StringBuffer(var1.length());
- int var7 = 0;
-
- while(true) {
- int var5 = (var1 + '&').indexOf(38, var7);
- var3.append(var1.substring(var7, var5));
- if (var5 == var1.length()) {
- break;
- }
-
- var7 = var1.indexOf(59, var5);
- if (var7 < 0) {
- var3.append(var1.substring(var5));
- break;
- }
-
- String var6 = var1.substring(var5 + 1, var7);
- if (var6.charAt(0) == '#') {
- if (var6.charAt(1) == 'x') {
- var3.append((char)Integer.parseInt(var6.substring(2), 16));
- } else {
- var3.append((char)Integer.parseInt(var6.substring(1), 10));
- }
- } else {
- var3.append(this.conversionTable.getProperty(var6, "&" + var6 + ';'));
- }
-
- ++var7;
- }
-
- return var3.toString();
- }
-
- public Enumeration enumerateChildren() {
- return this.children.elements();
- }
-
- private XMLParseException expectedInput(String var1, int var2) {
- String var3 = "Expected: " + var1;
- return new XMLParseException(this.getTagName(), var2, var3);
- }
-
- public Vector getChildren() {
- return this.children;
- }
-
- public String getContents() {
- return this.contents;
- }
-
- public int getIntProperty(String var1, Hashtable var2, String var3) {
- String var4 = this.attributes.getProperty(var1);
- if (var4 == null) {
- var4 = var3;
- }
-
- Integer var5;
- try {
- var5 = (Integer)var2.get(var4);
- } catch (ClassCastException var6) {
- throw this.invalidValueSet(var1);
- }
-
- if (var5 == null) {
- throw this.invalidValue(var1, var4, this.lineNr);
- } else {
- return var5;
- }
- }
-
- public int getLineNr() {
- return this.lineNr;
- }
-
- public String getProperty(String var1) {
- return this.attributes.getProperty(var1);
- }
-
- public double getProperty(String var1, double var2) {
- String var4 = this.attributes.getProperty(var1);
- if (var4 == null) {
- return var2;
- } else {
- try {
- return Double.valueOf(var4);
- } catch (NumberFormatException var5) {
- throw this.invalidValue(var1, var4, this.lineNr);
- }
- }
- }
-
- public int getProperty(String var1, int var2) {
- String var3 = this.attributes.getProperty(var1);
- if (var3 == null) {
- return var2;
- } else {
- try {
- return Integer.parseInt(var3);
- } catch (NumberFormatException var4) {
- throw this.invalidValue(var1, var3, this.lineNr);
- }
- }
- }
-
- public String getProperty(String var1, String var2) {
- return this.attributes.getProperty(var1, var2);
- }
-
- public boolean getProperty(String var1, String var2, String var3, boolean var4) {
- String var5 = this.attributes.getProperty(var1);
- if (var5 == null) {
- return var4;
- } else if (var5.equals(var2)) {
- return true;
- } else if (var5.equals(var3)) {
- return false;
- } else {
- throw this.invalidValue(var1, var5, this.lineNr);
- }
- }
-
- public Object getProperty(String var1, Hashtable var2, String var3) {
- String var4 = this.attributes.getProperty(var1);
- if (var4 == null) {
- var4 = var3;
- }
-
- Object var5 = var2.get(var4);
- if (var5 == null) {
- throw this.invalidValue(var1, var4, this.lineNr);
- } else {
- return var5;
- }
- }
-
- public double getSpecialDoubleProperty(String var1, Hashtable var2, String var3) {
- String var4 = this.attributes.getProperty(var1);
- if (var4 == null) {
- var4 = var3;
- }
-
- Double var5;
- try {
- var5 = (Double)var2.get(var4);
- } catch (ClassCastException var7) {
- throw this.invalidValueSet(var1);
- }
-
- if (var5 == null) {
- try {
- var5 = Double.valueOf(var4);
- } catch (NumberFormatException var6) {
- throw this.invalidValue(var1, var4, this.lineNr);
- }
- }
-
- return var5;
- }
-
- public int getSpecialIntProperty(String var1, Hashtable var2, String var3) {
- String var4 = this.attributes.getProperty(var1);
- if (var4 == null) {
- var4 = var3;
- }
-
- Integer var5;
- try {
- var5 = (Integer)var2.get(var4);
- } catch (ClassCastException var7) {
- throw this.invalidValueSet(var1);
- }
-
- if (var5 == null) {
- try {
- return Integer.parseInt(var4);
- } catch (NumberFormatException var6) {
- throw this.invalidValue(var1, var4, this.lineNr);
- }
- } else {
- return var5;
- }
- }
-
- public String getStringProperty(String var1, Hashtable var2, String var3) {
- String var4 = this.attributes.getProperty(var1);
- if (var4 == null) {
- var4 = var3;
- }
-
- String var5;
- try {
- var5 = (String)var2.get(var4);
- } catch (ClassCastException var6) {
- throw this.invalidValueSet(var1);
- }
-
- if (var5 == null) {
- throw this.invalidValue(var1, var4, this.lineNr);
- } else {
- return var5;
- }
- }
-
- public String getTagName() {
- return this.tagName;
- }
-
- private XMLParseException invalidValue(String var1, String var2, int var3) {
- String var4 = "Attribute \"" + var1 + "\" does not contain a valid " + "value (\"" + var2 + "\")";
- return new XMLParseException(this.getTagName(), var3, var4);
- }
-
- private XMLParseException invalidValueSet(String var1) {
- String var2 = "Invalid value set (key = \"" + var1 + "\")";
- return new XMLParseException(this.getTagName(), var2);
- }
-
- private boolean isIdentifierChar(char var1) {
- return var1 >= 'A' && var1 <= 'Z' || var1 >= 'a' && var1 <= 'z' || var1 >= '0' && var1 <= '9' || ".-_:".indexOf(var1) >= 0;
- }
-
- public int parseCharArray(char[] var1, int var2, int var3) throws XMLParseException {
- return this.parseCharArray(var1, var2, var3, 1);
- }
-
- public int parseCharArray(char[] var1, int var2, int var3, int var4) throws XMLParseException {
- int[] var5 = new int[]{var4};
- return this.parseCharArray(var1, var2, var3, var5);
- }
-
- private int parseCharArray(char[] var1, int var2, int var3, int[] var4) throws XMLParseException {
- var2 = this.skipWhitespace(var1, var2, var3, var4);
- var2 = this.skipPreamble(var1, var2, var3, var4);
- var2 = this.scanTagName(var1, var2, var3, var4);
- this.lineNr = var4[0];
- var2 = this.scanAttributes(var1, var2, var3, var4);
- int[] var5 = new int[1];
- int[] var6 = new int[1];
- int var7 = var4[0];
- var2 = this.scanContent(var1, var2, var3, var5, var6, var4);
- if (var6[0] > 0) {
- this.scanChildren(var1, var5[0], var6[0], var7);
- if (this.children.size() > 0) {
- this.contents = null;
- } else {
- this.processContents(var1, var5[0], var6[0], var7);
- }
- }
-
- return var2;
- }
-
- public void parseFromReader(Reader var1) throws IOException, XMLParseException {
- this.parseFromReader(var1, 1);
- }
-
- public void parseFromReader(Reader var1, int var2) throws IOException, XMLParseException {
- short var3 = 4096;
- char[] var4 = null;
-
- int var5;
- for(var5 = 0; var1.ready(); var5 += var1.read(var4, var5, var3)) {
- if (var4 == null) {
- var4 = new char[var3];
- } else {
- char[] var6 = var4;
- var4 = new char[var4.length + var3];
- System.arraycopy(var6, 0, var4, 0, var6.length);
- }
- }
-
- this.parseCharArray(var4, 0, var5, var2);
- }
-
- public void parseString(String var1) throws XMLParseException {
- this.parseCharArray(var1.toCharArray(), 0, var1.length(), 1);
- }
-
- public int parseString(String var1, int var2) throws XMLParseException {
- return this.parseCharArray(var1.toCharArray(), var2, var1.length(), 1);
- }
-
- public int parseString(String var1, int var2, int var3) throws XMLParseException {
- return this.parseCharArray(var1.toCharArray(), var2, var3, 1);
- }
-
- public int parseString(String var1, int var2, int var3, int var4) throws XMLParseException {
- return this.parseCharArray(var1.toCharArray(), var2, var3, var4);
- }
-
- private void processContents(char[] var1, int var2, int var3, int var4) throws XMLParseException {
- int[] var5 = new int[]{var4};
- if (!this.skipLeadingWhitespace) {
- String var10 = new String(var1, var2, var3);
- this.contents = this.decodeString(var10, var5[0]);
- } else {
- StringBuffer var6 = new StringBuffer(var3);
- int var7 = var3 + var2;
-
- for(int var8 = var2; var8 < var7; ++var8) {
- char var9;
- for(var9 = var1[var8]; var9 == '\r' || var9 == '\n'; var9 = var1[var8]) {
- int var10002 = var5[0]++;
- var6.append(var9);
- ++var8;
- var9 = var1[var8];
- if (var9 != '\n') {
- var6.append(var9);
- }
-
- while(true) {
- ++var8;
- if (var9 != ' ' && var9 != '\t') {
- break;
- }
- }
- }
-
- if (var8 < var7) {
- var6.append(var9);
- }
- }
-
- this.contents = this.decodeString(var6.toString(), var5[0]);
- }
- }
-
- private int scanAttributes(char[] var1, int var2, int var3, int[] var4) throws XMLParseException {
- while(true) {
- var2 = this.skipWhitespace(var1, var2, var3, var4);
- char var7 = var1[var2];
- if (var7 == '/' || var7 == '>') {
- return var2;
- }
-
- var2 = this.scanOneAttribute(var1, var2, var3, var4);
- }
- }
-
- private void scanChildren(char[] var1, int var2, int var3, int var4) throws XMLParseException {
- int var5 = var2 + var3;
- int var6 = var2;
- int[] var7 = new int[]{var4};
-
- while(var6 < var5) {
- try {
- var6 = this.skipWhitespace(var1, var6, var5, var7);
- } catch (XMLParseException var9) {
- return;
- }
-
- if (var1[var6] != '<') {
- return;
- }
-
- XMLElement var8 = new XMLElement(this.conversionTable, this.skipLeadingWhitespace, false);
- var6 = var8.parseCharArray(var1, var6, var5, var7);
- this.children.addElement(var8);
- }
-
- }
-
- private int scanContent(char[] var1, int var2, int var3, int[] var4, int[] var5, int[] var6) throws XMLParseException {
- if (var1[var2] == '/') {
- var5[0] = 0;
- if (var1[var2 + 1] != '>') {
- throw this.expectedInput("'>'", var6[0]);
- } else {
- return var2 + 2;
- }
- } else if (var1[var2] != '>') {
- throw this.expectedInput("'>'", var6[0]);
- } else {
- if (this.skipLeadingWhitespace) {
- var2 = this.skipWhitespace(var1, var2 + 1, var3, var6);
- } else {
- ++var2;
- }
-
- var4[0] = var2;
- int var8 = 0;
- char[] var9 = this.tagName.toCharArray();
- var3 -= var9.length + 2;
-
- while(var2 < var3 && var8 >= 0) {
- if (var1[var2] == '<') {
- boolean var10 = true;
-
- for(int var11 = 0; var10 && var11 < var9.length; ++var11) {
- var10 &= var1[var2 + var11 + 1] == var9[var11];
- }
-
- if (var10) {
- int var18 = var2 + var9.length + 1;
- var2 = this.skipWhitespace(var1, var18, var3, var6);
- if (var1[var2] == '>' || var18 != var2 && var1[var2] != '/') {
- ++var8;
- }
- continue;
- }
-
- if (var1[var2 + 1] == '/') {
- var10 = true;
-
- for(int var12 = 0; var10 && var12 < var9.length; ++var12) {
- var10 &= var1[var2 + var12 + 2] == var9[var12];
- }
-
- if (var10) {
- var5[0] = var2 - var4[0];
- var2 += var9.length + 2;
- var2 = this.skipWhitespace(var1, var2, var3, var6);
- if (var1[var2] == '>') {
- --var8;
- ++var2;
- }
- continue;
- }
- }
- }
-
- if (var1[var2] == '\r') {
- int var10002 = var6[0]++;
- if (var2 != var3 && var1[var2 + 1] == '\n') {
- ++var2;
- }
- } else if (var1[var2] == '\n') {
- int var19 = var6[0]++;
- }
-
- ++var2;
- }
-
- if (var8 >= 0) {
- throw this.unexpectedEndOfData(var6[0]);
- } else {
- int var20;
- if (this.skipLeadingWhitespace) {
- for(int var17 = var4[0] + var5[0] - 1; var5[0] >= 0 && var1[var17] <= ' '; var20 = var5[0]--) {
- --var17;
- }
- }
-
- return var2;
- }
- }
- }
-
- private String scanIdentifier(char[] var1, int var2, int var3) {
- int var4;
- for(var4 = var2; var2 < var3 && this.isIdentifierChar(var1[var2]); ++var2) {
- }
-
- return var2 != var3 && var2 != var4 ? new String(var1, var4, var2 - var4) : null;
- }
-
- private int scanOneAttribute(char[] var1, int var2, int var3, int[] var4) throws XMLParseException {
- String var5 = this.scanIdentifier(var1, var2, var3);
- if (var5 == null) {
- throw this.syntaxError("an attribute key", var4[0]);
- } else {
- var2 = this.skipWhitespace(var1, var2 + var5.length(), var3, var4);
- var5 = var5.toUpperCase();
- if (var1[var2] != '=') {
- throw this.valueMissingForAttribute(var5, var4[0]);
- } else {
- var2 = this.skipWhitespace(var1, var2 + 1, var3, var4);
- String var6 = this.scanString(var1, var2, var3, var4);
- if (var6 == null) {
- throw this.syntaxError("an attribute value", var4[0]);
- } else {
- if (var6.charAt(0) == '"') {
- var6 = var6.substring(1, var6.length() - 1);
- var2 += 2;
- }
-
- this.attributes.put(var5, this.decodeString(var6, var4[0]));
- return var2 + var6.length();
- }
- }
- }
- }
-
- private String scanString(char[] var1, int var2, int var3, int[] var4) throws XMLParseException {
- char var5 = var1[var2];
- if (var5 != '"') {
- return this.scanIdentifier(var1, var2, var3);
- } else {
- int var6;
- for(var6 = var2++; var2 < var3 && var1[var2] != var5; ++var2) {
- if (var1[var2] == '\r') {
- int var10002 = var4[0]++;
- if (var2 != var3 && var1[var2 + 1] == '\n') {
- ++var2;
- }
- } else if (var1[var2] == '\n') {
- int var8 = var4[0]++;
- }
- }
-
- return var2 == var3 ? null : new String(var1, var6, var2 - var6 + 1);
- }
- }
-
- private int scanTagName(char[] var1, int var2, int var3, int[] var4) throws XMLParseException {
- this.tagName = this.scanIdentifier(var1, var2, var3);
- if (this.tagName == null) {
- throw this.syntaxError("a tag name", var4[0]);
- } else {
- return var2 + this.tagName.length();
- }
- }
-
- private int skipBogusTag(char[] var1, int var2, int var3, int[] var4) {
- if (var1[var2 + 1] == '-' && var1[var2 + 2] == '-') {
- for(; var2 < var3 && (var1[var2] != '-' || var1[var2 + 1] != '-' || var1[var2 + 2] != '>'); ++var2) {
- if (var1[var2] == '\r') {
- int var8 = var4[0]++;
- if (var2 != var3 && var1[var2 + 1] == '\n') {
- ++var2;
- }
- } else if (var1[var2] == '\n') {
- int var9 = var4[0]++;
- }
- }
-
- if (var2 == var3) {
- throw this.unexpectedEndOfData(var4[0]);
- } else {
- return var2 + 3;
- }
- } else {
- int var5 = 1;
-
- while(var2 < var3) {
- char var6 = var1[var2++];
- switch (var6) {
- case '\n':
- int var7 = var4[0]++;
- break;
- case '\r':
- if (var2 < var3 && var1[var2] == '\n') {
- ++var2;
- }
-
- int var10002 = var4[0]++;
- break;
- case '<':
- ++var5;
- break;
- case '>':
- --var5;
- if (var5 == 0) {
- return var2;
- }
- }
- }
-
- throw this.unexpectedEndOfData(var4[0]);
- }
- }
-
- private int skipPreamble(char[] param1, int param2, int param3, int[] param4) throws XMLParseException {
- // $FF: Couldn't be decompiled
- }
-
- private int skipWhitespace(char[] var1, int var2, int var3, int[] var4) {
- for(; var2 < var3 && var1[var2] <= ' '; ++var2) {
- if (var1[var2] == '\r') {
- int var10002 = var4[0]++;
- if (var2 != var3 && var1[var2 + 1] == '\n') {
- ++var2;
- }
- } else if (var1[var2] == '\n') {
- int var5 = var4[0]++;
- }
- }
-
- if (var2 == var3) {
- throw this.unexpectedEndOfData(var4[0]);
- } else {
- return var2;
- }
- }
-
- private XMLParseException syntaxError(String var1, int var2) {
- String var3 = "Syntax error while parsing " + var1;
- return new XMLParseException(this.getTagName(), var2, var3);
- }
-
- private XMLParseException unexpectedEndOfData(int var1) {
- String var2 = "Unexpected end of data reached";
- return new XMLParseException(this.getTagName(), var1, var2);
- }
-
- private XMLParseException valueMissingForAttribute(String var1, int var2) {
- String var3 = "Value missing for attribute with key \"" + var1 + "\"";
- return new XMLParseException(this.getTagName(), var2, var3);
- }
- }
-