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 / DefaultFeatureStoreTransforms.java @ 40435
History | View | Annotate | Download (10.3 KB)
1 | 40435 | jjdelcerro | package org.gvsig.fmap.dal.feature.impl; |
---|---|---|---|
2 | |||
3 | import java.util.ArrayList; |
||
4 | import java.util.Collections; |
||
5 | import java.util.Iterator; |
||
6 | import java.util.List; |
||
7 | import java.util.ListIterator; |
||
8 | |||
9 | import org.gvsig.fmap.dal.exception.DataException; |
||
10 | import org.gvsig.fmap.dal.feature.EditableFeature; |
||
11 | import org.gvsig.fmap.dal.feature.EditableFeatureType; |
||
12 | import org.gvsig.fmap.dal.feature.Feature; |
||
13 | import org.gvsig.fmap.dal.feature.FeatureStore; |
||
14 | import org.gvsig.fmap.dal.feature.FeatureStoreNotification; |
||
15 | import org.gvsig.fmap.dal.feature.FeatureStoreTransform; |
||
16 | import org.gvsig.fmap.dal.feature.FeatureStoreTransforms; |
||
17 | import org.gvsig.fmap.dal.feature.FeatureType; |
||
18 | import org.gvsig.fmap.dal.feature.spi.FeatureProvider; |
||
19 | import org.gvsig.tools.ToolsLocator; |
||
20 | import org.gvsig.tools.dynobject.DynStruct; |
||
21 | import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException; |
||
22 | import org.gvsig.tools.persistence.Persistent; |
||
23 | import org.gvsig.tools.persistence.PersistentState; |
||
24 | import org.gvsig.tools.persistence.exception.PersistenceException; |
||
25 | |||
26 | public class DefaultFeatureStoreTransforms implements FeatureStoreTransforms, |
||
27 | Persistent { |
||
28 | |||
29 | private DefaultFeatureStore store;
|
||
30 | private List transforms; |
||
31 | private Boolean isTramsformValues; |
||
32 | private TransformTemporalList lastTransformStack;
|
||
33 | |||
34 | public DefaultFeatureStoreTransforms() {
|
||
35 | this.store = null; |
||
36 | this.transforms = new ArrayList(); |
||
37 | this.isTramsformValues = Boolean.FALSE; |
||
38 | } |
||
39 | |||
40 | public DefaultFeatureStoreTransforms(DefaultFeatureStore store) {
|
||
41 | this.store = store;
|
||
42 | this.transforms = new ArrayList(); |
||
43 | } |
||
44 | |||
45 | protected void checkEditingMode() { |
||
46 | if (store == null || store.getMode() != FeatureStore.MODE_QUERY) { |
||
47 | throw new IllegalStateException(); |
||
48 | } |
||
49 | } |
||
50 | |||
51 | protected void notifyChangeToStore() { |
||
52 | this.store.notifyChange(FeatureStoreNotification.TRANSFORM_CHANGE);
|
||
53 | } |
||
54 | |||
55 | public FeatureStoreTransform add(FeatureStoreTransform transform)
|
||
56 | throws DataException {
|
||
57 | checkEditingMode(); |
||
58 | if (transform.getDefaultFeatureType()!=null){ |
||
59 | if( ! transform.getFeatureTypes().contains(transform.getDefaultFeatureType())) {
|
||
60 | throw new IllegalArgumentException(); // FIXME: A�adir tipo especifico. |
||
61 | } |
||
62 | this.transforms.add(transform);
|
||
63 | transform.setSourceMetadata(this.store.metadata);
|
||
64 | this.notifyChangeToStore();
|
||
65 | if (this.isTramsformValues == null |
||
66 | || (!this.isTramsformValues.booleanValue())) {
|
||
67 | if (transform.isTransformsOriginalValues()) {
|
||
68 | this.isTramsformValues = Boolean.TRUE; |
||
69 | } |
||
70 | |||
71 | } |
||
72 | } |
||
73 | |||
74 | return transform;
|
||
75 | } |
||
76 | |||
77 | |||
78 | public void clear() { |
||
79 | checkEditingMode(); |
||
80 | this.transforms.clear();
|
||
81 | this.notifyChangeToStore();
|
||
82 | this.isTramsformValues = Boolean.FALSE; |
||
83 | } |
||
84 | |||
85 | public FeatureStoreTransform getTransform(int index) { |
||
86 | return (FeatureStoreTransform) this.transforms.get(index); |
||
87 | } |
||
88 | |||
89 | public Iterator iterator() { |
||
90 | return Collections.unmodifiableList(transforms).iterator(); |
||
91 | } |
||
92 | |||
93 | public Object remove(int index) { |
||
94 | checkEditingMode(); |
||
95 | Object trans = this.transforms.remove(index); |
||
96 | this.notifyChangeToStore();
|
||
97 | this.isTramsformValues = null; |
||
98 | return trans;
|
||
99 | } |
||
100 | |||
101 | public boolean remove(FeatureStoreTransform transform) { |
||
102 | checkEditingMode(); |
||
103 | boolean removed = this.transforms.remove(transform); |
||
104 | if (removed) {
|
||
105 | this.notifyChangeToStore();
|
||
106 | |||
107 | } |
||
108 | this.isTramsformValues = null; |
||
109 | return removed;
|
||
110 | |||
111 | } |
||
112 | |||
113 | public int size() { |
||
114 | return this.transforms.size(); |
||
115 | } |
||
116 | |||
117 | public boolean isEmpty() { |
||
118 | return this.transforms.isEmpty(); |
||
119 | } |
||
120 | |||
121 | private class TransformTemporalListElement { |
||
122 | public FeatureStoreTransform transform = null; |
||
123 | public FeatureType targetFeatureType = null; |
||
124 | } |
||
125 | |||
126 | private class TransformTemporalList extends ArrayList { |
||
127 | /**
|
||
128 | *
|
||
129 | */
|
||
130 | private static final long serialVersionUID = 1677014259279944000L; |
||
131 | private FeatureType targetFType;
|
||
132 | |||
133 | public boolean add(Object arg0) { |
||
134 | if (this.isEmpty()) { |
||
135 | targetFType = ((TransformTemporalListElement) arg0).targetFeatureType; |
||
136 | } |
||
137 | return super.add(arg0); |
||
138 | } |
||
139 | |||
140 | } |
||
141 | |||
142 | protected TransformTemporalList getTransformTemporalList(
|
||
143 | FeatureType targetFeatureType) { |
||
144 | if (this.lastTransformStack == null |
||
145 | || this.lastTransformStack.size() != this.transforms.size() |
||
146 | || !(this.lastTransformStack.targetFType
|
||
147 | .equals(targetFeatureType))) { |
||
148 | TransformTemporalList result = new TransformTemporalList();
|
||
149 | TransformTemporalListElement item; |
||
150 | FeatureType nextFType = targetFeatureType; |
||
151 | |||
152 | for (int i = transforms.size() - 1; i > -1; i--) { |
||
153 | item = new TransformTemporalListElement();
|
||
154 | item.transform = (FeatureStoreTransform) transforms.get(i); |
||
155 | item.targetFeatureType = nextFType; |
||
156 | nextFType = item.transform |
||
157 | .getSourceFeatureTypeFrom(item.targetFeatureType); |
||
158 | result.add(item); |
||
159 | } |
||
160 | this.lastTransformStack = result;
|
||
161 | } |
||
162 | return this.lastTransformStack; |
||
163 | } |
||
164 | |||
165 | public Feature applyTransform(DefaultFeature source,
|
||
166 | FeatureType targetFeatureType) |
||
167 | throws DataException {
|
||
168 | if (this.transforms.isEmpty()) { |
||
169 | return source;
|
||
170 | } |
||
171 | |||
172 | TransformTemporalList stack = this
|
||
173 | .getTransformTemporalList(targetFeatureType); |
||
174 | TransformTemporalListElement item; |
||
175 | FeatureProvider targetData; |
||
176 | EditableFeature target; |
||
177 | ListIterator iterator = stack.listIterator(stack.size());
|
||
178 | FeatureType tft = null;
|
||
179 | |||
180 | |||
181 | while (iterator.hasPrevious()) {
|
||
182 | item = (TransformTemporalListElement) iterator.previous(); |
||
183 | |||
184 | tft = item.targetFeatureType; |
||
185 | if (tft instanceof EditableFeatureType) { |
||
186 | /*
|
||
187 | * Must be non-editable to create
|
||
188 | * DefaultFeatureProvider
|
||
189 | */
|
||
190 | tft = ((EditableFeatureType) tft).getNotEditableCopy(); |
||
191 | } |
||
192 | |||
193 | targetData = this.store.createDefaultFeatureProvider(tft);
|
||
194 | targetData.setOID(source.getData().getOID()); |
||
195 | targetData.setNew(false);
|
||
196 | target = (new DefaultEditableFeature(this.store, targetData)) |
||
197 | .getEditable(); |
||
198 | item.transform.applyTransform(source, target); |
||
199 | source = (DefaultFeature) target.getNotEditableCopy(); |
||
200 | } |
||
201 | |||
202 | return source;
|
||
203 | |||
204 | } |
||
205 | |||
206 | public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
|
||
207 | FeatureType tmpFType = targetFeatureType; |
||
208 | |||
209 | for (int i = transforms.size() - 1; i > -1; i--) { |
||
210 | FeatureStoreTransform transform = (FeatureStoreTransform) transforms |
||
211 | .get(i); |
||
212 | tmpFType = transform.getSourceFeatureTypeFrom(tmpFType); |
||
213 | } |
||
214 | return tmpFType;
|
||
215 | } |
||
216 | |||
217 | public FeatureType getDefaultFeatureType() throws DataException { |
||
218 | if (this.transforms.isEmpty()) { |
||
219 | return null; |
||
220 | } |
||
221 | FeatureStoreTransform transform = (FeatureStoreTransform) this.transforms
|
||
222 | .get(this.transforms.size() - 1); |
||
223 | return transform.getDefaultFeatureType();
|
||
224 | } |
||
225 | |||
226 | public List getFeatureTypes() throws DataException { |
||
227 | if (this.transforms.isEmpty()) { |
||
228 | return null; |
||
229 | } |
||
230 | FeatureStoreTransform transform = (FeatureStoreTransform) this.transforms
|
||
231 | .get(this.transforms.size() - 1); |
||
232 | return transform.getFeatureTypes();
|
||
233 | } |
||
234 | |||
235 | public FeatureStore getFeatureStore() {
|
||
236 | return this.store; |
||
237 | } |
||
238 | |||
239 | public void setFeatureStore(FeatureStore featureStore) { |
||
240 | if (this.store != null) { |
||
241 | throw new IllegalStateException();// FIXME: A�adir tipo especifico. |
||
242 | } |
||
243 | this.store = (DefaultFeatureStore) featureStore;
|
||
244 | } |
||
245 | |||
246 | |||
247 | public void setStoreForClone(FeatureStore featureStore) { |
||
248 | this.store = (DefaultFeatureStore) featureStore;
|
||
249 | } |
||
250 | |||
251 | public boolean isTransformsOriginalValues() { |
||
252 | if (this.isTramsformValues == null) { |
||
253 | Iterator iter = this.transforms.iterator(); |
||
254 | FeatureStoreTransform transform; |
||
255 | this.isTramsformValues = Boolean.FALSE; |
||
256 | while (iter.hasNext()) {
|
||
257 | transform = (FeatureStoreTransform) iter.next(); |
||
258 | if (transform.isTransformsOriginalValues()){
|
||
259 | this.isTramsformValues = Boolean.TRUE; |
||
260 | break;
|
||
261 | } |
||
262 | } |
||
263 | } |
||
264 | return this.isTramsformValues.booleanValue(); |
||
265 | } |
||
266 | |||
267 | public FeatureType getFeatureType(String featureTypeId) |
||
268 | throws DataException {
|
||
269 | if (this.transforms.isEmpty()) { |
||
270 | return null; |
||
271 | } |
||
272 | if (featureTypeId == null) { |
||
273 | return this.getDefaultFeatureType(); |
||
274 | } |
||
275 | Iterator iter = this.getFeatureTypes().iterator(); |
||
276 | FeatureType fType; |
||
277 | while (iter.hasNext()) {
|
||
278 | fType = (FeatureType) iter.next(); |
||
279 | if (fType.getId().equals(featureTypeId)) {
|
||
280 | return fType;
|
||
281 | } |
||
282 | } |
||
283 | return null; |
||
284 | } |
||
285 | |||
286 | |||
287 | |||
288 | // *** Persistence ***
|
||
289 | |||
290 | public void saveToState(PersistentState state) throws PersistenceException { |
||
291 | state.set("store", store);
|
||
292 | state.set("isTramsformValues", this.isTramsformValues); |
||
293 | state.set("transforms", this.transforms); |
||
294 | } |
||
295 | |||
296 | public void loadFromState(PersistentState state) |
||
297 | throws PersistenceException {
|
||
298 | this.isTramsformValues = (Boolean) state.get("isTramsformValues"); |
||
299 | this.transforms = (List) state.get("transforms"); |
||
300 | this.store = (DefaultFeatureStore) state.get("store"); |
||
301 | } |
||
302 | |||
303 | public static void registerPersistent() { |
||
304 | DynStruct definition = ToolsLocator.getPersistenceManager().addDefinition( |
||
305 | DefaultFeatureStoreTransforms.class, |
||
306 | "DefaultFeatureStoreTransforms",
|
||
307 | "DefaultFeatureStoreTransforms Persistent definition",
|
||
308 | null,
|
||
309 | null
|
||
310 | ); |
||
311 | |||
312 | definition.addDynFieldBoolean("isTramsformValues").setMandatory(false); |
||
313 | definition.addDynFieldList("transforms").setClassOfItems(FeatureStoreTransform.class).setMandatory(true); |
||
314 | definition.addDynFieldObject("store").setClassOfValue(FeatureStore.class).setMandatory(true); |
||
315 | |||
316 | } |
||
317 | |||
318 | public Object getDynValue(String name) throws DynFieldNotFoundException { |
||
319 | if( ! this.transforms.isEmpty() ) { |
||
320 | FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size()-1); |
||
321 | if( transform.hasDynValue(name) ) {
|
||
322 | return transform.getDynValue(name);
|
||
323 | } |
||
324 | } |
||
325 | throw new DynFieldNotFoundException(name, "transforms"); |
||
326 | } |
||
327 | |||
328 | public void setDynValue(String name, Object value) throws DynFieldNotFoundException { |
||
329 | if( ! this.transforms.isEmpty() ) { |
||
330 | FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size()-1); |
||
331 | transform.setDynValue(name, value); |
||
332 | } |
||
333 | } |
||
334 | |||
335 | public boolean hasDynValue(String name) { |
||
336 | if( ! this.transforms.isEmpty() ) { |
||
337 | FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size()-1); |
||
338 | if( transform.hasDynValue(name) ) {
|
||
339 | return true; |
||
340 | } |
||
341 | } |
||
342 | return false; |
||
343 | } |
||
344 | |||
345 | public Object clone() throws CloneNotSupportedException { |
||
346 | |||
347 | DefaultFeatureStoreTransforms cloned = (DefaultFeatureStoreTransforms) super.clone();
|
||
348 | cloned.transforms = new ArrayList(); |
||
349 | int n = this.transforms.size(); |
||
350 | for (int i=0; i<n; i++) { |
||
351 | cloned.transforms.add(((FeatureStoreTransform) this.transforms.get(i)).clone());
|
||
352 | } |
||
353 | cloned.lastTransformStack = null;
|
||
354 | |||
355 | return cloned;
|
||
356 | } |
||
357 | |||
358 | } |