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 / FeatureTypeManager.java @ 40435

History | View | Annotate | Download (13.6 KB)

1
/* gvSIG. Sistema de Informaci�n Geogr�fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib��ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41

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

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

    
51
import org.gvsig.fmap.dal.exception.DataException;
52
import org.gvsig.fmap.dal.feature.AbstractFeatureStoreTransform;
53
import org.gvsig.fmap.dal.feature.EditableFeature;
54
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
55
import org.gvsig.fmap.dal.feature.EditableFeatureType;
56
import org.gvsig.fmap.dal.feature.Feature;
57
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
58
import org.gvsig.fmap.dal.feature.FeatureStore;
59
import org.gvsig.fmap.dal.feature.FeatureStoreTransform;
60
import org.gvsig.fmap.dal.feature.FeatureType;
61
import org.gvsig.fmap.dal.feature.impl.expansionadapter.ExpansionAdapter;
62
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider.FeatureTypeChanged;
63
import org.gvsig.tools.persistence.PersistentState;
64
import org.gvsig.tools.persistence.exception.PersistenceException;
65

    
66
/**
67
 * DOCUMENT ME!
68
 *
69
 * @author Vicente Caballero Navarro
70
 */
71
public class FeatureTypeManager {
72
        private ExpansionAdapter expansionAdapter;
73
        private ArrayList deleted = new ArrayList();// <FeatureID>
74
        private int deltaSize = 0;
75
        private HashMap added = new HashMap();
76
        private HashMap modifiedFromOriginal = new HashMap();
77
        private FeatureType originalType = null;
78
        private boolean first = true;
79
        private FeatureTypeManagerFeatureStoreTransforms transforms;
80
        private FeatureStore store;
81

    
82
        public FeatureTypeManager(FeatureStore store,
83
                        ExpansionAdapter expansionAdapter) {
84
                this.expansionAdapter = expansionAdapter;
85
                this.store = store;
86
                this.transforms = new FeatureTypeManagerFeatureStoreTransforms();
87
                this.transforms.setFeatureStore(store);
88
        }
89

    
90
        public void dispose() {
91
                this.expansionAdapter.close();
92
                this.expansionAdapter = null;
93
                this.deleted.clear();
94
                this.deleted = null;
95
                this.transforms.clear();
96
        }
97

    
98
        // public FeatureType delete(String id) {
99
        // deleted.add(id);
100
        // FeatureType type=(FeatureType)added.remove(id);
101
        // if (type==null) {
102
        // type=(FeatureType)modifiedFromOriginal.remove(id);
103
        // }
104
        // deltaSize--;
105
        // return type;
106
        // }
107

    
108
        /**
109
         * DOCUMENT ME!
110
         *
111
         * @param feature
112
         *            DOCUMENT ME!
113
         */
114
        // public void add(FeatureType type) {
115
        // int pos = expansionAdapter.addObject(type);
116
        // added.put(type.getId(),new Integer(pos));
117
        // deltaSize++;
118
        // }
119
        /**
120
         * DOCUMENT ME!
121
         *
122
         * @param id
123
         *            DOCUMENT ME!
124
         */
125
        // public void deleteLastFeatureType() {
126
        // expansionAdapter.deleteLastObject();
127
        // FeatureType
128
        // type=(FeatureType)expansionAdapter.getObject(expansionAdapter.getSize()-1);
129
        // added.remove(type.getId());
130
        // modifiedFromOriginal.remove(type.getId());
131
        // deltaSize--;
132
        // }
133
        /**
134
         * DOCUMENT ME!
135
         *
136
         * @param id
137
         *            DOCUMENT ME!
138
         *
139
         * @return DOCUMENT ME!
140
         * @throws IsNotFeatureSettingException
141
         */
142
        public FeatureType getType(String id) throws DataException {
143
                Integer intNum = ((Integer) added.get(id));
144
                if (intNum == null) {
145
                        intNum = ((Integer) modifiedFromOriginal.get(id));
146
                        if (intNum == null) {
147
                                return null;
148
                        }
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
                }
160

    
161
                FeatureType type = (FeatureType) expansionAdapter.getObject(num);
162
                return type;
163
        }
164

    
165
        /**
166
         * DOCUMENT ME!
167
         *
168
         * @param feature
169
         *            DOCUMENT ME!
170
         * @param oldFeature
171
         *            DOCUMENT ME!
172
         * @throws DataException
173
         */
174
        public int update(FeatureType type, FeatureType oldType) {
175
                // deleted.add(oldType.getId());
176
                if (first) {
177
                        originalType = oldType;
178
                        first = false;
179
                }
180
                int oldNum = -1;
181
                int num = expansionAdapter.addObject(type);
182
                String id = type.getId();
183

    
184
                if (added.containsKey(id)) {
185
                        oldNum = ((Integer) added.get(id)).intValue();
186
                        added.put(id, new Integer(num));
187
                } else {
188
                        if (modifiedFromOriginal.get(id) != null) {
189
                                oldNum = ((Integer) modifiedFromOriginal.get(id)).intValue();
190
                        }
191
                        modifiedFromOriginal.put(id, new Integer(num));
192
                }
193

    
194
                try {
195
                        this.transforms.add(new UpdateFeatureTypeTransform(this.store,
196
                                        oldType, type));
197
                } catch (DataException e) {
198
                        throw new RuntimeException(); // FIXME (pero esto no deberia de
199
                                                                                        // pasar nunca)
200
                }
201
                return oldNum;
202
        }
203

    
204
        private class UpdateFeatureTypeTransform extends AbstractFeatureStoreTransform {
205
                private FeatureType ftSource;
206
                
207
        private EditableFeatureType ftTarget_editable;
208
        private FeatureType ftTarget_non_editable;
209
                
210
                private WeakReference wkRefStore;
211
                private List ftypes = null;
212
                private List attrInSourceToUse;
213

    
214
                UpdateFeatureTypeTransform(FeatureStore featureStore,
215
                                FeatureType ftSource, FeatureType ftTarget) {
216
                        this.ftSource = ftSource;
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

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

    
230
                private void initializeAttributesToUse() {
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

    
240
                        FeatureAttributeDescriptor tAttr, sAttr;
241
                        EditableFeatureAttributeDescriptor ead = null;
242
                        while (iter.hasNext()) {
243
                                tAttr = (FeatureAttributeDescriptor) iter.next();
244
                                sAttr = this.ftSource.getAttributeDescriptor(tAttr.getName());
245
                                if (sAttr == null) {
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
                                    }
259
                                }
260
                                if (tAttr.getDataType() != sAttr.getDataType()) {
261
                                        continue;
262
                                }
263
                                attrInSourceToUse.add(sAttr.getName());
264
                        }
265
                }
266

    
267
                public void applyTransform(Feature source, EditableFeature target)
268
                                throws DataException {
269
                    
270
                        Iterator iter = target.getType().iterator();
271
                        FeatureAttributeDescriptor tAttr;
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;
286
                        while (iter.hasNext()) {
287
                                tAttr = (FeatureAttributeDescriptor) iter.next();
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
                                    }
307
                                } else {
308
                                    /*
309
                                     * If target FT is not editable, use normal name
310
                                     */
311
                                    t_name = tAttr.getName();
312
                                    s_name = t_name;
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
                                }
320
                        }
321
                }
