Statistics
| Revision:

root / trunk / extensions / extCAD / src / com / iver / cit / gvsig / ExportTo.java @ 38054

History | View | Annotate | Download (28.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.nio.charset.Charset;
8
import java.sql.Types;
9
import java.util.HashMap;
10
import java.util.Vector;
11
import java.util.prefs.Preferences;
12

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

    
18
import org.apache.log4j.Logger;
19
import org.cresques.cts.ICoordTrans;
20

    
21
import com.hardcode.driverManager.Driver;
22
import com.hardcode.driverManager.DriverLoadException;
23
import com.hardcode.gdbms.driver.exceptions.FileNotFoundDriverException;
24
import com.hardcode.gdbms.driver.exceptions.InitializeWriterException;
25
import com.hardcode.gdbms.driver.exceptions.OpenDriverException;
26
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
27
import com.hardcode.gdbms.engine.data.driver.DriverException;
28
import com.hardcode.gdbms.engine.values.Value;
29
import com.iver.andami.PluginServices;
30
import com.iver.andami.messages.NotificationManager;
31
import com.iver.andami.plugins.Extension;
32
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
33
import com.iver.cit.gvsig.exceptions.visitors.VisitorException;
34
import com.iver.cit.gvsig.fmap.MapContext;
35
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
36
import com.iver.cit.gvsig.fmap.core.FShape;
37
import com.iver.cit.gvsig.fmap.core.IFeature;
38
import com.iver.cit.gvsig.fmap.core.IGeometry;
39
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
40
import com.iver.cit.gvsig.fmap.core.v02.FLabel;
41
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
42
import com.iver.cit.gvsig.fmap.drivers.DriverAttributes;
43
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
44
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
45
import com.iver.cit.gvsig.fmap.drivers.IConnection;
46
import com.iver.cit.gvsig.fmap.drivers.ILayerDefinition;
47
import com.iver.cit.gvsig.fmap.drivers.IVectorialDatabaseDriver;
48
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
49
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
50
import com.iver.cit.gvsig.fmap.drivers.db.utils.ConnectionWithParams;
51
import com.iver.cit.gvsig.fmap.drivers.dbf.DbaseFile;
52
import com.iver.cit.gvsig.fmap.drivers.dxf.DXFMemoryDriver;
53
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
54
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGisDriver;
55
import com.iver.cit.gvsig.fmap.drivers.shp.IndexedShpDriver;
56
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
57
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
58
import com.iver.cit.gvsig.fmap.edition.IWriter;
59
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
60
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
61
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
62
import com.iver.cit.gvsig.fmap.layers.FBitSet;
63
import com.iver.cit.gvsig.fmap.layers.FLayer;
64
import com.iver.cit.gvsig.fmap.layers.FLayers;
65
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
66
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
67
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
68
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
69
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
70
import com.iver.cit.gvsig.fmap.layers.VectorialFileAdapter;
71
import com.iver.cit.gvsig.gui.cad.panels.ChooseSchemaAndTable;
72
import com.iver.cit.gvsig.project.documents.view.IProjectView;
73
import com.iver.cit.gvsig.project.documents.view.gui.View;
74
import com.iver.utiles.PostProcessSupport;
75
import com.iver.utiles.SimpleFileFilter;
76
import com.iver.utiles.swing.threads.AbstractMonitorableTask;
77
import com.prodevelop.cit.gvsig.vectorialdb.wizard.ConnectionChooserPanel;
78

    
79

    
80
public class ExportTo extends Extension {
81

    
82
        private static Logger logger = Logger.getLogger(ExportTo.class.getName());
83
        private String lastPath = null;
84
        private static HashMap<FLyrVect, EndExportToCommand> exportedLayers =
85
                new HashMap<FLyrVect, EndExportToCommand>();
86
        private static Preferences prefs = Preferences.userRoot().node( "gvSIG.encoding.dbf" );
87

    
88
        /**
89
         * This method is used to add a layer that is exported
90
         * to other format and its edition has to be finished
91
         * at the end of this process.
92
         * @param layer
93
         */
94
        public static void addLayerToStopEdition(FLyrVect layer, EndExportToCommand command){
95
                exportedLayers.put(layer, command);
96
        }
97

    
98
        public static void executeCommand(FLyrVect layer) throws Exception{
99
                if (exportedLayers.containsKey(layer)){
100
                        EndExportToCommand command = exportedLayers.get(layer);
101
                        command.execute();
102
                        exportedLayers.remove(layer);
103
                }
104
        }
105

    
106
        private class WriterTask extends AbstractMonitorableTask
107
        {
108
                FLyrVect lyrVect;
109
                IWriter writer;
110
                int rowCount;
111
                ReadableVectorial va;
112
                SelectableDataSource sds;
113
                FBitSet bitSet;
114
                MapContext mapContext;
115
                VectorialDriver reader;
116

    
117
                public WriterTask(MapContext mapContext, FLyrVect lyr, IWriter writer, Driver reader) throws ReadDriverException
118
                {
119
                        this.mapContext = mapContext;
120
                        this.lyrVect = lyr;
121
                        this.writer = writer;
122
                        this.reader = (VectorialDriver) reader;
123

    
124
                        setInitialStep(0);
125
                        setDeterminatedProcess(true);
126
                        setStatusMessage(PluginServices.getText(this, "exportando_features"));
127

    
128
                        va = lyrVect.getSource();
129
                        sds = lyrVect.getRecordset();
130

    
131
                        bitSet = sds.getSelection();
132

    
133
                        if (bitSet.cardinality() == 0) {
134
                            rowCount = va.getShapeCount();
135
                        } else {
136
                            rowCount = bitSet.cardinality();
137
                        }
138

    
139
                        setFinalStep(rowCount);
140

    
141
                }
142
                public void run() throws Exception {
143
                        lyrVect.setWaitTodraw(true);
144
                        va.start();
145
                        ICoordTrans ct = lyrVect.getCoordTrans();
146
                        DriverAttributes attr = va.getDriverAttributes();
147
                        boolean bMustClone = false;
148
                        if (attr != null) {
149
                                if (attr.isLoadedInMemory()) {
150
                                        bMustClone = attr.isLoadedInMemory();
151
                                }
152
                        }
153
                        if (lyrVect instanceof FLyrAnnotation && lyrVect.getShapeType()!=FShape.POINT) {
154
                                SHPLayerDefinition lyrDef=(SHPLayerDefinition)writer.getTableDefinition();
155
                                lyrDef.setShapeType(FShape.POINT);
156
                                writer.initialize(lyrDef);
157
                        }
158

    
159
                        if(writer instanceof ShpWriter) {
160
                                String charSetName = prefs.get("dbf_encoding", DbaseFile.getDefaultCharset().toString());
161
                                if(lyrVect.getSource() instanceof VectorialFileAdapter) {
162
                                        ((ShpWriter)writer).loadDbfEncoding(((VectorialFileAdapter)lyrVect.getSource()).getFile().getAbsolutePath(), Charset.forName(charSetName));
163
                                } else {
164
                                        Object s = lyrVect.getProperty("DBFFile");
165
                                        if(s != null && s instanceof String) {
166
                                            ((ShpWriter)writer).loadDbfEncoding((String)s, Charset.forName(charSetName));
167
                                        }
168
                                }
169
                        }
170

    
171
                        // Creamos la tabla.
172
                        writer.preProcess();
173

    
174
                        if (bitSet.cardinality() == 0) {
175
                                rowCount = va.getShapeCount();
176
                                for (int i = 0; i < rowCount; i++) {
177
                                        if (isCanceled()) {
178
                                            break;
179
                                        }
180
                                        IGeometry geom = va.getShape(i);
181
                                        if (geom == null) {
182
                                                reportStep();
183
                                                continue;
184
                                        }
185
                                        if (lyrVect instanceof FLyrAnnotation && geom.getGeometryType()!=FShape.POINT) {
186
                                                Point2D p=FLabel.createLabelPoint((FShape)geom.getInternalShape());
187
                                                geom=ShapeFactory.createPoint2D(p.getX(),p.getY());
188
                                        }
189
                                        if (isCanceled()) {
190
                                            break;
191
                                        }
192
                                        if (ct != null) {
193
                                                if (bMustClone) {
194
                                                    geom = geom.cloneGeometry();
195
                                                }
196
                                                geom.reProject(ct);
197
                                        }
198
                                        reportStep();
199
                                        setNote(PluginServices.getText(this, "exporting_") + i);
200
                                        if (isCanceled()) {
201
                                            break;
202
                                        }
203

    
204
                                        if (geom != null) {
205
                                                Value[] values = sds.getRow(i);
206
                                                IFeature feat = new DefaultFeature(geom, values, "" + i);
207
                                                DefaultRowEdited edRow = new DefaultRowEdited(feat,
208
                                                                DefaultRowEdited.STATUS_ADDED, i);
209
                                                writer.process(edRow);
210
                                        }
211
                                }
212
                        } else {
213
                                int counter = 0;
214
                                for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
215
                                .nextSetBit(i + 1)) {
216
                                        if (isCanceled()) {
217
                                            break;
218
                                        }
219
                                        IGeometry geom = va.getShape(i);
220
                                        if (geom == null) {
221
                                                reportStep();
222
                                                continue;
223
                                        }
224
                                        if (lyrVect instanceof FLyrAnnotation && geom.getGeometryType()!=FShape.POINT) {
225
                                                Point2D p=FLabel.createLabelPoint((FShape)geom.getInternalShape());
226
                                                geom=ShapeFactory.createPoint2D(p.getX(),p.getY());
227
                                        }
228
                                        if (isCanceled()) {
229
                                            break;
230
                                        }
231
                                        if (ct != null) {
232
                                                if (bMustClone) {
233
                                                    geom = geom.cloneGeometry();
234
                                                }
235
                                                geom.reProject(ct);
236
                                        }
237
                                        reportStep();
238
                                        setNote(PluginServices.getText(this, "exporting_") + counter);
239
                                        if (isCanceled()) {
240
                                            break;
241
                                        }
242

    
243
                                        if (geom != null) {
244
                                                Value[] values = sds.getRow(i);
245
                                                IFeature feat = new DefaultFeature(geom, values, "" + i);
246
                                                DefaultRowEdited edRow = new DefaultRowEdited(feat,
247
                                                                DefaultRowEdited.STATUS_ADDED, i);
248

    
249
                                                writer.process(edRow);
250
                                        }
251
                                }
252

    
253
                        }
254

    
255
                        writer.postProcess();
256
                        va.stop();
257
                        if (reader != null && !isCanceled()){
258
                                int res = JOptionPane.showConfirmDialog(
259
                                                (JComponent) PluginServices.getMDIManager().getActiveWindow()
260
                                                , PluginServices.getText(this, "insertar_en_la_vista_la_capa_creada"),
261
                                                PluginServices.getText(this,"insertar_capa"),
262
                                                JOptionPane.YES_NO_OPTION);
263

    
264
                                if (res == JOptionPane.YES_OPTION)
265
                                {
266
                                        PostProcessSupport.executeCalls();
267
                                        ILayerDefinition lyrDef = (ILayerDefinition) writer.getTableDefinition();
268
                                        FLayer newLayer = LayerFactory.createLayer(
269
                                                        lyrDef.getName(), reader, mapContext.getProjection());
270
                                        mapContext.getLayers().addLayer(newLayer);
271
                                }
272
                        }
273
                        lyrVect.setWaitTodraw(false);
274

    
275
                }
276
                /* (non-Javadoc)
277
                 * @see com.iver.utiles.swing.threads.IMonitorableTask#finished()
278
                 */
279
                public void finished() {
280
                        try {
281
                                executeCommand(lyrVect);
282
                        } catch (Exception e) {
283
                                NotificationManager.addError(e);
284
                        }
285
                }
286

    
287
        }
288
        private class MultiWriterTask extends AbstractMonitorableTask{
289
                Vector tasks=new Vector();
290
                public void addTask(WriterTask wt) {
291
                        tasks.add(wt);
292
                }
293
                public void run() throws Exception {
294
                        for (int i = 0; i < tasks.size(); i++) {
295
                                ((WriterTask)tasks.get(i)).run();
296
                        }
297
                }
298
                /* (non-Javadoc)
299
                 * @see com.iver.utiles.swing.threads.IMonitorableTask#finished()
300
                 */
301
                public void finished() {
302
                        for (int i = 0; i < tasks.size(); i++) {
303
                                ((WriterTask)tasks.get(i)).finished();
304
                        }
305
                        tasks.clear();
306
                }
307

    
308

    
309
        }
310
        /**
311
         * @see com.iver.andami.plugins.IExtension#initialize()
312
         */
313
        public void initialize() {
314
        }
315

    
316
        /**
317
         * @see com.iver.andami.plugins.IExtension#execute(java.lang.String)
318
         */
319
        public void execute(String actionCommand) {
320
                com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
321
                .getActiveWindow();
322

    
323
                if (f instanceof View) {
324
                        View vista = (View) f;
325
                        IProjectView model = vista.getModel();
326
                        MapContext mapa = model.getMapContext();
327
                        FLayers layers = mapa.getLayers();
328
                        FLayer[] actives = layers.getActives();
329
                        try {
330
                                // NOTA: SI HAY UNA SELECCI?N, SOLO SE SALVAN LOS SELECCIONADOS
331
                                for (int i = 0; i < actives.length; i++) {
332
                                        if (actives[i] instanceof FLyrVect) {
333
                                                FLyrVect lv = (FLyrVect) actives[i];
334
                                                int numSelec = lv.getRecordset().getSelection()
335
                                                .cardinality();
336
                                                if (numSelec > 0) {
337
                                                        int resp = JOptionPane.showConfirmDialog(
338
                                                                        (Component) PluginServices.getMainFrame(),
339
                                                                        PluginServices.getText(this,"se_van_a_guardar_") + numSelec
340
                                                                        + PluginServices.getText(this,"features_desea_continuar"),
341
                                                                        PluginServices.getText(this,"export_to"), JOptionPane.YES_NO_OPTION);
342
                                                        if (resp != JOptionPane.YES_OPTION) {
343
                                                                continue;
344
                                                        }
345
                                                } // if numSelec > 0
346
                                                if (actionCommand.equals("SHP")) {
347
                                                        saveToShp(mapa, lv);
348
                                                }
349
                                                if (actionCommand.equals("DXF")) {
350
                                                        saveToDxf(mapa, lv);
351
                                                }
352
                                                if (actionCommand.equals("POSTGIS")) {
353
                                                        saveToPostGIS(mapa, lv);
354
                                                }
355
                                        } // actives[i]
356
                                } // for
357
                        } catch (ReadDriverException e) {
358
                                NotificationManager.showMessageError(e.getMessage(),e);
359
                        }
360

    
361
                }
362
        }
363

    
364
        public void saveToPostGIS(MapContext mapContext, FLyrVect layer){
365
                try {
366

    
367
            ConnectionWithParams cwp = getConnectionWithParams();
368

    
369
            if (cwp == null) {
370
                logger.error("Selected CWP is null (?) Export canceled.");
371
                return;
372
            }
373

    
374
            ChooseSchemaAndTable chooseSchemaAndTable = new ChooseSchemaAndTable(
375
                    cwp);
376
            PluginServices.getMDIManager().addWindow(chooseSchemaAndTable);
377
            if (!chooseSchemaAndTable.isOKPressed()) {
378
                return;
379
            }
380

    
381

    
382

    
383

    
384

    
385
                        IConnection _conex = cwp.getConnection();
386

    
387
                        DBLayerDefinition originalDef = null;
388
                        if (layer.getSource().getDriver() instanceof IVectorialDatabaseDriver) {
389
                                originalDef=((IVectorialDatabaseDriver) layer.getSource().getDriver()).getLyrDef();
390
                        }
391

    
392

    
393
                        DBLayerDefinition dbLayerDef = new DBLayerDefinition();
394
                        // Fjp:
395
                        // Cambio: En Postgis, el nombre de cat?logo est? siempre vac?o. Es algo heredado de Oracle, que no se usa.
396
                        // dbLayerDef.setCatalogName(cs.getDb());
397
                        dbLayerDef.setCatalogName("");
398

    
399
                        // A?adimos el schema dentro del layer definition para poder tenerlo en cuenta.
400
            dbLayerDef.setSchema(chooseSchemaAndTable.getSchema());
401

    
402
                        dbLayerDef.setTableName(chooseSchemaAndTable.getTable());
403
            dbLayerDef.setName(chooseSchemaAndTable.getTable());
404
                        dbLayerDef.setShapeType(layer.getShapeType());
405
                        SelectableDataSource sds = layer.getRecordset();
406

    
407
                        FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
408
                        dbLayerDef.setFieldsDesc(fieldsDescrip);
409
                        // Creamos el driver. OJO: Hay que a?adir el campo ID a la
410
                        // definici?n de campos.
411

    
412
                        if (originalDef != null){
413
                                dbLayerDef.setFieldID(originalDef.getFieldID());
414
                                dbLayerDef.setFieldGeometry(originalDef.getFieldGeometry());
415

    
416
                        }else{
417
                                // Search for id field name
418
                                int index=0;
419
                                String fieldName="gid";
420
                                while (findFileByName(fieldsDescrip,fieldName) != -1){
421
                                        index++;
422
                                        fieldName= "gid" + index;
423
                                }
424
                                dbLayerDef.setFieldID(fieldName);
425

    
426
                                // search for geom field name
427
                                index=0;
428
                                fieldName="the_geom";
429
                                while (findFileByName(fieldsDescrip,fieldName) != -1){
430
                                        index++;
431
                                        fieldName = "the_geom" + index;
432
                                }
433
                                dbLayerDef.setFieldGeometry(fieldName);
434

    
435
                        }
436

    
437
                        // if id field dosen't exist we add it
438
                        if (findFileByName(fieldsDescrip,dbLayerDef.getFieldID()) == -1)
439
                        {
440
                                int numFieldsAnt = fieldsDescrip.length;
441
                                FieldDescription[] newFields = new FieldDescription[dbLayerDef.getFieldsDesc().length + 1];
442
                                for (int i=0; i < numFieldsAnt; i++)
443
                                {
444
                                        newFields[i] = fieldsDescrip[i];
445
                                }
446
                                newFields[numFieldsAnt] = new FieldDescription();
447
                                newFields[numFieldsAnt].setFieldDecimalCount(0);
448
                                newFields[numFieldsAnt].setFieldType(Types.INTEGER);
449
                                newFields[numFieldsAnt].setFieldLength(7);
450
                                newFields[numFieldsAnt].setFieldName(dbLayerDef.getFieldID());
451
                                dbLayerDef.setFieldsDesc(newFields);
452

    
453
                        }
454

    
455
                        // all fields to lowerCase
456
                        FieldDescription field;
457
                        for (int i=0;i<dbLayerDef.getFieldsDesc().length;i++){
458
                                field = dbLayerDef.getFieldsDesc()[i];
459
                                field.setFieldName(field.getFieldName().toLowerCase());
460
                        }
461
                        dbLayerDef.setFieldID(dbLayerDef.getFieldID().toLowerCase());
462
                        dbLayerDef.setFieldGeometry(dbLayerDef.getFieldGeometry().toLowerCase());
463

    
464
                        dbLayerDef.setWhereClause("");
465
                        String strSRID = layer.getProjection().getAbrev();
466
                        dbLayerDef.setSRID_EPSG(strSRID);
467
                        dbLayerDef.setConnection(_conex);
468

    
469
                        PostGISWriter writer=(PostGISWriter)LayerFactory.getWM().getWriter("PostGIS Writer");
470
                        writer.setWriteAll(true);
471
                        writer.setCreateTable(true);
472
                        writer.initialize(dbLayerDef);
473
                        PostGisDriver postGISDriver=new PostGisDriver();
474
                        postGISDriver.setLyrDef(dbLayerDef);
475
                        postGISDriver.open();
476
                        PostProcessSupport.clearList();
477
                        Object[] params = new Object[2];
478
                        params[0] = _conex;
479
                        params[1] = dbLayerDef;
480
                        PostProcessSupport.addToPostProcess(postGISDriver, "setData",
481
                                        params, 1);
482

    
483
                        writeFeatures(mapContext, layer, writer, postGISDriver);
484

    
485
                } catch (DriverLoadException e) {
486
                        NotificationManager.addError(e.getMessage(),e);
487
                } catch (InitializeWriterException e) {
488
                        NotificationManager.showMessageError(e.getMessage(),e);
489
                } catch (ReadDriverException e) {
490
                        NotificationManager.addError(e.getMessage(),e);
491
                }
492

    
493
        }
494

    
495
        private ConnectionWithParams getConnectionWithParams() {
496
            ConnectionChooserPanel ccp = new ConnectionChooserPanel(PostGisDriver.NAME);
497
            PluginServices.getMDIManager().addWindow(ccp);
498

    
499
            if (!ccp.isOkPressed()) {
500
                return null;
501
            }
502
            return ccp.getSelectedCWP();
503
        }
504

    
505
        /**
506
         * Lanza un thread en background que escribe las features. Cuando termina, pregunta al usuario si quiere
507
         * a?adir la nueva capa a la vista. Para eso necesita un driver de lectura ya configurado.
508
         * @param mapContext
509
         * @param layer
510
         * @param writer
511
         * @param reader
512
         * @throws ReadDriverException
513
         * @throws DriverException
514
         * @throws DriverIOException
515
         */
516
        private void writeFeatures(MapContext mapContext, FLyrVect layer, IWriter writer, Driver reader) throws ReadDriverException
517
        {
518
                PluginServices.cancelableBackgroundExecution(new WriterTask(mapContext, layer, writer, reader));
519
        }
520
        private void writeMultiFeatures(MapContext mapContext, FLyrVect layers, IWriter[] writers, Driver[] readers) throws ReadDriverException{
521
                MultiWriterTask mwt=new MultiWriterTask();
522
                for (int i=0;i<writers.length;i++) {
523
                        mwt.addTask(new WriterTask(mapContext, layers, writers[i], readers[i]));
524
                }
525
                PluginServices.cancelableBackgroundExecution(mwt);
526
        }
527
        /**
528
         * @param layer
529
         *            FLyrVect to obtain features. If selection, only selected
530
         *            features will be precessed.
531
         * @param writer
532
         *            (Must be already initialized)
533
         * @throws ReadDriverException
534
         * @throws ProcessWriterException
535
         * @throws ExpansionFileReadException
536
         * @throws EditionException
537
         * @throws DriverException
538
         * @throws DriverIOException
539
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException
540
         */
541
        public void writeFeaturesNoThread(FLyrVect layer, IWriter writer) throws ReadDriverException, VisitorException, ExpansionFileReadException{
542
                ReadableVectorial va = layer.getSource();
543
                SelectableDataSource sds = layer.getRecordset();
544

    
545
                // Creamos la tabla.
546
                writer.preProcess();
547

    
548
                int rowCount;
549
                FBitSet bitSet = layer.getRecordset().getSelection();
550

    
551
                if (bitSet.cardinality() == 0) {
552
                    rowCount = va.getShapeCount();
553
                } else {
554
                    rowCount = bitSet.cardinality();
555
                }
556

    
557
                ProgressMonitor progress = new ProgressMonitor(
558
                                (JComponent) PluginServices.getMDIManager().getActiveWindow(),
559
                                PluginServices.getText(this, "exportando_features"),
560
                                PluginServices.getText(this, "exportando_features"), 0,
561
                                rowCount);
562

    
563
                progress.setMillisToDecideToPopup(200);
564
                progress.setMillisToPopup(500);
565

    
566
                if (bitSet.cardinality() == 0) {
567
                        rowCount = va.getShapeCount();
568
                        for (int i = 0; i < rowCount; i++) {
569
                                IGeometry geom = va.getShape(i);
570

    
571
                                progress.setProgress(i);
572
                                if (progress.isCanceled()) {
573
                                    break;
574
                                }
575

    
576
                                if (geom != null) {
577
                                        Value[] values = sds.getRow(i);
578
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
579
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
580
                                                        IRowEdited.STATUS_ADDED, i);
581
                                        writer.process(edRow);
582
                                }
583
                        }
584
                } else {
585
                        int counter = 0;
586
                        for (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet
587
                        .nextSetBit(i + 1)) {
588
                                IGeometry geom = va.getShape(i);
589

    
590
                                progress.setProgress(counter++);
591
                                if (progress.isCanceled()) {
592
                                    break;
593
                                }
594

    
595
                                if (geom != null) {
596
                                        Value[] values = sds.getRow(i);
597
                                        IFeature feat = new DefaultFeature(geom, values, "" + i);
598
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
599
                                                        IRowEdited.STATUS_ADDED, i);
600

    
601
                                        writer.process(edRow);
602
                                }
603
                        }
604

    
605
                }
