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

View differences:

DefaultFeatureStoreTransforms.java
24 24
package org.gvsig.fmap.dal.feature.impl;
25 25

  
26 26
import java.util.ArrayList;
27
import java.util.Collection;
27 28
import java.util.Collections;
28 29
import java.util.Iterator;
29 30
import java.util.List;
......
46 47
import org.gvsig.tools.persistence.PersistentState;
47 48
import org.gvsig.tools.persistence.exception.PersistenceException;
48 49

  
49
public class DefaultFeatureStoreTransforms implements FeatureStoreTransforms,
50
		Persistent {
50
public class DefaultFeatureStoreTransforms
51
    implements FeatureStoreTransforms,
52
    Persistent {
51 53

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

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

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

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

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

  
78
	public FeatureStoreTransform add(FeatureStoreTransform transform)
79
			throws DataException {
80
		checkEditingMode();
81
		if (transform.getDefaultFeatureType()!=null){
82
			if( ! transform.getFeatureTypes().contains(transform.getDefaultFeatureType())) {
83
				throw new IllegalArgumentException(); // FIXME: A�adir tipo especifico.
84
			}
85
			this.transforms.add(transform);
86
			transform.setSourceMetadata(this.store.metadata);
87
			this.notifyChangeToStore();
88
			if (this.isTramsformValues == null
89
					|| (!this.isTramsformValues.booleanValue())) {
90
				if (transform.isTransformsOriginalValues()) {
91
					this.isTramsformValues = Boolean.TRUE;
92
				}
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
                }
93 96

  
94
			}
95
		}
97
            }
98
        }
96 99

  
97
		return transform;
98
	}
100
        return transform;
101
    }
99 102

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

  
101
	public void clear() {
102
		checkEditingMode();
103
		this.transforms.clear();
104
		this.notifyChangeToStore();
105
		this.isTramsformValues = Boolean.FALSE;
106
	}
111
    @Override
112
    public FeatureStoreTransform getTransform(int index) {
113
        return (FeatureStoreTransform) this.transforms.get(index);
114
    }
107 115

  
108
	public FeatureStoreTransform getTransform(int index) {
109
		return (FeatureStoreTransform) this.transforms.get(index);
110
	}
116
    @Override
117
    public Iterator<FeatureStoreTransform> iterator() {
118
        return Collections.unmodifiableList(transforms).iterator();
119
    }
111 120

  
112
	public Iterator iterator() {
113
		return Collections.unmodifiableList(transforms).iterator();
114
	}
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
    }
115 129

  
116
	public Object remove(int index) {
117
		checkEditingMode();
118
		Object trans = this.transforms.remove(index);
119
		this.notifyChangeToStore();
120
		this.isTramsformValues = null;
121
		return trans;
122
	}
130
    @Override
