Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extCAD / src / com / iver / cit / gvsig / ExportTo.java @ 6486

History | View | Annotate | Download (21.2 KB)

1
package com.iver.cit.gvsig;
2

    
3
import java.awt.Component;
4
import java.awt.geom.Point2D;
5
import java.io.File;
6
import java.io.IOException;
7
import java.sql.Connection;
8
import java.sql.DriverManager;
9
import java.sql.SQLException;
10
import java.util.ArrayList;
11
import java.util.Vector;
12

    
13
import javax.swing.JComponent;
14
import javax.swing.JFileChooser;
15
import javax.swing.JOptionPane;
16
import javax.swing.ProgressMonitor;
17

    
18
import com.hardcode.driverManager.Driver;
19
import com.hardcode.driverManager.DriverLoadException;
20
import com.hardcode.gdbms.engine.values.Value;
21
import com.iver.andami.PluginServices;
22
import com.iver.andami.messages.NotificationManager;
23
import com.iver.andami.plugins.Extension;
24
import com.iver.cit.gvsig.fmap.DriverException;
25
import com.iver.cit.gvsig.fmap.FMap;
26
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
27
import com.iver.cit.gvsig.fmap.core.FShape;
28
import com.iver.cit.gvsig.fmap.core.IFeature;
29
import com.iver.cit.gvsig.fmap.core.IGeometry;
30
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
31
import com.iver.cit.gvsig.fmap.core.v02.FLabel;
32
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
33
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
34
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
35
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
36
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
37
import com.iver.cit.gvsig.fmap.drivers.dxf.DXFMemoryDriver;
38
import com.iver.cit.gvsig.fmap.drivers.gml.GMLDriver;
39
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
40
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGisDriver;
41
import com.iver.cit.gvsig.fmap.drivers.shp.IndexedShpDriver;
42
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
43
import com.iver.cit.gvsig.fmap.edition.EditionException;
44
import com.iver.cit.gvsig.fmap.edition.IWriter;
45
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
46
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
47
import com.iver.cit.gvsig.fmap.edition.writers.gml.GMLWriter;
48
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
49
import com.iver.cit.gvsig.fmap.layers.FBitSet;
50
import com.iver.cit.gvsig.fmap.layers.FLayer;
51
import com.iver.cit.gvsig.fmap.layers.FLayers;
52
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
53
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
54
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
55
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
56
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
57
import com.iver.cit.gvsig.gui.View;
58
import com.iver.cit.gvsig.jdbc_spatial.DlgConnection;
59
import com.iver.cit.gvsig.jdbc_spatial.gui.jdbcwizard.ConnectionSettings;
60
import com.iver.cit.gvsig.project.ProjectView;
61
import com.iver.utiles.SimpleFileFilter;
62
import com.iver.utiles.swing.threads.AbstractMonitorableTask;
63

    
64
public class ExportTo extends Extension {
65

    
66
        private class WriterTask extends AbstractMonitorableTask
67
        {
68
                FLyrVect lyrVect;
69
                IWriter writer;
70
                int rowCount;
71
                ReadableVectorial va;
72
                SelectableDataSource sds;
73
                FBitSet bitSet;
74
                FMap mapContext;
75
                VectorialDriver reader;
76

    
77
                public WriterTask(FMap mapContext, FLyrVect lyr, IWriter writer, Driver reader) throws DriverException, DriverIOException
78
                {
79
                        this.mapContext = mapContext;
80
                        this.lyrVect = lyr;
81
                        this.writer = writer;
82
                        this.reader = (VectorialDriver) reader;
83

    
84
                        setInitialStep(0);
85
                        setDeterminatedProcess(true);
86
                        setStatusMessage(PluginServices.getText(this, "exportando_features"));
87

    
88
                        va = lyrVect.getSource();
89
                        sds = lyrVect.getRecordset();
90

    
91
                        bitSet = sds.getSelection();
92

    
93
                        if (bitSet.cardinality() == 0)
94
                                rowCount = va.getShapeCount();
95
                        else
96
                                rowCount = bitSet.cardinality();
97

    
98
                        setFinalStep(rowCount);
99

    
100
                }
101
                public void run() throws Exception {
102

    
103
                        if (lyrVect instanceof FLyrAnnotation && lyrVect.getShapeType()!=FShape.POINT) {
104
                                SHPLayerDefinition lyrDef=(SHPLayerDefinition)writer.getTableDefinition();
105
                                lyrDef.setShapeType(FShape.POINT);
106
                                writer.initialize(lyrDef);
107
                        }
108

    
109
                        // Creamos la tabla.
110
                        writer.preProcess();
111

    
112
                        if (bitSet.cardinality() == 0) {
113
                                rowCount = va.getShapeCount();
114
                                for (int i = 0; i < rowCount; i++) {
115
                                        IGeometry geom = va.getShape(i);
116
                                        if (lyrVect instanceof FLyrAnnotation && geom.getGeometryType()!=FShape.POINT) {
117
                                                Point2D p=FLabel.createLabelPoint((FShape)geom.getInternalShape());
118
                                                geom=ShapeFactory.createPoint2D(p.getX(),p.getY());
119
                                        }
120
                                        reportStep();
121
                                        setNote(PluginServices.getText(this, "exporting_") + i);
122
                                        if (isCanceled())
123
                                                break;
124

    
125
                                        if (geom != null) {
126
                                                Value[] values = sds.getRow(i);
127
                                                IFeature feat = new DefaultFeature(geom, values, "" + i);
128
                                                DefaultRowEdited edRow = new DefaultRowEdited(feat,
129
                                                                DefaultRowEdited.STATUS_ADDED, i);
130
                                                writer.process(edRow);
131
                                        }
132
                                }
133
                        } else {
134
                                int counter = 0;
135
                                for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
136
                                                .nextSetBit(i + 1)) {
137
                                        IGeometry geom = va.getShape(i);
138
                                        if (lyrVect instanceof FLyrAnnotation && geom.getGeometryType()!=FShape.POINT) {
139
                                                Point2D p=FLabel.createLabelPoint((FShape)geom.getInternalShape());
140
                                                geom=ShapeFactory.createPoint2D(p.getX(),p.getY());
141
                                        }
142
                                        reportStep();
143
                                        setNote(PluginServices.getText(this, "exporting_") + counter);
144
                                        if (isCanceled())
145
                                                break;
146

    
147
                                        if (geom != null) {
148
                                                Value[] values = sds.getRow(i);
149
                                                IFeature feat = new DefaultFeature(geom, values, "" + i);
150
                                                DefaultRowEdited edRow = new DefaultRowEdited(feat,
151
                                                                DefaultRowEdited.STATUS_ADDED, i);
152

    
153
                                                writer.process(edRow);
154
                                        }
155
                                }
156

    
157
                        }
158

    
159
                        writer.postProcess();
160
                        if (reader != null){
161
                                int res = JOptionPane.showConfirmDialog(
162
                                        (JComponent) PluginServices.getMDIManager().getActiveView()
163
                                        , PluginServices.getText(this, "insertar_en_la_vista_la_capa_creada"),
164
                                        PluginServices.getText(this,"insertar_capa"),
165
                                        JOptionPane.YES_NO_OPTION);
166

    
167
                                if (res == JOptionPane.YES_OPTION)
168
                                {
169
                                        FLayer newLayer = LayerFactory.createLayer(
170
                                                        writer.getTableDefinition().getName(), reader, mapContext.getProjection());
171
                                        mapContext.getLayers().addLayer(newLayer);
172
                                }
173
                        }
174

    
175
                }
176

    
177
        }
