package geodb.aggregate; import geodb.GeoDB; import java.io.ByteArrayInputStream; import java.io.IOException; import java.sql.SQLException; import java.sql.Types; import org.h2.api.AggregateFunction; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.io.InputStreamInStream; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKBReader; public abstract class GeoAggregateFunction implements AggregateFunction { private Geometry createGeometry(ByteArrayInputStream stream) { InputStreamInStream inputStreamInStream = new InputStreamInStream(stream); Geometry geometry = null; try { geometry = new WKBReader().read(inputStreamInStream); } catch (IOException e) { throw new IllegalArgumentException("given geometry can not be found", e); } catch (ParseException e) { throw new IllegalArgumentException("given geometry is not valid", e); } return geometry; } protected abstract void add(Geometry geometry); protected abstract Geometry getGeometryResult(); public final void add(Object arg0) throws SQLException { if (arg0 != null) { Geometry geometry = createGeometry((ByteArrayInputStream) arg0); if (geometry != null) { add(geometry); } } } public final Object getResult() throws SQLException { Geometry geometryResult = getGeometryResult(); if (geometryResult != null) { return GeoDB.gToWKB(geometryResult); } return null; } public final int getType(int[] arg0) throws SQLException { return Types.BLOB; } }