Statistics
| Revision:

svn-gvsig-desktop / tags / v10_RC2c / extensions / extCAD / src / com / iver / cit / gvsig / ExportTo.java @ 8745

History | View | Annotate | Download (23.7 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.sql.Types;
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.MapContext;
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.ILayerDefinition;
36
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
37
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
38
import com.iver.cit.gvsig.fmap.drivers.dxf.DXFMemoryDriver;
39
import com.iver.cit.gvsig.fmap.drivers.gml.GMLDriver;
40
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
41
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGisDriver;
42
import com.iver.cit.gvsig.fmap.drivers.shp.IndexedShpDriver;
43
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
44
import com.iver.cit.gvsig.fmap.edition.EditionException;
45
import com.iver.cit.gvsig.fmap.edition.IWriter;
46
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
47
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
48
import com.iver.cit.gvsig.fmap.edition.writers.gml.GMLWriter;
49
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
50
import com.iver.cit.gvsig.fmap.layers.FBitSet;
51
import com.iver.cit.gvsig.fmap.layers.FLayer;
52
import com.iver.cit.gvsig.fmap.layers.FLayers;
53
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
54
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
55
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
56
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
57
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
58
import com.iver.cit.gvsig.gui.View;
59
import com.iver.cit.gvsig.jdbc_spatial.DlgConnection;
60
import com.iver.cit.gvsig.jdbc_spatial.gui.jdbcwizard.ConnectionSettings;
61
import com.iver.cit.gvsig.project.ProjectView;
62
import com.iver.utiles.PostProcessSupport;
63
import com.iver.utiles.SimpleFileFilter;
64
import com.iver.utiles.swing.threads.AbstractMonitorableTask;
65

    
66
public class ExportTo extends Extension {
67
        private String lastPath = null;
68

    
69
        private class WriterTask extends AbstractMonitorableTask
70
        {
71
                FLyrVect lyrVect;
72
                IWriter writer;
73
                int rowCount;
74
                ReadableVectorial va;
75
                SelectableDataSource sds;
76
                FBitSet bitSet;
77
                MapContext mapContext;
78
                VectorialDriver reader;
79

    
80
                public WriterTask(MapContext mapContext, FLyrVect lyr, IWriter writer, Driver reader) throws DriverException, DriverIOException
81
                {
82
                        this.mapContext = mapContext;
83
                        this.lyrVect = lyr;
84
                        this.writer = writer;
85
                        this.reader = (VectorialDriver) reader;
86

    
87
                        setInitialStep(0);
88
                        setDeterminatedProcess(true);
89
                        setStatusMessage(PluginServices.getText(this, "exportando_features"));
90

    
91
                        va = lyrVect.getSource();
92
                        sds = lyrVect.getRecordset();
93

    
94
                        bitSet = sds.getSelection();
95

    
96
                        if (bitSet.cardinality() == 0)
97
                                rowCount = va.getShapeCount();
98
                        else
99
                                rowCount = bitSet.cardinality();
100

    
101
                        setFinalStep(rowCount);
102

    
103
                }
104
                public void run() throws Exception {
105

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

    
112
                        // Creamos la tabla.
113
                        writer.preProcess();
114

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

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

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

    
156
                                                writer.process(edRow);
157
                                        }
158
                                }
159

    
160
                        }
161

    
162
                        writer.postProcess();
163
                        if (reader != null){
164
                                int res = JOptionPane.showConfirmDialog(
165
                                        (JComponent) PluginServices.getMDIManager().getActiveWindow()
166
                                        , PluginServices.getText(this, "insertar_en_la_vista_la_capa_creada"),
167
                                        PluginServices.getText(this,"insertar_capa"),
168
                                        JOptionPane.YES_NO_OPTION);
169

    
170
                                if (res == JOptionPane.YES_OPTION)
171
                                {
172
                                        PostProcessSupport.executeCalls();
173
                                        ILayerDefinition lyrDef = (ILayerDefinition) writer.getTableDefinition();
174
                                        FLayer newLayer = LayerFactory.createLayer(
175
                                                        lyrDef.getName(), reader, mapContext.getProjection());
176
                                        mapContext.getLayers().addLayer(newLayer);
177
                                }
178
                        }
179

    
180
                }
