home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2005 July / PCpro_2005_07.ISO / files / wintools / FullSync / FullSyncInstaller.exe / net / n3 / nanoxml / StdXMLReader.class (.txt) < prev    next >
Encoding:
Java Class File  |  2005-03-08  |  4.6 KB  |  313 lines

  1. package net.n3.nanoxml;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.io.LineNumberReader;
  9. import java.io.PushbackInputStream;
  10. import java.io.PushbackReader;
  11. import java.io.Reader;
  12. import java.io.StringReader;
  13. import java.io.UnsupportedEncodingException;
  14. import java.net.MalformedURLException;
  15. import java.net.URL;
  16. import java.util.Stack;
  17.  
  18. public class StdXMLReader implements IXMLReader {
  19.    private Stack pbreaders;
  20.    private Stack linereaders;
  21.    private Stack systemIds;
  22.    private Stack publicIds;
  23.    private PushbackReader currentPbReader;
  24.    private LineNumberReader currentLineReader;
  25.    private URL currentSystemID;
  26.    private String currentPublicID;
  27.  
  28.    public static IXMLReader stringReader(String var0) {
  29.       return new StdXMLReader(new StringReader(var0));
  30.    }
  31.  
  32.    public static IXMLReader fileReader(String var0) throws FileNotFoundException, IOException {
  33.       StdXMLReader var1 = new StdXMLReader(new FileInputStream(var0));
  34.       var1.setSystemID(var0);
  35.       return var1;
  36.    }
  37.  
  38.    public StdXMLReader(String var1, String var2) throws MalformedURLException, FileNotFoundException, IOException {
  39.       Object var3 = null;
  40.  
  41.       try {
  42.          var9 = new URL(var2);
  43.       } catch (MalformedURLException var7) {
  44.          var2 = "file:" + var2;
  45.  
  46.          try {
  47.             var9 = new URL(var2);
  48.          } catch (MalformedURLException var6) {
  49.             throw var7;
  50.          }
  51.       }
  52.  
  53.       Reader var4 = this.openStream(var1, var9.toString());
  54.       this.currentLineReader = new LineNumberReader(var4);
  55.       this.currentPbReader = new PushbackReader(this.currentLineReader, 2);
  56.       this.pbreaders = new Stack();
  57.       this.linereaders = new Stack();
  58.       this.publicIds = new Stack();
  59.       this.systemIds = new Stack();
  60.       this.currentPublicID = var1;
  61.       this.currentSystemID = var9;
  62.    }
  63.  
  64.    public StdXMLReader(Reader var1) {
  65.       this.currentLineReader = new LineNumberReader(var1);
  66.       this.currentPbReader = new PushbackReader(this.currentLineReader, 2);
  67.       this.pbreaders = new Stack();
  68.       this.linereaders = new Stack();
  69.       this.publicIds = new Stack();
  70.       this.systemIds = new Stack();
  71.       this.currentPublicID = "";
  72.  
  73.       try {
  74.          this.currentSystemID = new URL("file:.");
  75.       } catch (MalformedURLException var3) {
  76.       }
  77.  
  78.    }
  79.  
  80.    protected void finalize() throws Throwable {
  81.       this.currentLineReader = null;
  82.       this.currentPbReader = null;
  83.       this.pbreaders.clear();
  84.       this.pbreaders = null;
  85.       this.linereaders.clear();
  86.       this.linereaders = null;
  87.       this.publicIds.clear();
  88.       this.publicIds = null;
  89.       this.systemIds.clear();
  90.       this.systemIds = null;
  91.       this.currentPublicID = null;
  92.       super.finalize();
  93.    }
  94.  
  95.    protected String getEncoding(String var1) {
  96.       if (!var1.startsWith("<?xml")) {
  97.          return null;
  98.       } else {
  99.          int var5;
  100.          for(int var2 = 5; var2 < var1.length(); var2 = var5 + 1) {
  101.             StringBuffer var3;
  102.             for(var3 = new StringBuffer(); var2 < var1.length() && var1.charAt(var2) <= ' '; ++var2) {
  103.             }
  104.  
  105.             while(var2 < var1.length() && var1.charAt(var2) >= 'a' && var1.charAt(var2) <= 'z') {
  106.                var3.append(var1.charAt(var2));
  107.                ++var2;
  108.             }
  109.  
  110.             while(var2 < var1.length() && var1.charAt(var2) <= ' ') {
  111.                ++var2;
  112.             }
  113.  
  114.             if (var2 >= var1.length() || var1.charAt(var2) != '=') {
  115.                break;
  116.             }
  117.  
  118.             while(var2 < var1.length() && var1.charAt(var2) != '\'' && var1.charAt(var2) != '"') {
  119.                ++var2;
  120.             }
  121.  
  122.             if (var2 >= var1.length()) {
  123.                break;
  124.             }
  125.  
  126.             char var4 = var1.charAt(var2);
  127.             ++var2;
  128.             var5 = var1.indexOf(var4, var2);
  129.             if (var5 < 0) {
  130.                break;
  131.             }
  132.  
  133.             if (var3.toString().equals("encoding")) {
  134.                return var1.substring(var2, var5);
  135.             }
  136.          }
  137.  
  138.          return null;
  139.       }
  140.    }
  141.  
  142.    protected Reader stream2reader(InputStream var1, StringBuffer var2) throws IOException {
  143.       PushbackInputStream var3 = new PushbackInputStream(var1);
  144.       int var4 = var3.read();
  145.       switch (var4) {
  146.          case 0:
  147.          case 254:
  148.          case 255:
  149.             var3.unread(var4);
  150.             return new InputStreamReader(var3, "UTF-16");
  151.          case 60:
  152.             var4 = var3.read();
  153.             var2.append('<');
  154.  
  155.             while(var4 > 0 && var4 != 62) {
  156.                var2.append((char)var4);
  157.                var4 = var3.read();
  158.             }
  159.  
  160.             if (var4 > 0) {
  161.                var2.append((char)var4);
  162.             }
  163.  
  164.             String var9 = this.getEncoding(var2.toString());
  165.             if (var9 == null) {
  166.                return new InputStreamReader(var3, "UTF-8");
  167.             } else {
  168.                var2.setLength(0);
  169.  
  170.                try {
  171.                   return new InputStreamReader(var3, var9);
  172.                } catch (UnsupportedEncodingException var7) {
  173.                   return new InputStreamReader(var3, "UTF-8");
  174.                }
  175.             }
  176.          case 239:
  177.             for(int var5 = 0; var5 < 2; ++var5) {
  178.                var3.read();
  179.             }
  180.  
  181.             return new InputStreamReader(var3, "UTF-8");
  182.          default:
  183.             var2.append((char)var4);
  184.             return new InputStreamReader(var3, "UTF-8");
  185.       }
  186.    }
  187.  
  188.    public StdXMLReader(InputStream var1) throws IOException {
  189.       new PushbackInputStream(var1);
  190.       StringBuffer var3 = new StringBuffer();
  191.       Reader var4 = this.stream2reader(var1, var3);
  192.       this.currentLineReader = new LineNumberReader(var4);
  193.       this.currentPbReader = new PushbackReader(this.currentLineReader, 2);
  194.       this.pbreaders = new Stack();
  195.       this.linereaders = new Stack();
  196.       this.publicIds = new Stack();
  197.       this.systemIds = new Stack();
  198.       this.currentPublicID = "";
  199.  
  200.       try {
  201.          this.currentSystemID = new URL("file:.");
  202.       } catch (MalformedURLException var6) {
  203.       }
  204.  
  205.       this.startNewStream(new StringReader(var3.toString()));
  206.    }
  207.  
  208.    public char read() throws IOException {
  209.       int var1;
  210.       for(var1 = this.currentPbReader.read(); var1 < 0; var1 = this.currentPbReader.read()) {
  211.          if (this.pbreaders.empty()) {
  212.             throw new IOException("Unexpected EOF");
  213.          }
  214.  
  215.          this.currentPbReader.close();
  216.          this.currentPbReader = (PushbackReader)this.pbreaders.pop();
  217.          this.currentLineReader = (LineNumberReader)this.linereaders.pop();
  218.          this.currentSystemID = (URL)this.systemIds.pop();
  219.          this.currentPublicID = (String)this.publicIds.pop();
  220.       }
  221.  
  222.       if (var1 == 13) {
  223.          var1 = this.currentPbReader.read();
  224.          if (var1 != 10 && var1 > 0) {
  225.             this.currentPbReader.unread(var1);
  226.          }
  227.  
  228.          return '\n';
  229.       } else {
  230.          return (char)var1;
  231.       }
  232.    }
  233.  
  234.    public boolean atEOFOfCurrentStream() throws IOException {
  235.       int var1 = this.currentPbReader.read();
  236.       if (var1 < 0) {
  237.          return true;
  238.       } else {
  239.          this.currentPbReader.unread(var1);
  240.          return false;
  241.       }
  242.    }
  243.  
  244.    public boolean atEOF() throws IOException {
  245.       int var1;
  246.       for(var1 = this.currentPbReader.read(); var1 < 0; var1 = this.currentPbReader.read()) {
  247.          if (this.pbreaders.empty()) {
  248.             return true;
  249.          }
  250.  
  251.          this.currentPbReader.close();
  252.          this.currentPbReader = (PushbackReader)this.pbreaders.pop();
  253.          this.currentLineReader = (LineNumberReader)this.linereaders.pop();
  254.          this.currentSystemID = (URL)this.systemIds.pop();
  255.          this.currentPublicID = (String)this.publicIds.pop();
  256.       }
  257.  
  258.       this.currentPbReader.unread(var1);
  259.       return false;
  260.    }
  261.  
  262.    public void unread(char var1) throws IOException {
  263.       this.currentPbReader.unread(var1);
  264.    }
  265.  
  266.    public Reader openStream(String var1, String var2) throws MalformedURLException, FileNotFoundException, IOException {
  267.       URL var3 = new URL(this.currentSystemID, var2);
  268.       StringBuffer var4 = new StringBuffer();
  269.       Reader var5 = this.stream2reader(var3.openStream(), var4);
  270.       if (var4.length() == 0) {
  271.          return var5;
  272.       } else {
  273.          String var6 = var4.toString();
  274.          PushbackReader var7 = new PushbackReader(var5, var6.length());
  275.  
  276.          for(int var8 = var6.length() - 1; var8 >= 0; --var8) {
  277.             var7.unread(var6.charAt(var8));
  278.          }
  279.  
  280.          return var7;
  281.       }
  282.    }
  283.  
  284.    public void startNewStream(Reader var1) {
  285.       this.pbreaders.push(this.currentPbReader);
  286.       this.linereaders.push(this.currentLineReader);
  287.       this.systemIds.push(this.currentSystemID);
  288.       this.publicIds.push(this.currentPublicID);
  289.       this.currentLineReader = new LineNumberReader(var1);
  290.       this.currentPbReader = new PushbackReader(this.currentLineReader, 2);
  291.    }
  292.  
  293.    public int getLineNr() {
  294.       return this.currentLineReader.getLineNumber() + 1;
  295.    }
  296.  
  297.    public void setSystemID(String var1) throws MalformedURLException {
  298.       this.currentSystemID = new URL(this.currentSystemID, var1);
  299.    }
  300.  
  301.    public void setPublicID(String var1) {
  302.       this.currentPublicID = var1;
  303.    }
  304.  
  305.    public String getSystemID() {
  306.       return this.currentSystemID.toString();
  307.    }
  308.  
  309.    public String getPublicID() {
  310.       return this.currentPublicID;
  311.    }
  312. }
  313.