While the commit author was desruisseaux
, the commit message said that this is work of Rueben Schulz.
We can not port that code directly to SIS; we will need to rewrite it.
However the main part is the mapping from MS-Access names to SQL names.
This mapping will be exactly the same (even in a different form) after rewriting, because it depends on the database schema defined by EPSG.
Command line:
svn cat https://svn.osgeo.org/geotools/trunk/geotools2/geotools-src/cts-coordtrans/src/org/geotools/cs/CoordinateSystemModifiedEPSGFactory.java@4948
Revision 4948 |
---|
/* * Geotools 2 - OpenSource mapping toolkit * (C) 2004, Geotools Project Managment Committee (PMC) * * 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 * * * Contacts: * UNITED KINGDOM: James Macgill * mailto:j.macgill@geog.leeds.ac.uk * * FRANCE: Surveillance de l'Environnement Assistée par Satellite * Institut de Recherche pour le Développement / US-Espace * mailto:seasnet@teledetection.fr */ package org.geotools.cs; // J2SE dependencies import java.util.Map; import java.util.LinkedHashMap; import java.util.Iterator; import java.sql.SQLException; /** * An EPSG factory which replaces some table or column names by other names. * This factory is used for EPSG database backed by an other software than * MS-Access. * * This class overrides {@link #adaptSQL} to change the SQL statements so they * are suitable for non-ms access versions of EPSG databases (version 6.4). * By default, the new SQL statements use the new table and field names in * the Data Description Language (DDL) scripts provided in version 6.4 to * create the schema for the database. Subclasses can changes this default * behavior by modifying the {@link #map}. * <br><br> * In order to register this ANSI version as the {@linkplain #getDefault default} * EPSG factory, invokes the following <u>only once</u> from the command line. * The change will by system-wide: * * <blockquote><pre> * java org.geotools.cs.CoordinateSystemEPSGFactory -implementation=org.geotools.cs.CoordinateSystemModifiedEPSGFactory * </pre></blockquote> * * <br><br> * <strong>References:</strong><ul> * <li>EPSG geodecy parameters database version 6.4 readme at * <A HREF="http://www.ihsenergy.com/epsg/geodetic2.html">www.epsg.org</A> * </li> * </ul> * * @version $Id: CoordinateSystemModifiedEPSGFactory.java,v 1.1 2004/01/25 21:55:50 desruisseaux Exp $ * @author Rueben Schulz * @author Martin Desruisseaux */ public class CoordinateSystemModifiedEPSGFactory extends CoordinateSystemEPSGFactory { /** * The default map using ANSI names. */ private static final String[] ANSI = { "[Area]", "epsg_area", "[Coordinate Axis]", "epsg_coordinateaxis", "[Coordinate Axis Name]", "epsg_coordinateaxisname", "[Coordinate_Operation]", "epsg_coordoperation", "[Coordinate_Operation Method]", "epsg_coordoperationmethod", "[Coordinate_Operation Parameter]", "epsg_coordoperationparam", "[Coordinate_Operation Parameter Usage]", "epsg_coordoperationparamusage", "[Coordinate_Operation Parameter Value]", "epsg_coordoperationparamvalue", "[Coordinate Reference System]", "epsg_coordinatereferencesystem", "[Coordinate System]", "epsg_coordinatesystem", "[Datum]", "epsg_datum", "[Ellipsoid]", "epsg_ellipsoid", "[Prime Meridian]", "epsg_primemeridian", "[Unit of Measure]", "epsg_unitofmeasure", "[ORDER]", "coord_axis_order" //a field in epsg_coordinateaxis }; /** * Map the MS-Access names to ANSI names. Key are MS-Access names including bracket. * Values are ANSI names. Keys and values are case-sensitive. The default content of * this map is: * * <pre><table> * <tr><th align="center">MS-Access name</th> <th align="center">ANSI name</th></tr> * <tr><td>[Area]</td> <td>epsg_area</td></tr> * <tr><td>[Coordinate Axis]</td> <td>epsg_coordinateaxis</td></tr> * <tr><td>[Coordinate Axis Name]</td> <td>epsg_coordinateaxisname</td></tr> * <tr><td>[Coordinate_Operation]</td> <td>epsg_coordoperation</td></tr> * <tr><td>[Coordinate_Operation Method]</td> <td>epsg_coordoperationmethod</td></tr> * <tr><td>[Coordinate_Operation Parameter]</td> <td>epsg_coordoperationparam</td></tr> * <tr><td>[Coordinate_Operation Parameter Usage]</td> <td>epsg_coordoperationparamusage</td></tr> * <tr><td>[Coordinate_Operation Parameter Value]</td> <td>epsg_coordoperationparamvalue</td></tr> * <tr><td>[Coordinate Reference System]</td> <td>epsg_coordinatereferencesystem</td></tr> * <tr><td>[Coordinate System]</td> <td>epsg_coordinatesystem</td></tr> * <tr><td>[Datum]</td> <td>epsg_datum</td></tr> * <tr><td>[Ellipsoid]</td> <td>epsg_ellipsoid</td></tr> * <tr><td>[Prime Meridian]</td> <td>epsg_primemeridian</td></tr> * <tr><td>[Unit of Measure]</td> <td>epsg_unitofmeasure</td></tr> * <tr><td>[ORDER]</td> <td>coord_axis_order</td></tr> * </table></pre> */ protected final Map map = new LinkedHashMap(); /** * Construct an authority factory using * the specified URL to an EPSG database. * * @param factory The underlying factory used for objects creation. * @param url The url to the EPSG database. For example, a connection * to postgresql may have an URL like * <code>"jdbc:postgresql://localhost:5432/epsg;user=;pass="</code>. * @param driver An optional driver to load, or <code>null</code> if none. * This is a convenience argument for the following pseudo-code: * <blockquote><code> * Class.forName(driver).newInstance(); * </code></blockquote> * A message is logged to <code>"org.geotools.cts"</code> stating if * the loading succeeded of failed. For postgresql, a typical value * for this argument is <code>"org.postgresql.Driver"</code>. * This argument needs to be non-null only once for a specific driver. * * @throws SQLException if the constructor failed to connect to the EPSG database. */ public CoordinateSystemModifiedEPSGFactory(final CoordinateSystemFactory factory, final String url, final String driver) throws SQLException { super(factory, url, driver); for (int i=0; i<ANSI.length; i++) { map.put(ANSI[i], ANSI[++i]); } } /** * Modifies the given SQL string to be suitable for non-ms access databases. * This replaces table and field names in the SQL with the new names * in the SQL DDL scripts provided with version 6.4 of the EPSG database. * * @param statement The statement in MS-Access syntax. * @return The SQL statement to use, suitable for a non-ms access database. */ protected String adaptSQL(final String statement) { final StringBuffer modified = new StringBuffer(statement); for (final Iterator it=map.entrySet().iterator(); it.hasNext();) { final Map.Entry entry = (Map.Entry) it.next(); final String oldName = (String) entry.getKey(); final String newName = (String) entry.getValue(); /* * Replace all occurences of 'oldName' by 'newName'. */ int start = 0; while ((start=modified.indexOf(oldName, start)) >= 0) { final int oldLength = oldName.length(); final int newLength = newName.length(); modified.replace(start, start+oldLength, newName); start += newLength-oldLength; } } return modified.toString(); } } |