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

History | View | Annotate | Download (13.1 KB)

1 40559 jjdelcerro
/**
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 40435 jjdelcerro
package org.gvsig.fmap.dal.feature.impl;
25
26
import java.util.ArrayList;
27 43215 jjdelcerro
import java.util.Collection;
28 40435 jjdelcerro
import java.util.Collections;
29
import java.util.Iterator;
30
import java.util.List;
31
import java.util.ListIterator;
32
33
import org.gvsig.fmap.dal.exception.DataException;
34
import org.gvsig.fmap.dal.feature.EditableFeature;
35
import org.gvsig.fmap.dal.feature.EditableFeatureType;
36
import org.gvsig.fmap.dal.feature.Feature;
37
import org.gvsig.fmap.dal.feature.FeatureStore;
38
import org.gvsig.fmap.dal.feature.FeatureStoreNotification;
39
import org.gvsig.fmap.dal.feature.FeatureStoreTransform;
40
import org.gvsig.fmap.dal.feature.FeatureStoreTransforms;
41
import org.gvsig.fmap.dal.feature.FeatureType;
42
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
43
import org.gvsig.tools.ToolsLocator;
44
import org.gvsig.tools.dynobject.DynStruct;
45
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
46
import org.gvsig.tools.persistence.Persistent;
47
import org.gvsig.tools.persistence.PersistentState;
48
import org.gvsig.tools.persistence.exception.PersistenceException;
49
50 43215 jjdelcerro
public class DefaultFeatureStoreTransforms
51
    implements FeatureStoreTransforms,
52
    Persistent {
53 40435 jjdelcerro
54 43215 jjdelcerro
    private DefaultFeatureStore store;
55
    private List<FeatureStoreTransform> transforms;
56
    private Boolean isTramsformValues;
57
    private TransformTemporalList lastTransformStack;
58 40435 jjdelcerro
59 43215 jjdelcerro
    public DefaultFeatureStoreTransforms() {
60
        this.store = null;
61
        this.transforms = new ArrayList();
62
        this.isTramsformValues = false;
63
    }
64 40435 jjdelcerro
65 43215 jjdelcerro
    public DefaultFeatureStoreTransforms(DefaultFeatureStore store) {
66
        this.store = store;
67
        this.transforms = new ArrayList();
68
    }
69 40435 jjdelcerro
70 43215 jjdelcerro
    protected void checkEditingMode() {
71
        if( store == null || store.getMode() != FeatureStore.MODE_QUERY ) {
72
            throw new IllegalStateException();
73
        }
74
    }
75 40435 jjdelcerro
76 43215 jjdelcerro
    protected void notifyChangeToStore() {
77
        this.store.notifyChange(FeatureStoreNotification.TRANSFORM_CHANGE);
78
    }
79 40435 jjdelcerro
80 43215 jjdelcerro
    @Override
81
    public FeatureStoreTransform add(FeatureStoreTransform transform)
82
        throws DataException {
83
        checkEditingMode();
84
        if( transform.getDefaultFeatureType() != null ) {
85
            if( !transform.getFeatureTypes().contains(transform.getDefaultFeatureType()) ) {
86
                throw new IllegalArgumentException(); // FIXME: Add specific type
87
            }
88
            this.transforms.add(transform);
89
            transform.setFeatureStore(store);
90
            transform.setSourceMetadata(this.store.metadata);
91
            this.notifyChangeToStore();
92
            if( this.isTramsformValues == null || (!this.isTramsformValues) ) {
93
                if( transform.isTransformsOriginalValues() ) {
94
                    this.isTramsformValues = true;
95
                }
96 40435 jjdelcerro
97 43215 jjdelcerro
            }
98
        }
99 40435 jjdelcerro
100 43215 jjdelcerro
        return transform;
101
    }
102 40435 jjdelcerro
103 43215 jjdelcerro
    @Override
104
    public void clear() {
105
        checkEditingMode();
106
        this.transforms.clear();
107
        this.notifyChangeToStore();
108
        this.isTramsformValues = Boolean.FALSE;
109
    }
110 40435 jjdelcerro
111 43215 jjdelcerro
    @Override
112
    public FeatureStoreTransform getTransform(int index) {
113
        return (FeatureStoreTransform) this.transforms.get(index);
114
    }
115 40435 jjdelcerro
116 43215 jjdelcerro
    @Override
117
    public Iterator<FeatureStoreTransform> iterator() {
118
        return Collections.unmodifiableList(transforms).iterator();
119
    }
120 40435 jjdelcerro
121 43215 jjdelcerro
    @Override
122
    public Object remove(int index) {
123
        checkEditingMode();
124
        Object trans = this.transforms.remove(index);
125
        this.notifyChangeToStore();
126
        this.isTramsformValues = null;
127
        return trans;
128
    }
129 40435 jjdelcerro
130 43215 jjdelcerro
    @Override
131
    public boolean remove(FeatureStoreTransform transform) {
132
        checkEditingMode();
133
        boolean removed = this.transforms.remove(transform);
134
        if( removed ) {
135
            this.notifyChangeToStore();
136 40435 jjdelcerro
137 43215 jjdelcerro
        }
138
        this.isTramsformValues = null;
139
        return removed;
140 40435 jjdelcerro
141 43215 jjdelcerro
    }
142 40435 jjdelcerro
143 43215 jjdelcerro
    @Override
144
    public int size() {
145
        return this.transforms.size();
146
    }
147 40435 jjdelcerro
148 43215 jjdelcerro
    @Override
149
    public boolean isEmpty() {
150
        return this.transforms.isEmpty();
151
    }
152 40435 jjdelcerro
153 43215 jjdelcerro
    private class TransformTemporalListElement {
154 40435 jjdelcerro
155 43215 jjdelcerro
        public FeatureStoreTransform transform = null;
156
        public FeatureType targetFeatureType = null;
157
    }
158 40435 jjdelcerro
159 43215 jjdelcerro
    private class TransformTemporalList
160
        extends ArrayList {
161 40435 jjdelcerro
162 43215 jjdelcerro
        /**
163
         *
164
         */
