root / branches / v2_0_0_prep / libraries / libFMap_data / src / org / gvsig / fmap / data / feature / impl / DefaultFeatureReference.java @ 24248
History | View | Annotate | Download (3.78 KB)
1 |
package org.gvsig.fmap.data.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.data.exceptions.DataException; |
8 |
import org.gvsig.fmap.data.feature.Feature; |
9 |
import org.gvsig.fmap.data.feature.FeatureAttributeDescriptor; |
10 |
import org.gvsig.fmap.data.feature.FeatureStore; |
11 |
import org.gvsig.fmap.data.feature.FeatureType; |
12 |
import org.gvsig.fmap.data.feature.spi.FeatureData; |
13 |
import org.gvsig.fmap.data.feature.spi.FeatureReferenceProviderServices; |
14 |
import org.gvsig.tools.persistence.AbstractPersistenceManager; |
15 |
import org.gvsig.tools.persistence.PersistenceException; |
16 |
import org.gvsig.tools.persistence.Persistent; |
17 |
import org.gvsig.tools.persistence.PersistentState; |
18 |
|
19 |
public class DefaultFeatureReference implements |
20 |
FeatureReferenceProviderServices, Persistent { |
21 |
|
22 |
private Object oid; |
23 |
private Object[] pk; |
24 |
private WeakReference storeRef; |
25 |
private boolean isNewFeature; |
26 |
|
27 |
public DefaultFeatureReference(DefaultFeature feature) {
|
28 |
this(feature, false); |
29 |
} |
30 |
public DefaultFeatureReference(DefaultFeature feature, boolean isNewFeature) { |
31 |
this(feature.getStore(), feature.getData(),
|
32 |
isNewFeature); |
33 |
} |
34 |
|
35 |
public DefaultFeatureReference(FeatureStore store,
|
36 |
FeatureData fdata, boolean isNewFeature) {
|
37 |
this.isNewFeature = isNewFeature;
|
38 |
this.oid = null; |
39 |
this.pk = null; |
40 |
this.storeRef = new WeakReference(store); |
41 |
if (isNewFeature) {
|
42 |
this.oid = getStore().getProvider().createNewOID();
|
43 |
} else {
|
44 |
if (fdata.getType().hasOID()) {
|
45 |
if (this.oid == null) { |
46 |
// FIXME: petar
|
47 |
} |
48 |
this.oid = fdata.getOID();
|
49 |
} else {
|
50 |
this.pk = this.calculatePK(fdata); |
51 |
if (this.pk == null) { |
52 |
// FIXME: pete
|
53 |
} |
54 |
} |
55 |
} |
56 |
} |
57 |
|
58 |
public DefaultFeatureReference(FeatureStore store) {
|
59 |
this.isNewFeature = false; |
60 |
this.oid = null; |
61 |
this.pk = null; |
62 |
this.storeRef = new WeakReference(store); |
63 |
} |
64 |
|
65 |
public DefaultFeatureReference(FeatureStore store, Object oid) { |
66 |
this.isNewFeature = false; |
67 |
this.oid = oid;
|
68 |
this.pk = null; |
69 |
this.storeRef = new WeakReference(store); |
70 |
} |
71 |
|
72 |
public DefaultFeatureReference(FeatureStore store, Object[] pk) { |
73 |
this.isNewFeature = false; |
74 |
this.oid = null; |
75 |
this.pk = pk;
|
76 |
this.storeRef = new WeakReference(store); |
77 |
} |
78 |
|
79 |
|
80 |
private DefaultFeatureStore getStore() {
|
81 |
return (DefaultFeatureStore) this.storeRef.get(); |
82 |
} |
83 |
|
84 |
private Object[] calculatePK(FeatureData fdata) { |
85 |
ArrayList key = new ArrayList(); |
86 |
FeatureType type = fdata.getType(); |
87 |
Iterator it = type.iterator();
|
88 |
while (it.hasNext()) {
|
89 |
FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) it |
90 |
.next(); |
91 |
if (attr.isPrimaryKey()) {
|
92 |
key.add(fdata.get(attr.getIndex())); |
93 |
} |
94 |
} |
95 |
if (key.size() < 1) { |
96 |
return null; |
97 |
} |
98 |
return key.toArray();
|
99 |
} |
100 |
|
101 |
public Feature getFeature() throws DataException { |
102 |
return this.getStore().getFeatureByReference(this); |
103 |
} |
104 |
|
105 |
public Feature getFeature(FeatureType featureType) throws DataException { |
106 |
return this.getStore().getFeatureByReference(this, featureType); |
107 |
} |
108 |
|
109 |
public Object[] getKey() { |
110 |
return this.pk; |
111 |
} |
112 |
|
113 |
public Object getOID() { |
114 |
return this.oid; |
115 |
} |
116 |
|
117 |
public boolean isNewFeature() { |
118 |
return this.isNewFeature; |
119 |
} |
120 |
public PersistentState getState() throws PersistenceException { |
121 |
return AbstractPersistenceManager.getState(this); |
122 |
} |
123 |
|
124 |
public void loadState(PersistentState state) throws PersistenceException { |
125 |
state.set("oid", oid);
|
126 |
state.set("isNewFeature", isNewFeature);
|
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 |
public void setState(PersistentState state) throws PersistenceException { |
135 |
this.oid = state.get("oid"); |
136 |
this.isNewFeature = state.getBoolean("isNewFeature"); |
137 |
this.pk = new Object[state.getInt("pk.elements")]; |
138 |
for (int i = 0; i < pk.length; i++) { |
139 |
this.pk[i] = state.get("pk.item" + i); |
140 |
} |
141 |
} |
142 |
} |