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

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