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

History | View | Annotate | Download (14.4 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.EditableFeatureAttributeDescriptor;
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
import org.slf4j.Logger;
50
import org.slf4j.LoggerFactory;
51
import org.gvsig.fmap.dal.feature.FeatureExtraColumns;
52

    
53
public class DefaultFeatureStoreTransforms
54
    implements FeatureStoreTransforms,
55
    Persistent {
56

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

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

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

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

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

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

    
107
            }
108
        }
109

    
110
        return transform;
111
    }
112

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

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

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

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

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

    
147
        }
148
        this.isTramsformValues = null;
149
        return removed;
150

    
151
    }
152

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

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

    
163
    private class TransformTemporalListElement {
164

    
165
        public FeatureStoreTransform transform = null;
166
        public FeatureType targetFeatureType = null;
167
    }
168

    
169
    private class TransformTemporalList
170
        extends ArrayList {
171

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

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

    
186
    }
187

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

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

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

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

    
223
        while( iterator.hasPrevious() ) {
224
            item = (TransformTemporalListElement) iterator.previous();
225

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

    
235
            targetData = this.store.createDefaultFeatureProvider(tft);
236
            targetData.setNew(true);
237
            targetData.setOID(source.getData().getOID());
238
            target = new DefaultEditableFeature(this.store, targetData);
239
            item.transform.applyTransform(source, target);
240
            targetData.setNew(source.getData().isNew());
241
            target.setInserted(source.isInserted());
242
            source = (DefaultFeature) target.getNotEditableCopy();
243
        }
244

    
245
        return source;
246

    
247
    }
248

    
249
    public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
250
        FeatureType tmpFType = targetFeatureType;
251

    
252
        for( int i = transforms.size() - 1; i > -1; i-- ) {
253
            FeatureStoreTransform transform = transforms.get(i);
254
            tmpFType = transform.getSourceFeatureTypeFrom(tmpFType);
255
        }
256
        // se mantienen
257
        List<EditableFeatureAttributeDescriptor> extraCols = targetFeatureType.getExtraColumns().getColumns();
258
        if (extraCols!=null & !extraCols.isEmpty()) {
259
            FeatureExtraColumns tmpExtraCols = tmpFType.getExtraColumns();
260
            tmpExtraCols.merge(targetFeatureType.getExtraColumns());
261
            ((DefaultFeatureType) tmpFType).setExtraColumn(tmpExtraCols);
262
        } 
263
        return tmpFType;
264
    }
265

    
266
    public FeatureType getDefaultFeatureType() throws DataException {
267
        if( this.transforms.isEmpty() ) {
268
            return null;
269
        }
270
        FeatureStoreTransform transform = this.transforms.get(this.transforms.size() - 1);
271
        return transform.getDefaultFeatureType();
272
    }
273

    
274
    public List<FeatureType> getFeatureTypes() throws DataException {
275
        if( this.transforms.isEmpty() ) {
276
            return null;
277
        }
278
        FeatureStoreTransform transform = this.transforms.get(this.transforms.size() - 1);
279
        return transform.getFeatureTypes();
280
    }
281

    
282
    public FeatureStore getFeatureStore() {
283
        return this.store;
284
    }
285

    
286
    public void setFeatureStore(FeatureStore featureStore) {
287
        if( this.store != null ) {
288
            throw new IllegalStateException();
289
        }
290
        this.store = (DefaultFeatureStore) featureStore;
291
        for( FeatureStoreTransform transform : this ) {
292
            transform.setFeatureStore(featureStore);
293
        }
294
    }
295
    
296
    public void setStoreForClone(FeatureStore featureStore) {
297
        this.store = (DefaultFeatureStore) featureStore;
298
    }
299

    
300
    @Override
301
    public boolean isTransformsOriginalValues() {
302
        if( this.isTramsformValues == null ) {
303
            this.isTramsformValues = false;
304
            for( FeatureStoreTransform transform : this ) {
305
                if( transform.isTransformsOriginalValues() ) {
306
                    this.isTramsformValues = true;
307
                    break;
308
                }
309
            }
310
        }
311
        return this.isTramsformValues;
312
    }
