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

History | View | Annotate | Download (11.5 KB)

1 43020 jjdelcerro
package org.gvsig.fmap.dal.store.jdbc2.spi;
2
3 43687 jjdelcerro
import java.sql.Connection;
4 43020 jjdelcerro
import java.sql.PreparedStatement;
5 43629 jjdelcerro
import java.sql.SQLException;
6 43020 jjdelcerro
import java.util.ArrayList;
7
import java.util.List;
8 43687 jjdelcerro
import org.cresques.cts.IProjection;
9
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
10 43479 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureReference;
11 43687 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureType;
12 43093 jjdelcerro
import org.gvsig.fmap.dal.feature.spi.SQLBuilderBase;
13 43020 jjdelcerro
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
14 43479 jjdelcerro
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
15 43687 jjdelcerro
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 43629 jjdelcerro
import org.gvsig.fmap.geom.Geometry;
19 43687 jjdelcerro
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 43629 jjdelcerro
import org.gvsig.tools.dispose.Disposable;
28 43020 jjdelcerro
29
public class JDBCSQLBuilderBase extends SQLBuilderBase {
30
31 43687 jjdelcerro
    private GeometryManager geometryManager = null;
32
    protected final JDBCHelper helper;
33
34
    public JDBCSQLBuilderBase(JDBCHelper helper) {
35 43020 jjdelcerro
        super();
36 43687 jjdelcerro
        this.helper = helper;
37 43020 jjdelcerro
    }
38 43687 jjdelcerro
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 43737 jjdelcerro
//            logger.debug("database code srs {}, type {}, srssolver {}.",
58
//                new Object[] {
59
//                    srscode,
60
//                    srscode==null? "null":srscode.getClass().getSimpleName(),
61
//                    solver
62
//                }
63
//            );
64 43687 jjdelcerro
            return srscode;
65
        } catch (Exception ex) {
66
            throw new RuntimeException("Can't locate database code for SRS '"+projection.getAbrev()+"'.");
67
        } finally {
68
            JDBCUtils.closeQuietly(conn);
69
        }
70
    }
71
72 43093 jjdelcerro
    public void setParameters(PreparedStatement st) {
73
        try {
74
            int columnIndex = 1;
75
            for (Parameter parameter : this.getParameters()) {
76
                st.setObject(columnIndex++, parameter.getValue());
77
            }
78
        } catch (Exception ex) {
79
            String p = "unknow";
80
            try {
81
                p =  this.getParameters().toString();
82
            } catch (Exception ex2) {
83
                // Do nothing
84
            }
85
            throw new RuntimeException("Can't set parameters to prepared statement from parameters (" + p + ")", ex);
86
        }
87
    }
88
89 43629 jjdelcerro
    public Disposable setParameters(PreparedStatement st, FeatureProvider feature) {
90 43020 jjdelcerro
        try {
91 43687 jjdelcerro
            FeatureType type = feature.getType();
92 43020 jjdelcerro
            List<Object> values = new ArrayList<>();
93 43687 jjdelcerro
            Object value;
94 43020 jjdelcerro
            for (Parameter parameter : this.getParameters()) {
95 43093 jjdelcerro
                if (parameter.is_constant()) {
96 43687 jjdelcerro
                    value = parameter.getValue();
97
                    values.add(value);
98 43020 jjdelcerro
                } else {
99
                    String name = parameter.getName();
100 43687 jjdelcerro
                    value = feature.get(name);
101
                    FeatureAttributeDescriptor attrDesc = type.getAttributeDescriptor(name);
102
                    if( attrDesc.getType()==DataTypes.GEOMETRY ) {
103
                        value = forceGeometryType(attrDesc.getGeomType(), (Geometry) value);
104
                    }
105
                    values.add(value);
106 43020 jjdelcerro
                }
107
            }
108 43629 jjdelcerro
            return this.setStatementParameters(st, values, this.geometry_support_type());
109 43020 jjdelcerro
        } catch (Exception ex) {
110 43093 jjdelcerro
            String f = "unknow";
111
            try {
112
                f = feature.toString();
113
            } catch (Exception ex2) {
114
                // Do nothing
115
            }
116
            throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex);
117 43020 jjdelcerro
        }
118
    }
119 43687 jjdelcerro
120
    protected Geometry forceGeometryType(GeometryType geomtype, Geometry geom) throws CreateGeometryException {
121
        if( geom == null ) {
122
            return null;
123
        }
124
        switch( geomtype.getType() ) {
125
        case Geometry.TYPES.MULTIPOLYGON:
126
            if( geom.getType()==Geometry.TYPES.POLYGON ) {
127
                MultiPolygon x = getGeometryManager().createMultiPolygon(geomtype.getSubType());
128
                x.addPrimitive((Primitive) geom);
129
                geom = x;
130
            }
131
            break;
132
        case Geometry.TYPES.MULTILINE:
133
            if( geom.getType()==Geometry.TYPES.LINE ) {
134
                MultiLine x = getGeometryManager().createMultiLine(geomtype.getSubType());
135
                x.addPrimitive((Primitive) geom);
136
                geom = x;
137
            }
138
            break;
139
        case Geometry.TYPES.MULTIPOINT:
140
            if( geom.getType()==Geometry.TYPES.POINT ) {
141
                MultiLine x = getGeometryManager().createMultiLine(geomtype.getSubType());
142
                x.addPrimitive((Primitive) geom);
143
                geom = x;
144
            }
145
            break;
146
        case Geometry.TYPES.POLYGON:
147
            if( geom.getType()==Geometry.TYPES.MULTIPOLYGON ) {
148
                MultiPolygon x = (MultiPolygon) geom;
149
                if( x.getPrimitivesNumber()==1 ) {
150
                    geom = x.getPrimitiveAt(0);
151
                }
152
            }
153
            break;
154
        case Geometry.TYPES.LINE:
155
            if( geom.getType()==Geometry.TYPES.MULTILINE ) {
156
                MultiLine x = (MultiLine) geom;
157
                if( x.getPrimitivesNumber()==1 ) {
158
                    geom = x.getPrimitiveAt(0);
159
                }
160
            }
161
            break;
162
        case Geometry.TYPES.POINT:
163
            if( geom.getType()==Geometry.TYPES.MULTIPOINT ) {
164
                MultiPoint x = (MultiPoint) geom;
165
                if( x.getPrimitivesNumber()==1 ) {
166
                    geom = x.getPrimitiveAt(0);
167
                }
168
            }
169
        }
170
        return geom;
171
    }
