Revision 445 trunk/org.gvsig.postgresql/org.gvsig.postgresql.provider/src/main/java/org/gvsig/postgresql/dal/PostgreSQLHelper.java

View differences:

PostgreSQLHelper.java
2 2
package org.gvsig.postgresql.dal;
3 3

  
4 4
import java.sql.Connection;
5
import java.sql.PreparedStatement;
6 5
import java.sql.SQLException;
7
import java.util.ArrayList;
8
import java.util.List;
9 6
import org.apache.commons.dbcp.BasicDataSource;
10 7
import org.apache.commons.lang3.BooleanUtils;
11 8
import org.apache.commons.lang3.StringUtils;
12
import org.gvsig.fmap.dal.DataTypes;
13
import org.gvsig.fmap.dal.ExpressionBuilder;
14 9
import org.gvsig.fmap.dal.SQLBuilder;
15
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
16
import org.gvsig.fmap.dal.feature.FeatureType;
17
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
18 10
import org.gvsig.fmap.dal.resource.exception.AccessResourceException;
19 11
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
20 12
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
......
25 17
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCHelperBase;
26 18
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
27 19
import org.gvsig.fmap.dal.store.jdbc2.spi.SRSSolverBase;
28
import org.gvsig.fmap.geom.Geometry;
29
import org.gvsig.fmap.geom.aggregate.MultiLine;
30
import org.gvsig.fmap.geom.aggregate.MultiPoint;
31
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
32
import org.gvsig.fmap.geom.exception.CreateGeometryException;
33
import org.gvsig.fmap.geom.primitive.Primitive;
34
import org.gvsig.fmap.geom.type.GeometryType;
35 20
import org.gvsig.postgresql.dal.operations.PostgreSQLOperationsFactory;
36
import org.gvsig.tools.dispose.Disposable;
37 21
import org.slf4j.Logger;
38 22
import org.slf4j.LoggerFactory;
39 23

  
......
220 204
         this.connectionProvider.closeConnection(connection);
221 205
    }
222 206
    
223
    
224
    
225 207
    @Override
226 208
    public PostgreSQLConnectionParameters getConnectionParameters() {
227 209
        return (PostgreSQLConnectionParameters) super.getConnectionParameters();
......
311 293
    public JDBCServerExplorerParameters createServerExplorerParameters() {
312 294
        return new PostgreSQLServerExplorerParameters();
313 295
    }
314

  
315
    public Disposable setPreparedStatementParameters(PreparedStatement st, JDBCSQLBuilderBase sqlbuilder, FeatureType type, FeatureProvider feature) {
316
        try {
317
            List<Object> values = new ArrayList<>();
318
            for (ExpressionBuilder.Parameter parameter : sqlbuilder.getParameters()) {
319
                Object value;
320
                if (parameter.is_constant()) {
321
                    value = parameter.getValue();
322
                } else {
323
                    String name = parameter.getName();
324
                    value = feature.get(name);
325
                    FeatureAttributeDescriptor attr = type.getAttributeDescriptor(name);
326
                    if( attr.getType()==DataTypes.GEOMETRY ) {
327
                        value = forceGeometry(attr.getGeomType(), (Geometry) value);
328
                    }
329
                }
330
                values.add(value);
331
            }
332
            return sqlbuilder.setStatementParameters(st, values, sqlbuilder.geometry_support_type());
333
        } catch (Exception ex) {
334
            String f = "unknow";
335
            try {
336
                f = feature.toString();
337
            } catch (Exception ex2) {
338
                // Do nothing
339
            }
340
            throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex);
341
        }
342
    }
343
    
344
    private Geometry forceGeometry(GeometryType geomtype, Geometry geom) throws CreateGeometryException {
345
        if( geom == null ) {
346
            return null;
347
        }
348
        switch( geomtype.getType() ) {
349
        case Geometry.TYPES.MULTIPOLYGON:
350
            if( geom.getType()==Geometry.TYPES.POLYGON ) {
351
                MultiPolygon x = getGeometryManager().createMultiPolygon(geomtype.getSubType());
352
                x.addPrimitive((Primitive) geom);
353
                geom = x;
354
            }
355
            break;
356
        case Geometry.TYPES.MULTILINE:
357
            if( geom.getType()==Geometry.TYPES.LINE ) {
358
                MultiLine x = getGeometryManager().createMultiLine(geomtype.getSubType());
359
                x.addPrimitive((Primitive) geom);
360
                geom = x;
361
            }
362
            break;
363
        case Geometry.TYPES.MULTIPOINT:
364
            if( geom.getType()==Geometry.TYPES.POINT ) {
365
                MultiLine x = getGeometryManager().createMultiLine(geomtype.getSubType());
366
                x.addPrimitive((Primitive) geom);
367
                geom = x;
368
            }
369
            break;
370
        case Geometry.TYPES.POLYGON:
371
            if( geom.getType()==Geometry.TYPES.MULTIPOLYGON ) {
372
                MultiPolygon x = (MultiPolygon) geom;
373
                if( x.getPrimitivesNumber()==1 ) {
374
                    geom = x.getPrimitiveAt(0);
375
                }
376
            }
377
            break;
378
        case Geometry.TYPES.LINE:
379
            if( geom.getType()==Geometry.TYPES.MULTILINE ) {
380
                MultiLine x = (MultiLine) geom;
381
                if( x.getPrimitivesNumber()==1 ) {
382
                    geom = x.getPrimitiveAt(0);
383
                }
384
            }
385
            break;
386
        case Geometry.TYPES.POINT:
387
            if( geom.getType()==Geometry.TYPES.MULTIPOINT ) {
388
                MultiPoint x = (MultiPoint) geom;
389
                if( x.getPrimitivesNumber()==1 ) {
390
                    geom = x.getPrimitiveAt(0);
391
                }
392
            }
393
        }
394
        return geom;
395
    }
396
    
397

  
398 296
}

Also available in: Unified diff