Statistics
| Revision:

gvsig-geoprocess / org.gvsig.geoprocess / branches / refactor-2018 / org.gvsig.geoprocess / org.gvsig.geoprocess.lib / org.gvsig.geoprocess.lib.sextante / src / main / java / org / gvsig / geoprocess / lib / sextante / dataObjects / FlyrVectIVectorLayer.java @ 1055

History | View | Annotate | Download (23.1 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
public class FlyrVectIVectorLayer extends AbstractVectorLayer {
79

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

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

    
94
    private List<String> names = new ArrayList<String>();
95
        private List<Class<?>> types = new ArrayList<Class<?>>();
96

    
97

    
98

    
99
    // private Object inputParameters = null;
100

    
101
    public FlyrVectIVectorLayer() {
102
        geometryManager = GeometryLocator.getGeometryManager();
103
    }
104

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

    
117
            if (inputParams instanceof OutputParameters) {
118
                OutputParameters outputParam = (OutputParameters) inputParams;
119
                NewFeatureStoreParameters newParams =
120
                    outputParam.getDataParameters();
121
                DataServerExplorer dataServerExplorer =
122
                    outputParam.getExplorer();
123

    
124
                featureType = newParams.getDefaultFeatureType();
125
                loadFeatureType(sFields, types, iShapeType, crs,
126
                    (EditableFeatureType) featureType, fieldSize, subtype);
127
                newParams.setDynValue("CRS", m_Projection);
128

    
129
                DATA_MANAGER.newStore(dataServerExplorer.getProviderName(),
130
                    newParams.getDataStoreName(), newParams, true);
131

    
132
                featureStore =
133
                    (FeatureStore) DATA_MANAGER.openStore(
134
                        newParams.getDataStoreName(), newParams);
135
                initializeNamesAndTypes();
136
                featureStore.edit(FeatureStore.MODE_APPEND);
137
            }
138

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

    
151
            if (inputParams instanceof String) {
152
                create(sName, (String) inputParams, iShapeType, types, sFields,
153
                    crs, fieldSize);
154
            }
155

    
156
        } catch (Exception e) {
157
            Sextante.addErrorToLog(e);
158
        }
159
    }
160

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

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

    
171
        try {
172
            // inputParameters = sFilename;
173
            m_sName = sName;
174
            m_Projection = (IProjection) crs;
175
            fileName = sFilename;
176

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

    
188

    
189
            EditableFeatureType editableFeatureType =
190
                newParams.getDefaultFeatureType();
191
            featureType = editableFeatureType;
192
            loadFeatureType(sFields, types, iShapeType, crs,
193
                editableFeatureType, fieldSize, subtype);
194

    
195
            newParams.setDefaultFeatureType(featureType);
196
            newParams.setDynValue("crs", m_Projection);
197

    
198
            explorer.add(newParams.getDataStoreName(), newParams, true);
199

    
200
            DataStoreParameters params = DATA_MANAGER.createStoreParameters(newParams.getDataStoreName());
201
            params.setDynValue("shpfile", sFilename);
202
            params.setDynValue("crs", m_Projection);
203

    
204
            featureStore = (FeatureStore) DATA_MANAGER.openStore(params.getDataStoreName(), params);
205
            featureStore.edit(FeatureStore.MODE_APPEND);
206
            featureType = featureStore.getDefaultFeatureType();
207
            initializeNamesAndTypes();
208

    
209
        } catch (final Exception e) {
210
            Sextante.addErrorToLog(e);
211
        }
212
    }
213

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

    
219
        for (int i = 0; i < fields.length; i++) {
220
            if (iTypes[i] == DataTypes.GEOMETRY) {
221
                    // No se hace nada porque el resultado de los geoprocesos deben dejar una ?nica columna de geometr?a
222
                    // que a?adimos al final
223
            } else {
224
                featureType.add(fields[i], iTypes[i])
225
                        .setAllowNull(true)
226
                        .setSize(fieldSize[i])
227
                    .setPrecision(PRECISION);
228
            }
229
        }
230

    
231
        FeatureAttributeDescriptor desc =
232
            featureType.getDefaultGeometryAttribute();
233
        if (desc == null) {
234
            addGeometryAttribute("GEOMETRY", shapeType, subtype, featureType);
235
            featureType.setDefaultGeometryAttributeName("GEOMETRY");
236
        }
237
    }
