Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extCAD / src / com / iver / cit / gvsig / SaveAs.java @ 4937

History | View | Annotate | Download (9.85 KB)

1
package com.iver.cit.gvsig;
2

    
3
import java.awt.Component;
4
import java.io.File;
5
import java.sql.Connection;
6
import java.sql.DriverManager;
7
import java.sql.SQLException;
8

    
9
import javax.swing.JFileChooser;
10
import javax.swing.JOptionPane;
11

    
12
import com.hardcode.driverManager.DriverLoadException;
13
import com.hardcode.gdbms.engine.values.Value;
14
import com.iver.andami.PluginServices;
15
import com.iver.andami.messages.NotificationManager;
16
import com.iver.andami.plugins.Extension;
17
import com.iver.cit.gvsig.fmap.DriverException;
18
import com.iver.cit.gvsig.fmap.FMap;
19
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
20
import com.iver.cit.gvsig.fmap.core.IFeature;
21
import com.iver.cit.gvsig.fmap.core.IGeometry;
22
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
23
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
24
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
25
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
26
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
27
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
28
import com.iver.cit.gvsig.fmap.edition.EditionException;
29
import com.iver.cit.gvsig.fmap.edition.IWriter;
30
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
31
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
32
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
33
import com.iver.cit.gvsig.fmap.layers.FBitSet;
34
import com.iver.cit.gvsig.fmap.layers.FLayer;
35
import com.iver.cit.gvsig.fmap.layers.FLayers;
36
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
37
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
38
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
39
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
40
import com.iver.cit.gvsig.gui.View;
41
import com.iver.cit.gvsig.jdbc_spatial.DlgConnection;
42
import com.iver.cit.gvsig.jdbc_spatial.gui.jdbcwizard.ConnectionSettings;
43
import com.iver.cit.gvsig.project.ProjectView;
44
import com.iver.utiles.SimpleFileFilter;
45

    
46
public class SaveAs implements Extension {
47

    
48
        /**
49
         * @see com.iver.andami.plugins.Extension#inicializar()
50
         */
51
        public void inicializar() {
52
        }
53

    
54
        /**
55
         * @see com.iver.andami.plugins.Extension#execute(java.lang.String)
56
         */
57
        public void execute(String actionCommand) {
58
                com.iver.andami.ui.mdiManager.View f = PluginServices.getMDIManager()
59
                                .getActiveView();
60

    
61
                if (f instanceof View) {
62
                        View vista = (View) f;
63
                        ProjectView model = vista.getModel();
64
                        FMap mapa = model.getMapContext();
65
                        FLayers layers = mapa.getLayers();
66
                        FLayer[] actives = layers.getActives();
67
                        try {
68
                                // NOTA: SI HAY UNA SELECCI?N, SOLO SE SALVAN LOS SELECCIONADOS
69
                                for (int i = 0; i < actives.length; i++) {
70
                                        if (actives[i] instanceof FLyrVect) {
71
                                                FLyrVect lv = (FLyrVect) actives[i];
72

    
73
                                                if (actionCommand.equals("SHP")) {
74

    
75
                                                        saveToShp(lv);
76
                                                }
77
                                                if (actionCommand.equals("DXF")) {
78
                                                        saveToDxf(lv);
79
                                                }
80
                                                if (actionCommand.equals("POSTGIS")) {
81
                                                        saveToPostGIS(lv);
82
                                                }
83
                                        } // actives[i]
84
                                } // for
85
                        } catch (EditionException e) {
86
                                e.printStackTrace();
87
                                NotificationManager.addError(e.getMessage(), e);
88
                        }
89

    
90
                }
91
        }
92

    
93
        public void saveToPostGIS(FLyrVect layer) throws EditionException {
94
                try {
95
                        String tableName = JOptionPane.showInputDialog(PluginServices
96
                                        .getText(this, "intro_tablename"));
97
                        if (tableName == null)
98
                                return;
99
                        DlgConnection dlg = new DlgConnection();
100
                        dlg.setModal(true);
101
                        dlg.setVisible(true);
102
                        ConnectionSettings cs = dlg.getConnSettings();
103
                        if (cs == null)
104
                                return;
105
                        Connection conex = DriverManager.getConnection(cs
106
                                        .getConnectionString(), cs.getUser(), cs.getPassw());
107

    
108
                        DBLayerDefinition dbLayerDef = new DBLayerDefinition();
109
                        dbLayerDef.setCatalogName(cs.getDb());
110
                        dbLayerDef.setTableName(tableName);
111
                        dbLayerDef.setShapeType(layer.getShapeType());
112
                        SelectableDataSource sds = layer.getRecordset();
113
                        FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
114
                        dbLayerDef.setFieldsDesc(fieldsDescrip);
115
                        dbLayerDef.setFieldGeometry("the_geom");
116
                        dbLayerDef.setFieldID("gid");
117

    
118
                        dbLayerDef.setWhereClause("");
119
                        String strSRID = layer.getProjection().getAbrev().substring(5);
120
                        dbLayerDef.setSRID_EPSG(strSRID);
121
                        dbLayerDef.setConnection(conex);
122

    
123
                        PostGISWriter writer = new PostGISWriter(); // (PostGISWriter)LayerFactory.getWM().getWriter("PostGIS
124
                        // Writer");
125
                        writer.setWriteAll(true);
126
                        writer.setCreateTable(true);
127
                        writer.initialize(dbLayerDef);
128
                        writeFeatures(layer, writer);
129

    
130
                } catch (DriverException e) {
131
                        e.printStackTrace();
132
                        throw new EditionException(e);
133
                } catch (DriverLoadException e) {
134
                        throw new EditionException(e);
135
                } catch (SQLException e) {
136
                        throw new EditionException(e);
137
                } catch (DriverIOException e) {
138
                        throw new EditionException(e);
139
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
140
                        e.printStackTrace();
141
                        throw new EditionException(e);
142
                }
143

    
144
        }
145

    
146
        /**
147
         * @param layer
148
         *            FLyrVect to obtain features. If selection, only selected
149
         *            features will be precessed.
150
         * @param writer
151
         *            (Must be already initialized)
152
         * @throws EditionException
153
         * @throws DriverException
154
         * @throws DriverIOException
155
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException
156
         */
157
        public void writeFeatures(FLyrVect layer, IWriter writer)
158
                        throws EditionException, DriverException, DriverIOException,
159
                        com.hardcode.gdbms.engine.data.driver.DriverException {
160
                ReadableVectorial va = layer.getSource();
161
                SelectableDataSource sds = layer.getRecordset();
162

    
163
                // Creamos la tabla.
164
                writer.preProcess();
165

    
166
                int rowCount;
167
                FBitSet bitSet = layer.getRecordset().getSelection();
168
                if (bitSet.cardinality() == 0) {
169
                        rowCount = va.getShapeCount();
170
                        for (int i = 0; i < rowCount; i++) {
171
                                IGeometry geom = va.getShape(i);
172

    
173
                                if (geom != null) {
174
                                        Value[] values = sds.getRow(i);
175
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
176
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
177
                                                        DefaultRowEdited.STATUS_ADDED, i);
178
                                        writer.process(edRow);
179
                                }
180
                        }
181
                } else {
182
                        for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
183
                                        .nextSetBit(i + 1)) {
184
                                IGeometry geom = va.getShape(i);
185

    
186
                                if (geom != null) {
187
                                        Value[] values = sds.getRow(i);
188
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
189
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
190
                                                        DefaultRowEdited.STATUS_ADDED, i);
191

    
192
                                        writer.process(edRow);
193
                                }
194
                        }
