Statistics
| Revision:

root / trunk / org.gvsig.dwg / org.gvsig.dwg.provider / src / main / java / org / gvsig / dwg / fmap / dal / store / dwg / DWGStoreProvider.java @ 74

History | View | Annotate | Download (25.4 KB)

1
package org.gvsig.dwg.fmap.dal.store.dwg;
2

    
3
import java.io.File;
4
import java.io.IOException;
5
import java.util.ArrayList;
6
import java.util.HashMap;
7
import java.util.Iterator;
8
import java.util.List;
9
import java.util.Map;
10

    
11
import org.cresques.cts.IProjection;
12
import org.gvsig.dwg.lib.DwgFile;
13
import org.gvsig.dwg.lib.DwgObject;
14
import org.gvsig.dwg.lib.DwgVersionNotSupportedException;
15
import org.gvsig.dwg.lib.IDwg2FMap;
16
import org.gvsig.dwg.lib.IDwg3DTestable;
17
import org.gvsig.dwg.lib.objects.DwgMText;
18
import org.gvsig.dwg.lib.objects.DwgText;
19
import org.gvsig.fmap.dal.DALLocator;
20
import org.gvsig.fmap.dal.DataManager;
21
import org.gvsig.fmap.dal.DataServerExplorer;
22
import org.gvsig.fmap.dal.DataStoreNotification;
23
import org.gvsig.fmap.dal.DataTypes;
24
import org.gvsig.fmap.dal.FileHelper;
25
import org.gvsig.fmap.dal.exception.DataException;
26
import org.gvsig.fmap.dal.exception.InitializeException;
27
import org.gvsig.fmap.dal.exception.OpenException;
28
import org.gvsig.fmap.dal.exception.ReadException;
29
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
30
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
31
import org.gvsig.fmap.dal.feature.EditableFeatureType;
32
import org.gvsig.fmap.dal.feature.FeatureType;
33
import org.gvsig.fmap.dal.feature.exception.CreateGeometryException;
34
import org.gvsig.fmap.dal.feature.exception.PerformEditingException;
35
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
36
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
37
import org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider;
38
import org.gvsig.fmap.dal.resource.ResourceAction;
39
import org.gvsig.fmap.dal.resource.exception.AccessResourceException;
40
import org.gvsig.fmap.dal.resource.file.FileResource;
41
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
42
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
43
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
44
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
45
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
46
import org.gvsig.fmap.geom.Geometry;
47
import org.gvsig.fmap.geom.GeometryLocator;
48
import org.gvsig.fmap.geom.GeometryManager;
49
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
50
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
51
import org.gvsig.fmap.geom.primitive.Envelope;
52
import org.gvsig.fmap.geom.primitive.Point;
53
import org.gvsig.tools.dynobject.exception.DynMethodException;
54
import org.gvsig.tools.exception.NotYetImplemented;
55
import org.gvsig.tools.persistence.PersistentState;
56
import org.gvsig.tools.persistence.exception.PersistenceException;
57
import org.slf4j.Logger;
58
import org.slf4j.LoggerFactory;
59

    
60
public class DWGStoreProvider extends AbstractMemoryStoreProvider implements
61
        ResourceConsumer {
62

    
63
    private static final Logger logger = LoggerFactory.getLogger(DWGStoreProvider.class);
64

    
65
    public static final String NAME = "DWG";
66
    public static final String DESCRIPTION = "DWG file";
67
    public static final String METADATA_DEFINITION_NAME = NAME;
68

    
69
    public static final String NAME_FIELD_ID = "ID";
70
    public static final String NAME_FIELD_GEOMETRY = "Geometry";
71
    public static final String NAME_FIELD_ENTITY = "Entity";
72
    public static final String NAME_FIELD_LAYER = "Layer";
73
    public static final String NAME_FIELD_COLOR = "Color";
74
    public static final String NAME_FIELD_ELEVATION = "Elevation";
75
    public static final String NAME_FIELD_THICKNESS = "Thickness";
76
    public static final String NAME_FIELD_TEXT = "Text";
77
    public static final String NAME_FIELD_HEIGHTTEXT = "HeightText";
78
    public static final String NAME_FIELD_ROTATIONTEXT = "Rotation";
79

    
80
    private int ID_FIELD_ID = 0;
81
    private int ID_FIELD_GEOMETRY = 1;
82
    private int ID_FIELD_ENTITY = 2;
83
    private int ID_FIELD_LAYER = 3;
84
    private int ID_FIELD_COLOR = 4;
85
    private int ID_FIELD_ELEVATION = 5;
86
    private int ID_FIELD_THICKNESS = 6;
87
    private int ID_FIELD_TEXT = 7;
88
    private int ID_FIELD_HEIGHTTEXT = 8;
89
    private int ID_FIELD_ROTATIONTEXT = 9;
90

    
91
    private IProjection projection;
92
    private ResourceProvider resource;
93
    private LegendBuilder legendBuilder;
94

    
95
    private long counterNewsOIDs = 0;
96
    protected GeometryManager geomManager = GeometryLocator.getGeometryManager();
97

    
98
    public DWGStoreProvider(DWGStoreParameters parameters,
99
            DataStoreProviderServices storeServices) throws InitializeException {
100
        super(parameters, storeServices, FileHelper
101
                .newMetadataContainer(METADATA_DEFINITION_NAME));
102

    
103
        counterNewsOIDs = 0;
104
        //                projection = CRSFactory.getCRS(getParameters().getSRSID());
105

    
106
        File file = getDWGParameters().getFile();
107
        resource = this.createResource(
108
                FileResource.NAME,
109
                new Object[]{file.getAbsolutePath()}
110
        );
111

    
112
        resource.addConsumer(this);
113

    
114
        this.projection = this.getDWGParameters().getCRS();
115

    
116
        try {
117
            legendBuilder = (LegendBuilder) this.invokeDynMethod(
118
                    LegendBuilder.DYNMETHOD_BUILDER_NAME, null);
119
        } catch (DynMethodException e) {
120
            legendBuilder = null;
121
        } catch (Exception e) {
122
            throw new InitializeException(e);
123
        }
124

    
125
        this.initializeFeatureTypes();
126
    }
127

    
128
    private DWGStoreParameters getDWGParameters() {
129
        return (DWGStoreParameters) this.getParameters();
130
    }
131

    
132
    public String getProviderName() {
133
        return NAME;
134
    }
135

    
136
    public boolean allowWrite() {
137
        return false;
138
    }
139

    
140
    public Object getLegend() throws OpenException {
141
        this.open();
142
        if (legendBuilder == null) {
143
            return null;
144
        }
145
        return legendBuilder.getLegend();
146
    }
147

    
148
    public Object getLabeling() throws OpenException {
149
        this.open();
150
        if (legendBuilder == null) {
151
            return null;
152
        }
153
        return legendBuilder.getLabeling();
154
    }
155

    
156
    private class DWGData {
157

    
158
        public ArrayList data = null;
159
        public FeatureType defaultFType = null;
160
        public List fTypes = null;
161
        public Envelope envelope = null;
162
        public IProjection projection;
163
        public LegendBuilder legendBuilder = null;
164

    
165
        public Envelope getEnvelopeCopy() throws CreateEnvelopeException {
166
            if (envelope == null) {
167
                return null;
168
            }
169
            Envelope newEnvelope;
170
            if (envelope.getDimension() == 2) {
171
                newEnvelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
172
            } else {
173
                newEnvelope = geomManager.createEnvelope(SUBTYPES.GEOM3D);
174

    
175
            }
176
            newEnvelope.setLowerCorner(envelope.getLowerCorner());
177
            newEnvelope.setUpperCorner(envelope.getUpperCorner());
178
            return newEnvelope;
179
        }
180
    }
181

    
182
    private AbstractMemoryStoreProvider getStoreProvider() {
183
        return this;
184
    }
185

    
186
    public void open() throws OpenException {
187
        if (this.data != null) {
188
            return;
189
        }
190
                // try {
191
        // this.resource.begin();
192
        // } catch (ResourceExecuteException e2) {
193
        // try {
194
        // throw new OpenException(resource.getName(), e2);
195
        // } catch (AccessResourceException e1) {
196
        // throw new OpenException(this.getName(), e2);
197
        // }
198
        //
199
        // }
200
        try {
201
            getResource().execute(new ResourceAction() {
202
                public Object run() throws Exception {
203
                    ResourceProvider resource = getResource();
204
                    DWGData dwgData = null;
205
                    FeatureStoreProviderServices store = getStoreServices();
206
                    if (resource.getData() != null) {
207
                        dwgData
208
                                = (DWGData) ((Map) resource.getData()).get(projection.getAbrev());
209
                                                // OJO no es del todo correcto (puede llevar
210
                        // reproyeccion)
211
                    } else {
212
                        resource.setData(new HashMap());
213
                    }
214
                    if (dwgData == null) {
215
                        dwgData = new DWGData();
216
                        dwgData.data = new ArrayList();
217
                        data = dwgData.data;
218
                        counterNewsOIDs = 0;
219
                        Reader reader
220
                                = new Reader().initialice(getStoreProvider(),
221
                                        (File) resource.get(),
222
                                        projection, legendBuilder);
223
                        reader.begin(store);
224
                        dwgData.defaultFType
225
                                = reader.getDefaultType().getNotEditableCopy();
226
                        ArrayList types = new ArrayList();
227
                        Iterator it = reader.getTypes().iterator();
228
                        EditableFeatureType fType;
229
                        while (it.hasNext()) {
230
                            fType = (EditableFeatureType) it.next();
231
                            if (fType.getId().equals(
232
                                    dwgData.defaultFType.getId())) {
233
                                types.add(dwgData.defaultFType);
234
                            } else {
235
                                types.add(fType.getNotEditableCopy());
236
                            }
237
                        }
238
                        dwgData.fTypes = types;
239
                        dwgData.legendBuilder = legendBuilder;
240

    
241
                        resource.notifyOpen();
242
                        store.setFeatureTypes(dwgData.fTypes,
243
                                dwgData.defaultFType);
244
                        reader.load();
245
                        // this.envelope = reader.getEnvelope();
246

    
247
                        dwgData.envelope = reader.getEnvelope();
248

    
249
                        dwgData.projection = projection;
250

    
251
                        reader.end();
252
                        resource.notifyClose();
253
                        ((Map) resource.getData()).put(projection.getAbrev(),
254
                                dwgData); // OJO la reproyeccion
255
                    }
256

    
257
                    data = dwgData.data;
258
                    store.setFeatureTypes(dwgData.fTypes, dwgData.defaultFType);
259
                    legendBuilder = dwgData.legendBuilder;
260
                    setDynValue("Envelope", dwgData.getEnvelopeCopy());
261
                    setDynValue("CRS", projection);
262
                    counterNewsOIDs = data.size();
263
                    return null;
264
                }
265
            });
266
        } catch (Exception e) {
267
            this.data = null;
268
            try {
269
                throw new OpenException(resource.getName(), e);
270
            } catch (AccessResourceException e1) {
271
                throw new OpenException(this.getProviderName(), e);
272
            }
273
                        // } finally {
274
            // this.resource.end();
275
        }
276
    }
277

    
278
    public DataServerExplorer getExplorer() throws ReadException {
279
        DataManager manager = DALLocator.getDataManager();
280
        FilesystemServerExplorerParameters params;
281
        try {
282
            params = (FilesystemServerExplorerParameters) manager
283
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
284
            params.setRoot(this.getDWGParameters().getFile().getParent());
285
            return manager.createServerExplorer(params);
286
        } catch (DataException e) {
287
            throw new ReadException(this.getProviderName(), e);
288
        } catch (ValidateDataParametersException e) {
289
            throw new ReadException(this.getProviderName(), e);
290
        }
291

    
292
    }
293

    
294
    public void performChanges(Iterator deleteds, Iterator inserteds, Iterator updateds, Iterator originalFeatureTypesUpdated) throws PerformEditingException {
295
        // FIXME Exception
296
        throw new UnsupportedOperationException();
297
    }
298

    
299
    public class Reader {
300

    
301
        private File file;
302
        private String fileName;
303
        private IProjection projection;
304
        private List types;
305
        private LegendBuilder leyendBuilder;
306
        private AbstractMemoryStoreProvider store;
307
        private Envelope envelope;
308
        private DwgFile dwgFeatureFile;
309

    
310
        public Reader initialice(AbstractMemoryStoreProvider store, File file,
311
                IProjection projection,
312
                LegendBuilder leyendBuilder) {
313
            this.store = store;
314
            this.file = file;
315
            this.fileName = file.getAbsolutePath();
316
            this.projection = projection;
317
            this.leyendBuilder = leyendBuilder;
318
            if (leyendBuilder != null) {
319
                leyendBuilder.initialize(store);
320
            }
321
            return this;
322
        }
323

    
324
        public Envelope getEnvelope() {
325
            return this.envelope;
326
        }
327

    
328
        public void begin(FeatureStoreProviderServices store) throws UnsupportedDWGVersionException, ReadException {
329
            dwgFeatureFile = new DwgFile(file.getAbsolutePath());
330

    
331
            try {
332
                dwgFeatureFile.read();
333
            } catch (DwgVersionNotSupportedException e1) {
334
                throw new UnsupportedDWGVersionException(file.getName(), e1);
335
            } catch (IOException e) {
336
                throw new ReadException(NAME, e);
337
            }
338

    
339
            EditableFeatureType featureType = store.createFeatureType(getName());
340

    
341
            featureType.setHasOID(true);
342

    
343
            ID_FIELD_ID = featureType.add(NAME_FIELD_ID, DataTypes.INT)
344
                    .setDefaultValue(Integer.valueOf(0))
345
                    .getIndex();
346

    
347
            EditableFeatureAttributeDescriptor attr = featureType.add(
348
                    NAME_FIELD_GEOMETRY, DataTypes.GEOMETRY);
349
            attr.setSRS(this.projection);
350
            attr.setGeometryType(Geometry.TYPES.GEOMETRY);
351
            boolean is3dFile = dwgFeatureFile.isDwg3DFile();
352
            if (is3dFile) {
353
                attr.setGeometrySubType(Geometry.SUBTYPES.GEOM3D);
354
            } else {
355
                attr.setGeometrySubType(Geometry.SUBTYPES.GEOM2D);
356
            }
357
            ID_FIELD_GEOMETRY = attr.getIndex();
358

    
359
            featureType.setDefaultGeometryAttributeName(NAME_FIELD_GEOMETRY);
360

    
361
            // FIXME: Cual es el size y el valor por defecto para Entity ?
362
            ID_FIELD_ENTITY = featureType.add(NAME_FIELD_ENTITY,
363
                    DataTypes.STRING, 100)
364
                    .setDefaultValue("")
365
                    .getIndex();
366

    
367
            // FIXME: Cual es el size de Layer ?
368
            ID_FIELD_LAYER = featureType.add(NAME_FIELD_LAYER,
369
                    DataTypes.STRING, 100)
370
                    .setDefaultValue(
371
                            "default").getIndex();
372

    
373
            ID_FIELD_COLOR = featureType.add(NAME_FIELD_COLOR,
374
                    DataTypes.INT)
375
                    .setDefaultValue(
376
                            Integer.valueOf(0)).getIndex();
377

    
378
            ID_FIELD_ELEVATION = featureType.add(NAME_FIELD_ELEVATION,
379
                    DataTypes.DOUBLE)
380
                    .setDefaultValue(
381
                            Double.valueOf(0)).getIndex();
382

    
383
            ID_FIELD_THICKNESS = featureType.add(NAME_FIELD_THICKNESS,
384
                    DataTypes.DOUBLE)
385
                    .setDefaultValue(
386
                            Double.valueOf(0)).getIndex();
387

    
388
            // FIXME: Cual es el size de Text ?
389
            ID_FIELD_TEXT = featureType.add(NAME_FIELD_TEXT,
390
                    DataTypes.STRING, 100)
391
                    .setDefaultValue("")
392
                    .getIndex();
393

    
394
            ID_FIELD_HEIGHTTEXT = featureType.add(NAME_FIELD_HEIGHTTEXT,
395
                    DataTypes.DOUBLE).setDefaultValue(
396
                            Double.valueOf(10)).getIndex();
397

    
398
            ID_FIELD_ROTATIONTEXT = featureType.add(NAME_FIELD_ROTATIONTEXT,
399
                    DataTypes.DOUBLE).setDefaultValue(
400
                            Double.valueOf(0)).getIndex();
401

    
402
                        // FIXME: Parece que el DXF puede tener mas atributos opcionales.
403
            // Habria que ver de pillarlos ?
404
            types = new ArrayList();
405
            types.add(featureType);
406

    
407
            if (leyendBuilder != null) {
408
                leyendBuilder.begin();
409
            }
410

    
411
        }
412

    
413
        public void end() {
414
            if (leyendBuilder != null) {
415
                leyendBuilder.end();
416
            }
417
        }
418

    
419
        public List getTypes() {
420
            return types;
421
        }
422

    
423
        public EditableFeatureType getDefaultType() {
424
            return (EditableFeatureType) types.get(0);
425
        }
426

    
427
        private Double toDouble(String value) {
428
            if (value == null) {
429
                return Double.valueOf(0);
430
            }
431
            return Double.valueOf(value);
432
        }
433

    
434
        public void load() throws DataException {
435

    
436
            this.envelope = null;
437

    
438
            long count_not_fmap_interface = 0;
439
            long count_null_geometry = 0;
440
            long count_bad_envelope = 0;
441
            long count_envelope_out_of_aoi = 0;
442

    
443
            dwgFeatureFile.calculateGisModelDwgPolylines();
444
            dwgFeatureFile.blockManagement2();
445
            List entities = dwgFeatureFile.getDwgObjects();
446

    
447
            int id = -1;
448
            try {
449
                int envelopeSubType = Geometry.SUBTYPES.GEOM2D;
450
                boolean is3dFile = dwgFeatureFile.isDwg3DFile();
451

    
452
                this.envelope = geomManager.createEnvelope(envelopeSubType);
453

    
454
                boolean updateEnvelope = true;
455

    
456
                double[] extMin = (double[]) dwgFeatureFile
457
                        .getHeader("MSPACE_EXTMIN");
458
                double[] extMax = (double[]) dwgFeatureFile
459
                        .getHeader("MSPACE_EXTMAX");
460
                if (extMin != null && extMax != null) {
461
                    updateEnvelope = false;
462
                    Point point = (Point) geomManager.create(
463
                            Geometry.TYPES.POINT, envelopeSubType);
464
                    point.setCoordinates(extMin);
465
                    this.envelope.setLowerCorner(point);
466
                    point = (Point) geomManager.create(Geometry.TYPES.POINT,
467
                            envelopeSubType);
468
                    point.setCoordinates(extMax);
469
                    this.envelope.setUpperCorner(point);
470
                }
471

    
472
                Iterator iter = entities.iterator();
473

    
474
                FeatureProvider featureProvider;
475
                Envelope gEnvelope;
476

    
477
                while (iter.hasNext()) {
478
                    id++;
479
                    DwgObject entity = (DwgObject) iter.next();
480

    
481
                    if (!(entity instanceof IDwg2FMap)) {
482
                        count_not_fmap_interface++;
483
                        /*
484
                         logger.warn("load: entity type {}(id:{}) not loadded",
485
                         new Object[] { entity.getType() }, id);
486
                         */
487
                        continue;
488
                    }
489

    
490
                    IDwg2FMap dwgEnt = (IDwg2FMap) entity;
491
                    Geometry geometry = dwgEnt.toFMapGeometry(is3dFile);
492
                    if (geometry == null) {
493
                        count_null_geometry++;
494
                        /*
495
                         logger.warn("load: entity {}(id:{}) with null geometry",
496
                         new Object[] { entity.getType(), id });
497
                         */
498
                        continue;
499
                    }
500
                                        // FIXME: Estas 6 lineas es por si la geometr�a no se ha
501
                    // creado correctamente
502
                    gEnvelope = null;
503
                    try {
504
                        gEnvelope = geometry.getEnvelope();
505
                    } catch (Exception e) {
506
                        gEnvelope = null;
507
                    }
508
                    if (gEnvelope == null) {
509
                        count_bad_envelope++;
510
                        /*
511
                         logger.warn("load: entity {}(id:{}) with null envelope",
512
                         new Object[] { entity.getType(), id });
513
                         */
514
                        continue;
515
                    }
516
                    // we check for Region of Interest of the CAD file
517
                    if (!this.envelope.intersects(geometry.getEnvelope())) {
518
                        count_envelope_out_of_aoi++;
519
                        /*
520
                         logger.warn("load: entity {}(id:{}) out of envelope",
521
                         new Object[] { entity.getType(), id });
522
                         */
523
                        continue;
524
                    }
525
                    featureProvider = store.createFeatureProvider(store
526
                            .getStoreServices().getDefaultFeatureType());
527

    
528
                    featureProvider.set(ID_FIELD_ID, id);
529

    
530
                    featureProvider.set(ID_FIELD_ENTITY, dwgEnt.toString());
531

    
532
                    featureProvider.set(ID_FIELD_LAYER, dwgFeatureFile
533
                            .getLayerName(entity));
534

    
535
                    int colorByLayer = dwgFeatureFile.getColorByLayer(entity);
536
                    int color = entity.getColor();
537
                    if (color < 0) {
538
                        color = Math.abs(color);
539
                    }
540
                    if (color > 255) {
541
                        color = colorByLayer;
542
                    }
543

    
544
                    featureProvider.set(ID_FIELD_COLOR, color);
545

    
546
                    if (entity instanceof IDwg3DTestable) {
547
                        featureProvider.set(ID_FIELD_ELEVATION,
548
                                ((IDwg3DTestable) entity).getZ());
549
                    }
550

    
551
                    featureProvider.set(ID_FIELD_THICKNESS, 0.0);
552
                    featureProvider.set(ID_FIELD_HEIGHTTEXT, 0.0);
553
                    featureProvider.set(ID_FIELD_ROTATIONTEXT, 0.0);
554
                    featureProvider.set(ID_FIELD_TEXT, "");
555

    
556
                    if (entity instanceof DwgMText) {
557
                        DwgMText mtext = (DwgMText) entity;
558
                        featureProvider.set(ID_FIELD_HEIGHTTEXT, mtext.getHeight());
559
                        featureProvider.set(ID_FIELD_TEXT, mtext.getText());
560
                    } else if (entity instanceof DwgText) {
561
                        DwgText text = (DwgText) entity;
562
                        featureProvider
563
                                .set(ID_FIELD_THICKNESS, text.getThickness());
564
                        featureProvider.set(ID_FIELD_HEIGHTTEXT, text.getHeight());
565
                        featureProvider.set(ID_FIELD_ROTATIONTEXT, text
566
                                .getRotationAngle());
567
                        featureProvider.set(ID_FIELD_TEXT, text.getText());
568
                    }// if-else
569

    
570
                    featureProvider.setDefaultGeometry(geometry);
571

    
572
                    store.addFeatureProvider(featureProvider);
573
                    if (this.leyendBuilder != null) {
574
                        this.leyendBuilder.process(featureProvider);
575
                    }
576

    
577
                }
578

    
579
                logger.info("Issues while loading DWG entities:+\n"
580
                        + "    Entities not implementing IDwg2FMap interface: " + count_not_fmap_interface + "\n"
581
                        + "    Entities with non-convertible geometry: " + count_null_geometry + "\n"
582
                        + "    Entities without valid envelope: " + count_bad_envelope + "\n"
583
                        + "    Entities with envelope out of global envelope: " + count_envelope_out_of_aoi);
584

    
585
            } catch (org.gvsig.fmap.geom.exception.CreateGeometryException e) {
586
                throw new CreateGeometryException(e);
587
            } catch (org.gvsig.fmap.geom.exception.CreateEnvelopeException e) {
588
                throw new CreateGeometryException(e);
589
            }
590
        }
591

    
592
    }
593

    
594
    public boolean closeResourceRequested(ResourceProvider resource) {
595
        return true;
596
    }
597

    
598
    public int getOIDType() {
599
        return DataTypes.LONG;
600
    }
601

    
602
    public boolean supportsAppendMode() {
603
        return false;
604
    }
605

    
606
    public void append(FeatureProvider featureProvider) {
607
        // FIXME Exception
608
        throw new UnsupportedOperationException();
609
    }
610

    
611
    public void beginAppend() {
612
        // FIXME Exception
613
        throw new UnsupportedOperationException();
614

    
615
    }
616

    
617
    public void endAppend() {
618
        // FIXME Exception
619
        throw new UnsupportedOperationException();
620
    }
621

    
622
    public void saveToState(PersistentState state) throws PersistenceException {
623
        // TODO Auto-generated method stub
624
        throw new NotYetImplemented();
625
    }
626

    
627
    public void loadFromState(PersistentState state) throws PersistenceException {
628
        // TODO Auto-generated method stub
629
        throw new NotYetImplemented();
630
    }
631

    
632
    public Object createNewOID() {
633
        return new Long(counterNewsOIDs++);
634
    }
635

    
636
    protected void initializeFeatureTypes() throws InitializeException {
637
        try {
638
            this.open();
639
        } catch (OpenException e) {
640
            throw new InitializeException(this.getProviderName(), e);
641
        }
642
    }
643

    
644
    public Envelope getEnvelope() throws DataException {
645
        this.open();
646
        return (Envelope) this.getDynValue("Envelope");
647
    }
648

    
649

    
650
    /*
651
     * (non-Javadoc)
652
     *
653
     * @see
654
     * org.gvsig.fmap.dal.resource.spi.ResourceConsumer#resourceChanged(org.
655
     * gvsig.fmap.dal.resource.spi.ResourceProvider)
656
     */
657
    public void resourceChanged(ResourceProvider resource) {
658
        this.getStoreServices().notifyChange(
659
                DataStoreNotification.RESOURCE_CHANGED,
660
                resource);
661
    }
662

    
663
    public Object getSourceId() {
664
        return this.getDWGParameters().getFile();
665
    }
666

    
667
    public String getName() {
668
        String name = this.getDWGParameters().getFile().getName();
669
        int n = name.lastIndexOf(".");
670
        if (n < 1) {
671
            return name;
672
        }
673
        return name.substring(0, n);
674
    }
675

    
676
    public String getFullName() {
677
        return this.getDWGParameters().getFile().getAbsolutePath();
678
    }
679

    
680
    public ResourceProvider getResource() {
681
        return resource;
682
    }
683

    
684
}