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