195

    
196
                }
197

    
198
                writer.postProcess();
199
        }
200

    
201
        public void saveToDxf(FLyrVect layer) throws EditionException {
202
                try {
203
                        JFileChooser jfc = new JFileChooser();
204
                        SimpleFileFilter filterShp = new SimpleFileFilter("dxf",
205
                                        PluginServices.getText(this, "dxf_files"));
206
                        jfc.setFileFilter(filterShp);
207
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION)
208
                        {
209
                                File newFile = jfc.getSelectedFile();
210
                                String path = newFile.getAbsolutePath();
211
                                if (!(path.toLowerCase().endsWith(".dxf"))) {
212
                                        path = path + ".dxf";
213
                                }
214
                                newFile = new File(path);
215

    
216
                                DxfWriter writer = (DxfWriter) LayerFactory.getWM().getWriter(
217
                                                "DXF Writer");
218
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
219
                                SelectableDataSource sds = layer.getRecordset();
220
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
221
                                lyrDef.setFieldsDesc(fieldsDescrip);
222
                                lyrDef.setFile(newFile);
223
                                lyrDef.setName(newFile.getName());
224
                                lyrDef.setShapeType(layer.getShapeType());
225
                                writer.setFile(newFile);
226
                                writer.initialize(lyrDef);
227
                                writer.setProjection(layer.getProjection());
228
                                DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
229
                                // TODO: Recuperar aqu? los campos del cuadro de di?logo.
230
                                writer.setFieldMapping(fieldsMapping);
231

    
232
                                writeFeatures(layer, writer);
233
                        }
234

    
235
                } catch (DriverIOException e) {
236
                        e.printStackTrace();
237
                        throw new EditionException(e);
238
                } catch (DriverException e) {
239
                        e.printStackTrace();
240
                        throw new EditionException(e);
241
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
242
                        e.printStackTrace();
243
                        throw new EditionException(e);
244
                }
