home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / parser.jar / com / sun / xml / tree / XmlDocumentBuilder.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-02-23  |  11.6 KB  |  466 lines

  1. package com.sun.xml.tree;
  2.  
  3. import com.sun.xml.parser.AttributeListEx;
  4. import com.sun.xml.parser.LexicalEventListener;
  5. import com.sun.xml.parser.Parser;
  6. import java.util.Locale;
  7. import java.util.Vector;
  8. import org.w3c.dom.CDATASection;
  9. import org.w3c.dom.Comment;
  10. import org.w3c.dom.DOMException;
  11. import org.w3c.dom.EntityReference;
  12. import org.xml.sax.AttributeList;
  13. import org.xml.sax.Locator;
  14. import org.xml.sax.SAXException;
  15. import org.xml.sax.SAXParseException;
  16.  
  17. public class XmlDocumentBuilder implements LexicalEventListener {
  18.    private static final String xmlURI = "http://www.w3.com/XML/1998/namespace";
  19.    private XmlDocument document;
  20.    private Locator locator;
  21.    private ParseContextImpl context = new ParseContextImpl(this);
  22.    private Locale locale = Locale.getDefault();
  23.    private ElementFactory factory;
  24.    private Parser parser;
  25.    private Vector attrTmp = new Vector();
  26.    private ParentNode[] elementStack;
  27.    private int topOfStack;
  28.    private boolean inDTD;
  29.    private boolean inCDataSection;
  30.    private boolean ignoringLexicalInfo = false;
  31.    private boolean disableNamespaces = true;
  32.  
  33.    // $FF: synthetic method
  34.    static Parser access$0(XmlDocumentBuilder var0) {
  35.       return var0.parser;
  36.    }
  37.  
  38.    // $FF: synthetic method
  39.    static Locator access$1(XmlDocumentBuilder var0) {
  40.       return var0.locator;
  41.    }
  42.  
  43.    // $FF: synthetic method
  44.    static XmlDocument access$2(XmlDocumentBuilder var0) {
  45.       return var0.document;
  46.    }
  47.  
  48.    // $FF: synthetic method
  49.    static boolean access$3(XmlDocumentBuilder var0) {
  50.       return var0.inDTD;
  51.    }
  52.  
  53.    // $FF: synthetic method
  54.    static void access$4(XmlDocumentBuilder var0, boolean var1) {
  55.       var0.inDTD = var1;
  56.    }
  57.  
  58.    // $FF: synthetic method
  59.    static boolean access$5(XmlDocumentBuilder var0) {
  60.       return var0.disableNamespaces;
  61.    }
  62.  
  63.    // $FF: synthetic method
  64.    static void access$6(XmlDocumentBuilder var0, SAXParseException var1) throws SAXException {
  65.       var0.error(var1);
  66.    }
  67.  
  68.    public void characters(char[] var1, int var2, int var3) throws SAXException {
  69.       ParentNode var4 = this.elementStack[this.topOfStack];
  70.       if (this.inCDataSection) {
  71.          String var8 = new String(var1, var2, var3);
  72.          CDATASection var10 = (CDATASection)var4.getLastChild();
  73.          var10.appendData(var8);
  74.       } else {
  75.          try {
  76.             NodeBase var5 = (NodeBase)var4.getLastChild();
  77.             if (var5 instanceof TextNode) {
  78.                String var6 = new String(var1, var2, var3);
  79.                ((TextNode)var5).appendData(var6);
  80.             } else {
  81.                TextNode var9 = this.document.newText(var1, var2, var3);
  82.                var4.appendChild(var9);
  83.                var4.doneChild(var9, this.context);
  84.             }
  85.          } catch (DOMException var7) {
  86.             this.fatal(new SAXParseException(this.getMessage("XDB-004", new Object[]{((Throwable)var7).getMessage()}), this.locator, var7));
  87.          }
  88.  
  89.       }
  90.    }
  91.  
  92.    public Locale chooseLocale(String[] var1) throws SAXException {
  93.       Locale var2 = XmlDocument.catalog.chooseLocale(var1);
  94.       if (var2 != null) {
  95.          this.setLocale(var2);
  96.       }
  97.  
  98.       return var2;
  99.    }
  100.  
  101.    public void comment(String var1) throws SAXException {
  102.       if (!this.ignoringLexicalInfo && !this.inDTD) {
  103.          Comment var2 = this.document.createComment(var1);
  104.          ParentNode var3 = this.elementStack[this.topOfStack];
  105.  
  106.          try {
  107.             var3.appendChild(var2);
  108.             var3.doneChild((NodeEx)var2, this.context);
  109.          } catch (DOMException var5) {
  110.             this.fatal(new SAXParseException(this.getMessage("XDB-004", new Object[]{((Throwable)var5).getMessage()}), this.locator, var5));
  111.          }
  112.  
  113.       }
  114.    }
  115.  
  116.    public XmlDocument createDocument() {
  117.       XmlDocument var1 = new XmlDocument();
  118.       if (this.factory != null) {
  119.          var1.setElementFactory(this.factory);
  120.       }
  121.  
  122.       return var1;
  123.    }
  124.  
  125.    public void endCDATA() throws SAXException {
  126.       if (this.inCDataSection) {
  127.          ParentNode var1 = this.elementStack[this.topOfStack];
  128.  
  129.          try {
  130.             this.inCDataSection = false;
  131.             var1.doneChild((NodeEx)var1.getLastChild(), this.context);
  132.          } catch (DOMException var3) {
  133.             this.fatal(new SAXParseException(this.getMessage("XDB-004", new Object[]{((Throwable)var3).getMessage()}), this.locator, var3));
  134.          }
  135.  
  136.       }
  137.    }
  138.  
  139.    public void endDocument() throws SAXException {
  140.       if (this.topOfStack != 0) {
  141.          throw new IllegalStateException(this.getMessage("XDB-000"));
  142.       } else {
  143.          this.document.doneParse(this.context);
  144.          this.document.trimToSize();
  145.       }
  146.    }
  147.  
  148.    public void endElement(String var1) throws SAXException {
  149.       ElementNode var2 = (ElementNode)this.elementStack[this.topOfStack];
  150.       this.elementStack[this.topOfStack--] = null;
  151.  
  152.       try {
  153.          ((ParentNode)var2).doneParse(this.context);
  154.          ((ParentNode)var2).reduceWaste();
  155.          this.elementStack[this.topOfStack].doneChild(var2, this.context);
  156.       } catch (DOMException var4) {
  157.          this.fatal(new SAXParseException(this.getMessage("XDB-004", new Object[]{((Throwable)var4).getMessage()}), this.locator, var4));
  158.       }
  159.  
  160.    }
  161.  
  162.    public void endParsedEntity(String var1, boolean var2) throws SAXException {
  163.       ParentNode var3 = this.elementStack[this.topOfStack];
  164.       if (var3 instanceof EntityReference) {
  165.          ((NodeBase)var3).setReadonly(true);
  166.          this.elementStack[this.topOfStack--] = null;
  167.          if (!var1.equals(((NodeBase)var3).getNodeName())) {
  168.             this.fatal(new SAXParseException(this.getMessage("XDB-011", new Object[]{var1, ((NodeBase)var3).getNodeName()}), this.locator));
  169.          }
  170.  
  171.          try {
  172.             this.elementStack[this.topOfStack].doneChild(var3, this.context);
  173.          } catch (DOMException var5) {
  174.             this.fatal(new SAXParseException(this.getMessage("XDB-004", new Object[]{((Throwable)var5).getMessage()}), this.locator, var5));
  175.          }
  176.  
  177.       }
  178.    }
  179.  
  180.    private void error(SAXParseException var1) throws SAXException {
  181.       if (this.parser != null) {
  182.          this.parser.getErrorHandler().error(var1);
  183.       } else {
  184.          throw var1;
  185.       }
  186.    }
  187.  
  188.    private void fatal(SAXParseException var1) throws SAXException {
  189.       if (this.parser != null) {
  190.          this.parser.getErrorHandler().fatalError(var1);
  191.       }
  192.  
  193.       throw var1;
  194.    }
  195.  
  196.    public boolean getDisableNamespaces() {
  197.       return this.disableNamespaces;
  198.    }
  199.  
  200.    public XmlDocument getDocument() {
  201.       return this.document;
  202.    }
  203.  
  204.    public Locator getDocumentLocator() {
  205.       return this.locator;
  206.    }
  207.  
  208.    public final ElementFactory getElementFactory() {
  209.       return this.factory;
  210.    }
  211.  
  212.    public Locale getLocale() {
  213.       return this.parser != null ? this.parser.getLocale() : this.locale;
  214.    }
  215.  
  216.    String getMessage(String var1) {
  217.       return this.getMessage(var1, (Object[])null);
  218.    }
  219.  
  220.    String getMessage(String var1, Object[] var2) {
  221.       if (this.locale == null) {
  222.          this.getLocale();
  223.       }
  224.  
  225.       return XmlDocument.catalog.getMessage(this.locale, var1, var2);
  226.    }
  227.  
  228.    private String getNamespaceURI(String var1) {
  229.       if ("xml".equals(var1)) {
  230.          return "http://www.w3.com/XML/1998/namespace";
  231.       } else {
  232.          return "xmlns".equals(var1) ? null : this.elementStack[this.topOfStack].getInheritedAttribute("xmlns:" + var1);
  233.       }
  234.    }
  235.  
  236.    public Parser getParser() {
  237.       return this.parser;
  238.    }
  239.  
  240.    public void ignorableWhitespace(char[] var1, int var2, int var3) throws SAXException {
  241.       if (!this.ignoringLexicalInfo) {
  242.          ParentNode var4 = this.elementStack[this.topOfStack];
  243.          if (this.inCDataSection) {
  244.             String var8 = new String(var1, var2, var3);
  245.             CDATASection var6 = (CDATASection)var4.getLastChild();
  246.             var6.appendData(var8);
  247.          } else {
  248.             TextNode var5 = this.document.newText(var1, var2, var3);
  249.  
  250.             try {
  251.                var4.appendChild(var5);
  252.                var4.doneChild(var5, this.context);
  253.             } catch (DOMException var7) {
  254.                this.fatal(new SAXParseException(this.getMessage("XDB-004", new Object[]{((Throwable)var7).getMessage()}), this.locator, var7));
  255.             }
  256.  
  257.          }
  258.       }
  259.    }
  260.  
  261.    public boolean isIgnoringLexicalInfo() {
  262.       return this.ignoringLexicalInfo;
  263.    }
  264.  
  265.    public void processingInstruction(String var1, String var2) throws SAXException {
  266.       if (!this.disableNamespaces && var1.indexOf(58) != -1) {
  267.          this.error(new SAXParseException(this.getMessage("XDB-010"), this.locator));
  268.       }
  269.  
  270.       if (!this.inDTD) {
  271.          ParentNode var3 = this.elementStack[this.topOfStack];
  272.  
  273.          try {
  274.             PINode var4 = (PINode)this.document.createProcessingInstruction(var1, var2);
  275.             var3.appendChild(var4);
  276.             var3.doneChild(var4, this.context);
  277.          } catch (DOMException var6) {
  278.             this.fatal(new SAXParseException(this.getMessage("XDB-004", new Object[]{((Throwable)var6).getMessage()}), this.locator, var6));
  279.          }
  280.  
  281.       }
  282.    }
  283.  
  284.    public void setDisableNamespaces(boolean var1) {
  285.       this.disableNamespaces = var1;
  286.    }
  287.  
  288.    public void setDocumentLocator(Locator var1) {
  289.       this.locator = var1;
  290.    }
  291.  
  292.    public final void setElementFactory(ElementFactory var1) {
  293.       this.factory = var1;
  294.    }
  295.  
  296.    public void setIgnoringLexicalInfo(boolean var1) {
  297.       this.ignoringLexicalInfo = var1;
  298.    }
  299.  
  300.    public void setLocale(Locale var1) throws SAXException {
  301.       if (var1 == null) {
  302.          var1 = Locale.getDefault();
  303.       }
  304.  
  305.       if (this.parser != null) {
  306.          this.parser.setLocale(var1);
  307.       }
  308.  
  309.       this.locale = var1;
  310.    }
  311.  
  312.    public void setParser(org.xml.sax.Parser var1) {
  313.       var1.setDocumentHandler(this);
  314.       if (var1 instanceof Parser) {
  315.          this.parser = (Parser)var1;
  316.          this.parser.setDTDHandler(new DtdListener(this));
  317.       } else {
  318.          this.parser = null;
  319.       }
  320.  
  321.    }
  322.  
  323.    public void startCDATA() throws SAXException {
  324.       if (!this.ignoringLexicalInfo) {
  325.          CDATASection var1 = this.document.createCDATASection("");
  326.          ParentNode var2 = this.elementStack[this.topOfStack];
  327.  
  328.          try {
  329.             this.inCDataSection = true;
  330.             var2.appendChild(var1);
  331.          } catch (DOMException var4) {
  332.             this.fatal(new SAXParseException(this.getMessage("XDB-004", new Object[]{((Throwable)var4).getMessage()}), this.locator, var4));
  333.          }
  334.  
  335.       }
  336.    }
  337.  
  338.    public void startDocument() throws SAXException {
  339.       this.document = this.createDocument();
  340.       if (this.locator != null) {
  341.          this.document.setSystemId(this.locator.getSystemId());
  342.       }
  343.  
  344.       this.elementStack = new ParentNode[200];
  345.       this.topOfStack = 0;
  346.       this.elementStack[this.topOfStack] = this.document;
  347.       this.inDTD = false;
  348.       this.document.startParse(this.context);
  349.    }
  350.  
  351.    public void startElement(String var1, AttributeList var2) throws SAXException {
  352.       AttributeSet var3 = null;
  353.       ElementNode var4 = null;
  354.       int var5 = var2 == null ? 0 : var2.getLength();
  355.       if (var5 != 0) {
  356.          try {
  357.             if (!this.disableNamespaces) {
  358.                for(int var6 = 0; var6 < var5; ++var6) {
  359.                   String var7 = var2.getType(var6);
  360.                   if (!"CDATA".equals(var7) && !var7.startsWith("NMTOKEN") && var2.getValue(var6).indexOf(58) != -1) {
  361.                      this.error(new SAXParseException(this.getMessage("XDB-001", new Object[]{var2.getName(var6)}), this.locator));
  362.                   }
  363.                }
  364.             }
  365.  
  366.             var3 = new AttributeSet(var2);
  367.          } catch (DOMException var12) {
  368.             this.fatal(new SAXParseException(this.getMessage("XDB-002", new Object[]{((Throwable)var12).getMessage()}), this.locator, var12));
  369.          }
  370.       }
  371.  
  372.       try {
  373.          if (this.disableNamespaces) {
  374.             var4 = (ElementNode)this.document.createElementEx(var1);
  375.          } else {
  376.             int var13 = var1.indexOf(58);
  377.             String var16 = "xmlns";
  378.             String var8 = "";
  379.             String var9 = var1;
  380.             if (var13 != -1) {
  381.                var16 = "xmlns:" + var1.substring(0, var13);
  382.                var9 = var1.substring(var13 + 1);
  383.                if (var1.lastIndexOf(58) != var13) {
  384.                   this.error(new SAXParseException(this.getMessage("XDB-003", new Object[]{var1}), this.locator));
  385.                }
  386.             }
  387.  
  388.             if (var3 != null) {
  389.                var8 = var3.getValue(var16);
  390.             }
  391.  
  392.             if ("".equals(var8)) {
  393.                var8 = this.elementStack[this.topOfStack].getInheritedAttribute(var16);
  394.             }
  395.  
  396.             var4 = (ElementNode)this.document.createElementEx(var8, var9);
  397.             if (var9 != var1) {
  398.                var4.setTag(var1);
  399.             }
  400.          }
  401.       } catch (DOMException var11) {
  402.          this.fatal(new SAXParseException(this.getMessage("XDB-004", new Object[]{((Throwable)var11).getMessage()}), this.locator, var11));
  403.       }
  404.  
  405.       if (var2 != null && var2 instanceof AttributeListEx) {
  406.          var4.setIdAttributeName(((AttributeListEx)var2).getIdAttributeName());
  407.       }
  408.  
  409.       if (var5 != 0) {
  410.          var4.setAttributes(var3);
  411.       }
  412.  
  413.       this.elementStack[this.topOfStack++].appendChild(var4);
  414.       this.elementStack[this.topOfStack] = var4;
  415.       ((ParentNode)var4).startParse(this.context);
  416.       if (!this.disableNamespaces) {
  417.          int var14 = var1.indexOf(58);
  418.          if (var14 > 0) {
  419.             String var17 = var1.substring(0, var14);
  420.             if (this.getNamespaceURI(var17) == null) {
  421.                this.error(new SAXParseException(this.getMessage("XDB-005", new Object[]{var17}), this.locator));
  422.             }
  423.          }
  424.  
  425.          if (var5 != 0) {
  426.             for(int var19 = 0; var19 < var5; ++var19) {
  427.                String var20 = var3.item(var19).getNodeName();
  428.                var14 = var20.indexOf(58);
  429.                if (var14 > 0) {
  430.                   String var18 = var20.substring(0, var14);
  431.                   if (!"xmlns".equals(var18)) {
  432.                      String var10 = this.getNamespaceURI(var18);
  433.                      if (var10 == null) {
  434.                         this.error(new SAXParseException(this.getMessage("XDB-006", new Object[]{var18}), this.locator));
  435.                      } else {
  436.                         if (var20.lastIndexOf(58) != var14) {
  437.                            this.error(new SAXParseException(this.getMessage("XDB-007", new Object[]{var20}), this.locator));
  438.                         }
  439.  
  440.                         var20 = var20.substring(var14 + 1);
  441.                         var20 = var10 + '\uffff' + var20;
  442.                         if (this.attrTmp.contains(var20)) {
  443.                            this.error(new SAXParseException(this.getMessage("XDB-008", new Object[]{var3.item(var19).getNodeName()}), this.locator));
  444.                         } else {
  445.                            this.attrTmp.addElement(var20);
  446.                         }
  447.                      }
  448.                   }
  449.                }
  450.             }
  451.  
  452.             this.attrTmp.setSize(0);
  453.          }
  454.       }
  455.  
  456.    }
  457.  
  458.    public void startParsedEntity(String var1) throws SAXException {
  459.       if (!this.ignoringLexicalInfo) {
  460.          EntityReference var2 = this.document.createEntityReference(var1);
  461.          this.elementStack[this.topOfStack++].appendChild(var2);
  462.          this.elementStack[this.topOfStack] = (ParentNode)var2;
  463.       }
  464.    }
  465. }
  466.