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

View differences:

FeatureTypeManager.java
51 51
import org.gvsig.fmap.dal.exception.DataException;
52 52
import org.gvsig.fmap.dal.feature.AbstractFeatureStoreTransform;
53 53
import org.gvsig.fmap.dal.feature.EditableFeature;
54
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
54 55
import org.gvsig.fmap.dal.feature.EditableFeatureType;
55 56
import org.gvsig.fmap.dal.feature.Feature;
56 57
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
......
147 148
			}
148 149
		}
149 150
		int num = intNum.intValue();
151
		
152
		if (num == -1) {
153
		    /*
154
		     * This happens for example when we are going back to the
155
		     * original feature type which is not managed by
156
		     * expansionAdapter
157
		     */
158
		    return null;
159
		}
150 160

  
151 161
		FeatureType type = (FeatureType) expansionAdapter.getObject(num);
152 162
		return type;
......
193 203

  
194 204
	private class UpdateFeatureTypeTransform extends AbstractFeatureStoreTransform {
195 205
		private FeatureType ftSource;
196
		private FeatureType ftTarget;
206
		
207
        private EditableFeatureType ftTarget_editable;
208
        private FeatureType ftTarget_non_editable;
209
		
197 210
		private WeakReference wkRefStore;
198 211
		private List ftypes = null;
199
		private List attrToUse;
212
		private List attrInSourceToUse;
200 213

  
201 214
		UpdateFeatureTypeTransform(FeatureStore featureStore,
202 215
				FeatureType ftSource, FeatureType ftTarget) {
203 216
			this.ftSource = ftSource;
204
			this.ftTarget = ftTarget;
217
			
218
			if (ftTarget instanceof EditableFeatureType) {
219
			    
220
			    ftTarget_editable = (EditableFeatureType) ftTarget;
221
			    ftTarget_non_editable = ftTarget_editable.getNotEditableCopy();
222
			} else {
223
			    ftTarget_non_editable = ftTarget;
224
			}
225

  
205 226
			this.wkRefStore = new WeakReference(featureStore);
206 227
			this.initializeAttributesToUse();
207 228
		}
208 229

  
209 230
		private void initializeAttributesToUse() {
210
			attrToUse = new ArrayList(ftTarget.size());
211
			Iterator iter = ftTarget.iterator();
231
		    attrInSourceToUse = new ArrayList();
232
		    
233
		    Iterator iter = null;
234
		    if (ftTarget_editable != null) {
235
		        iter = ftTarget_editable.iterator();
236
		    } else {
237
		        iter = ftTarget_non_editable.iterator();
238
		    }
239

  
212 240
			FeatureAttributeDescriptor tAttr, sAttr;
241
			EditableFeatureAttributeDescriptor ead = null;
213 242
			while (iter.hasNext()) {
214 243
				tAttr = (FeatureAttributeDescriptor) iter.next();
215 244
				sAttr = this.ftSource.getAttributeDescriptor(tAttr.getName());
216 245
				if (sAttr == null) {
217
					continue;
246
				    if (tAttr instanceof EditableFeatureAttributeDescriptor) {
247
				        ead = (EditableFeatureAttributeDescriptor) tAttr;
248
				        if (ead.getOriginalName() != null) {
249
				            sAttr = this.ftSource.getAttributeDescriptor(ead.getOriginalName());
250
	                        if (sAttr == null) {
251
	                            continue;
252
	                        }
253
				        } else {
254
				            continue;
255
				        }
256
				    } else {
257
				        continue;
258
				    }
218 259
				}
219 260
				if (tAttr.getDataType() != sAttr.getDataType()) {
220 261
					continue;
221 262
				}
222
				attrToUse.add(tAttr.getName());
223

  
263
				attrInSourceToUse.add(sAttr.getName());
224 264
			}
225

  
226 265
		}
227 266

  
228 267
		public void applyTransform(Feature source, EditableFeature target)
229 268
				throws DataException {
269
		    
230 270
			Iterator iter = target.getType().iterator();
231 271
			FeatureAttributeDescriptor tAttr;
232
			String name;
272
			FeatureAttributeDescriptor tAttr_edi;
273
			
274
			/*
275
			 * field name in source feature
276
			 */
277
            String s_name;
278
            
279
            /*
280
             * field name in target feature (the same as in source
281
             * except if renamed)
282
             */
283
            String t_name;
284
			
285
			EditableFeatureAttributeDescriptor eatd = null;
233 286
			while (iter.hasNext()) {
234 287
				tAttr = (FeatureAttributeDescriptor) iter.next();
235
				name = tAttr.getName();
236
				if (source.getType().get(name) != null) {
237
					target.set(name, source.get(name));
288
				
289
				if (ftTarget_editable != null) {
290
				    /*
291
				     * If target FT is editable, try to get original name
292
				     */
293
				    t_name = tAttr.getName();
294
				    s_name = t_name;
295
				    tAttr_edi = ftTarget_editable.getAttributeDescriptor(t_name);
296
				    if (tAttr_edi instanceof EditableFeatureAttributeDescriptor) {
297
				        eatd = (EditableFeatureAttributeDescriptor) tAttr_edi;
298
				        s_name = eatd.getOriginalName();
299
				    }
300
				    
301
				    /*
302
				     * If not found, use normal name
303
				     */
304
				    if (s_name == null) {
305
				        s_name = tAttr.getName();
306
				    }
238 307
				} else {
239
					target.set(name, tAttr.getDefaultValue());
308
				    /*
309
				     * If target FT is not editable, use normal name
310
				     */
311
				    t_name = tAttr.getName();
312
				    s_name = t_name;
240 313
				}
314
				
315
				if (source.getType().get(s_name) != null) {
316
					target.set(t_name, source.get(s_name));
317
				} else {
318
					target.set(t_name, tAttr.getDefaultValue());
319
				}
241 320
			}
242 321
		}
243 322

  
244 323
		public FeatureType getDefaultFeatureType() throws DataException {
245
			return this.ftTarget;
324
			return this.ftTarget_non_editable;
246 325
		}
247 326

  
248 327
		public FeatureStore getFeatureStore() {
......
252 331
		public List getFeatureTypes() throws DataException {
253 332
			if (this.ftypes == null) {
254 333
				this.ftypes = Arrays
255
						.asList(new FeatureType[] { this.ftTarget });
334
						.asList(new FeatureType[] { this.ftTarget_non_editable });
256 335
			}
257 336
			return this.ftypes;
258 337
		}
......
262 341
			EditableFeatureType orgType = ftSource.getEditable();
263 342
			Iterator iter = orgType.iterator();
264 343
			FeatureAttributeDescriptor attr;
344
			EditableFeatureAttributeDescriptor efad = null;
265 345

  
266 346
			while (iter.hasNext()) {
267 347
				attr = (FeatureAttributeDescriptor) iter.next();
268
				if (!attrToUse.contains(attr.getName())) {
269
					iter.remove();
348
				if (!attrInSourceToUse.contains(attr.getName())) {
349
				    if (attr instanceof EditableFeatureAttributeDescriptor) {
350
				        efad = (EditableFeatureAttributeDescriptor) attr;
351
				        if (efad.getOriginalName() != null &&
352
				            !attrInSourceToUse.contains(efad.getOriginalName())) {
353
				            iter.remove();
354
				        }
355
				    } else {
356
				        iter.remove();
357
				    }
270 358
				}
271 359
			}
272

  
273 360
			return orgType.getNotEditableCopy();
274 361
		}
275 362

  

Also available in: Unified diff