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

History | View | Annotate | Download (19.2 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.io.File;
27
import java.sql.Types;
28
import java.util.Iterator;
29

    
30
import com.vividsolutions.jts.geom.Geometry;
31

    
32
import es.unex.sextante.core.Sextante;
33
import es.unex.sextante.dataObjects.AbstractVectorLayer;
34
import es.unex.sextante.dataObjects.IFeatureIterator;
35
import es.unex.sextante.dataObjects.IVectorLayer;
36
import es.unex.sextante.outputs.FileOutputChannel;
37
import es.unex.sextante.outputs.IOutputChannel;
38

    
39
import org.cresques.cts.IProjection;
40

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

    
71
public class FlyrVectIVectorLayer extends AbstractVectorLayer {
72

    
73
    private static final DataManager DATA_MANAGER = DALLocator.getDataManager();
74

    
75
    private final int PRECISION = 5;
76
    private FeatureStore featureStore = null;
77
    private IProjection m_Projection = null;
78
    private FeatureType featureType = null;
79
    private GeometryManager geometryManager = null;
80
    private FLyrVect m_Layer;
81
    private String m_sName;
82
    private IOutputChannel m_Channel;
83

    
84
    // private Object inputParameters = null;
85

    
86
    public FlyrVectIVectorLayer() {
87
        geometryManager = GeometryLocator.getGeometryManager();
88
    }
89

    
90
    public void create(String sName, Object inputParams, int iShapeType,
91
        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
92
        try {
93
            // inputParameters = inputParams;
94
            m_sName = sName;
95
            m_Projection = (IProjection) crs;
96

    
97
            if (inputParams instanceof OutputParameters) {
98
                OutputParameters outputParam = (OutputParameters) inputParams;
99
                NewFeatureStoreParameters newParams =
100
                    outputParam.getDataParameters();
101
                DataServerExplorer dataServerExplorer =
102
                    outputParam.getExplorer();
103

    
104
                featureType = newParams.getDefaultFeatureType();
105
                loadFeatureType(sFields, types, iShapeType, crs,
106
                    (EditableFeatureType) featureType, fieldSize);
107
                newParams.setDynValue("CRS", m_Projection);
108

    
109
                DATA_MANAGER.newStore(dataServerExplorer.getProviderName(),
110
                    newParams.getDataStoreName(), newParams, true);
111

    
112
                featureStore =
113
                    (FeatureStore) DATA_MANAGER.openStore(
114
                        newParams.getDataStoreName(), newParams);
115
                featureStore.edit(FeatureStore.MODE_APPEND);
116
            }
117

    
118
            if (inputParams instanceof FilesystemStoreParameters) {
119
                // TODO: Terminar para todo tipo fuentes de datos. No se puede
120
                // hacer ahora pq falta poder obtener un FeatureType del
121
                // parameter.
122
                // Esto es as? pq el store registra parameters para cargar
123
                // ficheros y no para escribirlos.
124
                String path =
125
                    ((FilesystemStoreParameters) inputParams).getFile()
126
                        .getAbsolutePath();
127
                create(sName, path, iShapeType, types, sFields, crs, fieldSize);
128
            }
129

    
130
            if (inputParams instanceof String) {
131
                create(sName, (String) inputParams, iShapeType, types, sFields,
132
                    crs, fieldSize);
133
            }
134

    
135
            /*
136
             * NewFeatureStoreParameters param =
137
             * (NewFeatureStoreParameters)inputParams;
138
             * featureType = param.getDefaultFeatureType();
139
             * loadFeatureType(sFields, types, iShapeType, crs, featureType,
140
             * fieldSize);
141
             * 
142
             * param.setDefaultFeatureType(featureType);
143
             * 
144
             * DataManager manager = DALLocator.getDataManager();
145
             * featureStore = (FeatureStore) manager.createStore(param);
146
             * featureStore.edit(FeatureStore.MODE_APPEND);
147
             */
148

    
149
        } catch (Exception e) {
150
            Sextante.addErrorToLog(e);
151
        }
152
    }
153

    
154
    public void create(final String sName, final String sFilename,
155
        final int iShapeType, final Class<?>[] types, final String[] sFields,
156
        final Object crs, final int[] fieldSize) {
157

    
158
        try {
159
            // inputParameters = sFilename;
160
            m_sName = sName;
161
            m_Projection = (IProjection) crs;
162

    
163
            final FilesystemServerExplorerParameters explorerParams =
164
                (FilesystemServerExplorerParameters) DATA_MANAGER
165
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
166
            explorerParams.setRoot(new File(sFilename).getParent());
167
            final FilesystemServerExplorer explorer =
168
                (FilesystemServerExplorer) DATA_MANAGER.openServerExplorer(
169
                    FilesystemServerExplorer.NAME, explorerParams);
170
            final NewFeatureStoreParameters newParams =
171
                (NewFeatureStoreParameters) explorer.getAddParameters(new File(
172
                    sFilename));
173

    
174
            EditableFeatureType editableFeatureType =
175
                newParams.getDefaultFeatureType();
176
            featureType = editableFeatureType;
177
            loadFeatureType(sFields, types, iShapeType, crs,
178
                editableFeatureType, fieldSize);
179

    
180
            newParams.setDefaultFeatureType(featureType);
181
            newParams.setDynValue("crs", m_Projection);
182

    
183
            explorer.add(newParams.getDataStoreName(), newParams, true);
184
            featureStore =
185
                (FeatureStore) DATA_MANAGER.openStore(
186
                    newParams.getDataStoreName(), newParams);
187
            featureStore.edit(FeatureStore.MODE_APPEND);
188
            featureType = featureStore.getDefaultFeatureType();
189

    
190
        } catch (final Exception e) {
191
            Sextante.addErrorToLog(e);
192
        }
193
    }
194

    
195
    private void loadFeatureType(final String[] fields, final Class<?>[] types,
196
        final int shapeType, final Object crs,
197
        final EditableFeatureType featureType, final int[] fieldSize) {
198
        final int[] iTypes = getTypes(types);
199

    
200
        for (int i = 0; i < fields.length; i++) {
201
            if (iTypes[i] == DataTypes.GEOMETRY) {
202
                addGeometryAttribute(fields[i], shapeType, featureType);
203
            } else {
204
                featureType.add(fields[i], iTypes[i]).setSize(fieldSize[i])
205
                    .setPrecision(PRECISION);
206
            }
207
        }
208

    
209
        FeatureAttributeDescriptor desc =
210
            featureType.getAttributeDescriptor("GEOMETRY");
211
        if (desc == null) {
212
            addGeometryAttribute("GEOMETRY", shapeType, featureType);
213
        }
214
        featureType.setDefaultGeometryAttributeName("GEOMETRY");
215
    }
216

    
217
    private void addGeometryAttribute(final String fieldName,
218
        final int shapeType, final EditableFeatureType featureType) {
219
        try {
220
            GeometryType type =
221
                geometryManager.getGeometryType(getgvSIGShapeType(shapeType),
222
                    org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
223
            featureType.add(fieldName, DataTypes.GEOMETRY)
224
                .setGeometryType(type);
225
        } catch (GeometryTypeNotSupportedException e) {
226
            throw new RuntimeException(
227
                "Error getting geometry type with type = "
228
                    + getgvSIGShapeType(shapeType) + ", subtype = "
229
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
230
        } catch (GeometryTypeNotValidException e) {
231
            throw new RuntimeException(
232
                "Error getting geometry type with type = "
233
                    + getgvSIGShapeType(shapeType) + ", subtype = "
234
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
235
        }
236
    }
237

    
238
    private int[] getTypes(Class<?>[] classes) {
239
        DataTypesManager typesManager = ToolsLocator.getDataTypesManager();
240
        int[] types = new int[classes.length];
241
        for (int i = 0; i < classes.length; i++) {
242
            types[i] = typesManager.getDataType(classes[i]).getType();
243
        }
244
        return types;
245
    }
246

    
247
    public void create(final FLyrVect layer) {
248

    
249
        m_Layer = layer;
250
        try {
251
            featureStore = layer.getFeatureStore();
252
            featureType = featureStore.getDefaultFeatureType();
253
            m_Projection = layer.getProjection();
254
        } catch (final Exception e) {
255
            Sextante.addErrorToLog(e);
256
        }
257

    
258
    }
259

    
260
    @SuppressWarnings("deprecation")
261
    public void open() {
262

    
263
        if (m_Layer == null) {
264
            try {
265
                m_Layer =
266
                    (FLyrVect) LayerFactory.getInstance().createLayer(
267
                        getFilename(), featureStore);
268
            } catch (final LoadLayerException e) {
269
                Sextante.addErrorToLog(e);
270
                throw new RuntimeException(e);
271
            }
272
        }
273

    
274
    }
275

    
276
    public void close() {
277
    }
278

    
279
    /**
280
     * Returns the length of field
281
     * 
282
     * @param dataType
283
     * @return length of field
284
     */
285
    public int getDataTypeLength(final int dataType) {
286

    
287
        switch (dataType) {
288
        case Types.NUMERIC:
289
        case Types.DOUBLE:
290
        case Types.REAL:
291
        case Types.FLOAT:
292
        case Types.BIGINT:
293
        case Types.INTEGER:
294
        case Types.DECIMAL:
295
            return 20;
296
        case Types.CHAR:
297
        case Types.VARCHAR:
298
        case Types.LONGVARCHAR:
299
            return 254;
300
        case Types.DATE:
301
            return 8;
302
        case Types.BOOLEAN:
303
        case Types.BIT:
304
            return 1;
305
        }
306
        return 0;
307

    
308
    }
309

    
310
    @SuppressWarnings("unchecked")
311
    public void addFeature(final Geometry geom, final Object[] values) {
312
        try {
313
            org.gvsig.fmap.geom.Geometry iGeo = null;
314

    
315
            final GeometryOperationContext ctx = new GeometryOperationContext();
316
            ctx.setAttribute(FromJTS.PARAM, geom);
317
            try {
318
                iGeo =
319
                    (org.gvsig.fmap.geom.Geometry) geometryManager
320
                        .invokeOperation(FromJTS.NAME, ctx);
321
            } catch (final GeometryOperationNotSupportedException e) {
322
                Sextante.addErrorToLog(e);
323
                return;
324
            } catch (final GeometryOperationException e) {
325
                Sextante.addErrorToLog(e);
326
                return;
327
            }
328

    
329
            final EditableFeature ef = featureStore.createNewFeature();
330
            final Iterator<FeatureAttributeDescriptor> features =
331
                featureType.iterator();
332

    
333
            int i = 0;
334
            while (features.hasNext()) {
335
                final FeatureAttributeDescriptor featureAttributeDescriptor =
336
                    features.next();
337
                // if (!featureAttributeDescriptor.getName().equals(
338
                // featureType.getDefaultGeometryAttributeName())) {
339
                // ef.set(
340
                // featureAttributeDescriptor.getName().substring(
341
                // 0,
342
                // Math.min(11, featureAttributeDescriptor.getName()
343
                // .length())), values[i]);
344
                // i++;
345
                // }
346
                if (!featureAttributeDescriptor.getName().equals(
347
                    featureType.getDefaultGeometryAttributeName())) {
348
                    ef.set(featureAttributeDescriptor.getName(), values[i]);
349
                }
350
                i++;
351
            }
352
            ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
353
            featureStore.insert(ef);
354
        } catch (final Exception e) {
355
            e.printStackTrace();
356
        }
357
    }
358

    
359
    public IFeatureIterator iterator() {
360

    
361
        if (m_Layer != null) {
362
            return new DALIFeatureIterator(m_Layer, getFilters());
363
        } else {
364
            // cannot iterate layers being edited
365
            return new DALIFeatureIterator();
366
        }
367
    }
368

    
369
    public String getFieldName(final int i) {
370

    
371
        if (featureStore != null) {
372
            return ((FeatureAttributeDescriptor) featureType.get(i)).getName();
373
        }
374
        return null;
375

    
376
    }
377

    
378
    public Class<?> getFieldType(final int i) {
379
        return featureStore == null ? null : featureType
380
            .getAttributeDescriptor(i).getDataType().getDefaultClass();
381
    }
382

    
383
    public int getFieldCount() {
384
        if (featureStore != null) {
385
            return featureType.size();
386
        }
387
        return 0;
388

    
389
    }
390

    
391
    @Override
392
    public int getShapesCount() {
393

    
394
        if (featureStore != null) {
395
            try {
396
                return (int) featureStore.getFeatureSet().getSize();
397
            } catch (final DataException e) {
398
                Sextante.addErrorToLog(e);
399
                return 0;
400
            }
401
        }
402
        return 0;
403

    
404
    }
405

    
406
    public int getShapeType() {
407
        if (featureStore != null) {
408
            return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor) featureType
409
                .get(featureType.getDefaultGeometryAttributeIndex()))
410
                .getGeomType().getType());
411
        }
412
        return 0;
413
    }
414

    
415
    private int getShapeTypeFromGvSIGShapeType(final int shapeType) {
416

    
417
        switch (shapeType) {
418
        case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
419
            return IVectorLayer.SHAPE_TYPE_POLYGON;
420
        case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
421
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
422
            return IVectorLayer.SHAPE_TYPE_LINE;
423
        case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
424
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
425
            return IVectorLayer.SHAPE_TYPE_POINT;
426
        default:
427
            return IVectorLayer.SHAPE_TYPE_POLYGON;
428
        }
429

    
430
    }
431

    
432
    private int getgvSIGShapeType(final int shapeType) {
433

    
434
        switch (shapeType) {
435
        case IVectorLayer.SHAPE_TYPE_POLYGON:
436
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
437
        case IVectorLayer.SHAPE_TYPE_LINE:
438
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE;
439
        case IVectorLayer.SHAPE_TYPE_POINT:
440
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT;
441
        default:
442
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
443
        }
444

    
445
    }
446

    
447
    public String getName() {
448

    
449
        if (m_Layer != null) {
450
            return m_Layer.getName();
451
        } else {
452
            return m_sName;
453
        }
454
    }
455

    
456
    public void postProcess() {
457

    
458
        if (featureStore == null) {
459
            return;
460
        }
461
        try {
462
            featureStore.finishEditing();
463
        } catch (final DataException e) {
464
            // No puede finalizar la edici?n. Es posible que se haya cerrado
465
            // previamente.
466
        }
467

    
468
        /*
469
         * FLyrVect vectorLayer = null;
470
         * if (inputParameters instanceof String) {
471
         * vectorLayer = (FLyrVect) FileTools.openLayer((String)
472
         * inputParameters, s_Name, m_Projection);
473
         * }
474
         * if (inputParameters instanceof OutputParameters) {
475
         * vectorLayer = (FLyrVect) FileTools.openLayer(((OutputParameters)
476
         * inputParameters).getDataParameters(), s_Name,
477
         * m_Projection);
478
         * }
479
         * create(vectorLayer);
480
         */
481

    
482
    }
483

    
484
    public String getFilename() {
485

    
486
        if (featureStore != null) {
487
            final DataStoreParameters dsp = featureStore.getParameters();
488
            if (dsp instanceof FilesystemStoreParameters) {
489
                return ((FilesystemStoreParameters) dsp).getFile()
490
                    .getAbsolutePath();
491
            } else {
492
                return null;
493
            }
494
        } else {
495
            return m_sName;
496
        }
497

    
498
    }
499

    
500
    public Object getCRS() {
501

    
502
        return m_Projection;
503

    
504
    }
505

    
506
    public void setName(final String name) {
507

    
508
        m_sName = name;
509
        // inputParameters = name;
510

    
511
    }
512

    
513
    @Override
514
    public Object getBaseDataObject() {
515

    
516
        return m_Layer;
517

    
518
    }
519

    
520
    public void free() {
521

    
522
        m_Layer.dispose();
523
        featureStore.dispose();
524

    
525
        m_Layer = null;
526
        featureStore = null;
527
    }
528

    
529
    public IOutputChannel getOutputChannel() {
530

    
531
        if (featureStore != null) {
532
            final DataStoreParameters dsp = featureStore.getParameters();
533
            if (dsp instanceof FilesystemStoreParameters) {
534
                String file =
535
                    ((FilesystemStoreParameters) dsp).getFile()
536
                        .getAbsolutePath();
537
                return new FileOutputChannel(file);
538
            } else {
539
                return null;
540
            }
541
        } else {
542
            return m_Channel;
543
        }
544

    
545
    }
546

    
547
    public boolean canBeEdited() {
548

    
549
        // we support only file-based, so we can overwrite
550
        return true;
551

    
552
    }
553

    
554
    public FeatureStore getFeatureStore() {
555
        return featureStore;
556
    }
557

    
558
}