606

    
607
                writer.postProcess();
608
                progress.close();
609
        }
610

    
611
        public void saveToDxf(MapContext mapContext, FLyrVect layer)  {
612
                try {
613
                        JFileChooser jfc = new JFileChooser(lastPath);
614
                        SimpleFileFilter filterShp = new SimpleFileFilter("dxf",
615
                                        PluginServices.getText(this, "dxf_files"));
616
                        jfc.setFileFilter(filterShp);
617
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
618
                                File newFile = jfc.getSelectedFile();
619
                                String path = newFile.getAbsolutePath();
620
                                if (!(path.toLowerCase().endsWith(".dxf"))) {
621
                                        path = path + ".dxf";
622
                                }
623
                                newFile = new File(path);
624

    
625
                                DxfWriter writer = (DxfWriter) LayerFactory.getWM().getWriter(
626
                                "DXF Writer");
627
                                SHPLayerDefinition lyrDef = new SHPLayerDefinition();
628
                                SelectableDataSource sds = layer.getRecordset();
629
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
630
                                lyrDef.setFieldsDesc(fieldsDescrip);
631
                                lyrDef.setFile(newFile);
632
                                lyrDef.setName(newFile.getName());
633
                                lyrDef.setShapeType(layer.getShapeType());
634
                                writer.setFile(newFile);
635
                                writer.initialize(lyrDef);
636
                                writer.setProjection(layer.getProjection());
637
                                DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
638
                                // TODO: Recuperar aqu? los campos del cuadro de di?logo.
639
                                writer.setFieldMapping(fieldsMapping);
640
                                DXFMemoryDriver dxfDriver=new DXFMemoryDriver();
641
                                dxfDriver.open(newFile);
642
                                writeFeatures(mapContext, layer, writer, dxfDriver);
643
                                String fileName = newFile.getAbsolutePath();
644
                                lastPath  = fileName.substring(0, fileName.lastIndexOf(File.separatorChar));
645
                        }
646

    
647
                } catch (ReadDriverException e) {
648
                        NotificationManager.addError(e.getMessage(),e);
649
                } catch (InitializeWriterException e) {
650
                        NotificationManager.addError(e.getMessage(),e);
651
                } catch (DriverLoadException e) {
652
                        NotificationManager.addError(e.getMessage(),e);
653
                }
