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

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

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

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

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

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

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