Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_data / src / org / gvsig / fmap / data / feature / impl / DefaultFeatureReference.java @ 24248

History | View | Annotate | Download (3.78 KB)

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

    
3
import java.lang.ref.WeakReference;
4
import java.util.ArrayList;
5
import java.util.Iterator;
6

    
7
import org.gvsig.fmap.data.exceptions.DataException;
8
import org.gvsig.fmap.data.feature.Feature;
9
import org.gvsig.fmap.data.feature.FeatureAttributeDescriptor;
10
import org.gvsig.fmap.data.feature.FeatureStore;
11
import org.gvsig.fmap.data.feature.FeatureType;
12
import org.gvsig.fmap.data.feature.spi.FeatureData;
13
import org.gvsig.fmap.data.feature.spi.FeatureReferenceProviderServices;
14
import org.gvsig.tools.persistence.AbstractPersistenceManager;
15
import org.gvsig.tools.persistence.PersistenceException;
16
import org.gvsig.tools.persistence.Persistent;
17
import org.gvsig.tools.persistence.PersistentState;
18

    
19
public class DefaultFeatureReference implements
20
                FeatureReferenceProviderServices, Persistent {
21

    
22
        private Object oid;
23
        private Object[] pk;
24
        private WeakReference storeRef;
25
        private boolean isNewFeature;
26

    
27
        public DefaultFeatureReference(DefaultFeature feature) {
28
                this(feature, false);
29
        }
30
        public DefaultFeatureReference(DefaultFeature feature, boolean isNewFeature) {
31
                this(feature.getStore(), feature.getData(),
32
                                isNewFeature);
33
        }
34

    
35
        public DefaultFeatureReference(FeatureStore store,
36
                        FeatureData fdata, boolean isNewFeature) {
37
                this.isNewFeature = isNewFeature;
38
                this.oid = null;
39
                this.pk = null;
40
                this.storeRef = new WeakReference(store);
41
                if (isNewFeature) {
42
                        this.oid = getStore().getProvider().createNewOID();
43
                } else {
44
                        if (fdata.getType().hasOID()) {
45
                                if (this.oid == null) {
46
                                        // FIXME: petar
47
                                }
48
                                this.oid = fdata.getOID();
49
                        } else {
50
                                this.pk = this.calculatePK(fdata);
51
                                if (this.pk == null) {
52
                                        // FIXME: pete
53
                                }
54
                        }
55
                }
56
        }
57

    
58
        public DefaultFeatureReference(FeatureStore store) {
59
                this.isNewFeature = false;
60
                this.oid = null;
61
                this.pk = null;
62
                this.storeRef = new WeakReference(store);
63
        }
64

    
65
        public DefaultFeatureReference(FeatureStore store, Object oid) {
66
                this.isNewFeature = false;
67
                this.oid = oid;
68
                this.pk = null;
69
                this.storeRef = new WeakReference(store);
70
        }
71

    
72
        public DefaultFeatureReference(FeatureStore store, Object[] pk) {
73
                this.isNewFeature = false;
74
                this.oid = null;
75
                this.pk = pk;
76
                this.storeRef = new WeakReference(store);
77
        }
78

    
79

    
80
        private DefaultFeatureStore getStore() {
81
                return (DefaultFeatureStore) this.storeRef.get();
82
        }
83

    
84
        private Object[] calculatePK(FeatureData fdata) {
85
                ArrayList key = new ArrayList();
86
                FeatureType type = fdata.getType();
87
                Iterator it = type.iterator();
88
                while (it.hasNext()) {
89
                        FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) it
90
                                        .next();
91
                        if (attr.isPrimaryKey()) {
92
                                key.add(fdata.get(attr.getIndex()));
93
                        }
94
                }
95
                if (key.size() < 1) {
96
                        return null;
97
                }
98
                return key.toArray();
99
        }
100

    
101
        public Feature getFeature() throws DataException {
102
                return this.getStore().getFeatureByReference(this);
103
        }
104

    
105
        public Feature getFeature(FeatureType featureType) throws DataException {
106
                return this.getStore().getFeatureByReference(this, featureType);
107
        }
108

    
109
        public Object[] getKey() {
110
                return this.pk;
111
        }
112

    
113
        public Object getOID() {
114
                return this.oid;
115
        }
116

    
117
        public boolean isNewFeature() {
118
                return this.isNewFeature;
119
        }
120
        public PersistentState getState() throws PersistenceException {
121
                return AbstractPersistenceManager.getState(this);
122
        }
123

    
124
        public void loadState(PersistentState state) throws PersistenceException {
125
                state.set("oid", oid);
126
                state.set("isNewFeature", isNewFeature);
127
                state.set("pk.elements", pk.length);
128
                for (int i = 0; i < pk.length; i++) {
129
                        state.set("pk.item" + i, pk[0]);
130
                }
131

    
132
        }
133

    
134
        public void setState(PersistentState state) throws PersistenceException {
135
                this.oid = state.get("oid");
136
                this.isNewFeature = state.getBoolean("isNewFeature");
137
                this.pk = new Object[state.getInt("pk.elements")];
138
                for (int i = 0; i < pk.length; i++) {
139
                        this.pk[i] = state.get("pk.item" + i);
140
                }
141
        }
142
}