238

    
239
    private void addGeometryAttribute(final String fieldName,
240
        final int shapeType, final int subtype, final EditableFeatureType featureType) {
241
        try {
242
            GeometryType type;
243
            if (subtype == org.gvsig.fmap.geom.Geometry.SUBTYPES.UNKNOWN) {
244
                type =
245
                    geometryManager.getGeometryType(getgvSIGShapeType(shapeType),
246
                        org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
247
            } else {
248
                type =
249
                    geometryManager.getGeometryType(getgvSIGShapeType(shapeType),subtype);
250
            }
251
            featureType.add(fieldName, DataTypes.GEOMETRY)
252
                .setGeometryType(type);
253
        } catch (GeometryTypeNotSupportedException e) {
254
            throw new RuntimeException(
255
                "Error getting geometry type with type = "
256
                    + getgvSIGShapeType(shapeType) + ", subtype = "
257
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
258
        } catch (GeometryTypeNotValidException e) {
259
            throw new RuntimeException(
260
                "Error getting geometry type with type = "
261
                    + getgvSIGShapeType(shapeType) + ", subtype = "
262
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
263
        }
264
    }
265

    
266
    private int[] getTypes(Class<?>[] classes) {
267
        DataTypesManager typesManager = ToolsLocator.getDataTypesManager();
268
        int[] dataTypes = new int[classes.length];
269
        for (int i = 0; i < classes.length; i++) {
270
            dataTypes[i] = typesManager.getDataType(classes[i]).getType();
271
        }
272
        return dataTypes;
273
    }
274

    
275
    public void create(final FLyrVect layer) {
276
        m_Layer = layer;
277
        try {
278
            featureStore = layer.getFeatureStore();
279
            featureType = featureStore.getDefaultFeatureType();
280
            initializeNamesAndTypes();
281
            m_Projection = layer.getProjection();
282
        } catch (final Exception e) {
283
            Sextante.addErrorToLog(e);
284
        }
285

    
286
    }
287

    
288
    @Override
289
    public void open() {
290
        if (m_Layer == null) {
291
            try {
292

    
293
                    m_Layer = (FLyrVect) MapContextLocator.getMapContextManager().createLayer(
294
                        getFilename(), featureStore);
295
            } catch (final LoadLayerException e) {
296
                Sextante.addErrorToLog(e);
297
                throw new RuntimeException(e);
298
            }
299
        }
300
    }
301

    
302
    @Override
303
    public void close() {
304
        if( this.m_Layer==null ) {           
305
            this.free();
306
        }
307
    }
308

    
309
    /**
310
     * Returns the length of field
311
     *
312
     * @param dataType
313
     * @return length of field
314
     */
315
    public int getDataTypeLength(final int dataType) {
316
        switch (dataType) {
317
        case Types.NUMERIC:
318
        case Types.DOUBLE:
319
        case Types.REAL:
320
        case Types.FLOAT:
321
        case Types.BIGINT:
322
        case Types.INTEGER:
323
        case Types.DECIMAL:
324
            return 20;
325
        case Types.CHAR:
326
        case Types.VARCHAR:
327
        case Types.LONGVARCHAR:
328
            return 254;
329
        case Types.DATE:
330
            return 8;
331
        case Types.BOOLEAN:
332
        case Types.BIT:
333
            return 1;
334
        }
335
        return 0;
336
    }
337

    
338
    @SuppressWarnings("unchecked")
339
    @Override
340
    public void addFeature(final Geometry geom, final Object[] values) {
341
        try {
342
            org.gvsig.fmap.geom.Geometry iGeo;
343

    
344
            final GeometryOperationContext ctx = new GeometryOperationContext();
345
            ctx.setAttribute(FromJTS.PARAM, geom);
346
            try {
347
                iGeo =
348
                    (org.gvsig.fmap.geom.Geometry) geometryManager
349
                        .invokeOperation(FromJTS.NAME, ctx);
350
            } catch (final GeometryOperationNotSupportedException e) {
351
                Sextante.addErrorToLog(e);
352
                return;
353
            } catch (final GeometryOperationException e) {
354
                Sextante.addErrorToLog(e);
355
                return;
356
            }
357

    
358
            final EditableFeature ef = featureStore.createNewFeature();
359
            final Iterator<FeatureAttributeDescriptor> features =
360
                featureType.iterator();
361

    
362
            int i = 0;
363
            while (features.hasNext()) {
364
                final FeatureAttributeDescriptor featureAttributeDescriptor =
365
                    features.next();
366
                if (!featureAttributeDescriptor.getName().equals(
367
                    featureType.getDefaultGeometryAttributeName())) {
368
                               ef.set(featureAttributeDescriptor.getName(), values[i]);
369
                }
370
                i++;
371
            }
372
            ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
373
            featureStore.insert(ef);
374
        } catch (final Exception e) {
375
            e.printStackTrace();
376
        }
377
    }
378

    
379
    @Override
380
    public IFeatureIterator iterator() {
381
        if (m_Layer != null) {
382
            return new DALIFeatureIterator(m_Layer, getFilters());
383
        } else {
384
            // cannot iterate layers being edited
385
            return new DALIFeatureIterator();
386
        }
387
    }
388

    
389
    @Override
390
    public String getFieldName(final int i) {
391
        if (featureStore != null) {
392
            return ((FeatureAttributeDescriptor) featureType.get(i)).getName();
393
        }
394
        return null;
395
    }
396

    
397
    @Override
398
    public Class<?> getFieldType(final int i) {
399
            return types.get(i);
400
    }
401

    
402
    @Override
403
    public int getFieldCount() {
404
        if (featureStore != null) {
405
            return names.size();
406
        }
407
        return 0;
408
    }
409

    
410
    @Override
411
    public int getShapesCount() {
412
        if (featureStore != null) {
413
            try {
414
                    FeatureSelection featureSelection = featureStore.getFeatureSelection();
415
                    if (!featureSelection.isEmpty()) {
416
                            return (int)featureSelection.getSize();
417
                    } else {
418
                            return (int)featureStore.getFeatureSet().getSize();
419
                    }
420
            } catch (final DataException e) {
421
                Sextante.addErrorToLog(e);
422
                return 0;
423
            }
424
        }
425
        return 0;
426
    }
427

    
428
    @Override
429
    public int getShapeType() {
430
        if (featureStore != null) {
431
            return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor) featureType
432
                .get(featureType.getDefaultGeometryAttributeIndex()))
433
                .getGeomType().getType());
434
        }
435
        return 0;
436
    }