181

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

    
195

    
196
        }
197

    
198
        /**
199
         * @see com.iver.andami.plugins.IExtension#initialize()
200
         */
201
        public void initialize() {
202
        }
203

    
204
        /**
205
         * @see com.iver.andami.plugins.IExtension#execute(java.lang.String)
206
         */
207
        public void execute(String actionCommand) {
208
                com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
209
                                .getActiveWindow();
210

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

    
259
                }
260
        }
261

    
262
        public void saveToPostGIS(MapContext mapContext, FLyrVect layer) throws EditionException, DriverIOException {
263
                try {
264
                        String tableName = JOptionPane.showInputDialog(PluginServices
265
                                        .getText(this, "intro_tablename"));
266
                        if (tableName == null)
267
                                return;
268
                        tableName = tableName.toLowerCase();
269
                        DlgConnection dlg = new DlgConnection();
270
                        dlg.setModal(true);
271
                        dlg.setVisible(true);
272
                        ConnectionSettings cs = dlg.getConnSettings();
273
                        if (cs == null)
274
                                return;
275
                        Connection conex = DriverManager.getConnection(cs
276
                                        .getConnectionString(), cs.getUser(), cs.getPassw());
277

    
278
                        DBLayerDefinition dbLayerDef = new DBLayerDefinition();
279
                        dbLayerDef.setCatalogName(cs.getDb());
280
                        dbLayerDef.setTableName(tableName);
281
                        dbLayerDef.setName(tableName);
282
                        dbLayerDef.setShapeType(layer.getShapeType());
283
                        SelectableDataSource sds = layer.getRecordset();
284
                        FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
285
                        dbLayerDef.setFieldsDesc(fieldsDescrip);
286
                // Creamos el driver. OJO: Hay que a?adir el campo ID a la
287
                // definici?n de campos.
288

    
289
                boolean bFound = false;
290
                for (int i=0; i < fieldsDescrip.length; i++)
291
                {
292
                        FieldDescription f = fieldsDescrip[i];
293
                        if (f.getFieldName().equalsIgnoreCase("gid"))
294
                        {
295
                                bFound = true;
296
                                break;
297
                        }
298
                }
299
                // Si no est?, lo a?adimos
300
                if (!bFound)
301
                {
302
                        int numFieldsAnt = fieldsDescrip.length;
303
                        FieldDescription[] newFields = new FieldDescription[dbLayerDef.getFieldsDesc().length + 1];
304
                    for (int i=0; i < numFieldsAnt; i++)
305
                    {
306
                            newFields[i] = fieldsDescrip[i];
307
                    }
308
                    newFields[numFieldsAnt] = new FieldDescription();
309
                    newFields[numFieldsAnt].setFieldDecimalCount(0);
310
                    newFields[numFieldsAnt].setFieldType(Types.INTEGER);
311
                    newFields[numFieldsAnt].setFieldLength(7);
312
                    newFields[numFieldsAnt].setFieldName("gid");
313
                    dbLayerDef.setFieldsDesc(newFields);
314

    
315
                }
316

    
317

    
318

    
319
                        dbLayerDef.setFieldGeometry("the_geom");
320
                        dbLayerDef.setFieldID("gid");
321

    
322
                        dbLayerDef.setWhereClause("");
323
                        String strSRID = layer.getProjection().getAbrev().substring(5);
324
                        dbLayerDef.setSRID_EPSG(strSRID);
325
                        dbLayerDef.setConnection(conex);
326

    
327
                        PostGISWriter writer = new PostGISWriter(); // (PostGISWriter)LayerFactory.getWM().getWriter("PostGIS
328
                        // Writer");
329
                        writer.setWriteAll(true);
330
                        writer.setCreateTable(true);
331
                        writer.initialize(dbLayerDef);
332
                        PostGisDriver postGISDriver=new PostGisDriver();
333
                        postGISDriver.setLyrDef(dbLayerDef);
334
                        postGISDriver.open();
335
                        PostProcessSupport.clearList();
336
                        Object[] params = new Object[2];
337
                        params[0] = conex;
338
                        params[1] = dbLayerDef;
339
                        PostProcessSupport.addToPostProcess(postGISDriver, "setData",
340
                                        params, 1);
341

    
342
                        writeFeatures(mapContext, layer, writer, postGISDriver);
343

    
344
                } catch (DriverException e) {
345
                        e.printStackTrace();
346
                        throw new EditionException(e);
347
                } catch (DriverLoadException e) {
348
                        throw new EditionException(e);
349
                } catch (SQLException e) {
350
                        throw new EditionException(e);
351
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
352
                        e.printStackTrace();
353
                        throw new EditionException(e);
354
                }
355

    
356
        }
