/*---------------- FILE HEADER ------------------------------------------ This file is part of deegree. Copyright (C) 2001-2006 by: EXSE, Department of Geography, University of Bonn http://www.giub.uni-bonn.de/deegree/ lat/lon GmbH http://www.lat-lon.de 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; either version 2.1 of the License, or (at your option) any later version. 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. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Andreas Poth lat/lon GmbH Aennchenstr. 19 53115 Bonn Germany E-Mail: poth@lat-lon.de Prof. Dr. Klaus Greve Department of Geography University of Bonn Meckenheimer Allee 166 53115 Bonn Germany E-Mail: greve@giub.uni-bonn.de ---------------------------------------------------------------------------*/ package org.deegree.io; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.deegree.framework.util.DataBaseIDGenerator; /** * Primary key generator for generic JDBC-connections. * <p> * NOTE: At the moment, every application has to take care of locking the table * to prevent problems in multithreaded or multihosted applications. * <p> * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider</a> * @version $Revision: 1.5 $ $Date: 2006/07/12 14:46:18 $ */ class GenericSQLIDGenerator implements DataBaseIDGenerator { Connection con; int fieldType; boolean isNumeric; String tableName; String fieldName; /** * Constructs a new GenericSQLIDGenerator. * <p> * @param con * @param fieldType */ GenericSQLIDGenerator (Connection con, String tableName, String fieldName, int fieldType, boolean isNumeric) { this.con = con; this.fieldName = fieldName; this.tableName = tableName; this.fieldType = fieldType; this.isNumeric = isNumeric; } /** * Returns the successor to the given id (string). Valid characters in the * id-string are: 0-9, a-z, A-Z. Every other character may result * in an exception. * <p> * @param lastId * @return */ private String incrementId (String lastId) { char [] chars = lastId.toCharArray(); for (int i = chars.length - 1; i >= 0; i--) { char c = chars [i]; if (c >= '0' && c <= '9') { if (c == '9') { c = 'a'; } else { c++; } } else if (c >= 'a' && c <= 'z') { if (c == 'z') { c = 'A'; } else { c++; } } else if (c >= 'A' && c <= 'Z') { if (c == 'Z') { c = '0'; } else { c++; } } chars [i] = c; if (c != '0') { break; } } String newId = new String (chars); if (chars [0] == '0') { newId = '1' + newId; } return newId; } /** * Generates a new id, suitable as a primary key for the next dataset. * <p> * @return Id, the object type depends on the database field used as * primary key */ public Object generateUniqueId () throws SQLException { Object id = null; // retrieve last id Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery ("SELECT MAX(" + fieldName + ") FROM " + tableName); if (rs.next ()) { if (isNumeric) { id = new Integer (rs.getInt (1) + 1); } else { String oldId = rs.getString (1); if (oldId != null) { id = incrementId (oldId); } else { id = "0"; } } } else { if (isNumeric) { id = new Integer (0); } else { id = "0"; } } rs.close (); stmt.close (); return id; } } /* ******************************************************************** Changes to this class. What the people have been up to: $Log: GenericSQLIDGenerator.java,v $ Revision 1.5 2006/07/12 14:46:18 poth comment footer added ********************************************************************** */