178
        private class MultiWriterTask extends AbstractMonitorableTask{
179
                Vector tasks=new Vector();
180
                public void addTask(WriterTask wt) {
181
                        tasks.add(wt);
182
                }
183
                public void run() throws Exception {
184
                        for (int i = 0; i < tasks.size(); i++) {
185
                                ((WriterTask)tasks.get(i)).run();
186
                        }
187
                        tasks.clear();
188
                }
189

    
190

    
191
        }
192
        /**
193
         * @see com.iver.andami.plugins.IExtension#initialize()
194
         */
195
        public void initialize() {
196
        }
197

    
198
        /**
199
         * @see com.iver.andami.plugins.IExtension#execute(java.lang.String)
200
         */
201
        public void execute(String actionCommand) {
202
                com.iver.andami.ui.mdiManager.View f = PluginServices.getMDIManager()
203
                                .getActiveView();
204

    
205
                if (f instanceof View) {
206
                        View vista = (View) f;
207
                        ProjectView model = vista.getModel();
208
                        FMap mapa = model.getMapContext();
209
                        FLayers layers = mapa.getLayers();
210
                        FLayer[] actives = layers.getActives();
211
                        try {
212
                                // NOTA: SI HAY UNA SELECCI?N, SOLO SE SALVAN LOS SELECCIONADOS
213
                                for (int i = 0; i < actives.length; i++) {
214
                                        if (actives[i] instanceof FLyrVect) {
215
                                                FLyrVect lv = (FLyrVect) actives[i];
216
                                                int numSelec = lv.getRecordset().getSelection()
217
                                                                .cardinality();
218
                                                if (numSelec > 0) {
219
                                                        int resp = JOptionPane.showConfirmDialog(
220
                                                                        (Component) PluginServices.getMainFrame(),
221
                                                                        PluginServices.getText(this,"se_van_a_guardar_") + numSelec
222
                                                                                        + PluginServices.getText(this,"features_desea_continuar"),
223
                                                                        PluginServices.getText(this,"export_to"), JOptionPane.YES_NO_OPTION);
224
                                                        if (resp != JOptionPane.YES_OPTION) {
225
                                                                continue;
226
                                                        }
227
                                                } // if numSelec > 0
228
                                                if (actionCommand.equals("SHP")) {
229
                                                        saveToShp(mapa, lv);
230
                                                }
231
                                                if (actionCommand.equals("DXF")) {
232
                                                        saveToDxf(mapa, lv);
233
                                                }
234
                                                if (actionCommand.equals("POSTGIS")) {
235
                                                        saveToPostGIS(mapa, lv);
236
                                                }
237
                                                if (actionCommand.equals("GML")) {
238
                                                        saveToGml(mapa, lv);
239
                                                }
240
                                        } // actives[i]
241
                                } // for
242
                        } catch (EditionException e) {
243
                                e.printStackTrace();
244
                                NotificationManager.addError(e.getMessage(), e);
245
                        } catch (DriverException e) {
246
                                e.printStackTrace();
247
                                NotificationManager.addError(e.getMessage(), e);
248
                        } catch (DriverIOException e) {
249
                                e.printStackTrace();
250
                                NotificationManager.addError(e.getMessage(), e);
251
                        }
252

    
253
                }
254
        }
