Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_dal / src / org / gvsig / fmap / dal / feature / impl / FeatureManager.java @ 27525

History | View | Annotate | Download (11 KB)

1

    
2
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
3
 *
4
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
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 2
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
19
 *
20
 * For more information, contact:
21
 *
22
 *  Generalitat Valenciana
23
 *   Conselleria d'Infraestructures i Transport
24
 *   Av. Blasco Ib??ez, 50
25
 *   46010 VALENCIA
26
 *   SPAIN
27
 *
28
 *      +34 963862235
29
 *   gvsig@gva.es
30
 *      www.gvsig.gva.es
31
 *
32
 *    or
33
 *
34
 *   IVER T.I. S.A
35
 *   Salamanca 50
36
 *   46005 Valencia
37
 *   Spain
38
 *
39
 *   +34 963163400
40
 *   dac@iver.es
41
 */
42

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

    
45
import java.util.ArrayList;
46
import java.util.HashMap;
47
import java.util.Iterator;
48

    
49
import org.gvsig.fmap.dal.exception.DataException;
50
import org.gvsig.fmap.dal.feature.EditableFeature;
51
import org.gvsig.fmap.dal.feature.Feature;
52
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
53
import org.gvsig.fmap.dal.feature.FeatureReference;
54
import org.gvsig.fmap.dal.feature.FeatureStore;
55
import org.gvsig.fmap.dal.feature.FeatureType;
56
import org.gvsig.fmap.dal.feature.impl.expansionadapter.ExpansionAdapter;
57

    
58

    
59
/**
60
 * DOCUMENT ME!
61
 *
62
 * @author Vicente Caballero Navarro
63
 */
