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 / featurereference / FeatureReferencePK.java @ 46977

History | View | Annotate | Download (7.98 KB)

1 45647 fdiaz
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.fmap.dal.feature.impl.featurereference;
7
8
import java.lang.ref.WeakReference;
9
import java.util.Base64;
10
import java.util.List;
11 45688 fdiaz
import java.util.Objects;
12
import javax.json.JsonObject;
13 45647 fdiaz
import org.apache.commons.lang3.ArrayUtils;
14
import org.gvsig.fmap.dal.exception.DataException;
15
import org.gvsig.fmap.dal.feature.Feature;
16
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.FeatureStore;
18
import org.gvsig.fmap.dal.feature.FeatureType;
19
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
20
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
21
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
22 45688 fdiaz
import org.gvsig.json.Json;
23 46956 fdiaz
import org.gvsig.json.JsonArrayBuilder;
24 45688 fdiaz
import org.gvsig.json.JsonObjectBuilder;
25 45647 fdiaz
import org.gvsig.tools.persistence.Persistent;
26
import org.gvsig.tools.persistence.PersistentState;
27
import org.gvsig.tools.persistence.exception.PersistenceException;
28
29
/**
30
 *
31
 * @author fdiaz
32
 */
33
public class FeatureReferencePK implements FeatureReferenceProviderServices, Persistent {
34
35 45688 fdiaz
    public static final String PK_TYPE = "pk";
36
37 45647 fdiaz
    private Object[] pk;
38
    private String[] pkNames;
39
    private WeakReference storeRef;
40
    private String featureTypeId;
41 45688 fdiaz
    private Integer myHashCode;
42 45647 fdiaz
43
    /*friend*/
44
    FeatureReferencePK(FeatureStore store, FeatureProvider data) {
45
            this.storeRef = new WeakReference(store);
46
        this.featureTypeId = store.getDefaultFeatureTypeQuietly().getId();
47 45688 fdiaz
        this.doCalculatePK(data);
48 45647 fdiaz
    }
49
50 45688 fdiaz
    FeatureReferencePK(FeatureStore store, JsonObject code) {
51 46977 fdiaz
        try {
52
            this.storeRef = new WeakReference(store);
53
            this.featureTypeId = store.getDefaultFeatureTypeQuietly().getId();
54
            this.pk = Json.toArray(code, "values", new Object[code.getJsonArray("values").size()]);
55
            this.pkNames = (String[]) Json.toArray(code, "names", new String[code.getJsonArray("names").size()]);
56
        } catch (Exception ex) {
57
            throw ex;
58
        }
59 45688 fdiaz
    }
60
61
    public FeatureReferencePK() {
62
        //For persistence use only
63
    }
64
65 45647 fdiaz
    public void calculatePK(FeatureProvider fdata) {
66 45688 fdiaz
        doCalculatePK(fdata);
67
    }
68
69
    private void doCalculatePK(FeatureProvider fdata) {
70 45647 fdiaz
        FeatureAttributeDescriptor[] pkattrs = fdata.getType().getPrimaryKey();
71
        if (ArrayUtils.isEmpty(pkattrs)) {
72 45688 fdiaz
            throw new IllegalArgumentException("Feature don't has primary key");
73 45647 fdiaz
        }
74
        this.pk = new Object[pkattrs.length];
75
        this.pkNames = new String[pkattrs.length];
76
        int n = 0;
77
        for (FeatureAttributeDescriptor pkattr : pkattrs) {
78
            this.pk[n] = fdata.get(pkattr.getIndex());
79
            this.pkNames[n] = pkattr.getName();
80
            n++;
81
        }
82
    }
83
84
    @Override
85
    public Object getOID() {
86
        return null;
87
    }
88
89
    @Override
90
    public String[] getKeyNames() {
91
        return this.pkNames;
92
    }
93
94
    @Override
95
    public Object getKeyValue(String name) {
96
        for (int i = 0; i < pkNames.length; i++) {
97
            if (pkNames[i].equalsIgnoreCase(name)) {
98
                return pk[i];
99
            }
100
        }
101
        // FIXME exception????
102
        return null;
103
    }
104
105
    @Override
106
    public String getFeatureTypeId() {
107
        return featureTypeId;
108
    }
109
110
    @Override
111
    public Feature getFeature() throws DataException {
112
        return this.getStore().getFeatureByReference(this);
113
    }
114
115
    @Override
116
    public Feature getFeatureQuietly() {
117
        try {
118
            return this.getFeature();
119
        } catch (Exception e) {
120
            return null;
121
        }
122
    }
123
124
    @Override
125
    public Feature getFeature(FeatureType featureType) throws DataException {
126
        return this.getStore().getFeatureByReference(this, featureType);
127
    }
128
129
    private DefaultFeatureStore getStore() {
130
        return (DefaultFeatureStore) this.storeRef.get();
131
    }
132
133
    @Override
134
    public boolean isNewFeature() {
135
        return false;
136
    }
137
138
    @Override
139
    public String getCode() {
140 46956 fdiaz
        String s = toJsonBuilder().toString();
141 45647 fdiaz
        String r = Base64.getEncoder().encodeToString(s.getBytes());
142
        return r;
143
    }
144
145
    @Override
146
    public void saveToState(PersistentState state) throws PersistenceException {
147 45688 fdiaz
        state.set("type", PK_TYPE);
148 45647 fdiaz
        state.set("store", (Persistent) storeRef.get());
149
        state.set("featureTypeId", featureTypeId);
150
        if (pk == null) {
151
            state.setNull("pk");
152
            state.setNull("pkNames");
153
        } else {
154
            state.set("pk", pk);
155
            state.set("pkNames", pkNames);
156
        }
157 45738 fdiaz
        state.set("isNewFeature", isNewFeature());
158 45647 fdiaz
    }
159
160
    @Override
161
    public void loadFromState(PersistentState state)
162
            throws PersistenceException {
163
        this.storeRef = new WeakReference(state.get("store"));
164
        this.featureTypeId = state.getString("featureTypeId");
165
        List pkList = (List) state.get("pk");
166
        if (pkList != null) {
167
            List pkNamesList = (List) state.get("pkNames");
168
            if (pkNamesList == null || pkList.size() != pkNamesList.size()) {
169
                throw new PersistenceException("bad pkNames value");
170
            }
171
            this.pk = pkList.toArray();
172
            this.pkNames
173
                    = (String[]) pkNamesList.toArray(new String[pkList.size()]);
174
        } else {
175
            this.pk = null;
176
            this.pkNames = null;
177
        }
178
179
    }
180
181 45688 fdiaz
        @Override
182
    public boolean equals(Object obj) {
183
        if (!(obj instanceof FeatureReferencePK)) {
184
            return false;
185
        }
186
        FeatureReferencePK other = (FeatureReferencePK) obj;
187
188
        FeatureStore otherStore = (FeatureStore) other.storeRef.get();
189
        FeatureStore myrStore = (FeatureStore) this.storeRef.get();
190
        if (otherStore == null || myrStore == null) {
191
            return false;
192
        }
193
        if (!myrStore.equals(otherStore)) {
194
            return false;
195
        }
196
197
        if (myHashCode != null && other.myHashCode != null && !myHashCode.equals(other.myHashCode)) {
198
            return false;
199
        }
200
201
        if (this.pk == other.pk) {
202
            return true;
203
        }
204
        if (this.pk == null || other.pk == null) {
205
            return false;
206
        }
207
208
        for (int i = 0; i < this.pk.length; i++) {
209
            if (!this.pk[i].equals(other.pk[i])) {
210
                return false;
211
            }
212
        }
213
        return true;
214
215
    }
216
217
    @Override
218
    public int hashCode() {
219
        if (myHashCode == null) {
220
            StringBuilder buff = new StringBuilder();
221
222
            for (int i = 0; i < this.pk.length; i++) {
223
                buff.append(Objects.hashCode(this.pk[i]));
224
                buff.append("##");
225
            }
226
            myHashCode = buff.toString().hashCode();
227
        }
228
        return myHashCode;
229
    }
230
231 46956 fdiaz
    @Override
232
    public JsonObjectBuilder toJsonBuilder() {
233
        JsonObjectBuilder builder = Json.createObjectBuilder();
234
        builder.add("type", PK_TYPE);
235
        if (this.pk == null) {
236
            builder.addNull("names");
237
            builder.addNull("values");
238
        } else {
239
            JsonArrayBuilder arrayNames = Json.createArrayBuilder();
240
            JsonArrayBuilder arrayValues = Json.createArrayBuilder();
241
            for (int i = 0; i < pk.length; i++) {
242
                arrayNames.add(pkNames[i]);
243
                arrayValues.add(pk[i]);
244
            }
245
            builder.add("names", arrayNames);
246
            builder.add("values", arrayValues);
247
        }
248
        return builder;
249
    }
250 46963 jjdelcerro
251
    @Override
252
    public String toString() {
253
        if( this.pk == null ) {
254
            return "NULL";
255
        }
256
        boolean needsep = false;
257
        StringBuilder builder = new StringBuilder();
258
        for (Object v : pk) {
259
            if( needsep ) {
260
                builder.append("/");
261
            }
262
            builder.append(Objects.toString(v));
263
            needsep = true;
264
        }
265
        return builder.toString();
266
    }
267
268 45647 fdiaz
}