357

    
358
        /**
359
         * Lanza un thread en background que escribe las features. Cuando termina, pregunta al usuario si quiere
360
         * a?adir la nueva capa a la vista. Para eso necesita un driver de lectura ya configurado.
361
         * @param mapContext
362
         * @param layer
363
         * @param writer
364
         * @param reader
365
         * @throws DriverException
366
         * @throws DriverIOException
367
         */
368
        private void writeFeatures(MapContext mapContext, FLyrVect layer, IWriter writer, Driver reader) throws DriverException, DriverIOException
369
        {
370
                PluginServices.cancelableBackgroundExecution(new WriterTask(mapContext, layer, writer, reader));
371
        }
372
        private void writeMultiFeatures(MapContext mapContext, FLyrVect layers, IWriter[] writers, Driver[] readers) throws DriverException, DriverIOException{
373
                MultiWriterTask mwt=new MultiWriterTask();
374
                for (int i=0;i<writers.length;i++) {
375
                        mwt.addTask(new WriterTask(mapContext, layers, writers[i], readers[i]));
376
                }
377
                PluginServices.cancelableBackgroundExecution(mwt);
378
        }
379
        /**
380
         * @param layer
381
         *            FLyrVect to obtain features. If selection, only selected
382
         *            features will be precessed.
383
         * @param writer
384
         *            (Must be already initialized)
385
         * @throws EditionException
386
         * @throws DriverException
387
         * @throws DriverIOException
388
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException
389
         */
390
        public void writeFeaturesNoThread(FLyrVect layer, IWriter writer)
391
                        throws EditionException, DriverException, DriverIOException,
392
                        com.hardcode.gdbms.engine.data.driver.DriverException {
393
                ReadableVectorial va = layer.getSource();
394
                SelectableDataSource sds = layer.getRecordset();
395

    
396
                // Creamos la tabla.
397
                writer.preProcess();
398

    
399
                int rowCount;
400
                FBitSet bitSet = layer.getRecordset().getSelection();
401

    
402
                if (bitSet.cardinality() == 0)
403
                        rowCount = va.getShapeCount();
404
                else
405
                        rowCount = bitSet.cardinality();
406

    
407
                ProgressMonitor progress = new ProgressMonitor(
408
                                (JComponent) PluginServices.getMDIManager().getActiveWindow(),
409
                                PluginServices.getText(this, "exportando_features"),
410
                                PluginServices.getText(this, "exportando_features"), 0,
411
                                rowCount);
412

    
413
                progress.setMillisToDecideToPopup(200);
414
                progress.setMillisToPopup(500);
415

    
416
                if (bitSet.cardinality() == 0) {
417
                        rowCount = va.getShapeCount();
418
                        for (int i = 0; i < rowCount; i++) {
419
                                IGeometry geom = va.getShape(i);
420

    
421
                                progress.setProgress(i);
422
                                if (progress.isCanceled())
423
                                        break;
424

    
425
                                if (geom != null) {
426
                                        Value[] values = sds.getRow(i);
427
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
428
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
429
                                                        DefaultRowEdited.STATUS_ADDED, i);
430
                                        writer.process(edRow);
431
                                }
432
                        }
433
                } else {
434
                        int counter = 0;
435
                        for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
436
                                        .nextSetBit(i + 1)) {
437
                                IGeometry geom = va.getShape(i);
438

    
439
                                progress.setProgress(counter++);
440
                                if (progress.isCanceled())
441
                                        break;
442

    
443
                                if (geom != null) {
444
                                        Value[] values = sds.getRow(i);
445
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
446
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
447
                                                        DefaultRowEdited.STATUS_ADDED, i);
448

    
449
                                        writer.process(edRow);
450
                                }
