home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / esc.jar / com / extensibility / xml / SXE.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-06-30  |  7.6 KB  |  409 lines

  1. package com.extensibility.xml;
  2.  
  3. import com.extensibility.util.StringUtilities;
  4. import java.io.IOException;
  5. import java.io.StringWriter;
  6. import java.io.Writer;
  7. import java.util.Stack;
  8.  
  9. public class SXE {
  10.    public static final int CHILD = -1;
  11.    public static final int SYBLING = -2;
  12.    protected static final String TAG_XML_DECL = "<?xml";
  13.    protected static final String TAG_ELEMENT = "<";
  14.    protected static final String TAG_COMMENT = "<!--";
  15.    protected static final String TAG_END_ELEMENT = "</";
  16.    protected static final String TAG_DOC_TYPE_DECL = "<!";
  17.    protected static final String TAG_PI = "<?";
  18.    protected static final String TAG_CDATA_SECTION = "<![CDATA[";
  19.    protected static final String TAG_ENTITY_REF = "&";
  20.    protected static final String INDENTS = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  21.    protected static final String EOL = System.getProperty("line.separator");
  22.    Writer writer;
  23.    protected String openTag;
  24.    protected boolean openTagIsEmpty;
  25.    protected Stack openTagNest = new Stack();
  26.    boolean atBOL = true;
  27.    Exception lastError;
  28.    boolean nextTagOnNewLine = true;
  29.    protected boolean nestEmpty = true;
  30.    int indent;
  31.    int length = 0;
  32.  
  33.    public SXE(Writer var1) {
  34.       this.writer = var1;
  35.    }
  36.  
  37.    public SXE() {
  38.       this.writer = new StringWriter();
  39.    }
  40.  
  41.    public Writer getWriter() {
  42.       return this.writer;
  43.    }
  44.  
  45.    public boolean isOpenTag(String var1) {
  46.       return this.openTagNest.indexOf(var1) != -1;
  47.    }
  48.  
  49.    public final int getLength() {
  50.       return this.length;
  51.    }
  52.  
  53.    public void writeHeader(String var1) {
  54.       this.closeNest();
  55.       this.openTag("<?xml", String.valueOf(String.valueOf(" version =\"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var1)))).concat(String.valueOf("\"")));
  56.       this.closeTag();
  57.    }
  58.  
  59.    public void writeHeader(String var1, String var2) {
  60.       if (var2 == null) {
  61.          this.writeHeader(var1);
  62.       } else {
  63.          this.closeNest();
  64.          this.openTag("<?xml", String.valueOf(String.valueOf(String.valueOf(String.valueOf(" version =\"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var1)))).concat(String.valueOf("\" encoding =\""))).concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var2)))).concat(String.valueOf("\"")));
  65.          this.closeTag();
  66.       }
  67.    }
  68.  
  69.    public void writeDocType(String var1) {
  70.       this.closeNest();
  71.       this.openTag("<!", String.valueOf("DOCTYPE ").concat(String.valueOf(var1)));
  72.       this.closeTag();
  73.    }
  74.  
  75.    public void writeDocType(String var1, String var2) {
  76.       if (var2 == null) {
  77.          this.writeDocType(var1);
  78.       } else {
  79.          this.closeNest();
  80.          this.openTag("<!", String.valueOf("DOCTYPE ").concat(String.valueOf(var1)));
  81.          this.write(String.valueOf(String.valueOf(" SYSTEM \"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var2)))).concat(String.valueOf("\"")));
  82.          this.closeTag();
  83.       }
  84.    }
  85.  
  86.    public void writeDocTypeWithInternal(String var1, String var2, String var3) {
  87.       this.closeNest();
  88.       this.openTag("<!", String.valueOf("DOCTYPE ").concat(String.valueOf(var1)));
  89.       if (var2 != null && !var2.equals("")) {
  90.          this.write(String.valueOf(String.valueOf(" SYSTEM \"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var2)))).concat(String.valueOf("\"")));
  91.       }
  92.  
  93.       if (var3 != null && !var3.equals("")) {
  94.          this.write(String.valueOf(String.valueOf(" [").concat(String.valueOf(var3))).concat(String.valueOf("]")));
  95.       }
  96.  
  97.       this.closeTag();
  98.    }
  99.  
  100.    public void writeDocType(String var1, String var2, String var3) {
  101.       if (var2 == null && var3 == null) {
  102.          this.writeDocType(var1);
  103.       } else {
  104.          this.closeNest();
  105.          this.openTag("<!", String.valueOf("DOCTYPE ").concat(String.valueOf(var1)));
  106.          this.write(String.valueOf(String.valueOf(" PUBLIC \"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var2)))).concat(String.valueOf("\"")));
  107.          this.write(String.valueOf(String.valueOf(" \"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var3)))).concat(String.valueOf("\"")));
  108.          this.closeTag();
  109.       }
  110.    }
  111.  
  112.    public void writeElem(String var1) {
  113.       this.writeElem(var1, this.getDepth() > 1 ? -2 : -1, false);
  114.    }
  115.  
  116.    public void writeElem(String var1, boolean var2) {
  117.       this.writeElem(var1, var2 ? -1 : -2, var2);
  118.    }
  119.  
  120.    public void writeElem(String var1, int var2) {
  121.       this.writeElem(var1, var2, false);
  122.    }
  123.  
  124.    private int decodeDepth(String var1, int var2) {
  125.       if (var2 == -1) {
  126.          var2 = this.getDepth();
  127.       } else if (var2 == -2) {
  128.          var2 = Math.max(0, this.getDepth() - 1);
  129.       }
  130.  
  131.       return var2;
  132.    }
  133.  
  134.    public void writeElem(String var1, int var2, boolean var3) {
  135.       var2 = this.decodeDepth(var1, var2);
  136.       if (var2 >= 0 && var2 <= this.getDepth()) {
  137.          if (var3) {
  138.             this.closeNest(var2);
  139.             this.openTag("<", var1, true);
  140.          } else {
  141.             this.closeNest(var2);
  142.             this.openTag("<", var1);
  143.             this.openNest(var1);
  144.          }
  145.  
  146.          this.nextTagOnNewLine = true;
  147.       } else {
  148.          throw new IllegalArgumentException(String.valueOf(String.valueOf(var2).concat(String.valueOf(" > "))).concat(String.valueOf(this.getDepth())));
  149.       }
  150.    }
  151.  
  152.    public void writeCDATA(String var1) {
  153.       this.nextTagOnNewLine = false;
  154.       this.openTag("<![CDATA[", var1);
  155.       this.closeTag();
  156.    }
  157.  
  158.    public void writeEntityRef(String var1) {
  159.       this.nextTagOnNewLine = false;
  160.       this.openTag("&", var1);
  161.       this.closeTag();
  162.    }
  163.  
  164.    public void writePI(String var1, String var2) {
  165.       this.openTag("<?", String.valueOf(String.valueOf(var1).concat(String.valueOf(" "))).concat(String.valueOf(var2)));
  166.       this.closeTag();
  167.    }
  168.  
  169.    public void writeComment(String var1) {
  170.       boolean var2 = this.nextTagOnNewLine;
  171.       this.nextTagOnNewLine = false;
  172.       this.openTag("<!--", var1);
  173.       this.closeTag();
  174.       this.nextTagOnNewLine = var2;
  175.    }
  176.  
  177.    public void writeComment(String var1, boolean var2) {
  178.       if (var2) {
  179.          this.writeLineBreak(true);
  180.       }
  181.  
  182.       this.writeComment(var1);
  183.    }
  184.  
  185.    public void flush(String var1) {
  186.       int var2 = this.openTagNest.lastIndexOf(var1);
  187.       if (var2 >= 0) {
  188.          this.closeNest(var2);
  189.       }
  190.  
  191.    }
  192.  
  193.    public void flushUpTo(String var1) {
  194.       int var2 = this.openTagNest.lastIndexOf(var1);
  195.       if (var2 >= 0) {
  196.          this.closeNest(var2 + 1);
  197.       }
  198.  
  199.    }
  200.  
  201.    public void flush() {
  202.       this.closeNest();
  203.    }
  204.  
  205.    public void writeAttr(String var1, String var2) {
  206.       this.checkAttrAllowed();
  207.       this.write(String.valueOf(String.valueOf(" ").concat(String.valueOf(var1))).concat(String.valueOf(" = \"")));
  208.       if (var2 != null) {
  209.          this.writeValidXML(replace(var2, "\"", """));
  210.       }
  211.  
  212.       this.write("\"");
  213.    }
  214.  
  215.    protected void writeTextOrRawText(String var1, boolean var2) {
  216.       this.closeTag();
  217.       if (var2) {
  218.          this.write(var1);
  219.       } else {
  220.          this.writeValidXML(var1);
  221.       }
  222.  
  223.       this.nestEmpty = false;
  224.       if (!StringUtilities.isWhitespace(var1)) {
  225.          this.nextTagOnNewLine = var1.indexOf(EOL) >= 0;
  226.       }
  227.  
  228.    }
  229.  
  230.    public void writeRawText(String var1) {
  231.       this.writeTextOrRawText(var1, true);
  232.    }
  233.  
  234.    public void writeText(String var1) {
  235.       this.writeTextOrRawText(var1, false);
  236.    }
  237.  
  238.    public void writeText(String var1, boolean var2) {
  239.       this.writeText(var1);
  240.       this.nextTagOnNewLine = var2;
  241.    }
  242.  
  243.    public int getDepth() {
  244.       return this.openTagNest.size();
  245.    }
  246.  
  247.    public void writeLineBreak(boolean var1) {
  248.       if (var1) {
  249.          this.closeTag();
  250.       }
  251.  
  252.       this.writeLineBreak();
  253.    }
  254.  
  255.    public void writeLineBreak() {
  256.       this.writeln("");
  257.    }
  258.  
  259.    protected void writeValidXML(String var1) {
  260.       StringBuffer var2 = new StringBuffer("");
  261.  
  262.       for(int var3 = 0; var3 < var1.length(); ++var3) {
  263.          if (var1.charAt(var3) == '&') {
  264.             if (var3 + 5 > var1.length() || !var1.substring(var3, var3 + 5).equals("&") && !var1.substring(var3, var3 + 5).equals("'")) {
  265.                if (var3 + 4 > var1.length() || !var1.substring(var3, var3 + 4).equals("<") && !var1.substring(var3, var3 + 4).equals(">")) {
  266.                   var2.append("&");
  267.                } else {
  268.                   var2.append("&");
  269.                }
  270.             } else {
  271.                var2.append("&");
  272.             }
  273.          } else {
  274.             var2.append(var1.charAt(var3));
  275.          }
  276.       }
  277.  
  278.       String var4 = var2.toString();
  279.       var4 = replace(var4, "<", "<");
  280.       this.write(var4);
  281.    }
  282.  
  283.    protected void write(String var1) {
  284.       try {
  285.          this.writeIndent();
  286.          this.writer.write(var1);
  287.          this.length += var1.length();
  288.       } catch (IOException var3) {
  289.          this.lastError = var3;
  290.       }
  291.  
  292.    }
  293.  
  294.    protected void writeIndent() {
  295.       if (this.atBOL) {
  296.          this.atBOL = false;
  297.          this.write("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t".substring(0, this.indent));
  298.       }
  299.  
  300.    }
  301.  
  302.    protected void writeln(String var1) {
  303.       this.write(var1);
  304.       this.write(EOL);
  305.       this.atBOL = true;
  306.    }
  307.  
  308.    protected void checkAttrAllowed() {
  309.       if (this.openTag != "<") {
  310.          throw new IllegalArgumentException();
  311.       }
  312.    }
  313.  
  314.    protected void openNest(String var1) {
  315.       this.openTagNest.push(var1);
  316.       ++this.indent;
  317.       this.nestEmpty = true;
  318.    }
  319.  
  320.    protected void closeNest() {
  321.       this.closeNest(0);
  322.    }
  323.  
  324.    protected void closeNest(int var1) {
  325.       if (this.openTagNest.size() == var1) {
  326.          this.closeTag();
  327.       }
  328.  
  329.       for(; this.openTagNest.size() > var1; this.closeTag()) {
  330.          String var2 = (String)this.openTagNest.pop();
  331.          --this.indent;
  332.          if (this.nestEmpty) {
  333.             this.openTagIsEmpty = true;
  334.          } else {
  335.             this.openTag("</", var2);
  336.          }
  337.       }
  338.  
  339.    }
  340.  
  341.    protected void openTag(String var1, String var2) {
  342.       this.openTag(var1, var2, false);
  343.    }
  344.  
  345.    protected void openTag(String var1, String var2, boolean var3) {
  346.       if (this.openTag != null) {
  347.          this.closeTag();
  348.       }
  349.  
  350.       this.openTagIsEmpty = var3;
  351.       this.openTag = var1;
  352.       if (this.nextTagOnNewLine && !this.atBOL) {
  353.          this.writeln("");
  354.       }
  355.  
  356.       this.write(String.valueOf(var1).concat(String.valueOf(var2)));
  357.    }
  358.  
  359.    protected void closeTag() {
  360.       if (this.openTag != null) {
  361.          if (this.openTag == "<") {
  362.             this.write(this.openTagIsEmpty ? "/>" : ">");
  363.          } else if (this.openTag == "</") {
  364.             this.write(">");
  365.             this.nextTagOnNewLine = true;
  366.          } else if (this.openTag == "<!--") {
  367.             this.writeln("-->");
  368.          } else if (this.openTag == "<?") {
  369.             this.writeln("?>");
  370.          } else if (this.openTag == "<![CDATA[") {
  371.             this.write("]]>");
  372.          } else if (this.openTag == "&") {
  373.             this.write(";");
  374.          } else if (this.openTag == "<?xml") {
  375.             this.writeln("?>");
  376.          } else {
  377.             if (this.openTag != "<!") {
  378.                throw new IllegalArgumentException();
  379.             }
  380.  
  381.             this.writeln(">");
  382.          }
  383.       }
  384.  
  385.       this.openTag = null;
  386.       this.nestEmpty = false;
  387.    }
  388.  
  389.    protected static String replace(String var0, String var1, String var2) {
  390.       if (var0.indexOf(var1) < 0) {
  391.          return var0;
  392.       } else {
  393.          int var3 = 0;
  394.          StringBuffer var4 = new StringBuffer();
  395.  
  396.          while(true) {
  397.             int var5 = var0.indexOf(var1, var3);
  398.             if (var5 == -1) {
  399.                var4.append(var0.substring(var3));
  400.                return var4.toString();
  401.             }
  402.  
  403.             var4.append(String.valueOf(var0.substring(var3, var5)).concat(String.valueOf(var2)));
  404.             var3 = var5 + var1.length();
  405.          }
  406.       }
  407.    }
  408. }
  409.