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 / operations / FetchFeatureProviderByReferenceOperation.java @ 43093

History | View | Annotate | Download (4.16 KB)

1

    
2
package org.gvsig.fmap.dal.store.jdbc2.spi.operations;
3

    
4
import java.sql.Connection;
5
import java.sql.PreparedStatement;
6
import java.sql.ResultSet;
7
import java.sql.SQLException;
8
import org.gvsig.fmap.dal.exception.DataException;
9
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
10
import org.gvsig.fmap.dal.feature.FeatureType;
11
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
12
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
13
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCSQLException;
14
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
15
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
16
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
17
import org.gvsig.fmap.geom.DataTypes;
18

    
19

    
20
public class FetchFeatureProviderByReferenceOperation extends AbstractConnectionOperation {
21
    private final FeatureType featureType;
22
    private final FeatureReferenceProviderServices reference;
23
    private final String schema;
24
    private final String table;
25
    private final String database;
26

    
27
    public FetchFeatureProviderByReferenceOperation(
28
            JDBCHelper helper,
29
            FeatureReferenceProviderServices reference,
30
            FeatureType featureType,
31
            String database,
32
            String schema,
33
            String table
34
        ) {
35
        super(helper);
36
        this.reference = reference;
37
        this.database = database;
38
        this.schema = schema;
39
        this.table = table;
40
        this.featureType = featureType;
41
    }
42

    
43
    @Override
44
    public final Object perform(Connection conn) throws DataException {
45
        FeatureProvider feature = fetchFeatureProviderByReference(
46
                conn,
47
                reference, 
48
                featureType,
49
                database,
50
                schema,
51
                table
52
        );
53
        return feature;
54
    }
55
       
56
    public FeatureProvider fetchFeatureProviderByReference(
57
            Connection conn,
58
            FeatureReferenceProviderServices reference,
59
            // FeatureType storeType,
60
            FeatureType featureType,
61
            String database,
62
            String schema,
63
            String table
64
        ) throws DataException {
65
        
66
        // FeatureAttributeDescriptor[] primaryKey = storeType.getPrimaryKey();
67
        String[] primaryKeys = reference.getKeyNames();
68
        
69
        JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
70
        
71
        for (FeatureAttributeDescriptor attr : featureType) {
72
            if( attr.getType()==DataTypes.GEOMETRY ) {
73
                sqlbuilder.select().column().name(attr.getName()).as_geometry();
74
            } else {
75
                sqlbuilder.select().column().name(attr.getName());
76
            }
77
        }
78
        sqlbuilder.select().from().table().database(database).schema(schema).name(table);
79
        for (String name : primaryKeys )  {
80
            if( !sqlbuilder.select().has_column(name) ) {
81
                sqlbuilder.select().column().name(name);
82
            }
83
            Object value = reference.getKeyValue(name);
84
            if( value == null ) {
85
                sqlbuilder.select().where().and(
86
                    sqlbuilder.isNull(sqlbuilder.column(name))
87
                );                
88
            } else {
89
                sqlbuilder.select().where().and(
90
                    sqlbuilder.eq(
91
                        sqlbuilder.column(name), 
92
                        sqlbuilder.parameter(name).value(value)
93
                    )
94
                );              
95
            }
96
        }
97
        sqlbuilder.select().limit(1);
98

    
99
        String sql = sqlbuilder.select().toString();
100

    
101
        PreparedStatement st = null;
102
        ResultSet rs = null;
103
        try {
104
            st = conn.prepareStatement(sql);
105
            sqlbuilder.setParameters(st);
106
            rs = JDBCUtils.executeQuery(st, sql);
107
            if (!rs.next()) {
108
                return null;
109
            }
110
            FeatureProvider data = this.helper.createFeature(featureType);
111
            this.helper.fetchFeature(data, rs);
112
            return data;
113

    
114
        } catch (SQLException ex) {
115
            throw new JDBCSQLException(ex);
116
        } finally {
117
            JDBCUtils.closeQuietly(st);
118
            JDBCUtils.closeQuietly(rs);
119
        }        
120
    }
121
    
122
}