654

    
655
        }
656

    
657
        public void saveToShp(MapContext mapContext, FLyrVect layer) {
658
                try {
659
                        JFileChooser jfc = new JFileChooser();
660
                        SimpleFileFilter filterShp = new SimpleFileFilter("shp",
661
                                        PluginServices.getText(this, "shp_files"));
662
                        jfc.setFileFilter(filterShp);
663
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
664
                                File newFile = jfc.getSelectedFile();
665
                                String path = newFile.getAbsolutePath();
666
                                if( newFile.exists()){
667
                                        int resp = JOptionPane.showConfirmDialog(
668
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
669
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
670
                                        if (resp != JOptionPane.YES_OPTION) {
671
                                                return;
672
                                        }
673
                                }
674
                                if (!(path.toLowerCase().endsWith(".shp"))) {
675
                                        path = path + ".shp";
676
                                }
677
                                newFile = new File(path);
678

    
679

    
680

    
681
                                SelectableDataSource sds = layer.getRecordset();
682
                                FieldDescription[] fieldsDescrip = sds.getFieldsDescription();
683

    
684
                                if (layer.getShapeType() == FShape.MULTI) // Exportamos a 3
685
                                        // ficheros
686
                                {
687
                                        ShpWriter writer1 = (ShpWriter) LayerFactory.getWM().getWriter(
688
                                        "Shape Writer");
689
                                        Driver[] drivers=new Driver[3];
690
                                        ShpWriter[] writers=new ShpWriter[3];
691

    
692
                                        // puntos
693
                                        String auxPoint = path.replaceFirst("\\.shp", "_points.shp");
694

    
695
                                        SHPLayerDefinition lyrDefPoint = new SHPLayerDefinition();
696
                                        lyrDefPoint.setFieldsDesc(fieldsDescrip);
697
                                        File filePoints = new File(auxPoint);
698
                                        lyrDefPoint.setFile(filePoints);
699
                                        lyrDefPoint.setName(filePoints.getName());
700
                                        lyrDefPoint.setShapeType(FShape.POINT);
701
                                        loadEnconding(layer, writer1);
702
                                        writer1.setFile(filePoints);
703
                                        writer1.initialize(lyrDefPoint);
704
                                        writers[0]=writer1;
705
                                        drivers[0]=getOpenShpDriver(filePoints);
706
                                        //drivers[0]=null;
707

    
708
                                        ShpWriter writer2 = (ShpWriter) LayerFactory.getWM().getWriter(
709
                                        "Shape Writer");
710
                                        // Lineas
711
                                        String auxLine = path.replaceFirst("\\.shp", "_line.shp");
712
                                        SHPLayerDefinition lyrDefLine = new SHPLayerDefinition();
713
                                        lyrDefLine.setFieldsDesc(fieldsDescrip);
714

    
715
                                        File fileLines = new File(auxLine);
716
                                        lyrDefLine.setFile(fileLines);
717
                                        lyrDefLine.setName(fileLines.getName());
718
                                        lyrDefLine.setShapeType(FShape.LINE);
719
                                        loadEnconding(layer, writer2);
720
                                        writer2.setFile(fileLines);
721
                                        writer2.initialize(lyrDefLine);
722
                                        writers[1]=writer2;
723
                                        drivers[1]=getOpenShpDriver(fileLines);
724
                                        //drivers[1]=null;
725

    
726
                                        ShpWriter writer3 = (ShpWriter) LayerFactory.getWM().getWriter(
727
                                        "Shape Writer");
728
                                        // Pol?gonos
729
                                        String auxPolygon = path.replaceFirst("\\.shp", "_polygons.shp");
730
                                        SHPLayerDefinition lyrDefPolygon = new SHPLayerDefinition();
731
                                        lyrDefPolygon.setFieldsDesc(fieldsDescrip);
732
                                        File filePolygons = new File(auxPolygon);
733
                                        lyrDefPolygon.setFile(filePolygons);
734
                                        lyrDefPolygon.setName(filePolygons.getName());
735
                                        lyrDefPolygon.setShapeType(FShape.POLYGON);
736
                                        loadEnconding(layer, writer3);
737
                                        writer3.setFile(filePolygons);
738
                                        writer3.initialize(lyrDefPolygon);
739
                                        writers[2]=writer3;
740
                                        drivers[2]=getOpenShpDriver(filePolygons);
741
                                        //drivers[2]=null;
742

    
743
                                        writeMultiFeatures(mapContext,layer, writers, drivers);
744
                                } else {
745
                                        ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter(
746
                                        "Shape Writer");
747
                                        loadEnconding(layer, writer);
748
                                        IndexedShpDriver drv = getOpenShpDriver(newFile);
749
                                        SHPLayerDefinition lyrDef = new SHPLayerDefinition();
750
                                        lyrDef.setFieldsDesc(fieldsDescrip);
751
                                        lyrDef.setFile(newFile);
752
                                        lyrDef.setName(newFile.getName());
753
                                        lyrDef.setShapeType(layer.getTypeIntVectorLayer());
754
                                        writer.setFile(newFile);
755
                                        writer.initialize(lyrDef);
756
                                        // CODIGO PARA EXPORTAR UN SHP A UN CHARSET DETERMINADO
757
                                        // ES UTIL PARA QUE UN DBF SE VEA CORRECTAMENTE EN EXCEL, POR EJEMPLO
758
                                        //                                        Charset resul = (Charset) JOptionPane.showInputDialog((Component)PluginServices.getMDIManager().getActiveWindow(),
759
                                        //                                                                PluginServices.getText(ExportTo.class, "select_charset_for_writing"),
760
                                        //                                                                "Charset", JOptionPane.QUESTION_MESSAGE, null,
761
                                        //                                                                Charset.availableCharsets().values().toArray(),
762
                                        //                                                                writer.getCharsetForWriting().displayName());
763
                                        //                                        if (resul == null)
764
                                        //                                                return;
765
                                        //                                        Charset charset = resul;
766
                                        //                                        writer.setCharsetForWriting(charset);
767
                                        writeFeatures(mapContext, layer, writer, drv);
768

    
769
                                }
770
                        }
771
                } catch (InitializeWriterException e) {
772
                        NotificationManager.addError(e.getMessage(),e);
773
                } catch (OpenDriverException e) {
774
                        NotificationManager.addError(e.getMessage(),e);
775
                } catch (ReadDriverException e) {
776
                        NotificationManager.addError(e.getMessage(),e);
777
                } catch (DriverLoadException e) {
778
                        NotificationManager.addError(e.getMessage(),e);
779
                }
780

    
781
        }