322

    
323
                public FeatureType getDefaultFeatureType() throws DataException {
324
                        return this.ftTarget_non_editable;
325
                }
326

    
327
                public FeatureStore getFeatureStore() {
328
                        return (FeatureStore) this.wkRefStore.get();
329
                }
330

    
331
                public List getFeatureTypes() throws DataException {
332
                        if (this.ftypes == null) {
333
                                this.ftypes = Arrays
334
                                                .asList(new FeatureType[] { this.ftTarget_non_editable });
335
                        }
336
                        return this.ftypes;
337
                }
338

    
339
                public FeatureType getSourceFeatureTypeFrom(
340
                                FeatureType targetFeatureType) {
341
                        EditableFeatureType orgType = ftSource.getEditable();
342
                        Iterator iter = orgType.iterator();
343
                        FeatureAttributeDescriptor attr;
344
                        EditableFeatureAttributeDescriptor efad = null;
345

    
346
                        while (iter.hasNext()) {
347
                                attr = (FeatureAttributeDescriptor) iter.next();
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
                                    }
358
                                }
359
                        }
360
                        return orgType.getNotEditableCopy();
361
                }
362

    
363
                public void setFeatureStore(FeatureStore featureStore) {
364
                        this.wkRefStore = new WeakReference(featureStore);
365
                }
