package jeql.command.io.kml; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import jeql.api.error.JeqlException; import jeql.api.row.BasicRow; import jeql.api.row.Row; import jeql.api.row.RowIterator; import jeql.api.row.RowList; import jeql.api.row.RowSchema; import jeql.api.table.Table; import jeql.command.io.TableFileReaderCmd; import jeql.command.io.TextFileReaderCmd; import jeql.engine.Scope; import jeql.io.InputSource; import com.vividsolutions.jts.geom.Geometry; public class KMLReaderCommand extends TextFileReaderCmd { public KMLReaderCommand() { } protected Table read(Scope scope, InputSource src) throws IOException { RowList rs = new KMLRowList(new KMLFileSource(src.getSourceName())); tbl = new Table(rs); return tbl; } } class KMLRowList implements RowList { private KMLFileSource src; private RowSchema schema; public KMLRowList(KMLFileSource src) { this.src = src; schema = new RowSchema(7); schema.setColumnDef(0, KMLCol.GEOMETRY, Geometry.class); schema.setColumnDef(1, KMLCol.KML_NAME, String.class); schema.setColumnDef(2, KMLCol.KML_DESCRIPTION, String.class); schema.setColumnDef(3, KMLCol.KML_STYLEURL, String.class); schema.setColumnDef(4, KMLCol.KML_FOLDER_NAME, String.class); schema.setColumnDef(5, KMLCol.KML_DATA, String.class); schema.setColumnDef(6, KMLCol.KML_SCHEMA_DATA, String.class); } public RowSchema getSchema() { return schema; } public RowIterator iterator() { return new KMLRowIterator(schema, src); } private static class KMLRowIterator implements RowIterator { private KMLFileSource src; private RowSchema schema; private KMLObjectReader kmlObjReader = null; private boolean isClosed = false; public KMLRowIterator(RowSchema schema, KMLFileSource src) { this.schema = schema; this.src = src; init(); } public RowSchema getSchema() { return schema; } private void init() { if (isClosed) return; if (kmlObjReader != null) return; try { kmlObjReader = new KMLObjectReader(); Reader rdr = src.createReader(); kmlObjReader.open(rdr); } catch (Exception ex) { throw new JeqlException(ex); } } public Row next() { init(); Placemark pm = null; try { pm = kmlObjReader.next(); } catch (Exception ex) { throw new JeqlException(ex); } finally { // if at end, can close input if (pm == null) { close(); return null; } } return createRow(pm); } private void close() { if (kmlObjReader != null) { kmlObjReader.close(); } kmlObjReader = null; isClosed = true; } private Row createRow(Placemark pm) { BasicRow row = new BasicRow(schema.size()); row.setValue(0, pm.geom); row.setValue(1, pm.name); row.setValue(2, pm.description); row.setValue(3, pm.styleUrl); row.setValue(4, pm.folder); row.setValue(5, pm.data); row.setValue(6, pm.schemaData); return row; } } }