255

    
256
        public void saveToPostGIS(FMap mapContext, FLyrVect layer) throws EditionException, DriverIOException {
257
                try {
258
                        String tableName = JOptionPane.showInputDialog(PluginServices
259
                                        .getText(this, "intro_tablename"));
260
                        if (tableName == null)
261
                                return;
262
                        DlgConnection dlg = new DlgConnection();
263
                        dlg.setModal(true);
264
                        dlg.setVisible(true);
265
                        ConnectionSettings cs = dlg.getConnSettings();
266
                        if (cs == null)
267
                                return;
268
                        Connection conex = DriverManager.getConnection(cs
269
                                        .getConnectionString(), cs.getUser(), cs.getPassw());
270

    
271
                        DBLayerDefinition dbLayerDef = new DBLayerDefinition();
272
                        dbLayerDef.setCatalogName(cs.getDb());
273
                        dbLayerDef.setTableName(tableName);
274
                        dbLayerDef.setShapeType(layer.getShapeType());
275
                        SelectableDataSource sds = layer.getRecordset();
276
                        FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
277
                        dbLayerDef.setFieldsDesc(fieldsDescrip);
278
                        dbLayerDef.setFieldGeometry("the_geom");
279
                        dbLayerDef.setFieldID("gid");
280

    
281
                        dbLayerDef.setWhereClause("");
282
                        String strSRID = layer.getProjection().getAbrev().substring(5);
283
                        dbLayerDef.setSRID_EPSG(strSRID);
284
                        dbLayerDef.setConnection(conex);
285

    
286
                        PostGISWriter writer = new PostGISWriter(); // (PostGISWriter)LayerFactory.getWM().getWriter("PostGIS
287
                        // Writer");
288
                        writer.setWriteAll(true);
289
                        writer.setCreateTable(true);
290
                        writer.initialize(dbLayerDef);
291
                        PostGisDriver postGISDriver=new PostGisDriver();
292
                        postGISDriver.setLyrDef(dbLayerDef);
293
                        postGISDriver.open();
294

    
295
                        writeFeatures(mapContext, layer, writer, postGISDriver);
296

    
297
                } catch (DriverException e) {
298
                        e.printStackTrace();
299
                        throw new EditionException(e);
300
                } catch (DriverLoadException e) {
301
                        throw new EditionException(e);
302
                } catch (SQLException e) {
303
                        throw new EditionException(e);
304
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
305
                        e.printStackTrace();
306
                        throw new EditionException(e);
307
                }
308

    
309
        }