366

    
367
                public boolean isTransformsOriginalValues() {
368
                        return false;
369
                }
370

    
371
        }
372

    
373
        /**
374
         * DOCUMENT ME!
375
         *
376
         * @param id
377
         *            DOCUMENT ME!
378
         */
379
        public void restore(String id) {
380
                deleted.remove(id);
381
                deltaSize++;
382
        }
383

    
384
        public void restore(String id, int num) {
385
                if (added.containsKey(id)) {
386
                        added.put(id, new Integer(num));
387
                } else {
388
                        modifiedFromOriginal.put(id, new Integer(num));
389
                }
390
        }
391

    
392
        public boolean isDeleted(FeatureType type) {
393
                return deleted.contains(type.getId());
394
        }
395

    
396
        public boolean isDeleted(String id) {
397
                return deleted.contains(id);
398
        }
399

    
400
        public void clear() {
401
                added.clear();
402
                modifiedFromOriginal.clear();
403
                expansionAdapter.close();
404
                deleted.clear();// <FeatureID>
405
                deltaSize = 0;
406
        }
407

    
408
        public boolean hasChanges() {
409
                return added.size() > 0 || modifiedFromOriginal.size() > 0
410
                                || deleted.size() > 0;
411
        }
412

    
413
        public Iterator newsIterator() {
414
                return added.values().iterator();
415
        }
416

    
417
        public boolean hasNews() {
418
                return !added.isEmpty();
419
        }
420

    
421
        public long getDeltaSize() {
422
                return deltaSize;
423
        }
424

    
425
        public FeatureType getOriginalFeatureType() {
426
                return originalType;
427
        }
428

    
429
        public DefaultFeatureStoreTransforms getTransforms() {
430
                return this.transforms;
431
        }
432

    
433
        public class FeatureTypeManagerFeatureStoreTransforms extends
434
                        DefaultFeatureStoreTransforms {
435

    
436
                private FeatureTypeManagerFeatureStoreTransforms() {
437

    
438
                }
439

    
440
                protected void checkEditingMode() {
441
                        return;
442
                }
443

    
444
                protected void notifyChangeToStore() {
445
                        return;
446
                }
447

    
448
                public PersistentState getState() throws PersistenceException {
449
                        // FIXME
450
                        throw new UnsupportedOperationException();
451
                }
452

    
453
                public void loadState(PersistentState state)
454
                                throws PersistenceException {
455
                        // FIXME
456
                        throw new UnsupportedOperationException();
457
                }
458

    
459
                public void loadFromState(PersistentState state) throws PersistenceException {
460
                        // FIXME
461
                        throw new UnsupportedOperationException();
462
                }
463

    
464
                public FeatureStoreTransform add(FeatureStoreTransform transform)
465
                                throws DataException {
466
                        if (!(transform instanceof UpdateFeatureTypeTransform)) {
467
                                // FIXME
468
                                throw new IllegalArgumentException();
469
                        }
470
                        return super.add(transform);
471
                }
472

    
473
        }
474

    
475
        public class FeatureTypesChangedItem implements FeatureTypeChanged {
476

    
477
                private FeatureType source;
478
                private FeatureType target;
479

    
480
                public FeatureTypesChangedItem(FeatureType source, FeatureType target) {
481
                        this.source = source;
482
                        this.target = target;
483
                }
484

    
485
                public FeatureType getSource() {
486
                        return source;
487
                }
488

    
489
                public FeatureType getTarget() {
490
                        return target;
491
                }
492

    
493
        }
494

    
495
        public Iterator getFeatureTypesChanged() throws DataException {
496
                // FIXME this don't work for Store.fType.size() > 1
497
                List list = new ArrayList();
498
                if (modifiedFromOriginal.size() > 0) {
499
                        FeatureType src = this.getOriginalFeatureType();
500
                        list.add(new FeatureTypesChangedItem(src, this.store
501
                                        .getFeatureType(src.getId())));
502
                }
503
                return list.iterator();
504
        }
505

    
506
}