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 @ 40559

History | View | Annotate | Download (11.2 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.fmap.dal.feature.impl;
25

    
26
import java.util.ArrayList;
27
import java.util.Collections;
28
import java.util.Iterator;
29
import java.util.List;
30
import java.util.ListIterator;
31

    
32
import org.gvsig.fmap.dal.exception.DataException;
33
import org.gvsig.fmap.dal.feature.EditableFeature;
34
import org.gvsig.fmap.dal.feature.EditableFeatureType;
35
import org.gvsig.fmap.dal.feature.Feature;
36
import org.gvsig.fmap.dal.feature.FeatureStore;
37
import org.gvsig.fmap.dal.feature.FeatureStoreNotification;
38
import org.gvsig.fmap.dal.feature.FeatureStoreTransform;
39
import org.gvsig.fmap.dal.feature.FeatureStoreTransforms;
40
import org.gvsig.fmap.dal.feature.FeatureType;
41
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
42
import org.gvsig.tools.ToolsLocator;
43
import org.gvsig.tools.dynobject.DynStruct;
44
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
45
import org.gvsig.tools.persistence.Persistent;
46
import org.gvsig.tools.persistence.PersistentState;
47
import org.gvsig.tools.persistence.exception.PersistenceException;
48

    
49
public class DefaultFeatureStoreTransforms implements FeatureStoreTransforms,
50
                Persistent {
51

    
52
        private DefaultFeatureStore store;
53
        private List transforms;
54
        private Boolean isTramsformValues;
55
        private TransformTemporalList lastTransformStack;
56

    
57
        public DefaultFeatureStoreTransforms() {
58
                this.store = null;
59
                this.transforms = new ArrayList();
60
                this.isTramsformValues = Boolean.FALSE;
61
        }
62

    
63
        public DefaultFeatureStoreTransforms(DefaultFeatureStore store) {
64
                this.store = store;
65
                this.transforms = new ArrayList();
66
        }
67

    
68
        protected void checkEditingMode() {
69
                if (store == null || store.getMode() != FeatureStore.MODE_QUERY) {
70
                        throw new IllegalStateException();
71
                }
72
        }
73

    
74
        protected void notifyChangeToStore() {
75
                this.store.notifyChange(FeatureStoreNotification.TRANSFORM_CHANGE);
76
        }
77

    
78
        public FeatureStoreTransform add(FeatureStoreTransform transform)
79
                        throws DataException {
80
                checkEditingMode();
81
                if (transform.getDefaultFeatureType()!=null){
82
                        if( ! transform.getFeatureTypes().contains(transform.getDefaultFeatureType())) {
83
                                throw new IllegalArgumentException(); // FIXME: A�adir tipo especifico.
84
                        }
85
                        this.transforms.add(transform);
86
                        transform.setSourceMetadata(this.store.metadata);
87
                        this.notifyChangeToStore();
88
                        if (this.isTramsformValues == null
89
                                        || (!this.isTramsformValues.booleanValue())) {
90
                                if (transform.isTransformsOriginalValues()) {
91
                                        this.isTramsformValues = Boolean.TRUE;
92
                                }
93

    
94
                        }
95
                }
96

    
97
                return transform;
98
        }
99

    
100

    
101
        public void clear() {
102
                checkEditingMode();
103
                this.transforms.clear();
104
                this.notifyChangeToStore();
105
                this.isTramsformValues = Boolean.FALSE;
106
        }
107

    
108
        public FeatureStoreTransform getTransform(int index) {
109
                return (FeatureStoreTransform) this.transforms.get(index);
110
        }
111

    
112
        public Iterator iterator() {
113
                return Collections.unmodifiableList(transforms).iterator();
114
        }
115

    
116
        public Object remove(int index) {
117
                checkEditingMode();
118
                Object trans = this.transforms.remove(index);
119
                this.notifyChangeToStore();
120
                this.isTramsformValues = null;
121
                return trans;
122
        }
123

    
124
        public boolean remove(FeatureStoreTransform transform) {
125
                checkEditingMode();
126
                boolean removed = this.transforms.remove(transform);
127
                if (removed) {
128
                        this.notifyChangeToStore();
129

    
130
                }
131
                this.isTramsformValues = null;
132
                return removed;
133

    
134
        }
135

    
136
        public int size() {
137
                return this.transforms.size();
138
        }
139

    
140
        public boolean isEmpty() {
141
                return this.transforms.isEmpty();
142
        }
143

    
144
        private class TransformTemporalListElement {
145
                public FeatureStoreTransform transform = null;
146
                public FeatureType targetFeatureType = null;
147
        }
148

    
149
        private class TransformTemporalList extends ArrayList {
150
                /**
151
                 * 
152
                 */
153
                private static final long serialVersionUID = 1677014259279944000L;
154
                private FeatureType targetFType;
155

    
156
                public boolean add(Object arg0) {
157
                        if (this.isEmpty()) {
158
                                targetFType = ((TransformTemporalListElement) arg0).targetFeatureType;
159
                        }
160
                        return super.add(arg0);
161
                }
162

    
163
        }
164

    
165
        protected TransformTemporalList getTransformTemporalList(
166
                        FeatureType targetFeatureType) {
167
                if (this.lastTransformStack == null
168
                                || this.lastTransformStack.size() != this.transforms.size()
169
                                || !(this.lastTransformStack.targetFType
170
                                                .equals(targetFeatureType))) {
171
                        TransformTemporalList result = new TransformTemporalList();
172
                        TransformTemporalListElement item;
173
                        FeatureType nextFType = targetFeatureType;
174

    
175
                        for (int i = transforms.size() - 1; i > -1; i--) {
176
                                item = new TransformTemporalListElement();
177
                                item.transform = (FeatureStoreTransform) transforms.get(i);
178
                                item.targetFeatureType = nextFType;
179
                                nextFType = item.transform
180
                                                .getSourceFeatureTypeFrom(item.targetFeatureType);
181
                                result.add(item);
182
                        }
183
                        this.lastTransformStack = result;
184
                }
185
                return this.lastTransformStack;
186
        }
187

    
188
        public Feature applyTransform(DefaultFeature source,
189
                        FeatureType targetFeatureType)
190
                        throws DataException {
191
                if (this.transforms.isEmpty()) {
192
                        return source;
193
                }
194

    
195
                TransformTemporalList stack = this
196
                                .getTransformTemporalList(targetFeatureType);
197
                TransformTemporalListElement item;
198
                FeatureProvider targetData;
199
                EditableFeature target;
200
                ListIterator iterator = stack.listIterator(stack.size());
201
                FeatureType tft = null;
202

    
203

    
204
                while (iterator.hasPrevious()) {
205
                        item = (TransformTemporalListElement) iterator.previous();
206
                        
207
                        tft = item.targetFeatureType;
208
                        if (tft instanceof EditableFeatureType) {
209
                            /*
210
                             * Must be non-editable to create 
211
                             * DefaultFeatureProvider
212
                             */
213
                            tft = ((EditableFeatureType) tft).getNotEditableCopy();
214
                        }
215
                        
216
                        targetData = this.store.createDefaultFeatureProvider(tft);
217
                        targetData.setOID(source.getData().getOID());
218
                        targetData.setNew(false);
219
                        target = (new DefaultEditableFeature(this.store, targetData))
220
                                        .getEditable();
221
                        item.transform.applyTransform(source, target);
222
                         source = (DefaultFeature) target.getNotEditableCopy();
223
                }
224

    
225
                return source;
226

    
227
        }
228

    
229
        public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
230
                FeatureType tmpFType = targetFeatureType;
231

    
232
                for (int i = transforms.size() - 1; i > -1; i--) {
233
                        FeatureStoreTransform transform = (FeatureStoreTransform) transforms
234
                                        .get(i);
235
                        tmpFType = transform.getSourceFeatureTypeFrom(tmpFType);
236
                }
237
                return tmpFType;
238
        }
239

    
240
        public FeatureType getDefaultFeatureType() throws DataException {
241
                if (this.transforms.isEmpty()) {
242
                        return null;
243
                }
244
                FeatureStoreTransform transform = (FeatureStoreTransform) this.transforms
245
                                .get(this.transforms.size() - 1);
246
                return transform.getDefaultFeatureType();
247
        }
248

    
249
        public List getFeatureTypes() throws DataException {
250
                if (this.transforms.isEmpty()) {
251
                        return null;
252
                }
253
                FeatureStoreTransform transform = (FeatureStoreTransform) this.transforms
254
                                .get(this.transforms.size() - 1);
255
                return transform.getFeatureTypes();
256
        }
257

    
258
        public FeatureStore getFeatureStore() {
259
                return this.store;
260
        }
261

    
262
        public void setFeatureStore(FeatureStore featureStore) {
263
                if (this.store != null) {
264
                        throw new IllegalStateException();// FIXME: A�adir tipo especifico.
265
                }
266
                this.store = (DefaultFeatureStore) featureStore;
267
        }
268
        
269
           
270
        public void setStoreForClone(FeatureStore featureStore) {
271
                this.store = (DefaultFeatureStore) featureStore;
272
        }
273

    
274
        public boolean isTransformsOriginalValues() {
275
                if (this.isTramsformValues == null) {
276
                        Iterator iter = this.transforms.iterator();
277
                        FeatureStoreTransform transform;
278
                        this.isTramsformValues = Boolean.FALSE;
279
                        while (iter.hasNext()) {
280
                                transform = (FeatureStoreTransform) iter.next();
281
                                if (transform.isTransformsOriginalValues()){
282
                                        this.isTramsformValues = Boolean.TRUE;
283
                                        break;
284
                                }
285
                        }
286
                }
287
                return this.isTramsformValues.booleanValue();
288
        }
289

    
290
        public FeatureType getFeatureType(String featureTypeId)
291
                        throws DataException {
292
                if (this.transforms.isEmpty()) {
293
                        return null;
294
                }
295
                if (featureTypeId == null) {
296
                        return this.getDefaultFeatureType();
297
                }
298
                Iterator iter = this.getFeatureTypes().iterator();
299
                FeatureType fType;
300
                while (iter.hasNext()) {
301
                        fType = (FeatureType) iter.next();
302
                        if (fType.getId().equals(featureTypeId)) {
303
                                return fType;
304
                        }
305
                }
306
                return null;
307
        }
308

    
309

    
310

    
311
        // *** Persistence ***
312

    
313
        public void saveToState(PersistentState state) throws PersistenceException {
314
                state.set("store", store);
315
                state.set("isTramsformValues", this.isTramsformValues);
316
                state.set("transforms", this.transforms);
317
        }
318

    
319
        public void loadFromState(PersistentState state)
320
                        throws PersistenceException {
321
                this.isTramsformValues = (Boolean) state.get("isTramsformValues");
322
                this.transforms = (List) state.get("transforms");
323
                this.store = (DefaultFeatureStore) state.get("store");
324
        }
325

    
326
        public static void registerPersistent() {
327
                DynStruct definition = ToolsLocator.getPersistenceManager().addDefinition(
328
                                DefaultFeatureStoreTransforms.class, 
329
                                "DefaultFeatureStoreTransforms", 
330
                                "DefaultFeatureStoreTransforms Persistent definition",
331
                                null, 
332
                                null
333
                        );
334

    
335
                definition.addDynFieldBoolean("isTramsformValues").setMandatory(false);
336
                definition.addDynFieldList("transforms").setClassOfItems(FeatureStoreTransform.class).setMandatory(true);
337
                definition.addDynFieldObject("store").setClassOfValue(FeatureStore.class).setMandatory(true);
338

    
339
        }
340

    
341
        public Object getDynValue(String name) throws DynFieldNotFoundException {
342
                if( ! this.transforms.isEmpty() ) {
343
                        FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size()-1);
344
                        if( transform.hasDynValue(name) ) {
345
                                return transform.getDynValue(name);
346
                        }
347
                }
348
                throw new DynFieldNotFoundException(name, "transforms");
349
        }
350

    
351
        public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
352
                if( ! this.transforms.isEmpty() ) {
353
                        FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size()-1);
354
                        transform.setDynValue(name, value);
355
                }
356
        }
357

    
358
        public boolean hasDynValue(String name) {
359
                if( ! this.transforms.isEmpty() ) {
360
                        FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size()-1);
361
                        if( transform.hasDynValue(name) ) {
362
                                return true;
363
                        }
364
                }
365
                return false;
366
        }
367
        
368
        public Object clone() throws CloneNotSupportedException {
369
            
370
            DefaultFeatureStoreTransforms cloned = (DefaultFeatureStoreTransforms) super.clone();
371
            cloned.transforms = new ArrayList();
372
            int n = this.transforms.size();
373
            for (int i=0; i<n; i++) {
374
                cloned.transforms.add(((FeatureStoreTransform) this.transforms.get(i)).clone());
375
            }
376
            cloned.lastTransformStack = null;
377
            
378
            return cloned;
379
        }
380

    
381
}