313

    
314
    public FeatureType getFeatureType(String featureTypeId)
315
        throws DataException {
316
        if( this.transforms.isEmpty() ) {
317
            return null;
318
        }
319
        if( featureTypeId == null ) {
320
            return this.getDefaultFeatureType();
321
        }
322
        for( FeatureType fType : (List<FeatureType>) this.getFeatureTypes() ) {
323
            
324
        } 
325
        Iterator iter = this.getFeatureTypes().iterator();
326
        FeatureType fType;
327
        while( iter.hasNext() ) {
328
            fType = (FeatureType) iter.next();
329
            if( fType.getId().equals(featureTypeId) ) {
330
                return fType;
331
            }
332
        }
333
        return null;
334
    }
335

    
336
    @Override
337
    public void saveToState(PersistentState state) throws PersistenceException {
338
        // state.set("store", store);
339
        state.set("isTramsformValues", this.isTramsformValues);
340
        state.set("transforms", this.transforms);
341
    }
342

    
343
    @Override
344
    public void loadFromState(PersistentState state)
345
        throws PersistenceException {
346
        this.isTramsformValues = (Boolean) state.get("isTramsformValues");
347
        this.transforms = new ArrayList();
348
        List<FeatureStoreTransform> x = (List<FeatureStoreTransform>) state.get("transforms");
349
        this.transforms.addAll(x);
350
        // this.store = (DefaultFeatureStore) state.get("store");
351
    }
352

    
353
    public static void registerPersistent() {
354
        DynStruct definition = ToolsLocator.getPersistenceManager().addDefinition(
355
            DefaultFeatureStoreTransforms.class,
356
            "DefaultFeatureStoreTransforms",
357
            "DefaultFeatureStoreTransforms Persistent definition",
358
            null,
359
            null
360
        );
361

    
362
        definition.addDynFieldBoolean("isTramsformValues").setMandatory(false);
363
        definition.addDynFieldList("transforms").setClassOfItems(FeatureStoreTransform.class).setMandatory(true);
364
        definition.addDynFieldObject("store").setClassOfValue(FeatureStore.class).setMandatory(false);
365

    
366
    }
367

    
368
    public Object getDynValue(String name) throws DynFieldNotFoundException {
369
        if( !this.transforms.isEmpty() ) {
370
            for (int i = this.transforms.size() - 1; i >= 0; i--) {
371
                FeatureStoreTransform transform = transforms.get(i);
372
                if( transform!=null && transform.hasDynValue(name) ) {
373
                    Object value;
374
                    try {
375
                        value = transform.getDynValue(name);
376
                        if( value!=null ) {
377
                            return value;
378
                        }
379
                    } catch(Exception ex) {
380
                        LOGGER.warn("Cant retrieve value of '"+name+ "' in transform '"+transform.getName()+"'.", ex);
381
                    }
382
                }
383
            }
384
        }
385
        return null;
386
    }
387

    
388
    public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
389
        if( !this.transforms.isEmpty() ) {
390
            FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size() - 1);
391
            transform.setDynValue(name, value);
392
        }
393
    }
394

    
395
    public boolean hasDynValue(String name) {
396
        if( !this.transforms.isEmpty() ) {
397
            for (int i = this.transforms.size() - 1; i >= 0; i--) {
398
                FeatureStoreTransform transform = transforms.get(i);                
399
                if( transform.hasDynValue(name) ) {
400
                    return true;
401
                }
402
            }
403
        }
404
        return false;
405
    }
406

    
407
    @Override
408
    public Object clone() throws CloneNotSupportedException {
409
        DefaultFeatureStoreTransforms cloned = (DefaultFeatureStoreTransforms) super.clone();
410
        cloned.transforms = new ArrayList();
411
        for( FeatureStoreTransform transform : transforms ) {
412
            cloned.transforms.add((FeatureStoreTransform) transform.clone());
413
        }
414
        cloned.lastTransformStack = null;
415
        return cloned;
416
    }
417

    
418
}