/*
* 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.rmi.server.UID;
import java.sql.Connection;
import java.sql.Statement;
import org.geotools.data.DataSourceException;
import org.geotools.data.jdbc.fidmapper.MultiColumnFIDMapper;
import org.geotools.feature.IllegalAttributeException;
import org.opengis.feature.simple.SimpleFeature;
/**
* Covers both the basic and multicolumn fid mappers
*
* @author aaime
* @since 2.4
*/
class VersionedMulticolumnFIDMapper extends MultiColumnFIDMapper implements VersionedFIDMapper {
public VersionedMulticolumnFIDMapper(String tableSchemaName, String tableName,
String[] colNames, int[] colTypes, int[] colSizes, int[] colDecimalDigits,
boolean[] autoIncrement) {
super(tableSchemaName, tableName, colNames, colTypes, colSizes, colDecimalDigits,
autoIncrement);
returnFIDColumnsAsAttributes = true;
}
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.indexOf('&') + 1);
}
public String createVersionedFid(String externalFID, long revision) {
return revision + "&" + externalFID.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
+ "', it's " + FID + " instead");
// leverage superclass parsing, then throw away the last element
Object[] values = super.getPKAttributes("0&" + FID.substring(tableName.length() + 1));
Object[] unversioned = new Object[values.length - 1];
System.arraycopy(values, 1, unversioned, 0, unversioned.length);
return unversioned;
}
public String createID(Connection conn, SimpleFeature feature, Statement statement)
throws IOException {
if (colNames.length == 2 && feature.getAttribute(colNames[1]) == null) {
try {
feature.setAttribute(colNames[1], (new UID()).toString());
} catch (IllegalAttributeException e) {
throw new DataSourceException("Could not generate key for the "
+ "unset primary key column " + colNames[0], e);
}
}
return super.createID(conn, feature, statement);
}
public Object[] getPKAttributes(String FID) throws IOException {
return super.getPKAttributes(FID);
}
}