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

  1. package com.ms.xml.parser;
  2.  
  3. import com.ms.xml.om.Element;
  4. import com.ms.xml.om.ElementImpl;
  5. import com.ms.xml.util.Atom;
  6. import com.ms.xml.util.Name;
  7. import com.ms.xml.util.XMLOutputStream;
  8. import java.io.IOException;
  9. import java.util.Enumeration;
  10. import java.util.Vector;
  11.  
  12. public class ElementDecl extends ElementImpl {
  13.    Name name;
  14.    private Vector attdefs;
  15.    private ContentModel content;
  16.    ElementDecl base;
  17.    Vector interfaces;
  18.    Element schema = null;
  19.    static Name nameELEMENTTYPE = Name.create("ELEMENTTYPE", "XML");
  20.    static Name nameID = Name.create("ID", "XML");
  21.  
  22.    public final ContentModel getContent() {
  23.       return this.content;
  24.    }
  25.  
  26.    public final AttDef findAttDef(Name var1) {
  27.       if (this.attdefs != null) {
  28.          Enumeration var2 = this.attdefs.elements();
  29.  
  30.          while(var2.hasMoreElements()) {
  31.             AttDef var3 = (AttDef)var2.nextElement();
  32.             if (var3.name == var1) {
  33.                return var3;
  34.             }
  35.          }
  36.       }
  37.  
  38.       if (this.base != null) {
  39.          AttDef var4 = this.base.findAttDef(var1);
  40.          if (var4 != null) {
  41.             return var4;
  42.          }
  43.       }
  44.  
  45.       if (this.interfaces != null) {
  46.          Enumeration var5 = this.interfaces.elements();
  47.  
  48.          while(var5.hasMoreElements()) {
  49.             AttDef var6 = ((ElementDecl)var5.nextElement()).findAttDef(var1);
  50.             if (var6 != null) {
  51.                return var6;
  52.             }
  53.          }
  54.       }
  55.  
  56.       return null;
  57.    }
  58.  
  59.    ElementDecl(Name var1) {
  60.       super(var1, 9);
  61.       this.name = var1;
  62.    }
  63.  
  64.    final void parseAttList(Parser var1) throws ParseException {
  65.       var1.nextToken();
  66.  
  67.       AttDef var4;
  68.       for(; var1.token == -4; this.addAttDef(var4)) {
  69.          Name var5 = var1.name;
  70.          if (var5.getName().equals(Parser.nameXMLSpace.getName())) {
  71.             var5 = Parser.nameXMLSpace;
  72.          }
  73.  
  74.          var1.parseKeyword(0, "Attdef");
  75.          switch (var1.token) {
  76.             case -28:
  77.                var1.parseToken(40, "(");
  78.                Vector var8 = new Vector();
  79.                int var2 = var1.parseNames(var8, 0, (StringBuffer)null);
  80.                --var2;
  81.  
  82.                for(; var2 >= 0; --var2) {
  83.                   Name var6 = (Name)var8.elementAt(var2);
  84.                   if (var1.dtd.findNotation(var6) == null) {
  85.                      var1.error("Notation not declared '" + var6 + "'");
  86.                   }
  87.                }
  88.  
  89.                var1.parseToken(41, ")");
  90.                var4 = new AttDef(var5, 8, var8);
  91.                break;
  92.             case -27:
  93.             case -26:
  94.             case -25:
  95.             case -24:
  96.             case -23:
  97.             case -22:
  98.             case -21:
  99.             case -20:
  100.                var4 = new AttDef(var5, -20 - var1.token);
  101.                break;
  102.             case 40:
  103.                ++var1.nametoken;
  104.                Vector var3 = new Vector();
  105.                var1.parseNames(var3, 124, (StringBuffer)null);
  106.                var1.nametoken += -1;
  107.                if (var1.token != 41) {
  108.                   var1.error("Expected )");
  109.                }
  110.  
  111.                var4 = new AttDef(var5, 9, var3);
  112.                break;
  113.             default:
  114.                var4 = null;
  115.                var1.error("Unknown token in attlist declaration " + var1.token);
  116.          }
  117.  
  118.          if (var1.nextToken() == 35) {
  119.             var1.parseKeyword(0, "attribute default");
  120.             switch (var1.token) {
  121.                case -32:
  122.                   var4.presence = 2;
  123.                   break;
  124.                case -31:
  125.                   var4.presence = 1;
  126.                   break;
  127.                case -30:
  128.                   var4.presence = 3;
  129.                   break;
  130.                default:
  131.                   var1.error("Expected 'REQUIRED', 'IMPLIED', or 'FIXED'.");
  132.             }
  133.  
  134.             var1.nextToken();
  135.          }
  136.  
  137.          if (var4.presence == 3 || var4.presence == 0) {
  138.             switch (var1.token) {
  139.                case 39:
  140.                   var4.def = var4.parseAttValue(this, var1, true);
  141.                   var1.nextToken();
  142.                   break;
  143.                default:
  144.                   var1.error("Expected FIXED or DEFAULT value for " + var4.name);
  145.             }
  146.          }
  147.       }
  148.  
  149.    }
  150.  
  151.    final boolean checkContent(Context var1, Element var2, Parser var3) throws ParseException {
  152.       return this.content.checkContent(var1, var2, var3);
  153.    }
  154.  
  155.    final void addAttDef(AttDef var1) {
  156.       if (this.attdefs == null) {
  157.          this.attdefs = new Vector();
  158.       }
  159.  
  160.       this.attdefs.addElement(var1);
  161.    }
  162.  
  163.    public Element toSchema() {
  164.       if (this.schema == null) {
  165.          ElementImpl var1 = new ElementImpl(nameELEMENTTYPE, 0);
  166.          var1.setAttribute(nameID, this.name);
  167.          Element var2 = this.content.toSchema();
  168.          var1.addChild(var2, (Element)null);
  169.          if (this.attdefs != null) {
  170.             Enumeration var3 = this.attdefs.elements();
  171.  
  172.             while(var3.hasMoreElements()) {
  173.                AttDef var4 = (AttDef)var3.nextElement();
  174.                var1.addChild(var4.toSchema(), (Element)null);
  175.             }
  176.          }
  177.  
  178.          this.schema = var1;
  179.       }
  180.  
  181.       return this.schema;
  182.    }
  183.  
  184.    public void save(XMLOutputStream var1) throws IOException {
  185.       var1.writeIndent();
  186.       var1.writeChars("<!ELEMENT ");
  187.       var1.writeQualifiedName(this.name, (Atom)null);
  188.       var1.writeChars(" ");
  189.       Atom var2 = this.name.getNameSpace();
  190.       this.content.save(var2, var1);
  191.       var1.write(62);
  192.       if (this.attdefs != null) {
  193.          int var3 = var1.getOutputStyle();
  194.          if (var3 != XMLOutputStream.COMPACT) {
  195.             var1.setOutputStyle(XMLOutputStream.PRETTY);
  196.          }
  197.  
  198.          var1.writeNewLine();
  199.          Enumeration var4 = this.attdefs.elements();
  200.          var1.writeIndent();
  201.          var1.writeChars("<!ATTLIST ");
  202.          var1.writeQualifiedName(this.name, (Atom)null);
  203.          var1.writeChars(" ");
  204.  
  205.          while(var4.hasMoreElements()) {
  206.             var1.writeNewLine();
  207.             AttDef var5 = (AttDef)var4.nextElement();
  208.             var1.addIndent(1);
  209.             var1.writeIndent();
  210.             var1.addIndent(-1);
  211.             var5.save(var2, var1);
  212.          }
  213.  
  214.          var1.write(62);
  215.          var1.setOutputStyle(var3);
  216.       }
  217.  
  218.       var1.writeNewLine();
  219.    }
  220.  
  221.    public final Name getName() {
  222.       return this.name;
  223.    }
  224.  
  225.    final boolean acceptEmpty(Context var1) {
  226.       return this.content.acceptEmpty(var1);
  227.    }
  228.  
  229.    final Vector expectedElements(int var1) {
  230.       return this.content.expectedElements(var1);
  231.    }
  232.  
  233.    final void checkOwnAttributes(Element var1, Parser var2) throws ParseException {
  234.       if (this.attdefs != null) {
  235.          Enumeration var3 = this.attdefs.elements();
  236.  
  237.          while(var3.hasMoreElements()) {
  238.             AttDef var4 = (AttDef)var3.nextElement();
  239.             if (var4.getPresence() == 1 && var1.getAttribute(var4.getName()) == null) {
  240.                var2.error("Attribute '" + var4.getName() + "' is required.");
  241.             }
  242.          }
  243.  
  244.       }
  245.    }
  246.  
  247.    final void initContent(Context var1, Parser var2) throws ParseException {
  248.       var1.ed = this;
  249.       AttDef var3 = this.findAttDef(Parser.nameXMLSpace);
  250.       if (var3 != null) {
  251.          Object var4 = var3.getDefault();
  252.          if (var4 != null) {
  253.             String var5 = (String)var4;
  254.             var1.preserveWS = var5.equalsIgnoreCase("preserve");
  255.          }
  256.       }
  257.  
  258.       this.content.initContent(var1, var2);
  259.    }
  260.  
  261.    final void checkAttributes(Element var1, Parser var2) throws ParseException {
  262.       this.checkOwnAttributes(var1, var2);
  263.       if (this.base != null) {
  264.          this.base.checkOwnAttributes(var1, var2);
  265.       }
  266.  
  267.       if (this.interfaces != null) {
  268.          Enumeration var3 = this.interfaces.elements();
  269.  
  270.          while(var3.hasMoreElements()) {
  271.             ((ElementDecl)var3.nextElement()).checkOwnAttributes(var1, var2);
  272.          }
  273.       }
  274.  
  275.    }
  276.  
  277.    final void parseModel(Parser var1) throws ParseException {
  278.       this.content = new ContentModel();
  279.       var1.parseKeyword(0, "EMPTY|...");
  280.       if (var1.token == -37) {
  281.          var1.parseToken(-4, "base element declaration");
  282.          this.base = var1.dtd.findElementDecl(var1.name);
  283.          if (this.base == null) {
  284.             var1.error("Didn't find element declaration to extend " + var1.name);
  285.          }
  286.  
  287.          var1.parseKeyword(0, "EMPTY|...");
  288.       }
  289.  
  290.       if (var1.token == -38) {
  291.          this.interfaces = new Vector();
  292.          int var2 = var1.parseNames(this.interfaces, 44, (StringBuffer)null);
  293.          --var2;
  294.  
  295.          for(; var2 >= 0; --var2) {
  296.             ElementDecl var3 = var1.dtd.findElementDecl((Name)this.interfaces.elementAt(var2));
  297.             if (var3 == null) {
  298.                var1.error("Didn't find element declaration to implement " + this.interfaces.elementAt(var2));
  299.             } else {
  300.                this.interfaces.setElementAt(var3, var2);
  301.             }
  302.          }
  303.  
  304.          if (var1.token == -4) {
  305.             var1.token = var1.lookup(this.name.getName());
  306.          }
  307.       }
  308.  
  309.       switch (var1.token) {
  310.          case -17:
  311.             this.content.type = 2;
  312.             var1.nextToken();
  313.             break;
  314.          case -16:
  315.             this.content.type = 1;
  316.             var1.nextToken();
  317.             break;
  318.          case 40:
  319.             this.content.type = 4;
  320.             this.content.parseModel(var1);
  321.             break;
  322.          case 62:
  323.             if (this.base != null) {
  324.                this.content = this.base.content;
  325.                break;
  326.             }
  327.          default:
  328.             var1.error("Expected EMPTY, ANY, or '('.");
  329.       }
  330.  
  331.       if (var1.token != 62) {
  332.          var1.error("Element declaration syntax error. Expected '>' instead of '" + var1.tokenString(var1.token) + "'");
  333.       }
  334.  
  335.    }
  336.  
  337.    final void parseAttribute(Element var1, Name var2, Parser var3) throws ParseException {
  338.       AttDef var4 = this.findAttDef(var2);
  339.       if (var4 == null) {
  340.          var3.error("Illegal attribute name " + var2);
  341.       }
  342.  
  343.       Object var5 = var4.parseAttribute(var1, var3);
  344.       var1.setAttribute(var2, var5);
  345.    }
  346. }
  347.