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 / featureset / FastOrderedIterator.java @ 40435
History | View | Annotate | Download (2.75 KB)
1 | 40435 | jjdelcerro | package org.gvsig.fmap.dal.feature.impl.featureset; |
---|---|---|---|
2 | |||
3 | import java.util.ArrayList; |
||
4 | import java.util.Collections; |
||
5 | import java.util.Iterator; |
||
6 | import java.util.List; |
||
7 | |||
8 | import org.gvsig.fmap.dal.exception.DataException; |
||
9 | import org.gvsig.tools.dispose.DisposableIterator; |
||
10 | import org.gvsig.fmap.dal.feature.Feature; |
||
11 | import org.gvsig.fmap.dal.feature.impl.DefaultFeature; |
||
12 | import org.gvsig.fmap.dal.feature.spi.FeatureProvider; |
||
13 | import org.gvsig.tools.exception.BaseException; |
||
14 | |||
15 | public class FastOrderedIterator extends DefaultIterator { |
||
16 | DefaultFeature myFeature; |
||
17 | protected Feature lastFeature = null; |
||
18 | |||
19 | FastOrderedIterator(DefaultFeatureSet featureSet, Iterator iterator, long index) { |
||
20 | super(featureSet);
|
||
21 | try {
|
||
22 | this.initializeFeature();
|
||
23 | if (featureSet.orderedData == null) { |
||
24 | // FIXME QUE PASA CON SIZE > Integer.MAX_VALUE ?????
|
||
25 | |||
26 | List data = new ArrayList(); |
||
27 | Object item;
|
||
28 | while (iterator.hasNext()) {
|
||
29 | item = iterator.next(); |
||
30 | if (item instanceof DefaultFeature){ |
||
31 | data.add(((DefaultFeature) item).getData().getCopy()); |
||
32 | } else {
|
||
33 | data.add(((FeatureProvider)item).getCopy()); |
||
34 | } |
||
35 | } |
||
36 | Collections.sort(data, new FeatureProviderComparator(featureSet.store, |
||
37 | featureSet.query.getOrder())); |
||
38 | featureSet.orderedData = data; |
||
39 | } |
||
40 | |||
41 | if (index < Integer.MAX_VALUE) { |
||
42 | this.iterator = featureSet.orderedData.listIterator((int) index); |
||
43 | } else {
|
||
44 | this.iterator = featureSet.orderedData.iterator();
|
||
45 | this.skypto(index);
|
||
46 | } |
||
47 | } |
||
48 | finally {
|
||
49 | if (iterator instanceof DisposableIterator) { |
||
50 | ((DisposableIterator) iterator).dispose(); |
||
51 | } |
||
52 | } |
||
53 | } |
||
54 | |||
55 | public FastOrderedIterator(DefaultFeatureSet featureSet, long index) { |
||
56 | super(featureSet);
|
||
57 | this.initializeFeature();
|
||
58 | |||
59 | if (index < Integer.MAX_VALUE) { |
||
60 | this.iterator = featureSet.orderedData.listIterator((int) index); |
||
61 | } else {
|
||
62 | this.iterator = featureSet.orderedData.iterator();
|
||
63 | this.skypto(index);
|
||
64 | } |
||
65 | } |
||
66 | |||
67 | protected DefaultFeature createFeature(FeatureProvider fData) {
|
||
68 | fData.setNew(false);
|
||
69 | this.myFeature.setData(fData);
|
||
70 | return this.myFeature; |
||
71 | } |
||
72 | |||
73 | protected void initializeFeature() { |
||
74 | myFeature = new DefaultFeature(fset.store);
|
||
75 | } |
||
76 | |||
77 | public Object next() { |
||
78 | lastFeature = null;
|
||
79 | lastFeature = (Feature) super.next();
|
||
80 | return lastFeature;
|
||
81 | } |
||
82 | |||
83 | public void remove() { |
||
84 | if (!fset.store.isEditing()) {
|
||
85 | throw new UnsupportedOperationException(); |
||
86 | } |
||
87 | if (this.lastFeature == null) { |
||
88 | throw new IllegalStateException(); |
||
89 | } |
||
90 | try {
|
||
91 | fset.store.delete(this.lastFeature);
|
||
92 | } catch (DataException e) {
|
||
93 | // FIXME Cambiar excepcion a una Runtime de DAL
|
||
94 | throw new RuntimeException(e); |
||
95 | } |
||
96 | this.iterator.remove();
|
||
97 | this.initializeFeature();
|
||
98 | } |
||
99 | |||
100 | protected void doDispose() throws BaseException { |
||
101 | super.doDispose();
|
||
102 | myFeature = null;
|
||
103 | lastFeature = null;
|
||
104 | } |
||
105 | } |