root / branches / v10 / extensions / extJDBC / src / com / iver / cit / gvsig / fmap / drivers / jdbc / postgis / PostGISWriter.java @ 8913
History | View | Annotate | Download (7.46 KB)
1 | 4740 | fjp | package com.iver.cit.gvsig.fmap.drivers.jdbc.postgis; |
---|---|---|---|
2 | |||
3 | import java.sql.Connection; |
||
4 | 5492 | fjp | import java.sql.ResultSet; |
5 | 4740 | fjp | import java.sql.SQLException; |
6 | import java.sql.Statement; |
||
7 | import java.sql.Types; |
||
8 | 6211 | fjp | import java.util.ArrayList; |
9 | 4740 | fjp | |
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 | 6211 | fjp | import com.iver.cit.gvsig.fmap.drivers.FieldDescription; |
14 | 5558 | fjp | import com.iver.cit.gvsig.fmap.drivers.ITableDefinition; |
15 | 4740 | fjp | import com.iver.cit.gvsig.fmap.edition.EditionException; |
16 | 6211 | fjp | import com.iver.cit.gvsig.fmap.edition.IFieldManager; |
17 | 4740 | fjp | import com.iver.cit.gvsig.fmap.edition.IRowEdited; |
18 | import com.iver.cit.gvsig.fmap.edition.ISpatialWriter; |
||
19 | 6211 | fjp | 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 | 4740 | fjp | import com.iver.cit.gvsig.fmap.edition.writers.AbstractWriter; |
25 | import com.iver.cit.gvsig.fmap.layers.FLayer; |
||
26 | |||
27 | 6211 | fjp | public class PostGISWriter extends AbstractWriter implements ISpatialWriter, IFieldManager { |
28 | 4740 | fjp | |
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 | 8765 | jjdelcerro | private PostGIS postGisSQL = new PostGIS(); |
40 | 6825 | fjp | // private double flatness;
|
41 | 6211 | fjp | |
42 | private JdbcFieldManager fieldManager;
|
||
43 | 4740 | fjp | |
44 | /**
|
||
45 | * Useful to create a layer from scratch Call setFile before using this
|
||
46 | * function
|
||
47 | *
|
||
48 | * @param lyrDef
|
||
49 | * @throws IOException
|
||
50 | * @throws DriverException
|
||
51 | */
|
||
52 | 5558 | fjp | public void initialize(ITableDefinition lyrD) throws EditionException { |
53 | 6313 | fjp | super.initialize(lyrD);
|
54 | 4740 | fjp | this.lyrDef = (DBLayerDefinition) lyrD;
|
55 | conex = lyrDef.getConnection(); |
||
56 | |||
57 | try {
|
||
58 | st = conex.createStatement(); |
||
59 | |||
60 | if (bCreateTable) {
|
||
61 | try {
|
||
62 | st.execute("DROP TABLE " + lyrDef.getTableName() + ";"); |
||
63 | } catch (SQLException e1) { |
||
64 | // Si no existe la tabla, no hay que borrarla.
|
||
65 | } |
||
66 | |||
67 | 8765 | jjdelcerro | String sqlCreate = postGisSQL.getSqlCreateSpatialTable(lyrDef,
|
68 | 4748 | fjp | lyrDef.getFieldsDesc(), true);
|
69 | 4740 | fjp | System.out.println("sqlCreate =" + sqlCreate); |
70 | st.execute(sqlCreate); |
||
71 | |||
72 | 8765 | jjdelcerro | String sqlAlter = postGisSQL.getSqlAlterTable(lyrDef);
|
73 | 4740 | fjp | System.out.println("sqlAlter =" + sqlAlter); |
74 | st.execute(sqlAlter); |
||
75 | // CREATE TABLE PARKS ( PARK_ID int4, PARK_NAME varchar(128),
|
||
76 | // PARK_DATE date, PARK_TYPE varchar(2) );
|
||
77 | // SELECT AddGeometryColumn('parks_db', 'parks', 'park_geom',
|
||
78 | // 128,
|
||
79 | // 'MULTIPOLYGON', 2 );
|
||
80 | |||
81 | /*
|
||
82 | * BEGIN; INSERT INTO ROADS_GEOM (ID,GEOM,NAME ) VALUES
|
||
83 | * (1,GeometryFromText('LINESTRING(191232 243118,191108
|
||
84 | * 243242)',-1),'Jeff Rd'); INSERT INTO ROADS_GEOM (ID,GEOM,NAME )
|
||
85 | * VALUES (2,GeometryFromText('LINESTRING(189141 244158,189265
|
||
86 | * 244817)',-1),'Geordie Rd'); COMMIT;
|
||
87 | */
|
||
88 | 6621 | fjp | conex.commit(); |
89 | 4740 | fjp | } |
90 | conex.setAutoCommit(false);
|
||
91 | 6211 | fjp | fieldManager = new JdbcFieldManager(conex, lyrDef.getTableName());
|
92 | 4740 | fjp | |
93 | } catch (SQLException e) { |
||
94 | e.printStackTrace(); |
||
95 | throw new EditionException(e); |
||
96 | } |
||
97 | |||
98 | } |
||
99 | |||
100 | public void preProcess() throws EditionException { |
||
101 | numRows = 0;
|
||
102 | 5492 | fjp | // ATENTION: We will transform (in PostGIS class; doubleQuote())
|
103 | // to UTF-8 strings. Then, we tell the PostgreSQL server
|
||
104 | // that we will use UTF-8, and it can translate
|
||
105 | // to its charset
|
||
106 | // Note: we have to translate to UTF-8 because
|
||
107 | // the server cannot manage UTF-16
|
||
108 | 6211 | fjp | |
109 | 5492 | fjp | ResultSet rsAux;
|
110 | try {
|
||
111 | 6621 | fjp | conex.rollback(); |
112 | alterTable(); |
||
113 | |||
114 | 5492 | fjp | rsAux = st.executeQuery("SHOW server_encoding;");
|
115 | rsAux.next(); |
||
116 | String serverEncoding = rsAux.getString(1); |
||
117 | System.out.println("Server encoding = " + serverEncoding); |
||
118 | // st.execute("SET CLIENT_ENCODING TO 'UNICODE';");
|
||
119 | // Intentamos convertir nuestras cadenas a ese encode.
|
||
120 | 8765 | jjdelcerro | postGisSQL.setEncoding(serverEncoding); |
121 | 5492 | fjp | } catch (SQLException e) { |
122 | // TODO Auto-generated catch block
|
||
123 | e.printStackTrace(); |
||
124 | } |
||
125 | 4740 | fjp | |
126 | } |
||
127 | |||
128 | public void process(IRowEdited row) throws EditionException { |
||
129 | 4799 | fjp | |
130 | 4740 | fjp | String sqlInsert;
|
131 | try {
|
||
132 | // System.out.println("Escribiendo numReg=" + numReg + " con
|
||
133 | // STATUS=" + row.getStatus());
|
||
134 | switch (row.getStatus()) {
|
||
135 | case IRowEdited.STATUS_ADDED:
|
||
136 | 4799 | fjp | IFeature feat = (IFeature) row.getLinkedRow(); |
137 | 8765 | jjdelcerro | sqlInsert = postGisSQL.getSqlInsertFeature(lyrDef, feat); |
138 | 4748 | fjp | System.out.println("sql = " + sqlInsert); |
139 | 4740 | fjp | st.execute(sqlInsert); |
140 | |||
141 | break;
|
||
142 | case IRowEdited.STATUS_MODIFIED:
|
||
143 | 4799 | fjp | IFeature featM = (IFeature) row.getLinkedRow(); |
144 | 4740 | fjp | if (bWriteAll) {
|
145 | 8765 | jjdelcerro | sqlInsert = postGisSQL.getSqlInsertFeature(lyrDef, featM); |
146 | 4799 | fjp | System.out.println("sql = " + sqlInsert); |
147 | 4740 | fjp | st.execute(sqlInsert); |
148 | } else {
|
||
149 | 8765 | jjdelcerro | String sqlModify = postGisSQL.getSqlModifyFeature(lyrDef, featM);
|
150 | 4799 | fjp | System.out.println("sql = " + sqlModify); |
151 | 4740 | fjp | st.execute(sqlModify); |
152 | } |
||
153 | break;
|
||
154 | case IRowEdited.STATUS_ORIGINAL:
|
||
155 | 4799 | fjp | IFeature featO = (IFeature) row.getLinkedRow(); |
156 | 4740 | fjp | if (bWriteAll) {
|
157 | 8765 | jjdelcerro | sqlInsert = postGisSQL.getSqlInsertFeature(lyrDef, featO); |
158 | 4740 | fjp | st.execute(sqlInsert); |
159 | } |
||
160 | break;
|
||
161 | case IRowEdited.STATUS_DELETED:
|
||
162 | 8765 | jjdelcerro | String sqlDelete = postGisSQL.getSqlDeleteFeature(lyrDef, row);
|
163 | 4799 | fjp | System.out.println("sql = " + sqlDelete); |
164 | 4740 | fjp | st.execute(sqlDelete); |
165 | |||
166 | break;
|
||
167 | } |
||
168 | |||
169 | numRows++; |
||
170 | } catch (SQLException e) { |
||
171 | e.printStackTrace(); |
||
172 | throw new EditionException(e); |
||
173 | } |
||
174 | |||
175 | } |
||
176 | |||
177 | public void postProcess() throws EditionException { |
||
178 | try {
|
||
179 | conex.setAutoCommit(true);
|
||
180 | } catch (SQLException e) { |
||
181 | e.printStackTrace(); |
||
182 | throw new EditionException(e); |
||
183 | } |
||
184 | } |
||
185 | |||
186 | public String getName() { |
||
187 | return "PostGIS Writer"; |
||
188 | } |
||
189 | |||
190 | public boolean canWriteGeometry(int gvSIGgeometryType) { |
||
191 | switch (gvSIGgeometryType) {
|
||
192 | case FShape.POINT:
|
||
193 | return true; |
||
194 | case FShape.LINE:
|
||
195 | return true; |
||
196 | case FShape.POLYGON:
|
||
197 | return true; |
||
198 | case FShape.ARC:
|
||
199 | return false; |
||
200 | case FShape.ELLIPSE:
|
||
201 | return false; |
||
202 | case FShape.MULTIPOINT:
|
||
203 | return true; |
||
204 | case FShape.TEXT:
|
||
205 | return false; |
||
206 | } |
||
207 | return false; |
||
208 | } |
||
209 | |||
210 | public boolean canWriteAttribute(int sqlType) { |
||
211 | switch (sqlType) {
|
||
212 | case Types.DOUBLE: |
||
213 | case Types.FLOAT: |
||
214 | case Types.INTEGER: |
||
215 | case Types.BIGINT: |
||
216 | return true; |
||
217 | case Types.DATE: |
||
218 | return true; |
||
219 | case Types.BIT: |
||
220 | case Types.BOOLEAN: |
||
221 | return true; |
||
222 | case Types.VARCHAR: |
||
223 | case Types.CHAR: |
||
224 | case Types.LONGVARCHAR: |
||
225 | return true; |
||
226 | |||
227 | } |
||
228 | |||
229 | return false; |
||
230 | } |
||
231 | |||
232 | /**
|
||
233 | * @return Returns the bCreateTable.
|
||
234 | */
|
||
235 | public boolean isCreateTable() { |
||
236 | return bCreateTable;
|
||
237 | } |
||
238 | |||
239 | /**
|
||
240 | * @param createTable
|
||
241 | * The bCreateTable to set.
|
||
242 | */
|
||
243 | public void setCreateTable(boolean createTable) { |
||
244 | bCreateTable = createTable; |
||
245 | } |
||
246 | |||
247 | 6211 | fjp | public FieldDescription[] getOriginalFields() { |
248 | return lyrDef.getFieldsDesc();
|
||
249 | } |
||
250 | |||
251 | public void addField(FieldDescription fieldDesc) { |
||
252 | fieldManager.addField(fieldDesc); |
||
253 | |||
254 | } |
||
255 | |||
256 | public FieldDescription removeField(String fieldName) { |
||
257 | return fieldManager.removeField(fieldName);
|
||
258 | |||
259 | } |
||
260 | |||
261 | public void renameField(String antName, String newName) { |
||
262 | fieldManager.renameField(antName, newName); |
||
263 | |||
264 | } |
||
265 | |||
266 | public boolean alterTable() throws EditionException { |
||
267 | return fieldManager.alterTable();
|
||
268 | } |
||
269 | |||
270 | public FieldDescription[] getFields() { |
||
271 | return fieldManager.getFields();
|
||
272 | } |
||
273 | |||
274 | 6621 | fjp | public boolean canAlterTable() { |
275 | return true; |
||
276 | } |
||
277 | |||
278 | 6859 | fjp | public boolean canSaveEdits() { |
279 | // TODO: Revisar los permisos de la tabla en cuesti?n.
|
||
280 | try {
|
||
281 | return !conex.isReadOnly();
|
||
282 | } catch (SQLException e) { |
||
283 | // TODO Auto-generated catch block
|
||
284 | e.printStackTrace(); |
||
285 | return false; |
||
286 | } |
||
287 | } |
||
288 | |||
289 | 4740 | fjp | } |