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

History | View | Annotate | Download (13.3 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.lang.ref.WeakReference;
27
import java.util.ArrayList;
28
import java.util.Arrays;
29
import java.util.HashMap;
30
import java.util.Iterator;
31
import java.util.List;
32

    
33
import org.gvsig.fmap.dal.exception.DataException;
34
import org.gvsig.fmap.dal.feature.AbstractFeatureStoreTransform;
35
import org.gvsig.fmap.dal.feature.EditableFeature;
36
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
37
import org.gvsig.fmap.dal.feature.EditableFeatureType;
38
import org.gvsig.fmap.dal.feature.Feature;
39
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
40
import org.gvsig.fmap.dal.feature.FeatureStore;
41
import org.gvsig.fmap.dal.feature.FeatureStoreTransform;
42
import org.gvsig.fmap.dal.feature.FeatureType;
43
import org.gvsig.fmap.dal.feature.impl.expansionadapter.ExpansionAdapter;
44
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider.FeatureTypeChanged;
45
import org.gvsig.tools.persistence.PersistentState;
46
import org.gvsig.tools.persistence.exception.PersistenceException;
47

    
48
/**
49
 * DOCUMENT ME!
50
 *
51
 * @author Vicente Caballero Navarro
52
 */
53
public class FeatureTypeManager {
54
        private ExpansionAdapter expansionAdapter;
55
        private ArrayList deleted = new ArrayList();// <FeatureID>
56
        private int deltaSize = 0;
57
        private HashMap added = new HashMap();
58
        private HashMap modifiedFromOriginal = new HashMap();
59
        private FeatureType originalType = null;
60
        private boolean first = true;
61
        private FeatureTypeManagerFeatureStoreTransforms transforms;
62
        private FeatureStore store;
63

    
64
        public FeatureTypeManager(FeatureStore store,
65
                        ExpansionAdapter expansionAdapter) {
66
                this.expansionAdapter = expansionAdapter;
67
                this.store = store;
68
                this.transforms = new FeatureTypeManagerFeatureStoreTransforms();
69
                this.transforms.setFeatureStore(store);
70
        }
71

    
72
        public void dispose() {
73
                this.expansionAdapter.close();
74
                this.expansionAdapter = null;
75
                this.deleted.clear();
76
                this.deleted = null;
77
                this.transforms.clear();
78
        }
79

    
80
        // public FeatureType delete(String id) {
81
        // deleted.add(id);
82
        // FeatureType type=(FeatureType)added.remove(id);
83
        // if (type==null) {
84
        // type=(FeatureType)modifiedFromOriginal.remove(id);
85
        // }
86
        // deltaSize--;
87
        // return type;
88
        // }
89

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

    
143
                FeatureType type = (FeatureType) expansionAdapter.getObject(num);
144
                return type;
145
        }
146

    
147
        /**
148
         * DOCUMENT ME!
149
         *
150
         * @param feature
151
         *            DOCUMENT ME!
152
         * @param oldFeature
153
         *            DOCUMENT ME!
154
         * @throws DataException
155
         */
156
        public int update(FeatureType type, FeatureType oldType) {
157
                // deleted.add(oldType.getId());
158
                if (first) {
159
                        originalType = oldType;
160
                        first = false;
161
                }
162
                int oldNum = -1;
163
                int num = expansionAdapter.addObject(type);
164
                String id = type.getId();
165

    
166
                if (added.containsKey(id)) {
167
                        oldNum = ((Integer) added.get(id)).intValue();
168
                        added.put(id, new Integer(num));
169
                } else {
170
                        if (modifiedFromOriginal.get(id) != null) {
171
                                oldNum = ((Integer) modifiedFromOriginal.get(id)).intValue();
172
                        }
173
                        modifiedFromOriginal.put(id, new Integer(num));
174
                }
175

    
176
                try {
177
                        this.transforms.add(new UpdateFeatureTypeTransform(this.store,
178
                                        oldType, type));
179
                } catch (DataException e) {
180
                        throw new RuntimeException(); // FIXME (pero esto no deberia de
181
                                                                                        // pasar nunca)
182
                }
183
                return oldNum;
184
        }
185

    
186
        private class UpdateFeatureTypeTransform extends AbstractFeatureStoreTransform {
187
                private FeatureType ftSource;
188
                
189
        private EditableFeatureType ftTarget_editable;
190
        private FeatureType ftTarget_non_editable;
191
                
192
                private WeakReference wkRefStore;
193
                private List ftypes = null;
194
                private List attrInSourceToUse;
195

    
196
                UpdateFeatureTypeTransform(FeatureStore featureStore,
197
                                FeatureType ftSource, FeatureType ftTarget) {
198
                        this.ftSource = ftSource;
199
                        
200
                        if (ftTarget instanceof EditableFeatureType) {
201
                            
202
                            ftTarget_editable = (EditableFeatureType) ftTarget;
203
                            ftTarget_non_editable = ftTarget_editable.getNotEditableCopy();
204
                        } else {
205
                            ftTarget_non_editable = ftTarget;
206
                        }
207

    
208
                        this.wkRefStore = new WeakReference(featureStore);
209
                        this.initializeAttributesToUse();
210
                }
211

    
212
                private void initializeAttributesToUse() {
213
                    attrInSourceToUse = new ArrayList();
214
                    
215
                    Iterator iter = null;
216
                    if (ftTarget_editable != null) {
217
                        iter = ftTarget_editable.iterator();
218
                    } else {
219
                        iter = ftTarget_non_editable.iterator();
220
                    }
221

    
222
                        FeatureAttributeDescriptor tAttr, sAttr;
223
                        EditableFeatureAttributeDescriptor ead = null;
224
                        while (iter.hasNext()) {
225
                                tAttr = (FeatureAttributeDescriptor) iter.next();
226
                                sAttr = this.ftSource.getAttributeDescriptor(tAttr.getName());
227
                                if (sAttr == null) {
228
                                    if (tAttr instanceof EditableFeatureAttributeDescriptor) {
229
                                        ead = (EditableFeatureAttributeDescriptor) tAttr;
230
                                        if (ead.getOriginalName() != null) {
231
                                            sAttr = this.ftSource.getAttributeDescriptor(ead.getOriginalName());
232
                                if (sAttr == null) {
233
                                    continue;
234
                                }
235
                                        } else {
236
                                            continue;
237
                                        }
238
                                    } else {
239
                                        continue;
240
                                    }
241
                                }
242
                                if (tAttr.getDataType() != sAttr.getDataType()) {
243
                                        continue;
244
                                }
245
                                attrInSourceToUse.add(sAttr.getName());
246
                        }
247
                }
248

    
249
                public void applyTransform(Feature source, EditableFeature target)
250
                                throws DataException {
251
                    
252
                        Iterator iter = target.getType().iterator();
253
                        FeatureAttributeDescriptor tAttr;
254
                        FeatureAttributeDescriptor tAttr_edi;
255
                        
256
                        /*
257
                         * field name in source feature
258
                         */
259
            String s_name;
260
            
261
            /*
262
             * field name in target feature (the same as in source
263
             * except if renamed)
264
             */
265
            String t_name;
266
                        
267
                        EditableFeatureAttributeDescriptor eatd = null;
268
                        while (iter.hasNext()) {
269
                                tAttr = (FeatureAttributeDescriptor) iter.next();
270
                                
271
                                if (ftTarget_editable != null) {
272
                                    /*
273
                                     * If target FT is editable, try to get original name
274
                                     */
275
                                    t_name = tAttr.getName();
276
                                    s_name = t_name;
277
                                    tAttr_edi = ftTarget_editable.getAttributeDescriptor(t_name);
278
                                    if (tAttr_edi instanceof EditableFeatureAttributeDescriptor) {
279
                                        eatd = (EditableFeatureAttributeDescriptor) tAttr_edi;
280
                                        s_name = eatd.getOriginalName();
281
                                    }
282
                                    
283
                                    /*
284
                                     * If not found, use normal name
285
                                     */
286
                                    if (s_name == null) {
287
                                        s_name = tAttr.getName();
288
                                    }
289
                                } else {
290
                                    /*
291
                                     * If target FT is not editable, use normal name
292
                                     */
293
                                    t_name = tAttr.getName();
294
                                    s_name = t_name;
295
                                }
296
                                
297
                                if (source.getType().get(s_name) != null) {
298
                                        target.set(t_name, source.get(s_name));
299
                                } else {
300
                                        target.set(t_name, tAttr.getDefaultValue());
301
                                }
302
                        }
303
                }
304

    
305
                public FeatureType getDefaultFeatureType() throws DataException {
306
                        return this.ftTarget_non_editable;
307
                }
308

    
309
                public FeatureStore getFeatureStore() {
310
                        return (FeatureStore) this.wkRefStore.get();
311
                }
312

    
313
                public List getFeatureTypes() throws DataException {
314
                        if (this.ftypes == null) {
315
                                this.ftypes = Arrays
316
                                                .asList(new FeatureType[] { this.ftTarget_non_editable });
317
                        }
318
                        return this.ftypes;
319
                }
320

    
321
                public FeatureType getSourceFeatureTypeFrom(
322
                                FeatureType targetFeatureType) {
323
                        EditableFeatureType orgType = ftSource.getEditable();
324
                        Iterator iter = orgType.iterator();
325
                        FeatureAttributeDescriptor attr;
326
                        EditableFeatureAttributeDescriptor efad = null;
327

    
328
                        while (iter.hasNext()) {
329
                                attr = (FeatureAttributeDescriptor) iter.next();
330
                                if (!attrInSourceToUse.contains(attr.getName())) {
331
                                    if (attr instanceof EditableFeatureAttributeDescriptor) {
332
                                        efad = (EditableFeatureAttributeDescriptor) attr;
333
                                        if (efad.getOriginalName() != null &&
334
                                            !attrInSourceToUse.contains(efad.getOriginalName())) {
335
                                            iter.remove();
336
                                        }
337
                                    } else {
338
                                        iter.remove();
339
                                    }
340
                                }
341
                        }
342
                        return orgType.getNotEditableCopy();
343
                }
344

    
345
                public void setFeatureStore(FeatureStore featureStore) {
346
                        this.wkRefStore = new WeakReference(featureStore);
347
                }
348

    
349
                public boolean isTransformsOriginalValues() {
350
                        return false;
351
                }
352

    
353
        }
354

    
355
        /**
356
         * DOCUMENT ME!
357
         *
358
         * @param id
359
         *            DOCUMENT ME!
360
         */
361
        public void restore(String id) {
362
                deleted.remove(id);
363
                deltaSize++;
364
        }
365

    
366
        public void restore(String id, int num) {
367
                if (added.containsKey(id)) {
368
                        added.put(id, new Integer(num));
369
                } else {
370
                        modifiedFromOriginal.put(id, new Integer(num));
371
                }
372
        }
373

    
374
        public boolean isDeleted(FeatureType type) {
375
                return deleted.contains(type.getId());
376
        }
377

    
378
        public boolean isDeleted(String id) {
379
                return deleted.contains(id);
380
        }
381

    
382
        public void clear() {
383
                added.clear();
384
                modifiedFromOriginal.clear();
385
                expansionAdapter.close();
386
                deleted.clear();// <FeatureID>
387
                deltaSize = 0;
388
        }
389

    
390
        public boolean hasChanges() {
391
                return added.size() > 0 || modifiedFromOriginal.size() > 0
392
                                || deleted.size() > 0;
393
        }
394

    
395
        public Iterator newsIterator() {
396
                return added.values().iterator();
397
        }
398

    
399
        public boolean hasNews() {
400
                return !added.isEmpty();
401
        }
402

    
403
        public long getDeltaSize() {
404
                return deltaSize;
405
        }
406

    
407
        public FeatureType getOriginalFeatureType() {
408
                return originalType;
409
        }
410

    
411
        public DefaultFeatureStoreTransforms getTransforms() {
412
                return this.transforms;
413
        }
414

    
415
        public class FeatureTypeManagerFeatureStoreTransforms extends
416
                        DefaultFeatureStoreTransforms {
417

    
418
                private FeatureTypeManagerFeatureStoreTransforms() {
419

    
420
                }
421

    
422
                protected void checkEditingMode() {
423
                        return;
424
                }
425

    
426
                protected void notifyChangeToStore() {
427
                        return;
428
                }
429

    
430
                public PersistentState getState() throws PersistenceException {
431
                        // FIXME
432
                        throw new UnsupportedOperationException();
433
                }
434

    
435
                public void loadState(PersistentState state)
436
                                throws PersistenceException {
437
                        // FIXME
438
                        throw new UnsupportedOperationException();
439
                }
440

    
441
                public void loadFromState(PersistentState state) throws PersistenceException {
442
                        // FIXME
443
                        throw new UnsupportedOperationException();
444
                }
445

    
446
                public FeatureStoreTransform add(FeatureStoreTransform transform)
447
                                throws DataException {
448
                        if (!(transform instanceof UpdateFeatureTypeTransform)) {
449
                                // FIXME
450
                                throw new IllegalArgumentException();
451
                        }
452
                        return super.add(transform);
453
                }
454

    
455
        }
456

    
457
        public class FeatureTypesChangedItem implements FeatureTypeChanged {
458

    
459
                private FeatureType source;
460
                private FeatureType target;
461

    
462
                public FeatureTypesChangedItem(FeatureType source, FeatureType target) {
463
                        this.source = source;
464
                        this.target = target;
465
                }
466

    
467
                public FeatureType getSource() {
468
                        return source;
469
                }
470

    
471
                public FeatureType getTarget() {
472
                        return target;
473
                }
474

    
475
        }
476

    
477
        public Iterator getFeatureTypesChanged() throws DataException {
478
                // FIXME this don't work for Store.fType.size() > 1
479
                List list = new ArrayList();
480
                if (modifiedFromOriginal.size() > 0) {
481
                        FeatureType src = this.getOriginalFeatureType();
482
                        list.add(new FeatureTypesChangedItem(src, this.store
483
                                        .getFeatureType(src.getId())));
484
                }
485
                return list.iterator();
486
        }
487

    
488
}