310

    
311
        private void writeFeatures(FMap mapContext, FLyrVect layer, IWriter writer, Driver reader) throws DriverException, DriverIOException
312
        {
313
                PluginServices.cancelableBackgroundExecution(new WriterTask(mapContext, layer, writer, reader));
314
        }
315
        private void writeMultiFeatures(FMap mapContext, FLyrVect layers, IWriter[] writers, Driver[] readers) throws DriverException, DriverIOException{
316
                MultiWriterTask mwt=new MultiWriterTask();
317
                for (int i=0;i<writers.length;i++) {
318
                        mwt.addTask(new WriterTask(mapContext, layers, writers[i], readers[i]));
319
                }
320
                PluginServices.cancelableBackgroundExecution(mwt);
321
        }
322
        /**
323
         * @param layer
324
         *            FLyrVect to obtain features. If selection, only selected
325
         *            features will be precessed.
326
         * @param writer
327
         *            (Must be already initialized)
328
         * @throws EditionException
329
         * @throws DriverException
330
         * @throws DriverIOException
331
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException
332
         */
333
        public void writeFeaturesNoThread(FLyrVect layer, IWriter writer)
334
                        throws EditionException, DriverException, DriverIOException,
335
                        com.hardcode.gdbms.engine.data.driver.DriverException {
336
                ReadableVectorial va = layer.getSource();
337
                SelectableDataSource sds = layer.getRecordset();
338

    
339
                // Creamos la tabla.
340
                writer.preProcess();
341

    
342
                int rowCount;
343
                FBitSet bitSet = layer.getRecordset().getSelection();
344

    
345
                if (bitSet.cardinality() == 0)
346
                        rowCount = va.getShapeCount();
347
                else
348
                        rowCount = bitSet.cardinality();
349

    
350
                ProgressMonitor progress = new ProgressMonitor(
351
                                (JComponent) PluginServices.getMDIManager().getActiveView(),
352
                                PluginServices.getText(this, "exportando_features"),
353
                                PluginServices.getText(this, "exportando_features"), 0,
354
                                rowCount);
355

    
356
                progress.setMillisToDecideToPopup(200);
357
                progress.setMillisToPopup(500);
358

    
359
                if (bitSet.cardinality() == 0) {
360
                        rowCount = va.getShapeCount();
361
                        for (int i = 0; i < rowCount; i++) {
362
                                IGeometry geom = va.getShape(i);
363

    
364
                                progress.setProgress(i);
365
                                if (progress.isCanceled())
366
                                        break;
367

    
368
                                if (geom != null) {
369
                                        Value[] values = sds.getRow(i);
370
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
371
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
372
                                                        DefaultRowEdited.STATUS_ADDED, i);
373
                                        writer.process(edRow);
374
                                }
375
                        }
376
                } else {
377
                        int counter = 0;
378
                        for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
379
                                        .nextSetBit(i + 1)) {
380
                                IGeometry geom = va.getShape(i);
381

    
382
                                progress.setProgress(counter++);
383
                                if (progress.isCanceled())
384
                                        break;
385

    
386
                                if (geom != null) {
387
                                        Value[] values = sds.getRow(i);
388
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
389
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
390
                                                        DefaultRowEdited.STATUS_ADDED, i);
391

    
392
                                        writer.process(edRow);
393
                                }
