package org.argeo.jts.jcr; import java.io.ByteArrayInputStream; import java.io.InputStream; import javax.jcr.Binary; import javax.jcr.Property; import javax.jcr.Session; import org.apache.commons.io.IOUtils; import org.argeo.ArgeoException; import org.argeo.jcr.JcrUtils; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.io.InputStreamInStream; import com.vividsolutions.jts.io.WKBReader; import com.vividsolutions.jts.io.WKBWriter; /** Utilities depending only from the JTS library. */ public class JtsJcrUtils { private static GeometryFactory geometryFactory = new GeometryFactory(); private static ThreadLocal wkbWriters = new ThreadLocal() { protected WKBWriter initialValue() { return new WKBWriter(); } }; private static ThreadLocal wkbReaders = new ThreadLocal() { protected WKBReader initialValue() { return new WKBReader(getGeometryFactory()); } }; public static GeometryFactory getGeometryFactory() { return geometryFactory; } public final static Geometry readWkb(Property property) { Binary wkbBinary = null; InputStream in = null; try { wkbBinary = property.getBinary(); in = wkbBinary.getStream(); WKBReader wkbReader = wkbReaders.get(); return wkbReader.read(new InputStreamInStream(in)); } catch (Exception e) { throw new ArgeoException("Cannot read WKB from " + property, e); } finally { IOUtils.closeQuietly(in); JcrUtils.closeQuietly(wkbBinary); } } /** The returned binary should be disposed by the caller */ public final static Binary writeWkb(Session session, Geometry geometry) { Binary wkbBinary = null; InputStream in = null; try { WKBWriter wkbWriter = wkbWriters.get(); byte[] arr = wkbWriter.write(geometry); in = new ByteArrayInputStream(arr); wkbBinary = session.getValueFactory().createBinary(in); return wkbBinary; } catch (Exception e) { throw new ArgeoException("Cannot write WKB", e); } finally { IOUtils.closeQuietly(in); } } }