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

History | View | Annotate | Download (13.8 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
import org.slf4j.Logger;
49
import org.slf4j.LoggerFactory;
50

    
51
public class DefaultFeatureStoreTransforms
52
    implements FeatureStoreTransforms,
53
    Persistent {
54

    
55
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureStoreTransforms.class);
56
    
57
    private DefaultFeatureStore store;
58
    private List<FeatureStoreTransform> transforms;
59
    private Boolean isTramsformValues;
60
    private TransformTemporalList lastTransformStack;
61

    
62
    public DefaultFeatureStoreTransforms() {
63
        this.store = null;
64
        this.transforms = new ArrayList();
65
        this.isTramsformValues = false;
66
    }
67

    
68
    public DefaultFeatureStoreTransforms(DefaultFeatureStore store) {
69
        this.store = store;
70
        this.transforms = new ArrayList();
71
    }
72

    
73
    protected void checkEditingMode() {
74
        if( store == null || store.getMode() != FeatureStore.MODE_QUERY ) {
75
            throw new IllegalStateException();
76
        }
77
    }
78

    
79
    protected void notifyChangeToStore() {
80
        this.store.notifyChange(FeatureStoreNotification.TRANSFORM_CHANGE);
81
    }
82

    
83
    @Override
84
    public FeatureStoreTransform add(FeatureStoreTransform transform)
85
        throws DataException {
86
        checkEditingMode();
87
        try {
88
            transform.setUp();
89
        } catch (Exception ex) {
90
            throw new RuntimeException("Can't set up transformation.", ex);
91
        }
92
        if( transform.getDefaultFeatureType() != null ) {
93
            if( !transform.getFeatureTypes().contains(transform.getDefaultFeatureType()) ) {
94
                throw new IllegalArgumentException(); // FIXME: Add specific type
95
            }
96
            this.transforms.add(transform);
97
            transform.setFeatureStore(store);
98
            transform.setSourceMetadata(this.store.metadata);
99
            this.notifyChangeToStore();
100
            if( this.isTramsformValues == null || (!this.isTramsformValues) ) {
101
                if( transform.isTransformsOriginalValues() ) {
102
                    this.isTramsformValues = true;
103
                }
104

    
105
            }
106
        }
107

    
108
        return transform;
109
    }
110

    
111
    @Override
112
    public void clear() {
113
        checkEditingMode();
114
        this.transforms.clear();
115
        this.notifyChangeToStore();
116
        this.isTramsformValues = Boolean.FALSE;
117
    }
118

    
119
    @Override
120
    public FeatureStoreTransform getTransform(int index) {
121
        return (FeatureStoreTransform) this.transforms.get(index);
122
    }
123

    
124
    @Override
125
    public Iterator<FeatureStoreTransform> iterator() {
126
        return Collections.unmodifiableList(transforms).iterator();
127
    }
128

    
129
    @Override
130
    public Object remove(int index) {
131
        checkEditingMode();
132
        Object trans = this.transforms.remove(index);
133
        this.notifyChangeToStore();
134
        this.isTramsformValues = null;
135
        return trans;
136
    }
137

    
138
    @Override
139
    public boolean remove(FeatureStoreTransform transform) {
140
        checkEditingMode();
141
        boolean removed = this.transforms.remove(transform);
142
        if( removed ) {
143
            this.notifyChangeToStore();
144

    
145
        }
146
        this.isTramsformValues = null;
147
        return removed;
148

    
149
    }
150

    
151
    @Override
152
    public int size() {
153
        return this.transforms.size();
154
    }
155

    
156
    @Override
157
    public boolean isEmpty() {
158
        return this.transforms.isEmpty();
159
    }
160

    
161
    private class TransformTemporalListElement {
162

    
163
        public FeatureStoreTransform transform = null;
164
        public FeatureType targetFeatureType = null;
165
    }
166

    
167
    private class TransformTemporalList
168
        extends ArrayList {
169

    
170
        /**
171
         *
172
         */
173
        private static final long serialVersionUID = 1677014259279944000L;
174
        private FeatureType targetFType;
175

    
176
        @Override
177
        public boolean add(Object arg0) {
178
            if( this.isEmpty() ) {
179
                targetFType = ((TransformTemporalListElement) arg0).targetFeatureType;
180
            }
181
            return super.add(arg0);
182
        }
183

    
184
    }
185

    
186
    private TransformTemporalList getTransformTemporalList(FeatureType targetFeatureType) {
187
        if( this.lastTransformStack == null
188
            || this.lastTransformStack.size() != this.transforms.size()
189
            || !(this.lastTransformStack.targetFType.equals(targetFeatureType)) ) {
190
            TransformTemporalList result = new TransformTemporalList();
191
            TransformTemporalListElement item;
192
            FeatureType nextFType = targetFeatureType;
193

    
194
            for( int i = transforms.size() - 1; i > -1; i-- ) {
195
                item = new TransformTemporalListElement();
196
                item.transform = (FeatureStoreTransform) transforms.get(i);
197
                item.targetFeatureType = nextFType;
198
                nextFType = item.transform.getSourceFeatureTypeFrom(item.targetFeatureType);
199
                result.add(item);
200
            }
201
            this.lastTransformStack = result;
202
        }
203
        return this.lastTransformStack;
204
    }
205

    
206
    public Feature applyTransform(DefaultFeature source,
207
        FeatureType targetFeatureType)
208
        throws DataException {
209
        if( this.transforms.isEmpty() ) {
210
            return source;
211
        }
212

    
213
        TransformTemporalList stack = this
214
            .getTransformTemporalList(targetFeatureType);
215
        TransformTemporalListElement item;
216
        FeatureProvider targetData;
217
        EditableFeature target;
218
        ListIterator iterator = stack.listIterator(stack.size());
219
        FeatureType tft = null;
220

    
221
        while( iterator.hasPrevious() ) {
222
            item = (TransformTemporalListElement) iterator.previous();
223

    
224
            tft = item.targetFeatureType;
225
            if( tft instanceof EditableFeatureType ) {
226
                /*
227
                             * Must be non-editable to create 
228
                             * DefaultFeatureProvider
229
                 */
230
                tft = ((EditableFeatureType) tft).getNotEditableCopy();
231
            }
232

    
233
            targetData = this.store.createDefaultFeatureProvider(tft);
234
            targetData.setOID(source.getData().getOID());
235
            targetData.setNew(false);
236
            target = new DefaultEditableFeature(this.store, targetData);
237
            item.transform.applyTransform(source, target);
238
            source = (DefaultFeature) target.getNotEditableCopy();
239
        }
240

    
241
        return source;
242

    
243
    }
244

    
245
    public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
246
        FeatureType tmpFType = targetFeatureType;
247

    
248
        for( int i = transforms.size() - 1; i > -1; i-- ) {
249
            FeatureStoreTransform transform = transforms.get(i);
250
            tmpFType = transform.getSourceFeatureTypeFrom(tmpFType);
251
        }
252
        return tmpFType;
253
    }
