Revision 43606

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/JDBCSRSs.java
1

  
2
package org.gvsig.fmap.dal.store.jdbc2.spi;
3

  
4
public interface JDBCSRSs {
5

  
6
    void add(String databaseCode, String applicationAbbrev);
7

  
8
    String getApplicationAbbrev(String databaseCode);
9

  
10
    String getDatabaseCode(String applicationAbbrev);
11

  
12
    boolean hasApplicationAbbrev(String applicationAbbrev);
13

  
14
    boolean hasDatabaseCode(String databaseCode);
15
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/JDBCSRSsDumb.java
1

  
2
package org.gvsig.fmap.dal.store.jdbc2.spi;
3

  
4
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
5

  
6
public class JDBCSRSsDumb extends JDBCSRSsBase implements JDBCSRSs {
7
    
8
    public JDBCSRSsDumb(JDBCHelper helper) {
9
        super(helper);
10
    }
11
        
12
    @Override
13
    protected String searchDatabaseCode(String applicationAbbrev) {
14
        try {
15
            String[] s = applicationAbbrev.split(applicationAbbrev);
16
            return s[1].trim();
17
        } catch (Throwable ex) {
18
            throw new RuntimeException("Problems searching database code from '"+applicationAbbrev+"'.",ex);
19
        }
20
    }
21

  
22
    @Override
23
    protected String searchApplicationAbbrev(String databaseCode) {
24
        try {
25
            return "EPSG:" + databaseCode.trim();
26
        } catch (Throwable ex) {
27
            throw new RuntimeException("Problems searching application abbrev from '"+databaseCode+"'.",ex);
28
        }
29
    }    
30
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/JDBCSRSsBase.java
1

  
2
package org.gvsig.fmap.dal.store.jdbc2.spi;
3

  
4
import java.sql.ResultSet;
5
import java.sql.Statement;
6
import java.util.HashMap;
7
import java.util.Map;
8
import org.apache.commons.lang3.StringUtils;
9
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
10
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
11

  
12
public class JDBCSRSsBase implements JDBCSRSs {
13
    
14
    protected Map<String,String> database2applicationAbbrev;
15
    protected Map<String,String> applicationAbbrev2database;
16
    protected JDBCHelper helper;
17
    
18
    public JDBCSRSsBase(JDBCHelper helper) {
19
        this.helper = helper;
20
        this.applicationAbbrev2database = new HashMap<>();
21
        this.database2applicationAbbrev = new HashMap<>();
22
    }
23
    
24
    public void add(String databaseCode, String applicationAbbrev) {
25
        this.applicationAbbrev2database.put(applicationAbbrev, databaseCode);
26
        this.database2applicationAbbrev.put(databaseCode, applicationAbbrev);
27
    }
28
    
29
    public String getDatabaseCode(String applicationAbbrev) {
30
        if( this.hasApplicationAbbrev(applicationAbbrev) ) {
31
            return this.applicationAbbrev2database.get(applicationAbbrev);
32
        }
33
        String databaseCode = this.searchDatabaseCode(applicationAbbrev);
34
        if( StringUtils.isEmpty(databaseCode) ) {
35
            return null;
36
        }
37
        this.add(databaseCode, applicationAbbrev);
38
        return databaseCode;
39
    }
40
    
41
    public String getApplicationAbbrev(String databaseCode) {
42
        if( this.hasDatabaseCode(databaseCode) ) {
43
            return this.database2applicationAbbrev.get(databaseCode);
44
        }
45
        String applicationAbbrev = this.searchApplicationAbbrev(databaseCode);
46
        if( StringUtils.isEmpty(applicationAbbrev) ) {
47
            return null;
48
        }
49
        this.add(databaseCode, applicationAbbrev);
50
        return applicationAbbrev;
51
    }
52
    
53
    public boolean hasDatabaseCode(String databaseCode) {
54
        return this.database2applicationAbbrev.containsKey(databaseCode);
55
    }
56
    
57
    public boolean hasApplicationAbbrev(String applicationAbbrev) {
58
        return this.applicationAbbrev2database.containsKey(applicationAbbrev);
59
    }
60

  
61
    protected String searchDatabaseCode(String applicationAbbrev) {
62
        // Initialize sql only for debugging purposes
63
        String sql = "select srid, auth_name, auth_srid from spatial_ref_sys where auth_name/auth_srid is '"+applicationAbbrev+"'.";
64
        try {
65
            String[] s = applicationAbbrev.split(applicationAbbrev);
66
            sql = "select srid, auth_name, auth_srid from spatial_ref_sys where auth_name = '" + s[0] +"' and auth_srid = '"+s[1]+"' ";
67
            Statement st = this.helper.getConnection().createStatement();
68
            ResultSet rs = JDBCUtils.executeQuery(st, sql);
69
            if ( rs.next() ) {
70
                int srid = rs.getInt("srid");
71
                return String.valueOf(srid);
72
            }            
73
            return null;
74
        } catch (Throwable ex) {
75
            throw new RuntimeException("Problems with SQL '"+sql+"'.",ex);
76
        }
77
    }
78

  
79
    protected String searchApplicationAbbrev(String databaseCode) {
80
        String sql = "select srid, auth_name, auth_srid from spatial_ref_sys where srid = " + databaseCode;
81
        try {
82
            Statement st = this.helper.getConnection().createStatement();
83
            ResultSet rs = JDBCUtils.executeQuery(st, sql);
84
            if ( rs.next() ) {
85
                int auth_code = rs.getInt("auth_srid");
86
                String auth_name = rs.getString("auth_name");
87
                return auth_name + ":" + auth_code;
88
            }            
89
            return null;
90
        } catch (Throwable ex) {
91
            throw new RuntimeException("Problems with SQL '"+sql+"'.",ex);
92
        }
93
    }
94

  
95
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/SRSSolver.java
1

  
2
package org.gvsig.fmap.dal.store.jdbc2.spi;
3

  
4
import java.sql.Connection;
5
import org.cresques.cts.IProjection;
6

  
7
public interface SRSSolver {
8

  
9
    void add(String databaseCode, String applicationAbbrev);
10

  
11
    String getApplicationAbbrev(Connection connection, String databaseCode);
12

  
13
    String getDatabaseCode(Connection connection, String applicationAbbrev);
14

  
15
    boolean hasApplicationAbbrev(Connection connection, String applicationAbbrev);
16

  
17
    boolean hasDatabaseCode(Connection connection, String databaseCode);
18

  
19
    public IProjection getProjection(Connection connection, String databaseCode);
20
    
21
    public String getDatabaseCode(Connection connection, IProjection projection);
22
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/SRSSolverDumb.java
1

  
2
package org.gvsig.fmap.dal.store.jdbc2.spi;
3

  
4
import java.sql.Connection;
5
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
6

  
7
public class SRSSolverDumb extends SRSSolverBase implements SRSSolver {
8
    
9
    public SRSSolverDumb(JDBCHelper helper) {
10
        super(helper);
11
    }
12
        
13
    @Override
14
    protected String searchDatabaseCode(Connection connection, String applicationAbbrev) {
15
        try {
16
            String[] s = applicationAbbrev.split(applicationAbbrev);
17
            return s[1].trim();
18
        } catch (Throwable ex) {
19
            throw new RuntimeException("Problems searching database code from '"+applicationAbbrev+"'.",ex);
20
        }
21
    }
22

  
23
    @Override
24
    protected String searchApplicationAbbrev(Connection connection, String databaseCode) {
25
        try {
26
            return "EPSG:" + databaseCode.trim();
27
        } catch (Throwable ex) {
28
            throw new RuntimeException("Problems searching application abbrev from '"+databaseCode+"'.",ex);
29
        }
30
    }    
31
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/JDBCHelperBase.java
4 4
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.OperationsFactoryBase;
5 5
import java.sql.Connection;
6 6
import java.sql.ResultSet;
7
import java.sql.SQLException;
8
import org.apache.commons.dbcp.BasicDataSource;
9
import org.apache.commons.lang3.BooleanUtils;
10 7
import org.apache.commons.lang3.StringUtils;
11 8
import org.cresques.cts.IProjection;
12 9
import org.gvsig.fmap.crs.CRSFactory;
......
34 31
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
35 32
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
36 33
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCCantFetchValueException;
37
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCDriverClassNotFoundException;
38 34
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
39 35
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
40 36
import org.gvsig.fmap.dal.store.jdbc2.JDBCStoreProvider;
......
73 69
    
74 70
    protected OperationsFactory operationsFactory = null;
75 71
    
76
    protected JDBCSRSs srss;
72
    protected SRSSolver srssolver;
77 73
    
78 74
    public JDBCHelperBase(JDBCConnectionParameters connectionParameters) {
79 75
        this.connectionParameters = connectionParameters;
80 76
        
81 77
        // If a particular treatment is required to convert SRS to the 
82 78
        // BBDD format, overwrite JDBCSRSsBase and use it instead of JDBCSRSsDumb.
83
        this.srss = new JDBCSRSsDumb(this);
79
        this.srssolver = new SRSSolverDumb(this);
84 80
    }
85 81

  
86 82
    protected void initialize(
......
344 340

  
345 341
    @Override
346 342
    public int getSRSCode(IProjection crs) {
347
        String databaseCode = this.srss.getDatabaseCode(crs.getAbrev());
348
        return Integer.parseInt(databaseCode);
343
        Connection connection=null;
344
        try {
345
            connection = this.getConnection();
346
            String databaseCode = this.srssolver.getDatabaseCode(connection, crs.getAbrev());
347
            return Integer.parseInt(databaseCode);
348
        } catch(Throwable ex) {
349
            throw new RuntimeException(ex);
350
        } finally {
351
            this.closeConnection(connection);
352
        }
349 353
    }
350 354

  
351 355
    @Override
......
355 359

  
356 360
    @Override
357 361
    public String getDatabaseCodeFromProyection(IProjection proj) {
358
        return this.srss.getDatabaseCode(proj.getAbrev());
362
        Connection connection=null;
363
        try {
364
            connection = this.getConnection();
365
            return this.srssolver.getDatabaseCode(connection, proj);
366
        } catch(Throwable ex) {
367
            throw new RuntimeException(ex);
368
        } finally {
369
            this.closeConnection(connection);
370
        }
359 371
    }
360 372
    
361 373
    @Override
374
    public SRSSolver getSRSSolver() {
375
        return this.srssolver;
376
    }
377
    
378
    @Override
362 379
    public IProjection getProjectionFromDatabaseCode(String databaseCode) {
363
        if( StringUtils.trimToEmpty(databaseCode).equals("0") ) {
364
            return null;
380
        Connection connection=null;
381
        try {
382
            connection = this.getConnection();
383
            return this.srssolver.getProjection(connection, databaseCode);
384
        } catch(Throwable ex) {
385
            throw new RuntimeException(ex);
386
        } finally {
387
            this.closeConnection(connection);
365 388
        }
366
        String abbrev = this.srss.getApplicationAbbrev(databaseCode);
367
        if( StringUtils.isEmpty(abbrev) ) {
368
            return null;
369
        }
370
        IProjection proj = CRSFactory.getCRS(abbrev);
371
        return proj;
372 389
    }
373 390
    
374 391
    @Override
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/SRSSolverBase.java
1

  
2
package org.gvsig.fmap.dal.store.jdbc2.spi;
3

  
4
import java.sql.Connection;
5
import java.sql.ResultSet;
6
import java.sql.Statement;
7
import java.util.HashMap;
8
import java.util.Map;
9
import org.apache.commons.lang3.StringUtils;
10
import org.cresques.cts.IProjection;
11
import org.gvsig.fmap.crs.CRSFactory;
12
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
13
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
14

  
15
public class SRSSolverBase implements SRSSolver {
16
    
17
    protected Map<String,String> database2applicationAbbrev;
18
    protected Map<String,String> applicationAbbrev2database;
19
    protected JDBCHelper helper;
20
    
21
    public SRSSolverBase(JDBCHelper helper) {
22
        this.helper = helper;
23
        this.applicationAbbrev2database = new HashMap<>();
24
        this.database2applicationAbbrev = new HashMap<>();
25
    }
26
    
27
    @Override
28
    public void add(String databaseCode, String applicationAbbrev) {
29
        this.applicationAbbrev2database.put(applicationAbbrev, databaseCode);
30
        this.database2applicationAbbrev.put(databaseCode, applicationAbbrev);
31
    }
32
    
33
    @Override
34
    public String getDatabaseCode(Connection connection, String applicationAbbrev) {
35
        if( this.hasApplicationAbbrev(connection, applicationAbbrev) ) {
36
            return this.applicationAbbrev2database.get(applicationAbbrev);
37
        }
38
        String databaseCode = this.searchDatabaseCode(connection, applicationAbbrev);
39
        if( StringUtils.isEmpty(databaseCode) ) {
40
            return null;
41
        }
42
        this.add(databaseCode, applicationAbbrev);
43
        return databaseCode;
44
    }
45
    
46
    @Override
47
    public String getApplicationAbbrev(Connection connection, String databaseCode) {
48
        if( this.hasDatabaseCode(connection, databaseCode) ) {
49
            return this.database2applicationAbbrev.get(databaseCode);
50
        }
51
        String applicationAbbrev = this.searchApplicationAbbrev(connection, databaseCode);
52
        if( StringUtils.isEmpty(applicationAbbrev) ) {
53
            return null;
54
        }
55
        this.add(databaseCode, applicationAbbrev);
56
        return applicationAbbrev;
57
    }
58
    
59
    @Override
60
    public boolean hasDatabaseCode(Connection connection, String databaseCode) {
61
        return this.database2applicationAbbrev.containsKey(databaseCode);
62
    }
63
    
64
    @Override
65
    public boolean hasApplicationAbbrev(Connection connection, String applicationAbbrev) {
66
        return this.applicationAbbrev2database.containsKey(applicationAbbrev);
67
    }
68

  
69
    protected String searchDatabaseCode(Connection connection, String applicationAbbrev) {
70
        // Initialize sql only for debugging purposes
71
        String sql = "select srid, auth_name, auth_srid from spatial_ref_sys where auth_name/auth_srid is '"+applicationAbbrev+"'.";
72
        try {
73
            String[] s = applicationAbbrev.split(applicationAbbrev);
74
            sql = "select srid, auth_name, auth_srid from spatial_ref_sys where auth_name = '" + s[0] +"' and auth_srid = '"+s[1]+"' ";
75
            Statement st = connection.createStatement();
76
            ResultSet rs = JDBCUtils.executeQuery(st, sql);
77
            if ( rs.next() ) {
78
                int srid = rs.getInt("srid");
79
                return String.valueOf(srid);
80
            }            
81
            return null;
82
        } catch (Throwable ex) {
83
            throw new RuntimeException("Problems with SQL '"+sql+"'.",ex);
84
        }
85
    }
86

  
87
    protected String searchApplicationAbbrev(Connection connection, String databaseCode) {
88
        String sql = "select srid, auth_name, auth_srid from spatial_ref_sys where srid = " + databaseCode;
89
        try {
90
            Statement st = connection.createStatement();
91
            ResultSet rs = JDBCUtils.executeQuery(st, sql);
92
            if ( rs.next() ) {
93
                int auth_code = rs.getInt("auth_srid");
94
                String auth_name = rs.getString("auth_name");
95
                return auth_name + ":" + auth_code;
96
            }            
97
            return null;
98
        } catch (Throwable ex) {
99
            throw new RuntimeException("Problems with SQL '"+sql+"'.",ex);
100
        }
101
    }
102

  
103
    @Override
104
    public IProjection getProjection(Connection connection, String databaseCode) {
105
        if( StringUtils.trimToEmpty(databaseCode).equals("0") ) {
106
            return null;
107
        }
108
        String abbrev = this.getApplicationAbbrev(connection, databaseCode);
109
        if( StringUtils.isEmpty(abbrev) ) {
110
            return null;
111
        }
112
        IProjection proj = CRSFactory.getCRS(abbrev);
113
        return proj;
114
    }
115

  
116
    @Override
117
    public String getDatabaseCode(Connection connection, IProjection projection) {
118
        return this.getDatabaseCode(connection, projection.getAbrev());
119
    }
120

  
121
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/JDBCHelper.java
21 21
import org.gvsig.fmap.dal.store.jdbc2.ResulSetControler.ResultSetEntry;
22 22
import org.gvsig.fmap.geom.Geometry;
23 23
import org.gvsig.fmap.geom.GeometryManager;
24
import org.gvsig.fmap.dal.store.jdbc2.spi.SRSSolver;
24 25

  
25 26
public interface JDBCHelper extends AutoCloseable {
26 27

  
......
162 163
            DataServerExplorerProviderServices providerServices
163 164
    ) throws InitializeException;
164 165

  
166
    public SRSSolver getSRSSolver();
167
    
165 168
    public String getDatabaseCodeFromProyection(IProjection proj);
166 169
    
167 170
    public IProjection getProjectionFromDatabaseCode(String databaseCode);
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.h2/src/main/java/org/gvsig/fmap/dal/store/h2/H2SpatialHelper.java
39 39
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory;
40 40
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCHelperBase;
41 41
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
42
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSRSsBase;
42
import org.gvsig.fmap.dal.store.jdbc2.spi.SRSSolverBase;
43 43
import org.gvsig.fmap.geom.Geometry;
44 44
import org.gvsig.fmap.geom.aggregate.MultiLine;
45 45
import org.gvsig.fmap.geom.aggregate.MultiPoint;
......
221 221
   
222 222
    public H2SpatialHelper(JDBCConnectionParameters connectionParameters) {
223 223
        super(connectionParameters);
224
        this.srss = new JDBCSRSsBase(this);
224
        this.srssolver = new SRSSolverBase(this);
225 225
    }
226 226

  
227 227
    @Override

Also available in: Unified diff