451
                        }
452

    
453
                }
454

    
455
                writer.postProcess();
456
                progress.close();
457
        }
458

    
459
        public void saveToDxf(MapContext mapContext, FLyrVect layer) throws EditionException, DriverIOException {
460
                try {
461
                        JFileChooser jfc = new JFileChooser(lastPath);
462
                        SimpleFileFilter filterShp = new SimpleFileFilter("dxf",
463
                                        PluginServices.getText(this, "dxf_files"));
464
                        jfc.setFileFilter(filterShp);
465
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
466
                                File newFile = jfc.getSelectedFile();
467
                                String path = newFile.getAbsolutePath();
468
                                if (!(path.toLowerCase().endsWith(".dxf"))) {
469
                                        path = path + ".dxf";
470
                                }
471
                                newFile = new File(path);
472

    
473
                                DxfWriter writer = (DxfWriter) LayerFactory.getWM().getWriter(
474
                                                "DXF Writer");
475
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
476
                                SelectableDataSource sds = layer.getRecordset();
477
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
478
                                lyrDef.setFieldsDesc(fieldsDescrip);
479
                                lyrDef.setFile(newFile);
480
                                lyrDef.setName(newFile.getName());
481
                                lyrDef.setShapeType(layer.getShapeType());
482
                                writer.setFile(newFile);
483
                                writer.initialize(lyrDef);
484
                                writer.setProjection(layer.getProjection());
485
                                DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
486
                                // TODO: Recuperar aqu? los campos del cuadro de di?logo.
487
                                writer.setFieldMapping(fieldsMapping);
488
                                DXFMemoryDriver dxfDriver=new DXFMemoryDriver();
489
                                dxfDriver.open(newFile);
490
                                writeFeatures(mapContext, layer, writer, dxfDriver);
491
                                String fileName = newFile.getAbsolutePath();
492
                                lastPath  = fileName.substring(0, fileName.lastIndexOf(File.separatorChar));
493
                        }
494

    
495
                } catch (DriverException e) {
496
                        e.printStackTrace();
497
                        throw new EditionException(e);
498
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
499
                        e.printStackTrace();
500
                        throw new EditionException(e);
501
                } catch (IOException e) {
502
                        // TODO Auto-generated catch block
503
                        e.printStackTrace();
504
                }
505

    
506
        }