64
public class FeatureManager {
65
    private ExpansionAdapter expansionAdapter;
66
    private ArrayList deleted = new ArrayList();//<FeatureID>
67
    private int deltaSize=0;
68
        private HashMap added=new HashMap();
69
        private HashMap modifiedFromOriginal=new HashMap();
70
    public FeatureManager(ExpansionAdapter expansionAdapter){
71
            this.expansionAdapter=expansionAdapter;
72
    }
73

    
74

    
75
    public Feature delete(FeatureReference id) {
76
        deleted.add(id);
77
                Integer num = (Integer) added.remove(id);
78
        Feature feature=null;
79
        if (num == null || num.intValue() == -1) {
80
                feature = (Feature)modifiedFromOriginal.remove(id);
81
                }else{
82
                        feature = (Feature) expansionAdapter.getObject(num.intValue());
83
                }
84
        deltaSize--;
85
        return feature;
86
    }
87

    
88
    /**
89
     * DOCUMENT ME!
90
     *
91
     * @param feature DOCUMENT ME!
92
     */
93
    public void add(Feature feature) {
94
        int pos = expansionAdapter.addObject(feature);
95
        added.put(feature.getReference(),new Integer(pos));
96
        deleted.remove(feature.getReference());
97
        deltaSize++;
98
    }
99

    
100
    /**
101
     * DOCUMENT ME!
102
     * @param id DOCUMENT ME!
103
     */
104
    public Feature deleteLastFeature() {
105
        expansionAdapter.deleteLastObject();
106
        Feature feature=(Feature)expansionAdapter.getObject(expansionAdapter.getSize()-1);
107
        added.remove(feature.getReference());
108
        modifiedFromOriginal.remove(feature.getReference());
109
        deltaSize--;
110
        return feature;
111
    }
112

    
113
    /**
114
     * Returns a Feature of the default type.
115
     *
116
     * @param id
117
     *            the feature reference
118
     * @param store
119
     *            the store to get the feature from
120
     * @return a Feature with the given reference
121
     * @throws DataException
122
     *             if there is an error getting the Feature
123
     */
124
    public Feature get(FeatureReference id, FeatureStore store)
125
            throws DataException {
126
        return get(id, store, null);
127
    }
128

    
129
    /**
130
     * Returns a Feature of the given type.
131
     *
132
     * @param id
133
     *            the feature reference
134
     * @param store
135
     *            the store to get the feature from
136
     * @param featureType
137
     *            the type of the feature to return
138
     * @return a Feature with the given reference
139
     * @throws DataException
140
     *             if there is an error getting the Feature
141
     */
142
    public Feature get(FeatureReference id, FeatureStore store,
143
                        FeatureType featureType) throws DataException {
144
            // FIXME: y si el featuretype que paso esta modificado.
145
            //        Deberia buscarlo en el featuretypemanager ?
146
                //
147
            //        Si no existe feature con ese id... ? retorna null ?
148
            //        en EditedDefaultIterator se hace uso de ese comportamiento.
149
            //
150
            Integer intNum =((Integer) added.get(id));
151
            if (intNum == null){
152
                    intNum =((Integer) modifiedFromOriginal.get(id));
153
                if (intNum == null){
154
                        return null;
155
                }
156
            }
157
        int num = intNum.intValue();
158
        if (num==-1) {
159
                        return null;
160
                }
161
        Feature feature=(Feature)expansionAdapter.getObject(num);
162
        if (featureType== null){
163
                featureType = store.getDefaultFeatureType();
164
        }
165
               return getCorrectFeature(feature, store,featureType);
166
    }
167

    
168
    private Feature getCorrectFeature(Feature feature, FeatureStore store,
169
                        FeatureType featureType) throws DataException {
170
             Iterator iterator=featureType.iterator();
171
         EditableFeature newFeature=feature.getEditable();//store.createNewFeature(featureType, false);
172
         FeatureType orgType = feature.getType();
173
         int orgIndex;
174
         while (iterator.hasNext()) {
175
                         FeatureAttributeDescriptor fad = (FeatureAttributeDescriptor) iterator.next();
176
                         orgIndex = orgType.getIndex(fad.getName());
177
                         if (orgIndex<0){
178
                                 continue;
179
                         }
180
                        newFeature.set(fad.getIndex(), feature.get(orgIndex));
181
                 }
182
        return newFeature.getNotEditableCopy();
183
        }
184

    
185
        /**
186
     * DOCUMENT ME!
187
     *
188
     * @param feature DOCUMENT ME!
189
     * @param oldFeature DOCUMENT ME!
190
     */
191
    public int update(Feature feature, Feature oldFeature) {
192
            int oldNum=-1;
193
        int num = expansionAdapter.addObject(feature);
194
        FeatureReference id=feature.getReference();
195
        if (added.containsKey(id)){
196
                oldNum=((Integer)added.get(id)).intValue();
197
                added.put(id,new Integer(num));
198
        }else{
199
                if (modifiedFromOriginal.get(id)!=null) {
200
                                oldNum=((Integer)modifiedFromOriginal.get(id)).intValue();
201
                        }
202
                modifiedFromOriginal.put(id,new Integer(num));
203
        }
204
        return oldNum;
205
    }
206

    
207
    /**
208
     * DOCUMENT ME!
209
     *
210
     * @param id DOCUMENT ME!
211
     */
212
    public void restore(FeatureReference id) {
213
        deleted.remove(id);
214
        deltaSize++;
215
    }
216
    public void restore(FeatureReference id,int num){
217
            if (added.containsKey(id)){
218
                added.put(id,new Integer(num));
219
        }else{
220
                modifiedFromOriginal.put(id,new Integer(num));
221
        }
222
    }
223

    
224

    
225
    public boolean isDeleted(Feature feature){
226
            return deleted.contains(feature.getReference());
227
    }
228

    
229
    public boolean isDeleted(FeatureReference featureID) {
230
                return deleted.contains(featureID);
231
        }
232

    
233
        public void clear() {
234
                added.clear();
235
                modifiedFromOriginal.clear();
236
            expansionAdapter.close();
237
            deleted.clear();//<FeatureID>
238
            deltaSize=0;
239
        }
240

    
241

    
242
        public boolean hasChanges() {
243
                return added.size()>0 || modifiedFromOriginal.size() > 0 || deleted.size() > 0;
244
        }
245

    
246

    
247
//        public Iterator newsFeaturesIterator(long index) {
248
//                if (index==0)
249
//                        return newsFeaturesIterator();
250
//
251
//                return Arrays.asList(added.values()).listIterator((int)index);
252
//        }
253
//
254
//        public Iterator newsFeaturesIterator() {
255
//                return added.values().iterator();
256
//        }
257
        public Iterator getDeleted() {
258
                return new DeletedIterator();
259

    
260
        }
261
class DeletedIterator implements Iterator{
262
        private int pos=-1;
263
        private int size=expansionAdapter.getSize();
264
        private boolean hasnext=false;
265

    
266
        public boolean hasNext() {
267
                hasnext=true;
268
                if (size > pos){
269
                        pos++;
270
                        DefaultFeature obj=(DefaultFeature)expansionAdapter.getObject(pos);
271
                        if (deleted.contains(obj.getReference())){
272
                                return true;
273
                        }else{
274
                                return hasNext();
275

    
276
                        }
277
                }
278
                return false;
279
        }
280

    
281
        public Object next() {
282
                if (!hasnext){
283
                        pos++;
284
                        hasnext=false;
285
                }
286
                if (size > pos){
287
                        DefaultFeature obj=(DefaultFeature)expansionAdapter.getObject(pos);
288
                        if (deleted.contains(obj.getReference())){
289

    
290
                                return obj.getData();
291
                        }else{
292
                                if (hasNext()){
293
                                        return next();
294
                                }
295
                        }
296
                }
297
                return null;
298
        }
299

    
300
        public void remove() {
301
                throw new UnsupportedOperationException();
302

    
303
        }
304
}
305
        public Iterator getInserted() {
306
                return new InsertedIterator();
307
        }
308
        class InsertedIterator implements Iterator{
309
                private int pos=-1;
310
                private int size=expansionAdapter.getSize();
311
                private boolean hasnext=false;
312

    
313
                public boolean hasNext() {
314
                        hasnext=true;
315
                        pos++;
316
                        if (size > pos){
317
                                DefaultFeature obj=(DefaultFeature)expansionAdapter.getObject(pos);
318
                                if (deleted.contains(obj.getReference())){
319
                                        return hasNext();
320
                                }else if (!added.containsValue(new Integer(pos))){
321
                                        return hasNext();
322
                                }else {
323
                                        return true;
324
                                }
325
                        }
326
                        return false;
327
                }
328

    
329
                public Object next() {
330
                        if (!hasnext){
331
                                pos++;
332
                                hasnext=false;
333
                        }
334
                        if (size > pos){
335
                                DefaultFeature obj=(DefaultFeature)expansionAdapter.getObject(pos);
336
                                if (deleted.contains(obj.getReference())){
337
                                        if (hasNext()){
338
                                                return next();
339
                                        }
340
                                }else if (!added.containsValue(new Integer(pos))){
341
                                        if (hasNext()){
342
                                                return next();
343
                                        }
344
                                }else {
345
                                        return obj.getData();
346
                                }
347
                        }
348
                        return null;
349
                }
350

    
351
                public void remove() {
352
                        throw new UnsupportedOperationException();
353

    
354
                }
355
        }
356
        public Iterator getUpdated() {
357
                return new UpdatedIterator();
358
        }
359
        class UpdatedIterator implements Iterator{
360
                private int pos=-1;
361
                private int size=expansionAdapter.getSize();
362
                private boolean hasnext=false;
363

    
364
                public boolean hasNext() {
365
                        hasnext=true;
366
                        if (size > pos){
367
                                pos++;
368
                                DefaultFeature obj=(DefaultFeature)expansionAdapter.getObject(pos);
369
                                if (deleted.contains(obj.getReference())){
370
                                        return hasNext();
371
                                }else if (!modifiedFromOriginal.containsValue(new Integer(pos))){
372
                                        return hasNext();
373
                                }else {
374
                                        return true;
375
                                }
376
                        }
377
                        return false;
378
                }
379

    
380
                public Object next() {
381
                        if (!hasnext){
382
                                pos++;
383
                                hasnext=false;
384
                        }
385
                        if (size > pos){
386
                                DefaultFeature obj=(DefaultFeature)expansionAdapter.getObject(pos);
387
                                if (deleted.contains(obj.getReference())){
388
                                        if (hasNext()){
389
                                                return next();
390
                                        }
391
                                }else if (!modifiedFromOriginal.containsValue(new Integer(pos))){
392
                                        if (hasNext()){
393
                                                return next();
394
                                        }
395
                                }else {
396
                                        return obj.getData();
397
                                }
398
                        }
399
                        return null;
400
                }
401

    
402
                public void remove() {
403
                        throw new UnsupportedOperationException();
404

    
405
                }
406
        }
407

    
408
        public boolean hasNews() {
409
                return !added.isEmpty();
410
        }
411

    
412
        public long getDeltaSize() {
413
                return deltaSize;
414
        }
415
}