254

    
255
    public FeatureType getDefaultFeatureType() throws DataException {
256
        if( this.transforms.isEmpty() ) {
257
            return null;
258
        }
259
        FeatureStoreTransform transform = this.transforms.get(this.transforms.size() - 1);
260
        return transform.getDefaultFeatureType();
261
    }
262

    
263
    public List<FeatureType> getFeatureTypes() throws DataException {
264
        if( this.transforms.isEmpty() ) {
265
            return null;
266
        }
267
        FeatureStoreTransform transform = this.transforms.get(this.transforms.size() - 1);
268
        return transform.getFeatureTypes();
269
    }
270

    
271
    public FeatureStore getFeatureStore() {
272
        return this.store;
273
    }
274

    
275
    public void setFeatureStore(FeatureStore featureStore) {
276
        if( this.store != null ) {
277
            throw new IllegalStateException();
278
        }
279
        this.store = (DefaultFeatureStore) featureStore;
280
        for( FeatureStoreTransform transform : this ) {
281
            transform.setFeatureStore(featureStore);
282
        }
283
    }
284
    
285
    public void setStoreForClone(FeatureStore featureStore) {
286
        this.store = (DefaultFeatureStore) featureStore;
287
    }
288

    
289
    @Override
290
    public boolean isTransformsOriginalValues() {
291
        if( this.isTramsformValues == null ) {
292
            this.isTramsformValues = false;
293
            for( FeatureStoreTransform transform : this ) {
294
                if( transform.isTransformsOriginalValues() ) {
295
                    this.isTramsformValues = true;
296
                    break;
297
                }
298
            }
299
        }
300
        return this.isTramsformValues;
301
    }
