home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2005 July / PCpro_2005_07.ISO / files / wintools / FullSync / FullSyncInstaller.exe / net / n3 / nanoxml / StdXMLParser.class (.txt) < prev    next >
Encoding:
Java Class File  |  2005-03-08  |  7.3 KB  |  289 lines

  1. package net.n3.nanoxml;
  2.  
  3. import java.io.Reader;
  4. import java.util.Enumeration;
  5. import java.util.Properties;
  6.  
  7. public class StdXMLParser implements IXMLParser {
  8.    private static final char[] END_OF_PI = new char[]{'>', '?'};
  9.    private static final char[] END_OF_CDATA = new char[]{'>', ']', ']'};
  10.    private static final char[] END_OF_PCDATA = new char[]{'<'};
  11.    private IXMLBuilder builder = null;
  12.    private IXMLReader reader = null;
  13.    private IXMLEntityResolver entityResolver = new XMLEntityResolver();
  14.    private IXMLValidator validator = null;
  15.  
  16.    protected void finalize() throws Throwable {
  17.       this.builder = null;
  18.       this.reader = null;
  19.       this.entityResolver = null;
  20.       this.validator = null;
  21.       super.finalize();
  22.    }
  23.  
  24.    public void setBuilder(IXMLBuilder var1) {
  25.       this.builder = var1;
  26.    }
  27.  
  28.    public IXMLBuilder getBuilder() {
  29.       return this.builder;
  30.    }
  31.  
  32.    public void setValidator(IXMLValidator var1) {
  33.       this.validator = var1;
  34.    }
  35.  
  36.    public IXMLValidator getValidator() {
  37.       return this.validator;
  38.    }
  39.  
  40.    public void setResolver(IXMLEntityResolver var1) {
  41.       this.entityResolver = var1;
  42.    }
  43.  
  44.    public IXMLEntityResolver getResolver() {
  45.       return this.entityResolver;
  46.    }
  47.  
  48.    public void setReader(IXMLReader var1) {
  49.       this.reader = var1;
  50.    }
  51.  
  52.    public IXMLReader getReader() {
  53.       return this.reader;
  54.    }
  55.  
  56.    public Object parse() throws XMLException {
  57.       try {
  58.          this.builder.startBuilding(this.reader.getSystemID(), this.reader.getLineNr());
  59.          this.scanData();
  60.          return this.builder.getResult();
  61.       } catch (XMLException var2) {
  62.          throw var2;
  63.       } catch (Exception var3) {
  64.          throw new XMLException(var3);
  65.       }
  66.    }
  67.  
  68.    protected void scanData() throws Exception {
  69.       while(!this.reader.atEOF() && this.builder.getResult() == null) {
  70.          char var1 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
  71.          switch (var1) {
  72.             case '\t':
  73.             case '\n':
  74.             case '\r':
  75.             case ' ':
  76.                break;
  77.             case '<':
  78.                this.scanSomeTag(false);
  79.                break;
  80.             default:
  81.                XMLUtil.errorInvalidInput(this.reader.getSystemID(), this.reader.getLineNr(), "`" + var1 + "' (0x" + Integer.toHexString(var1) + ')');
  82.          }
  83.       }
  84.  
  85.    }
  86.  
  87.    protected void scanSomeTag(boolean var1) throws Exception {
  88.       char var2 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
  89.       switch (var2) {
  90.          case '!':
  91.             this.processSpecialTag(var1);
  92.             break;
  93.          case '?':
  94.             this.processPI();
  95.             break;
  96.          default:
  97.             this.reader.unread(var2);
  98.             this.processElement();
  99.       }
  100.  
  101.    }
  102.  
  103.    protected void processPI() throws Exception {
  104.       XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  105.       String var1 = XMLUtil.scanIdentifier(this.reader, '&', this.entityResolver);
  106.       XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  107.       ContentReader var2 = new ContentReader(this.reader, this.entityResolver, '&', END_OF_PI, true, "");
  108.       if (!var1.equalsIgnoreCase("xml")) {
  109.          this.builder.newProcessingInstruction(var1, var2);
  110.       }
  111.  
  112.       ((Reader)var2).close();
  113.    }
  114.  
  115.    protected void processSpecialTag(boolean var1) throws Exception {
  116.       char var2 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
  117.       switch (var2) {
  118.          case '-':
  119.             XMLUtil.skipComment(this.reader, this.entityResolver);
  120.             return;
  121.          case 'D':
  122.             this.processDocType();
  123.             return;
  124.          case '[':
  125.             if (var1) {
  126.                this.processCDATA();
  127.             } else {
  128.                XMLUtil.skipTag(this.reader, '&', this.entityResolver);
  129.             }
  130.  
  131.             return;
  132.          default:
  133.       }
  134.    }
  135.  
  136.    protected void processCDATA() throws Exception {
  137.       if (!XMLUtil.checkLiteral(this.reader, '&', this.entityResolver, "CDATA[")) {
  138.          XMLUtil.skipTag(this.reader, '&', this.entityResolver);
  139.       } else {
  140.          this.validator.PCDataAdded(this.reader.getSystemID(), this.reader.getLineNr());
  141.          ContentReader var1 = new ContentReader(this.reader, this.entityResolver, '&', END_OF_CDATA, true, "");
  142.          this.builder.addPCData(var1, this.reader.getSystemID(), this.reader.getLineNr());
  143.          ((Reader)var1).close();
  144.       }
  145.    }
  146.  
  147.    protected void processDocType() throws Exception {
  148.       if (!XMLUtil.checkLiteral(this.reader, '&', this.entityResolver, "OCTYPE")) {
  149.          XMLUtil.skipTag(this.reader, '&', this.entityResolver);
  150.       } else {
  151.          XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  152.          String var1 = null;
  153.          StringBuffer var2 = new StringBuffer();
  154.          String var3 = XMLUtil.scanIdentifier(this.reader, '&', this.entityResolver);
  155.          XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  156.          char var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
  157.          if (var4 == 'P') {
  158.             var1 = XMLUtil.scanPublicID(var2, this.reader, '&', this.entityResolver);
  159.             XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  160.             var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
  161.          } else if (var4 == 'S') {
  162.             var1 = XMLUtil.scanSystemID(this.reader, '&', this.entityResolver);
  163.             XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  164.             var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
  165.          }
  166.  
  167.          if (var4 == '[') {
  168.             this.validator.parseDTD(var2.toString(), this.reader, this.entityResolver, false);
  169.             XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  170.             var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
  171.          }
  172.  
  173.          if (var4 != '>') {
  174.             XMLUtil.errorExpectedInput(this.reader.getSystemID(), this.reader.getLineNr(), "`>'");
  175.          }
  176.  
  177.          if (var1 != null) {
  178.             Reader var5 = this.reader.openStream(var2.toString(), var1);
  179.             this.reader.startNewStream(var5);
  180.             this.reader.setSystemID(var1);
  181.             this.reader.setPublicID(var2.toString());
  182.             this.validator.parseDTD(var2.toString(), this.reader, this.entityResolver, true);
  183.          }
  184.  
  185.       }
  186.    }
  187.  
  188.    protected void processElement() throws Exception {
  189.       String var1 = XMLUtil.scanIdentifier(this.reader, '&', this.entityResolver);
  190.       XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  191.       String var2 = null;
  192.       int var3 = var1.indexOf(58);
  193.       if (var3 > 0) {
  194.          var2 = var1.substring(0, var3);
  195.          var1 = var1.substring(var3 + 1);
  196.       }
  197.  
  198.       this.validator.elementStarted(var1, var2, (String)null, this.reader.getSystemID(), this.reader.getLineNr());
  199.       this.builder.startElement(var1, var2, (String)null, this.reader.getSystemID(), this.reader.getLineNr());
  200.  
  201.       while(true) {
  202.          char var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
  203.          if (var4 == '/' || var4 == '>') {
  204.             Properties var5 = new Properties();
  205.             this.validator.elementAttributesProcessed(var1, var2, (String)null, var5, this.reader.getSystemID(), this.reader.getLineNr());
  206.  
  207.             String var7;
  208.             String var8;
  209.             String var9;
  210.             for(Enumeration var6 = var5.keys(); var6.hasMoreElements(); this.builder.addAttribute(var7, var9, (String)null, var8, "CDATA")) {
  211.                var7 = (String)var6.nextElement();
  212.                var8 = var5.getProperty(var7);
  213.                var9 = null;
  214.                var3 = var7.indexOf(58);
  215.                if (var3 > 0) {
  216.                   var9 = var7.substring(0, var3);
  217.                   var7 = var7.substring(var3 + 1);
  218.                }
  219.             }
  220.  
  221.             this.builder.elementAttributesProcessed(var1, var2, (String)null);
  222.             if (var4 == '/') {
  223.                if (XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver) != '>') {
  224.                   XMLUtil.errorExpectedInput(this.reader.getSystemID(), this.reader.getLineNr(), "`>'");
  225.                }
  226.  
  227.                this.validator.elementEnded(var1, var2, (String)null, this.reader.getSystemID(), this.reader.getLineNr());
  228.                this.builder.endElement(var1, var2, (String)null);
  229.                return;
  230.             } else {
  231.                StringBuffer var13 = new StringBuffer(16);
  232.  
  233.                while(true) {
  234.                   var13.setLength(0);
  235.                   boolean[] var14 = new boolean[1];
  236.                   XMLUtil.skipWhitespace(this.reader, '&', var13, var14);
  237.                   var4 = XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver);
  238.                   if (var4 == '<' && !var14[0]) {
  239.                      var4 = this.reader.read();
  240.                      if (var4 == '/') {
  241.                         XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  242.                         var9 = XMLUtil.scanIdentifier(this.reader, '&', this.entityResolver);
  243.                         if (!var9.equals(var1)) {
  244.                            XMLUtil.errorWrongClosingTag(this.reader.getSystemID(), this.reader.getLineNr(), var1, var9);
  245.                         }
  246.  
  247.                         XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  248.                         if (XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver) != '>') {
  249.                            XMLUtil.errorClosingTagNotEmpty(this.reader.getSystemID(), this.reader.getLineNr());
  250.                         }
  251.  
  252.                         this.validator.elementEnded(var1, var2, (String)null, this.reader.getSystemID(), this.reader.getLineNr());
  253.                         this.builder.endElement(var1, var2, (String)null);
  254.                         return;
  255.                      }
  256.  
  257.                      this.reader.unread(var4);
  258.                      this.scanSomeTag(true);
  259.                   } else {
  260.                      this.validator.PCDataAdded(this.reader.getSystemID(), this.reader.getLineNr());
  261.                      this.reader.unread(var4);
  262.                      ContentReader var15 = new ContentReader(this.reader, this.entityResolver, '&', END_OF_PCDATA, false, var13.toString());
  263.                      this.builder.addPCData(var15, this.reader.getSystemID(), this.reader.getLineNr());
  264.                      ((Reader)var15).close();
  265.                      this.reader.unread('<');
  266.                   }
  267.                }
  268.             }
  269.          }
  270.  
  271.          this.reader.unread(var4);
  272.          this.processAttribute();
  273.          XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  274.       }
  275.    }
  276.  
  277.    protected void processAttribute() throws Exception {
  278.       String var1 = XMLUtil.scanIdentifier(this.reader, '&', this.entityResolver);
  279.       XMLUtil.skipWhitespace(this.reader, '&', (StringBuffer)null, (boolean[])null);
  280.       if (XMLUtil.read(this.reader, (boolean[])null, '&', this.entityResolver) != '=') {
  281.          XMLUtil.errorExpectedInput(this.reader.getSystemID(), this.reader.getLineNr(), "`='");
  282.       }
  283.  
  284.       String var2 = XMLUtil.scanString(this.reader, '&', true, this.entityResolver);
  285.       this.validator.attributeAdded(var1, (String)null, (String)null, var2, this.reader.getSystemID(), this.reader.getLineNr());
  286.       this.builder.addAttribute(var1, (String)null, (String)null, var2, "CDATA");
  287.    }
  288. }
  289.