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

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

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