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 @ 44944

History | View | Annotate | Download (12.8 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.sql.Timestamp;
7
import java.util.ArrayList;
8
import java.util.Date;
9
import java.util.List;
10
import org.cresques.cts.IProjection;
11
import org.gvsig.expressionevaluator.ExpressionBuilder.Parameter;
12
import static org.gvsig.expressionevaluator.GeometryExpressionBuilderHelper.GeometrySupportType;
13
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
14
import org.gvsig.fmap.dal.feature.FeatureReference;
15
import org.gvsig.fmap.dal.feature.FeatureType;
16
import org.gvsig.fmap.dal.feature.spi.SQLBuilderBase;
17
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
18
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
19
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
20
import org.gvsig.fmap.geom.Geometry;
21
import org.gvsig.fmap.geom.GeometryLocator;
22
import org.gvsig.fmap.geom.GeometryManager;
23
import org.gvsig.fmap.geom.aggregate.MultiLine;
24
import org.gvsig.fmap.geom.aggregate.MultiPoint;
25
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
26
import org.gvsig.fmap.geom.exception.CreateGeometryException;
27
import org.gvsig.fmap.geom.primitive.Primitive;
28
import org.gvsig.fmap.geom.type.GeometryType;
29
import org.gvsig.tools.dispose.Disposable;
30

    
31
@SuppressWarnings("UseSpecificCatch")
32
public class JDBCSQLBuilderBase extends SQLBuilderBase {
33

    
34
    public static final String PROP_FEATURE_TYPE = "FeatureType";
35
    public static final String PROP_TABLE = "Table";
36
    
37
    private GeometryManager geometryManager = null;
38
    protected final JDBCHelper helper;
39
    
40
    public JDBCSQLBuilderBase(JDBCHelper helper) {
41
        super();
42
        this.helper = helper;
43
    }
44
    
45
    public JDBCHelper getHelper() {
46
        return helper;
47
    }
48
    
49
    protected GeometryManager getGeometryManager() {
50
        if (this.geometryManager == null) {
51
            this.geometryManager = GeometryLocator.getGeometryManager();
52
        }
53
        return this.geometryManager;
54
    }
55
    
56
    @Override
57
    public Object srs_id(IProjection projection) {
58
        Connection conn = null;
59
        try {
60
            conn = this.helper.getConnection();
61
            SRSSolver solver = this.helper.getSRSSolver();
62
            Object srscode = solver.getDatabaseCode(conn, projection);
63
//            logger.debug("database code srs {}, type {}, srssolver {}.", 
64
//                new Object[] { 
65
//                    srscode, 
66
//                    srscode==null? "null":srscode.getClass().getSimpleName(), 
67
//                    solver
68
//                }
69
//            );
70
            return srscode;
71
        } catch (Exception ex) {
72
            throw new RuntimeException("Can't locate database code for SRS '"+projection.getAbrev()+"'.");
73
        } finally {
74
            this.helper.closeConnectionQuietly(conn);
75
        }
76
    }
77
    
78
    public void setParameters(PreparedStatement st) {
79
        try {
80
            int columnIndex = 1;
81
            for (Parameter parameter : this.parameters()) {
82
                st.setObject(columnIndex++, parameter.value());
83
            }
84
        } catch (Exception ex) {
85
            String p = "unknow";
86
            try {
87
                p =  this.parameters().toString();
88
            } catch (Exception ex2) {
89
                // Do nothing
90
            }
91
            throw new RuntimeException("Can't set parameters to prepared statement from parameters (" + p + ")", ex);
92
        }
93
    }
94

    
95
    public List<Object> getParameters(FeatureProvider feature) {
96
        try {
97
            FeatureType type = feature.getType();
98
            List<Object> values = new ArrayList<>();
99
            Object value;
100
            for (Parameter parameter : this.parameters()) {
101
                if (parameter.is_constant()) {
102
                    value = parameter.value();
103
                    values.add(value);
104
                } else {
105
                    String name = parameter.name();
106
                    value = feature.get(name);
107
                    FeatureAttributeDescriptor attrDesc = type.getAttributeDescriptor(name);
108
                    switch( attrDesc.getType() ) {
109
                    case org.gvsig.fmap.dal.DataTypes.DATE:
110
                        if( value == null ) {
111
                            values.add(null);
112
                        } else {
113
                            values.add(new java.sql.Date(((Date)value).getTime()));
114
                        }
115
                        break;
116
                    case org.gvsig.fmap.dal.DataTypes.GEOMETRY:
117
                        Geometry geom = this.forceGeometryType(
118
                            attrDesc.getGeomType(),
119
                            (Geometry)value
120
                        );
121
                        values.add(geom);
122
                        break;
123
                    default:
124
                        values.add(value);
125
                        break;
126
                    }
127
                }
128
            }
129
            return  values;
130
        } catch (Exception ex) {
131
            String f = "unknow";
132
            try {
133
                f = feature.toString();
134
            } catch (Exception ex2) {
135
                // Do nothing
136
            }
137
            throw new RuntimeException("Can't get parameters to prepared statement from the feature (" + f + ")", ex);
138
        }
139
    }
140

    
141
    public Disposable setParameters(PreparedStatement st, FeatureProvider feature) {
142
        try {
143
            List<Object> values = this.getParameters(feature);
144
            return this.setStatementParameters(st, values, this.geometry_support_type());
145
        } catch (Exception ex) {
146
            String f = "unknow";
147
            try {
148
                f = feature.toString();
149
            } catch (Exception ex2) {
150
                // Do nothing
151
            }
152
            throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex);
153
        }
154
    }
155
    
156
    protected Geometry forceGeometryType(GeometryType geomtype, Geometry geom) throws CreateGeometryException {
157
        if( geom == null ) {
158
            return null;
159
        }
160
        switch( geomtype.getType() ) {
161
        case Geometry.TYPES.MULTIPOLYGON:
162
            if( geom.getType()==Geometry.TYPES.POLYGON ) {
163
                MultiPolygon x = getGeometryManager().createMultiPolygon(geomtype.getSubType());
164
                x.addPrimitive((Primitive) geom);
165
                geom = x;
166
            }
167
            break;
168
        case Geometry.TYPES.MULTILINE:
169
            if( geom.getType()==Geometry.TYPES.LINE ) {
170
                MultiLine x = getGeometryManager().createMultiLine(geomtype.getSubType());
171
                x.addPrimitive((Primitive) geom);
172
                geom = x;
173
            }
174
            break;
175
        case Geometry.TYPES.MULTIPOINT:
176
            if( geom.getType()==Geometry.TYPES.POINT ) {
177
                MultiLine x = getGeometryManager().createMultiLine(geomtype.getSubType());
178
                x.addPrimitive((Primitive) geom);
179
                geom = x;
180
            }
181
            break;
182
        case Geometry.TYPES.POLYGON:
183
            if( geom.getType()==Geometry.TYPES.MULTIPOLYGON ) {
184
                MultiPolygon x = (MultiPolygon) geom;
185
                if( x.getPrimitivesNumber()==1 ) {
186
                    geom = x.getPrimitiveAt(0);
187
                }
188
            }
189
            break;
190
        case Geometry.TYPES.LINE:
191
            if( geom.getType()==Geometry.TYPES.MULTILINE ) {
192
                MultiLine x = (MultiLine) geom;
193
                if( x.getPrimitivesNumber()==1 ) {
194
                    geom = x.getPrimitiveAt(0);
195
                }
196
            }
197
            break;
198
        case Geometry.TYPES.POINT:
199
            if( geom.getType()==Geometry.TYPES.MULTIPOINT ) {
200
                MultiPoint x = (MultiPoint) geom;
201
                if( x.getPrimitivesNumber()==1 ) {
202
                    geom = x.getPrimitiveAt(0);
203
                }
204
            }
205
        }
206
        return geom;
207
    }
208
    
209
    public Disposable setParameters(PreparedStatement st, FeatureReference reference) {
210
        try {
211
            
212
            List<Object> values = new ArrayList<>();
213
            for (Parameter parameter : this.parameters()) {
214
                if (parameter.is_constant()) {
215
                    values.add(parameter.value());
216
                } else {
217
                    String name = parameter.name();
218
                    values.add(((FeatureReferenceProviderServices)reference).getKeyValue(name));
219
                }
220
            }
221
            return this.setStatementParameters(st, values, this.geometry_support_type());
222
        } catch (Exception ex) {
223
            String f = "unknow";
224
            try {
225
                f = reference.toString();
226
            } catch (Exception ex2) {
227
                // Do nothing
228
            }
229
            throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex);
230
        }
231
    }
