import java.io.PipedInputStream;
import java.io.InputStream;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;

public class XMLStreamTestReader implements Runnable {

  InputStream inputStream;

  public XMLStreamTestReader(PipedInputStream in) {
    this.inputStream = in;
  }

  public void run() {
    try {
      XMLInputFactory inputFactory = XMLInputFactory.newInstance();
      XMLStreamReader parser = inputFactory.createXMLStreamReader(inputStream);
      boolean goOn = true;
      while (goOn) {
        int event = 0;
        try {
          event = parser.next();
          switch(event) {
            case XMLStreamConstants.START_ELEMENT:
              System.out.println("Read start element " + parser.getLocalName());
              break;
            case XMLStreamConstants.CHARACTERS:
              System.out.println("Read " + parser.getText());
              break;
            case XMLStreamConstants.END_ELEMENT:
              System.out.println("Read end element " + parser.getLocalName());
              break;
              case XMLStreamConstants.END_DOCUMENT: // never happens!
              System.out.println("Read end document");
              goOn = false;
            default: System.out.println("Read something else. event: " + event);
          }}
          catch(Exception e) { parser.close(); goOn = false; }
      }
      parser.close();
      System.out.println("Reader finished");
    }
    catch (Exception e) { e.printStackTrace(); }
  }
}
