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 / gvVectorLayer.java @ 220

History | View | Annotate | Download (18.2 KB)

1
package org.gvsig.geoprocess.lib.sextante.dataObjects;
2

    
3
import java.io.File;
4
import java.sql.Types;
5
import java.util.Iterator;
6

    
7
import com.vividsolutions.jts.geom.Geometry;
8

    
9
import es.unex.sextante.core.Sextante;
10
import es.unex.sextante.dataObjects.AbstractVectorLayer;
11
import es.unex.sextante.dataObjects.IFeatureIterator;
12
import es.unex.sextante.dataObjects.IVectorLayer;
13
import es.unex.sextante.outputs.FileOutputChannel;
14
import es.unex.sextante.outputs.IOutputChannel;
15

    
16
import org.cresques.cts.IProjection;
17

    
18
import org.gvsig.fmap.dal.DALLocator;
19
import org.gvsig.fmap.dal.DataManager;
20
import org.gvsig.fmap.dal.DataServerExplorer;
21
import org.gvsig.fmap.dal.DataStoreParameters;
22
import org.gvsig.fmap.dal.exception.DataException;
23
import org.gvsig.fmap.dal.feature.EditableFeature;
24
import org.gvsig.fmap.dal.feature.EditableFeatureType;
25
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
26
import org.gvsig.fmap.dal.feature.FeatureStore;
27
import org.gvsig.fmap.dal.feature.FeatureType;
28
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
29
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
30
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
31
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
32
import org.gvsig.fmap.geom.DataTypes;
33
import org.gvsig.fmap.geom.GeometryLocator;
34
import org.gvsig.fmap.geom.GeometryManager;
35
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
36
import org.gvsig.fmap.geom.operation.GeometryOperationException;
37
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
38
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
39
import org.gvsig.fmap.geom.type.GeometryType;
40
import org.gvsig.fmap.geom.type.GeometryTypeNotSupportedException;
41
import org.gvsig.fmap.geom.type.GeometryTypeNotValidException;
42
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
43
import org.gvsig.fmap.mapcontext.layers.LayerFactory;
44
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
45
import org.gvsig.tools.ToolsLocator;
46
import org.gvsig.tools.dataTypes.DataTypesManager;
47

    
48
public class gvVectorLayer extends AbstractVectorLayer {
49

    
50
    private static final DataManager DATA_MANAGER = DALLocator.getDataManager();
51

    
52
    private final int PRECISION = 5;
53
    private FeatureStore featureStore = null;
54
    private IProjection m_Projection = null;
55
    private FeatureType featureType = null;
56
    private GeometryManager geometryManager = null;
57
    private FLyrVect m_Layer;
58
    private String m_sName;
59
    private IOutputChannel m_Channel;
60

    
61
    // private Object inputParameters = null;
62

    
63
    public gvVectorLayer() {
64
        geometryManager = GeometryLocator.getGeometryManager();
65
    }
66

    
67
    public void create(String sName, Object inputParams, int iShapeType,
68
        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
69
        try {
70
            // inputParameters = inputParams;
71
            m_sName = sName;
72
            m_Projection = (IProjection) crs;
73

    
74
            if (inputParams instanceof OutputParameters) {
75
                OutputParameters outputParam = (OutputParameters) inputParams;
76
                NewFeatureStoreParameters newParams =
77
                    outputParam.getDataParameters();
78
                DataServerExplorer dataServerExplorer =
79
                    outputParam.getExplorer();
80

    
81
                featureType = newParams.getDefaultFeatureType();
82
                loadFeatureType(sFields, types, iShapeType, crs,
83
                    (EditableFeatureType) featureType, fieldSize);
84
                newParams.setDynValue("CRS", m_Projection);
85

    
86
                DATA_MANAGER.newStore(dataServerExplorer.getProviderName(),
87
                    newParams.getDataStoreName(), newParams, true);
88

    
89
                featureStore =
90
                    (FeatureStore) DATA_MANAGER.openStore(
91
                        newParams.getDataStoreName(), newParams);
92
                featureStore.edit(FeatureStore.MODE_APPEND);
93
            }
94

    
95
            if (inputParams instanceof FilesystemStoreParameters) {
96
                // TODO: Terminar para todo tipo fuentes de datos. No se puede
97
                // hacer ahora pq falta poder obtener un FeatureType del
98
                // parameter.
99
                // Esto es as? pq el store registra parameters para cargar
100
                // ficheros y no para escribirlos.
101
                String path =
102
                    ((FilesystemStoreParameters) inputParams).getFile()
103
                        .getAbsolutePath();
104
                create(sName, path, iShapeType, types, sFields, crs, fieldSize);
105
            }
106

    
107
            if (inputParams instanceof String) {
108
                create(sName, (String) inputParams, iShapeType, types, sFields,
109
                    crs, fieldSize);
110
            }
111

    
112
            /*
113
             * NewFeatureStoreParameters param =
114
             * (NewFeatureStoreParameters)inputParams;
115
             * featureType = param.getDefaultFeatureType();
116
             * loadFeatureType(sFields, types, iShapeType, crs, featureType,
117
             * fieldSize);
118
             * 
119
             * param.setDefaultFeatureType(featureType);
120
             * 
121
             * DataManager manager = DALLocator.getDataManager();
122
             * featureStore = (FeatureStore) manager.createStore(param);
123
             * featureStore.edit(FeatureStore.MODE_APPEND);
124
             */
125

    
126
        } catch (Exception e) {
127
            Sextante.addErrorToLog(e);
128
        }
129
    }
130

    
131
    public void create(final String sName, final String sFilename,
132
        final int iShapeType, final Class<?>[] types, final String[] sFields,
133
        final Object crs, final int[] fieldSize) {
134

    
135
        try {
136
            // inputParameters = sFilename;
137
            m_sName = sName;
138
            m_Projection = (IProjection) crs;
139

    
140
            final FilesystemServerExplorerParameters explorerParams =
141
                (FilesystemServerExplorerParameters) DATA_MANAGER
142
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
143
            explorerParams.setRoot(new File(sFilename).getParent());
144
            final FilesystemServerExplorer explorer =
145
                (FilesystemServerExplorer) DATA_MANAGER.openServerExplorer(
146
                    FilesystemServerExplorer.NAME, explorerParams);
147
            final NewFeatureStoreParameters newParams =
148
                (NewFeatureStoreParameters) explorer.getAddParameters(new File(
149
                    sFilename));
150

    
151
            EditableFeatureType editableFeatureType =
152
                newParams.getDefaultFeatureType();
153
            featureType = editableFeatureType;
154
            loadFeatureType(sFields, types, iShapeType, crs,
155
                editableFeatureType, fieldSize);
156

    
157
            newParams.setDefaultFeatureType(featureType);
158
            newParams.setDynValue("crs", m_Projection);
159

    
160
            explorer.add(newParams.getDataStoreName(), newParams, true);
161
            featureStore =
162
                (FeatureStore) DATA_MANAGER.openStore(
163
                    newParams.getDataStoreName(), newParams);
164
            featureStore.edit(FeatureStore.MODE_APPEND);
165
            featureType = featureStore.getDefaultFeatureType();
166

    
167
        } catch (final Exception e) {
168
            Sextante.addErrorToLog(e);
169
        }
170
    }
171

    
172
    private void loadFeatureType(final String[] fields, final Class<?>[] types,
173
        final int shapeType, final Object crs,
174
        final EditableFeatureType featureType, final int[] fieldSize) {
175
        final int[] iTypes = getTypes(types);
176

    
177
        for (int i = 0; i < fields.length; i++) {
178
            if (iTypes[i] == DataTypes.GEOMETRY) {
179
                addGeometryAttribute(fields[i], shapeType, featureType);
180
            } else {
181
                featureType.add(fields[i], iTypes[i]).setSize(fieldSize[i])
182
                    .setPrecision(PRECISION);
183
            }
184
        }
185

    
186
        FeatureAttributeDescriptor desc =
187
            featureType.getAttributeDescriptor("GEOMETRY");
188
        if (desc == null) {
189
            addGeometryAttribute("GEOMETRY", shapeType, featureType);
190
        }
191
        featureType.setDefaultGeometryAttributeName("GEOMETRY");
192
    }
193

    
194
    private void addGeometryAttribute(final String fieldName,
195
        final int shapeType, final EditableFeatureType featureType) {
196
        try {
197
            GeometryType type =
198
                geometryManager.getGeometryType(getgvSIGShapeType(shapeType),
199
                    org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
200
            featureType.add(fieldName, DataTypes.GEOMETRY)
201
                .setGeometryType(type);
202
        } catch (GeometryTypeNotSupportedException e) {
203
            throw new RuntimeException(
204
                "Error getting geometry type with type = "
205
                    + getgvSIGShapeType(shapeType) + ", subtype = "
206
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
207
        } catch (GeometryTypeNotValidException e) {
208
            throw new RuntimeException(
209
                "Error getting geometry type with type = "
210
                    + getgvSIGShapeType(shapeType) + ", subtype = "
211
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
212
        }
213
    }
214

    
215
    private int[] getTypes(Class<?>[] classes) {
216
        DataTypesManager typesManager = ToolsLocator.getDataTypesManager();
217
        int[] types = new int[classes.length];
218
        for (int i = 0; i < classes.length; i++) {
219
            types[i] = typesManager.getDataType(classes[i]).getType();
220
        }
221
        return types;
222
    }
223

    
224
    public void create(final FLyrVect layer) {
225

    
226
        m_Layer = layer;
227
        try {
228
            featureStore = layer.getFeatureStore();
229
            featureType = featureStore.getDefaultFeatureType();
230
            m_Projection = layer.getProjection();
231
        } catch (final Exception e) {
232
            Sextante.addErrorToLog(e);
233
        }
234

    
235
    }
236

    
237
    @SuppressWarnings("deprecation")
238
    public void open() {
239

    
240
        if (m_Layer == null) {
241
            try {
242
                m_Layer =
243
                    (FLyrVect) LayerFactory.getInstance().createLayer(
244
                        getFilename(), featureStore);
245
            } catch (final LoadLayerException e) {
246
                Sextante.addErrorToLog(e);
247
                throw new RuntimeException(e);
248
            }
249
        }
250

    
251
    }
252

    
253
    public void close() {
254
    }
255

    
256
    /**
257
     * Returns the length of field
258
     * 
259
     * @param dataType
260
     * @return length of field
261
     */
262
    public int getDataTypeLength(final int dataType) {
263

    
264
        switch (dataType) {
265
        case Types.NUMERIC:
266
        case Types.DOUBLE:
267
        case Types.REAL:
268
        case Types.FLOAT:
269
        case Types.BIGINT:
270
        case Types.INTEGER:
271
        case Types.DECIMAL:
272
            return 20;
273
        case Types.CHAR:
274
        case Types.VARCHAR:
275
        case Types.LONGVARCHAR:
276
            return 254;
277
        case Types.DATE:
278
            return 8;
279
        case Types.BOOLEAN:
280
        case Types.BIT:
281
            return 1;
282
        }
283
        return 0;
284

    
285
    }
286

    
287
    @SuppressWarnings("unchecked")
288
    public void addFeature(final Geometry geom, final Object[] values) {
289
        try {
290
            org.gvsig.fmap.geom.Geometry iGeo = null;
291

    
292
            final GeometryOperationContext ctx = new GeometryOperationContext();
293
            ctx.setAttribute(FromJTS.PARAM, geom);
294
            try {
295
                iGeo =
296
                    (org.gvsig.fmap.geom.Geometry) geometryManager
297
                        .invokeOperation(FromJTS.NAME, ctx);
298
            } catch (final GeometryOperationNotSupportedException e) {
299
                Sextante.addErrorToLog(e);
300
                return;
301
            } catch (final GeometryOperationException e) {
302
                Sextante.addErrorToLog(e);
303
                return;
304
            }
305

    
306
            final EditableFeature ef = featureStore.createNewFeature();
307
            final Iterator<FeatureAttributeDescriptor> features =
308
                featureType.iterator();
309

    
310
            int i = 0;
311
            while (features.hasNext()) {
312
                final FeatureAttributeDescriptor featureAttributeDescriptor =
313
                    features.next();
314
                // if (!featureAttributeDescriptor.getName().equals(
315
                // featureType.getDefaultGeometryAttributeName())) {
316
                // ef.set(
317
                // featureAttributeDescriptor.getName().substring(
318
                // 0,
319
                // Math.min(11, featureAttributeDescriptor.getName()
320
                // .length())), values[i]);
321
                // i++;
322
                // }
323
                if (!featureAttributeDescriptor.getName().equals(
324
                    featureType.getDefaultGeometryAttributeName())) {
325
                    ef.set(featureAttributeDescriptor.getName(), values[i]);
326
                }
327
                i++;
328
            }
329
            ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
330
            featureStore.insert(ef);
331
        } catch (final Exception e) {
332
            e.printStackTrace();
333
        }
334
    }
335

    
336
    public IFeatureIterator iterator() {
337

    
338
        if (m_Layer != null) {
339
            return new gvFeatureIterator(m_Layer, getFilters());
340
        } else {
341
            // cannot iterate layers being edited
342
            return new gvFeatureIterator();
343
        }
344
    }
345

    
346
    public String getFieldName(final int i) {
347

    
348
        if (featureStore != null) {
349
            return ((FeatureAttributeDescriptor) featureType.get(i)).getName();
350
        }
351
        return null;
352

    
353
    }
354

    
355
    public Class<?> getFieldType(final int i) {
356
        return featureStore == null ? null : featureType
357
            .getAttributeDescriptor(i).getDataType().getDefaultClass();
358
    }
359

    
360
    public int getFieldCount() {
361
        if (featureStore != null) {
362
            return featureType.size();
363
        }
364
        return 0;
365

    
366
    }
367

    
368
    @Override
369
    public int getShapesCount() {
370

    
371
        if (featureStore != null) {
372
            try {
373
                return (int) featureStore.getFeatureSet().getSize();
374
            } catch (final DataException e) {
375
                Sextante.addErrorToLog(e);
376
                return 0;
377
            }
378
        }
379
        return 0;
380

    
381
    }
382

    
383
    public int getShapeType() {
384
        if (featureStore != null) {
385
            return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor) featureType
386
                .get(featureType.getDefaultGeometryAttributeIndex()))
387
                .getGeomType().getType());
388
        }
389
        return 0;
390
    }
391

    
392
    private int getShapeTypeFromGvSIGShapeType(final int shapeType) {
393

    
394
        switch (shapeType) {
395
        case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
396
            return IVectorLayer.SHAPE_TYPE_POLYGON;
397
        case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
398
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
399
            return IVectorLayer.SHAPE_TYPE_LINE;
400
        case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
401
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
402
            return IVectorLayer.SHAPE_TYPE_POINT;
403
        default:
404
            return IVectorLayer.SHAPE_TYPE_POLYGON;
405
        }
406

    
407
    }
408

    
409
    private int getgvSIGShapeType(final int shapeType) {
410

    
411
        switch (shapeType) {
412
        case IVectorLayer.SHAPE_TYPE_POLYGON:
413
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
414
        case IVectorLayer.SHAPE_TYPE_LINE:
415
            return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
416
        case IVectorLayer.SHAPE_TYPE_POINT:
417
            return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
418
        default:
419
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
420
        }
421

    
422
    }
423

    
424
    public String getName() {
425

    
426
        if (m_Layer != null) {
427
            return m_Layer.getName();
428
        } else {
429
            return m_sName;
430
        }
431
    }
432

    
433
    public void postProcess() {
434

    
435
        if (featureStore == null) {
436
            return;
437
        }
438
        try {
439
            featureStore.finishEditing();
440
        } catch (final DataException e) {
441
            // No puede finalizar la edici?n. Es posible que se haya cerrado
442
            // previamente.
443
        }
444

    
445
        /*
446
         * FLyrVect vectorLayer = null;
447
         * if (inputParameters instanceof String) {
448
         * vectorLayer = (FLyrVect) FileTools.openLayer((String)
449
         * inputParameters, s_Name, m_Projection);
450
         * }
451
         * if (inputParameters instanceof OutputParameters) {
452
         * vectorLayer = (FLyrVect) FileTools.openLayer(((OutputParameters)
453
         * inputParameters).getDataParameters(), s_Name,
454
         * m_Projection);
455
         * }
456
         * create(vectorLayer);
457
         */
458

    
459
    }
460

    
461
    public String getFilename() {
462

    
463
        if (featureStore != null) {
464
            final DataStoreParameters dsp = featureStore.getParameters();
465
            if (dsp instanceof FilesystemStoreParameters) {
466
                return ((FilesystemStoreParameters) dsp).getFile()
467
                    .getAbsolutePath();
468
            } else {
469
                return null;
470
            }
471
        } else {
472
            return m_sName;
473
        }
474

    
475
    }
476

    
477
    public Object getCRS() {
478

    
479
        return m_Projection;
480

    
481
    }
482

    
483
    public void setName(final String name) {
484

    
485
        m_sName = name;
486
        // inputParameters = name;
487

    
488
    }
489

    
490
    @Override
491
    public Object getBaseDataObject() {
492

    
493
        return m_Layer;
494

    
495
    }
496

    
497
    public void free() {
498

    
499
        m_Layer.dispose();
500
        featureStore.dispose();
501

    
502
        m_Layer = null;
503
        featureStore = null;
504
    }
505

    
506
    public IOutputChannel getOutputChannel() {
507

    
508
        if (featureStore != null) {
509
            final DataStoreParameters dsp = featureStore.getParameters();
510
            if (dsp instanceof FilesystemStoreParameters) {
511
                String file =
512
                    ((FilesystemStoreParameters) dsp).getFile()
513
                        .getAbsolutePath();
514
                return new FileOutputChannel(file);
515
            } else {
516
                return null;
517
            }
518
        } else {
519
            return m_Channel;
520
        }
521

    
522
    }
523

    
524
    public boolean canBeEdited() {
525

    
526
        // we support only file-based, so we can overwrite
527
        return true;
528

    
529
    }
530

    
531
    public FeatureStore getFeatureStore() {
532
        return featureStore;
533
    }
534

    
535
}