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

History | View | Annotate | Download (13.1 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.Collection;
28
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
public class DefaultFeatureStoreTransforms
51
    implements FeatureStoreTransforms,
52
    Persistent {
53

    
54
    private DefaultFeatureStore store;
55
    private List<FeatureStoreTransform> transforms;
56
    private Boolean isTramsformValues;
57
    private TransformTemporalList lastTransformStack;
58

    
59
    public DefaultFeatureStoreTransforms() {
60
        this.store = null;
61
        this.transforms = new ArrayList();
62
        this.isTramsformValues = false;
63
    }
64

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

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

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

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

    
97
            }
98
        }
99

    
100
        return transform;
101
    }
102

    
103
    @Override
104
    public void clear() {
105
        checkEditingMode();
106
        this.transforms.clear();
107
        this.notifyChangeToStore();
108
        this.isTramsformValues = Boolean.FALSE;
109
    }
110

    
111
    @Override
112
    public FeatureStoreTransform getTransform(int index) {
113
        return (FeatureStoreTransform) this.transforms.get(index);
114
    }
115

    
116
    @Override
117
    public Iterator<FeatureStoreTransform> iterator() {
118
        return Collections.unmodifiableList(transforms).iterator();
119
    }
120

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

    
130
    @Override
131
    public boolean remove(FeatureStoreTransform transform) {
132
        checkEditingMode();
133
        boolean removed = this.transforms.remove(transform);
134
        if( removed ) {
135
            this.notifyChangeToStore();
136

    
137
        }
138
        this.isTramsformValues = null;
139
        return removed;
140

    
141
    }
142

    
143
    @Override
144
    public int size() {
145
        return this.transforms.size();
146
    }
147

    
148
    @Override
149
    public boolean isEmpty() {
150
        return this.transforms.isEmpty();
151
    }
152

    
153
    private class TransformTemporalListElement {
154

    
155
        public FeatureStoreTransform transform = null;
156
        public FeatureType targetFeatureType = null;
157
    }
158

    
159
    private class TransformTemporalList
160
        extends ArrayList {
161

    
162
        /**
163
         *
164
         */
165
        private static final long serialVersionUID = 1677014259279944000L;
166
        private FeatureType targetFType;
167

    
168
        @Override
169
        public boolean add(Object arg0) {
170
            if( this.isEmpty() ) {
171
                targetFType = ((TransformTemporalListElement) arg0).targetFeatureType;
172
            }
173
            return super.add(arg0);
174
        }
175

    
176
    }
177

    
178
    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

    
186
            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

    
198
    public Feature applyTransform(DefaultFeature source,
199
        FeatureType targetFeatureType)
200
        throws DataException {
201
        if( this.transforms.isEmpty() ) {
202
            return source;
203
        }
204

    
205
        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

    
213
        while( iterator.hasPrevious() ) {
214
            item = (TransformTemporalListElement) iterator.previous();
215

    
216
            tft = item.targetFeatureType;
217
            if( tft instanceof EditableFeatureType ) {
218
                /*
219
                             * Must be non-editable to create 
220
                             * DefaultFeatureProvider
221
                 */
222
                tft = ((EditableFeatureType) tft).getNotEditableCopy();
223
            }
224

    
225
            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

    
233
        return source;
234

    
235
    }
236

    
237
    public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
238
        FeatureType tmpFType = targetFeatureType;
239

    
240
        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

    
247
    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

    
255
    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

    
263
    public FeatureStore getFeatureStore() {
264
        return this.store;
265
    }
266

    
267
    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

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

    
295
    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

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

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

    
334
    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

    
343
        definition.addDynFieldBoolean("isTramsformValues").setMandatory(false);
344
        definition.addDynFieldList("transforms").setClassOfItems(FeatureStoreTransform.class).setMandatory(true);
345
        definition.addDynFieldObject("store").setClassOfValue(FeatureStore.class).setMandatory(false);
346

    
347
    }
348

    
349
    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

    
359
    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

    
366
    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

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

    
387
}