Statistics
| Revision:

gvsig-geoprocess / org.gvsig.geoprocess / trunk / org.gvsig.geoprocess / org.gvsig.geoprocess.lib / org.gvsig.geoprocess.lib.sextante / src / main / java / org / gvsig / geoprocess / lib / sextante / dataObjects / FlyrVectIVectorLayer.java @ 1258

History | View | Annotate | Download (25.9 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.geoprocess.lib.sextante.dataObjects;
25

    
26
import java.awt.geom.Rectangle2D;
27
import java.io.File;
28
import java.sql.Types;
29
import java.util.ArrayList;
30
import java.util.Iterator;
31
import java.util.List;
32

    
33
import org.cresques.cts.IProjection;
34

    
35
import org.gvsig.fmap.dal.DALLocator;
36
import org.gvsig.fmap.dal.DataManager;
37
import org.gvsig.fmap.dal.DataServerExplorer;
38
import org.gvsig.fmap.dal.DataStoreParameters;
39
import org.gvsig.fmap.dal.exception.DataException;
40
import org.gvsig.fmap.dal.exception.ReadException;
41
import org.gvsig.fmap.dal.feature.EditableFeature;
42
import org.gvsig.fmap.dal.feature.EditableFeatureType;
43
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
44
import org.gvsig.fmap.dal.feature.FeatureSelection;
45
import org.gvsig.fmap.dal.feature.FeatureStore;
46
import org.gvsig.fmap.dal.feature.FeatureType;
47
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
48
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
49
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
50
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
51
import org.gvsig.fmap.geom.DataTypes;
52
import org.gvsig.fmap.geom.GeometryLocator;
53
import org.gvsig.fmap.geom.GeometryManager;
54
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
55
import org.gvsig.fmap.geom.operation.GeometryOperationException;
56
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
57
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
58
import org.gvsig.fmap.geom.type.GeometryType;
59
import org.gvsig.fmap.geom.type.GeometryTypeNotSupportedException;
60
import org.gvsig.fmap.geom.type.GeometryTypeNotValidException;
61
import org.gvsig.fmap.mapcontext.MapContextLocator;
62
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
63
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
64
import org.gvsig.tools.ToolsLocator;
65
import org.gvsig.tools.dataTypes.DataTypesManager;
66

    
67
import com.vividsolutions.jts.geom.Geometry;
68

    
69
import es.unex.sextante.core.Sextante;
70
import es.unex.sextante.dataObjects.AbstractVectorLayer;
71
import es.unex.sextante.dataObjects.IFeatureIterator;
72
import es.unex.sextante.dataObjects.IVectorLayer;
73
import es.unex.sextante.outputs.FileOutputChannel;
74
import es.unex.sextante.outputs.IOutputChannel;
75
import org.slf4j.Logger;
76
import org.slf4j.LoggerFactory;
77

    
78
import org.gvsig.tools.namestranslator.NamesTranslator;
79

    
80
public class FlyrVectIVectorLayer extends AbstractVectorLayer {
81

    
82
    private static final Logger logger = LoggerFactory.getLogger(FlyrVectIVectorLayer.class);
83
    
84
    private static final DataManager DATA_MANAGER = DALLocator.getDataManager();
85

    
86
    private final int PRECISION = 5;
87
    private FeatureStore featureStore = null;
88
    private IProjection m_Projection = null;
89
    private FeatureType featureType = null;
90
    private GeometryManager geometryManager = null;
91
    private FLyrVect m_Layer;
92
    private String m_sName;
93
    private IOutputChannel m_Channel;
94
    private String fileName = null;
95

    
96
    private List<String> names = new ArrayList<String>();
97
    private List<Class<?>> types = new ArrayList<Class<?>>();
98
    private String viewName = null;
99

    
100

    
101

    
102
    // private Object inputParameters = null;
103

    
104
    public FlyrVectIVectorLayer() {
105
        geometryManager = GeometryLocator.getGeometryManager();
106
    }
107

    
108
    public void create(String sName, Object inputParams, int iShapeType,
109
        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
110
        create(sName, inputParams, iShapeType,
111
        types, sFields, crs, fieldSize, org.gvsig.fmap.geom.Geometry.SUBTYPES.UNKNOWN);
112
    }
113
    public void create(String sName, Object inputParams, int iShapeType,
114
        Class[] types, String[] sFields, Object crs, int[] fieldSize, int subtype) {
115
        try {
116
            // inputParameters = inputParams;
117
            m_sName = sName;
118
            m_Projection = (IProjection) crs;
119

    
120
            if (inputParams instanceof OutputParameters) {
121
                OutputParameters outputParam = (OutputParameters) inputParams;
122
                NewFeatureStoreParameters newParams =
123
                    outputParam.getDataParameters();
124
                DataServerExplorer dataServerExplorer =
125
                    outputParam.getExplorer();
126

    
127
                featureType = newParams.getDefaultFeatureType();
128
                loadFeatureType(sFields, types, iShapeType, crs,
129
                    (EditableFeatureType) featureType, fieldSize, subtype);
130
                newParams.setDynValue("CRS", m_Projection);
131

    
132
                DATA_MANAGER.newStore(dataServerExplorer.getProviderName(),
133
                    newParams.getDataStoreName(), newParams, true);
134

    
135
                featureStore =
136
                    (FeatureStore) DATA_MANAGER.openStore(
137
                        newParams.getDataStoreName(), newParams);
138
                initializeNamesAndTypes();
139
                featureStore.edit(FeatureStore.MODE_APPEND);
140
            }
141

    
142
            if (inputParams instanceof FilesystemStoreParameters) {
143
                // TODO: Terminar para todo tipo fuentes de datos. No se puede
144
                // hacer ahora pq falta poder obtener un FeatureType del
145
                // parameter.
146
                // Esto es as? pq el store registra parameters para cargar
147
                // ficheros y no para escribirlos.
148
                String path =
149
                    ((FilesystemStoreParameters) inputParams).getFile()
150
                        .getAbsolutePath();
151
                create(sName, path, iShapeType, types, sFields, crs, fieldSize);
152
            }
153

    
154
            if (inputParams instanceof String) {
155
                create(sName, (String) inputParams, iShapeType, types, sFields,
156
                    crs, fieldSize);
157
            }
158

    
159
        } catch (Exception e) {
160
            Sextante.addErrorToLog(e);
161
        }
162
    }
163

    
164
    public void create(final String sName, final String sFilename,
165
        final int iShapeType, final Class<?>[] types, final String[] sFields,
166
        final Object crs, final int[] fieldSize) {
167
        create(sName, sFilename, iShapeType, types, sFields, crs, fieldSize, org.gvsig.fmap.geom.Geometry.SUBTYPES.UNKNOWN);
168
    }
169

    
170
    public void create(final String sName, final String sFilename,
171
        final int iShapeType, final Class<?>[] types, final String[] sFields,
172
        final Object crs, final int[] fieldSize, int subtype) {
173

    
174
        try {
175
            // inputParameters = sFilename;
176
            m_sName = sName;
177
            m_Projection = (IProjection) crs;
178
            fileName = sFilename;
179

    
180
            final FilesystemServerExplorerParameters explorerParams =
181
                (FilesystemServerExplorerParameters) DATA_MANAGER
182
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
183
            explorerParams.setRoot(new File(sFilename).getParent());
184
            final FilesystemServerExplorer explorer =
185
                (FilesystemServerExplorer) DATA_MANAGER.openServerExplorer(
186
                    FilesystemServerExplorer.NAME, explorerParams);
187
            File file = new File(sFilename);
188
            final NewFeatureStoreParameters newParams =
189
                (NewFeatureStoreParameters) explorer.getAddParameters(file);
190

    
191

    
192
            EditableFeatureType editableFeatureType =
193
                newParams.getDefaultFeatureType();
194
            featureType = editableFeatureType;
195
            loadFeatureType(sFields, types, iShapeType, crs,
196
                editableFeatureType, fieldSize, subtype);
197

    
198
            newParams.setDefaultFeatureType(featureType);
199
            newParams.setDynValue("crs", m_Projection);
200

    
201
            explorer.add(newParams.getDataStoreName(), newParams, true);
202

    
203
            DataStoreParameters params = DATA_MANAGER.createStoreParameters(newParams.getDataStoreName());
204
            params.setDynValue("shpfile", sFilename);
205
            params.setDynValue("crs", m_Projection);
206

    
207
            featureStore = (FeatureStore) DATA_MANAGER.openStore(params.getDataStoreName(), params);
208
            featureStore.edit(FeatureStore.MODE_APPEND);
209
            featureType = featureStore.getDefaultFeatureType();
210
            initializeNamesAndTypes();
211

    
212
        } catch (final Exception e) {
213
            Sextante.addErrorToLog(e);
214
        }
215
    }
216

    
217
    private void loadFeatureType(String[] fields, final Class<?>[] types,
218
        final int shapeType, final Object crs,
219
        final EditableFeatureType featureType, final int[] fieldSize, final int subtype) {
220
        final int[] iTypes = getTypes(types);
221

    
222
        NamesTranslator namesTranslator = NamesTranslator.createTrimTranslator(11);
223
        namesTranslator.setSourceNames(fields);
224
        fields = namesTranslator.getTranslatedNamesAsArray();
225
        
226
        for (int i = 0; i < fields.length; i++) {
227
          switch(iTypes[i]) {
228
            case DataTypes.GEOMETRY:
229
                // No se hace nada porque el resultado de los geoprocesos 
230
                // deben dejar una unica columna de geometria
231
                // que a?adimos al final
232
                break;
233
            case DataTypes.DECIMAL:
234
                // Coma fija, soportan precision y escala, pero no size.
235
                featureType.add(fields[i], iTypes[i])
236
                        .setAllowNull(true)
237
                        .setPrecision(fieldSize[i])
238
                  .setScale(PRECISION);
239
                break;
240
            case DataTypes.DOUBLE:
241
            case DataTypes.FLOAT:
242
                // Coma flotante; escala variable y preciosion fija.
243
                // No soporta que se indiquen ninguna de las dos.
244
                // Tampoco soporta size.
245
                featureType.add(fields[i], iTypes[i])
246
                        .setAllowNull(true);
247
                break;
248
            case DataTypes.STRING:
249
                // Los string tienen size.
250
                featureType.add(fields[i], iTypes[i])
251
                        .setAllowNull(true)
252
                        .setSize(fieldSize[i]);
253
                break;
254
            default:
255
                featureType.add(fields[i], iTypes[i])
256
                        .setAllowNull(true);
257
          }
258
        }
259

    
260
        FeatureAttributeDescriptor desc =
261
            featureType.getDefaultGeometryAttribute();
262
        if (desc == null) {
263
            addGeometryAttribute("GEOMETRY", shapeType, subtype, featureType);
264
            featureType.setDefaultGeometryAttributeName("GEOMETRY");
265
        }
266
    }
267

    
268
    private void addGeometryAttribute(final String fieldName,
269
        final int shapeType, final int subtype, final EditableFeatureType featureType) {
270
        try {
271
            GeometryType type;
272
            if (subtype == org.gvsig.fmap.geom.Geometry.SUBTYPES.UNKNOWN) {
273
                type =
274
                    geometryManager.getGeometryType(getgvSIGShapeType(shapeType),
275
                        org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
276
            } else {
277
                type =
278
                    geometryManager.getGeometryType(getgvSIGShapeType(shapeType),subtype);
279
            }
280
            featureType.add(fieldName, DataTypes.GEOMETRY)
281
                .setGeometryType(type);
282
        } catch (GeometryTypeNotSupportedException e) {
283
            throw new RuntimeException(
284
                "Error getting geometry type with type = "
285
                    + getgvSIGShapeType(shapeType) + ", subtype = "
286
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
287
        } catch (GeometryTypeNotValidException e) {
288
            throw new RuntimeException(
289
                "Error getting geometry type with type = "
290
                    + getgvSIGShapeType(shapeType) + ", subtype = "
291
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
292
        }
293
    }
294

    
295
    private int[] getTypes(Class<?>[] classes) {
296
        DataTypesManager typesManager = ToolsLocator.getDataTypesManager();
297
        int[] types = new int[classes.length];
298
        for (int i = 0; i < classes.length; i++) {
299
            types[i] = typesManager.getDataType(classes[i]).getType();
300
        }
301
        return types;
302
    }
303

    
304
    public void create(final FLyrVect layer) {
305
        m_Layer = layer;
306
        try {
307
            featureStore = layer.getFeatureStore();
308
            featureType = featureStore.getDefaultFeatureType();
309
            initializeNamesAndTypes();
310
            m_Projection = layer.getProjection();
311
        } catch (final Exception e) {
312
            Sextante.addErrorToLog(e);
313
        }
314

    
315
    }
316

    
317
    @Override
318
    public void open() {
319
        if (m_Layer == null) {
320
            try {
321

    
322
                    m_Layer = (FLyrVect) MapContextLocator.getMapContextManager().createLayer(
323
                        getFilename(), featureStore);
324
            } catch (final LoadLayerException e) {
325
                Sextante.addErrorToLog(e);
326
                throw new RuntimeException(e);
327
            }
328
        }
329
    }
330

    
331
    @Override
332
    public void close() {
333
        if( this.m_Layer==null ) {           
334
            this.free();
335
        }
336
    }
337

    
338
    /**
339
     * Returns the length of field
340
     *
341
     * @param dataType
342
     * @return length of field
343
     */
344
    public int getDataTypeLength(final int dataType) {
345
        switch (dataType) {
346
        case Types.NUMERIC:
347
        case Types.DOUBLE:
348
        case Types.REAL:
349
        case Types.FLOAT:
350
        case Types.BIGINT:
351
        case Types.INTEGER:
352
        case Types.DECIMAL:
353
            return 20;
354
        case Types.CHAR:
355
        case Types.VARCHAR:
356
        case Types.LONGVARCHAR:
357
            return 254;
358
        case Types.DATE:
359
            return 8;
360
        case Types.BOOLEAN:
361
        case Types.BIT:
362
            return 1;
363
        }
364
        return 0;
365
    }
366

    
367
    @SuppressWarnings("unchecked")
368
    @Override
369
    public void addFeature(final Geometry geom, final Object[] values) {
370
        try {
371
            org.gvsig.fmap.geom.Geometry iGeo = null;
372

    
373
            final GeometryOperationContext ctx = new GeometryOperationContext();
374
            ctx.setAttribute(FromJTS.PARAM, geom);
375
            try {
376
                iGeo =
377
                    (org.gvsig.fmap.geom.Geometry) geometryManager
378
                        .invokeOperation(FromJTS.NAME, ctx);
379
            } catch (final GeometryOperationNotSupportedException e) {
380
                Sextante.addErrorToLog(e);
381
                return;
382
            } catch (final GeometryOperationException e) {
383
                Sextante.addErrorToLog(e);
384
                return;
385
            }
386

    
387
            final EditableFeature ef = featureStore.createNewFeature();
388
            final Iterator<FeatureAttributeDescriptor> features =
389
                featureType.iterator();
390

    
391
            int i = 0;
392
            while (features.hasNext()) {
393
                final FeatureAttributeDescriptor featureAttributeDescriptor =
394
                    features.next();
395
                if (!featureAttributeDescriptor.getName().equals(
396
                    featureType.getDefaultGeometryAttributeName())) {
397
                               ef.set(featureAttributeDescriptor.getName(), values[i]);
398
                }
399
                i++;
400
            }
401
            ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
402
            featureStore.insert(ef);
403
        } catch (final Exception e) {
404
            e.printStackTrace();
405
        }
406
    }
407

    
408
    @Override
409
    public IFeatureIterator iterator() {
410
        if (m_Layer != null) {
411
            return new DALIFeatureIterator(m_Layer, getFilters());
412
        } else {
413
            // cannot iterate layers being edited
414
            return new DALIFeatureIterator();
415
        }
416
    }
417

    
418
    @Override
419
    public String getFieldName(final int i) {
420
        if (names != null) {
421
            return names.get(i);
422
        }
423
        return null;
424
    }
425

    
426
    @Override
427
    public Class<?> getFieldType(final int i) {
428
            return types.get(i);
429
    }
430

    
431
    @Override
432
    public int getFieldCount() {
433
        if (featureStore != null) {
434
            return names.size();
435
        }
436
        return 0;
437
    }
438

    
439
    @Override
440
    public int getShapesCount() {
441
        if (featureStore != null) {
442
            try {
443
                    FeatureSelection featureSelection = featureStore.getFeatureSelection();
444
                    if (!featureSelection.isEmpty()) {
445
                            return (int)featureSelection.getSize();
446
                    } else {
447
                            return (int)featureStore.getFeatureSet().getSize();
448
                    }
449
            } catch (final DataException e) {
450
                Sextante.addErrorToLog(e);
451
                return 0;
452
            }
453
        }
454
        return 0;
455
    }
456

    
457
    @Override
458
    public int getShapeType() {
459
        if (featureStore != null) {
460
            if( featureType == null ) {
461
                logger.warn("The layer '"+this.getName()+"' not has a feature type.");
462
                return org.gvsig.fmap.geom.Geometry.TYPES.GEOMETRY;
463
            }
464
            FeatureAttributeDescriptor attr = featureType.getDefaultGeometryAttribute();
465
            if( attr == null ) {
466
                logger.warn("The layer '"+this.getName()+"' not has a geometry attribute.");
467
                return org.gvsig.fmap.geom.Geometry.TYPES.GEOMETRY;
468
            }
469
            GeometryType geomType = attr.getGeomType();
470
            if( geomType == null ) {
471
                logger.warn("The geometry field of layer '"+this.getName()+"' not has a geometry type.");
472
                return org.gvsig.fmap.geom.Geometry.TYPES.GEOMETRY;
473
            }
474
            return getShapeTypeFromGvSIGShapeType(geomType.getType());
475
        }
476
        return org.gvsig.fmap.geom.Geometry.TYPES.GEOMETRY;
477
    }
478

    
479
    private int getShapeTypeFromGvSIGShapeType(final int shapeType) {
480
        
481
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.SURFACE, shapeType) ) {
482
            return IVectorLayer.SHAPE_TYPE_POLYGON;
483
        }
484
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.MULTISURFACE, shapeType) ) {
485
            return IVectorLayer.SHAPE_TYPE_POLYGON;
486
        }
487
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.CURVE, shapeType) ) {
488
            return IVectorLayer.SHAPE_TYPE_LINE;
489
        }