302

    
303
    public FeatureType getFeatureType(String featureTypeId)
304
        throws DataException {
305
        if( this.transforms.isEmpty() ) {
306
            return null;
307
        }
308
        if( featureTypeId == null ) {
309
            return this.getDefaultFeatureType();
310
        }
311
        for( FeatureType fType : (List<FeatureType>) this.getFeatureTypes() ) {
312
            
313
        } 
314
        Iterator iter = this.getFeatureTypes().iterator();
315
        FeatureType fType;
316
        while( iter.hasNext() ) {
317
            fType = (FeatureType) iter.next();
318
            if( fType.getId().equals(featureTypeId) ) {
319
                return fType;
320
            }
321
        }
322
        return null;
323
    }
324

    
325
    @Override
326
    public void saveToState(PersistentState state) throws PersistenceException {
327
        // state.set("store", store);
328
        state.set("isTramsformValues", this.isTramsformValues);
329
        state.set("transforms", this.transforms);
330
    }
331

    
332
    @Override
333
    public void loadFromState(PersistentState state)
334
        throws PersistenceException {
335
        this.isTramsformValues = (Boolean) state.get("isTramsformValues");
336
        this.transforms = new ArrayList();
337
        List<FeatureStoreTransform> x = (List<FeatureStoreTransform>) state.get("transforms");
338
        this.transforms.addAll(x);
339
        // this.store = (DefaultFeatureStore) state.get("store");
340
    }
341

    
342
    public static void registerPersistent() {
343
        DynStruct definition = ToolsLocator.getPersistenceManager().addDefinition(
344
            DefaultFeatureStoreTransforms.class,
345
            "DefaultFeatureStoreTransforms",
346
            "DefaultFeatureStoreTransforms Persistent definition",
347
            null,
348
            null
349
        );
350

    
351
        definition.addDynFieldBoolean("isTramsformValues").setMandatory(false);
352
        definition.addDynFieldList("transforms").setClassOfItems(FeatureStoreTransform.class).setMandatory(true);
353
        definition.addDynFieldObject("store").setClassOfValue(FeatureStore.class).setMandatory(false);
354

    
355
    }
356

    
357
    public Object getDynValue(String name) throws DynFieldNotFoundException {
358
        if( !this.transforms.isEmpty() ) {
359
            for (int i = this.transforms.size() - 1; i >= 0; i--) {
360
                FeatureStoreTransform transform = transforms.get(i);
361
                if( transform!=null && transform.hasDynValue(name) ) {
362
                    Object value;
363
                    try {
364
                        value = transform.getDynValue(name);
365
                        if( value!=null ) {
366
                            return value;
367
                        }
368
                    } catch(Exception ex) {
369
                        LOGGER.warn("Cant retrieve value of '"+name+ "' in transform '"+transform.getName()+"'.", ex);
370
                    }
371
                }
372
            }
373
        }
374
        return null;
375
    }
376

    
377
    public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
378
        if( !this.transforms.isEmpty() ) {
379
            FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size() - 1);
380
            transform.setDynValue(name, value);
381
        }
382
    }
383

    
384
    public boolean hasDynValue(String name) {
385
        if( !this.transforms.isEmpty() ) {
386
            for (int i = this.transforms.size() - 1; i >= 0; i--) {
387
                FeatureStoreTransform transform = transforms.get(i);                
388
                if( transform.hasDynValue(name) ) {
389
                    return true;
390
                }
391
            }
392
        }
393
        return false;
394
    }
395

    
396
    @Override
397
    public Object clone() throws CloneNotSupportedException {
398
        DefaultFeatureStoreTransforms cloned = (DefaultFeatureStoreTransforms) super.clone();
399
        cloned.transforms = new ArrayList();
400
        for( FeatureStoreTransform transform : transforms ) {
401
            cloned.transforms.add((FeatureStoreTransform) transform.clone());
402
        }
403
        cloned.lastTransformStack = null;
404
        return cloned;
405
    }
406

    
407
}