/** * Opens a stream from a public and system ID. * * @param publicID the public ID, which may be null * @param systemID the system ID, which is never null * @throws java.net.MalformedURLException if the system ID does not contain a valid URL * @throws java.io.FileNotFoundException if the system ID refers to a local file which does not * exist * @throws java.io.IOException if an error occurred opening the stream */ public Reader openStream(final String publicID, final String systemID) throws MalformedURLException, FileNotFoundException, IOException { URL url = new URL(currentReader.systemId, systemID); if (url.getRef() != null) { final String ref = url.getRef(); if (url.getFile().length() > 0) { url = new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getFile()); url = new URL("jar:" + url + '!' + ref); } else { url = StdXMLReader.class.getResource(ref); } } currentReader.publicId = publicID; currentReader.systemId = url; final StringBuilder charsRead = new StringBuilder(); final Reader reader = this.stream2reader(url.openStream(), charsRead); if (charsRead.length() == 0) { return reader; } final String charsReadStr = charsRead.toString(); final PushbackReader pbreader = new PushbackReader(reader, charsReadStr.length()); for (int i = charsReadStr.length() - 1; i >= 0; i--) { pbreader.unread(charsReadStr.charAt(i)); } return pbreader; }
/** Cleans up the object when it's destroyed. */ @Override protected void finalize() throws Throwable { currentReader.lineReader = null; currentReader.pbReader = null; currentReader.systemId = null; currentReader.publicId = null; currentReader = null; readers.clear(); super.finalize(); }
/** * Initializes the XML reader. * * @param reader the input for the XML data. */ public StdXMLReader(final Reader reader) { currentReader = new StackedReader(); readers = new Stack<StackedReader>(); currentReader.lineReader = new LineNumberReader(reader); currentReader.pbReader = currentReader.lineReader; currentReader.publicId = ""; charReadTooMuch = '\0'; try { currentReader.systemId = new URL("file:."); } catch (final MalformedURLException e) { } }
/** * Starts a new stream from a Java reader. The new stream is used temporary to read data from. If * that stream is exhausted, control returns to the parent stream. * * @param reader the non-null reader to read the new data from * @param isInternalEntity true if the reader is produced by resolving an internal entity */ public void startNewStream(final Reader reader, final boolean isInternalEntity) { final StackedReader oldReader = currentReader; readers.push(currentReader); currentReader = new StackedReader(); if (isInternalEntity) { currentReader.lineReader = null; currentReader.pbReader = reader; } else { currentReader.lineReader = new LineNumberReader(reader); currentReader.pbReader = new PushbackReader(currentReader.lineReader, 2); } currentReader.systemId = oldReader.systemId; currentReader.publicId = oldReader.publicId; }
/** * Initializes the XML reader. * * @param stream the input for the XML data. * @throws java.io.IOException if an I/O error occurred */ public StdXMLReader(final InputStream stream) throws IOException { new PushbackInputStream(stream); final StringBuilder charsRead = new StringBuilder(); final Reader reader = this.stream2reader(stream, charsRead); currentReader = new StackedReader(); readers = new Stack<StackedReader>(); currentReader.lineReader = new LineNumberReader(reader); currentReader.pbReader = currentReader.lineReader; currentReader.publicId = ""; charReadTooMuch = '\0'; try { currentReader.systemId = new URL("file:."); } catch (final MalformedURLException e) { } this.startNewStream(new StringReader(charsRead.toString())); }
/** * Sets the public ID of the current stream. * * @param publicID the public ID */ public void setPublicID(final String publicID) { currentReader.publicId = publicID; }