131
    public boolean remove(FeatureStoreTransform transform) {
132
        checkEditingMode();
133
        boolean removed = this.transforms.remove(transform);
134
        if( removed ) {
135
            this.notifyChangeToStore();
123 136

  
124
	public boolean remove(FeatureStoreTransform transform) {
125
		checkEditingMode();
126
		boolean removed = this.transforms.remove(transform);
127
		if (removed) {
128
			this.notifyChangeToStore();
137
        }
138
        this.isTramsformValues = null;
139
        return removed;
129 140

  
130
		}
131
		this.isTramsformValues = null;
132
		return removed;
141
    }
133 142

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

  
136
	public int size() {
137
		return this.transforms.size();
138
	}
148
    @Override
149
    public boolean isEmpty() {
150
        return this.transforms.isEmpty();
151
    }
139 152

  
140
	public boolean isEmpty() {
141
		return this.transforms.isEmpty();
142
	}
153
    private class TransformTemporalListElement {
143 154

  
144
	private class TransformTemporalListElement {
145
		public FeatureStoreTransform transform = null;
146
		public FeatureType targetFeatureType = null;
147
	}
155
        public FeatureStoreTransform transform = null;
156
        public FeatureType targetFeatureType = null;
157
    }
148 158

  
149
	private class TransformTemporalList extends ArrayList {
150
		/**
151
		 * 
152
		 */
153
		private static final long serialVersionUID = 1677014259279944000L;
154
		private FeatureType targetFType;
159
    private class TransformTemporalList
160
        extends ArrayList {
155 161

  
156
		public boolean add(Object arg0) {
157
			if (this.isEmpty()) {
158
				targetFType = ((TransformTemporalListElement) arg0).targetFeatureType;
159
			}
160
			return super.add(arg0);
161
		}
162
        /**
163
         *
164
         */
165
        private static final long serialVersionUID = 1677014259279944000L;
166
        private FeatureType targetFType;
162 167

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

  
165
	protected TransformTemporalList getTransformTemporalList(
166
			FeatureType targetFeatureType) {
167
		if (this.lastTransformStack == null
168
				|| this.lastTransformStack.size() != this.transforms.size()
169
				|| !(this.lastTransformStack.targetFType
170
						.equals(targetFeatureType))) {
171
			TransformTemporalList result = new TransformTemporalList();
172
			TransformTemporalListElement item;
173
			FeatureType nextFType = targetFeatureType;
176
    }
174 177

  
175
			for (int i = transforms.size() - 1; i > -1; i--) {
176
				item = new TransformTemporalListElement();
177
				item.transform = (FeatureStoreTransform) transforms.get(i);
178
				item.targetFeatureType = nextFType;
179
				nextFType = item.transform
180
						.getSourceFeatureTypeFrom(item.targetFeatureType);
181
				result.add(item);
182
			}
183
			this.lastTransformStack = result;
184
		}
185
		return this.lastTransformStack;
186
	}
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;
187 185

  
188
	public Feature applyTransform(DefaultFeature source,
189
			FeatureType targetFeatureType)
190
			throws DataException {
191
		if (this.transforms.isEmpty()) {
192
			return source;
193
		}
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
    }
194 197

  
195
		TransformTemporalList stack = this
196
				.getTransformTemporalList(targetFeatureType);
197
		TransformTemporalListElement item;
198
		FeatureProvider targetData;
199
		EditableFeature target;
200
		ListIterator iterator = stack.listIterator(stack.size());
201
		FeatureType tft = null;
198
    public Feature applyTransform(DefaultFeature source,
199
        FeatureType targetFeatureType)
200
        throws DataException {
201
        if( this.transforms.isEmpty() ) {
202
            return source;
203
        }
202 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;
203 212

  
204
		while (iterator.hasPrevious()) {
205
			item = (TransformTemporalListElement) iterator.previous();
206
			
207
			tft = item.targetFeatureType;
208
			if (tft instanceof EditableFeatureType) {
209
			    /*
213
        while( iterator.hasPrevious() ) {
214
            item = (TransformTemporalListElement) iterator.previous();
215

  
216
            tft = item.targetFeatureType;
217
            if( tft instanceof EditableFeatureType ) {
218
                /*
210 219
			     * Must be non-editable to create 
211 220
			     * DefaultFeatureProvider
212
			     */
213
			    tft = ((EditableFeatureType) tft).getNotEditableCopy();
214
			}
215
			
216
			targetData = this.store.createDefaultFeatureProvider(tft);
217
			targetData.setOID(source.getData().getOID());
218
			targetData.setNew(false);
219
			target = (new DefaultEditableFeature(this.store, targetData))
220
					.getEditable();
221
			item.transform.applyTransform(source, target);
222
 			source = (DefaultFeature) target.getNotEditableCopy();
223
		}
221
                 */
222
                tft = ((EditableFeatureType) tft).getNotEditableCopy();
223
            }
224 224

  
225
		return source;
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
        }
226 232

  
227
	}
233
        return source;
228 234

  
229
	public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
230
		FeatureType tmpFType = targetFeatureType;
235
    }
231 236

  
232
		for (int i = transforms.size() - 1; i > -1; i--) {
233
			FeatureStoreTransform transform = (FeatureStoreTransform) transforms
234
					.get(i);
235
			tmpFType = transform.getSourceFeatureTypeFrom(tmpFType);
236
		}
237
		return tmpFType;
238
	}
237
    public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
238
        FeatureType tmpFType = targetFeatureType;
239 239

  
240
	public FeatureType getDefaultFeatureType() throws DataException {
241
		if (this.transforms.isEmpty()) {
242
			return null;
243
		}
244
		FeatureStoreTransform transform = (FeatureStoreTransform) this.transforms
245
				.get(this.transforms.size() - 1);
246
		return transform.getDefaultFeatureType();
247
	}
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
    }
248 246

  
249
	public List getFeatureTypes() throws DataException {
250
		if (this.transforms.isEmpty()) {
251
			return null;
252
		}
253
		FeatureStoreTransform transform = (FeatureStoreTransform) this.transforms
254
				.get(this.transforms.size() - 1);
255
		return transform.getFeatureTypes();
256
	}
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
    }
257 254

  
258
	public FeatureStore getFeatureStore() {
259
		return this.store;
260
	}
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
    }
261 262

  
262
	public void setFeatureStore(FeatureStore featureStore) {
263
		if (this.store != null) {
264
			throw new IllegalStateException();// FIXME: A�adir tipo especifico.
265
		}
266
		this.store = (DefaultFeatureStore) featureStore;
267
	}
268
	
269
	   
