001: /*
002: * This file is part of the GeOxygene project source files.
003: *
004: * GeOxygene aims at providing an open framework which implements OGC/ISO specifications for
005: * the development and deployment of geographic (GIS) applications. It is a open source
006: * contribution of the COGIT laboratory at the Institut Géographique National (the French
007: * National Mapping Agency).
008: *
009: * See: http://oxygene-project.sourceforge.net
010: *
011: * Copyright (C) 2005 Institut Géographique National
012: *
013: * This library is free software; you can redistribute it and/or modify it under the terms
014: * of the GNU Lesser General Public License as published by the Free Software Foundation;
015: * either version 2.1 of the License, or any later version.
016: *
017: * This library is distributed in the hope that it will be useful, but WITHOUT ANY
018: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
019: * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
020: *
021: * You should have received a copy of the GNU Lesser General Public License along with
022: * this library (see file LICENSE if present); if not, write to the Free Software
023: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024: *
025: */
026:
027: package fr.ign.cogit.geoxygene.datatools.ojb;
028:
029: import java.lang.reflect.Method;
030: import org.apache.ojb.broker.accesslayer.conversions.FieldConversion;
031:
032: /**
033: * Conversion des geometries d'un SGBD (Oracle ou Postgis)
034: * dans le format GeOxygene, et reciproquement.
035: * Pour fonctionner, utiliser absolument la classe "GeOxygeneStatementManager" ( à configurer dans OJB.properties).
036: * Permet d'utiliser le même convertisseur pour Oracle et Postgis, et ainsi les mêmes fichiers de mapping.
037: *
038: * @author Thierry Badard & Arnaud Braun
039: * @version 1.1
040: *
041: */
042:
043: public class GeomGeOxygene2Dbms implements FieldConversion {
044:
045: private static final String POSTGRES_GEOM_CLASS_NAME = "org.postgis.PGgeometry";
046: private static final String ORACLE_GEOM_CLASS_NAME = "oracle.sql.STRUCT";
047:
048: private final String GeomGeOxygene2Oracle_CLASS_NAME = "fr.ign.cogit.geoxygene.datatools.oracle.GeomGeOxygene2Oracle";
049: private final String GeomGeOxygene2Postgis_CLASS_NAME = "fr.ign.cogit.geoxygene.datatools.postgis.GeomGeOxygene2Postgis";
050:
051: private Method geomOracle2GeOxygeneMethod;
052: private Method geomPostgis2GeOxygeneMethod;
053:
054: // Le constructeur initialise les méthodes à appeler
055: public GeomGeOxygene2Dbms() {
056:
057: // ORACLE
058: try {
059: Class geomGeOxygene2OracleClass = Class
060: .forName(GeomGeOxygene2Oracle_CLASS_NAME);
061: try {
062: geomOracle2GeOxygeneMethod = geomGeOxygene2OracleClass
063: .getMethod("sqlToJava",
064: new Class[] { Object.class });
065: } catch (NoSuchMethodException nosuch1) {
066: nosuch1.printStackTrace();
067: System.exit(0);
068: }
069: } catch (ClassNotFoundException notfound1) {
070: // On ne dit rien : Oracle n'a pas été compilé !
071: }
072:
073: // POSTGIS
074: try {
075: Class geomGeOxygene2PostgisClass = Class
076: .forName(GeomGeOxygene2Postgis_CLASS_NAME);
077: try {
078: geomPostgis2GeOxygeneMethod = geomGeOxygene2PostgisClass
079: .getMethod("sqlToJava",
080: new Class[] { Object.class });
081: } catch (NoSuchMethodException nosuch2) {
082: nosuch2.printStackTrace();
083: System.exit(0);
084: }
085: } catch (ClassNotFoundException notfound2) {
086: System.out
087: .println("## Le SGBD n'est ni Oracle, ni PostgreSQL ##");
088: System.exit(0);
089: }
090:
091: }
092:
093: public Object sqlToJava(Object geom) {
094:
095: // ORACLE
096: if (geom.getClass().getName().compareTo(ORACLE_GEOM_CLASS_NAME) == 0) {
097: try {
098: return geomOracle2GeOxygeneMethod.invoke(null,
099: new Object[] { geom });
100: } catch (Exception e) {
101: e.printStackTrace();
102: System.out.println("Géométrie renvoyée nulle");
103: return null;
104: }
105: }
106:
107: // POSTGIS
108: else if (geom.getClass().getName().compareTo(
109: POSTGRES_GEOM_CLASS_NAME) == 0) {
110: try {
111: return geomPostgis2GeOxygeneMethod.invoke(null,
112: new Object[] { geom });
113: } catch (Exception e) {
114: e.printStackTrace();
115: System.out.println("Géométrie renvoyée nulle");
116: return null;
117: }
118: }
119: // SINON
120: else {
121: System.out
122: .println("## Le SGBD n'est ni Oracle, ni PostgreSQL - valeur nulle retournée ##");
123: return null;
124: }
125:
126: }
127:
128: // Les méthodes relatives à Oracle ou Postgis sont appelée directement dans "GeOxygeneStatementManager"
129: public Object javaToSql(Object geom) {
130: System.out
131: .println("## WARNING ## Ne devrait pas être appelé !! Renvoie nulle");
132: return null;
133: }
134:
135: }
|