Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.api / src / main / java / org / gvsig / fmap / dal / feature / FeatureSet.java @ 40435

History | View | Annotate | Download (11.1 KB)

1
package org.gvsig.fmap.dal.feature;
2

    
3
import java.util.List;
4

    
5
import org.gvsig.fmap.dal.DataSet;
6
import org.gvsig.fmap.dal.exception.DataException;
7
import org.gvsig.tools.dispose.DisposableIterator;
8
import org.gvsig.tools.dynobject.DynObject;
9
import org.gvsig.tools.dynobject.DynObjectSet;
10
import org.gvsig.tools.exception.BaseException;
11
import org.gvsig.tools.visitor.IndexedVisitable;
12
import org.gvsig.tools.visitor.Visitor;
13

    
14
/**
15
 * A FeatureSet represents a set of {@link Feature}(s). These sets of features
16
 * are typically obtained directly from a {@link FeatureStore}, or through a
17
 * {@link FeatureQuery}.
18
 * 
19
 * A FeatureSet may contain subsets of {@link Feature}(s) of different
20
 * {@link FeatureType}(s). It allows iterating and editing the features.
21
 * 
22
 * FIXME: Actualizar javadoc
23
 * 
24
 * Si el store en el que esta basado el featureset es modificado, se realiza un
25
 * update, insert, delete o se modifican los featuretype de este, el FeatureSet
26
 * quedara invalidado, y cualquier acceso a el provocara que se lance una
27
 * excepcion de tiempo de ejecucion ConcurrentModificationException.
28
 * 
29
 * Habria que indicar que invocar al metodo accept del interface visitor
30
 * provocara la excepcion ConcurrentModificationException si el store a sido
31
 * modificado desde otro punto.
32
 * 
33
 * Indicar que los metodos insert/delete/update ademas de actuar sobre el set,
34
 * actuan sobre el store en el que este esta basado, pero que no invalidan el
35
 * set sobre el que se ejecutan. No se si esto deberia hacerse mencion en esos
36
 * metodos o en la doc general del featureset.
37
 * 
38
 */