394
                        }
395

    
396
                }
397

    
398
                writer.postProcess();
399
                progress.close();
400
        }
401

    
402
        public void saveToDxf(FMap mapContext, FLyrVect layer) throws EditionException, DriverIOException {
403
                try {
404
                        JFileChooser jfc = new JFileChooser();
405
                        SimpleFileFilter filterShp = new SimpleFileFilter("dxf",
406
                                        PluginServices.getText(this, "dxf_files"));
407
                        jfc.setFileFilter(filterShp);
408
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
409
                                File newFile = jfc.getSelectedFile();
410
                                String path = newFile.getAbsolutePath();
411
                                if (!(path.toLowerCase().endsWith(".dxf"))) {
412
                                        path = path + ".dxf";
413
                                }
414
                                newFile = new File(path);
415

    
416
                                DxfWriter writer = (DxfWriter) LayerFactory.getWM().getWriter(
417
                                                "DXF Writer");
418
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
419
                                SelectableDataSource sds = layer.getRecordset();
420
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
421
                                lyrDef.setFieldsDesc(fieldsDescrip);
422
                                lyrDef.setFile(newFile);
423
                                lyrDef.setName(newFile.getName());
424
                                lyrDef.setShapeType(layer.getShapeType());
425
                                writer.setFile(newFile);
426
                                writer.initialize(lyrDef);
427
                                writer.setProjection(layer.getProjection());
428
                                DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
429
                                // TODO: Recuperar aqu? los campos del cuadro de di?logo.
430
                                writer.setFieldMapping(fieldsMapping);
431
                                DXFMemoryDriver dxfDriver=new DXFMemoryDriver();
432
                                dxfDriver.open(newFile);
433
                                writeFeatures(mapContext, layer, writer, dxfDriver);
434
                        }
435

    
436
                } catch (DriverException e) {
437
                        e.printStackTrace();
438
                        throw new EditionException(e);
439
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
440
                        e.printStackTrace();
441
                        throw new EditionException(e);
442
                } catch (IOException e) {
443
                        // TODO Auto-generated catch block
444
                        e.printStackTrace();
445
                }
446

    
447
        }