437

    
438
    private int getShapeTypeFromGvSIGShapeType(final int shapeType) {
439
        
440
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.SURFACE, shapeType) ) {
441
            return IVectorLayer.SHAPE_TYPE_POLYGON;
442
        }
443
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.MULTISURFACE, shapeType) ) {
444
            return IVectorLayer.SHAPE_TYPE_POLYGON;
445
        }
446
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.CURVE, shapeType) ) {
447
            return IVectorLayer.SHAPE_TYPE_LINE;
448
        }
449
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE, shapeType) ) {
450
            return IVectorLayer.SHAPE_TYPE_LINE;
451
        }
452
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.POINT, shapeType) ) {
453
            return IVectorLayer.SHAPE_TYPE_POINT;
454
        }
455
        if( geometryManager.isSubtype(org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT, shapeType) ) {
456
            return IVectorLayer.SHAPE_TYPE_POINT;
457
        }
458
        try {
459
            throw new IllegalArgumentException();
460
        } catch(Exception ex) {
461
            logger.warn("Geometry type "+ shapeType + " not supported.", ex);
462
        }
463
        return IVectorLayer.SHAPE_TYPE_POLYGON;
464
    }
465

    
466
    private int getgvSIGShapeType(final int shapeType) {
467
        switch (shapeType) {
468
        case IVectorLayer.SHAPE_TYPE_POLYGON:
469
            return org.gvsig.fmap.geom.Geometry.TYPES.POLYGON;
470
        case IVectorLayer.SHAPE_TYPE_LINE:
471
            return org.gvsig.fmap.geom.Geometry.TYPES.LINE;
472
        case IVectorLayer.SHAPE_TYPE_POINT:
473
            return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
474
        case IVectorLayer.SHAPE_TYPE_MULTIPOLYGON:
475
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOLYGON;
476
        case IVectorLayer.SHAPE_TYPE_MULTILINE:
477
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTILINE;
478
        case IVectorLayer.SHAPE_TYPE_MULTIPOINT:
479
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT;
480
        default:
481
            return org.gvsig.fmap.geom.Geometry.TYPES.POLYGON;
482
        }
483
    }
484

    
485
    @Override
486
    public String getName() {
487
        if (m_Layer != null) {
488
            return m_Layer.getName();
489
        } else {
490
            return m_sName;
491
        }
492
    }
493

    
494
    @Override
