Statistics
| Revision:

svn-gvsig-desktop / 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 @ 43606

History | View | Annotate | Download (4.6 KB)

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
}