Statistics
| Revision:

root / branches / dal_time_support / libraries / libFMap_dal / src / org / gvsig / fmap / dal / feature / impl / DefaultFeatureStoreTransforms.java @ 36417

History | View | Annotate | Download (8.33 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.Feature;
12
import org.gvsig.fmap.dal.feature.FeatureStore;
13
import org.gvsig.fmap.dal.feature.FeatureStoreNotification;
14
import org.gvsig.fmap.dal.feature.FeatureStoreTransform;
15
import org.gvsig.fmap.dal.feature.FeatureStoreTransforms;
16
import org.gvsig.fmap.dal.feature.FeatureType;
17
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
18
import org.gvsig.tools.ToolsLocator;
19
import org.gvsig.tools.dynobject.DynStruct;
20
import org.gvsig.tools.persistence.Persistent;
21
import org.gvsig.tools.persistence.PersistentState;
22
import org.gvsig.tools.persistence.exception.PersistenceException;
23

    
24
public class DefaultFeatureStoreTransforms implements FeatureStoreTransforms,
25
                Persistent {
26

    
27
        private DefaultFeatureStore store;
28
        private List transforms;
29
        private Boolean isTramsformValues;
30
        private TransformTemporalList lastTransformStack;
31

    
32
        public DefaultFeatureStoreTransforms() {
33
                this.store = null;
34
                this.transforms = new ArrayList();
35
                this.isTramsformValues = Boolean.FALSE;
36
        }
37

    
38
        public DefaultFeatureStoreTransforms(DefaultFeatureStore store) {
39
                this.store = store;
40
                this.transforms = new ArrayList();
41
        }
42

    
43
        protected void checkEditingMode() {
44
                if (store == null || store.getMode() != FeatureStore.MODE_QUERY) {
45
                        throw new IllegalStateException();
46
                }
47
        }
48

    
49
        protected void notifyChangeToStore() {
50
                this.store.notifyChange(FeatureStoreNotification.TRANSFORM_CHANGE);
51
        }
52

    
53
        public FeatureStoreTransform add(FeatureStoreTransform transform)
54
                        throws DataException {
55
                checkEditingMode();
56
                if (transform.getDefaultFeatureType()!=null){
57
                        if( ! transform.getFeatureTypes().contains(transform.getDefaultFeatureType())) {
58
                                throw new IllegalArgumentException(); // FIXME: A?adir tipo especifico.
59
                        }
60
                        this.transforms.add(transform);
61
                        this.notifyChangeToStore();
62
                        if (this.isTramsformValues == null
63
                                        || (!this.isTramsformValues.booleanValue())) {
64
                                if (transform.isTransformsOriginalValues()) {
65
                                        this.isTramsformValues = Boolean.TRUE;
66
                                }
67

    
68
                        }
69
                }
70

    
71
                return transform;
72
        }
73

    
74

    
75
        public void clear() {
76
                checkEditingMode();
77
                this.transforms.clear();
78
                this.notifyChangeToStore();
79
                this.isTramsformValues = Boolean.FALSE;
80
        }
81

    
82
        public FeatureStoreTransform getTransform(int index) {
83
                return (FeatureStoreTransform) this.transforms.get(index);
84
        }
85

    
86
        public Iterator iterator() {
87
                return Collections.unmodifiableList(transforms).iterator();
88
        }
89

    
90
        public Object remove(int index) {
91
                checkEditingMode();
92
                Object trans = this.transforms.remove(index);
93
                this.notifyChangeToStore();
94
                this.isTramsformValues = null;
95
                return trans;
96
        }
97

    
98
        public boolean remove(FeatureStoreTransform transform) {
99
                checkEditingMode();
100
                boolean removed = this.transforms.remove(transform);
101
                if (removed) {
102
                        this.notifyChangeToStore();
103

    
104
                }
105
                this.isTramsformValues = null;
106
                return removed;
107

    
108
        }
109

    
110
        public int size() {
111
                return this.transforms.size();
112
        }
113

    
114
        public boolean isEmpty() {
115
                return this.transforms.isEmpty();
116
        }
117

    
118
        private class TransformTemporalListElement {
119
                public FeatureStoreTransform transform = null;
120
                public FeatureType targetFeatureType = null;
121
        }
122

    
123
        private class TransformTemporalList extends ArrayList {
124
                private FeatureType targetFType;
125

    
126
                public boolean add(Object arg0) {
127
                        if (this.isEmpty()) {
128
                                targetFType = ((TransformTemporalListElement) arg0).targetFeatureType;
129
                        }
130
                        return super.add(arg0);
131
                }
132

    
133
        }
134

    
135
        protected TransformTemporalList getTransformTemporalList(
136
                        FeatureType targetFeatureType) {
137
                if (this.lastTransformStack == null
138
                                || this.lastTransformStack.size() != this.transforms.size()
139
                                || !(this.lastTransformStack.targetFType
140
                                                .equals(targetFeatureType))) {
141
                        TransformTemporalList result = new TransformTemporalList();
142
                        TransformTemporalListElement item;
143
                        FeatureType nextFType = targetFeatureType;
144

    
145
                        for (int i = transforms.size() - 1; i > -1; i--) {
146
                                item = new TransformTemporalListElement();
147
                                item.transform = (FeatureStoreTransform) transforms.get(i);
148
                                item.targetFeatureType = nextFType;
149
                                nextFType = item.transform
150
                                                .getSourceFeatureTypeFrom(item.targetFeatureType);
151
                                result.add(item);
152
                        }
153
                        this.lastTransformStack = result;
154
                }
155
                return this.lastTransformStack;
156
        }
157

    
158
        public Feature applyTransform(DefaultFeature source,
159
                        FeatureType targetFeatureType)
160
                        throws DataException {
161
                if (this.transforms.isEmpty()) {
162
                        return source;
163
                }
164

    
165
                TransformTemporalList stack = this
166
                                .getTransformTemporalList(targetFeatureType);
167
                TransformTemporalListElement item;
168
                FeatureProvider targetData;
169
                EditableFeature target;
170
                ListIterator iterator = stack.listIterator(stack.size());
171

    
172

    
173
                while (iterator.hasPrevious()) {
174
                        item = (TransformTemporalListElement) iterator.previous();
175
                        targetData = this.store
176
                                        .createDefaultFeatureProvider(item.targetFeatureType);
177
                        targetData.setOID(source.getData().getOID());
178
                        targetData.setNew(false);
179
                        target = (new DefaultEditableFeature(this.store, targetData))
180
                                        .getEditable();
181
                        item.transform.applyTransform(source, target);
182
                         source = (DefaultFeature) target.getNotEditableCopy();
183
                }
184

    
185
                return source;
186

    
187
        }
188

    
189
        public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
190
                FeatureType tmpFType = targetFeatureType;
191

    
192
                for (int i = transforms.size() - 1; i > -1; i--) {
193
                        FeatureStoreTransform transform = (FeatureStoreTransform) transforms
194
                                        .get(i);
195
                        tmpFType = transform.getSourceFeatureTypeFrom(tmpFType);
196
                }
197
                return tmpFType;
198
        }
199

    
200
        public FeatureType getDefaultFeatureType() throws DataException {
201
                if (this.transforms.isEmpty()) {
202
                        return null;
203
                }
204
                FeatureStoreTransform transform = (FeatureStoreTransform) this.transforms
205
                                .get(this.transforms.size() - 1);
206
                return transform.getDefaultFeatureType();
207
        }
208

    
209
        public List getFeatureTypes() throws DataException {
210
                if (this.transforms.isEmpty()) {
211
                        return null;
212
                }
213
                FeatureStoreTransform transform = (FeatureStoreTransform) this.transforms
214
                                .get(this.transforms.size() - 1);
215
                return transform.getFeatureTypes();
216
        }
217

    
218
        public FeatureStore getFeatureStore() {
219
                return this.store;
220
        }
221

    
222
        public void setFeatureStore(FeatureStore featureStore) {
223
                if (this.store != null) {
224
                        throw new IllegalStateException();// FIXME: A?adir tipo especifico.
225
                }
226
                this.store = (DefaultFeatureStore) featureStore;
227
        }
228

    
229
        public boolean isTransformsOriginalValues() {
230
                if (this.isTramsformValues == null) {
231
                        Iterator iter = this.transforms.iterator();
232
                        FeatureStoreTransform transform;
233
                        this.isTramsformValues = Boolean.FALSE;
234
                        while (iter.hasNext()) {
235
                                transform = (FeatureStoreTransform) iter.next();
236
                                if (transform.isTransformsOriginalValues()){
237
                                        this.isTramsformValues = Boolean.TRUE;
238
                                        break;
239
                                }
240
                        }
241
                }
242
                return this.isTramsformValues.booleanValue();
243
        }
244

    
245
        public FeatureType getFeatureType(String featureTypeId)
246
                        throws DataException {
247
                if (this.transforms.isEmpty()) {
248
                        return null;
249
                }
250
                if (featureTypeId == null) {
251
                        return this.getDefaultFeatureType();
252
                }
253
                Iterator iter = this.getFeatureTypes().iterator();
254
                FeatureType fType;
255
                while (iter.hasNext()) {
256
                        fType = (FeatureType) iter.next();
257
                        if (fType.getId().equals(featureTypeId)) {
258
                                return fType;
259
                        }
260
                }
261
                return null;
262
        }
263

    
264

    
265

    
266
        // *** Persistence ***
267

    
268
        public void saveToState(PersistentState state) throws PersistenceException {
269
                state.set("store", store);
270
                state.set("isTramsformValues", this.isTramsformValues);
271
                state.set("transforms", this.transforms);
272
        }
273

    
274
        public void loadFromState(PersistentState state)
275
                        throws PersistenceException {
276
                this.isTramsformValues = (Boolean) state.get("isTramsformValues");
277
                this.transforms = (List) state.get("transforms");
278
                this.store = (DefaultFeatureStore) state.get("store");
279
        }
280

    
281
        public static void registerPersistent() {
282
                DynStruct definition = ToolsLocator.getPersistenceManager().addDefinition(
283
                                DefaultFeatureStoreTransforms.class, 
284
                                "DefaultFeatureStoreTransforms", 
285
                                "DefaultFeatureStoreTransforms Persistent definition",
286
                                null, 
287
                                null
288
                        );
289

    
290
                definition.addDynFieldBoolean("isTramsformValues").setMandatory(false);
291
                definition.addDynFieldList("transforms").setClassOfItems(FeatureStoreTransform.class).setMandatory(true);
292
                definition.addDynFieldObject("store").setClassOfValue(FeatureStore.class).setMandatory(true);
293

    
294
        }
295

    
296
}