490
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE, shapeType) ) {
491
            return IVectorLayer.SHAPE_TYPE_LINE;
492
        }
493
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.POINT, shapeType) ) {
494
            return IVectorLayer.SHAPE_TYPE_POINT;
495
        }
496
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT, shapeType) ) {
497
            return IVectorLayer.SHAPE_TYPE_POINT;
498
        }
499
        try {
500
            throw new IllegalArgumentException();
501
        } catch(Exception ex) {
502
            logger.warn("Geometry type "+ shapeType + " not supported.", ex);
503
        }
504
        return IVectorLayer.SHAPE_TYPE_POLYGON;
505
    }
506

    
507
    private int getgvSIGShapeType(final int shapeType) {
508
        switch (shapeType) {
509
        case IVectorLayer.SHAPE_TYPE_POLYGON:
510
            return org.gvsig.fmap.geom.Geometry.TYPES.POLYGON;
511
        case IVectorLayer.SHAPE_TYPE_LINE:
512
            return org.gvsig.fmap.geom.Geometry.TYPES.LINE;
513
        case IVectorLayer.SHAPE_TYPE_POINT:
514
            return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
515
        case IVectorLayer.SHAPE_TYPE_MULTIPOLYGON:
516
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOLYGON;
517
        case IVectorLayer.SHAPE_TYPE_MULTILINE:
518
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTILINE;
519
        case IVectorLayer.SHAPE_TYPE_MULTIPOINT:
520
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT;
521
        default:
522
            return org.gvsig.fmap.geom.Geometry.TYPES.POLYGON;
523
        }
524
    }