448

    
449
        public void saveToShp(FMap mapContext, FLyrVect layer) throws EditionException, DriverIOException {
450
                try {
451
                        JFileChooser jfc = new JFileChooser();
452
                        SimpleFileFilter filterShp = new SimpleFileFilter("shp",
453
                                        PluginServices.getText(this, "shp_files"));
454
                        jfc.setFileFilter(filterShp);
455
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
456
                                File newFile = jfc.getSelectedFile();
457
                                String path = newFile.getAbsolutePath();
458
                                if( newFile.exists()){
459
                                        int resp = JOptionPane.showConfirmDialog(
460
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
461
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
462
                                        if (resp != JOptionPane.YES_OPTION) {
463
                                                return;
464
                                        }
465
                                }
466
                                if (!(path.toLowerCase().endsWith(".shp"))) {
467
                                        path = path + ".shp";
468
                                }
469
                                newFile = new File(path);
470

    
471

    
472
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
473
                                SelectableDataSource sds = layer.getRecordset();
474
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
475
                                lyrDef.setFieldsDesc(fieldsDescrip);
476
                                if (layer.getShapeType() == FShape.MULTI) // Exportamos a 3
477
                                // ficheros
478
                                {
479
                                        ShpWriter writer1 = (ShpWriter) LayerFactory.getWM().getWriter(
480
                                        "Shape Writer");
481
                                        Driver[] drivers=new Driver[3];
482
                                        ShpWriter[] writers=new ShpWriter[3];
483

    
484
                                        // puntos
485
                                        String aux = path.replaceFirst(".shp", "_points.shp");
486

    
487
                                        File filePoints = new File(aux);
488
                                        lyrDef.setFile(filePoints);
489
                                        lyrDef.setName(filePoints.getName());
490
                                        lyrDef.setShapeType(FShape.POINT);
491
                                        writer1.setFile(filePoints);
492
                                        lyrDef.setFile(filePoints);
493
                                        writer1.initialize(lyrDef);
494
                                        writers[0]=writer1;
495
                                        drivers[0]=getOpenShpDriver(filePoints);
496
                                        //drivers[0]=null;
497

    
498
                                        ShpWriter writer2 = (ShpWriter) LayerFactory.getWM().getWriter(
499
                                        "Shape Writer");
500
                                        // Lineas
501
                                        aux = path.replaceFirst(".shp", "_line.shp");
502
                                        File fileLines = new File(aux);
503
                                        lyrDef.setFile(fileLines);
504
                                        lyrDef.setName(fileLines.getName());
505
                                        lyrDef.setShapeType(FShape.LINE);
506
                                        writer2.setFile(fileLines);
507
                                        lyrDef.setFile(fileLines);
508
                                        writer2.initialize(lyrDef);
509
                                        writers[1]=writer2;
510
                                        drivers[1]=getOpenShpDriver(fileLines);
511
                                        //drivers[1]=null;
512

    
513
                                        ShpWriter writer3 = (ShpWriter) LayerFactory.getWM().getWriter(
514
                                        "Shape Writer");
515
                                        // Pol?gonos
516
                                        aux = path.replaceFirst(".shp", "_polygons.shp");
517
                                        File filePolygons = new File(aux);
518
                                        lyrDef.setFile(filePolygons);
519
                                        lyrDef.setName(filePolygons.getName());
520
                                        lyrDef.setShapeType(FShape.POLYGON);
521
                                        writer3.setFile(filePolygons);
522
                                        lyrDef.setFile(filePolygons);
523
                                        writer3.initialize(lyrDef);
524
                                        writers[2]=writer3;
525
                                        drivers[2]=getOpenShpDriver(filePolygons);
526
                                        //drivers[2]=null;
527

    
528
                                        writeMultiFeatures(mapContext,layer, writers, drivers);
529
                                } else {
530
                                        ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter(
531
                                                "Shape Writer");
532
                                        IndexedShpDriver drv = getOpenShpDriver(newFile);
533

    
534
                                        lyrDef.setFile(newFile);
535
                                        lyrDef.setName(newFile.getName());
536
                                        lyrDef.setShapeType(layer.getShapeType());
537
                                        writer.setFile(newFile);
538
                                        writer.initialize(lyrDef);
539
                                        writeFeatures(mapContext, layer, writer, drv);
540

    
541
                                }
542
                        }
543
                } catch (DriverException e) {
544
                        e.printStackTrace();
545
                        throw new EditionException(e);
546
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
547
                        e.printStackTrace();
548
                        throw new EditionException(e);
549
                }
550
//                catch (IOException e) {
551
//                        e.printStackTrace();
552
//                        throw new EditionException(e);
553
//                }
554
                catch (IOException e) {
555
                        // TODO Auto-generated catch block
556
                        e.printStackTrace();
557
                }
558

    
559
        }