172
173 43629 jjdelcerro
    public Disposable setParameters(PreparedStatement st, FeatureReference reference) {
174 43479 jjdelcerro
        try {
175
176
            List<Object> values = new ArrayList<>();
177
            for (Parameter parameter : this.getParameters()) {
178
                if (parameter.is_constant()) {
179
                    values.add(parameter.getValue());
180
                } else {
181
                    String name = parameter.getName();
182
                    values.add(((FeatureReferenceProviderServices)reference).getKeyValue(name));
183
                }
184
            }
185 43629 jjdelcerro
            return this.setStatementParameters(st, values, this.geometry_support_type());
186 43479 jjdelcerro
        } catch (Exception ex) {
187
            String f = "unknow";
188
            try {
189
                f = reference.toString();
190
            } catch (Exception ex2) {
191
                // Do nothing
192
            }
193
            throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex);
194
        }
195
    }
196
197 43629 jjdelcerro
    public Disposable setStatementParameters(
198
        PreparedStatement st,
199
        List values,
200
        GeometrySupportType geometrySupportType) throws SQLException {
201
202
        if (values == null) {
203
            return new Disposable() {
204
                @Override
205
                public void dispose() {
206
                }
207
            };
208
        }
209 43732 jjdelcerro
        if( logger.isDebugEnabled() ) {
210
            StringBuilder debug = new StringBuilder();
211
            debug.append("st.set(");
212
            try {
213
                byte[] bytes;
214
                int columnIndex = 1;
215
                for (Object value : values) {
216
                    if (value instanceof Geometry) {
217
                        switch(geometrySupportType) {
218
                            case WKT:
219
                                value = ((Geometry) value).convertToWKT();
220
                                debug.append("/*");
221
                                debug.append(columnIndex);
222
                                debug.append("*/ ");
223
                                debug.append(string((String) value));
224
                                debug.append(", ");
225
                                break;
226
                            case NATIVE:
227
                            case WKB:
228
                                bytes = ((Geometry) value).convertToWKB();
229
                                debug.append("/*");
230
                                debug.append(columnIndex);
231
                                debug.append("*/ ");
232
                                debug.append(bytearray(bytes));
233
                                debug.append(", ");
234
                                break;
235
                            case EWKB:
236
                                bytes = ((Geometry) value).convertToEWKB();
237
                                debug.append("/*");
238
                                debug.append(columnIndex);
239
                                debug.append("*/ ");
240
                                debug.append(bytearray(bytes));
241
                                debug.append(", ");
242
                                break;
243
                        }
244
                    } else {
245
                        debug.append("/*");
246
                        debug.append(columnIndex);
247
                        debug.append("*/ ");
248
                        if( value instanceof String ) {
249
                            debug.append(string((String) value));
250
                        } else if( value instanceof Boolean ) {
251
                            debug.append( ((Boolean)value)? config.getString(Config.constant_true):config.getString(Config.constant_false) );
252
                        } else {
253
                            debug.append(value);
254
                        }
255
                        debug.append(", ");
256
                    }
257
                    columnIndex++;
258
                }
259
                debug.append(")");
260
                logger.debug(debug.toString());
261
            } catch(Exception ex) {
262
            }
263
        }
264 43629 jjdelcerro
        try {
265
            byte[] bytes;
266
            int columnIndex = 1;
267
            for (Object value : values) {
268
                if (value instanceof Geometry) {
269
                    switch(geometrySupportType) {
270
                        case WKT:
271
                            value = ((Geometry) value).convertToWKT();
272
                            st.setObject(columnIndex, value);
273
                            break;
274
                        case NATIVE:
275
                        case WKB:
276
                            bytes = ((Geometry) value).convertToWKB();
277
                            st.setBytes(columnIndex, bytes);
278
                            break;
279
                        case EWKB:
280
                            bytes = ((Geometry) value).convertToEWKB();
281
                            st.setBytes(columnIndex, bytes);
282
                            break;
283
                    }
284
                } else {
285
                    st.setObject(columnIndex, value);
286
                }
287
                columnIndex++;
288
            }
289
            return new Disposable() {
290
                @Override
291
                public void dispose() {
292
                }
293
            };
294
        } catch(Exception ex) {
295
            throw new SQLException("Can't set values for the prepared statement.", ex);
296
        }
297
    }
298 43020 jjdelcerro
}