Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_dal / src / org / gvsig / fmap / dal / feature / impl / DefaultFeatureStoreTransforms.java @ 30208

History | View | Annotate | Download (8.4 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.DataTypes;
10
import org.gvsig.fmap.dal.exception.DataException;
11
import org.gvsig.fmap.dal.feature.EditableFeature;
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.DynClass;
21
import org.gvsig.tools.dynobject.DynObjectManager;
22
import org.gvsig.tools.persistence.PersistenceException;
23
import org.gvsig.tools.persistence.Persistent;
24
import org.gvsig.tools.persistence.PersistentState;
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.getFeatureTypes().contains(transform.getDefaultFeatureType())) {
59
                        throw new IllegalArgumentException(); // FIXME: A?adir tipo especifico.
60
                }
61
                this.transforms.add(transform);
62
                this.notifyChangeToStore();
63
                if (this.isTramsformValues == null
64
                                || (!this.isTramsformValues.booleanValue())) {
65
                        if (transform.isTransformsOriginalValues()) {
66
                                this.isTramsformValues = Boolean.TRUE;
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
                DynObjectManager dynMan = ToolsLocator.getDynObjectManager();
283
                DynClass dynClass = dynMan.createDynClass(
284
                                "DefaultFeatureStoreTransforms_Persistent",
285
                                "DefaultFeatureStoreTransforms Persistent definition");
286

    
287
                dynClass.addDynFieldSingle("isTramsformValues", DataTypes.BOOLEAN,
288
                                null, true, true);
289
                dynClass.addDynFieldSingle("transforms", DataTypes.LIST, null,
290
                                true, true);
291
                dynClass.addDynFieldSingle("store", DataTypes.PERSISTENT, null, true,
292
                                true);
293

    
294
                ToolsLocator.getPersistenceManager().registerClass(
295
                                DefaultFeatureQuery.class, dynClass);
296
        }
297

    
298
}