package jeql.command.io.xml; import java.io.InputStreamReader; import java.io.LineNumberReader; import javax.xml.stream.XMLStreamException; import jeql.api.error.JeqlException; import jeql.api.row.BasicRow; import jeql.api.row.BasicRowList; import jeql.api.row.Row; import jeql.api.row.RowIterator; import jeql.api.row.RowSchema; import jeql.command.io.xml.XMLStackReader.Atom; import jeql.io.InputSource; public class XmlRowList extends BasicRowList { public static final String COL_PATH = "path"; public static final String COL_ATTR = "attr"; public static final String COL_VAL = "value"; private InputSource src; private boolean includeAllEndElements; public XmlRowList(InputSource src, boolean includeAllEndElements) { this.src = src; this.includeAllEndElements = includeAllEndElements; schema = new RowSchema( new String[] { COL_PATH, COL_ATTR, COL_VAL }, new Class[] { String.class, String.class, String.class } ); } public RowIterator iterator() { try { return new XmlRowIterator(schema, src); } catch (Exception ex) { throw new JeqlException(ex); } } private class XmlRowIterator implements RowIterator { private XMLStackReader xmlRdr; public XmlRowIterator(RowSchema schema, InputSource src) throws Exception { LineNumberReader rdr = new LineNumberReader(new InputStreamReader(src.createStream())); xmlRdr = new XMLStackReader(rdr, includeAllEndElements); } public RowSchema getSchema() { return schema; } public Row next() { Atom atom = null; try { atom = xmlRdr.next(); } catch (XMLStreamException e) { // TODO Auto-generated catch block e.printStackTrace(); } // if at end, can close input if (atom == null) { close(); return null; } return createRow(atom); } private void close() { if (xmlRdr != null) { xmlRdr.close(); } xmlRdr = null; } private Row createRow(Atom atom) { BasicRow row = new BasicRow(schema.size()); row.setValue(0, atom.path); row.setValue(1, atom.attr); row.setValue(2, atom.value); return row; } } }