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 @ 1259

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
    private NamesTranslator namesTranslator;
100

    
101

    
102

    
103
    // private Object inputParameters = null;
104

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

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

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

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

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

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

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

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

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

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

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

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

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

    
192

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

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

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

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

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

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

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

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

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

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

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

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

    
316
    }
317

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
562
    @Override
563
    public Object getCRS() {
564

    
565
        return m_Projection;
566

    
567
    }
568

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

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

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

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

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

    
620
    }
621

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

    
627

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

    
639

    
640

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

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

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

    
662
    private void initializeNamesAndTypes() {
663

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

    
673
    }
674

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

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