package net.sourceforge.phpeclipse.phpunit; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class XMLReportHandler extends DefaultHandler { private String currentVerdict; private PHPUnitView view; private String currentCommand; private String currentTestCount; private String currentTestID; private void doAsyncRunnable(Runnable runnable) { view.getSite().getShell().getDisplay().asyncExec(runnable); } public void handle(String report, PHPUnitView view) { //TODO : how to parse directly a string? // now doing it with a stream. this.view = view; SAXParser parser; System.out.println("handling: " + report); try { File file = new File("tmp3.xml"); FileOutputStream out = null; FileInputStream in = null; out = new FileOutputStream(file); //OutputStreamWriter outS = new OutputStreamWriter(out, UTF8); report += "\n \r"; out.write(report.getBytes("UTF8")); out.close(); in = new FileInputStream(file); parser = SAXParserFactory.newInstance().newSAXParser(); parser.parse(in, this); in.close(); file.delete(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FactoryConfigurationError e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String) */ public void endElement(String arg0, String arg1, String elementName) throws SAXException { // send this current command to view } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public void startElement( String arg0, String arg1, String elementName, Attributes attributes) throws SAXException { System.out.println(arg0 + " - " + arg1 + " - " + elementName); if(elementName.equals("report")) { currentCommand = attributes.getValue("command"); currentTestCount = attributes.getValue("testCount"); currentTestID = attributes.getValue("testID"); doAsyncRunnable(new Runnable() { public void run() { view.handleCommand(currentCommand, currentTestCount, currentTestID); } }); } else if (elementName.equals("verdict")) { currentVerdict = attributes.getValue("desc"); //view.setTestVerdict(currentTestID, currentVerdict); doAsyncRunnable(new Runnable() { public void run() { view.setTestVerdict(currentTestID, currentVerdict); } }); } else if (elementName.equals("exceptions")) { //do nothing } else if (elementName.equals("exception")) { final String exception = attributes.getValue("desc"); doAsyncRunnable(new Runnable() { public void run() { view.addTestException(currentTestID, exception); } }); } } public static void main(String[] args) { XMLReportHandler handler = new XMLReportHandler(); String xml = ""; xml = " "; handler.handle(xml, null); xml = " "; handler.handle(xml, null); xml = " "; handler.handle(xml, null); xml = " "; handler.handle(xml, null); } }