560
        /**
561
         * This method saves a layer to GML
562
         * @param mapContext
563
         * @param layer
564
         * @throws EditionException
565
         * @throws DriverIOException
566
         */
567
        public void saveToGml(FMap mapContext, FLyrVect layer) throws EditionException, DriverIOException {
568
                try {
569
                        JFileChooser jfc = new JFileChooser();
570
                        SimpleFileFilter filterShp = new SimpleFileFilter("gml",
571
                                        PluginServices.getText(this, "gml_files"));
572
                        jfc.setFileFilter(filterShp);
573
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
574
                                File newFile = jfc.getSelectedFile();
575
                                String path = newFile.getAbsolutePath();
576
                                if (!(path.toLowerCase().endsWith(".gml"))) {
577
                                        path = path + ".gml";
578
                                }
579
                                newFile = new File(path);
580

    
581
                                GMLWriter writer = (GMLWriter)LayerFactory.getWM().getWriter("GML Writer");
582

    
583
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
584
                                SelectableDataSource sds = layer.getRecordset();
585
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
586
                                lyrDef.setFieldsDesc(fieldsDescrip);
587
                                lyrDef.setName(newFile.getName());
588
                                lyrDef.setShapeType(layer.getShapeType());
589

    
590
                                writer.setFile(newFile);
591
                                writer.setSchema(lyrDef);
592
                                writer.setBoundedBy(layer.getFullExtent(),layer.getProjection());
593
                                writer.initialize(lyrDef);
594
                                GMLDriver gmlDriver=new GMLDriver();
595
                                gmlDriver.open(newFile);
596
                                writeFeatures(mapContext, layer, writer, gmlDriver);
597
                        }
598

    
599
                } catch (DriverException e) {
600
                        e.printStackTrace();
601
                        throw new EditionException(e);
602
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
603
                        e.printStackTrace();
604
                        throw new EditionException(e);
605
                }
606
//                catch (IOException e) {
607
//                        e.printStackTrace();
608
//                        throw new EditionException(e);
609
//                }
610
                catch (IOException e) {
611
                        e.printStackTrace();
612
                }
613

    
614
        }
615
        private IndexedShpDriver getOpenShpDriver(File fileShp) throws IOException {
616
                IndexedShpDriver drv = new IndexedShpDriver();
617
                if (!fileShp.exists()) {
618
                        fileShp.createNewFile();
619
                        File newFileSHX=new File(fileShp.getAbsolutePath().replaceAll(".shp",".shx"));
620
                        newFileSHX.createNewFile();
621
                        File newFileDBF=new File(fileShp.getAbsolutePath().replaceAll(".shp",".dbf"));
622
                        newFileDBF.createNewFile();
623
                }
624
                drv.open(fileShp);
625
                return drv;
626
        }
627
        /**
628
         * @see com.iver.andami.plugins.IExtension#isEnabled()
629
         */
630
        public boolean isEnabled() {
631
                int status = EditionUtilities.getEditionStatus();
632
                if (( status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE || status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE)
633
                                || (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE)|| (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE))
634
                {
635
                        return true;
636
                }
637
                else
638
                        return false;
639
        }
640

    
641
        /**
642
         * @see com.iver.andami.plugins.IExtension#isVisible()
643
         */
644
        public boolean isVisible() {
645
                com.iver.andami.ui.mdiManager.View f = PluginServices.getMDIManager()
646
                                .getActiveView();
647

    
648
                if (f == null) {
649
                        return false;
650
                }
651

    
652
                if (f instanceof View) {
653
                        return true;
654
                } else {
655
                        return false;
656
                }
657

    
658
        }
659

    
660
}