Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_data / src / org / gvsig / fmap / data / feature / impl / FeatureManager.java @ 24143

History | View | Annotate | Download (9.31 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.data.feature.impl;
44

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

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

    
59

    
60
/**
61
 * DOCUMENT ME!
62
 *
63
 * @author Vicente Caballero Navarro
64
 */
65
public class FeatureManager {
66
//    protected HashMap relations = new HashMap();//<FeatureID,Integer>
67
    private ExpansionAdapter expansionAdapter;
68
    private ArrayList featuresDeleted = new ArrayList();//<FeatureID>
69
    private int deltaSize=0;
70
        private HashMap featuresAdded=new HashMap();
71
        private HashMap featuresModifiedFromOriginal=new HashMap();
72
    public FeatureManager(ExpansionAdapter expansionAdapter){
73
            this.expansionAdapter=expansionAdapter;
74
    }
75

    
76

    
77
    public Feature delete(FeatureReference id) {
78
        featuresDeleted.add(id);
79
        Feature feature=(Feature)featuresAdded.remove(id);
80
        if (feature==null)
81
        feature = (Feature)featuresModifiedFromOriginal.remove(id);
82
        deltaSize--;
83
        return feature;
84
    }
85

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

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

    
113
    /**
114
     * DOCUMENT ME!
115
     *
116
     * @param id DOCUMENT ME!
117
     *
118
     *@deprecated
119
     *
120
     * @return DOCUMENT ME!
121
     */
122
//    public boolean contains(FeatureReference id) {
123
//            if (featuresAdded.containsKey(id))
124
//                    return true;
125
//            return featuresModifiedFromOriginal.containsKey(id);
126
//    }
127

    
128
    /**
129
     * Returns a Feature of the default type.
130
     *
131
     * @param id
132
     *            the feature reference
133
     * @param store
134
     *            the store to get the feature from
135
     * @return a Feature with the given reference
136
     * @throws DataException
137
     *             if there is an error getting the Feature
138
     */
139
    public Feature get(FeatureReference id, FeatureStore store)
140
            throws DataException {
141
        return get(id, store, null);
142
    }
143

    
144
    /**
145
     * Returns a Feature of the given type.
146
     *
147
     * @param id
148
     *            the feature reference
149
     * @param store
150
     *            the store to get the feature from
151
     * @param featureType
152
     *            the type of the feature to return
153
     * @return a Feature with the given reference
154
     * @throws DataException
155
     *             if there is an error getting the Feature
156
     */
157
    public Feature get(FeatureReference id, FeatureStore store,
158
                        FeatureType featureType) throws DataException {
159
            // FIXME: y si el featuretype que paso esta modificado.
160
            //        Deberia buscarlo en el featuretypemanager ?
161
                //
162
            //        Si no existe feature con ese id... ? retorna null ?
163
            //        en EditedDefaultIterator se hace uso de ese comportamiento.
164
            //
165
            Integer intNum =((Integer) featuresAdded.get(id));
166
            if (intNum == null){
167
                    intNum =((Integer) featuresModifiedFromOriginal.get(id));
168
                if (intNum == null){
169
                        return null;
170
                }
171
            }
172
        int num = intNum.intValue();
173

    
174
        Feature feature=(Feature)expansionAdapter.getObject(num);
175
        if (featureType== null){
176
                featureType = store.getDefaultFeatureType();
177
        }
178
               return getCorrectFeature(feature, store,featureType);
179
    }
180

    
181
    private Feature getCorrectFeature(Feature feature, FeatureStore store,
182
                        FeatureType featureType) throws DataException {
183
             Iterator iterator=featureType.iterator();
184
         EditableFeature newFeature=store.createFeature(featureType, false);
185
         FeatureType orgType = feature.getType();
186
         int orgIndex;
187
         while (iterator.hasNext()) {
188
                         FeatureAttributeDescriptor fad = (FeatureAttributeDescriptor) iterator.next();
189
                         orgIndex = orgType.getIndex(fad.getName());
190
                         if (orgIndex<0){
191
                                 continue;
192
                         }
193
                         if (featureType.getDefaultGeometryAttributeName().equals(
194
                                                                        fad.getName())){
195
                                 newFeature.setGeometry(fad.getIndex(), feature.getGeometry(orgIndex));
196
                         } else{
197
                                 newFeature.set(fad.getIndex(), feature.get(orgIndex));
198
                         }
199
                 }
200
         return newFeature.getNotEditableCopy();
201
        }
202

    
203
        /**
204
     * DOCUMENT ME!
205
     *
206
     * @param feature DOCUMENT ME!
207
     * @param oldFeature DOCUMENT ME!
208
     */
209
    public int update(Feature feature, Feature oldFeature) {
210

    
211
//        featuresDeleted.add(oldFeature.getReference());
212
            int oldNum=-1;
213
        int num = expansionAdapter.addObject(feature);
214
        FeatureReference id=feature.getReference();
215
        /*
216
         * Actualiza la relaci?n del ?ndice de la geometr?a al ?ndice en el
217
         * fichero de expansi?n.
218
         */
219
        if (featuresAdded.containsKey(id)){
220
                oldNum=((Integer)featuresAdded.get(id)).intValue();
221
                featuresAdded.put(id,new Integer(num));
222
        }else{
223
                oldNum=((Integer)featuresModifiedFromOriginal.get(id)).intValue();
224
                featuresModifiedFromOriginal.put(id,new Integer(num));
225
        }
226
        return oldNum;
227
    }
228

    
229
    /**
230
     * DOCUMENT ME!
231
     *
232
     * @param id DOCUMENT ME!
233
     */
234
    public void restore(FeatureReference id) {
235
        featuresDeleted.remove(id);
236
        deltaSize++;
237
    }
238
    public void restore(FeatureReference id,int num){
239
            if (featuresAdded.containsKey(id)){
240
//                oldNum=((Integer)featuresAdded.get(id)).intValue();
241
                featuresAdded.put(id,new Integer(num));
242
        }else{
243
//                oldNum=((Integer)featuresModifiedFromOriginal.get(id)).intValue();
244
                featuresModifiedFromOriginal.put(id,new Integer(num));
245
        }
246
    }
247

    
248
//    public int getNum() {
249
//            return num;
250
//    }
251

    
252
//    public Feature getFeature(int i, FeatureStore store, FeatureType featureType)
253
//                        throws DataException {
254
//            Feature feature=(Feature)expansionAdapter.getObject(i);
255
//            return getCorrectFeature(feature,store,featureType);
256
//    }
257
    public boolean isDeleted(Feature feature){
258
            return featuresDeleted.contains(feature.getReference());
259
    }
260

    
261
    public boolean isDeleted(FeatureReference featureID) {
262
                return featuresDeleted.contains(featureID);
263
        }
264

    
265
        public void clear() {
266
                featuresAdded.clear();
267
                featuresModifiedFromOriginal.clear();
268
//                relations.clear();//<FeatureID,Integer>
269
            expansionAdapter.close();
270
            featuresDeleted.clear();//<FeatureID>
271
            deltaSize=0;
272
        }
273

    
274

    
275
        public boolean hasChanges() {
276
                return featuresAdded.size()>0 || featuresModifiedFromOriginal.size() > 0 || featuresDeleted.size() > 0;
277
        }
278

    
279

    
280
        public Iterator newsFeaturesIterator(long index) {
281
                if (index==0)
282
                        return newsFeaturesIterator();
283

    
284
                return Arrays.asList(featuresAdded.values()).listIterator((int)index);
285
        }
286

    
287
        public Iterator newsFeaturesIterator() {
288
                return featuresAdded.values().iterator();
289
        }
290
/**
291
 * 
292
 * @return
293
 */
294
        public Iterator getDeletedfeatures() {
295
                
296
        }
297
        
298
        public Iterator getInsertedfeatures() {
299
                
300
        }
301
        
302
        public Iterator getUpdatedfeatures() {
303
                
304
        }
305
        
306
        
307
        public boolean hasNews() {
308
                return !featuresAdded.isEmpty();
309
        }
310

    
311
        public long getDeltaSize() {
312
                return deltaSize;
313
        }
314
}