507

    
508
        public void saveToShp(MapContext mapContext, FLyrVect layer) throws EditionException, DriverIOException {
509
                try {
510
                        JFileChooser jfc = new JFileChooser();
511
                        SimpleFileFilter filterShp = new SimpleFileFilter("shp",
512
                                        PluginServices.getText(this, "shp_files"));
513
                        jfc.setFileFilter(filterShp);
514
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
515
                                File newFile = jfc.getSelectedFile();
516
                                String path = newFile.getAbsolutePath();
517
                                if( newFile.exists()){
518
                                        int resp = JOptionPane.showConfirmDialog(
519
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
520
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
521
                                        if (resp != JOptionPane.YES_OPTION) {
522
                                                return;
523
                                        }
524
                                }
525
                                if (!(path.toLowerCase().endsWith(".shp"))) {
526
                                        path = path + ".shp";
527
                                }
528
                                newFile = new File(path);
529

    
530

    
531

    
532
                                SelectableDataSource sds = layer.getRecordset();
533
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
534

    
535
                                if (layer.getShapeType() == FShape.MULTI) // Exportamos a 3
536
                                // ficheros
537
                                {
538
                                        ShpWriter writer1 = (ShpWriter) LayerFactory.getWM().getWriter(
539
                                        "Shape Writer");
540
                                        Driver[] drivers=new Driver[3];
541
                                        ShpWriter[] writers=new ShpWriter[3];
542

    
543
                                        // puntos
544
                                        String auxPoint = path.replaceFirst(".shp", "_points.shp");
545

    
546
                                        SHPLayerDefinition lyrDefPoint = new SHPLayerDefinition();
547
                                        lyrDefPoint.setFieldsDesc(fieldsDescrip);
548
                                        File filePoints = new File(auxPoint);
549
                                        lyrDefPoint.setFile(filePoints);
550
                                        lyrDefPoint.setName(filePoints.getName());
551
                                        lyrDefPoint.setShapeType(FShape.POINT);
552
                                        writer1.setFile(filePoints);
553
                                        writer1.initialize(lyrDefPoint);
554
                                        writers[0]=writer1;
555
                                        drivers[0]=getOpenShpDriver(filePoints);
556
                                        //drivers[0]=null;
557

    
558

    
559

    
560
                                        ShpWriter writer2 = (ShpWriter) LayerFactory.getWM().getWriter(
561
                                        "Shape Writer");
562
                                        // Lineas
563
                                        String auxLine = path.replaceFirst(".shp", "_line.shp");
564
                                        SHPLayerDefinition lyrDefLine = new SHPLayerDefinition();
565
                                        lyrDefLine.setFieldsDesc(fieldsDescrip);
566

    
567
                                        File fileLines = new File(auxLine);
568
                                        lyrDefLine.setFile(fileLines);
569
                                        lyrDefLine.setName(fileLines.getName());
570
                                        lyrDefLine.setShapeType(FShape.LINE);
571
                                        writer2.setFile(fileLines);
572
                                        writer2.initialize(lyrDefLine);
573
                                        writers[1]=writer2;
574
                                        drivers[1]=getOpenShpDriver(fileLines);
575
                                        //drivers[1]=null;
576

    
577
                                        ShpWriter writer3 = (ShpWriter) LayerFactory.getWM().getWriter(
578
                                        "Shape Writer");
579
                                        // Pol?gonos
580
                                        String auxPolygon = path.replaceFirst(".shp", "_polygons.shp");
581
                                        SHPLayerDefinition lyrDefPolygon = new SHPLayerDefinition();
582
                                        lyrDefPolygon.setFieldsDesc(fieldsDescrip);
583
                                        File filePolygons = new File(auxPolygon);
584
                                        lyrDefPolygon.setFile(filePolygons);
585
                                        lyrDefPolygon.setName(filePolygons.getName());
586
                                        lyrDefPolygon.setShapeType(FShape.POLYGON);
587
                                        writer3.setFile(filePolygons);
588
                                        writer3.initialize(lyrDefPolygon);
589
                                        writers[2]=writer3;
590
                                        drivers[2]=getOpenShpDriver(filePolygons);
591
                                        //drivers[2]=null;
592

    
593
                                        writeMultiFeatures(mapContext,layer, writers, drivers);
594
                                } else {
595
                                        ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter(
596
                                                "Shape Writer");
597
                                        IndexedShpDriver drv = getOpenShpDriver(newFile);
598
                                        SHPLayerDefinition lyrDef = new SHPLayerDefinition();
599
                                        lyrDef.setFieldsDesc(fieldsDescrip);
600
                                        lyrDef.setFile(newFile);
601
                                        lyrDef.setName(newFile.getName());
602
                                        lyrDef.setShapeType(layer.getShapeType());
603
                                        writer.setFile(newFile);
604
                                        writer.initialize(lyrDef);
605
                                        writeFeatures(mapContext, layer, writer, drv);
606

    
607
                                }
608
                        }
609
                } catch (DriverException e) {
610
                        e.printStackTrace();
611
                        throw new EditionException(e);
612
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
613
                        e.printStackTrace();
614
                        throw new EditionException(e);
615
                }
616
//                catch (IOException e) {
617
//                        e.printStackTrace();
618
//                        throw new EditionException(e);
619
//                }
620
                catch (IOException e) {
621
                        // TODO Auto-generated catch block
622
                        e.printStackTrace();
623
                }
624

    
625
        }
