home *** CD-ROM | disk | FTP | other *** search
/ Online Today 2000 January / Onto0100.iso / pc / JAVA / MSJAVX86.EXE / xmldso.cab / com / ms / xml / om / ElementImpl.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-11-05  |  8.4 KB  |  506 lines

  1. package com.ms.xml.om;
  2.  
  3. import com.ms.xml.parser.AttDef;
  4. import com.ms.xml.parser.DTD;
  5. import com.ms.xml.parser.ElementDecl;
  6. import com.ms.xml.parser.Entity;
  7. import com.ms.xml.util.Atom;
  8. import com.ms.xml.util.Attribute;
  9. import com.ms.xml.util.Attributes;
  10. import com.ms.xml.util.EnumWrapper;
  11. import com.ms.xml.util.Name;
  12. import com.ms.xml.util.XMLOutputStream;
  13. import java.io.IOException;
  14. import java.util.Enumeration;
  15. import java.util.Vector;
  16.  
  17. public class ElementImpl implements Element {
  18.    Name tag;
  19.    int type;
  20.    String text;
  21.    Element parent;
  22.    Vector children;
  23.    Document doc;
  24.    protected Attributes attrlist;
  25.    static Atom nameXML = Atom.create("xml");
  26.    static Name nameXMLSPACE = Name.create("xml-space", "xml");
  27.    static Name nameXMLAS = Name.create("prefix", "xml");
  28.    static Name nameXMLHREF = Name.create("src", "xml");
  29.    static Name nameXMLNS = Name.create("ns", "xml");
  30.  
  31.    public Element getChild(int var1) {
  32.       if (this.children != null && var1 >= 0 && var1 < this.children.size()) {
  33.          try {
  34.             return (Element)this.children.elementAt(var1);
  35.          } catch (Exception var2) {
  36.          }
  37.       }
  38.  
  39.       return null;
  40.    }
  41.  
  42.    public Name getTagName() {
  43.       return this.tag;
  44.    }
  45.  
  46.    public boolean isAttributeQualified(Name var1, DTD var2) {
  47.       if (var2 != null) {
  48.          ElementDecl var3 = var2.findElementDecl(this.tag);
  49.          if (var3 != null) {
  50.             AttDef var4 = var3.findAttDef(var1);
  51.             if (var4 != null) {
  52.                int var5 = var4.getType();
  53.                if (var5 == 4 || var5 == 5 || var5 == 8) {
  54.                   return true;
  55.                }
  56.             }
  57.          }
  58.       }
  59.  
  60.       return false;
  61.    }
  62.  
  63.    public Name qualifyName(String var1) {
  64.       int var2 = var1.indexOf(":");
  65.       if (var2 != -1) {
  66.          int var3 = 1;
  67.          if (var2 + 1 < var1.length() && var1.charAt(var2 + 1) == ':') {
  68.             ++var3;
  69.          }
  70.  
  71.          String var4 = var1.substring(0, var2);
  72.          Atom var5 = this.getNamespace(var4);
  73.          String var6 = var1.substring(var2 + var3);
  74.          return Name.create(var6, var5);
  75.       } else {
  76.          return this.tag != null ? Name.create(var1, this.tag.getNameSpace()) : Name.create(var1);
  77.       }
  78.    }
  79.  
  80.    public ElementCollection getChildren() {
  81.       return new ElementCollection(this);
  82.    }
  83.  
  84.    public Element toSchema() {
  85.       return this;
  86.    }
  87.  
  88.    public void addChild(Element var1, Element var2) {
  89.       if (this.children == null) {
  90.          this.children = new Vector(4);
  91.       }
  92.  
  93.       if (var2 == null) {
  94.          this.children.addElement(var1);
  95.       } else if (var2 == this) {
  96.          this.children.insertElementAt(var1, 0);
  97.       } else {
  98.          this.children.insertElementAt(var1, this.children.indexOf(var2) + 1);
  99.       }
  100.  
  101.       var1.setParent(this);
  102.    }
  103.  
  104.    public void addChild(Element var1, int var2, int var3) {
  105.       if (var2 == 0) {
  106.          this.addChild(var1, this);
  107.       } else if (var2 >= 0 && var2 <= this.numElements() - 1) {
  108.          this.addChild(var1, this.getChild(var2 - 1));
  109.       } else {
  110.          this.addChild(var1, (Element)null);
  111.       }
  112.    }
  113.  
  114.    public void save(XMLOutputStream var1) throws IOException {
  115.       if (this.getType() != 12) {
  116.          var1.writeIndent();
  117.       }
  118.  
  119.       int var2 = this.getType();
  120.       switch (var2) {
  121.          case 0:
  122.          case 7:
  123.             int var8 = -1;
  124.             boolean var9 = var1.mixed;
  125.             if (this.tag != null) {
  126.                var1.writeChars("<");
  127.                this.writeTagName(var1);
  128.                this.saveAttributes(this.getTagName().getNameSpace(), var1);
  129.                Object var11 = this.getAttribute(nameXMLSPACE);
  130.                String var16 = null;
  131.                if (var11 != null) {
  132.                   var16 = var11.toString();
  133.                }
  134.  
  135.                if (var16 != null) {
  136.                   var8 = var1.getOutputStyle();
  137.                   boolean var7 = var16.equalsIgnoreCase("preserve");
  138.                   var1.setOutputStyle(var7 ? XMLOutputStream.COMPACT : XMLOutputStream.PRETTY);
  139.                }
  140.  
  141.                if (this.numElements() > 0) {
  142.                   var1.write(62);
  143.                } else {
  144.                   var1.writeChars("/>");
  145.                }
  146.             }
  147.  
  148.             Object var12 = null;
  149.             var1.mixed = false;
  150.             ElementEnumeration var13 = new ElementEnumeration(this);
  151.  
  152.             while(var13.hasMoreElements()) {
  153.                Element var17 = (Element)var13.nextElement();
  154.                if (var17.getType() == 1 || var17.getType() == 11) {
  155.                   var1.mixed = true;
  156.                   break;
  157.                }
  158.             }
  159.  
  160.             var1.writeNewLine();
  161.             var1.addIndent(1);
  162.             var1.nameSpaceContext.push();
  163.             var13 = new ElementEnumeration(this);
  164.  
  165.             while(var13.hasMoreElements()) {
  166.                Element var18 = (Element)var13.nextElement();
  167.                var18.save(var1);
  168.             }
  169.  
  170.             var1.nameSpaceContext.pop();
  171.             var1.addIndent(-1);
  172.             if (this.tag != null && this.numElements() > 0) {
  173.                var1.writeIndent();
  174.                var1.writeChars("</");
  175.                this.writeTagName(var1);
  176.                var1.writeChars(">");
  177.                if (var8 != -1) {
  178.                   var1.setOutputStyle(var8);
  179.                }
  180.  
  181.                var1.mixed = var9;
  182.                var1.writeNewLine();
  183.             }
  184.             break;
  185.          case 1:
  186.             var1.writeChars(this.getText());
  187.             var1.writeNewLine();
  188.             break;
  189.          case 2:
  190.             var1.writeChars("<!--" + this.getText() + "-->");
  191.             var1.writeNewLine();
  192.          case 3:
  193.          case 4:
  194.          case 8:
  195.          case 9:
  196.          default:
  197.             break;
  198.          case 5:
  199.             var1.writeChars("<?");
  200.             var1.writeQualifiedName(this.getTagName(), (Atom)null);
  201.             this.saveAttributes(this.getTagName().getNameSpace(), var1);
  202.             var1.writeChars(this.getText() + "?>");
  203.             var1.writeNewLine();
  204.             break;
  205.          case 6:
  206.             var1.writeChars("<![CDATA[" + this.getText() + "]]>");
  207.             var1.writeNewLine();
  208.             break;
  209.          case 10:
  210.             var1.writeChars("<?xml:namespace ");
  211.             this.saveAttributes(nameXML, var1);
  212.             var1.writeChars("?>");
  213.             var1.writeNewLine();
  214.             Atom var3 = Atom.create(this.getAttribute(nameXMLAS).toString());
  215.             Atom var4 = Atom.create(this.getAttribute(nameXMLNS).toString());
  216.             var1.nameSpaceContext.addNameSpace(var4, var3);
  217.             break;
  218.          case 11:
  219.             if (var1.savingDTD) {
  220.                var1.write(37);
  221.             } else {
  222.                var1.write(38);
  223.             }
  224.  
  225.             var1.writeQualifiedName(this.getTagName(), this.getParent().getTagName().getNameSpace());
  226.             var1.writeChars(";");
  227.             if (var1.savingDTD) {
  228.                var1.writeNewLine();
  229.             }
  230.             break;
  231.          case 12:
  232.             if (var1.getOutputStyle() == XMLOutputStream.DEFAULT) {
  233.                var1.writeChars(this.getText());
  234.             }
  235.             break;
  236.          case 13:
  237.             if (this.tag == null) {
  238.                var1.writeChars("<![INCLUDE[");
  239.             } else {
  240.                var1.writeChars("<![%");
  241.                var1.writeChars(this.tag.toString());
  242.                var1.writeChars(";[");
  243.             }
  244.  
  245.             ElementEnumeration var10 = new ElementEnumeration(this);
  246.  
  247.             while(var10.hasMoreElements()) {
  248.                Element var15 = (Element)var10.nextElement();
  249.                var15.save(var1);
  250.             }
  251.  
  252.             var1.writeChars("]]>");
  253.             break;
  254.          case 14:
  255.             if (this.tag == null) {
  256.                var1.writeChars("<![IGNORE[");
  257.             } else {
  258.                var1.writeChars("<![%");
  259.                var1.writeChars(this.tag.toString());
  260.                var1.writeChars(";[");
  261.             }
  262.  
  263.             ElementEnumeration var5 = new ElementEnumeration(this);
  264.  
  265.             while(var5.hasMoreElements()) {
  266.                Element var6 = (Element)var5.nextElement();
  267.                var6.save(var1);
  268.             }
  269.       }
  270.  
  271.       var1.flush();
  272.    }
  273.  
  274.    public int getType() {
  275.       return this.type;
  276.    }
  277.  
  278.    public Object getAttribute(String var1) {
  279.       return this.getAttribute(this.qualifyName(var1));
  280.    }
  281.  
  282.    public Object getAttribute(Name var1) {
  283.       Object var2 = null;
  284.       if (this.attrlist != null) {
  285.          var2 = this.attrlist.get(var1);
  286.       }
  287.  
  288.       return var2;
  289.    }
  290.  
  291.    public void setAttribute(String var1, Object var2) {
  292.       this.setAttribute(this.qualifyName(var1), var2);
  293.    }
  294.  
  295.    public void setAttribute(Name var1, Object var2) {
  296.       if (this.attrlist == null) {
  297.          this.attrlist = new Attributes();
  298.       }
  299.  
  300.       this.attrlist.put(var1, var2);
  301.    }
  302.  
  303.    public String toString() {
  304.       return this.getClass().getName() + "[tag=" + this.tag + ",type=" + this.type + ",text=" + this.text + "]";
  305.    }
  306.  
  307.    public Element getParent() {
  308.       return this.parent;
  309.    }
  310.  
  311.    public void removeAttribute(String var1) {
  312.       this.removeAttribute(this.qualifyName(var1));
  313.    }
  314.  
  315.    public void removeAttribute(Name var1) {
  316.       if (this.attrlist != null) {
  317.          this.attrlist.remove(var1);
  318.       }
  319.  
  320.    }
  321.  
  322.    public void setParent(Element var1) {
  323.       this.parent = var1;
  324.       this.doc = null;
  325.    }
  326.  
  327.    public ElementImpl() {
  328.       this((Name)null, 0);
  329.    }
  330.  
  331.    public ElementImpl(Name var1, int var2) {
  332.       this.tag = var1;
  333.       this.type = var2;
  334.    }
  335.  
  336.    Document getDocument() {
  337.       if (this.doc == null) {
  338.          Object var1;
  339.          for(var1 = this; ((Element)var1).getParent() != null; var1 = ((Element)var1).getParent()) {
  340.          }
  341.  
  342.          if (var1 instanceof Document) {
  343.             this.doc = (Document)var1;
  344.          }
  345.       }
  346.  
  347.       return this.doc;
  348.    }
  349.  
  350.    public void removeChild(Element var1) {
  351.       if (this.children != null) {
  352.          var1.setParent((Element)null);
  353.          this.children.removeElement(var1);
  354.       }
  355.  
  356.    }
  357.  
  358.    public Enumeration getElements() {
  359.       return (Enumeration)(this.children == null ? EnumWrapper.emptyEnumeration : this.children.elements());
  360.    }
  361.  
  362.    public int numElements() {
  363.       return this.children == null ? 0 : this.children.size();
  364.    }
  365.  
  366.    public Enumeration getAttributes() {
  367.       return (Enumeration)(this.attrlist == null ? EnumWrapper.emptyEnumeration : this.attrlist.attributes());
  368.    }
  369.  
  370.    public int numAttributes() {
  371.       return this.attrlist == null ? 0 : this.attrlist.size();
  372.    }
  373.  
  374.    public void saveAttributes(Atom var1, XMLOutputStream var2) throws IOException {
  375.       Enumeration var3 = this.getAttributes();
  376.  
  377.       while(var3.hasMoreElements()) {
  378.          Attribute var4 = (Attribute)var3.nextElement();
  379.          Name var5 = var4.getName();
  380.          var2.write(32);
  381.          if (var5 == nameXMLSPACE) {
  382.             var2.writeChars(var5.getName());
  383.          } else {
  384.             var2.writeQualifiedName(var5, var1);
  385.          }
  386.  
  387.          var2.write(61);
  388.          boolean var6 = this.isAttributeQualified(var5, var2.dtd);
  389.          Object var7 = var4.getValue();
  390.          if (var7 instanceof Name) {
  391.             var2.write(34);
  392.             if (var6) {
  393.                var2.writeQualifiedName((Name)var7, var1);
  394.             } else {
  395.                var2.writeChars(var7.toString());
  396.             }
  397.  
  398.             var2.write(34);
  399.          } else if (!(var7 instanceof Vector)) {
  400.             var2.writeQuotedString(var7.toString());
  401.          } else {
  402.             Vector var8 = (Vector)var7;
  403.             var2.write(34);
  404.             Enumeration var9 = var8.elements();
  405.  
  406.             while(var9.hasMoreElements()) {
  407.                Name var10 = (Name)var9.nextElement();
  408.                if (var6) {
  409.                   var2.writeQualifiedName(var10, var1);
  410.                } else {
  411.                   var2.writeChars(var10.toString());
  412.                }
  413.  
  414.                if (var9.hasMoreElements()) {
  415.                   var2.write(32);
  416.                }
  417.             }
  418.  
  419.             var2.write(34);
  420.          }
  421.       }
  422.  
  423.    }
  424.  
  425.    void writeTagName(XMLOutputStream var1) throws IOException {
  426.       Element var2 = this.getParent();
  427.       Name var3 = this.getTagName();
  428.       if (var2 != null && var2.getTagName() != null && var2.getTagName().getNameSpace() != null) {
  429.          var1.writeQualifiedName(var3, var2.getTagName().getNameSpace());
  430.       } else if (var3.getNameSpace() != null) {
  431.          var1.writeQualifiedName(var3, Atom.create(""));
  432.       } else {
  433.          var1.writeChars(var3.getName());
  434.       }
  435.    }
  436.  
  437.    Atom getNamespace(String var1) {
  438.       Atom var2 = Atom.create(var1);
  439.       Document var3 = this.getDocument();
  440.       if (var3 != null) {
  441.          DTD var4 = var3.getDTD();
  442.          if (var4 != null) {
  443.             Atom var5 = var4.findLongNameSpace(var2);
  444.             if (var5 != null) {
  445.                return var5;
  446.             }
  447.          }
  448.       }
  449.  
  450.       return var2;
  451.    }
  452.  
  453.    void clear() {
  454.       if (this.children != null) {
  455.          this.children.removeAllElements();
  456.       }
  457.  
  458.       this.text = null;
  459.       this.parent = null;
  460.       if (this.attrlist != null) {
  461.          this.attrlist.removeAll();
  462.       }
  463.  
  464.    }
  465.  
  466.    public void setText(String var1) {
  467.       this.text = var1;
  468.    }
  469.  
  470.    public String getText() {
  471.       if (this.type == 11) {
  472.          Document var4 = this.getDocument();
  473.          if (var4 != null) {
  474.             DTD var5 = var4.getDTD();
  475.             if (var5 != null) {
  476.                Entity var3 = var5.findEntity(this.getTagName());
  477.                if (var3 != null) {
  478.                   return var3.getText();
  479.                }
  480.             }
  481.          }
  482.       } else {
  483.          if (this.children == null || this.type == 6 || this.type == 1 || this.type == 12) {
  484.             if (this.text == null) {
  485.                return new String("");
  486.             }
  487.  
  488.             return this.text;
  489.          }
  490.  
  491.          if (this.children != null) {
  492.             StringBuffer var1 = new StringBuffer();
  493.             Enumeration var2 = this.children.elements();
  494.  
  495.             while(var2.hasMoreElements()) {
  496.                var1.append(((Element)var2.nextElement()).getText());
  497.             }
  498.  
  499.             return var1.toString();
  500.          }
  501.       }
  502.  
  503.       return "";
  504.    }
  505. }
  506.