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

History | View | Annotate | Download (11.5 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.geom.DataTypes;
17
import org.gvsig.fmap.geom.Geometry;
18
import org.gvsig.fmap.geom.GeometryLocator;
19
import org.gvsig.fmap.geom.GeometryManager;
20
import org.gvsig.fmap.geom.aggregate.MultiLine;
21
import org.gvsig.fmap.geom.aggregate.MultiPoint;
22
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
23
import org.gvsig.fmap.geom.exception.CreateGeometryException;
24
import org.gvsig.fmap.geom.primitive.Primitive;
25
import org.gvsig.fmap.geom.type.GeometryType;
26
import org.gvsig.tools.dispose.Disposable;
27

    
28
public class JDBCSQLBuilderBase extends SQLBuilderBase {
29

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

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

    
196
    public Disposable setStatementParameters(
197
        PreparedStatement st, 
198
        List values, 
199
        GeometrySupportType geometrySupportType) throws SQLException {
200
        
201
        if (values == null) {
202
            return new Disposable() {
203
                @Override
204
                public void dispose() {
205
                }
206
            };
207
        }
208
        if( logger.isDebugEnabled() ) {
209
            StringBuilder debug = new StringBuilder();
210
            debug.append("st.set(");
211
            try {
212
                byte[] bytes;
213
                int columnIndex = 1;
214
                for (Object value : values) {
215
                    if (value instanceof Geometry) {
216
                        switch(geometrySupportType) {
217
                            case WKT:
218
                                value = ((Geometry) value).convertToWKT();
219
                                debug.append("/*");
220
                                debug.append(columnIndex);
221
                                debug.append("*/ ");
222
                                debug.append(string((String) value));
223
                                debug.append(", ");
224
                                break;
225
                            case NATIVE:
226
                            case WKB: 
227
                                bytes = ((Geometry) value).convertToWKB();
228
                                debug.append("/*");
229
                                debug.append(columnIndex);
230
                                debug.append("*/ ");
231
                                debug.append(bytearray(bytes));
232
                                debug.append(", ");
233
                                break;
234
                            case EWKB:
235
                                bytes = ((Geometry) value).convertToEWKB();
236
                                debug.append("/*");
237
                                debug.append(columnIndex);
238
                                debug.append("*/ ");
239
                                debug.append(bytearray(bytes));
240
                                debug.append(", ");
241
                                break;
242
                        }
243
                    } else {
244
                        debug.append("/*");
245
                        debug.append(columnIndex);
246
                        debug.append("*/ ");
247
                        if( value instanceof String ) {
248
                            debug.append(string((String) value));
249
                        } else if( value instanceof Boolean ) {
250
                            debug.append( ((Boolean)value)? config.getString(Config.constant_true):config.getString(Config.constant_false) );
251
                        } else {
252
                            debug.append(value);
253
                        }
254
                        debug.append(", ");
255
                    }
256
                    columnIndex++;
257
                }
258
                debug.append(")");
259
                logger.debug(debug.toString());
260
            } catch(Exception ex) {
261
            }        
262
        }
263
        try {
264
            byte[] bytes;
265
            int columnIndex = 1;
266
            for (Object value : values) {
267
                if (value instanceof Geometry) {
268
                    switch(geometrySupportType) {
269
                        case WKT:
270
                            value = ((Geometry) value).convertToWKT();
271
                            st.setObject(columnIndex, value);
272
                            break;
273
                        case NATIVE:
274
                        case WKB: 
275
                            bytes = ((Geometry) value).convertToWKB();
276
                            st.setBytes(columnIndex, bytes);
277
                            break;
278
                        case EWKB:
279
                            bytes = ((Geometry) value).convertToEWKB();
280
                            st.setBytes(columnIndex, bytes);
281
                            break;
282
                    }
283
                } else {
284
                    st.setObject(columnIndex, value);
285
                }
286
                columnIndex++;
287
            }
288
            return new Disposable() {
289
                @Override
290
                public void dispose() {
291
                }
292
            };
293
        } catch(Exception ex) {
294
            throw new SQLException("Can't set values for the prepared statement.", ex);
295
        }        
296
    }
297
}