165
        private static final long serialVersionUID = 1677014259279944000L;
166
        private FeatureType targetFType;
167 40435 jjdelcerro
168 43215 jjdelcerro
        @Override
169
        public boolean add(Object arg0) {
170
            if( this.isEmpty() ) {
171
                targetFType = ((TransformTemporalListElement) arg0).targetFeatureType;
172
            }
173
            return super.add(arg0);
174
        }
175 40435 jjdelcerro
176 43215 jjdelcerro
    }
177 40435 jjdelcerro
178 43215 jjdelcerro
    private TransformTemporalList getTransformTemporalList(FeatureType targetFeatureType) {
179
        if( this.lastTransformStack == null
180
            || this.lastTransformStack.size() != this.transforms.size()
181
            || !(this.lastTransformStack.targetFType.equals(targetFeatureType)) ) {
182
            TransformTemporalList result = new TransformTemporalList();
183
            TransformTemporalListElement item;
184
            FeatureType nextFType = targetFeatureType;
185 40435 jjdelcerro
186 43215 jjdelcerro
            for( int i = transforms.size() - 1; i > -1; i-- ) {
187
                item = new TransformTemporalListElement();
188
                item.transform = (FeatureStoreTransform) transforms.get(i);
189
                item.targetFeatureType = nextFType;
190
                nextFType = item.transform.getSourceFeatureTypeFrom(item.targetFeatureType);
191
                result.add(item);
192
            }
193
            this.lastTransformStack = result;
194
        }
195
        return this.lastTransformStack;
196
    }
197 40435 jjdelcerro
198 43215 jjdelcerro
    public Feature applyTransform(DefaultFeature source,
199
        FeatureType targetFeatureType)
