Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / feature / impl / DefaultFeatureType.java @ 44149

History | View | Annotate | Download (26.3 KB)

1 40559 jjdelcerro
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 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 3
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 40435 jjdelcerro
package org.gvsig.fmap.dal.feature.impl;
25
26
import java.lang.ref.WeakReference;
27
import java.util.ArrayList;
28 41342 jjdelcerro
import java.util.Arrays;
29 40435 jjdelcerro
import java.util.Collections;
30 43981 omartinez
import java.util.HashSet;
31 40435 jjdelcerro
import java.util.Iterator;
32 43998 jjdelcerro
import java.util.LinkedHashSet;
33 40435 jjdelcerro
import java.util.List;
34 43981 omartinez
import java.util.Set;
35 43610 jjdelcerro
import java.util.zip.CRC32;
36 43358 jjdelcerro
import org.apache.commons.lang3.ArrayUtils;
37 43377 jjdelcerro
import org.apache.commons.lang3.StringUtils;
38 40435 jjdelcerro
39
import org.cresques.cts.IProjection;
40
41
import org.gvsig.fmap.dal.DataTypes;
42
import org.gvsig.fmap.dal.exception.DataException;
43
import org.gvsig.fmap.dal.feature.EditableFeatureType;
44
import org.gvsig.fmap.dal.feature.Feature;
45
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
46 41342 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
47 40435 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureRules;
48 43739 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureStore;
49 40435 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureType;
50
import org.gvsig.tools.dynobject.DynClass;
51
import org.gvsig.tools.dynobject.DynField;
52
import org.gvsig.tools.dynobject.DynMethod;
53
import org.gvsig.tools.dynobject.DynObject;
54
import org.gvsig.tools.dynobject.DynObjectValueItem;
55
import org.gvsig.tools.dynobject.DynStruct;
56
import org.gvsig.tools.dynobject.exception.DynMethodException;
57
import org.gvsig.tools.dynobject.exception.DynObjectValidateException;
58
59 42471 jjdelcerro
public class DefaultFeatureType extends ArrayList<FeatureAttributeDescriptor> implements FeatureType,
60 42700 jjdelcerro
                DynClass, org.gvsig.tools.lang.Cloneable {
61 40435 jjdelcerro
62
        /**
63
         *
64
         */
65
        private static final long serialVersionUID = -7988721447349282215L;
66
67
        private DefaultFeatureRules rules;
68 41002 jjdelcerro
        protected boolean hasEvaluators;
69 41342 jjdelcerro
        protected boolean hasEmulators;
70 40435 jjdelcerro
        protected String defaultGeometryAttributeName;
71 44077 jjdelcerro
        protected String defaultTimeAttributeName;
72 40435 jjdelcerro
        protected int defaultGeometryAttributeIndex;
73
        protected int defaultTimeAttributeIndex;
74 44077 jjdelcerro
        private String id;
75 40435 jjdelcerro
        protected boolean hasOID;
76
        protected boolean allowAtomaticValues;
77
        protected FeatureAttributeDescriptor[] pk = null;
78 42027 jjdelcerro
        protected String internalID = null;
79 40435 jjdelcerro
80 43555 fdiaz
        private List srsList = null;
81 43739 jjdelcerro
        private WeakReference storeRef;
82 44077 jjdelcerro
        private boolean requiredFields;
83 40435 jjdelcerro
84 43739 jjdelcerro
        protected DefaultFeatureType(FeatureStore store, String id) {
85
            if (StringUtils.isEmpty(id)) {
86
                id = "default";
87
            }
88
            if( store == null ) {
89
                this.storeRef = null;
90
            } else {
91
                this.storeRef = new WeakReference(store);
92
            }
93
            this.internalID = Integer.toHexString((int) (Math.random() * 100000)).toUpperCase();
94
            this.id = id;
95
            this.rules = new DefaultFeatureRules();
96
            this.hasEvaluators = false;
97
            this.hasEmulators = false;
98
            this.defaultGeometryAttributeName = null;
99 44077 jjdelcerro
            this.defaultTimeAttributeName = null;
100 43739 jjdelcerro
            this.defaultGeometryAttributeIndex = -1;
101
            this.defaultTimeAttributeIndex = -1;
102
            this.allowAtomaticValues = false;
103 40435 jjdelcerro
        }
104
105 43739 jjdelcerro
        protected DefaultFeatureType(FeatureStore store) {
106
                this(store, (String)null);
107 40435 jjdelcerro
        }
108
109
        protected DefaultFeatureType(DefaultFeatureType other) {
110 43739 jjdelcerro
                this(other.getStore(), (String)null);
111 40435 jjdelcerro
                initialize(other, true);
112
        }
113
114
        protected DefaultFeatureType(DefaultFeatureType other,
115
                        boolean copyAttributes) {
116 43739 jjdelcerro
                this(other.getStore(), (String)null);
117 40435 jjdelcerro
                initialize(other, copyAttributes);
118
        }
119 43555 fdiaz
120 40435 jjdelcerro
        protected void initialize(DefaultFeatureType other, boolean copyAttributes) {
121
                this.id = other.getId();
122
                if (copyAttributes) {
123 42701 jjdelcerro
                    Iterator iter = other.iterator();
124
                    DefaultFeatureAttributeDescriptor attr;
125
                    while (iter.hasNext()) {
126
                            attr = (DefaultFeatureAttributeDescriptor) iter.next();
127
                            this.intitalizeAddAttibute(attr);
128
                    }
129
                    if( other.pk!=null ) {
130
                        this.pk = new FeatureAttributeDescriptor[other.pk.length];
131
                        for( int i=0; i<other.pk.length; i++ ) {
132
                            this.pk[i] = other.pk[i].getCopy();
133 42700 jjdelcerro
                        }
134
                    }
135 40435 jjdelcerro
                }
136
                this.defaultGeometryAttributeName = other.defaultGeometryAttributeName;
137 44077 jjdelcerro
                this.defaultTimeAttributeName = other.defaultTimeAttributeName;
138 40435 jjdelcerro
                this.hasEvaluators = other.hasEvaluators;
139 41342 jjdelcerro
                this.hasEmulators = other.hasEmulators;
140 40435 jjdelcerro
                this.rules = (DefaultFeatureRules) other.rules.getCopy();
141
                this.defaultGeometryAttributeIndex = other.defaultGeometryAttributeIndex;
142
                this.defaultTimeAttributeIndex = other.defaultTimeAttributeIndex;
143
                this.hasOID = other.hasOID;
144
                this.id = other.id; // XXX ???? copiar o no esto????
145 42027 jjdelcerro
                this.internalID = other.internalID;
146 40435 jjdelcerro
        }
147
148
        protected void intitalizeAddAttibute(DefaultFeatureAttributeDescriptor attr) {
149
                super.add(attr.getCopy());
150
        }
151
152
        public String getId() {
153
                return this.id;
154
        }
155
156
        public Object get(String name) {
157
                FeatureAttributeDescriptor attr;
158
                Iterator iter = this.iterator();
159
                while (iter.hasNext()) {
160
                        attr = (FeatureAttributeDescriptor) iter.next();
161
                        if (attr.getName().equalsIgnoreCase(name)) {
162
                                return attr;
163
                        }
164
                }
165
                return null;
166
        }
167
168
        public FeatureAttributeDescriptor getAttributeDescriptor(String name) {
169
                FeatureAttributeDescriptor attr;
170
                Iterator iter = this.iterator();
171
                while (iter.hasNext()) {
172
                        attr = (FeatureAttributeDescriptor) iter.next();
173
                        if (attr.getName().equalsIgnoreCase(name)) {
174
                                return attr;
175
                        }
176
                }
177
                return null;
178
        }
179
180
        public FeatureAttributeDescriptor getAttributeDescriptor(int index) {
181
                return (FeatureAttributeDescriptor) super.get(index);
182
        }
183
184
        public FeatureType getCopy() {
185
                return new DefaultFeatureType(this);
186
        }
187 43555 fdiaz
188 42700 jjdelcerro
        public Object clone() {
189
            return this.getCopy();
190
        }
191 40435 jjdelcerro
192
        public int getDefaultGeometryAttributeIndex() {
193
                return this.defaultGeometryAttributeIndex;
194
        }
195
196
        public String getDefaultGeometryAttributeName() {
197
                return this.defaultGeometryAttributeName;
198
        }
199
200 44077 jjdelcerro
        public int getDefaultTimeAttributeIndex() {
201
                return this.defaultTimeAttributeIndex;
202
        }
203
204
        public String getDefaultTimeAttributeName() {
205
                return this.defaultTimeAttributeName;
206
        }
207
208 40435 jjdelcerro
        public EditableFeatureType getEditable() {
209
                return new DefaultEditableFeatureType(this);
210
        }
211
212
        public int getIndex(String name) {
213
                FeatureAttributeDescriptor attr;
214
                Iterator iter = this.iterator();
215
                while (iter.hasNext()) {
216
                        attr = (FeatureAttributeDescriptor) iter.next();
217
                        if (attr.getName().equalsIgnoreCase(name)) {
218
                                return attr.getIndex();
219
                        }
220
                }
221
                return -1;
222
        }
223
224
        public FeatureRules getRules() {
225
                return this.rules;
226
        }
227
228
        public boolean hasEvaluators() {
229
                return this.hasEvaluators;
230
        }
231
232 41342 jjdelcerro
        public boolean hasEmulators() {
233
                return this.hasEmulators;
234
        }
235 43998 jjdelcerro
236
        public boolean hasRequiredFields() {
237
            return this.requiredFields;
238
        }
239 41342 jjdelcerro
240 40435 jjdelcerro
        public List getSRSs() {
241
                if (this.srsList == null) {
242
                        ArrayList tmp = new ArrayList();
243
                        Iterator iter = iterator();
244
                        Iterator tmpIter;
245
                        boolean allreadyHave;
246
                        IProjection tmpSRS;
247
                        FeatureAttributeDescriptor attr;
248
                        while (iter.hasNext()){
249
                                attr = (FeatureAttributeDescriptor) iter.next();
250
                                if (attr.getDataType().getType() == DataTypes.GEOMETRY
251
                                                && attr.getSRS() != null) {
252
                                        allreadyHave = false;
253
                                        tmpIter = tmp.iterator();
254
                                        while (tmpIter.hasNext()) {
255
                                                tmpSRS = (IProjection) tmpIter.next();
256
                                                if (tmpSRS.getAbrev().equals(attr.getSRS().getAbrev())) {
257
                                                        allreadyHave = true;
258
                                                        break;
259
                                                }
260
                                        }
261
                                        if (!allreadyHave) {
262
                                                tmp.add(attr.getSRS());
263
                                        }
264
                                }
265
                        }
266
                        this.srsList = Collections.unmodifiableList(tmp);
267
                }
268
                return this.srsList;
269
        }
270
271
        public IProjection getDefaultSRS() {
272
                if (this.getDefaultGeometryAttributeIndex() < 0) {
273
                        return null;
274
                }
275
                return this.getAttributeDescriptor(
276
                                this.getDefaultGeometryAttributeIndex()).getSRS();
277
        }
278
279 41251 jjdelcerro
        public void validateFeature(Feature feature, int mode) throws DataException {
280
            DefaultFeatureRules rules = (DefaultFeatureRules) this.getRules();
281
            rules.validate(feature,mode);
282 40435 jjdelcerro
        }
283
284
        public FeatureType getSubtype(String[] names) throws DataException {
285 41212 jjdelcerro
                if( names==null || names.length <1) {
286
                    return (FeatureType) this.clone();
287
                }
288
                return new SubtypeFeatureType(this, names, null);
289 40435 jjdelcerro
        }
290
291 41212 jjdelcerro
        public FeatureType getSubtype(String[] names, String[] constantsNames) throws DataException {
292 43358 jjdelcerro
        if( ArrayUtils.isEmpty(names) && ArrayUtils.isEmpty(constantsNames) ) {
293
            return (FeatureType) this.clone();
294
        }
295 41212 jjdelcerro
                return new SubtypeFeatureType(this, names,constantsNames);
296
        }
297
298 43998 jjdelcerro
        public FeatureType getSubtype() throws DataException {
299
                return new SubtypeFeatureType(this, null,null);
300
        }
301
302 40435 jjdelcerro
        public boolean isSubtypeOf(FeatureType featureType) {
303
                return false;
304
        }
305
306 44149 jjdelcerro
    @Override
307
    public List<FeatureAttributeDescriptor> toList() {
308
        return Collections.unmodifiableList(this);
309
    }
310 40435 jjdelcerro
311
        class SubtypeFeatureType extends DefaultFeatureType {
312
                /**
313
                 *
314
                 */
315
                private static final long serialVersionUID = 6913732960073922540L;
316
                WeakReference parent;
317
318 41342 jjdelcerro
                SubtypeFeatureType(DefaultFeatureType parent, String[] names, String[] constantsNames)
319
                        throws DataException {
320
                    super(parent, false);
321
                    DefaultFeatureAttributeDescriptor attrcopy;
322 43998 jjdelcerro
                    Set<String> attrnames = new LinkedHashSet<>();
323
                    Set<String> requiredAttrnames = new HashSet<>();
324
325
                    if ( ArrayUtils.isEmpty(names) ) {
326
                        for (FeatureAttributeDescriptor attrdesc : parent) {
327
                            attrnames.add(attrdesc.getName());
328
                        }
329
                    } else {
330 41342 jjdelcerro
                        attrnames.addAll(Arrays.asList(names));
331 43998 jjdelcerro
                        requiredAttrnames.addAll(Arrays.asList(names));
332
                    }
333
                    // Add required fields for emulated fields
334
                    if ( parent.hasEmulators ) {
335
                        for (FeatureAttributeDescriptor attrdesc : parent) {
336
                            FeatureAttributeEmulator emulator = attrdesc.getFeatureAttributeEmulator();
337
                            if ( emulator != null ) {
338
                                String ss[] = emulator.getRequiredFieldNames();
339
                                if ( ss != null ) {
340
                                    attrnames.addAll(Arrays.asList(ss));
341
                                    requiredAttrnames.addAll(Arrays.asList(ss));
342 41212 jjdelcerro
                                }
343
                            }
344
                        }
345 43998 jjdelcerro
                    }
346
                    // Add missing pk fiels
347
                    if ( !parent.hasOID() ) {
348
                        for (FeatureAttributeDescriptor attrdesc : parent) {
349
                            if ( attrdesc.isPrimaryKey() ) {
350
                                attrnames.add(attrdesc.getName());
351
                                requiredAttrnames.add(attrdesc.getName());
352 41342 jjdelcerro
                            }
353
                        }
354 43998 jjdelcerro
                    }
355
356
                    // Copy attributes
357
                    int i = 0;
358
                    for (String name : attrnames) {
359
                        DefaultFeatureAttributeDescriptor attr = (DefaultFeatureAttributeDescriptor) parent.get(name);
360
                        if ( attr == null ) {
361
                            throw new SubtypeFeatureTypeNameException(name, parent.getId());
362 41342 jjdelcerro
                        }
363 43998 jjdelcerro
                        attrcopy = new DefaultFeatureAttributeDescriptor(attr);
364
                        this.add(attrcopy);
365
                        attrcopy.index = i++;
366 41342 jjdelcerro
                    }
367 43998 jjdelcerro
368 41342 jjdelcerro
                    // Set the consttants attributes.
369 43358 jjdelcerro
                    if ( !ArrayUtils.isEmpty(constantsNames) ) {
370 43998 jjdelcerro
                        for (String name : constantsNames) {
371
                            if ( !requiredAttrnames.contains(name) ) {
372
                                DefaultFeatureAttributeDescriptor attr = (DefaultFeatureAttributeDescriptor) this.get(name);
373
                                attr.setConstantValue(true);
374 41212 jjdelcerro
                            }
375
                        }
376 41342 jjdelcerro
                    }
377 41212 jjdelcerro
378 44077 jjdelcerro
                    this.defaultGeometryAttributeIndex = this.getIndex(this.defaultGeometryAttributeName);
379 41342 jjdelcerro
                    if ( this.defaultGeometryAttributeIndex < 0 ) {
380
                        this.defaultGeometryAttributeName = null;
381
                    }
382 44077 jjdelcerro
                    this.defaultTimeAttributeIndex = this.getIndex(this.defaultTimeAttributeName);
383
                    if ( this.defaultTimeAttributeIndex < 0 ) {
384
                        this.defaultTimeAttributeName = null;
385
                    }
386 41342 jjdelcerro
                    this.parent = new WeakReference(parent);
387
                }
388 40435 jjdelcerro
389
                public FeatureType getSubtype(String[] names) throws DataException {
390
                        return new SubtypeFeatureType((DefaultFeatureType) this.parent
391 41212 jjdelcerro
                                        .get(), names, null);
392 40435 jjdelcerro
                }
393
394
                public boolean isSubtypeOf(FeatureType featureType) {
395
                        if (featureType == null) {
396
                                return false;
397
                        }
398
                        FeatureType parent = (FeatureType) this.parent.get();
399
                        return featureType.equals(parent);
400
                }
401
402
                public EditableFeatureType getEditable() {
403
                        throw new UnsupportedOperationException();
404
                }
405
        }
406
407
        public class SubtypeFeatureTypeNameException extends DataException {
408
409
                /**
410
                 *
411
                 */
412
                private static final long serialVersionUID = -4414242486723260101L;
413 43555 fdiaz
                private final static String MESSAGE_FORMAT = "Attribute name '%(name)' not found in type (%(type)).";
414 40435 jjdelcerro
                private final static String MESSAGE_KEY = "_SubtypeFeatureTypeNameException";
415
416
                public SubtypeFeatureTypeNameException(String name, String type) {
417
                        super(MESSAGE_FORMAT, MESSAGE_KEY, serialVersionUID);
418
                        setValue("name", name);
419
                        setValue("type", type);
420
                }
421
        }
422
423
        public boolean hasOID() {
424
                return hasOID;
425
        }
426
        public String toString(){
427
                StringBuffer s = new StringBuffer();
428
                s.append(this.getId());
429
                s.append(":[");
430
                String attName;
431
                for (int i = 0; i < size(); i++) {
432
                        attName =((FeatureAttributeDescriptor)get(i)).getName().toString();
433
                        s.append(attName);
434
                        if (i < size() - 1) {
435
                                s.append(',');
436
                        }
437
                }
438
                s.append(']');
439
                return s.toString();
440
        }
441
442 44149 jjdelcerro
        public Iterator<FeatureAttributeDescriptor> iterator() {
443 40435 jjdelcerro
                return getIterator(super.iterator());
444
        }
445
446
        protected Iterator getIterator(Iterator iter) {
447
                return new DelegatedIterator(iter);
448
        }
449
450
        protected class DelegatedIterator implements Iterator {
451
452
                protected Iterator iterator;
453
454
                public DelegatedIterator(Iterator iter) {
455
                        this.iterator = iter;
456
                }
457
458
                public boolean hasNext() {
459
                        return iterator.hasNext();
460
                }
461
462
                public Object next() {
463
                        return iterator.next();
464
                }
465
466
                public void remove() {
467
                        throw new UnsupportedOperationException();
468
                }
469
470
        }
471
472
        public boolean allowAutomaticValues() {
473
                return this.allowAtomaticValues;
474
        }
475
476
        public FeatureAttributeDescriptor[] getAttributeDescriptors() {
477
                return (FeatureAttributeDescriptor[]) super
478
                                .toArray(new FeatureAttributeDescriptor[super.size()]);
479
        }
480
481
        public FeatureAttributeDescriptor[] getPrimaryKey() {
482
                if (pk == null) {
483 43358 jjdelcerro
                        List pks = new ArrayList();
484 40435 jjdelcerro
                        Iterator iter = super.iterator();
485
                        FeatureAttributeDescriptor attr;
486
                        while (iter.hasNext()){
487
                                attr = (FeatureAttributeDescriptor) iter.next();
488
                                if (attr.isPrimaryKey()){
489 43358 jjdelcerro
                                        pks.add(attr);
490 40435 jjdelcerro
                                }
491
                        }
492 43358 jjdelcerro
            if( pks.isEmpty() ) {
493
                pk = new FeatureAttributeDescriptor[0];
494
            } else {
495
                pk = (FeatureAttributeDescriptor[])pks.toArray(new FeatureAttributeDescriptor[pks.size()]);
496
            }
497 40435 jjdelcerro
                }
498
                return pk;
499
        }
500
501
        public FeatureAttributeDescriptor getDefaultGeometryAttribute() {
502
                if (this.defaultGeometryAttributeIndex < 0) {
503
                        return null;
504
                }
505
                return (FeatureAttributeDescriptor) super
506
                                .get(this.defaultGeometryAttributeIndex);
507
        }
508
509
510
511 44077 jjdelcerro
        public boolean equals(Object o) {
512
            if (this == o) {
513
                    return true;
514
            }
515
            if (!(o instanceof DefaultFeatureType)) {
516
                    return false;
517
            }
518
            DefaultFeatureType other = (DefaultFeatureType) o;
519
            if (!this.id.equals(other.id)) {
520
                    return false;
521
            }
522
            if (this.size() != other.size()) {
523
                    return false;
524
            }
525
            FeatureAttributeDescriptor attr,attrOther;
526
            Iterator iter,iterOther;
527
            iter = this.iterator();
528
            iterOther = other.iterator();
529
            while (iter.hasNext()) {
530
                    attr = (FeatureAttributeDescriptor) iter.next();
531
                    attrOther = (FeatureAttributeDescriptor) iterOther.next();
532
                    if (!attr.equals(attrOther)) {
533
                            return false;
534
                    }
535
            }
536 40435 jjdelcerro
537 44077 jjdelcerro
            if( !StringUtils.equals(defaultGeometryAttributeName, other.defaultGeometryAttributeName)) {
538
                return false;
539
            }
540
            if( !StringUtils.equals(defaultTimeAttributeName, other.defaultTimeAttributeName)) {
541
                return false;
542
            }
543
            return true;
544 40435 jjdelcerro
545
        }
546
547
        /**
548
         * Start of DynClass interface implementation
549
         * READONLY
550
         */
551
552
        public DynField addDynField(String name) {
553
                throw new UnsupportedOperationException();
554
        }
555
556
        public DynField getDeclaredDynField(String name) {
557
                return (DynField) getAttributeDescriptor(name);
558
        }
559
560
        public DynField[] getDeclaredDynFields() {
561
                return (DynField[]) getAttributeDescriptors();
562
        }
563
564
        public String getDescription() {
565 44149 jjdelcerro
            return null;
566 40435 jjdelcerro
        }
567
568
        public DynField getDynField(String name) {
569
                return (DynField) getAttributeDescriptor(name);
570
        }
571
572
        public DynField[] getDynFields() {
573
                return (DynField[]) getAttributeDescriptors();
574
        }
575
576
        public String getName() {
577 40887 jjdelcerro
                return this.id + "_" + internalID;
578 40435 jjdelcerro
        }
579
580
        public void removeDynField(String name) {
581
                throw new UnsupportedOperationException();
582
583
        }
584
585
        public void addDynMethod(DynMethod dynMethod) {
586
                throw new UnsupportedOperationException();
587
588
        }
589
590
        public void extend(DynClass dynClass) {
591
                throw new UnsupportedOperationException();
592
593
        }
594
595
        public void extend(String dynClassName) {
596
                throw new UnsupportedOperationException();
597
598
        }
599
600
        public void extend(String namespace, String dynClassName) {
601
                throw new UnsupportedOperationException();
602
603
        }
604
605
        public DynMethod getDeclaredDynMethod(String name)
606
                        throws DynMethodException {
607
                return null;
608
        }
609
610
        public DynMethod[] getDeclaredDynMethods() throws DynMethodException {
611
                return null;
612
        }
613
614
        public DynMethod getDynMethod(String name) throws DynMethodException {
615
                return null;
616
        }
617
618
        public DynMethod getDynMethod(int code) throws DynMethodException {
619
                return null;
620
        }
621
622
        public DynMethod[] getDynMethods() throws DynMethodException {
623
                return null;
624
        }
625
626
        public DynClass[] getSuperDynClasses() {
627
                return null;
628
        }
629
630
        public boolean isInstance(DynObject dynObject) {
631
                if (dynObject.getDynClass().getName() == getName()) {
632
                        return true;
633
                }
634
                return false;
635
        }
636
637
        public DynObject newInstance() {
638
639
                throw new UnsupportedOperationException();
640
        }
641
642
        public void removeDynMethod(String name) {
643
                throw new UnsupportedOperationException();
644
645
        }
646
647
        public DynField addDynFieldChoice(String name, int type,
648
                        Object defaultValue, DynObjectValueItem[] values,
649
                        boolean mandatory, boolean persistent) {
650
                throw new UnsupportedOperationException();
651
        }
652
653
        public DynField addDynFieldRange(String name, int type,
654
                        Object defaultValue, Object min, Object max, boolean mandatory,
655
                        boolean persistent) {
656
                throw new UnsupportedOperationException();
657
        }
658
659
        public DynField addDynFieldSingle(String name, int type,
660
                        Object defaultValue, boolean mandatory, boolean persistent) {
661
                throw new UnsupportedOperationException();
662
        }
663
664
        public void validate(DynObject object) throws DynObjectValidateException {
665
                //FIXME: not sure it's the correct code
666
                if (object instanceof Feature) {
667
                        Feature fea = (Feature) object;
668
                        if (fea.getType().equals(this)) {
669
                                return;
670
                        }
671
                }
672
                throw new DynObjectValidateException(this.id);
673
        }
674
675
        public DynField addDynFieldLong(String name) {
676
                throw new UnsupportedOperationException();
677
        }
678
679
        public DynField addDynFieldChoice(String name, int type,
680
                        Object defaultValue, DynObjectValueItem[] values) {
681
                throw new UnsupportedOperationException();
682
        }
683
684
        public DynField addDynFieldRange(String name, int type,
685
                        Object defaultValue, Object min, Object max) {
686
                throw new UnsupportedOperationException();
687
        }
688
689
        public DynField addDynFieldSingle(String name, int type, Object defaultValue) {
690
                throw new UnsupportedOperationException();
691
        }
692
693
        public DynField addDynFieldString(String name) {
694
                throw new UnsupportedOperationException();
695
        }
696 43555 fdiaz
697 40435 jjdelcerro
        public DynField addDynFieldInt(String name) {
698
                throw new UnsupportedOperationException();
699
        }
700 43555 fdiaz
701 40435 jjdelcerro
        public DynField addDynFieldDouble(String name) {
702
                throw new UnsupportedOperationException();
703
        }
704 43555 fdiaz
705 40435 jjdelcerro
        public DynField addDynFieldFloat(String name) {
706
                throw new UnsupportedOperationException();
707
        }
708
709
        public DynField addDynFieldBoolean(String name) {
710
                throw new UnsupportedOperationException();
711
        }
712
713
        public DynField addDynFieldList(String name) {
714
                throw new UnsupportedOperationException();
715
        }
716
717
        public DynField addDynFieldMap(String name) {
718
                throw new UnsupportedOperationException();
719
        }
720
721
        public DynField addDynFieldObject(String name) {
722
                throw new UnsupportedOperationException();
723
        }
724
725
        public DynField addDynFieldSet(String name) {
726
                throw new UnsupportedOperationException();
727
        }
728
729
        public DynField addDynFieldArray(String name) {
730
                throw new UnsupportedOperationException();
731
        }
732
733
        public DynField addDynFieldDate(String name) {
734
                throw new UnsupportedOperationException();
735
        }
736
737
        public void extend(DynStruct struct) {
738
                throw new UnsupportedOperationException();
739
        }
740
741
        public String getFullName() {
742
        // TODO: usar el DynClassName
743
                return this.id;
744
        }
745
746
        public String getNamespace() {
747
                return "DALFeature";
748
        }
749
750
        public DynStruct[] getSuperDynStructs() {
751
                return null;
752
        }
753
754
        public void setDescription(String description) {
755
                throw new UnsupportedOperationException();
756
        }
757
758
        public void setNamespace(String namespace) {
759
                throw new UnsupportedOperationException();
760
        }
761
762
        public DynField addDynFieldFile(String name) {
763
                throw new UnsupportedOperationException();
764
        }
765
766
        public DynField addDynFieldFolder(String name) {
767
                throw new UnsupportedOperationException();
768
        }
769
770
        public DynField addDynFieldURL(String name) {
771
                throw new UnsupportedOperationException();
772
        }
773
774
        public DynField addDynFieldURI(String name) {
775
                throw new UnsupportedOperationException();
776
        }
777
778
    public boolean isExtendable(DynStruct dynStruct) {
779
        return false;
780
    }
781
782
        public void extend(DynStruct[] structs) {
783
                // TODO Auto-generated method stub
784 43555 fdiaz
785 40435 jjdelcerro
        }
786
787
        public void remove(DynStruct superDynStruct) {
788
                // TODO Auto-generated method stub
789 43555 fdiaz
790 40435 jjdelcerro
        }
791
792
        public void removeAll(DynStruct[] superDynStruct) {
793
                // TODO Auto-generated method stub
794 43555 fdiaz
795 40435 jjdelcerro
        }
796
797
        public FeatureAttributeDescriptor getDefaultTimeAttribute() {
798
                if (this.defaultTimeAttributeIndex < 0) {
799
                        return null;
800
                }
801
                return (FeatureAttributeDescriptor) super
802
                                .get(this.defaultTimeAttributeIndex);
803
        }
804 43610 jjdelcerro
805
    public void setDefaultTimeAttributeName(String name) {
806
        if (name == null || name.length() == 0) {
807
            this.defaultTimeAttributeIndex = -1;
808
            return;
809
        }
810
        DefaultFeatureAttributeDescriptor attr = (DefaultFeatureAttributeDescriptor) this.get(name);
811
        if (attr == null) {
812
            throw new IllegalArgumentException("Attribute '" + name + "' not found.");
813
        }
814
        if( attr.getIndex()<0 ) {
815
            fixAll();
816
        }
817
        this.defaultTimeAttributeIndex = attr.getIndex();
818
    }
819
820
    protected void fixAll() {
821
        int i = 0;
822
        Iterator iter = super.iterator();
823
        DefaultFeatureAttributeDescriptor attr;
824
825
        while (iter.hasNext()) {
826
            attr = (DefaultFeatureAttributeDescriptor) iter.next();
827
            attr.setIndex(i++);
828 44094 jjdelcerro
            attr.fixAll();
829 43610 jjdelcerro
            if (attr.getEvaluator() != null) {
830
                this.hasEvaluators = true;
831
            }
832
            if (attr.getFeatureAttributeEmulator() != null) {
833
                this.hasEmulators = true;
834 43998 jjdelcerro
                String[] x = attr.getFeatureAttributeEmulator().getRequiredFieldNames();
835
                if( !ArrayUtils.isEmpty(x) ) {
836
                    this.requiredFields = true;
837
                }
838 43610 jjdelcerro
            }
839 44090 jjdelcerro
            switch(attr.getType()) {
840
                case DataTypes.GEOMETRY:
841
                    if (this.defaultGeometryAttributeName == null ) {
842
                        this.defaultGeometryAttributeName = attr.getName();
843
                    }
844
                    break;
845
                case DataTypes.INSTANT:
846
                case DataTypes.INTERVAL:
847
                case DataTypes.DATE:
848
                    if (this.defaultTimeAttributeName == null && attr.isTime() ) {
849
                        this.defaultTimeAttributeName = attr.getName();
850
                    }
851
                    break;
852 43610 jjdelcerro
            }
853
        }
854
        if (this.defaultGeometryAttributeName != null) {
855
            this.defaultGeometryAttributeIndex = this.getIndex(this.defaultGeometryAttributeName);
856
        }
857 44077 jjdelcerro
        if (this.defaultTimeAttributeName != null) {
858
            this.defaultTimeAttributeIndex = this.getIndex(this.defaultTimeAttributeName);
859
        }
860 43610 jjdelcerro
        this.internalID = Long.toHexString(this.getCRC());
861
862
    }
863
864
    protected long getCRC() {
865
        StringBuffer buffer = new StringBuffer();
866
        for (int i = 0; i < this.size(); i++) {
867
            FeatureAttributeDescriptor x = this.getAttributeDescriptor(i);
868
            buffer.append(x.getName());
869
            buffer.append(x.getDataTypeName());
870
            buffer.append(x.getSize());
871
        }
872
        CRC32 crc = new CRC32();
873
        byte[] data = buffer.toString().getBytes();
874
        crc.update(data);
875
        return crc.getValue();
876
    }
877 43739 jjdelcerro
878
    @Override
879
    public FeatureStore getStore() {
880
        if( this.storeRef == null ) {
881
            return null;
882
        }
883
        return (FeatureStore) this.storeRef.get();
884
    }
885
886 40435 jjdelcerro
}