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 / JDBCSQLBuilderBase.java @ 43687

History | View | Annotate | Download (8.7 KB)

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

    
3
import java.sql.Connection;
4
import java.sql.PreparedStatement;
5
import java.sql.SQLException;
6
import java.util.ArrayList;
7
import java.util.List;
8
import org.cresques.cts.IProjection;
9
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
10
import org.gvsig.fmap.dal.feature.FeatureReference;
11
import org.gvsig.fmap.dal.feature.FeatureType;
12
import org.gvsig.fmap.dal.feature.spi.SQLBuilderBase;
13
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
14
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
15
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
16
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
17
import org.gvsig.fmap.geom.DataTypes;
18
import org.gvsig.fmap.geom.Geometry;
19
import org.gvsig.fmap.geom.GeometryLocator;
20
import org.gvsig.fmap.geom.GeometryManager;
21
import org.gvsig.fmap.geom.aggregate.MultiLine;
22
import org.gvsig.fmap.geom.aggregate.MultiPoint;
23
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
24
import org.gvsig.fmap.geom.exception.CreateGeometryException;
25
import org.gvsig.fmap.geom.primitive.Primitive;
26
import org.gvsig.fmap.geom.type.GeometryType;
27
import org.gvsig.tools.dispose.Disposable;
28

    
29
public class JDBCSQLBuilderBase extends SQLBuilderBase {
30

    
31
    private GeometryManager geometryManager = null;
32
    protected final JDBCHelper helper;
33
    
34
    public JDBCSQLBuilderBase(JDBCHelper helper) {
35
        super();
36
        this.helper = helper;
37
    }
38
    
39
    public JDBCHelper getHelper() {
40
        return helper;
41
    }
42
    
43
    protected GeometryManager getGeometryManager() {
44
        if (this.geometryManager == null) {
45
            this.geometryManager = GeometryLocator.getGeometryManager();
46
        }
47
        return this.geometryManager;
48
    }
49
    
50
    @Override
51
    public Object getSRSId(IProjection projection) {
52
        Connection conn = null;
53
        try {
54
            conn = this.helper.getConnection();
55
            SRSSolver solver = this.helper.getSRSSolver();
56
            Object srscode = solver.getDatabaseCode(conn, projection);
57
            return srscode;
58
        } catch (Exception ex) {
59
            throw new RuntimeException("Can't locate database code for SRS '"+projection.getAbrev()+"'.");
60
        } finally {
61
            JDBCUtils.closeQuietly(conn);
62
        }
63
    }
64
    
65
    public void setParameters(PreparedStatement st) {
66
        try {
67
            int columnIndex = 1;
68
            for (Parameter parameter : this.getParameters()) {
69
                st.setObject(columnIndex++, parameter.getValue());
70
            }
71
        } catch (Exception ex) {
72
            String p = "unknow";
73
            try {
74
                p =  this.getParameters().toString();
75
            } catch (Exception ex2) {
76
                // Do nothing
77
            }
78
            throw new RuntimeException("Can't set parameters to prepared statement from parameters (" + p + ")", ex);
79
        }
80
    }
81

    
82
    public Disposable setParameters(PreparedStatement st, FeatureProvider feature) {
83
        try {
84
            FeatureType type = feature.getType();
85
            List<Object> values = new ArrayList<>();
86
            Object value;
87
            for (Parameter parameter : this.getParameters()) {
88
                if (parameter.is_constant()) {
89
                    value = parameter.getValue();
90
                    values.add(value);
91
                } else {
92
                    String name = parameter.getName();
93
                    value = feature.get(name);
94
                    FeatureAttributeDescriptor attrDesc = type.getAttributeDescriptor(name);
95
                    if( attrDesc.getType()==DataTypes.GEOMETRY ) {
96
                        value = forceGeometryType(attrDesc.getGeomType(), (Geometry) value);                        
97
                    }
98
                    values.add(value);
99
                }
100
            }
101
            return this.setStatementParameters(st, values, this.geometry_support_type());
102
        } catch (Exception ex) {
103
            String f = "unknow";
104
            try {
105
                f = feature.toString();
106
            } catch (Exception ex2) {
107
                // Do nothing
108
            }
109
            throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex);
110
        }
111
    }
112
    
