Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extJDBC / src / com / iver / cit / gvsig / fmap / drivers / jdbc / postgis / PostGISWriter.java @ 10626

History | View | Annotate | Download (7.99 KB)

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

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

    
10
import com.hardcode.gdbms.driver.exceptions.InitializeWriterException;
11
import com.hardcode.gdbms.driver.exceptions.WriteDriverException;
12
import com.hardcode.gdbms.engine.data.driver.DriverException;
13
import com.iver.cit.gvsig.exceptions.visitors.ProcessWriterVisitorException;
14
import com.iver.cit.gvsig.exceptions.visitors.StartWriterVisitorException;
15
import com.iver.cit.gvsig.exceptions.visitors.StopWriterVisitorException;
16
import com.iver.cit.gvsig.fmap.core.FShape;
17
import com.iver.cit.gvsig.fmap.core.IFeature;
18
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
19
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
20
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
21
import com.iver.cit.gvsig.fmap.edition.IFieldManager;
22
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
23
import com.iver.cit.gvsig.fmap.edition.ISpatialWriter;
24
import com.iver.cit.gvsig.fmap.edition.fieldmanagers.JdbcFieldManager;
25
import com.iver.cit.gvsig.fmap.edition.writers.AbstractWriter;
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 InitializeWriterException
52
         * @throws IOException
53
         * @throws DriverException
54
         */
55
        public void initialize(ITableDefinition lyrD) throws InitializeWriterException {
56
                super.initialize(lyrD);
57
                this.lyrDef = (DBLayerDefinition) lyrD;
58
                conex = lyrDef.getConnection();
59

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

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

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

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

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

    
96
                } catch (SQLException e) {
97
                        throw new InitializeWriterException(getName(),e);
98
                }
99

    
100
        }
101

    
102
        public void preProcess() throws StartWriterVisitorException {
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
                        throw new StartWriterVisitorException(getName(),e);
125
                } catch (WriteDriverException e) {
126
                        throw new StartWriterVisitorException(getName(),e);
127
                }
128

    
129
        }
130

    
131
        public void process(IRowEdited row) throws ProcessWriterVisitorException {
132

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

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

    
169
                                break;
170
                        }
171

    
172
                        numRows++;
173
                } catch (SQLException e) {
174
                        throw new ProcessWriterVisitorException(getName(),e);
175
                }
176

    
177
        }
178

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

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

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

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

    
228
                }
229

    
230
                return false;
231
        }
232

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

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

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

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

    
263

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

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

    
272
        public void addField(FieldDescription fieldDesc) {
273
                fieldManager.addField(fieldDesc);
274

    
275
        }
276

    
277
        public FieldDescription removeField(String fieldName) {
278
                return fieldManager.removeField(fieldName);
279

    
280
        }
281

    
282
        public void renameField(String antName, String newName) {
283
                fieldManager.renameField(antName, newName);
284

    
285
        }
286

    
287
        public boolean alterTable() throws WriteDriverException  {
288
                return fieldManager.alterTable();
289
        }
290

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

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

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

    
310
}