626
        /**
627
         * This method saves a layer to GML
628
         * @param mapContext
629
         * @param layer
630
         * @throws EditionException
631
         * @throws DriverIOException
632
         */
633
        public void saveToGml(MapContext mapContext, FLyrVect layer) throws EditionException, DriverIOException {
634
                try {
635
                        JFileChooser jfc = new JFileChooser();
636
                        SimpleFileFilter filterShp = new SimpleFileFilter("gml",
637
                                        PluginServices.getText(this, "gml_files"));
638
                        jfc.setFileFilter(filterShp);
639
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
640
                                File newFile = jfc.getSelectedFile();
641
                                String path = newFile.getAbsolutePath();
642
                                if (!(path.toLowerCase().endsWith(".gml"))) {
643
                                        path = path + ".gml";
644
                                }
645
                                newFile = new File(path);
646

    
647
                                GMLWriter writer = (GMLWriter)LayerFactory.getWM().getWriter("GML Writer");
648

    
649
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
650
                                SelectableDataSource sds = layer.getRecordset();
651
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
652
                                lyrDef.setFieldsDesc(fieldsDescrip);
653
                                lyrDef.setName(newFile.getName());
654
                                lyrDef.setShapeType(layer.getShapeType());
655

    
656
                                writer.setFile(newFile);
657
                                writer.setSchema(lyrDef);
658
                                writer.setBoundedBy(layer.getFullExtent(),layer.getProjection());
659
                                writer.initialize(lyrDef);
660
                                GMLDriver gmlDriver=new GMLDriver();
661
                                gmlDriver.open(newFile);
662
                                writeFeatures(mapContext, layer, writer, gmlDriver);
663
                        }
664

    
665
                } catch (DriverException e) {
666
                        e.printStackTrace();
667
                        throw new EditionException(e);
668
                } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
669
                        e.printStackTrace();
670
                        throw new EditionException(e);
671
                }
672
//                catch (IOException e) {
673
//                        e.printStackTrace();
674
//                        throw new EditionException(e);
675
//                }
676
                catch (IOException e) {
677
                        e.printStackTrace();
678
                }
679

    
680
        }
681
        private IndexedShpDriver getOpenShpDriver(File fileShp) throws IOException {
682
                IndexedShpDriver drv = new IndexedShpDriver();
683
                if (!fileShp.exists()) {
684
                        fileShp.createNewFile();
685
                        File newFileSHX=new File(fileShp.getAbsolutePath().replaceAll(".shp",".shx"));
686
                        newFileSHX.createNewFile();
687
                        File newFileDBF=new File(fileShp.getAbsolutePath().replaceAll(".shp",".dbf"));
688
                        newFileDBF.createNewFile();
689
                }
690
                drv.open(fileShp);
691
                return drv;
692
        }
693
        /**
694
         * @see com.iver.andami.plugins.IExtension#isEnabled()
695
         */
696
        public boolean isEnabled() {
697
                int status = EditionUtilities.getEditionStatus();
698
                if (( status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE || status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE)
699
                                || (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE)|| (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE))
700
                {
701
                        return true;
702
                }
703
                return false;
704
        }
705

    
706
        /**
707
         * @see com.iver.andami.plugins.IExtension#isVisible()
708
         */
709
        public boolean isVisible() {
710
                com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
711
                                .getActiveWindow();
712

    
713
                if (f == null) {
714
                        return false;
715
                }
716

    
717
                if (f instanceof View)
718
                        return true;
719
                return false;
720
        }
721

    
722
}