Statistics
| Revision:

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

History | View | Annotate | Download (8.02 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.ConnectionJDBC;
19
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
20
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
21
import com.iver.cit.gvsig.fmap.drivers.IConnection;
22
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
23
import com.iver.cit.gvsig.fmap.edition.IFieldManager;
24
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
25
import com.iver.cit.gvsig.fmap.edition.ISpatialWriter;
26
import com.iver.cit.gvsig.fmap.edition.fieldmanagers.JdbcFieldManager;
27
import com.iver.cit.gvsig.fmap.edition.writers.AbstractWriter;
28

    
29
public class PostGISWriter extends AbstractWriter implements ISpatialWriter, IFieldManager {
30

    
31
        private int numRows;
32

    
33
        private DBLayerDefinition lyrDef;
34

    
35
        private IConnection conex;
36

    
37
        private Statement st;
38

    
39
        private boolean bCreateTable;
40

    
41
        private boolean bWriteAll;
42

    
43
        private PostGIS postGisSQL = new PostGIS();
44
        // private double flatness;
45

    
46
        private JdbcFieldManager fieldManager;
47

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

    
62
                try {
63
                        st = ((ConnectionJDBC)conex).getConnection().createStatement();
64

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

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

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

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

    
98
                } catch (SQLException e) {
99
                        throw new InitializeWriterException(getName(),e);
100
                }
101

    
102
        }
103

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

    
113
        ResultSet rsAux;
114
                try {
115
                                ((ConnectionJDBC)conex).getConnection().rollback();
116
                        alterTable();
117

    
118
                        rsAux = st.executeQuery("SHOW server_encoding;");
119
                rsAux.next();
120
                String serverEncoding = rsAux.getString(1);
121
                System.out.println("Server encoding = " + serverEncoding);
122
                // st.execute("SET CLIENT_ENCODING TO 'UNICODE';");
123
                // Intentamos convertir nuestras cadenas a ese encode.
124
                postGisSQL.setEncoding(serverEncoding);
125
                } catch (SQLException e) {
126
                        throw new StartWriterVisitorException(getName(),e);
127
                } catch (WriteDriverException e) {
128
                        throw new StartWriterVisitorException(getName(),e);
129
                }
130

    
131
        }
132

    
133
        public void process(IRowEdited row) throws ProcessWriterVisitorException {
134

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

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

    
171
                                break;
172
                        }
173

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

    
179
        }
180

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

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

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

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

    
230
                }
231

    
232
                return false;
233
        }
234

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

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

    
250
        public FieldDescription[] getOriginalFields() {
251
                return lyrDef.getFieldsDesc();
252
        }
253

    
254
        public void addField(FieldDescription fieldDesc) {
255
                fieldManager.addField(fieldDesc);
256

    
257
        }
258

    
259
        public FieldDescription removeField(String fieldName) {
260
                return fieldManager.removeField(fieldName);
261

    
262
        }
263

    
264
        public void renameField(String antName, String newName) {
265
                fieldManager.renameField(antName, newName);
266

    
267
        }
268

    
269
        public boolean alterTable() throws WriteDriverException  {
270
                return fieldManager.alterTable();
271
        }
272

    
273
        public FieldDescription[] getFields() {
274
                return fieldManager.getFields();
275
        }
276

    
277
        public boolean canAlterTable() {
278
                return true;
279
        }
280

    
281
        public boolean canSaveEdits() {
282
                // TODO: Revisar los permisos de la tabla en cuesti?n.
283
                try {
284
                        return !((ConnectionJDBC)conex).getConnection().isReadOnly();
285
                } catch (SQLException e) {
286
                        // TODO Auto-generated catch block
287
                        e.printStackTrace();
288
                        return false;
289
                }
290
        }
291

    
292
}