/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package de.cismet.cismap.commons.features; import com.vividsolutions.jts.geom.Geometry; import org.apache.log4j.Logger; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import de.cismet.cismap.commons.util.SimpleCache; /** * DOCUMENT ME! * * @author therter * @version $Revision$, $Date$ */ public class JDBCFeatureInfo { //~ Static fields/initializers --------------------------------------------- // caches the last feature properties private static final Logger LOG = Logger.getLogger(JDBCFeatureInfo.class); //~ Instance fields -------------------------------------------------------- private final SimpleCache<LinkedHashMap<String, Object>> cache = new SimpleCache<LinkedHashMap<String, Object>>(2); private final SimpleCache<Geometry> geoCache = new SimpleCache<Geometry>(1); private final SimpleCache<Object> propertyCache = new SimpleCache<Object>(10); private int srid; private Connection connection; private PreparedStatement geometryStatement; private PreparedStatement propertiesStatement; private String tableName; private final String geoField; private final Map<String, PreparedStatement> propStats = new HashMap<String, PreparedStatement>(); private String idField = "id"; //~ Constructors ----------------------------------------------------------- /** * Creates a new ShapeInfo object. * * @param connection file DOCUMENT ME! * @param srid DOCUMENT ME! * @param geoField fc DOCUMENT ME! * @param tableName DOCUMENT ME! * @param idField DOCUMENT ME! */ public JDBCFeatureInfo(final Connection connection, final int srid, final String geoField, final String tableName, final String idField) { this.connection = connection; this.srid = srid; this.tableName = tableName; this.geoField = geoField; this.idField = idField; createStatements(); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! */ private void createStatements() { try { geometryStatement = connection.prepareStatement("select \"" + getGeoField() + "\" from \"" + tableName + "\" where \"" + idField + "\" = ?"); } catch (Exception e) { LOG.error("Error while creating prepared statement for geometries", e); } try { propertiesStatement = connection.prepareStatement("select * from \"" + tableName + "\" where \"" + idField + "\" = ?"); } catch (Exception e) { LOG.error("Error while creating prepared statement for properties", e); } } /** * DOCUMENT ME! * * @param property DOCUMENT ME! * * @return DOCUMENT ME! */ public PreparedStatement getPreparedStatementForProperty(final String property) { PreparedStatement ps = propStats.get(property); if (ps == null) { try { final String query = "select \"" + property + "\" from \"" + tableName + "\" WHERE \"" + idField + "\" = ?"; ps = connection.prepareStatement(query); propStats.put(property, ps); } catch (Exception e) { LOG.error("Error while creating prepared statement for property " + property, e); } } return ps; } /** * DOCUMENT ME! * * @return the srid */ public int getSrid() { return srid; } /** * DOCUMENT ME! * * @param srid the srid to set */ public void setSrid(final int srid) { this.srid = srid; } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * * @return DOCUMENT ME! */ public synchronized LinkedHashMap<String, Object> getPropertiesFromCache(final int id) { return cache.get(id); } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * @param container DOCUMENT ME! */ public synchronized void addPropertiesToCache(final int id, final LinkedHashMap<String, Object> container) { cache.add(id, container); } /** * DOCUMENT ME! */ public synchronized void clearCache() { cache.clear(); geoCache.clear(); propertyCache.clear(); } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * * @return DOCUMENT ME! */ public synchronized Object getPropertyFromCache(final String id) { return propertyCache.get(id); } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * @param container DOCUMENT ME! */ public synchronized void addPropertyToCache(final String id, final Object container) { propertyCache.add(id, container); } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * * @return DOCUMENT ME! */ public synchronized Geometry getGeometryFromCache(final int id) { return geoCache.get(id); } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * @param geo container DOCUMENT ME! */ public synchronized void addGeometryToCache(final int id, final Geometry geo) { geoCache.add(id, geo); } /** * DOCUMENT ME! * * @return the statement */ public Connection getConnection() { return connection; } /** * DOCUMENT ME! * * @param connection statement the statement to set */ public void setConnection(final Connection connection) { this.connection = connection; } /** * DOCUMENT ME! * * @return the geometryStatement */ public PreparedStatement getGeometryStatement() { return geometryStatement; } /** * DOCUMENT ME! * * @return the propertiesStatement */ public PreparedStatement getPropertiesStatement() { return propertiesStatement; } /** * DOCUMENT ME! * * @return the tableName */ public String getTableName() { return tableName; } /** * DOCUMENT ME! * * @param tableName DOCUMENT ME! */ public void setTableName(final String tableName) { this.tableName = tableName; propStats.clear(); createStatements(); } /** * DOCUMENT ME! * * @return the geoField */ public String getGeoField() { return geoField; } /** * DOCUMENT ME! * * @return the idField */ public String getIdField() { return idField; } /** * DOCUMENT ME! * * @param idField the idField to set */ public void setIdField(final String idField) { this.idField = idField; } }