Statistics
| Revision:

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

History | View | Annotate | Download (5.04 KB)

1
package org.gvsig.fmap.dal.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.dal.exception.DataException;
8
import org.gvsig.fmap.dal.feature.Feature;
9
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
10
import org.gvsig.fmap.dal.feature.FeatureStore;
11
import org.gvsig.fmap.dal.feature.FeatureType;
12
import org.gvsig.fmap.dal.feature.spi.FeatureData;
13
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
14
import org.gvsig.tools.persistence.PersistenceException;
15
import org.gvsig.tools.persistence.Persistent;
16
import org.gvsig.tools.persistence.PersistentState;
17

    
18
public class DefaultFeatureReference implements
19
                FeatureReferenceProviderServices, Persistent {
20

    
21
        private Object oid;
22
        private int fDataHashCode;
23
        private Integer myHashCode;
24
        private Object[] pk;
25
        private String[] pkNames;
26
        private WeakReference storeRef;
27
        private boolean isNewFeature;
28

    
29
        public DefaultFeatureReference(DefaultFeature feature) {
30
                this(feature.getStore(), feature.getData());
31
        }
32

    
33
        public DefaultFeatureReference(FeatureStore store,
34
                        FeatureData fdata) {
35
                this.isNewFeature = fdata.isNew();
36
                this.oid = null;
37
                this.pk = null;
38
                this.storeRef = new WeakReference(store);
39

    
40
                if (fdata.getType().hasOID()) {
41
                        this.oid = fdata.getOID();
42
                        if (this.oid == null) {
43
                                // FIXME: petar
44
                        }
45
                } else if (!isNewFeature) {
46
                        this.calculatePK(fdata);
47
                        if (this.pk == null) {
48
                                // FIXME: pete
49
                        }
50
                } else { // isNew && !hasOID
51
                        fDataHashCode = fdata.hashCode();
52
                }
53

    
54
        }
55

    
56
        /*
57
         * Use only for Persistent.setState
58
         */
59
        public DefaultFeatureReference(FeatureStore store) {
60
                this.isNewFeature = false;
61
                this.oid = null;
62
                this.pk = null;
63
                this.storeRef = new WeakReference(store);
64
        }
65

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

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

    
80

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

    
85
        private void calculatePK(FeatureData fdata) {
86
                ArrayList keys = new ArrayList();
87
                ArrayList keyNames = new ArrayList();
88
                FeatureType type = fdata.getType();
89
                Iterator it = type.iterator();
90
                while (it.hasNext()) {
91
                        FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) it
92
                                        .next();
93
                        if (attr.isPrimaryKey()) {
94
                                keys.add(fdata.get(attr.getIndex()));
95
                                keyNames.add(attr.getName());
96
                        }
97
                }
98
                if (keys.size() < 1) {
99
                        pk = null;
100
                        pkNames = null;
101
                } else {
102
                        pk = keys.toArray();
103
                        pkNames = (String[]) keyNames.toArray(new String[0]);
104
                }
105
        }
106

    
107
        public Feature getFeature() throws DataException {
108
                return this.getStore().getFeatureByReference(this);
109
        }
110

    
111
        public Feature getFeature(FeatureType featureType) throws DataException {
112
                return this.getStore().getFeatureByReference(this, featureType);
113
        }
114

    
115
        public Object getOID() {
116
                return this.oid;
117
        }
118

    
119
        public boolean isNewFeature() {
120
                return this.isNewFeature;
121
        }
122

    
123
        public void saveToState(PersistentState state) throws PersistenceException {
124
                state.set("oid", oid);
125
                state.set("isNewFeature", isNewFeature);
126
                if (pk !=null){
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

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

    
146
        public boolean equals(Object obj) {
147
                if (!(obj instanceof DefaultFeatureReference)) {
148
                        return false;
149
                }
150
                DefaultFeatureReference other = (DefaultFeatureReference) obj;
151

    
152
                FeatureStore otherStore = (FeatureStore) other.storeRef.get();
153
                FeatureStore myrStore = (FeatureStore) this.storeRef.get();
154
                if (otherStore == null || myrStore == null) {
155
                        return false;
156
                }
157
                if (!myrStore.equals(otherStore)) {
158
                        return false;
159
                }
160
                if (this.oid != null) {
161
                        return this.oid.equals(other.oid);
162
                }
163

    
164
                for (int i = 0; i < this.pk.length; i++) {
165
                        if (!this.pk[i].equals(other.pk[i])) {
166
                                return false;
167
                        }
168
                }
169
                return true;
170
        }
171

    
172
        public int hashCode() {
173
                if (this.oid != null) {
174
                        return this.oid.hashCode();
175
                } else {
176
                        if (this.isNewFeature){
177
                                return fDataHashCode;
178
                        }
179
                        if (myHashCode == null) {
180

    
181
                                StringBuffer buff = new StringBuffer();
182

    
183
                                for (int i = 0; i < this.pk.length; i++) {
184
                                        buff.append(this.pk[i].hashCode());
185
                                        buff.append("$");
186
                                }
187
                                myHashCode = new Integer(buff.toString().hashCode());
188
                        }
189
                        return myHashCode.intValue();
190

    
191
                }
192
        }
193

    
194
        public String[] getKeyNames() {
195
                return pkNames;
196
        }
197

    
198
        public Object getKeyValue(String name) {
199
                for (int i = 0; i < pkNames.length; i++) {
200
                        if (pkNames[i].equalsIgnoreCase(name)) {
201
                                return pk[i];
202
                        }
203
                }
204
                // FIXME exception????
205
                return null;
206
        }
207

    
208

    
209
}