Revision 26252 branches/v2_0_0_prep/libraries/libFMap_dal/src/org/gvsig/fmap/dal/feature/impl/FeatureTypeManager.java

View differences:

FeatureTypeManager.java
41 41

  
42 42
package org.gvsig.fmap.dal.feature.impl;
43 43

  
44
import java.lang.ref.WeakReference;
44 45
import java.util.ArrayList;
46
import java.util.Arrays;
45 47
import java.util.HashMap;
46 48
import java.util.Iterator;
49
import java.util.List;
47 50

  
48 51
import org.gvsig.fmap.dal.exception.DataException;
52
import org.gvsig.fmap.dal.feature.EditableFeature;
53
import org.gvsig.fmap.dal.feature.EditableFeatureType;
54
import org.gvsig.fmap.dal.feature.Feature;
55
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
56
import org.gvsig.fmap.dal.feature.FeatureStore;
57
import org.gvsig.fmap.dal.feature.FeatureStoreTransform;
49 58
import org.gvsig.fmap.dal.feature.FeatureType;
50 59
import org.gvsig.fmap.dal.feature.impl.expansionadapter.ExpansionAdapter;
60
import org.gvsig.tools.persistence.PersistenceException;
61
import org.gvsig.tools.persistence.PersistentState;
51 62

  
52

  
53 63
/**
54 64
 * DOCUMENT ME!
55 65
 *
56 66
 * @author Vicente Caballero Navarro
57 67
 */
