home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / APCHSSL2.ZIP / OS2HTTPD / jserv / com / kav / xml / XMLPrinter.class (.txt) < prev   
Encoding:
Java Class File  |  1999-05-16  |  5.8 KB  |  415 lines

  1. package com.kav.xml;
  2.  
  3. import java.io.PrintWriter;
  4. import org.w3c.dom.Attr;
  5. import org.w3c.dom.CharacterData;
  6. import org.w3c.dom.Document;
  7. import org.w3c.dom.DocumentType;
  8. import org.w3c.dom.Element;
  9. import org.w3c.dom.NamedNodeMap;
  10. import org.w3c.dom.Node;
  11. import org.w3c.dom.NodeList;
  12. import org.w3c.dom.Notation;
  13. import org.w3c.dom.ProcessingInstruction;
  14. import org.w3c.dom.Text;
  15.  
  16. public class XMLPrinter {
  17.    public static final int DEFAULT_INDENT = 2;
  18.    private int width;
  19.    private String entityTokens;
  20.    private final String AMP_ENTITY;
  21.    private final String GT_ENTITY;
  22.    private final String LT_ENTITY;
  23.    private final String HEX_ENTITY;
  24.    protected final String CDATA_END;
  25.    protected final String CDATA_START;
  26.    protected final String COMMENT_START;
  27.    protected final String COMMENT_END;
  28.    protected final String DOCTYPE_START;
  29.    protected final String DOCTYPE_END;
  30.    protected final String DOUBLE_QUOTE;
  31.    protected final String EQUALS;
  32.    protected final String FORWARD_SLASH;
  33.    protected final String L_ANGLE_BRACKET;
  34.    protected final String PI_START;
  35.    protected final String PI_END;
  36.    protected final String PUBLIC;
  37.    protected final String R_ANGLE_BRACKET;
  38.    protected final String SEMICOLON;
  39.    protected final String SPACE;
  40.    protected final String SYSTEM;
  41.    protected final String XML_DECL;
  42.    protected final char AMPERSAND;
  43.    // $FF: renamed from: GT char
  44.    protected final char field_0;
  45.    // $FF: renamed from: LT char
  46.    protected final char field_1;
  47.    protected final char DASH;
  48.    protected final char NULL;
  49.    // $FF: renamed from: CR char
  50.    private final char field_2;
  51.    // $FF: renamed from: LF char
  52.    private final char field_3;
  53.    private String version;
  54.    private String indent;
  55.    private final char indentChar;
  56.    private int indentSize;
  57.    // $FF: renamed from: pw java.io.PrintWriter
  58.    private PrintWriter field_4;
  59.    private boolean unescapeCDATA;
  60.    private boolean useEmptyElementShorthand;
  61.    private boolean useFormat;
  62.  
  63.    public XMLPrinter(PrintWriter var1) {
  64.       this(var1, 2);
  65.    }
  66.  
  67.    public XMLPrinter(PrintWriter var1, int var2) {
  68.       this.width = 80;
  69.       this.entityTokens = "&<>";
  70.       this.AMP_ENTITY = "&";
  71.       this.GT_ENTITY = ">";
  72.       this.LT_ENTITY = "<";
  73.       this.HEX_ENTITY = "&#";
  74.       this.CDATA_END = "]]>";
  75.       this.CDATA_START = "<![CDATA[";
  76.       this.COMMENT_START = "<!-- ";
  77.       this.COMMENT_END = " -->";
  78.       this.DOCTYPE_START = "<!DOCTYPE ";
  79.       this.DOCTYPE_END = ">";
  80.       this.DOUBLE_QUOTE = "\"";
  81.       this.EQUALS = "=";
  82.       this.FORWARD_SLASH = "/";
  83.       this.L_ANGLE_BRACKET = "<";
  84.       this.PI_START = "<?";
  85.       this.PI_END = "?>";
  86.       this.PUBLIC = "PUBLIC";
  87.       this.R_ANGLE_BRACKET = ">";
  88.       this.SEMICOLON = ";";
  89.       this.SPACE = " ";
  90.       this.SYSTEM = "SYSTEM";
  91.       this.XML_DECL = "xml version=";
  92.       this.AMPERSAND = '&';
  93.       this.field_0 = '>';
  94.       this.field_1 = '<';
  95.       this.DASH = '-';
  96.       this.field_2 = '\r';
  97.       this.field_3 = '\n';
  98.       this.version = "1.0";
  99.       this.indentChar = ' ';
  100.       this.indentSize = 2;
  101.       this.unescapeCDATA = false;
  102.       this.useEmptyElementShorthand = true;
  103.       this.useFormat = false;
  104.       this.field_4 = var1;
  105.       this.setIndentSize(var2);
  106.    }
  107.  
  108.    public void print(Node var1) {
  109.       this.print(var1, "");
  110.       this.field_4.flush();
  111.    }
  112.  
  113.    public void printDoctype(DocumentType var1) {
  114.       if (var1 != null) {
  115.          this.field_4.print("<!DOCTYPE  ");
  116.          this.field_4.print(var1.getName());
  117.          int var2 = 0;
  118.          NamedNodeMap var3 = var1.getNotations();
  119.          if (var3 != null) {
  120.             var2 = var3.getLength();
  121.          }
  122.  
  123.          for(int var5 = 0; var5 < var2; ++var5) {
  124.             if (var5 > 0) {
  125.                this.field_4.println();
  126.             }
  127.  
  128.             Notation var6 = (Notation)var3.item(var5);
  129.             String var4;
  130.             if ((var4 = var6.getSystemId()) != null) {
  131.                this.field_4.print("SYSTEM ");
  132.                this.field_4.print(var4);
  133.             }
  134.  
  135.             if ((var4 = var6.getPublicId()) != null) {
  136.                this.field_4.print("PUBLIC ");
  137.                this.field_4.print(var4);
  138.             }
  139.          }
  140.  
  141.          this.field_4.println(">");
  142.       }
  143.    }
  144.  
  145.    public void setIndentSize(int var1) {
  146.       this.indentSize = var1;
  147.       StringBuffer var2 = new StringBuffer(var1);
  148.  
  149.       for(int var3 = 0; var3 < var1; ++var3) {
  150.          var2.append(' ');
  151.       }
  152.  
  153.       this.indent = var2.toString();
  154.    }
  155.  
  156.    public void setUnescapeCDATA(boolean var1) {
  157.       this.unescapeCDATA = var1;
  158.    }
  159.  
  160.    public void setUseEmptyElementShorthand(boolean var1) {
  161.       this.useEmptyElementShorthand = var1;
  162.    }
  163.  
  164.    public void setUseFormat(boolean var1) {
  165.       this.useFormat = var1;
  166.    }
  167.  
  168.    protected boolean print(Node var1, String var2) {
  169.       if (var1 == null) {
  170.          return false;
  171.       } else {
  172.          Object var4 = null;
  173.          switch (var1.getNodeType()) {
  174.             case 1:
  175.                Element var7 = (Element)var1;
  176.                this.field_4.print("<");
  177.                this.field_4.print(var7.getNodeName());
  178.                NamedNodeMap var8 = var7.getAttributes();
  179.                if (var8 != null) {
  180.                   for(int var10 = 0; var10 < var8.getLength(); ++var10) {
  181.                      Attr var9 = (Attr)var8.item(var10);
  182.                      String var18 = var9.getValue();
  183.                      this.field_4.print(" ");
  184.                      this.field_4.print(var9.getName());
  185.                      if (var18 != null) {
  186.                         this.field_4.print("=\"");
  187.                         this.field_4.print(var18);
  188.                         this.field_4.print("\"");
  189.                      }
  190.                   }
  191.                }
  192.  
  193.                NodeList var21 = var7.getChildNodes();
  194.                int var22 = var21.getLength();
  195.                if (var22 == 0 && this.useEmptyElementShorthand) {
  196.                   this.field_4.print("/>");
  197.                   if (this.useFormat) {
  198.                      this.field_4.println();
  199.                      return true;
  200.                   }
  201.                } else {
  202.                   boolean var23 = false;
  203.                   this.field_4.print(">");
  204.                   if (this.useFormat && var22 > 0 && var21.item(0).getNodeType() != 3) {
  205.                      this.field_4.println();
  206.                      var23 = true;
  207.                   }
  208.  
  209.                   Node var12 = null;
  210.                   String var13 = this.indent + var2;
  211.  
  212.                   for(int var14 = 0; var14 < var22; ++var14) {
  213.                      var12 = var21.item(var14);
  214.                      if (this.useFormat && var23) {
  215.                         this.field_4.print(var13);
  216.                      }
  217.  
  218.                      var23 = this.print(var12, var13);
  219.                   }
  220.  
  221.                   if (this.useFormat && var12 != null && var12.getNodeType() != 3) {
  222.                      this.field_4.print(var2);
  223.                   }
  224.  
  225.                   this.field_4.print("</");
  226.                   this.field_4.print(var7.getNodeName());
  227.                   this.field_4.print(">");
  228.                   if (this.useFormat) {
  229.                      Node var15 = var1.getNextSibling();
  230.                      if (var15 == null || var15.getNodeType() != 3) {
  231.                         this.field_4.println();
  232.                         return true;
  233.                      }
  234.                   }
  235.                }
  236.                break;
  237.             case 2:
  238.                Attr var20 = (Attr)var1;
  239.                this.field_4.print(var20.getName());
  240.                String var17 = var20.getValue();
  241.                if (var17 != null) {
  242.                   this.field_4.print("=\"");
  243.                   this.field_4.print(var17);
  244.                   this.field_4.print("\"");
  245.                }
  246.                break;
  247.             case 3:
  248.                String var16 = ((Text)var1).getData();
  249.                this.printWithXMLEntities(var16);
  250.                break;
  251.             case 4:
  252.                if (this.unescapeCDATA) {
  253.                   this.printWithXMLEntities(((Text)var1).getData());
  254.                } else {
  255.                   String var3 = ((Text)var1).getData();
  256.                   this.field_4.print("<![CDATA[");
  257.                   this.printUTF8Chars(var3.toCharArray());
  258.                   this.field_4.print("]]>");
  259.                }
  260.                break;
  261.             case 5:
  262.                this.field_4.print('&');
  263.                this.field_4.print(var1.getNodeName());
  264.                this.field_4.print(";");
  265.             case 6:
  266.             default:
  267.                break;
  268.             case 7:
  269.                ProcessingInstruction var11 = (ProcessingInstruction)var1;
  270.                this.field_4.print("<?");
  271.                this.field_4.print(var11.getTarget());
  272.                this.field_4.print(" ");
  273.                this.field_4.print(var11.getData());
  274.                this.field_4.print("?>");
  275.                if (this.useFormat) {
  276.                   this.field_4.println();
  277.                   return true;
  278.                }
  279.                break;
  280.             case 8:
  281.                this.field_4.print("<!-- ");
  282.                this.printComment(((CharacterData)var1).getData());
  283.                this.field_4.print(" -->");
  284.                if (this.useFormat) {
  285.                   this.field_4.println();
  286.                   return true;
  287.                }
  288.                break;
  289.             case 9:
  290.                Document var5 = (Document)var1;
  291.                this.field_4.print("<?xml version=\"");
  292.                this.field_4.print(this.version);
  293.                this.field_4.println("\"?>");
  294.                this.printDoctype(var5.getDoctype());
  295.                NodeList var19 = var5.getChildNodes();
  296.  
  297.                for(int var6 = 0; var6 < var19.getLength(); ++var6) {
  298.                   this.print(var19.item(var6), var2);
  299.                }
  300.                break;
  301.             case 10:
  302.                this.printDoctype((DocumentType)var1);
  303.          }
  304.  
  305.          return false;
  306.       }
  307.    }
  308.  
  309.    protected void printUTF8Char(char var1) {
  310.       if (var1 >= 128) {
  311.          this.field_4.print("&#");
  312.          this.field_4.print(var1);
  313.          this.field_4.print(";");
  314.       } else {
  315.          this.field_4.print(var1);
  316.       }
  317.    }
  318.  
  319.    protected void printUTF8Chars(char[] var1) {
  320.       int var2 = 0;
  321.       int var3 = 0;
  322.  
  323.       for(int var4 = 0; var4 < var1.length; ++var4) {
  324.          if (var1[var4] >= 128) {
  325.             this.field_4.write(var1, var2, var3);
  326.             var3 = 0;
  327.             var2 = var4 + 1;
  328.             this.field_4.print("&#");
  329.             this.field_4.print(var1[var4]);
  330.             this.field_4.print(";");
  331.          } else {
  332.             ++var3;
  333.          }
  334.       }
  335.  
  336.       if (var2 < var1.length) {
  337.          this.field_4.write(var1, var2, var3);
  338.       }
  339.  
  340.    }
  341.  
  342.    private void printWithXMLEntities(String var1) {
  343.       if (var1 != null) {
  344.          char[] var2 = var1.toCharArray();
  345.          int var3 = 0;
  346.          int var4 = 0;
  347.  
  348.          for(int var5 = 0; var5 < var2.length; ++var5) {
  349.             switch (var2[var5]) {
  350.                case '&':
  351.                   this.field_4.write(var2, var4, var3);
  352.                   var3 = 0;
  353.                   var4 = var5 + 1;
  354.                   this.field_4.print("&");
  355.                   break;
  356.                case '<':
  357.                   this.field_4.write(var2, var4, var3);
  358.                   var3 = 0;
  359.                   var4 = var5 + 1;
  360.                   this.field_4.print("<");
  361.                   break;
  362.                case '>':
  363.                   this.field_4.write(var2, var4, var3);
  364.                   var3 = 0;
  365.                   var4 = var5 + 1;
  366.                   this.field_4.print(">");
  367.                   break;
  368.                default:
  369.                   if (var2[var5] >= 128) {
  370.                      this.field_4.write(var2, var4, var3);
  371.                      var3 = 0;
  372.                      var4 = var5 + 1;
  373.                      this.field_4.print("&#");
  374.                      this.field_4.print(var2[var5]);
  375.                      this.field_4.print(";");
  376.                   } else {
  377.                      ++var3;
  378.                   }
  379.             }
  380.          }
  381.  
  382.          if (var4 < var2.length) {
  383.             this.field_4.write(var2, var4, var3);
  384.          }
  385.  
  386.       }
  387.    }
  388.  
  389.    private void printComment(String var1) {
  390.       if (var1 != null) {
  391.          char[] var2 = var1.toCharArray();
  392.          int var3 = 0;
  393.          int var4 = 0;
  394.          char var5 = 0;
  395.  
  396.          for(int var6 = 0; var6 < var2.length; ++var6) {
  397.             if (var2[var6] == '-' && var5 == '-') {
  398.                this.field_4.write(var2, var4, var3);
  399.                var4 = var6;
  400.                this.field_4.print(" ");
  401.                var3 = 1;
  402.             } else {
  403.                var5 = var2[var6];
  404.                ++var3;
  405.             }
  406.          }
  407.  
  408.          if (var4 < var2.length) {
  409.             this.field_4.write(var2, var4, var3);
  410.          }
  411.  
  412.       }
  413.    }
  414. }
  415.