525

    
526
    @Override
527
    public String getName() {
528
        if (m_Layer != null) {
529
            return m_Layer.getName();
530
        } else {
531
            return m_sName;
532
        }
533
    }
534

    
535
    @Override
536
    public void postProcess() {
537
        if (featureStore == null) {
538
            return;
539
        }
540
        try {
541
            if( featureStore.isEditing() || featureStore.isAppending() ) {
542
                featureStore.finishEditing();
543
            }
544
            String name = featureStore.getProviderName();
545
            DataStoreParameters params = featureStore.getParameters();
546
            featureStore.dispose();
547
            featureStore = (FeatureStore) DALLocator.getDataManager().openStore(name, params);
548
            featureType = featureStore.getDefaultFeatureType();
549
        } catch (final Exception e) {
550
            logger.warn("Can't execute postProcess on '"+this.getName()+"'.",e);
551
                }
552
    }
553

    
554
    public String getFilename() {
555
            if(fileName != null)
556
                    return fileName;
557
            else
558
                    return m_sName;
559
    }
560

    
561
    @Override
562
    public Object getCRS() {
563

    
564
        return m_Projection;
565

    
566
    }
567

    
568
    @Override
569
    public void setName(final String name) {
570
        m_sName = name;
571
    }
572

    
573
    @Override