782

    
783
        /**
784
         * Loads the dbf enconding
785
         * @param layer
786
         * @param writer
787
         */
788
        private void loadEnconding(FLyrVect layer, ShpWriter writer) {
789
                String charSetName = prefs.get("dbf_encoding", DbaseFile.getDefaultCharset().toString());
790
                if(layer.getSource() instanceof VectorialFileAdapter) {
791
                    writer.loadDbfEncoding(((VectorialFileAdapter)layer.getSource()).getFile().getAbsolutePath(), Charset.forName(charSetName));
792
                } else {
793
                        Object s = layer.getProperty("DBFFile");
794
                        if(s != null && s instanceof String) {
795
                            writer.loadDbfEncoding((String)s, Charset.forName(charSetName));
796
                        }
797
                }
798
        }
799

    
800
        private IndexedShpDriver getOpenShpDriver(File fileShp) throws OpenDriverException {
801
                IndexedShpDriver drv = new IndexedShpDriver();
802
                if (!fileShp.exists()) {
803
                        try {
804
                                fileShp.createNewFile();
805
                                File newFileSHX=new File(fileShp.getAbsolutePath().replaceAll("[.]shp",".shx"));
806
                                newFileSHX.createNewFile();
807
                                File newFileDBF=new File(fileShp.getAbsolutePath().replaceAll("[.]shp",".dbf"));
808
                                newFileDBF.createNewFile();
809
                        } catch (IOException e) {
810
                                throw new FileNotFoundDriverException("SHP",e,fileShp.getAbsolutePath());
811
                        }
812
                }
813
                drv.open(fileShp);
814
                return drv;
815
        }