200
        throws DataException {
201
        if( this.transforms.isEmpty() ) {
202
            return source;
203
        }
204 40435 jjdelcerro
205 43215 jjdelcerro
        TransformTemporalList stack = this
206
            .getTransformTemporalList(targetFeatureType);
207
        TransformTemporalListElement item;
208
        FeatureProvider targetData;
209
        EditableFeature target;
210
        ListIterator iterator = stack.listIterator(stack.size());
211
        FeatureType tft = null;
212 40435 jjdelcerro
213 43215 jjdelcerro
        while( iterator.hasPrevious() ) {
214
            item = (TransformTemporalListElement) iterator.previous();
215
216
            tft = item.targetFeatureType;
217
            if( tft instanceof EditableFeatureType ) {
218
                /*
219 40435 jjdelcerro
                             * Must be non-editable to create
220
                             * DefaultFeatureProvider
221 43215 jjdelcerro
                 */
222
                tft = ((EditableFeatureType) tft).getNotEditableCopy();
223
            }
224 40435 jjdelcerro
225 43215 jjdelcerro
            targetData = this.store.createDefaultFeatureProvider(tft);
226
            targetData.setOID(source.getData().getOID());
227
            targetData.setNew(false);
228
            target = new DefaultEditableFeature(this.store, targetData);
229
            item.transform.applyTransform(source, target);
230
            source = (DefaultFeature) target.getNotEditableCopy();
231
        }
232 40435 jjdelcerro
233 43215 jjdelcerro
        return source;
234 40435 jjdelcerro
235 43215 jjdelcerro
    }
236 40435 jjdelcerro
237 43215 jjdelcerro
    public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
238
        FeatureType tmpFType = targetFeatureType;
239 40435 jjdelcerro
240 43215 jjdelcerro
        for( int i = transforms.size() - 1; i > -1; i-- ) {
241
            FeatureStoreTransform transform = transforms.get(i);
242
            tmpFType = transform.getSourceFeatureTypeFrom(tmpFType);
243
        }
244
        return tmpFType;
245
    }
246 40435 jjdelcerro
247 43215 jjdelcerro
    public FeatureType getDefaultFeatureType() throws DataException {
248
        if( this.transforms.isEmpty() ) {
249
            return null;
250
        }
251
        FeatureStoreTransform transform = this.transforms.get(this.transforms.size() - 1);
252
        return transform.getDefaultFeatureType();
253
    }
254 40435 jjdelcerro
255 43215 jjdelcerro
    public List<FeatureType> getFeatureTypes() throws DataException {
256
        if( this.transforms.isEmpty() ) {
257
            return null;
258
        }
259
        FeatureStoreTransform transform = this.transforms.get(this.transforms.size() - 1);
260
        return transform.getFeatureTypes();
261
    }
262 40435 jjdelcerro
263 43215 jjdelcerro
    public FeatureStore getFeatureStore() {
264
        return this.store;
265
    }
266 40435 jjdelcerro
267 43215 jjdelcerro
    public void setFeatureStore(FeatureStore featureStore) {
268
        if( this.store != null ) {
269
            throw new IllegalStateException();
270
        }
271
        this.store = (DefaultFeatureStore) featureStore;
272
        for( FeatureStoreTransform transform : this ) {
273
            transform.setFeatureStore(featureStore);
274
        }
275
    }
276
277
    public void setStoreForClone(FeatureStore featureStore) {
278
        this.store = (DefaultFeatureStore) featureStore;
279
    }
280 40435 jjdelcerro
281 43215 jjdelcerro
    @Override
282
    public boolean isTransformsOriginalValues() {
283
        if( this.isTramsformValues == null ) {
284
            this.isTramsformValues = false;
285
            for( FeatureStoreTransform transform : this ) {
286
                if( transform.isTransformsOriginalValues() ) {
287
                    this.isTramsformValues = true;
288
                    break;
289
                }
290
            }
291
        }
292
        return this.isTramsformValues;
293
    }
