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 @ 45647

History | View | Annotate | Download (4.91 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
import org.apache.commons.lang3.ArrayUtils;
12
import org.gvsig.fmap.dal.exception.DataException;
13
import org.gvsig.fmap.dal.feature.Feature;
14
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
15
import org.gvsig.fmap.dal.feature.FeatureStore;
16
import org.gvsig.fmap.dal.feature.FeatureType;
17
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
18
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
19
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
20
import org.gvsig.tools.persistence.Persistent;
21
import org.gvsig.tools.persistence.PersistentState;
22
import org.gvsig.tools.persistence.exception.PersistenceException;
23
import org.json.JSONArray;
24
import org.json.JSONObject;
25
26
/**
27
 *
28
 * @author fdiaz
29
 */
30
public class FeatureReferencePK implements FeatureReferenceProviderServices, Persistent {
31
32
    private Object[] pk;
33
    private String[] pkNames;
34
    private WeakReference storeRef;
35
    private String featureTypeId;
36
37
    /*friend*/
38
    FeatureReferencePK(FeatureStore store, FeatureProvider data) {
39
            this.storeRef = new WeakReference(store);
40
        this.featureTypeId = store.getDefaultFeatureTypeQuietly().getId();
41
        this.calculatePK(data);
42
    }
43
44
    public void calculatePK(FeatureProvider fdata) {
45
        FeatureAttributeDescriptor[] pkattrs = fdata.getType().getPrimaryKey();
46
        if (ArrayUtils.isEmpty(pkattrs)) {
47
            this.pk = null;
48
            this.pkNames = null;
49
            return;
50
        }
51
        this.pk = new Object[pkattrs.length];
52
        this.pkNames = new String[pkattrs.length];
53
        int n = 0;
54
        for (FeatureAttributeDescriptor pkattr : pkattrs) {
55
            this.pk[n] = fdata.get(pkattr.getIndex());
56
            this.pkNames[n] = pkattr.getName();
57
            n++;
58
        }
59
    }
60
61
    @Override
62
    public Object getOID() {
63
        return null;
64
    }
65
66
    @Override
67
    public String[] getKeyNames() {
68
        return this.pkNames;
69
    }
70
71
    @Override
72
    public Object getKeyValue(String name) {
73
        for (int i = 0; i < pkNames.length; i++) {
74
            if (pkNames[i].equalsIgnoreCase(name)) {
75
                return pk[i];
76
            }
77
        }
78
        // FIXME exception????
79
        return null;
80
    }
81
82
    @Override
83
    public String getFeatureTypeId() {
84
        return featureTypeId;
85
    }
86
87
    @Override
88
    public Feature getFeature() throws DataException {
89
        return this.getStore().getFeatureByReference(this);
90
    }
91
92
    @Override
93
    public Feature getFeatureQuietly() {
94
        try {
95
            return this.getFeature();
96
        } catch (Exception e) {
97
            return null;
98
        }
99
    }
100
101
    @Override
102
    public Feature getFeature(FeatureType featureType) throws DataException {
103
        return this.getStore().getFeatureByReference(this, featureType);
104
    }
105
106
    private DefaultFeatureStore getStore() {
107
        return (DefaultFeatureStore) this.storeRef.get();
108
    }
109
110
    @Override
111
    public boolean isNewFeature() {
112
        return false;
113
    }
114
115
    @Override
116
    public String getCode() {
117
        Object[] data = new Object[7];
118
        if (this.pk == null) {
119
            data[0] = -1;
120
            data[1] = JSONObject.NULL;
121
            data[2] = JSONObject.NULL;
122
        } else {
123
            data[0] = pkNames.length;
124
            data[1] = new JSONArray(this.pkNames);
125
            data[2] = new JSONArray(this.pk);
126
        }
127
128
        String s = new JSONArray(data).toString();
129
        String r = Base64.getEncoder().encodeToString(s.getBytes());
130
        return r;
131
    }
132
133
    @Override
134
    public void saveToState(PersistentState state) throws PersistenceException {
135
        state.set("store", (Persistent) storeRef.get());
136
        state.set("featureTypeId", featureTypeId);
137
        if (pk == null) {
138
            state.setNull("pk");
139
            state.setNull("pkNames");
140
        } else {
141
            state.set("pk", pk);
142
            state.set("pkNames", pkNames);
143
        }
144
145
    }
146
147
    @Override
148
    public void loadFromState(PersistentState state)
149
            throws PersistenceException {
150
        this.storeRef = new WeakReference(state.get("store"));
151
        this.featureTypeId = state.getString("featureTypeId");
152
        List pkList = (List) state.get("pk");
153
        if (pkList != null) {
154
            List pkNamesList = (List) state.get("pkNames");
155
            if (pkNamesList == null || pkList.size() != pkNamesList.size()) {
156
                throw new PersistenceException("bad pkNames value");
157
            }
158
            this.pk = pkList.toArray();
159
            this.pkNames
160
                    = (String[]) pkNamesList.toArray(new String[pkList.size()]);
161
        } else {
162
            this.pk = null;
163
            this.pkNames = null;
164
        }
165
166
    }
167
168
}