574
    public Object getBaseDataObject() {
575
        return m_Layer;
576
    }
577

    
578
    @Override
579
    public void free() {
580
        if( this.featureStore!=null ) {
581
            if( featureStore.isEditing() || featureStore.isAppending() ) {
582
                try {
583
                    featureStore.finishEditing();
584
                } catch (DataException ex) {
585
                    logger.warn("Can't free '"+this.getName()+"'.",ex);
586
                }
587
            }            
588
            featureStore.dispose();
589
            featureStore = null;
590
        }
591
        if( m_Layer!=null ) {
592
            m_Layer.dispose();
593
            m_Layer = null;
594
        }
595
    }
596

    
597
    @Override
598
    public IOutputChannel getOutputChannel() {
599
        if (featureStore != null) {
600
            final DataStoreParameters dsp = featureStore.getParameters();
601
            if (dsp instanceof FilesystemStoreParameters) {
602
                String file =
603
                    ((FilesystemStoreParameters) dsp).getFile()
604
                        .getAbsolutePath();
605
                return new FileOutputChannel(file);
606
            } else {
607
                return null;
608
            }
609
        } else {
610
            return m_Channel;
611
        }
612
    }
613

    
614
    @Override
615
    public boolean canBeEdited() {
616
        // we support only file-based, so we can overwrite
617
        return true;
618

    
619
    }
