Statistics
| Revision:

root / trunk / extensions / extJDBC / src / com / iver / cit / gvsig / fmap / drivers / jdbc / postgis / PostGISWriter.java @ 7161

History | View | Annotate | Download (7.8 KB)

1
package com.iver.cit.gvsig.fmap.drivers.jdbc.postgis;
2

    
3
import java.sql.Connection;
4
import java.sql.ResultSet;
5
import java.sql.SQLException;
6
import java.sql.Statement;
7
import java.sql.Types;
8
import java.util.ArrayList;
9

    
10
import com.iver.cit.gvsig.fmap.core.FShape;
11
import com.iver.cit.gvsig.fmap.core.IFeature;
12
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
13
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
14
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
15
import com.iver.cit.gvsig.fmap.edition.EditionException;
16
import com.iver.cit.gvsig.fmap.edition.IFieldManager;
17
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
18
import com.iver.cit.gvsig.fmap.edition.ISpatialWriter;
19
import com.iver.cit.gvsig.fmap.edition.fieldmanagers.AddFieldCommand;
20
import com.iver.cit.gvsig.fmap.edition.fieldmanagers.FieldCommand;
21
import com.iver.cit.gvsig.fmap.edition.fieldmanagers.JdbcFieldManager;
22
import com.iver.cit.gvsig.fmap.edition.fieldmanagers.RemoveFieldCommand;
23
import com.iver.cit.gvsig.fmap.edition.fieldmanagers.RenameFieldCommand;
24
import com.iver.cit.gvsig.fmap.edition.writers.AbstractWriter;
25
import com.iver.cit.gvsig.fmap.layers.FLayer;
26

    
27
public class PostGISWriter extends AbstractWriter implements ISpatialWriter, IFieldManager {
28

    
29
        private int numRows;
30

    
31
        private DBLayerDefinition lyrDef;
32

    
33
        private Connection conex;
34

    
35
        private Statement st;
36

    
37
        private boolean bCreateTable;
38

    
39
        private boolean bWriteAll;
40
        
41
        private PostGIS postGisSQL = new PostGIS();
42
        // private double flatness;
43
        
44
        private JdbcFieldManager fieldManager;
45

    
46
        /**
47
         * Useful to create a layer from scratch Call setFile before using this
48
         * function
49
         * 
50
         * @param lyrDef
51
         * @throws IOException
52
         * @throws DriverException
53
         */
54
        public void initialize(ITableDefinition lyrD) throws EditionException {
55
                super.initialize(lyrD);
56
                this.lyrDef = (DBLayerDefinition) lyrD;
57
                conex = lyrDef.getConnection();
58

    
59
                try {
60
                        st = conex.createStatement();
61

    
62
                        if (bCreateTable) {
63
                                try {
64
                                        st.execute("DROP TABLE " + lyrDef.getTableName() + ";");
65
                                } catch (SQLException e1) {
66
                                        // Si no existe la tabla, no hay que borrarla.
67
                                }
68

    
69
                                String sqlCreate = postGisSQL.getSqlCreateSpatialTable(lyrDef,
70
                                                lyrDef.getFieldsDesc(), true);
71
                                System.out.println("sqlCreate =" + sqlCreate);
72
                                st.execute(sqlCreate);
73

    
74
                                String sqlAlter = postGisSQL.getSqlAlterTable(lyrDef);
75
                                System.out.println("sqlAlter =" + sqlAlter);
76
                                st.execute(sqlAlter);
77
                                // CREATE TABLE PARKS ( PARK_ID int4, PARK_NAME varchar(128),
78
                                // PARK_DATE date, PARK_TYPE varchar(2) );
79
                                // SELECT AddGeometryColumn('parks_db', 'parks', 'park_geom',
80
                                // 128,
81
                                // 'MULTIPOLYGON', 2 );
82

    
83
                                /*
84
                                 * BEGIN; INSERT INTO ROADS_GEOM (ID,GEOM,NAME ) VALUES
85
                                 * (1,GeometryFromText('LINESTRING(191232 243118,191108
86
                                 * 243242)',-1),'Jeff Rd'); INSERT INTO ROADS_GEOM (ID,GEOM,NAME )
87
                                 * VALUES (2,GeometryFromText('LINESTRING(189141 244158,189265
88
                                 * 244817)',-1),'Geordie Rd'); COMMIT;
89
                                 */
90
                                conex.commit();
91
                        }
92
                        conex.setAutoCommit(false);
93
                        fieldManager = new JdbcFieldManager(conex, lyrDef.getTableName());
94

    
95
                } catch (SQLException e) {
96
                        e.printStackTrace();
97
                        throw new EditionException(e);
98
                }
99

    
100
        }
101

    
102
        public void preProcess() throws EditionException {
103
                numRows = 0;
104
        // ATENTION: We will transform (in PostGIS class; doubleQuote())
105
        // to UTF-8 strings. Then, we tell the PostgreSQL server
106
        // that we will use UTF-8, and it can translate
107
        // to its charset
108
        // Note: we have to translate to UTF-8 because
109
        // the server cannot manage UTF-16
110
                
111
        ResultSet rsAux;
112
                try {
113
                        conex.rollback();                        
114
                        alterTable();
115

    
116
                        rsAux = st.executeQuery("SHOW server_encoding;");
117
                rsAux.next();
118
                String serverEncoding = rsAux.getString(1);
119
                System.out.println("Server encoding = " + serverEncoding);
120
                // st.execute("SET CLIENT_ENCODING TO 'UNICODE';");
121
                // Intentamos convertir nuestras cadenas a ese encode.
122
                postGisSQL.setEncoding(serverEncoding);
123
                } catch (SQLException e) {
124
                        // TODO Auto-generated catch block
125
                        e.printStackTrace();
126
                }
127

    
128
        }
129

    
130
        public void process(IRowEdited row) throws EditionException {
131

    
132
                String sqlInsert;
133
                try {
134
                        // System.out.println("Escribiendo numReg=" + numReg + " con
135
                        // STATUS=" + row.getStatus());
136
                        switch (row.getStatus()) {
137
                        case IRowEdited.STATUS_ADDED:
138
                                IFeature feat = (IFeature) row.getLinkedRow();
139
                                sqlInsert = postGisSQL.getSqlInsertFeature(lyrDef, feat);
140
                                System.out.println("sql = " + sqlInsert);
141
                                st.execute(sqlInsert);
142

    
143
                                break;
144
                        case IRowEdited.STATUS_MODIFIED:
145
                                IFeature featM = (IFeature) row.getLinkedRow();
146
                                if (bWriteAll) {
147
                                        sqlInsert = postGisSQL.getSqlInsertFeature(lyrDef, featM);
148
                                        System.out.println("sql = " + sqlInsert);
149
                                        st.execute(sqlInsert);
150
                                } else {
151
                                        String sqlModify = postGisSQL.getSqlModifyFeature(lyrDef, featM);
152
                                        System.out.println("sql = " + sqlModify);
153
                                        st.execute(sqlModify);
154
                                }
155
                                break;
156
                        case IRowEdited.STATUS_ORIGINAL:
157
                                IFeature featO = (IFeature) row.getLinkedRow();
158
                                if (bWriteAll) {
159
                                        sqlInsert = postGisSQL.getSqlInsertFeature(lyrDef, featO);
160
                                        st.execute(sqlInsert);
161
                                }
162
                                break;
163
                        case IRowEdited.STATUS_DELETED:
164
                                String sqlDelete = postGisSQL.getSqlDeleteFeature(lyrDef, row);
165
                                System.out.println("sql = " + sqlDelete);
166
                                st.execute(sqlDelete);
167

    
168
                                break;
169
                        }
170

    
171
                        numRows++;
172
                } catch (SQLException e) {
173
                        e.printStackTrace();
174
                        throw new EditionException(e);
175
                }
176

    
177
        }
178

    
179
        public void postProcess() throws EditionException {
180
                try {
181
                        conex.setAutoCommit(true);
182
                } catch (SQLException e) {
183
                        e.printStackTrace();
184
                        throw new EditionException(e);
185
                }
186
        }
187

    
188
        public String getName() {
189
                return "PostGIS Writer";
190
        }
191

    
192
        public boolean canWriteGeometry(int gvSIGgeometryType) {
193
                switch (gvSIGgeometryType) {
194
                case FShape.POINT:
195
                        return true;
196
                case FShape.LINE:
197
                        return true;
198
                case FShape.POLYGON:
199
                        return true;
200
                case FShape.ARC:
201
                        return false;
202
                case FShape.ELLIPSE:
203
                        return false;
204
                case FShape.MULTIPOINT:
205
                        return true;
206
                case FShape.TEXT:
207
                        return false;
208
                }
209
                return false;
210
        }
211

    
212
        public boolean canWriteAttribute(int sqlType) {
213
                switch (sqlType) {
214
                case Types.DOUBLE:
215
                case Types.FLOAT:
216
                case Types.INTEGER:
217
                case Types.BIGINT:
218
                        return true;
219
                case Types.DATE:
220
                        return true;
221
                case Types.BIT:
222
                case Types.BOOLEAN:
223
                        return true;
224
                case Types.VARCHAR:
225
                case Types.CHAR:
226
                case Types.LONGVARCHAR:
227
                        return true; 
228

    
229
                }
230

    
231
                return false;
232
        }
233

    
234
        /**
235
         * @return Returns the bCreateTable.
236
         */
237
        public boolean isCreateTable() {
238
                return bCreateTable;
239
        }
240

    
241
        /**
242
         * @param createTable
243
         *            The bCreateTable to set.
244
         */
245
        public void setCreateTable(boolean createTable) {
246
                bCreateTable = createTable;
247
        }
248

    
249
        /**
250
         * @return Returns the bWriteAll.
251
         */
252
        public boolean isWriteAll() {
253
                return bWriteAll;
254
        }
255

    
256
        /**
257
         * @param writeAll
258
         *            The bWriteAll to set.
259
         */
260
        public void setWriteAll(boolean writeAll) {
261
                bWriteAll = writeAll;
262
        }
263

    
264

    
265
//        public void setFlatness(double flatness) {
266
//                this.flatness = flatness;
267
//        }
268

    
269
        public FieldDescription[] getOriginalFields() {
270
                return lyrDef.getFieldsDesc();
271
        }
272

    
273
        public void addField(FieldDescription fieldDesc) {
274
                fieldManager.addField(fieldDesc);
275
                
276
        }
277

    
278
        public FieldDescription removeField(String fieldName) {
279
                return fieldManager.removeField(fieldName);
280
                
281
        }
282

    
283
        public void renameField(String antName, String newName) {
284
                fieldManager.renameField(antName, newName);
285
                
286
        }
287

    
288
        public boolean alterTable() throws EditionException {
289
                return fieldManager.alterTable();
290
        }
291

    
292
        public FieldDescription[] getFields() {
293
                return fieldManager.getFields();
294
        }
295

    
296
        public boolean canAlterTable() {
297
                return true;
298
        }
299

    
300
        public boolean canSaveEdits() {
301
                // TODO: Revisar los permisos de la tabla en cuesti?n.
302
                try {
303
                        return !conex.isReadOnly();
304
                } catch (SQLException e) {
305
                        // TODO Auto-generated catch block
306
                        e.printStackTrace();
307
                        return false;
308
                }
309
        }
310

    
311
}