816
        /**
817
         * @see com.iver.andami.plugins.IExtension#isEnabled()
818
         */
819
        public boolean isEnabled() {
820
                int status = EditionUtilities.getEditionStatus();
821
                if (( status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE || status == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE)
822
                                || (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE)|| (status == EditionUtilities.EDITION_STATUS_MULTIPLE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE))
823
                {
824
                        return true;
825
                }
826
                return false;
827
        }
828

    
829
        /**
830
         * @see com.iver.andami.plugins.IExtension#isVisible()
831
         */
832
        public boolean isVisible() {
833
                com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
834
                .getActiveWindow();
835

    
836
                if (f == null) {
837
                        return false;
838
                }
839

    
840
                if (f instanceof View) {
841
                    return true;
842
                }
843
                return false;
844
        }
845

    
846
        private int findFileByName(FieldDescription[] fields, String fieldName){
847
                for (int i=0; i < fields.length; i++)
848
                {
849
                        FieldDescription f = fields[i];
850
                        if (f.getFieldName().equalsIgnoreCase(fieldName))
851
                        {
852
                                return i;
853
                        }
854
                }
855

    
856
                return -1;
857

    
858
        }
859

    
860
        /**
861
         * This class is used to execute a command at the end of a
862
         * export process.
863
         * @author jpiera
864
         *
865
         */
866
        public interface EndExportToCommand{
867
                public void execute() throws Exception;
868
        }
869

    
870
}
871

    
872
// [eiel-gestion-conexiones]