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 / DefaultFeatureReference.java @ 40435

History | View | Annotate | Download (7.71 KB)

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

    
3
import java.lang.ref.WeakReference;
4
import java.text.MessageFormat;
5
import java.util.ArrayList;
6
import java.util.Arrays;
7
import java.util.Iterator;
8
import java.util.List;
9

    
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.Persistent;
20
import org.gvsig.tools.persistence.PersistentState;
21
import org.gvsig.tools.persistence.exception.PersistenceException;
22

    
23
public class DefaultFeatureReference implements
24
                FeatureReferenceProviderServices, Persistent {
25

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

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

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

    
70
        }
71

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

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

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

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

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

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

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

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

    
132

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

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

    
166
        public int hashCode() {
167
                if (this.oid != null) {
168
                        return this.oid.hashCode();
169
                }
170
                if (myHashCode == null) {
171
                        StringBuffer buff = new StringBuffer();
172

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

    
182
        public String[] getKeyNames() {
183
                return pkNames;
184
        }
185

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

    
196
        public String getFeatureTypeId() {
197
                return featureTypeId;
198
        }
199

    
200
        // *** Persistence ***
201

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

    
224
        public void saveToState(PersistentState state) throws PersistenceException {
225
                state.set("oid", oid);
226
                state.set("myHashCode", myHashCode);
227
                state.set("isNewFeature", isNewFeature);
228
                state.set("store", (Persistent) storeRef.get());
229
                state.set("featureTypeId", featureTypeId);
230
                if (pk == null) {
231
                        state.setNull("pk");
232
                        state.setNull("pkNames");
233
                } else {
234
                        state.set("pk", pk);
235
                        state.set("pkNames", pkNames);
236
                }
237

    
238
        }
239

    
240
        public static void registerPersistent() {
241
                DynStruct definition = ToolsLocator.getPersistenceManager().addDefinition(
242
                                DefaultFeatureReference.class, 
243
                                "Reference", 
244
                                "DefaultFeatureReference Persistent definition", 
245
                                null, 
246
                                null
247
                        );
248

    
249
                definition.addDynFieldObject("oid")
250
                        .setClassOfValue(Object.class)
251
                        .setMandatory(false)
252
                        .setPersistent(true);
253
                        
254
                definition.addDynFieldBoolean("isNewFeature")
255
                        .setMandatory(true)
256
                        .setPersistent(true);
257
        
258
                definition.addDynFieldObject("store")
259
                        .setClassOfValue(FeatureStore.class)
260
                        .setMandatory(true)
261
                        .setPersistent(true);
262

    
263
                definition.addDynFieldInt("myHashCode")
264
                        .setMandatory(false)
265
                        .setPersistent(true);
266
        
267
                definition.addDynFieldString("featureTypeId")
268
                        .setMandatory(true)
269
                        .setPersistent(true);
270

    
271
                definition.addDynFieldArray("pk")
272
                        .setClassOfItems(Object.class)
273
                        .setMandatory(false)
274
                        .setPersistent(true);
275

    
276
        definition.addDynFieldArray("pkNames")
277
                        .setClassOfItems(String.class)
278
                        .setMandatory(false)
279
                        .setPersistent(true);
280

    
281
        }
282

    
283
        public String toString() {
284
                return MessageFormat.format(
285
                                "FeatureReference: oid = {0}, myHashCode = {1}, "
286
                                + "pks = {2}, pkNames = {3}, "
287
                                + "isNewFeature = {4}, featureTypeId = {5}", new Object[] {
288
                                oid, myHashCode, (pk == null ? null : Arrays.asList(pk)),
289
                                (pkNames == null ? null : Arrays.asList(pkNames)),
290
                                new Boolean(isNewFeature),
291
                                featureTypeId });
292
        }
293

    
294
}