39
public interface FeatureSet extends DataSet, IndexedVisitable {
40

    
41
        /**
42
         * Returns the default {@link FeatureType} of this FeatureSet.
43
         * 
44
         * @return default {@link FeatureType} in this FeatureSet.
45
         */
46
        public FeatureType getDefaultFeatureType();
47

    
48
        /**
49
         * Returns a list of the {@link FeatureType}(s) in this FeatureSet.
50
         * 
51
         * @return list of the {@link FeatureType}(s) in this FeatureSet.
52
         */
53
        public List getFeatureTypes();
54

    
55
        /**
56
         * Returns the number of {@link Feature}(s) contained in this FeatureSet.
57
         * 
58
         * The value returned by this method won't be accurate when
59
         * the FeatureStore is being edited and this set's features
60
         * are modified, added or deleted.
61
         *  
62
         * @return number of {@link Feature}(s) contained in this FeatureSet.
63
         * 
64
         * @throws DataException
65
         */
66
    public long getSize() throws DataException;
67

    
68
    /**
69
     * Returns an iterator over the elements in this collection, in the order
70
     * (if any) defined when the collection was obtained.
71
     * 
72
     * The iterator starts at the specified position in this collection. The
73
     * specified index indicates the first element that would be returned by an
74
     * initial call to the <tt>next</tt> method. An initial call to the
75
     * <tt>previous</tt> method would return the element with the specified
76
     * index minus one.
77
     * 
78
     * <p>
79
     * <em>
80
     * <strong>NOTE:</strong> if you use this method to get the iterator, you
81
     * must get sure the iterator is disposed (@see
82
     * {@link DisposableIterator#dispose()}) in any case, even if an error occurs
83
     * while getting the data. It is recommended to use the <code>accept</code>
84
     * methods instead, which handle everything for you. 
85
     * Take into account the accept methods may use a fast iterator to 
86
     * get the features.
87
     * </em>
88
     * </p>
89
     * 
90
     * @see #accept(org.gvsig.tools.visitor.Visitor)
91
     * @see #accept(org.gvsig.tools.visitor.Visitor, long)
92
     * @see #fastIterator()
93
     * @see #fastIterator(long)
94
     * 
95
     * @param index
96
     *            index of first element to be returned from the iterator (by a
97
     *            call to the <tt>next</tt> method).
98
     * @return an iterator of the elements in this collection (in proper
99
     *         sequence), starting at the specified position in the collection.
100
     * @throws DataException
101
     *             if the index is out of range (index &lt; 0 || index &gt;
102
     *             size()).
103
     * @deprecated use {@link #fastIterator(long)} instead
104
     */
105
        DisposableIterator iterator(long index) throws DataException;
106

    
107
    /**
108
     * Returns an iterator over the elements in this collection, in the order
109
     * (if any) defined when the collection was obtained.
110
     * 
111
     * <p>
112
     * <em>
113
     * <strong>NOTE:</strong> if you use this method to get the iterator, you
114
     * must get sure the iterator is disposed (@see
115
     * {@link DisposableIterator#dispose()}) in any case, even if an error occurs
116
     * while getting the data. It is recommended to use the <code>accept</code>
117
     * methods instead, which handle everything for you. 
118
     * Take into account the accept methods may use a fast iterator to 
119
     * get the features.
120
     * </em>
121
     * </p>
122
     * 
123
     * @see #accept(org.gvsig.tools.visitor.Visitor)
124
     * @see #accept(org.gvsig.tools.visitor.Visitor, long)
125
     * @see #fastIterator()
126
     * @see #fastIterator(long)
127
     * 
128
     * @return an iterator of the elements in this collection (in proper
129
     *         sequence).
130
     * 
131
     * @throws DataException
132
     *             if there is an error getting the iterator
133
     * 
134
     * @deprecated use {@link #fastIterator()} instead
135
     */
136
        DisposableIterator iterator() throws DataException;
137

    
138
    /**
139
     * Returns a fast iterator over this set.
140
     * <p>
141
     * Fast in this case means that each of the elements returned may be a
142
     * reused or pooled object instance, so don't use it to be stored in any
143
     * way.
144
     * </p>
145
     * <p>
146
     * If you need to store one of the {@link Feature} of the iterator, use the
147
     * {@link Feature#getCopy()} to create a clone of the object.
148
     * </p>
149
     * 
150
     * <p>
151
     * <em>
152
     * <strong>NOTE:</strong> if you use this method to get the iterator, you
153
     * must get sure the iterator is disposed (@see
154
     * {@link DisposableIterator#dispose()}) in any case, even if an error occurs
155
     * while getting the data. It is recommended to use the <code>accept</code>
156
     * methods instead, which handle everything for you. 
157
     * Take into account the accept methods may use a fast iterator to 
158
     * get the features.
159
     * </em>
160
     * </p>
161
     * 
162
     * @see #accept(org.gvsig.tools.visitor.Visitor)
163
     * @see #accept(org.gvsig.tools.visitor.Visitor, long)
164
     * 
165
     * @return an iterator over this set.
166
     * 
167
     * @throws DataException
168
     */
169
        public DisposableIterator fastIterator() throws DataException;
170

    
171
    /**
172
     * Returns a fast iterator over this set, starting from the given index.
173
     * <p>
174
     * Fast in this case means that each of the elements returned may be a
175
     * reused or pooled object instance, so don't use it to be stored in any
176
     * way.
177
     * </p>
178
     * <p>
179
     * If you need to store one of the {@link Feature} of the iterator, use the
180
     * {@link Feature#getCopy()} to create a clone of the object.
181
     * </p>
182
     * 
183
     * <p>
184
     * <em>
185
     * <strong>NOTE:</strong> if you use this method to get the iterator, you
186
     * must get sure the iterator is disposed (@see
187
     * {@link DisposableIterator#dispose()}) in any case, even if an error occurs
188
     * while getting the data. It is recommended to use the <code>accept</code>
189
     * methods instead, which handle everything for you. 
190
     * Take into account the accept methods may use a fast iterator to 
191
     * get the features.
192
     * </em>
193
     * </p>
194
     * 
195
     * @see #accept(org.gvsig.tools.visitor.Visitor)
196
     * @see #accept(org.gvsig.tools.visitor.Visitor, long)
197
     * 
198
     * @param index
199
     *            position in which the iterator is initially located.
200
     * 
201
     * @return an iterator initially located at the position indicated by the
202
     *         given index
203
     * 
204
     * @throws DataException
205
     */
206
        public DisposableIterator fastIterator(long index) throws DataException;
207

    
208
        /**
209
         * Indicates whether this FeatureSet contains zero features.
210
         * 
211
         * The value returned by this method won't be accurate when
212
         * the FeatureStore is being edited and this set's features
213
         * are modified, added or deleted.
214
         *  
215
         * @return true if this FeatureSet is empty, false otherwise.
216
         * 
217
         * @throws DataException
218
         */
219
        boolean isEmpty() throws DataException;
220

    
221
        /**
222
         * Updates a {@link Feature} with the given {@link EditableFeature}.<br>
223
         * 
224
         * Any {@link DisposableIterator} from this store that was still in use can will not
225
         * reflect this change.
226
         * 
227
         * @param feature
228
         *            an instance of {@link EditableFeature} with which to update
229
         *            the associated {@link Feature}.
230
         * 
231
         * @throws DataException
232
         */
233
        public void update(EditableFeature feature) throws DataException;
234

    
235
        /**
236
         * Deletes a {@link Feature} from this FeatureSet.<br>
237
         * 
238
         * Any {@link DisposableIterator} from this store that was still in use will be
239
         * <i>unsafe</i>. Use {@link DisposableIterator#remove()} instead.
240
         * 
241
         * @param feature
242
         *            the {@link Feature} to delete.
243
         * 
244
         * @throws DataException
245
         */
246
        public void delete(Feature feature) throws DataException;
247

    
248
        /**
249
         * Inserts a new feature in this set. It needs to be an instance of
250
         * {@link EditableFeature} as it has not been stored yet.<br>
251
         * 
252
         * Any {@link DisposableIterator} from this store that was still in use can will not
253
         * reflect this change.
254
         * 
255
         * @param feature
256
         *            the {@link EditableFeature} to insert.
257
         * 
258
         * @throws DataException
259
         */
260
        public void insert(EditableFeature feature) throws DataException;
261

    
262
    /**
263
     * Returns a {@link DynObjectSet} of the contents of this set.
264
     * Defaults to fast iteration.
265
     * 
266
     * @return a {@link DynObjectSet}
267
     */
268
    public DynObjectSet getDynObjectSet();
269

    
270
    /**
271
     * Returns a {@link DynObjectSet} of the contents of this set.
272
     * 
273
     * @param fast
274
     *            if the set will be able to be iterated in a fast way, by
275
     *            reusing the {@link DynObject} instance for each
276
     *            {@link Feature} instance.
277
     * @return a {@link DynObjectSet}
278
     */
279
    public DynObjectSet getDynObjectSet(boolean fast);
280

    
281
    /**
282
     * Provides each value of this Store to the provided {@link Visitor},
283
     * beginning from the provided index position.
284
     * The values received through the {@link Visitor#visit(Object)} method
285
     * may be transient, reused or externally modifiable, so they can't
286
     * be used to be stored in any external form out of the visit method.
287
     * 
288
     * If you need to store any of the values out of the
289
     * {@link Visitor#visit(Object)} method execution, create a copy or clone
290
     * the received value in order to be stored.
291
     * 
292
     * @param visitor
293
     *            the visitor to apply to each value.
294
     * @param firstValueIndex
295
     *            index of first element to be visited by the {@link Visitor}
296
     * @exception BaseException
297
     *                if there is an error while performing the visit
298
     */
299
    void accept(Visitor visitor, long firstValueIndex) throws BaseException;
300
}