58 68
public class FeatureTypeManager {
59
    private ExpansionAdapter expansionAdapter;
60
    private ArrayList deleted = new ArrayList();//<FeatureID>
61
    private int deltaSize=0;
62
	private HashMap added=new HashMap();
63
	private HashMap modifiedFromOriginal=new HashMap();
64
	private FeatureType originalType=null;
65
	private boolean first=true;
66
    public FeatureTypeManager(ExpansionAdapter expansionAdapter){
67
    	this.expansionAdapter=expansionAdapter;
68
    }
69
	private ExpansionAdapter expansionAdapter;
70
	private ArrayList deleted = new ArrayList();// <FeatureID>
71
	private int deltaSize = 0;
72
	private HashMap added = new HashMap();
73
	private HashMap modifiedFromOriginal = new HashMap();
74
	private FeatureType originalType = null;
75
	private boolean first = true;
76
	private FeatureTypeManagerFeatureStoreTransforms transforms;
77
	private FeatureStore store;
69 78

  
79
	public FeatureTypeManager(FeatureStore store,
80
			ExpansionAdapter expansionAdapter) {
81
		this.expansionAdapter = expansionAdapter;
82
		this.store = store;
83
		this.transforms = new FeatureTypeManagerFeatureStoreTransforms();
84
		this.transforms.setFeatureStore(store);
85
	}
70 86

  
71
//    public FeatureType delete(String id) {
72
//        deleted.add(id);
73
//        FeatureType type=(FeatureType)added.remove(id);
74
//        if (type==null) {
75
//			type=(FeatureType)modifiedFromOriginal.remove(id);
76
//		}
77
//        deltaSize--;
78
//        return type;
79
//    }
87
	public void dispose() {
88
		this.expansionAdapter.close();
89
		this.expansionAdapter = null;
90
		this.deleted.clear();
91
		this.deleted = null;
92
		this.transforms.clear();
93
	}
80 94

  
81
    /**
82
     * DOCUMENT ME!
83
     *
84
     * @param feature DOCUMENT ME!
85
     */
86
//    public void add(FeatureType type) {
87
//        int pos = expansionAdapter.addObject(type);
88
//        added.put(type.getId(),new Integer(pos));
89
//        deltaSize++;
90
//    }
95
	// public FeatureType delete(String id) {
96
	// deleted.add(id);
97
	// FeatureType type=(FeatureType)added.remove(id);
98
	// if (type==null) {
99
	// type=(FeatureType)modifiedFromOriginal.remove(id);
100
	// }
101
	// deltaSize--;
102
	// return type;
103
	// }
91 104

  
92
    /**
93
     * DOCUMENT ME!
94
     *
95
     * @param id DOCUMENT ME!
96
     */
97
//    public void deleteLastFeatureType() {
98
//        expansionAdapter.deleteLastObject();
99
//        FeatureType type=(FeatureType)expansionAdapter.getObject(expansionAdapter.getSize()-1);
100
//        added.remove(type.getId());
101
//        modifiedFromOriginal.remove(type.getId());
102
//        deltaSize--;
103
//    }
105
	/**
106
	 * DOCUMENT ME!
107
	 *
108
	 * @param feature
109
	 *            DOCUMENT ME!
110
	 */
111
	// public void add(FeatureType type) {
112
	// int pos = expansionAdapter.addObject(type);
113
	// added.put(type.getId(),new Integer(pos));
114
	// deltaSize++;
115
	// }
116
	/**
117
	 * DOCUMENT ME!
118
	 *
119
	 * @param id
120
	 *            DOCUMENT ME!
121
	 */
122
	// public void deleteLastFeatureType() {
123
	// expansionAdapter.deleteLastObject();
124
	// FeatureType
125
	// type=(FeatureType)expansionAdapter.getObject(expansionAdapter.getSize()-1);
126
	// added.remove(type.getId());
127
	// modifiedFromOriginal.remove(type.getId());
128
	// deltaSize--;
129
	// }
130
	/**
131
	 * DOCUMENT ME!
132
	 *
133
	 * @param id
134
	 *            DOCUMENT ME!
135
	 *
136
	 * @return DOCUMENT ME!
137
	 * @throws IsNotFeatureSettingException
138
	 */
139
	public FeatureType getType(String id) throws DataException {
140
		Integer intNum = ((Integer) added.get(id));
141
		if (intNum == null) {
142
			intNum = ((Integer) modifiedFromOriginal.get(id));
143
			if (intNum == null) {
144
				return null;
145
			}
146
		}
147
		int num = intNum.intValue();
104 148

  
105
    /**
106
     * DOCUMENT ME!
107
     *
108
     * @param id DOCUMENT ME!
109
     *
110
     * @return DOCUMENT ME!
111
     * @throws IsNotFeatureSettingException
112
     */
113
    public FeatureType getType(String id) throws DataException {
114
    	Integer intNum =((Integer) added.get(id));
115
    	if (intNum == null){
116
    		intNum =((Integer) modifiedFromOriginal.get(id));
117
        	if (intNum == null){
118
        		return null;
119
        	}
120
    	}
121
        int num = intNum.intValue();
149
		FeatureType type = (FeatureType) expansionAdapter.getObject(num);
150
		return type;
151
	}
122 152

  
123
        FeatureType type=(FeatureType)expansionAdapter.getObject(num);
124
        return type;
125
    }
153
	/**
154
	 * DOCUMENT ME!
155
	 *
156
	 * @param feature
157
	 *            DOCUMENT ME!
158
	 * @param oldFeature
159
	 *            DOCUMENT ME!
160
	 * @throws DataException
161
	 */
162
	public int update(FeatureType type, FeatureType oldType) {
163
		// deleted.add(oldType.getId());
164
		if (first) {
165
			originalType = oldType;
166
			first = false;
167
		}
168
		int oldNum = -1;
169
		int num = expansionAdapter.addObject(type);
170
		String id = type.getId();
126 171

  
172
		if (added.containsKey(id)) {
173
			oldNum = ((Integer) added.get(id)).intValue();
174
			added.put(id, new Integer(num));
175
		} else {
176
			if (modifiedFromOriginal.get(id) != null) {
177
				oldNum = ((Integer) modifiedFromOriginal.get(id)).intValue();
178
			}
179
			modifiedFromOriginal.put(id, new Integer(num));
180
		}
181

  
182
		try {
183
			this.transforms.add(new UpdateFeatureTypeTransform(this.store,
184
					type, oldType));
185
		} catch (DataException e) {
186
			throw new RuntimeException(); // FIXME (pero esto no deberia de
187
											// pasar nunca)
188
		}
189
		return oldNum;
190
	}
191

  
192
	class UpdateFeatureTypeTransform implements FeatureStoreTransform {
193
		private FeatureType ftSource;
194
		private FeatureType ftTarget;
195
		private WeakReference wkRefStore;
196
		private List ftypes = null;
197
		private List attrToUse;
198

  
199
		public UpdateFeatureTypeTransform(FeatureStore featureStore,
200
				FeatureType ftSource, FeatureType ftTarget) {
201
			this.ftSource = ftSource;
202
			this.ftTarget = ftTarget;
203
			this.wkRefStore = new WeakReference(featureStore);
204
			this.initializeAttributesToUse();
205
		}
206

  
207
		private void initializeAttributesToUse() {
208
			attrToUse = new ArrayList(ftTarget.size());
209
			Iterator iter = ftTarget.iterator();
210
			FeatureAttributeDescriptor tAttr, sAttr;
211
			while (iter.hasNext()) {
212
				tAttr = (FeatureAttributeDescriptor) iter.next();
213
				sAttr = this.ftSource.getAttributeDescriptor(tAttr.getName());
214
				if (sAttr == null){
215
					continue;
216
				}
217
				if (tAttr.getDataType() != sAttr.getDataType()){
218
					continue;
219
				}
220
				attrToUse.add(tAttr.getName());
221

  
222
			}
223

  
224
		}
225

  
226
		public void applyTransform(Feature source, EditableFeature target)
227
				throws DataException {
228
			Iterator iter = target.getType().iterator();
229
			FeatureAttributeDescriptor tAttr;
230
			String name;
231
			while (iter.hasNext()) {
232
				tAttr = (FeatureAttributeDescriptor) iter.next();
233
				name = tAttr.getName();
234
				if (this.attrToUse.contains(name)) {
235
					target.set(name, source.get(name));
236
				} else {
237
					target.set(name, tAttr.getDefaultValue());
238
				}
239
			}
240
		}
241

  
242
		public FeatureType getDefaultFeatureType() throws DataException {
243
			return this.ftTarget;
244
		}
245

  
246
		public FeatureStore getFeatureStore() {
247
			return (FeatureStore) this.wkRefStore.get();
248
		}
249

  
250
		public List getFeatureTypes() throws DataException {
251
			if (this.ftypes == null) {
252
				this.ftypes = Arrays
253
						.asList(new FeatureType[] { this.ftTarget });
254
			}
255
			return this.ftypes;
256
		}
257

  
258
		public FeatureType getSourceFeatureTypeFrom(
259
				FeatureType targetFeatureType) {
260
			EditableFeatureType orgType = ftSource.getEditable();
261
			Iterator iter = orgType.iterator();
262
			FeatureAttributeDescriptor attr;
263

  
264
			while (iter.hasNext()) {
265
				attr = (FeatureAttributeDescriptor) iter.next();
266
				if (!attrToUse.contains(attr.getName())) {
267
					iter.remove();
268
				}
269
			}
270

  
271
			return orgType.getNotEditableCopy();
272
		}
273

  
274
		public void setFeatureStore(FeatureStore featureStore) {
275
			this.wkRefStore = new WeakReference(featureStore);
276
		}
277

  
278
		public PersistentState getState() throws PersistenceException {
279
			// FIXME
280
			throw new UnsupportedOperationException();
281
		}
282

  
283
		public void loadState(PersistentState state)
284
				throws PersistenceException {
285
			// FIXME
286
			throw new UnsupportedOperationException();
287
		}
288

  
289
		public void setState(PersistentState state) throws PersistenceException {
290
			// FIXME
291
			throw new UnsupportedOperationException();
292
		}
293

  
294
	}
295

  
127 296
	/**
128
     * DOCUMENT ME!
129
     *
130
     * @param feature DOCUMENT ME!
131
     * @param oldFeature DOCUMENT ME!
132
     */
133
    public int update(FeatureType type, FeatureType oldType) {
134
//        deleted.add(oldType.getId());
135
    	if (first){
136
    		originalType=oldType;
137
    		first=false;
138
    	}
139
    	int oldNum=-1;
140
        int num = expansionAdapter.addObject(type);
141
        String id=type.getId();
297
	 * DOCUMENT ME!
298
	 *
299
	 * @param id
300
	 *            DOCUMENT ME!
301
	 */
302
	public void restore(String id) {
303
		deleted.remove(id);
304
		deltaSize++;
305
	}
142 306

  
143
        if (added.containsKey(id)){
144
        	oldNum=((Integer)added.get(id)).intValue();
145
        	added.put(id,new Integer(num));
146
        }else{
147
        	if (modifiedFromOriginal.get(id)!=null)
148
        		oldNum=((Integer)modifiedFromOriginal.get(id)).intValue();
149
        	modifiedFromOriginal.put(id,new Integer(num));
150
        }
151
        return oldNum;
152
    }
307
	public void restore(String id, int num) {
308
		if (added.containsKey(id)) {
309
			added.put(id, new Integer(num));
310
		} else {
311
			modifiedFromOriginal.put(id, new Integer(num));
312
		}
313
	}
153 314

  
154
    /**
155
     * DOCUMENT ME!
156
     *
157
     * @param id DOCUMENT ME!
158
     */
159
    public void restore(String id) {
160
        deleted.remove(id);
161
        deltaSize++;
162
    }
163
    public void restore(String id,int num){
164
    	if (added.containsKey(id)){
165
        	added.put(id,new Integer(num));
166
        }else{
167
        	modifiedFromOriginal.put(id,new Integer(num));
168
        }
169
    }
315
	public boolean isDeleted(FeatureType type) {
316
		return deleted.contains(type.getId());
317
	}
170 318

  
171
    public boolean isDeleted(FeatureType type){
172
    	return deleted.contains(type.getId());
173
    }
174

  
175
    public boolean isDeleted(String id) {
319
	public boolean isDeleted(String id) {
176 320
		return deleted.contains(id);
177 321
	}
178 322

  
179 323
	public void clear() {
180 324
		added.clear();
181 325
		modifiedFromOriginal.clear();
182
	    expansionAdapter.close();
183
	    deleted.clear();//<FeatureID>
184
	    deltaSize=0;
326
		expansionAdapter.close();
327
		deleted.clear();// <FeatureID>
328
		deltaSize = 0;
185 329
	}
186 330

  
187

  
188 331
	public boolean hasChanges() {
189
		return added.size()>0 || modifiedFromOriginal.size() > 0 || deleted.size() > 0;
332
		return added.size() > 0 || modifiedFromOriginal.size() > 0
333
				|| deleted.size() > 0;
190 334
	}
191 335

  
192 336
	public Iterator newsIterator() {
193 337
		return added.values().iterator();
194 338
	}
195 339

  
196

  
197 340
	public boolean hasNews() {
198 341
		return !added.isEmpty();
199 342
	}
......
202 345
		return deltaSize;
203 346
	}
204 347

  
205

  
206 348
	public FeatureType getOriginalFeatureType() {
207 349
		return originalType;
208 350
	}
351

  
352
	public DefaultFeatureStoreTransforms getTransforms() {
353
		return this.transforms;
354
	}
355

  
356
	class FeatureTypeManagerFeatureStoreTransforms extends
357
			DefaultFeatureStoreTransforms {
358

  
359
		protected void checkEditingMode() {
360
			return;
361
		}
362

  
363
		protected void notifyChangeToStore() {
364
			return;
365
		}
366

  
367
		public PersistentState getState() throws PersistenceException {
368
			// FIXME
369
			throw new UnsupportedOperationException();
370
		}
371

  
372
		public void loadState(PersistentState state)
373
				throws PersistenceException {
374
			// FIXME
375
			throw new UnsupportedOperationException();
376
		}
377

  
378
		public void setState(PersistentState state) throws PersistenceException {
379
			// FIXME
380
			throw new UnsupportedOperationException();
381
		}
382

  
383
	}
209 384
}
210

  

Also available in: Unified diff