232

    
233
    public Disposable setStatementParameters(
234
        PreparedStatement st, 
235
        List values,
236
        GeometrySupportType geometrySupportType) throws SQLException {
237
        
238
        if (values == null) {
239
            return new Disposable() {
240
                @Override
241
                public void dispose() {
242
                }
243
            };
244
        }
245
        if( LOGGER.isDebugEnabled() ) {
246
            StringBuilder debug = new StringBuilder();
247
            debug.append("st.set(");
248
            try {
249
                byte[] bytes;
250
                int columnIndex = 1;
251
                for (Object value : values) {
252
                    if (value instanceof Geometry) {
253
                        switch(geometrySupportType) {
254
                            case WKT:
255
                                value = ((Geometry) value).convertToWKT();
256
                                debug.append("/*");
257
                                debug.append(columnIndex);
258
                                debug.append("*/ ");
259
                                debug.append(as_string(value));
260
                                debug.append(", ");
261
                                break;
262
                            case NATIVE:
263
                            case WKB: 
264
                                bytes = ((Geometry) value).convertToWKB();
265
                                debug.append("/*");
266
                                debug.append(columnIndex);
267
                                debug.append("*/ ");
268
                                debug.append(as_string(bytes));
269
                                debug.append(", ");
270
                                break;
271
                            case EWKB:
272
                                bytes = ((Geometry) value).convertToEWKB();
273
                                debug.append("/*");
274
                                debug.append(columnIndex);
275
                                debug.append("*/ ");
276
                                debug.append(as_string(bytes));
277
                                debug.append(", ");
278
                                break;
279
                        }
280
                    } else {
281
                        debug.append("/*");
282
                        debug.append(columnIndex);
283
                        debug.append("*/ ");
284
                        if( value instanceof String ) {
285
                            debug.append(as_string(value));
286
                        } else if( value instanceof Boolean ) {
287
                            debug.append( ((Boolean)value)? constant_true:constant_false );
288
                        } else {
289
                            debug.append(value);
290
                        }
291
                        debug.append(", ");
292
                    }
293
                    columnIndex++;
294
                }
295
                debug.append(")");
296
                LOGGER.debug(debug.toString());
297
            } catch(Exception ex) {
298
            }        
299
        }
300
        byte[] bytes;
301
        int columnIndex = 1;
302
        try {
303
            for (Object value : values) {
304
                if (value instanceof Geometry) {
305
                    switch(geometrySupportType) {
306
                        case WKT:
307
                            value = ((Geometry) value).convertToWKT();
308
                            st.setObject(columnIndex, value);
309
                            break;
310
                        case NATIVE:
311
                        case WKB: 
312
                            bytes = ((Geometry) value).convertToWKB();
313
                            st.setBytes(columnIndex, bytes);
314
                            break;
315
                        case EWKB:
316
                            bytes = ((Geometry) value).convertToEWKB();
317
                            st.setBytes(columnIndex, bytes);
318
                            break;
319
                    }
320
                } else {
321
                        st.setObject(columnIndex, value);
322
                    }
323
                columnIndex++;
324
            }
325
            return new Disposable() {
326
                @Override
327
                public void dispose() {
328
                }
329
            };
330
        } catch(Exception ex) {
331
            throw new SQLException("Can't set values for the prepared statement.", ex);
332
        }        
333
    }
334
}