Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_dal / src / org / gvsig / fmap / dal / feature / impl / DefaultFeature.java @ 39073

History | View | Annotate | Download (16.8 KB)

1
package org.gvsig.fmap.dal.feature.impl;
2

    
3
import java.lang.ref.WeakReference;
4
import java.util.Date;
5
import java.util.Iterator;
6
import java.util.List;
7

    
8
import org.cresques.cts.IProjection;
9

    
10
import org.gvsig.fmap.dal.DataTypes;
11
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
12
import org.gvsig.fmap.dal.exception.DataException;
13
import org.gvsig.fmap.dal.feature.EditableFeature;
14
import org.gvsig.fmap.dal.feature.Feature;
15
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
16
import org.gvsig.fmap.dal.feature.FeatureReference;
17
import org.gvsig.fmap.dal.feature.FeatureStore;
18
import org.gvsig.fmap.dal.feature.FeatureType;
19
import org.gvsig.fmap.dal.feature.exception.IllegalValueException;
20
import org.gvsig.fmap.dal.feature.exception.SetReadOnlyAttributeException;
21
import org.gvsig.fmap.dal.feature.impl.featureset.DynObjectFeatureFacade;
22
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
23
import org.gvsig.fmap.geom.Geometry;
24
import org.gvsig.fmap.geom.primitive.Envelope;
25
import org.gvsig.timesupport.Instant;
26
import org.gvsig.timesupport.Interval;
27
import org.gvsig.tools.ToolsLocator;
28
import org.gvsig.tools.dataTypes.CoercionException;
29
import org.gvsig.tools.dataTypes.DataTypesManager;
30
import org.gvsig.tools.dynobject.DynObject;
31
import org.gvsig.tools.evaluator.Evaluator;
32
import org.gvsig.tools.evaluator.EvaluatorData;
33
import org.gvsig.tools.evaluator.EvaluatorException;
34
import org.gvsig.tools.exception.BaseException;
35
import org.gvsig.tools.exception.BaseRuntimeException;
36

    
37
public class DefaultFeature implements Feature, EvaluatorData {
38

    
39
        private static DataTypesManager dataTypesManager = null; 
40
        protected FeatureProvider data;
41
        protected FeatureReference reference;
42
        private WeakReference storeRef;
43
        
44
        private boolean inserted = false;
45

    
46
    /*
47
         * Usar con mucha precaucion o mejor no usar. Lo precisa el
48
         * DefaultFeatureSet en la ordenacion.
49
         */
50
        public DefaultFeature(FeatureStore store) {
51
                this.storeRef = new WeakReference(store);
52
                this.reference = null;
53
        }
54

    
55
        public DefaultFeature(FeatureStore store, FeatureProvider data) {
56
                this.data = data;
57
                this.storeRef = new WeakReference(store);
58
                this.reference = null;
59
                this.inserted = !data.isNew();
60
        }
61

    
62
        DefaultFeature(DefaultFeature feature) {
63
                this.data = feature.data.getCopy();
64
                this.storeRef = feature.storeRef;
65
                this.reference = feature.reference;
66
                this.inserted = feature.isInserted();
67
        }
68

    
69
        public void setData(FeatureProvider data) {
70
                this.data = data;
71
                this.reference = null;
72
                this.inserted = true; 
73
        }
74

    
75
        public FeatureProvider getData() {
76
                return this.data;
77
        }
78

    
79
        protected DataTypesManager getDataTypesManager() {
80
                if( dataTypesManager==null ) {
81
                        dataTypesManager = ToolsLocator.getDataTypesManager();
82
                }
83
                return dataTypesManager;
84
        }
85

    
86
        void set(FeatureAttributeDescriptor attribute, Object value) {
87
                int i = attribute.getIndex();
88

    
89
                if (attribute.isReadOnly()) {
90
                        throw new SetReadOnlyAttributeException();
91
                }
92

    
93
                if (attribute.getEvaluator() != null) {
94
                        throw new SetReadOnlyAttributeException();
95
                }
96

    
97
                if (value == null) {
98
                        if (!attribute.allowNull()) {
99
                                if (!attribute.isAutomatic()) {
100
                                        throw new IllegalValueException(attribute, value);
101
                                }
102
                        }
103
                        this.data.set(i, null);
104
                        return;
105

    
106
        }
107
                
108
        if (attribute.getFeatureAttributeGetter() != null){
109
            value = attribute.getFeatureAttributeGetter().setter(value);                    
110
        }
111
        
112
        if (attribute.getObjectClass().isInstance(value)) {
113
            this.data.set(i, value);
114
            return;
115
        }
116

    
117
        if (!attribute.getObjectClass().isInstance(value)) {
118
            try {
119
                value =
120
                    this.getDataTypesManager().coerce(attribute.getType(),
121
                        value);
122
            } catch (CoercionException e) {
123
                throw new IllegalArgumentException("Can't convert to "
124
                    + this.getDataTypesManager().getTypeName(
125
                        attribute.getType()) + " from '"
126
                    + value.getClass().getName() + "' with value '"
127
                    + value.toString() + "'.", e);
128
            }
129
                }
130
                
131
        this.data.set(i, value);
132
    }
133
        
134
    private Object get(int index,Class theClass, int type) {
135
        Object value = this.get(index);
136
        if( theClass.isInstance(value) ) {
137
            return value;
138
        }
139
        
140
        if (value == null) {
141
            /*
142
             * this prevents null pointer exception in coerce
143
             */
144
            return null;
145
        }
146
        
147
        try {
148
            return this.getDataTypesManager().coerce(type, value);
149
        } catch (CoercionException e) {
150
            throw new IllegalArgumentException(
151
                    "Can't convert to "+theClass.getSimpleName()+" from '"+value.getClass().getName()+"' with value '"+value.toString()+"'.",
152
                    e);
153
        }
154
    }
155
    
156
//  private Object getNumberByType(Number value, int type) {
157
//      if (type==DataTypes.DOUBLE){
158
//          return new Double(value.doubleValue());
159
//      }else if (type==DataTypes.FLOAT){
160
//          return new Float(value.floatValue());
161
//      }else if (type==DataTypes.LONG){
162
//          return new Long(value.longValue());
163
//      }else if (type==DataTypes.INT){
164
//          return new Integer(value.intValue());
165
//      }else if (type==DataTypes.STRING){
166
//          return value.toString();
167
//      }
168
//      return value;
169
//  }
170

    
171
    public void initializeValues() {
172
        FeatureType type = this.getType();
173
        Iterator iterator = type.iterator();
174

    
175
        while (iterator.hasNext()) {
176
            FeatureAttributeDescriptor attribute = (FeatureAttributeDescriptor) iterator
177
            .next();
178
            if (attribute.isAutomatic() || attribute.isReadOnly()
179
                    || attribute.getEvaluator() != null) {
180
                continue;
181
            }
182
            if (attribute.getDefaultValue() == null && !attribute.allowNull()) {
183
                continue;
184
            }
185
            this.set(attribute, attribute.getDefaultValue());
186
        }
187
    }
188

    
189
    public void clear() {
190
        initializeValues();
191
    }
192

    
193
    public void initializeValues(Feature feature) {
194
        FeatureType myType=this.getType();
195
        FeatureType type =feature.getType();
196
        Iterator iterator = type.iterator();
197

    
198
        while (iterator.hasNext()) {
199
            FeatureAttributeDescriptor attribute = (FeatureAttributeDescriptor) iterator
200
            .next();
201
            FeatureAttributeDescriptor myAttribute=myType.getAttributeDescriptor(attribute.getName());
202
            if (myAttribute != null) {
203
                this.set(myAttribute, feature.get(attribute.getIndex()));
204
            }
205
        }
206
    }
207

    
208

    
209
    public FeatureStore getStore() {
210
        return (FeatureStore) this.storeRef.get();
211
    }
212

    
213
    public FeatureType getType() {
214
        return this.data.getType();
215
    }
216

    
217
    public EditableFeature getEditable() {
218
        return new DefaultEditableFeature(this);
219
    }
220

    
221
    public Feature getCopy() {
222
        return new DefaultFeature(this);
223
    }
224

    
225
    public FeatureReference getReference() {
226
        if (this.reference == null) {
227
            if (!isInserted()) {
228
                return null;
229
            }
230
            reference = new DefaultFeatureReference(this);
231
        }
232
        return this.reference;
233
    }
234

    
235
    class UnableToGetReferenceException extends BaseRuntimeException {
236

    
237
        /**
238
         * 
239
         */
240
        private static final long serialVersionUID = 1812805035204824163L;
241

    
242
        /**
243
         * @param exception
244
         */
245
        public UnableToGetReferenceException(BaseException exception) {
246
            super("Unable to get reference", "_UnableToGetReferenceException",
247
                serialVersionUID);
248
            this.initCause(exception);
249
            
250
        }
251
        
252
    }
253
    
254
    public void validate(int mode) {
255
        ((DefaultFeatureType) this.data.getType()).validateFeature(this, mode);
256
    }
257

    
258
    public List getSRSs() {
259
        // TODO Auto-generated method stub
260
        return null;
261
    }
262

    
263
    public Envelope getDefaultEnvelope() {
264
        return this.data.getDefaultEnvelope();
265
    }
266

    
267
    public Geometry getDefaultGeometry() {
268
        return this.data.getDefaultGeometry();
269
    }
270

    
271
    public IProjection getDefaultSRS() {
272
        return this.data.getType().getDefaultSRS();
273
    }
274

    
275
    public List getGeometries() {
276
        // TODO Auto-generated method stub
277
        return null;
278
    }
279

    
280
    public Object get(String name) {
281
        int index = this.data.getType().getIndex(name);
282
        if( index < 0 ) {
283
            throw new IllegalArgumentException("Attribute name '"+name+"' not found in the feature.");
284
        }
285
        return this.get(index);
286
    }
287

    
288

    
289
    public Object get(int index) {
290
        FeatureType type = this.data.getType();
291
        if( index <0 || index >= type.size() ) {
292
            throw new IllegalArgumentException("Attribute index '"+index+"' out of range (0 to "+this.data.getType().size()+".");
293
        }
294
        FeatureAttributeDescriptor attribute = type.getAttributeDescriptor(index);
295
        if (!this.data.getType().hasEvaluators()) {
296
            return get(attribute, this.data.get(index));                
297
        }                
298
        Evaluator eval = attribute.getEvaluator();
299
        if (eval == null) {
300
            return this.data.get(index);
301
        } else {
302
            Object value = this.data.get(index);
303
            if (value != null) { // FIXME: para comprobar si esta calculado usar
304
                // un array
305
                // especifico.
306
                return get(attribute, this.data.get(index));
307
            }
308
            try {
309
                value = eval.evaluate(this);
310
            } catch (EvaluatorException e) {
311
                throw new DataEvaluatorRuntimeException(e);
312
            }
313
            this.data.set(index, value);
314
            return  get(attribute, value);
315
        }                
316
    }
317

    
318
    private Object get(FeatureAttributeDescriptor featureAttributeDescriptor, Object value){
319
        if (featureAttributeDescriptor.getFeatureAttributeGetter() == null){
320
            return value;
321
        }else{
322
            return featureAttributeDescriptor.getFeatureAttributeGetter().getter(value);
323
        }
324
    }
325

    
326
    public Object[] getArray(String name) {
327
        return this.getArray(this.data.getType().getIndex(name));
328
    }
329

    
330
    public Object[] getArray(int index) {
331
        return (Object[]) this.get(index);
332
    }
333

    
334
    public boolean getBoolean(String name) {
335
        return this.getBoolean(this.data.getType().getIndex(name));
336
    }
337

    
338
    public boolean getBoolean(int index) {
339
        Boolean value = ((Boolean) this.get(index,Boolean.class,DataTypes.BOOLEAN));
340
        if (value == null) {
341
            return false;
342
        }
343
        return value.booleanValue();
344
    }
345

    
346
    public byte getByte(String name) {
347
        return this.getByte(this.data.getType().getIndex(name));
348
    }
349

    
350
    public byte getByte(int index) {
351
        Byte value = ((Byte) this.get(index,Byte.class,DataTypes.BYTE));
352
        if (value == null) {
353
            return 0;
354
        }
355
        return value.byteValue();
356
    }
357

    
358
    public Date getDate(String name) {
359
        return this.getDate(this.data.getType().getIndex(name));
360
    }
361

    
362
    public Date getDate(int index) {
363
        Date value = ((Date) this.get(index,Date.class,DataTypes.DATE));
364

    
365
        return value;
366
    }
367

    
368
    public double getDouble(String name) {
369
        return this.getDouble(this.data.getType().getIndex(name));
370
    }
371

    
372
    public double getDouble(int index) {
373
        
374
        Double value = ((Double) this.get(index,Double.class,DataTypes.DOUBLE));
375
        if (value == null) {
376
            return 0;
377
        }
378
        return value.doubleValue();
379
    }
380

    
381
    public Feature getFeature(String name) {
382
        return this.getFeature(this.data.getType().getIndex(name));
383
    }
384

    
385
    public Feature getFeature(int index) {
386
        return (Feature) this.get(index);
387
    }
388

    
389
    public float getFloat(String name) {
390
        return this.getFloat(this.data.getType().getIndex(name));
391
    }
392

    
393
    public float getFloat(int index) {
394
        Float value = ((Float) this.get(index,Float.class,DataTypes.FLOAT));
395
        if (value == null) {
396
            return 0;
397
        }
398
        return value.floatValue();
399
    }
400

    
401
    public Geometry getGeometry(String name) {
402
        return this.getGeometry(this.data.getType().getIndex(name));
403
    }
404

    
405
    public Geometry getGeometry(int index) {
406
        return (Geometry) this.get(index,Geometry.class,DataTypes.GEOMETRY);
407
    }
408

    
409
    public int getInt(String name) {
410
        return this.getInt(this.data.getType().getIndex(name));
411
    }
412

    
413
    public int getInt(int index) {
414
        Integer value = ((Integer) this.get(index,Integer.class,DataTypes.INT));
415
        if (value == null) {
416
            return 0;
417
        }
418
        return ((Integer)value).intValue();
419
    }
420

    
421
    public long getLong(String name) {
422
        return this.getLong(this.data.getType().getIndex(name));
423
    }
424

    
425
    public long getLong(int index) {
426
        Long value = ((Long) this.get(index,Long.class,DataTypes.LONG));
427
        if (value == null) {
428
            return 0;
429
        }
430
        return value.longValue();
431
    }
432

    
433
    public String getString(String name) {
434
        return this.getString(this.data.getType().getIndex(name));
435
    }
436

    
437
    public String getString(int index) {
438
        return (String) this.get(index,String.class,DataTypes.STRING);
439
    }
440

    
441
    public Object getContextValue(String name) {
442
        name = name.toLowerCase();
443
        if (name.equals("store")) {
444
            return this.getStore();
445
        }
446

    
447
        if (name.equals("featuretype")) {
448
            return this.data.getType();
449
        }
450

    
451
        if (name.equals("feature")) {
452
            return this;
453
        }
454

    
455
        throw new IllegalArgumentException(name);
456
    }
457

    
458
    public Iterator getDataNames() {
459
        class DataNamesIterator implements Iterator {
460
            Iterator attributeIteraror;
461

    
462
            DataNamesIterator(DefaultFeature feature) {
463
                this.attributeIteraror = feature.getType().iterator();
464
            }
465

    
466
            public boolean hasNext() {
467
                return this.attributeIteraror.hasNext();
468
            }
469

    
470
            public Object next() {
471
                return ((FeatureAttributeDescriptor) this.attributeIteraror
472
                        .next()).getName();
473
            }
474

    
475
            public void remove() {
476
                throw new UnsupportedOperationException();
477
            }
478

    
479
        }
480
        return new DataNamesIterator(this);
481
    }
482

    
483
    public Object getDataValue(String name) {
484
        name = name.toLowerCase();
485
        return get(name);
486
    }
487

    
488
    public Iterator getDataValues() {
489
        class DataValuesIterator implements Iterator {
490
            DefaultFeature feature;
491
            int current = 0;
492

    
493
            DataValuesIterator(DefaultFeature feature) {
494
                this.feature = feature;
495
            }
496

    
497
            public boolean hasNext() {
498
                return current < feature.getType().size() - 1;
499
            }
500

    
501
            public Object next() {
502
                return feature.get(current++);
503
            }
504

    
505
            public void remove() {
506
                throw new UnsupportedOperationException();
507
            }
508

    
509
        }
510
        return new DataValuesIterator(this);
511
    }
512

    
513
    public boolean hasContextValue(String name) {
514
        name = name.toLowerCase();
515
        if (name.equals("store")) {
516
            return true;
517
        }
518

    
519
        if (name.equals("featuretype")) {
520
            return true;
521
        }
522

    
523
        if (name.equals("feature")) {
524
            return true;
525
        }
526
        return false;
527
    }
528

    
529
    public boolean hasDataValue(String name) {
530
        name = name.toLowerCase();
531
        return this.data.getType().getIndex(name) >= 0;
532
    }
533
    
534
    public Instant getInstant(int index) {
535
        return ((Instant) this.get(index,Date.class,DataTypes.INSTANT));
536
    }
537

    
538
    public Instant getInstant(String name) {
539
        return this.getInstant(this.data.getType().getIndex(name));
540
    }
541

    
542
    public Interval getInterval(int index) {
543
        return ((Interval) this.get(index,Date.class,DataTypes.INTERVAL));
544
    }
545

    
546
    public Interval getInterval(String name) {
547
        return this.getInterval(this.data.getType().getIndex(name));
548
    }
549

    
550
    public DynObject getAsDynObject() {
551
        DynObjectFeatureFacade facade = new DynObjectFeatureFacade();
552
        facade.setFeature(this);
553
        return facade;
554
    }
555

    
556
    public String toString() {
557
        StringBuffer buffer = new StringBuffer("Feature with values: ");
558
        FeatureAttributeDescriptor[] attributeDescriptors =
559
            getType().getAttributeDescriptors();
560
        for (int i = 0; i < attributeDescriptors.length; i++) {
561
            String name = attributeDescriptors[i].getName();
562
            buffer.append(name).append("=").append(get(name));
563
            if (i < attributeDescriptors.length - 1) {
564
                buffer.append(", ");
565
            }
566
        }
567
        return super.toString();
568
    }
569
    
570
    
571
    /**
572
     * @return the inserted
573
     */
574
    public boolean isInserted() {
575
        return inserted;
576
    }
577

    
578
    
579
    /**
580
     * @param inserted the inserted to set
581
     */
582
    public void setInserted(boolean inserted) {
583
        this.inserted = inserted;
584
    }
585
}