home *** CD-ROM | disk | FTP | other *** search
/ PC User 2001 August / APC_Aug2001_CD2.iso / features / web_dev / files / jext-install.exe / file0939.bin / nanoxml / XMLElement.class (.txt) next >
Encoding:
Java Class File  |  2000-11-26  |  10.8 KB  |  660 lines

  1. package nanoxml;
  2.  
  3. import java.io.IOException;
  4. import java.io.Reader;
  5. import java.util.Enumeration;
  6. import java.util.Hashtable;
  7. import java.util.Properties;
  8. import java.util.Vector;
  9.  
  10. public class XMLElement {
  11.    public static final int NANOXML_MAJOR_VERSION = 1;
  12.    public static final int NANOXML_MINOR_VERSION = 4;
  13.    private Properties attributes;
  14.    private Vector children;
  15.    private String tagName;
  16.    private String contents;
  17.    private Properties conversionTable;
  18.    private boolean skipLeadingWhitespace;
  19.    private int lineNr;
  20.  
  21.    public XMLElement() {
  22.       this(new Properties(), false, true);
  23.    }
  24.  
  25.    public XMLElement(Properties var1) {
  26.       this(var1, false, true);
  27.    }
  28.  
  29.    public XMLElement(Properties var1, boolean var2) {
  30.       this(var1, var2, true);
  31.    }
  32.  
  33.    private XMLElement(Properties var1, boolean var2, boolean var3) {
  34.       this.skipLeadingWhitespace = var2;
  35.       this.tagName = null;
  36.       this.contents = null;
  37.       this.attributes = new Properties();
  38.       this.children = new Vector();
  39.       this.conversionTable = var1;
  40.       this.lineNr = 0;
  41.       if (var3) {
  42.          this.conversionTable.put("lt", "<");
  43.          this.conversionTable.put("gt", ">");
  44.          this.conversionTable.put("quot", "\"");
  45.          this.conversionTable.put("apos", "'");
  46.          this.conversionTable.put("amp", "&");
  47.       }
  48.  
  49.    }
  50.  
  51.    public XMLElement(boolean var1) {
  52.       this(new Properties(), var1, true);
  53.    }
  54.  
  55.    public int countChildren() {
  56.       return this.children.size();
  57.    }
  58.  
  59.    private String decodeString(String var1, int var2) {
  60.       StringBuffer var3 = new StringBuffer(var1.length());
  61.       int var7 = 0;
  62.  
  63.       while(true) {
  64.          int var5 = (var1 + '&').indexOf(38, var7);
  65.          var3.append(var1.substring(var7, var5));
  66.          if (var5 == var1.length()) {
  67.             break;
  68.          }
  69.  
  70.          var7 = var1.indexOf(59, var5);
  71.          if (var7 < 0) {
  72.             var3.append(var1.substring(var5));
  73.             break;
  74.          }
  75.  
  76.          String var6 = var1.substring(var5 + 1, var7);
  77.          if (var6.charAt(0) == '#') {
  78.             if (var6.charAt(1) == 'x') {
  79.                var3.append((char)Integer.parseInt(var6.substring(2), 16));
  80.             } else {
  81.                var3.append((char)Integer.parseInt(var6.substring(1), 10));
  82.             }
  83.          } else {
  84.             var3.append(this.conversionTable.getProperty(var6, "&" + var6 + ';'));
  85.          }
  86.  
  87.          ++var7;
  88.       }
  89.  
  90.       return var3.toString();
  91.    }
  92.  
  93.    public Enumeration enumerateChildren() {
  94.       return this.children.elements();
  95.    }
  96.  
  97.    private XMLParseException expectedInput(String var1, int var2) {
  98.       String var3 = "Expected: " + var1;
  99.       return new XMLParseException(this.getTagName(), var2, var3);
  100.    }
  101.  
  102.    public Vector getChildren() {
  103.       return this.children;
  104.    }
  105.  
  106.    public String getContents() {
  107.       return this.contents;
  108.    }
  109.  
  110.    public int getIntProperty(String var1, Hashtable var2, String var3) {
  111.       String var4 = this.attributes.getProperty(var1);
  112.       if (var4 == null) {
  113.          var4 = var3;
  114.       }
  115.  
  116.       Integer var5;
  117.       try {
  118.          var5 = (Integer)var2.get(var4);
  119.       } catch (ClassCastException var6) {
  120.          throw this.invalidValueSet(var1);
  121.       }
  122.  
  123.       if (var5 == null) {
  124.          throw this.invalidValue(var1, var4, this.lineNr);
  125.       } else {
  126.          return var5;
  127.       }
  128.    }
  129.  
  130.    public int getLineNr() {
  131.       return this.lineNr;
  132.    }
  133.  
  134.    public String getProperty(String var1) {
  135.       return this.attributes.getProperty(var1);
  136.    }
  137.  
  138.    public double getProperty(String var1, double var2) {
  139.       String var4 = this.attributes.getProperty(var1);
  140.       if (var4 == null) {
  141.          return var2;
  142.       } else {
  143.          try {
  144.             return Double.valueOf(var4);
  145.          } catch (NumberFormatException var5) {
  146.             throw this.invalidValue(var1, var4, this.lineNr);
  147.          }
  148.       }
  149.    }
  150.  
  151.    public int getProperty(String var1, int var2) {
  152.       String var3 = this.attributes.getProperty(var1);
  153.       if (var3 == null) {
  154.          return var2;
  155.       } else {
  156.          try {
  157.             return Integer.parseInt(var3);
  158.          } catch (NumberFormatException var4) {
  159.             throw this.invalidValue(var1, var3, this.lineNr);
  160.          }
  161.       }
  162.    }
  163.  
  164.    public String getProperty(String var1, String var2) {
  165.       return this.attributes.getProperty(var1, var2);
  166.    }
  167.  
  168.    public boolean getProperty(String var1, String var2, String var3, boolean var4) {
  169.       String var5 = this.attributes.getProperty(var1);
  170.       if (var5 == null) {
  171.          return var4;
  172.       } else if (var5.equals(var2)) {
  173.          return true;
  174.       } else if (var5.equals(var3)) {
  175.          return false;
  176.       } else {
  177.          throw this.invalidValue(var1, var5, this.lineNr);
  178.       }
  179.    }
  180.  
  181.    public Object getProperty(String var1, Hashtable var2, String var3) {
  182.       String var4 = this.attributes.getProperty(var1);
  183.       if (var4 == null) {
  184.          var4 = var3;
  185.       }
  186.  
  187.       Object var5 = var2.get(var4);
  188.       if (var5 == null) {
  189.          throw this.invalidValue(var1, var4, this.lineNr);
  190.       } else {
  191.          return var5;
  192.       }
  193.    }
  194.  
  195.    public double getSpecialDoubleProperty(String var1, Hashtable var2, String var3) {
  196.       String var4 = this.attributes.getProperty(var1);
  197.       if (var4 == null) {
  198.          var4 = var3;
  199.       }
  200.  
  201.       Double var5;
  202.       try {
  203.          var5 = (Double)var2.get(var4);
  204.       } catch (ClassCastException var7) {
  205.          throw this.invalidValueSet(var1);
  206.       }
  207.  
  208.       if (var5 == null) {
  209.          try {
  210.             var5 = Double.valueOf(var4);
  211.          } catch (NumberFormatException var6) {
  212.             throw this.invalidValue(var1, var4, this.lineNr);
  213.          }
  214.       }
  215.  
  216.       return var5;
  217.    }
  218.  
  219.    public int getSpecialIntProperty(String var1, Hashtable var2, String var3) {
  220.       String var4 = this.attributes.getProperty(var1);
  221.       if (var4 == null) {
  222.          var4 = var3;
  223.       }
  224.  
  225.       Integer var5;
  226.       try {
  227.          var5 = (Integer)var2.get(var4);
  228.       } catch (ClassCastException var7) {
  229.          throw this.invalidValueSet(var1);
  230.       }
  231.  
  232.       if (var5 == null) {
  233.          try {
  234.             return Integer.parseInt(var4);
  235.          } catch (NumberFormatException var6) {
  236.             throw this.invalidValue(var1, var4, this.lineNr);
  237.          }
  238.       } else {
  239.          return var5;
  240.       }
  241.    }
  242.  
  243.    public String getStringProperty(String var1, Hashtable var2, String var3) {
  244.       String var4 = this.attributes.getProperty(var1);
  245.       if (var4 == null) {
  246.          var4 = var3;
  247.       }
  248.  
  249.       String var5;
  250.       try {
  251.          var5 = (String)var2.get(var4);
  252.       } catch (ClassCastException var6) {
  253.          throw this.invalidValueSet(var1);
  254.       }
  255.  
  256.       if (var5 == null) {
  257.          throw this.invalidValue(var1, var4, this.lineNr);
  258.       } else {
  259.          return var5;
  260.       }
  261.    }
  262.  
  263.    public String getTagName() {
  264.       return this.tagName;
  265.    }
  266.  
  267.    private XMLParseException invalidValue(String var1, String var2, int var3) {
  268.       String var4 = "Attribute \"" + var1 + "\" does not contain a valid " + "value (\"" + var2 + "\")";
  269.       return new XMLParseException(this.getTagName(), var3, var4);
  270.    }
  271.  
  272.    private XMLParseException invalidValueSet(String var1) {
  273.       String var2 = "Invalid value set (key = \"" + var1 + "\")";
  274.       return new XMLParseException(this.getTagName(), var2);
  275.    }
  276.  
  277.    private boolean isIdentifierChar(char var1) {
  278.       return var1 >= 'A' && var1 <= 'Z' || var1 >= 'a' && var1 <= 'z' || var1 >= '0' && var1 <= '9' || ".-_:".indexOf(var1) >= 0;
  279.    }
  280.  
  281.    public int parseCharArray(char[] var1, int var2, int var3) throws XMLParseException {
  282.       return this.parseCharArray(var1, var2, var3, 1);
  283.    }
  284.  
  285.    public int parseCharArray(char[] var1, int var2, int var3, int var4) throws XMLParseException {
  286.       int[] var5 = new int[]{var4};
  287.       return this.parseCharArray(var1, var2, var3, var5);
  288.    }
  289.  
  290.    private int parseCharArray(char[] var1, int var2, int var3, int[] var4) throws XMLParseException {
  291.       var2 = this.skipWhitespace(var1, var2, var3, var4);
  292.       var2 = this.skipPreamble(var1, var2, var3, var4);
  293.       var2 = this.scanTagName(var1, var2, var3, var4);
  294.       this.lineNr = var4[0];
  295.       var2 = this.scanAttributes(var1, var2, var3, var4);
  296.       int[] var5 = new int[1];
  297.       int[] var6 = new int[1];
  298.       int var7 = var4[0];
  299.       var2 = this.scanContent(var1, var2, var3, var5, var6, var4);
  300.       if (var6[0] > 0) {
  301.          this.scanChildren(var1, var5[0], var6[0], var7);
  302.          if (this.children.size() > 0) {
  303.             this.contents = null;
  304.          } else {
  305.             this.processContents(var1, var5[0], var6[0], var7);
  306.          }
  307.       }
  308.  
  309.       return var2;
  310.    }
  311.  
  312.    public void parseFromReader(Reader var1) throws IOException, XMLParseException {
  313.       this.parseFromReader(var1, 1);
  314.    }
  315.  
  316.    public void parseFromReader(Reader var1, int var2) throws IOException, XMLParseException {
  317.       short var3 = 4096;
  318.       char[] var4 = null;
  319.  
  320.       int var5;
  321.       for(var5 = 0; var1.ready(); var5 += var1.read(var4, var5, var3)) {
  322.          if (var4 == null) {
  323.             var4 = new char[var3];
  324.          } else {
  325.             char[] var6 = var4;
  326.             var4 = new char[var4.length + var3];
  327.             System.arraycopy(var6, 0, var4, 0, var6.length);
  328.          }
  329.       }
  330.  
  331.       this.parseCharArray(var4, 0, var5, var2);
  332.    }
  333.  
  334.    public void parseString(String var1) throws XMLParseException {
  335.       this.parseCharArray(var1.toCharArray(), 0, var1.length(), 1);
  336.    }
  337.  
  338.    public int parseString(String var1, int var2) throws XMLParseException {
  339.       return this.parseCharArray(var1.toCharArray(), var2, var1.length(), 1);
  340.    }
  341.  
  342.    public int parseString(String var1, int var2, int var3) throws XMLParseException {
  343.       return this.parseCharArray(var1.toCharArray(), var2, var3, 1);
  344.    }
  345.  
  346.    public int parseString(String var1, int var2, int var3, int var4) throws XMLParseException {
  347.       return this.parseCharArray(var1.toCharArray(), var2, var3, var4);
  348.    }
  349.  
  350.    private void processContents(char[] var1, int var2, int var3, int var4) throws XMLParseException {
  351.       int[] var5 = new int[]{var4};
  352.       if (!this.skipLeadingWhitespace) {
  353.          String var10 = new String(var1, var2, var3);
  354.          this.contents = this.decodeString(var10, var5[0]);
  355.       } else {
  356.          StringBuffer var6 = new StringBuffer(var3);
  357.          int var7 = var3 + var2;
  358.  
  359.          for(int var8 = var2; var8 < var7; ++var8) {
  360.             char var9;
  361.             for(var9 = var1[var8]; var9 == '\r' || var9 == '\n'; var9 = var1[var8]) {
  362.                int var10002 = var5[0]++;
  363.                var6.append(var9);
  364.                ++var8;
  365.                var9 = var1[var8];
  366.                if (var9 != '\n') {
  367.                   var6.append(var9);
  368.                }
  369.  
  370.                while(true) {
  371.                   ++var8;
  372.                   if (var9 != ' ' && var9 != '\t') {
  373.                      break;
  374.                   }
  375.                }
  376.             }
  377.  
  378.             if (var8 < var7) {
  379.                var6.append(var9);
  380.             }
  381.          }
  382.  
  383.          this.contents = this.decodeString(var6.toString(), var5[0]);
  384.       }
  385.    }
  386.  
  387.    private int scanAttributes(char[] var1, int var2, int var3, int[] var4) throws XMLParseException {
  388.       while(true) {
  389.          var2 = this.skipWhitespace(var1, var2, var3, var4);
  390.          char var7 = var1[var2];
  391.          if (var7 == '/' || var7 == '>') {
  392.             return var2;
  393.          }
  394.  
  395.          var2 = this.scanOneAttribute(var1, var2, var3, var4);
  396.       }
  397.    }
  398.  
  399.    private void scanChildren(char[] var1, int var2, int var3, int var4) throws XMLParseException {
  400.       int var5 = var2 + var3;
  401.       int var6 = var2;
  402.       int[] var7 = new int[]{var4};
  403.  
  404.       while(var6 < var5) {
  405.          try {
  406.             var6 = this.skipWhitespace(var1, var6, var5, var7);
  407.          } catch (XMLParseException var9) {
  408.             return;
  409.          }
  410.  
  411.          if (var1[var6] != '<') {
  412.             return;
  413.          }
  414.  
  415.          XMLElement var8 = new XMLElement(this.conversionTable, this.skipLeadingWhitespace, false);
  416.          var6 = var8.parseCharArray(var1, var6, var5, var7);
  417.          this.children.addElement(var8);
  418.       }
  419.  
  420.    }
  421.  
  422.    private int scanContent(char[] var1, int var2, int var3, int[] var4, int[] var5, int[] var6) throws XMLParseException {
  423.       if (var1[var2] == '/') {
  424.          var5[0] = 0;
  425.          if (var1[var2 + 1] != '>') {
  426.             throw this.expectedInput("'>'", var6[0]);
  427.          } else {
  428.             return var2 + 2;
  429.          }
  430.       } else if (var1[var2] != '>') {
  431.          throw this.expectedInput("'>'", var6[0]);
  432.       } else {
  433.          if (this.skipLeadingWhitespace) {
  434.             var2 = this.skipWhitespace(var1, var2 + 1, var3, var6);
  435.          } else {
  436.             ++var2;
  437.          }
  438.  
  439.          var4[0] = var2;
  440.          int var8 = 0;
  441.          char[] var9 = this.tagName.toCharArray();
  442.          var3 -= var9.length + 2;
  443.  
  444.          while(var2 < var3 && var8 >= 0) {
  445.             if (var1[var2] == '<') {
  446.                boolean var10 = true;
  447.  
  448.                for(int var11 = 0; var10 && var11 < var9.length; ++var11) {
  449.                   var10 &= var1[var2 + var11 + 1] == var9[var11];
  450.                }
  451.  
  452.                if (var10) {
  453.                   int var18 = var2 + var9.length + 1;
  454.                   var2 = this.skipWhitespace(var1, var18, var3, var6);
  455.                   if (var1[var2] == '>' || var18 != var2 && var1[var2] != '/') {
  456.                      ++var8;
  457.                   }
  458.                   continue;
  459.                }
  460.  
  461.                if (var1[var2 + 1] == '/') {
  462.                   var10 = true;
  463.  
  464.                   for(int var12 = 0; var10 && var12 < var9.length; ++var12) {
  465.                      var10 &= var1[var2 + var12 + 2] == var9[var12];
  466.                   }
  467.  
  468.                   if (var10) {
  469.                      var5[0] = var2 - var4[0];
  470.                      var2 += var9.length + 2;
  471.                      var2 = this.skipWhitespace(var1, var2, var3, var6);
  472.                      if (var1[var2] == '>') {
  473.                         --var8;
  474.                         ++var2;
  475.                      }
  476.                      continue;
  477.                   }
  478.                }
  479.             }
  480.  
  481.             if (var1[var2] == '\r') {
  482.                int var10002 = var6[0]++;
  483.                if (var2 != var3 && var1[var2 + 1] == '\n') {
  484.                   ++var2;
  485.                }
  486.             } else if (var1[var2] == '\n') {
  487.                int var19 = var6[0]++;
  488.             }
  489.  
  490.             ++var2;
  491.          }
  492.  
  493.          if (var8 >= 0) {
  494.             throw this.unexpectedEndOfData(var6[0]);
  495.          } else {
  496.             int var20;
  497.             if (this.skipLeadingWhitespace) {
  498.                for(int var17 = var4[0] + var5[0] - 1; var5[0] >= 0 && var1[var17] <= ' '; var20 = var5[0]--) {
  499.                   --var17;
  500.                }
  501.             }
  502.  
  503.             return var2;
  504.          }
  505.       }
  506.    }
  507.  
  508.    private String scanIdentifier(char[] var1, int var2, int var3) {
  509.       int var4;
  510.       for(var4 = var2; var2 < var3 && this.isIdentifierChar(var1[var2]); ++var2) {
  511.       }
  512.  
  513.       return var2 != var3 && var2 != var4 ? new String(var1, var4, var2 - var4) : null;
  514.    }
  515.  
  516.    private int scanOneAttribute(char[] var1, int var2, int var3, int[] var4) throws XMLParseException {
  517.       String var5 = this.scanIdentifier(var1, var2, var3);
  518.       if (var5 == null) {
  519.          throw this.syntaxError("an attribute key", var4[0]);
  520.       } else {
  521.          var2 = this.skipWhitespace(var1, var2 + var5.length(), var3, var4);
  522.          var5 = var5.toUpperCase();
  523.          if (var1[var2] != '=') {
  524.             throw this.valueMissingForAttribute(var5, var4[0]);
  525.          } else {
  526.             var2 = this.skipWhitespace(var1, var2 + 1, var3, var4);
  527.             String var6 = this.scanString(var1, var2, var3, var4);
  528.             if (var6 == null) {
  529.                throw this.syntaxError("an attribute value", var4[0]);
  530.             } else {
  531.                if (var6.charAt(0) == '"') {
  532.                   var6 = var6.substring(1, var6.length() - 1);
  533.                   var2 += 2;
  534.                }
  535.  
  536.                this.attributes.put(var5, this.decodeString(var6, var4[0]));
  537.                return var2 + var6.length();
  538.             }
  539.          }
  540.       }
  541.    }
  542.  
  543.    private String scanString(char[] var1, int var2, int var3, int[] var4) throws XMLParseException {
  544.       char var5 = var1[var2];
  545.       if (var5 != '"') {
  546.          return this.scanIdentifier(var1, var2, var3);
  547.       } else {
  548.          int var6;
  549.          for(var6 = var2++; var2 < var3 && var1[var2] != var5; ++var2) {
  550.             if (var1[var2] == '\r') {
  551.                int var10002 = var4[0]++;
  552.                if (var2 != var3 && var1[var2 + 1] == '\n') {
  553.                   ++var2;
  554.                }
  555.             } else if (var1[var2] == '\n') {
  556.                int var8 = var4[0]++;
  557.             }
  558.          }
  559.  
  560.          return var2 == var3 ? null : new String(var1, var6, var2 - var6 + 1);
  561.       }
  562.    }
  563.  
  564.    private int scanTagName(char[] var1, int var2, int var3, int[] var4) throws XMLParseException {
  565.       this.tagName = this.scanIdentifier(var1, var2, var3);
  566.       if (this.tagName == null) {
  567.          throw this.syntaxError("a tag name", var4[0]);
  568.       } else {
  569.          return var2 + this.tagName.length();
  570.       }
  571.    }
  572.  
  573.    private int skipBogusTag(char[] var1, int var2, int var3, int[] var4) {
  574.       if (var1[var2 + 1] == '-' && var1[var2 + 2] == '-') {
  575.          for(; var2 < var3 && (var1[var2] != '-' || var1[var2 + 1] != '-' || var1[var2 + 2] != '>'); ++var2) {
  576.             if (var1[var2] == '\r') {
  577.                int var8 = var4[0]++;
  578.                if (var2 != var3 && var1[var2 + 1] == '\n') {
  579.                   ++var2;
  580.                }
  581.             } else if (var1[var2] == '\n') {
  582.                int var9 = var4[0]++;
  583.             }
  584.          }
  585.  
  586.          if (var2 == var3) {
  587.             throw this.unexpectedEndOfData(var4[0]);
  588.          } else {
  589.             return var2 + 3;
  590.          }
  591.       } else {
  592.          int var5 = 1;
  593.  
  594.          while(var2 < var3) {
  595.             char var6 = var1[var2++];
  596.             switch (var6) {
  597.                case '\n':
  598.                   int var7 = var4[0]++;
  599.                   break;
  600.                case '\r':
  601.                   if (var2 < var3 && var1[var2] == '\n') {
  602.                      ++var2;
  603.                   }
  604.  
  605.                   int var10002 = var4[0]++;
  606.                   break;
  607.                case '<':
  608.                   ++var5;
  609.                   break;
  610.                case '>':
  611.                   --var5;
  612.                   if (var5 == 0) {
  613.                      return var2;
  614.                   }
  615.             }
  616.          }
  617.  
  618.          throw this.unexpectedEndOfData(var4[0]);
  619.       }
  620.    }
  621.  
  622.    private int skipPreamble(char[] param1, int param2, int param3, int[] param4) throws XMLParseException {
  623.       // $FF: Couldn't be decompiled
  624.    }
  625.  
  626.    private int skipWhitespace(char[] var1, int var2, int var3, int[] var4) {
  627.       for(; var2 < var3 && var1[var2] <= ' '; ++var2) {
  628.          if (var1[var2] == '\r') {
  629.             int var10002 = var4[0]++;
  630.             if (var2 != var3 && var1[var2 + 1] == '\n') {
  631.                ++var2;
  632.             }
  633.          } else if (var1[var2] == '\n') {
  634.             int var5 = var4[0]++;
  635.          }
  636.       }
  637.  
  638.       if (var2 == var3) {
  639.          throw this.unexpectedEndOfData(var4[0]);
  640.       } else {
  641.          return var2;
  642.       }
  643.    }
  644.  
  645.    private XMLParseException syntaxError(String var1, int var2) {
  646.       String var3 = "Syntax error while parsing " + var1;
  647.       return new XMLParseException(this.getTagName(), var2, var3);
  648.    }
  649.  
  650.    private XMLParseException unexpectedEndOfData(int var1) {
  651.       String var2 = "Unexpected end of data reached";
  652.       return new XMLParseException(this.getTagName(), var1, var2);
  653.    }
  654.  
  655.    private XMLParseException valueMissingForAttribute(String var1, int var2) {
  656.       String var3 = "Value missing for attribute with key \"" + var1 + "\"";
  657.       return new XMLParseException(this.getTagName(), var2, var3);
  658.    }
  659. }
  660.