/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.data.postgis.fidmapper; import java.io.IOException; import java.sql.Connection; import java.sql.Statement; import java.sql.Types; import org.geotools.data.DataSourceException; import org.geotools.data.jdbc.fidmapper.MultiColumnFIDMapper; import org.opengis.feature.simple.SimpleFeature; /** * Covers both the basic and multicolumn fid mappers * * @author aaime * @since 2.4 * */ class VersionedAutoincrementFIDMapper extends MultiColumnFIDMapper implements VersionedFIDMapper { protected PostGISAutoIncrementFIDMapper autoIncrementMapper; public VersionedAutoincrementFIDMapper(String tableSchemaName, String tableName, String colName, int colType, int colSize) { super(tableSchemaName, tableName, new String[] { "revision", colName }, new int[] { colType, Types.NUMERIC }, new int[] { colSize, 8 }, new int[] { 0, 0 }, new boolean[] { false, true }); returnFIDColumnsAsAttributes = true; autoIncrementMapper = new PostGISAutoIncrementFIDMapper(tableSchemaName, tableName, colName, colType); } public String getUnversionedFid(String versionedFID) { // we assume revision is the last column, since it has been added with // an alter table "add". Also, we make the fid "typed" to ensure WFS keeps on working return tableName + "." + versionedFID.substring(versionedFID.lastIndexOf('&') + 1); } public String createVersionedFid(String extenalFID, long revision) { return revision + "&" + extenalFID.substring(tableName.length() + 1); } public Object[] getUnversionedPKAttributes(String FID) throws IOException { // check we can parse this if (!FID.startsWith(tableName + ".")) throw new DataSourceException("The FID is invalid, should start with '" + tableName + ".'"); // leverate superclass parsing, then throw away the last element Object[] values = getPKAttributes(FID.substring(tableName.length() + 1) + "&0"); Object[] unversioned = new Object[values.length - 1]; System.arraycopy(values, 0, unversioned, 0, unversioned.length); return unversioned; } public String createID(Connection conn, SimpleFeature feature, Statement statement) throws IOException { if (feature.getAttribute(colNames[1]) == null) { try { String id = autoIncrementMapper.createID(conn, feature, statement); feature.setAttribute(colNames[1], new Long(id)); } catch (Exception e) { throw new DataSourceException("Could not generate key for the " + "unset primary key column " + colNames[1], e); } } return super.createID(conn, feature, statement); } }