294 40435 jjdelcerro
295 43215 jjdelcerro
    public FeatureType getFeatureType(String featureTypeId)
296
        throws DataException {
297
        if( this.transforms.isEmpty() ) {
298
            return null;
299
        }
300
        if( featureTypeId == null ) {
301
            return this.getDefaultFeatureType();
302
        }
303
        for( FeatureType fType : (List<FeatureType>) this.getFeatureTypes() ) {
304
305
        }
306
        Iterator iter = this.getFeatureTypes().iterator();
307
        FeatureType fType;
308
        while( iter.hasNext() ) {
309
            fType = (FeatureType) iter.next();
310
            if( fType.getId().equals(featureTypeId) ) {
311
                return fType;
312
            }
313
        }
314
        return null;
315
    }
316 40435 jjdelcerro
317 43215 jjdelcerro
    @Override
318
    public void saveToState(PersistentState state) throws PersistenceException {
319
        // state.set("store", store);
320
        state.set("isTramsformValues", this.isTramsformValues);
321
        state.set("transforms", this.transforms);
322
    }
323 40435 jjdelcerro
324 43215 jjdelcerro
    @Override
325
    public void loadFromState(PersistentState state)
326
        throws PersistenceException {
327
        this.isTramsformValues = (Boolean) state.get("isTramsformValues");
328
        this.transforms = new ArrayList();
329
        List<FeatureStoreTransform> x = (List<FeatureStoreTransform>) state.get("transforms");
330
        this.transforms.addAll(x);
331
        // this.store = (DefaultFeatureStore) state.get("store");
332
    }
333 40435 jjdelcerro
334 43215 jjdelcerro
    public static void registerPersistent() {
335
        DynStruct definition = ToolsLocator.getPersistenceManager().addDefinition(
336
            DefaultFeatureStoreTransforms.class,
337
            "DefaultFeatureStoreTransforms",
338
            "DefaultFeatureStoreTransforms Persistent definition",
339
            null,
340
            null
341
        );
342 40435 jjdelcerro
343 43215 jjdelcerro
        definition.addDynFieldBoolean("isTramsformValues").setMandatory(false);
344
        definition.addDynFieldList("transforms").setClassOfItems(FeatureStoreTransform.class).setMandatory(true);
345
        definition.addDynFieldObject("store").setClassOfValue(FeatureStore.class).setMandatory(false);
346 40435 jjdelcerro
347 43215 jjdelcerro
    }
348 40435 jjdelcerro
349 43215 jjdelcerro
    public Object getDynValue(String name) throws DynFieldNotFoundException {
350
        if( !this.transforms.isEmpty() ) {
351
            FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size() - 1);
352
            if( transform.hasDynValue(name) ) {
353
                return transform.getDynValue(name);
354
            }
355
        }
356
        throw new DynFieldNotFoundException(name, "transforms");
357
    }
358 40435 jjdelcerro
359 43215 jjdelcerro
    public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
360
        if( !this.transforms.isEmpty() ) {
361
            FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size() - 1);
362
            transform.setDynValue(name, value);
363
        }
364
    }
365 40435 jjdelcerro
366 43215 jjdelcerro
    public boolean hasDynValue(String name) {
367
        if( !this.transforms.isEmpty() ) {
368
            FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size() - 1);
369
            if( transform.hasDynValue(name) ) {
370
                return true;
371
            }
372
        }
373
        return false;
374
    }
375 40435 jjdelcerro
376 43215 jjdelcerro
    @Override
377
    public Object clone() throws CloneNotSupportedException {
378
        DefaultFeatureStoreTransforms cloned = (DefaultFeatureStoreTransforms) super.clone();
379
        cloned.transforms = new ArrayList();
380
        for( FeatureStoreTransform transform : transforms ) {
381
            cloned.transforms.add((FeatureStoreTransform) transform.clone());
382
        }
383
        cloned.lastTransformStack = null;
384
        return cloned;
385
    }
386 40435 jjdelcerro
387
}