home *** CD-ROM | disk | FTP | other *** search
/ Online Today 2000 January / Onto0100.iso / pc / JAVA / MSJAVX86.EXE / xmldso.cab / XML4IE3.cab / com / ms / xml / parser / ElementDecl.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-10-10  |  5.6 KB  |  244 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.Name;
  6. import com.ms.xml.util.QualifiedName;
  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.  
  17.    public final ContentModel getContent() {
  18.       return this.content;
  19.    }
  20.  
  21.    public final AttDef findAttDef(Name var1) {
  22.       if (this.attdefs != null) {
  23.          for(int var2 = 0; var2 < this.attdefs.size(); ++var2) {
  24.             AttDef var3 = (AttDef)this.attdefs.elementAt(var2);
  25.             if (var3.name.equals(var1)) {
  26.                return var3;
  27.             }
  28.          }
  29.       }
  30.  
  31.       return null;
  32.    }
  33.  
  34.    final void parseAttList(Parser var1) throws ParseException {
  35.       var1.nextToken();
  36.  
  37.       AttDef var4;
  38.       for(; var1.token == -4; this.addAttDef(var4)) {
  39.          Name var5 = var1.name;
  40.          var1.parseKeyword(0, "Attdef");
  41.          switch (var1.token) {
  42.             case -28:
  43.                var1.parseToken(40, "(");
  44.                Vector var8 = new Vector();
  45.                int var2 = var1.parseNames(var8, 0, (StringBuffer)null);
  46.                --var2;
  47.  
  48.                for(; var2 >= 0; --var2) {
  49.                   Name var6 = (Name)var8.elementAt(var2);
  50.                   if (var1.dtd.findNotation(var6) == null) {
  51.                      var1.error("Notation not declared '" + var6 + "'");
  52.                   }
  53.                }
  54.  
  55.                var1.parseToken(41, ")");
  56.                var4 = new AttDef(var5, 8, var8);
  57.                break;
  58.             case -27:
  59.             case -26:
  60.             case -25:
  61.             case -24:
  62.             case -23:
  63.             case -22:
  64.             case -21:
  65.             case -20:
  66.                var4 = new AttDef(var5, -20 - var1.token + 0);
  67.                break;
  68.             case 40:
  69.                ++var1.nametoken;
  70.                Vector var3 = new Vector();
  71.                var1.parseNames(var3, 124, (StringBuffer)null);
  72.                var1.nametoken += -1;
  73.                if (var1.token != 41) {
  74.                   var1.error("Expected )");
  75.                }
  76.  
  77.                var4 = new AttDef(var5, 9, var3);
  78.                break;
  79.             default:
  80.                var4 = null;
  81.                var1.error("Unknown token in attlist declaration " + var1.token);
  82.          }
  83.  
  84.          if (var1.nextToken() == 35) {
  85.             var1.parseKeyword(0, "attribute default");
  86.             switch (var1.token) {
  87.                case -32:
  88.                   var4.presence = 2;
  89.                   break;
  90.                case -31:
  91.                   var4.presence = 1;
  92.                   break;
  93.                case -30:
  94.                   var4.presence = 3;
  95.                   break;
  96.                default:
  97.                   var1.error("Expected 'REQUIRED', 'IMPLIED', or 'FIXED'.");
  98.             }
  99.  
  100.             var1.nextToken();
  101.          }
  102.  
  103.          if (var4.presence == 3 || var4.presence == 0) {
  104.             switch (var1.token) {
  105.                case 39:
  106.                   var4.def = var4.parseAttValue(this, var1, true);
  107.                   var1.nextToken();
  108.                   break;
  109.                default:
  110.                   var1.error("Expected FIXED or DEFAULT value for " + var4.name);
  111.             }
  112.          }
  113.       }
  114.  
  115.    }
  116.  
  117.    final boolean checkContent(Context var1, Element var2, Parser var3) throws ParseException {
  118.       return this.content.checkContent(var1, var2, var3);
  119.    }
  120.  
  121.    final void addAttDef(AttDef var1) {
  122.       if (this.attdefs == null) {
  123.          this.attdefs = new Vector();
  124.       }
  125.  
  126.       this.attdefs.addElement(var1);
  127.    }
  128.  
  129.    public void save(XMLOutputStream var1) throws IOException {
  130.       var1.writeIndent();
  131.       var1.writeChars("<!ELEMENT ");
  132.       var1.writeQualifiedName(this.name, (Name)null);
  133.       var1.writeChars(" ");
  134.       Name var2 = QualifiedName.getNameSpace(this.name);
  135.       this.content.save(var2, var1);
  136.       var1.write(62);
  137.       var1.writeNewLine();
  138.       if (this.attdefs != null) {
  139.          Enumeration var3 = this.attdefs.elements();
  140.          var1.writeIndent();
  141.          var1.writeChars("<!ATTLIST ");
  142.          var1.writeQualifiedName(this.name, (Name)null);
  143.          var1.writeChars(" ");
  144.  
  145.          while(var3.hasMoreElements()) {
  146.             var1.writeNewLine();
  147.             AttDef var4 = (AttDef)var3.nextElement();
  148.             var1.addIndent(1);
  149.             var1.writeIndent();
  150.             var1.addIndent(-1);
  151.             var4.save(var2, var1);
  152.          }
  153.  
  154.          var1.write(62);
  155.          var1.writeNewLine();
  156.       }
  157.  
  158.    }
  159.  
  160.    ElementDecl(Name var1) {
  161.       super(var1, 9);
  162.       this.name = var1;
  163.    }
  164.  
  165.    public final Name getName() {
  166.       return this.name;
  167.    }
  168.  
  169.    final boolean acceptEmpty() {
  170.       return this.content.acceptEmpty();
  171.    }
  172.  
  173.    final Vector expectedElements(int var1) {
  174.       return this.content.expectedElements(var1);
  175.    }
  176.  
  177.    final void checkAttributes(Element var1, Parser var2) throws ParseException {
  178.       if (this.attdefs != null) {
  179.          Enumeration var3 = this.attdefs.elements();
  180.  
  181.          while(var3.hasMoreElements()) {
  182.             AttDef var4 = (AttDef)var3.nextElement();
  183.             if (var4.getPresence() == 1 && var1.getAttribute(var4.getName()) == null) {
  184.                var2.error("Attribute '" + var4.getName() + "' is required.");
  185.             }
  186.          }
  187.  
  188.       }
  189.    }
  190.  
  191.    final void initContent(Context var1, Parser var2) throws ParseException {
  192.       var1.ed = this;
  193.       AttDef var3 = this.findAttDef(Parser.nameXMLSpace);
  194.       if (var3 != null) {
  195.          Object var4 = var3.getDefault();
  196.          if (var4 != null) {
  197.             String var5 = (String)var4;
  198.             var1.preserveWS = var5.equalsIgnoreCase("preserve");
  199.          }
  200.       }
  201.  
  202.       this.content.initContent(var1, var2);
  203.    }
  204.  
  205.    final void parseAttribute(Element var1, Name var2, Parser var3) throws ParseException {
  206.       if (this.attdefs != null) {
  207.          AttDef var4 = this.findAttDef(var2);
  208.          if (var4 == null) {
  209.             var3.error("Illegal attribute name " + var2);
  210.          }
  211.  
  212.          Object var5 = var4.parseAttribute(var1, var3);
  213.          var1.setAttribute(var2, var5);
  214.       }
  215.  
  216.    }
  217.  
  218.    final void parseModel(Parser var1) throws ParseException {
  219.       this.content = new ContentModel();
  220.       var1.parseKeyword(0, "EMPTY|...");
  221.       switch (var1.token) {
  222.          case -17:
  223.             this.content.type = 2;
  224.             var1.nextToken();
  225.             break;
  226.          case -16:
  227.             this.content.type = 1;
  228.             var1.nextToken();
  229.             break;
  230.          case 40:
  231.             this.content.type = 4;
  232.             this.content.parseModel(var1);
  233.             break;
  234.          default:
  235.             var1.error("Expected EMPTY, ANY, or '('.");
  236.       }
  237.  
  238.       if (var1.token != 62) {
  239.          var1.error("Element declaration syntax error. Expected '>' instead of '" + var1.tokenString(var1.token) + "'");
  240.       }
  241.  
  242.    }
  243. }
  244.