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 / DefaultFeatureStoreTransforms.java @ 40435

History | View | Annotate | Download (10.3 KB)

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