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 @ 43687
History | View | Annotate | Download (8.7 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 | return srscode;
|
||
58 | } catch (Exception ex) { |
||
59 | throw new RuntimeException("Can't locate database code for SRS '"+projection.getAbrev()+"'."); |
||
60 | } finally {
|
||
61 | JDBCUtils.closeQuietly(conn); |
||
62 | } |
||
63 | } |
||
64 | |||
65 | 43093 | jjdelcerro | public void setParameters(PreparedStatement st) { |
66 | try {
|
||
67 | int columnIndex = 1; |
||
68 | for (Parameter parameter : this.getParameters()) { |
||
69 | st.setObject(columnIndex++, parameter.getValue()); |
||
70 | } |
||
71 | } catch (Exception ex) { |
||
72 | String p = "unknow"; |
||
73 | try {
|
||
74 | p = this.getParameters().toString();
|
||
75 | } catch (Exception ex2) { |
||
76 | // Do nothing
|
||
77 | } |
||
78 | throw new RuntimeException("Can't set parameters to prepared statement from parameters (" + p + ")", ex); |
||
79 | } |
||
80 | } |
||
81 | |||
82 | 43629 | jjdelcerro | public Disposable setParameters(PreparedStatement st, FeatureProvider feature) { |
83 | 43020 | jjdelcerro | try {
|
84 | 43687 | jjdelcerro | FeatureType type = feature.getType(); |
85 | 43020 | jjdelcerro | List<Object> values = new ArrayList<>(); |
86 | 43687 | jjdelcerro | Object value;
|
87 | 43020 | jjdelcerro | for (Parameter parameter : this.getParameters()) { |
88 | 43093 | jjdelcerro | if (parameter.is_constant()) {
|
89 | 43687 | jjdelcerro | value = parameter.getValue(); |
90 | values.add(value); |
||
91 | 43020 | jjdelcerro | } else {
|
92 | String name = parameter.getName();
|
||
93 | 43687 | jjdelcerro | value = feature.get(name); |
94 | FeatureAttributeDescriptor attrDesc = type.getAttributeDescriptor(name); |
||
95 | if( attrDesc.getType()==DataTypes.GEOMETRY ) {
|
||
96 | value = forceGeometryType(attrDesc.getGeomType(), (Geometry) value); |
||
97 | } |
||
98 | values.add(value); |
||
99 | 43020 | jjdelcerro | } |
100 | } |
||
101 | 43629 | jjdelcerro | return this.setStatementParameters(st, values, this.geometry_support_type()); |
102 | 43020 | jjdelcerro | } catch (Exception ex) { |
103 | 43093 | jjdelcerro | String f = "unknow"; |
104 | try {
|
||
105 | f = feature.toString(); |
||
106 | } catch (Exception ex2) { |
||
107 | // Do nothing
|
||
108 | } |
||
109 | throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex); |
||
110 | 43020 | jjdelcerro | } |
111 | } |
||
112 | 43687 | jjdelcerro | |
113 | protected Geometry forceGeometryType(GeometryType geomtype, Geometry geom) throws CreateGeometryException { |
||
114 | if( geom == null ) { |
||
115 | return null; |
||
116 | } |
||
117 | switch( geomtype.getType() ) {
|
||
118 | case Geometry.TYPES.MULTIPOLYGON:
|
||
119 | if( geom.getType()==Geometry.TYPES.POLYGON ) {
|
||
120 | MultiPolygon x = getGeometryManager().createMultiPolygon(geomtype.getSubType()); |
||
121 | x.addPrimitive((Primitive) geom); |
||
122 | geom = x; |
||
123 | } |
||
124 | break;
|
||
125 | case Geometry.TYPES.MULTILINE:
|
||
126 | if( geom.getType()==Geometry.TYPES.LINE ) {
|
||
127 | MultiLine x = getGeometryManager().createMultiLine(geomtype.getSubType()); |
||
128 | x.addPrimitive((Primitive) geom); |
||
129 | geom = x; |
||
130 | } |
||
131 | break;
|
||
132 | case Geometry.TYPES.MULTIPOINT:
|
||
133 | if( geom.getType()==Geometry.TYPES.POINT ) {
|
||
134 | MultiLine x = getGeometryManager().createMultiLine(geomtype.getSubType()); |
||
135 | x.addPrimitive((Primitive) geom); |
||
136 | geom = x; |
||
137 | } |
||
138 | break;
|
||
139 | case Geometry.TYPES.POLYGON:
|
||
140 | if( geom.getType()==Geometry.TYPES.MULTIPOLYGON ) {
|
||
141 | MultiPolygon x = (MultiPolygon) geom; |
||
142 | if( x.getPrimitivesNumber()==1 ) { |
||
143 | geom = x.getPrimitiveAt(0);
|
||
144 | } |
||
145 | } |
||
146 | break;
|
||
147 | case Geometry.TYPES.LINE:
|
||
148 | if( geom.getType()==Geometry.TYPES.MULTILINE ) {
|
||
149 | MultiLine x = (MultiLine) geom; |
||
150 | if( x.getPrimitivesNumber()==1 ) { |
||
151 | geom = x.getPrimitiveAt(0);
|
||
152 | } |
||
153 | } |
||
154 | break;
|
||
155 | case Geometry.TYPES.POINT:
|
||
156 | if( geom.getType()==Geometry.TYPES.MULTIPOINT ) {
|
||
157 | MultiPoint x = (MultiPoint) geom; |
||
158 | if( x.getPrimitivesNumber()==1 ) { |
||
159 | geom = x.getPrimitiveAt(0);
|
||
160 | } |
||
161 | } |
||
162 | } |
||
163 | return geom;
|
||
164 | } |
||
165 | |||
166 | 43629 | jjdelcerro | public Disposable setParameters(PreparedStatement st, FeatureReference reference) { |
167 | 43479 | jjdelcerro | try {
|
168 | |||
169 | List<Object> values = new ArrayList<>(); |
||
170 | for (Parameter parameter : this.getParameters()) { |
||
171 | if (parameter.is_constant()) {
|
||
172 | values.add(parameter.getValue()); |
||
173 | } else {
|
||
174 | String name = parameter.getName();
|
||
175 | values.add(((FeatureReferenceProviderServices)reference).getKeyValue(name)); |
||
176 | } |
||
177 | } |
||
178 | 43629 | jjdelcerro | return this.setStatementParameters(st, values, this.geometry_support_type()); |
179 | 43479 | jjdelcerro | } catch (Exception ex) { |
180 | String f = "unknow"; |
||
181 | try {
|
||
182 | f = reference.toString(); |
||
183 | } catch (Exception ex2) { |
||
184 | // Do nothing
|
||
185 | } |
||
186 | throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex); |
||
187 | } |
||
188 | } |
||
189 | |||
190 | 43629 | jjdelcerro | public Disposable setStatementParameters(
|
191 | PreparedStatement st,
|
||
192 | List values,
|
||
193 | GeometrySupportType geometrySupportType) throws SQLException { |
||
194 | |||
195 | if (values == null) { |
||
196 | return new Disposable() { |
||
197 | @Override
|
||
198 | public void dispose() { |
||
199 | } |
||
200 | }; |
||
201 | } |
||
202 | try {
|
||
203 | byte[] bytes; |
||
204 | int columnIndex = 1; |
||
205 | for (Object value : values) { |
||
206 | if (value instanceof Geometry) { |
||
207 | switch(geometrySupportType) {
|
||
208 | case WKT:
|
||
209 | value = ((Geometry) value).convertToWKT(); |
||
210 | st.setObject(columnIndex, value); |
||
211 | break;
|
||
212 | case NATIVE:
|
||
213 | case WKB:
|
||
214 | bytes = ((Geometry) value).convertToWKB(); |
||
215 | st.setBytes(columnIndex, bytes); |
||
216 | break;
|
||
217 | case EWKB:
|
||
218 | bytes = ((Geometry) value).convertToEWKB(); |
||
219 | st.setBytes(columnIndex, bytes); |
||
220 | break;
|
||
221 | } |
||
222 | } else {
|
||
223 | st.setObject(columnIndex, value); |
||
224 | } |
||
225 | columnIndex++; |
||
226 | } |
||
227 | return new Disposable() { |
||
228 | @Override
|
||
229 | public void dispose() { |
||
230 | } |
||
231 | }; |
||
232 | } catch(Exception ex) { |
||
233 | throw new SQLException("Can't set values for the prepared statement.", ex); |
||
234 | } |
||
235 | } |
||
236 | 43020 | jjdelcerro | } |