Statistics
| Revision:

gvsig-mssqlserver / trunk / org.gvsig.mssqlserver / org.gvsig.mssqlserver.provider / src / main / java / org / gvsig / mssqlserver / dal / operations / MSSQLServerFetchFeatureTypeOperation.java @ 213

History | View | Annotate | Download (4.3 KB)

1
package org.gvsig.mssqlserver.dal.operations;
2

    
3
import java.sql.Connection;
4
import java.sql.ResultSet;
5
import java.sql.ResultSetMetaData;
6
import java.sql.Statement;
7
import java.util.List;
8
import org.cresques.cts.IProjection;
9
import org.gvsig.expressionevaluator.ExpressionBuilder;
10
import org.gvsig.fmap.dal.exception.DataException;
11
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
12
import org.gvsig.fmap.dal.feature.EditableFeatureType;
13
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
14
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
15
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
16
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
17
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
18
import org.gvsig.fmap.geom.Geometry;
19
import org.gvsig.fmap.geom.GeometryLocator;
20
import org.gvsig.fmap.geom.type.GeometryType;
21
import org.gvsig.mssqlserver.dal.MSSQLServerHelper;
22

    
23
public class MSSQLServerFetchFeatureTypeOperation extends FetchFeatureTypeOperation {
24

    
25
    public MSSQLServerFetchFeatureTypeOperation(
26
            JDBCHelper helper
27
    ) {
28
        super(helper);
29
    }
30

    
31
    public MSSQLServerFetchFeatureTypeOperation(
32
            JDBCHelper helper,
33
            EditableFeatureType featureType,
34
            TableReference table,
35
            List<String> primaryKeys,
36
            String defaultGeometryColumn,
37
            IProjection crs
38
    ) {
39
        super(helper, featureType, table, primaryKeys, defaultGeometryColumn, crs);
40
    }
41

    
42
    @Override
43
    public void fetch(EditableFeatureType featureType, Connection conn, TableReference table, List<String> pks, String defaultGeometryColumn, IProjection crs) throws DataException {
44
        super.fetch(featureType, conn, table, pks, defaultGeometryColumn, crs);
45
        ((MSSQLServerHelper) this.helper).setLastUsedFeatureType(featureType);
46
    }
47

    
48
    @Override
49
    protected void fetchGeometryTypeAndSRS(
50
            EditableFeatureAttributeDescriptor attr,
51
            ResultSetMetaData rsMetadata,
52
            int colIndex
53
    ) {
54
        try {
55
            GeometryType geomType = GeometryLocator.getGeometryManager().getGeometryType(
56
                    Geometry.TYPES.GEOMETRY,
57
                    Geometry.SUBTYPES.GEOM2D
58
            );
59
            attr.setGeometryType(geomType);
60

    
61
            String typeName = rsMetadata.getColumnTypeName(colIndex);
62
            attr.setAdditionalInfo("SQLServer_type_name", typeName);
63
            attr.setSRS(getProjectionOfColumn(attr.getName()));
64
        } catch (Exception ex) {
65
            LOGGER.warn("Can't get default geometry type.", ex);
66
        }
67
    }
68
    
69
    private IProjection getProjectionOfColumn(String columnName) {
70
       
71
        JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
72
        ExpressionBuilder expbuilder = sqlbuilder.expression();
73
        
74
        sqlbuilder.select().limit(1);
75
        sqlbuilder.select().column().value(
76
                expbuilder.ST_SRID(expbuilder.column(columnName))
77
        );
78
        sqlbuilder.select().where().set(
79
                expbuilder.and(
80
                        expbuilder.not_is_null(expbuilder.column(columnName)),
81
                        expbuilder.not_is_null(expbuilder.ST_SRID(expbuilder.column(columnName)))
82
                )
83
        );
84
        sqlbuilder.select().from().table()
85
                .database(this.getTable().getDatabase())
86
                .schema(this.getTable().getSchema())
87
                .name(this.getTable().getTable());
88
        Statement st = null;
89
        ResultSet rs = null;
90
        try {
91
            st = this.getConnection().createStatement();
92
            rs = JDBCUtils.executeQuery(st, sqlbuilder.toString());
93
            if (rs.next()) {
94
                int code = rs.getInt(1);
95
                try {
96
                    IProjection proj = this.helper.getSRSSolver().getProjection(conn, code);
97
                    return proj;
98
                } catch (Exception ex) {
99
                    LOGGER.warn("Can't create projection from code '" + code + "'.", ex);
100
                }
101
            }
102
        } catch (Exception ex) {
103
            // Do nothing, return null
104
        } finally {
105
            JDBCUtils.closeQuietly(rs);
106
            JDBCUtils.closeQuietly(st);
107
        }
108
        return null;
109

    
110
    }
111
}