270
	public void setStoreForClone(FeatureStore featureStore) {
271
	        this.store = (DefaultFeatureStore) featureStore;
272
	}
263
    public FeatureStore getFeatureStore() {
264
        return this.store;
265
    }
273 266

  
274
	public boolean isTransformsOriginalValues() {
275
		if (this.isTramsformValues == null) {
276
			Iterator iter = this.transforms.iterator();
277
			FeatureStoreTransform transform;
278
			this.isTramsformValues = Boolean.FALSE;
279
			while (iter.hasNext()) {
280
				transform = (FeatureStoreTransform) iter.next();
281
				if (transform.isTransformsOriginalValues()){
282
					this.isTramsformValues = Boolean.TRUE;
283
					break;
284
				}
285
			}
286
		}
287
		return this.isTramsformValues.booleanValue();
288
	}
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
    }
289 280

  
290
	public FeatureType getFeatureType(String featureTypeId)
291
			throws DataException {
292
		if (this.transforms.isEmpty()) {
293
			return null;
294
		}
295
		if (featureTypeId == null) {
296
			return this.getDefaultFeatureType();
297
		}
298
		Iterator iter = this.getFeatureTypes().iterator();
299
		FeatureType fType;
300
		while (iter.hasNext()) {
301
			fType = (FeatureType) iter.next();
302
			if (fType.getId().equals(featureTypeId)) {
303
				return fType;
304
			}
305
		}
306
		return null;
307
	}
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
    }
308 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
    }
309 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
    }
310 323

  
311
	// *** Persistence ***
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
    }
312 333

  
313
	public void saveToState(PersistentState state) throws PersistenceException {
314
		state.set("store", store);
315
		state.set("isTramsformValues", this.isTramsformValues);
316
		state.set("transforms", this.transforms);
317
	}
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
        );
318 342

  
319
	public void loadFromState(PersistentState state)
320
			throws PersistenceException {
321
		this.isTramsformValues = (Boolean) state.get("isTramsformValues");
322
		this.transforms = (List) state.get("transforms");
323
		this.store = (DefaultFeatureStore) state.get("store");
324
	}
343
        definition.addDynFieldBoolean("isTramsformValues").setMandatory(false);
344
        definition.addDynFieldList("transforms").setClassOfItems(FeatureStoreTransform.class).setMandatory(true);
345
        definition.addDynFieldObject("store").setClassOfValue(FeatureStore.class).setMandatory(false);
325 346

  
326
	public static void registerPersistent() {
327
		DynStruct definition = ToolsLocator.getPersistenceManager().addDefinition(
328
				DefaultFeatureStoreTransforms.class, 
329
				"DefaultFeatureStoreTransforms", 
330
				"DefaultFeatureStoreTransforms Persistent definition",
331
				null, 
332
				null
333
			);
347
    }
334 348

  
335
		definition.addDynFieldBoolean("isTramsformValues").setMandatory(false);
336
		definition.addDynFieldList("transforms").setClassOfItems(FeatureStoreTransform.class).setMandatory(true);
337
		definition.addDynFieldObject("store").setClassOfValue(FeatureStore.class).setMandatory(true);
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
    }
338 358

  
339
	}
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
    }
340 365

  
341
	public Object getDynValue(String name) throws DynFieldNotFoundException {
342
		if( ! this.transforms.isEmpty() ) {
343
			FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size()-1);
344
			if( transform.hasDynValue(name) ) {
345
				return transform.getDynValue(name);
346
			}
347
		}
348
		throw new DynFieldNotFoundException(name, "transforms");
349
	}
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
    }
350 375

  
351
	public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
352
		if( ! this.transforms.isEmpty() ) {
353
			FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size()-1);
354
			transform.setDynValue(name, value);
355
		}
356
	}
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
    }
357 386

  
358
	public boolean hasDynValue(String name) {
359
		if( ! this.transforms.isEmpty() ) {
360
			FeatureStoreTransform transform = (FeatureStoreTransform) transforms.get(this.transforms.size()-1);
361
			if( transform.hasDynValue(name) ) {
362
				return true;
363
			}
364
		}
365
		return false;
366
	}
367
	
368
	public Object clone() throws CloneNotSupportedException {
369
	    
370
	    DefaultFeatureStoreTransforms cloned = (DefaultFeatureStoreTransforms) super.clone();
371
	    cloned.transforms = new ArrayList();
372
	    int n = this.transforms.size();
373
	    for (int i=0; i<n; i++) {
374
	        cloned.transforms.add(((FeatureStoreTransform) this.transforms.get(i)).clone());
375
	    }
376
	    cloned.lastTransformStack = null;
377
	    
378
	    return cloned;
379
	}
380

  
381 387
}

Also available in: Unified diff