495
    public void postProcess() {
496
        if (featureStore == null) {
497
            return;
498
        }
499
        try {
500
            if( featureStore.isEditing() || featureStore.isAppending() ) {
501
                featureStore.finishEditing();
502
            }
503
            String name = featureStore.getProviderName();
504
            DataStoreParameters params = featureStore.getParameters();
505
            featureStore.dispose();
506
            featureStore = (FeatureStore) DALLocator.getDataManager().openStore(name, params);
507
            featureType = featureStore.getDefaultFeatureType();
508
        } catch (final Exception e) {
509
            logger.warn("Can't execute postProcess on '"+this.getName()+"'.",e);
510
                }
511
    }
512

    
513
    public String getFilename() {
514
            if(fileName != null)
515
                    return fileName;
516
            else
517
                    return m_sName;
518
    }
519

    
520
    @Override
521
    public Object getCRS() {
522

    
523
        return m_Projection;
524

    
525
    }
526

    
527
    @Override
528
    public void setName(final String name) {
529
        m_sName = name;
530
    }
531

    
532
    @Override
533
    public Object getBaseDataObject() {
534
        return m_Layer;
535
    }
536

    
537
    @Override
538
    public void free() {
539
        if( this.featureStore!=null ) {
540
            if( featureStore.isEditing() || featureStore.isAppending() ) {
541
                try {
542
                    featureStore.finishEditing();
543
                } catch (DataException ex) {
544
                    logger.warn("Can't free '"+this.getName()+"'.",ex);
545
                }
546
            }            
547
            featureStore.dispose();
548
            featureStore = null;
549
        }
550
        if( m_Layer!=null ) {
551
            m_Layer.dispose();
552
            m_Layer = null;
553
        }
554
    }
555

    
556
    @Override
557
    public IOutputChannel getOutputChannel() {
558
        if (featureStore != null) {
559
            final DataStoreParameters dsp = featureStore.getParameters();
560
            if (dsp instanceof FilesystemStoreParameters) {
561
                String file =
562
                    ((FilesystemStoreParameters) dsp).getFile()
563
                        .getAbsolutePath();
564
                return new FileOutputChannel(file);
565
            } else {
566
                return null;
567
            }
568
        } else {
569
            return m_Channel;
570
        }
571
    }
572

    
573
    @Override
574
    public boolean canBeEdited() {
575
        // we support only file-based, so we can overwrite
576
        return true;
577

    
578
    }
579

    
580
    public FeatureStore getFeatureStore() {
581
        return featureStore;
582
    }
583

    
584

    
585
    @Override
586
    public Rectangle2D getFullExtent() {
587
            org.gvsig.fmap.geom.primitive.Envelope envelope;
588
                try {
589
                        envelope = featureStore.getEnvelope();
590
                        return new Rectangle2D.Double(envelope.getMinimum(0), envelope.getMinimum(1), envelope.getLength(0), envelope.getLength(1));
591
                } catch (DataException e) {
592
                        return null;
593
                }
594
    }
595

    
596

    
597

    
598
    @Override
599
    public String[] getFieldNames() {
600
            return (String[]) names.toArray(new String[names.size()]);
601
    }
602

    
603
    @Override
604
    public int getFieldIndexByName(final String sFieldName) {
605
            String[] fieldNames = getFieldNames();
606
            for (int i = 0; i < fieldNames.length; i++) {
607
                        if(fieldNames[i].equalsIgnoreCase(sFieldName)) {
608
                                return i;
609
                        }
610
                }
611
            return -1;
612
    }
613

    
614
    @Override
615
    public Class<?>[] getFieldTypes() {
616
            return (Class<?>[]) types.toArray(new Class<?>[types.size()]);
617
    }
618

    
619
    private void initializeNamesAndTypes() {
620

    
621
            int defaultGeometryAttributeIndex = this.featureType.getDefaultGeometryAttributeIndex();
622
            for(int i = 0; i < this.featureType.size(); i++){
623
                    if(i!=defaultGeometryAttributeIndex){
624
                            FeatureAttributeDescriptor attributeDescriptor = this.featureType.getAttributeDescriptor(i);
625
                                names.add(attributeDescriptor.getName());
626
                            types.add(attributeDescriptor.getDataType().getDefaultClass());
627
                    }
628
            }
629

    
630
    }
631

    
632
    /* (non-Javadoc)
633
     * @see es.unex.sextante.dataObjects.IVectorLayer#getSubType()
634
     */
635
    @Override
636
    public int getSubType() throws ReadException {
637
        if(m_Layer!=null){
638
            return m_Layer.getGeometryType().getSubType();
639
        }
640
        return org.gvsig.fmap.geom.Geometry.SUBTYPES.UNKNOWN;
641
    }
642
}