113
    protected Geometry forceGeometryType(GeometryType geomtype, Geometry geom) throws CreateGeometryException {
114
        if( geom == null ) {
115
            return null;
116
        }
117
        switch( geomtype.getType() ) {
118
        case Geometry.TYPES.MULTIPOLYGON:
119
            if( geom.getType()==Geometry.TYPES.POLYGON ) {
120
                MultiPolygon x = getGeometryManager().createMultiPolygon(geomtype.getSubType());
121
                x.addPrimitive((Primitive) geom);
122
                geom = x;
123
            }
124
            break;
125
        case Geometry.TYPES.MULTILINE:
126
            if( geom.getType()==Geometry.TYPES.LINE ) {
127
                MultiLine x = getGeometryManager().createMultiLine(geomtype.getSubType());
128
                x.addPrimitive((Primitive) geom);
129
                geom = x;
130
            }
131
            break;
132
        case Geometry.TYPES.MULTIPOINT:
133
            if( geom.getType()==Geometry.TYPES.POINT ) {
134
                MultiLine x = getGeometryManager().createMultiLine(geomtype.getSubType());
135
                x.addPrimitive((Primitive) geom);
136
                geom = x;
137
            }
138
            break;
139
        case Geometry.TYPES.POLYGON:
140
            if( geom.getType()==Geometry.TYPES.MULTIPOLYGON ) {
141
                MultiPolygon x = (MultiPolygon) geom;
142
                if( x.getPrimitivesNumber()==1 ) {
143
                    geom = x.getPrimitiveAt(0);
144
                }
145
            }
146
            break;
147
        case Geometry.TYPES.LINE:
148
            if( geom.getType()==Geometry.TYPES.MULTILINE ) {
149
                MultiLine x = (MultiLine) geom;
150
                if( x.getPrimitivesNumber()==1 ) {
151
                    geom = x.getPrimitiveAt(0);
152
                }
153
            }
154
            break;
155
        case Geometry.TYPES.POINT:
156
            if( geom.getType()==Geometry.TYPES.MULTIPOINT ) {
157
                MultiPoint x = (MultiPoint) geom;
158
                if( x.getPrimitivesNumber()==1 ) {
159
                    geom = x.getPrimitiveAt(0);
160
                }
161
            }
162
        }
163
        return geom;
164
    }
165
    
166
    public Disposable setParameters(PreparedStatement st, FeatureReference reference) {
167
        try {
168
            
169
            List<Object> values = new ArrayList<>();
170
            for (Parameter parameter : this.getParameters()) {
171
                if (parameter.is_constant()) {
172
                    values.add(parameter.getValue());
173
                } else {
174
                    String name = parameter.getName();
175
                    values.add(((FeatureReferenceProviderServices)reference).getKeyValue(name));
176
                }
177
            }
178
            return this.setStatementParameters(st, values, this.geometry_support_type());
179
        } catch (Exception ex) {
180
            String f = "unknow";
181
            try {
182
                f = reference.toString();
183
            } catch (Exception ex2) {
184
                // Do nothing
185
            }
186
            throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex);
187
        }
188
    }
189

    
190
    public Disposable setStatementParameters(
191
        PreparedStatement st, 
192
        List values, 
193
        GeometrySupportType geometrySupportType) throws SQLException {
194
        
195
        if (values == null) {
196
            return new Disposable() {
197
                @Override
198
                public void dispose() {
199
                }
200
            };
201
        }
202
        try {
203
            byte[] bytes;
204
            int columnIndex = 1;
205
            for (Object value : values) {
206
                if (value instanceof Geometry) {
207
                    switch(geometrySupportType) {
208
                        case WKT:
209
                            value = ((Geometry) value).convertToWKT();
210
                            st.setObject(columnIndex, value);
211
                            break;
212
                        case NATIVE:
213
                        case WKB: 
214
                            bytes = ((Geometry) value).convertToWKB();
215
                            st.setBytes(columnIndex, bytes);
216
                            break;
217
                        case EWKB:
218
                            bytes = ((Geometry) value).convertToEWKB();
219
                            st.setBytes(columnIndex, bytes);
220
                            break;
221
                    }
222
                } else {
223
                    st.setObject(columnIndex, value);
224
                }
225
                columnIndex++;
226
            }
227
            return new Disposable() {
228
                @Override
229
                public void dispose() {
230
                }
231
            };
232
        } catch(Exception ex) {
233
            throw new SQLException("Can't set values for the prepared statement.", ex);
234
        }        
235
    }
236
}