245

    
246
        }
247

    
248
        public void saveToShp(FLyrVect layer) throws EditionException {
249
                try {
250
                        JFileChooser jfc = new JFileChooser();
251
                        SimpleFileFilter filterShp = new SimpleFileFilter("shp",
252
                                        PluginServices.getText(this, "shp_files"));
253
                        jfc.setFileFilter(filterShp);
254
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
255
                                File newFile = jfc.getSelectedFile();
256
                                String path = newFile.getAbsolutePath();
257
                                if (!(path.toLowerCase().endsWith(".shp"))) {
258
                                        path = path + ".shp";
259
                                }
260
                                newFile = new File(path);
261

    
262
                                ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter(
263
                                                "Shape Writer");
264
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
265
                                SelectableDataSource sds = layer.getRecordset();
266
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
267
                                lyrDef.setFieldsDesc(fieldsDescrip);
268
                                lyrDef.setFile(newFile);
269
                                lyrDef.setName(newFile.getName());
270
                                lyrDef.setShapeType(layer.getShapeType());
271
                                writer.setFile(newFile);
272
                                writer.initialize(lyrDef);
273

    
274
                                writeFeatures(layer, writer);
275

    
276
                        }
277
                } catch (DriverIOException e) {
278
                        e.printStackTrace();
279
                        throw new EditionException(e);
280
                } catch (DriverException e) {
281
                        e.printStackTrace();
282
                        throw new EditionException(e);
283
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
284
                        e.printStackTrace();
285
                        throw new EditionException(e);
286
                }
287

    
288
        }
289

    
290
        /**
291
         * @see com.iver.andami.plugins.Extension#isEnabled()
292
         */
293
        public boolean isEnabled() {
294
                View f = (View) PluginServices.getMDIManager().getActiveView();
295

    
296
                if (f == null) {
297
                        return false;
298
                } else
299
                        return true;
300
        }
301

    
302
        /**
303
         * @see com.iver.andami.plugins.Extension#isVisible()
304
         */
305
        public boolean isVisible() {
306
                com.iver.andami.ui.mdiManager.View f = PluginServices.getMDIManager()
307
                                .getActiveView();
308

    
309
                if (f == null) {
310
                        return false;
311
                }
312

    
313
                if (f.getClass() == View.class) {
314
                        return true;
315
                } else {
316
                        return false;
317
                }
318

    
319
        }
320
}