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 |
} |