Statistics
| Revision:

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

History | View | Annotate | Download (7.53 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.FeatureData;
18
import org.gvsig.tools.persistence.PersistenceException;
19
import org.gvsig.tools.persistence.Persistent;
20
import org.gvsig.tools.persistence.PersistentState;
21

    
22
public class DefaultFeatureStoreTransforms implements FeatureStoreTransforms,
23
                Persistent {
24

    
25
        private DefaultFeatureStore store;
26
        private List transforms;
27
        private Boolean isTramsformValues;
28
        private TransformTemporalList lastTransformStack;
29

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

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

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

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

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

    
65
                }
66

    
67
                return transform;
68
        }
69

    
70

    
71
        public void clear() {
72
                checkEditingMode();
73
                this.transforms.clear();
74
                this.notifyChangeToStore();
75
                this.isTramsformValues = Boolean.FALSE;
76
        }
77

    
78
        public FeatureStoreTransform getTransform(int index) {
79
                return (FeatureStoreTransform) this.transforms.get(index);
80
        }
81

    
82
        public Iterator iterator() {
83
                return Collections.unmodifiableList(transforms).iterator();
84
        }
85

    
86
        public Object remove(int index) {
87
                checkEditingMode();
88
                Object trans = this.transforms.remove(index);
89
                this.notifyChangeToStore();
90
                this.isTramsformValues = null;
91
                return trans;
92
        }
93

    
94
        public boolean remove(FeatureStoreTransform transform) {
95
                checkEditingMode();
96
                boolean removed = this.transforms.remove(transform);
97
                if (removed) {
98
                        this.notifyChangeToStore();
99

    
100
                }
101
                this.isTramsformValues = null;
102
                return removed;
103

    
104
        }
105

    
106
        public int size() {
107
                return this.transforms.size();
108
        }
109

    
110
        public boolean isEmpty() {
111
                return this.transforms.isEmpty();
112
        }
113

    
114
        private class TransformTemporalListElement {
115
                public FeatureStoreTransform transform = null;
116
                public FeatureType targetFeatureType = null;
117
        }
118

    
119
        private class TransformTemporalList extends ArrayList {
120
                private FeatureType targetFType;
121

    
122
                public boolean add(Object arg0) {
123
                        if (this.isEmpty()) {
124
                                targetFType = ((TransformTemporalListElement) arg0).targetFeatureType;
125
                        }
126
                        return super.add(arg0);
127
                }
128

    
129
        }
130

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

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

    
154
        public Feature applyTransform(DefaultFeature source,
155
                        FeatureType targetFeatureType)
156
                        throws DataException {
157
                if (this.transforms.isEmpty()) {
158
                        return source;
159
                }
160

    
161
                TransformTemporalList stack = this
162
                                .getTransformTemporalList(targetFeatureType);
163
                TransformTemporalListElement item;
164
                FeatureData targetData;
165
                EditableFeature target;
166
                ListIterator iterator = stack.listIterator(stack.size());
167

    
168

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

    
181
                return source;
182

    
183
        }
184

    
185
        public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
186
                FeatureType tmpFType = targetFeatureType;
187

    
188
                for (int i = transforms.size() - 1; i > -1; i--) {
189
                        FeatureStoreTransform transform = (FeatureStoreTransform) transforms
190
                                        .get(i);
191
                        tmpFType = transform.getSourceFeatureTypeFrom(tmpFType);
192
                }
193
                return tmpFType;
194
        }
195

    
196
        public FeatureType getDefaultFeatureType() throws DataException {
197
                if (this.transforms.isEmpty()) {
198
                        return null;
199
                }
200
                FeatureStoreTransform transform = (FeatureStoreTransform) this.transforms
201
                                .get(this.transforms.size() - 1);
202
                return transform.getDefaultFeatureType();
203
        }
204

    
205
        public List getFeatureTypes() throws DataException {
206
                if (this.transforms.isEmpty()) {
207
                        return null;
208
                }
209
                FeatureStoreTransform transform = (FeatureStoreTransform) this.transforms
210
                                .get(this.transforms.size() - 1);
211
                return transform.getFeatureTypes();
212
        }
213

    
214
        public void saveToState(PersistentState state) throws PersistenceException {
215
                this.isTramsformValues = null;
216
                state.set("transforms", this.iterator());
217
                Iterator iter = this.iterator();
218
                while (iter.hasNext()) {
219
                        ((FeatureStoreTransform) iter.next()).setFeatureStore(store);
220
                }
221
        }
222

    
223
        public void setState(PersistentState state) throws PersistenceException {
224
                // TODO
225
                this.isTramsformValues = null;
226
        }
227

    
228
        public FeatureStore getFeatureStore() {
229
                return this.store;
230
        }
231

    
232
        public void setFeatureStore(FeatureStore featureStore) {
233
                if (this.store != null) {
234
                        throw new IllegalStateException();// FIXME: A?adir tipo especifico.
235
                }
236
                this.store = (DefaultFeatureStore) featureStore;
237
        }
238

    
239
        public boolean isTransformsOriginalValues() {
240
                if (this.isTramsformValues == null) {
241
                        Iterator iter = this.transforms.iterator();
242
                        FeatureStoreTransform transform;
243
                        this.isTramsformValues = Boolean.FALSE;
244
                        while (iter.hasNext()) {
245
                                transform = (FeatureStoreTransform) iter.next();
246
                                if (transform.isTransformsOriginalValues()){
247
                                        this.isTramsformValues = Boolean.TRUE;
248
                                        break;
249
                                }
250
                        }
251
                }
252
                return this.isTramsformValues.booleanValue();
253
        }
254

    
255
        public FeatureType getFeatureType(String featureTypeId)
256
                        throws DataException {
257
                if (this.transforms.isEmpty()) {
258
                        return null;
259
                }
260
                if (featureTypeId == null) {
261
                        return this.getDefaultFeatureType();
262
                }
263
                Iterator iter = this.getFeatureTypes().iterator();
264
                FeatureType fType;
265
                while (iter.hasNext()) {
266
                        fType = (FeatureType) iter.next();
267
                        if (fType.getId().equals(featureTypeId)) {
268
                                return fType;
269
                        }
270
                }
271
                return null;
272
        }
273

    
274
}