620

    
621
    @Override
622
    public FeatureStore getFeatureStore() {
623
        return featureStore;
624
    }
625

    
626

    
627
    @Override
628
    public Rectangle2D getFullExtent() {
629
            org.gvsig.fmap.geom.primitive.Envelope envelope;
630
                try {
631
                        envelope = featureStore.getEnvelope();
632
                        return new Rectangle2D.Double(envelope.getMinimum(0), envelope.getMinimum(1), envelope.getLength(0), envelope.getLength(1));
633
                } catch (DataException e) {
634
                        return null;
635
                }
636
    }
637

    
638

    
639

    
640
    @Override
641
    public String[] getFieldNames() {
642
            return (String[]) names.toArray(new String[names.size()]);
643
    }
644

    
645
    @Override
646
    public int getFieldIndexByName(final String sFieldName) {
647
            String[] names = getFieldNames();
648
            for (int i = 0; i < names.length; i++) {
649
                        if(names[i].equalsIgnoreCase(sFieldName)) {
650
                                return i;
651
                        }
652
                }
653
            return -1;
654
    }
655

    
656
    @Override
657
    public Class<?>[] getFieldTypes() {
658
            return (Class<?>[]) types.toArray(new Class<?>[types.size()]);
659
    }
660

    
661
    private void initializeNamesAndTypes() {
662

    
663
            int defaultGeometryAttributeIndex = this.featureType.getDefaultGeometryAttributeIndex();
664
            for(int i = 0; i < this.featureType.size(); i++){
665
                    if(i!=defaultGeometryAttributeIndex){
666
                            FeatureAttributeDescriptor attributeDescriptor = this.featureType.getAttributeDescriptor(i);
667
                                names.add(attributeDescriptor.getName());
668
                            types.add(attributeDescriptor.getDataType().getDefaultClass());
669
                    }
670
            }
671

    
672
    }
