[ 
https://issues.apache.org/jira/browse/XMLBEANS-477?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andreas Beeker closed XMLBEANS-477.
-----------------------------------

> Piccolo parser improperly retains and re-closes InputStream from previous 
> invocation
> ------------------------------------------------------------------------------------
>
>                 Key: XMLBEANS-477
>                 URL: https://issues.apache.org/jira/browse/XMLBEANS-477
>             Project: XMLBeans
>          Issue Type: Bug
>    Affects Versions: Version 2.4 , Version 2.5
>            Reporter: Robby Morgan
>            Priority: Major
>             Fix For: Version 5.0.1
>
>
> I have uncovered odd behavior within the Piccolo parser when XMLBeans is 
> asked to parse a second document on the same thread.  What I have observed is 
> that, while the Piccolo parser closes the input stream after parsing the 
> first document, it retains a reference to the input stream and closes it 
> again immediately before parsing the input stream for the second document.  
> If the input stream reference is the same for the two documents, as is the 
> case when a request is processed on the same thread in Tomcat, then the 
> second document will fail to parse.
> Here is sample code that demonstrates the issue:
> {code}
> import my.xmlbeans.ServerDocument;
> import org.apache.commons.io.input.ProxyInputStream;
> import org.apache.xmlbeans.XmlException;
> import org.apache.xmlbeans.XmlOptions;
> import java.io.File;
> import java.io.FileInputStream;
> import java.io.IOException;
> import java.io.InputStream;
> /**
>  * Issue:  XmlBeans (when using the Piccolo SAX parser) retains a reference 
> to the previous input stream on the
>  *  current thread, and if that stream is reopened and passed back into 
> XmlBeans, then the stream will be closed
>  *  prior to parsing any of the contents, producing the following exception:
>  *
>  * Exception in thread "main" java.lang.IllegalStateException: Stream is 
> already closed
>  * at 
> XmlBeansReclosingIssue$ReopenableInputStream.beforeRead(XmlBeansReclosingIssue.java:50)
>  * at 
> org.apache.commons.io.input.ProxyInputStream.read(ProxyInputStream.java:98)
>  * at 
> org.apache.xmlbeans.impl.piccolo.xml.XMLStreamReader.fillByteBuffer(XMLStreamReader.java:209)
>  * at 
> org.apache.xmlbeans.impl.piccolo.xml.XMLStreamReader.reset(XMLStreamReader.java:97)
>  * at 
> org.apache.xmlbeans.impl.piccolo.xml.DocumentEntity.open(DocumentEntity.java:94)
>  * at 
> org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.reset(PiccoloLexer.java:982)
>  * at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:709)
>  * at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3454)
>  * at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1276)
>  * at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1250)
>  * at 
> org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
>  * at my.xmlbeans.ServerDocument$Factory.parse(Unknown Source)
>  * at XmlBeansReclosingIssue.main(XmlBeansReclosingIssue.java:40)
>  */
> public class XmlBeansReclosingIssue {
>     public static void main(String[] args) throws IOException, XmlException {
>         File inputFile = new File(args[0]);
>         ReopenableInputStream reopenableInputStream = new 
> ReopenableInputStream(new FileInputStream(inputFile));
>         ServerDocument.Factory.parse(reopenableInputStream, new 
> XmlOptions().setUnsynchronized());
>         reopenableInputStream.reopen(new FileInputStream(inputFile));
>         ServerDocument.Factory.parse(reopenableInputStream, new 
> XmlOptions().setUnsynchronized());
>     }
>     private static class ReopenableInputStream extends ProxyInputStream {
>         private boolean _closed;
>         public ReopenableInputStream(FileInputStream inputStream) {
>             super(inputStream);
>             _closed = false;
>         }
>         public void reopen(InputStream in) {
>             if (!_closed) {
>                 throw new IllegalStateException("Stream is not closed");
>             }
>             _closed = false;
>             this.in = in;
>         }
>         @Override
>         protected void beforeRead(int n) throws IOException {
>             if (_closed) {
>                 throw new IllegalStateException("Stream is already closed");
>             }
>         }
>         @Override
>         public void close() throws IOException {
>             if (_closed) {
>                 throw new IllegalStateException("Stream is already closed");
>             }
>             _closed = true;
>             super.close();
>         }
>     }
> }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@poi.apache.org
For additional commands, e-mail: dev-h...@poi.apache.org

Reply via email to