Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_dal / src / org / gvsig / fmap / dal / feature / impl / DefaultFeatureReference.java @ 32880

History | View | Annotate | Download (7.42 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.Arrays;
6
import java.util.Iterator;
7
import java.util.List;
8

    
9
import org.gvsig.fmap.dal.DataTypes;
10
import org.gvsig.fmap.dal.exception.DataException;
11
import org.gvsig.fmap.dal.feature.Feature;
12
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
13
import org.gvsig.fmap.dal.feature.FeatureStore;
14
import org.gvsig.fmap.dal.feature.FeatureType;
15
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
16
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
17
import org.gvsig.tools.ToolsLocator;
18
import org.gvsig.tools.dynobject.DynStruct;
19
import org.gvsig.tools.persistence.PersistenceManager;
20
import org.gvsig.tools.persistence.Persistent;
21
import org.gvsig.tools.persistence.PersistentState;
22
import org.gvsig.tools.persistence.exception.PersistenceException;
23

    
24
public class DefaultFeatureReference implements
25
                FeatureReferenceProviderServices, Persistent {
26

    
27
        private Object oid;
28
        private Integer myHashCode = null;
29
        private Object[] pk;
30
        private String[] pkNames;
31
        private WeakReference storeRef;
32
        private boolean isNewFeature;
33
        private String featureTypeId;
34
         
35
        /**
36
     * Constructor used by the persistence manager. Don't use directly.
37
     * After to invoke this method, the persistence manager calls 
38
     * the the method {@link #loadFromState(PersistentState)} to set 
39
     * the values of the internal attributes that this class needs to work.
40
     */
41
        public DefaultFeatureReference() {
42
                super();                
43
        }
44
        
45
        public DefaultFeatureReference(DefaultFeature feature) {
46
                this(feature.getStore(), feature.getData());
47
        }
48

    
49
        public DefaultFeatureReference(FeatureStore store,
50
                        FeatureProvider fdata) {
51
                this.isNewFeature = fdata.isNew();
52
                this.oid = null;
53
                this.pk = null;
54
                this.storeRef = new WeakReference(store);
55
                this.featureTypeId = fdata.getType().getId();
56

    
57
                if (fdata.getType().hasOID() || isNewFeature) {
58
                        this.oid = fdata.getOID();
59
                        if (this.oid == null) {
60
                                // FIXME Exception
61
                                throw new RuntimeException("Missing OID");
62
                        }
63
                } else {
64
                        this.calculatePK(fdata);
65
                        if (this.pk == null) {
66
                                // FIXME Exception
67
                                throw new RuntimeException("Missing pk attributes");
68
                        }
69
                }
70

    
71
        }
72

    
73
        /*
74
         * Use only for Persistent.setState
75
         */
76
        public DefaultFeatureReference(FeatureStore store) {
77
                this.isNewFeature = false;
78
                this.oid = null;
79
                this.pk = null;
80
                this.storeRef = new WeakReference(store);
81
        }
82

    
83
        public DefaultFeatureReference(FeatureStore store, Object oid) {
84
                // FIXME featureTypeId is needed !!!
85
                this.isNewFeature = false;
86
                this.oid = oid;
87
                this.pk = null;
88
                this.storeRef = new WeakReference(store);
89
        }
90

    
91
        private DefaultFeatureStore getStore() {
92
                return (DefaultFeatureStore) this.storeRef.get();
93
        }
94

    
95
        private void calculatePK(FeatureProvider fdata) {
96
                ArrayList keys = new ArrayList();
97
                ArrayList keyNames = new ArrayList();
98
                FeatureType type = fdata.getType();
99
                Iterator it = type.iterator();
100
                while (it.hasNext()) {
101
                        FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) it
102
                                        .next();
103
                        if (attr.isPrimaryKey()) {
104
                                keys.add(fdata.get(attr.getIndex()));
105
                                keyNames.add(attr.getName());
106
                        }
107
                }
108
                if (keys.size() < 1) {
109
                        pk = null;
110
                        pkNames = null;
111
                } else {
112
                        pk = keys.toArray();
113
                        pkNames = (String[]) keyNames.toArray(new String[0]);
114
                }
115
        }
116

    
117
        public Feature getFeature() throws DataException {
118
                return this.getStore().getFeatureByReference(this);
119
        }
120

    
121
        public Feature getFeature(FeatureType featureType) throws DataException {
122
                return this.getStore().getFeatureByReference(this, featureType);
123
        }
124

    
125
        public Object getOID() {
126
                return this.oid;
127
        }
128

    
129
        public boolean isNewFeature() {
130
                return this.isNewFeature;
131
        }
132

    
133

    
134
        public boolean equals(Object obj) {
135
                if (!(obj instanceof DefaultFeatureReference)) {
136
                        return false;
137
                }
138
                DefaultFeatureReference other = (DefaultFeatureReference) obj;
139

    
140
                FeatureStore otherStore = (FeatureStore) other.storeRef.get();
141
                FeatureStore myrStore = (FeatureStore) this.storeRef.get();
142
                if (otherStore == null || myrStore == null) {
143
                        return false;
144
                }
145
                if (!myrStore.equals(otherStore)) {
146
                        return false;
147
                }
148
                if (myHashCode != null && other.myHashCode != null) {
149
                        return myHashCode.equals(other.myHashCode);
150
                }
151
                if (this.oid != null) {
152
                        return this.oid.equals(other.oid);
153
                }
154
                for (int i = 0; i < this.pk.length; i++) {
155
                        if (!this.pk[i].equals(other.pk[i])) {
156
                                return false;
157
                        }
158
                }
159
                return true;
160
        }
161

    
162
        public int hashCode() {
163
                if (this.oid != null) {
164
                        return this.oid.hashCode();
165
                }
166
                if (myHashCode == null) {
167
                        StringBuffer buff = new StringBuffer();
168

    
169
                        for (int i = 0; i < this.pk.length; i++) {
170
                                buff.append(this.pk[i].hashCode());
171
                                buff.append("##");
172
                        }
173
                        myHashCode = new Integer(buff.toString().hashCode());
174
                }
175
                return myHashCode.intValue();
176
        }
177

    
178
        public String[] getKeyNames() {
179
                return pkNames;
180
        }
181

    
182
        public Object getKeyValue(String name) {
183
                for (int i = 0; i < pkNames.length; i++) {
184
                        if (pkNames[i].equalsIgnoreCase(name)) {
185
                                return pk[i];
186
                        }
187
                }
188
                // FIXME exception????
189
                return null;
190
        }
191

    
192
        public String getFeatureTypeId() {
193
                return featureTypeId;
194
        }
195

    
196
        // *** Persistence ***
197

    
198
        public void loadFromState(PersistentState state)
199
                        throws PersistenceException {
200
                this.oid = state.get("oid");
201
                this.myHashCode = (Integer) state.get("myHashCode");
202
                this.storeRef = new WeakReference(state.get("store"));
203
                this.isNewFeature = state.getBoolean("isNewFeature");
204
                this.featureTypeId = state.getString("featureTypeId");
205
                List pkList = (List) state.get("pk");
206
                if (pkList != null) {
207
                        List pkNamesList = (List) state.get("pkNames");
208
                        if (pkNamesList == null || pkList.size() != pkNamesList.size()) {
209
                                throw new PersistenceException("bad pkNames value");
210
                        }
211
                        this.pk = pkList.toArray();
212
                        this.pkNames = (String[]) pkNamesList.toArray();
213
                } else {
214
                        this.pk = null;
215
                        this.pkNames = null;
216
                }
217
        }
218

    
219
        public void saveToState(PersistentState state) throws PersistenceException {
220
                state.set("oid", oid);
221
                state.set("myHashCode", myHashCode);
222
                state.set("isNewFeature", isNewFeature);
223
                state.set("store", (Persistent) storeRef.get());
224
                state.set("featureTypeId", featureTypeId);
225
                if (pk == null) {
226
                        state.set("pk", (List) null);
227
                        state.set("pkNames", (List) null);
228
                } else {
229
                        state.set("pk", Arrays.asList(pk));
230
                        state.set("pkNames", Arrays.asList(pkNames));
231
                }
232

    
233
        }
234

    
235
        public static void registerPersistent() {
236
                DynStruct definition = ToolsLocator.getPersistenceManager().addDefinition(
237
                                DefaultFeatureReference.class, 
238
                                "Reference", 
239
                                "DefaultFeatureReference Persistent definition", 
240
                                null, 
241
                                null
242
                        );
243

    
244
                definition.addDynField("oid")
245
                        .setType(DataTypes.OBJECT)
246
                        .setMandatory(true)
247
                        .setPersistent(true);
248
                        
249
                definition.addDynField("isNewFeature")
250
                        .setType(DataTypes.BOOLEAN)
251
                        .setMandatory(true)
252
                        .setPersistent(true);
253
        
254
                definition.addDynField("store")
255
                        .setType(DataTypes.OBJECT)
256
                        .setSubtype("DataStore")
257
                        .setClassOfValue(FeatureStore.class)
258
                        .setMandatory(true)
259
                        .setPersistent(true);
260

    
261
                definition.addDynField("myHashCode")
262
                        .setType(DataTypes.OBJECT)
263
                        .setSubtype("Integer")
264
                        .setClassOfValue(Integer.class)
265
                        .setMandatory(true)
266
                        .setPersistent(true);
267
        
268
                definition.addDynField("featureTypeId")
269
                        .setType(DataTypes.STRING)
270
                        .setMandatory(true)
271
                        .setPersistent(true);
272

    
273
                definition.addDynField("ok")
274
                        .setType(DataTypes.LIST)
275
                        .setMandatory(false)
276
                        .setPersistent(true);
277

    
278
                definition.addDynField("pkNames")
279
                        .setType(DataTypes.STRING)
280
                        .setMandatory(true)
281
                        .setPersistent(true);
282

    
283
        }
284

    
285

    
286
}