673

    
674
    /* (non-Javadoc)
675
     * @see es.unex.sextante.dataObjects.IVectorLayer#getSubType()
676
     */
677
    @Override
678
    public int getSubType() throws ReadException {
679
        if(m_Layer!=null){
680
            return m_Layer.getGeometryType().getSubType();
681
        }
682
        return org.gvsig.fmap.geom.Geometry.SUBTYPES.UNKNOWN;
683
    }
684
    public int getFeatureIndexByFieldIndex(int i) {
685
        String name = this.names.get(i);
686
        FeatureAttributeDescriptor attrDesc = this.featureType.getAttributeDescriptor(name);
687
        int x = attrDesc.getIndex();
688
        return x;
689
    }
690
    public String getFeatureNameByFieldIndex(int i) {
691
        String name = this.names.get(i);
692
        FeatureAttributeDescriptor attrDesc = this.featureType.getAttributeDescriptor(name);
693
        return attrDesc.getName();
694
    }
695

    
696
    public void setViewName(String viewName) {
697
        this.viewName = viewName;
698
    }
699
    
700
    @Override
701
    public String getContextName() {
702
        return this.viewName;
703
    }
704
    
705
    @Override
706
    public boolean hasSelection() {
707
        try {
708
            FeatureSelection featureSelection = featureStore.getFeatureSelection();
709
            if (!featureSelection.isEmpty()){
710
                return true;
711
            }
712
            return false;
713
        } catch (DataException ex) {
714
            return false;
715
        }
716
        
717
    }
718
}