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 / FeatureQueryOrder.java @ 40435

History | View | Annotate | Download (5.35 KB)

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

    
3
import java.util.ArrayList;
4
import java.util.Comparator;
5
import java.util.Iterator;
6
import java.util.List;
7

    
8
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
9
import org.gvsig.tools.evaluator.Evaluator;
10
import org.gvsig.tools.evaluator.EvaluatorData;
11
import org.gvsig.tools.evaluator.EvaluatorException;
12
import org.gvsig.tools.lang.Cloneable;
13
import org.gvsig.tools.persistence.Persistent;
14
import org.gvsig.tools.persistence.PersistentState;
15
import org.gvsig.tools.persistence.exception.PersistenceException;
16

    
17
public class FeatureQueryOrder implements Persistent, Cloneable {
18

    
19
        private List members = new ArrayList();
20

    
21
        public class FeatureQueryOrderMember implements Persistent, Cloneable {
22
                String attributeName = null;
23
                Evaluator evaluator = null;
24
                boolean ascending;
25

    
26
                FeatureQueryOrderMember(String attributeName, boolean ascending) {
27
                        this.attributeName = attributeName;
28
                        this.ascending = ascending;
29
                }
30
                FeatureQueryOrderMember(Evaluator evaluator, boolean ascending) {
31
                        this.evaluator = evaluator;
32
            this.ascending = ascending;
33
                }
34
                public boolean hasEvaluator() {
35
                        return this.evaluator != null;
36
                }
37
                public Evaluator getEvaluator() {
38
                        return this.evaluator;
39
                }
40
                public boolean getAscending() {
41
                        return this.ascending;
42
                }
43
                public String getAttributeName() {
44
                        return this.attributeName;
45
                }
46
                public void loadFromState(PersistentState state)
47
                                throws PersistenceException {
48
                        this.attributeName = state.getString("attributeName");
49
                        this.ascending = state.getBoolean("ascending");
50
                        this.evaluator = (Evaluator) state.get("evaluator");
51
                }
52

    
53
                public void saveToState(PersistentState state)
54
                                throws PersistenceException {
55
                        state.set("attributeName", this.attributeName);
56
                        state.set("ascending", this.ascending);
57
                        if (this.evaluator != null) {
58
                                state.set("evaluator", evaluator);
59
                        }
60

    
61
                }
62

    
63
                public Object clone() throws CloneNotSupportedException {
64
                        // Nothing more to clone
65
                        return super.clone();
66
                }
67
        }
68

    
69
        public Object add(String attributeName, boolean ascending) {
70
        FeatureQueryOrderMember member = new FeatureQueryOrderMember(
71
                attributeName, ascending);
72
                if( members.add(member) ) {
73
                        return member;
74
                }
75
                return null;
76
        }
77

    
78
        public Object add(Evaluator evaluator, boolean ascending) {
79
                FeatureQueryOrderMember member = new FeatureQueryOrderMember(
80
                                evaluator,
81
                                ascending);
82
                if (members.add(member)) {
83
                        return member;
84
                }
85
                return null;
86
        }
87

    
88
        public Iterator iterator() {
89
                return members.iterator();
90
        }
91

    
92
        public boolean remove(FeatureQueryOrderMember member) {
93
                return members.remove(member);
94
        }
95

    
96
        public void remove(int index) {
97
                members.remove(index);
98
        }
99

    
100
        public void clear() {
101
                members.clear();
102
        }
103

    
104
        public int size() {
105
                return this.members.size();
106
        }
107

    
108
        public Comparator getFeatureComparator() {
109
                return new DefaultFeatureComparator(this);
110
        }
111

    
112
        public Object clone() throws CloneNotSupportedException {
113
                FeatureQueryOrder clone = (FeatureQueryOrder) super.clone();
114

    
115
                if (members != null) {
116
                        clone.members = new ArrayList(members.size());
117
                        for (int i = 0; i < members.size(); i++) {
118
                                clone.members.add(((Cloneable) members.get(i)).clone());
119
                        }
120
                }
121

    
122
                return clone;
123
        }
124

    
125
        public FeatureQueryOrder getCopy() {
126
                FeatureQueryOrder aCopy = new FeatureQueryOrder();
127
                Iterator iter = this.members.iterator();
128
                FeatureQueryOrderMember member;
129
                while (iter.hasNext()) {
130
                        member = (FeatureQueryOrderMember) iter.next();
131
                        if (member.hasEvaluator()) {
132
                                aCopy.add(member.getEvaluator(), member.getAscending());
133
                        } else {
134
                                aCopy.add(member.getAttributeName(), member.getAscending());
135
                        }
136
                }
137
                return aCopy;
138
        }
139

    
140
        public void loadFromState(PersistentState state)
141
                        throws PersistenceException {
142
                this.members = (List) state.get("menbers");
143
        }
144

    
145
        public void saveToState(PersistentState state) throws PersistenceException {
146
                state.set("menbers", members);
147
        }
148
        
149
        private class DefaultFeatureComparator implements Comparator {
150

    
151
                private FeatureQueryOrder order;
152

    
153

    
154
                public DefaultFeatureComparator(FeatureQueryOrder order) {
155
                        this.order = order;
156
                        // TODO optimizar en un array???
157

    
158
                }
159

    
160

    
161
                private int myCompare(Object arg0, Object arg1) {
162
                        if (arg0 == null){
163
                                if (arg1 == null){
164
                                        return 0;
165
                                } else{
166
                                        return 1;
167
                                }
168
                        } else if (arg1 == null){
169
                                if (arg0 == null) {
170
                                        return 0;
171
                                } else {
172
                                        return 1;
173
                                }
174
                        }
175
                        if (arg0 instanceof Comparable) {
176
                                return ((Comparable) arg0).compareTo(arg1);
177
                        } else if (arg1 instanceof Comparable) {
178
                                return ((Comparable) arg1).compareTo(arg0) * -1;
179
                        }
180

    
181
                        if (arg0.equals(arg1)){
182
                                return 0;
183
                        } else{
184
                                return -1;
185
                        }
186

    
187
                }
188

    
189
                public int compare(Object arg0, Object arg1) {
190
                        Iterator iter = this.order.iterator();
191
                        int returnValue = 0;
192
                        Feature f0 = (Feature) arg0;
193
                        Feature f1 = (Feature) arg1;
194
                        Object item;
195
                        String attrName;
196
                        Evaluator evaluator;
197
                        while (returnValue == 0 && iter.hasNext()) {
198
                                item = iter.next();
199
                                if (item instanceof String) {
200
                                        attrName = (String) item;
201
                                        returnValue = this
202
                                                        .myCompare(f0.get(attrName), f1
203
                                                        .get(attrName));
204
                                } else {
205
                                        evaluator = (Evaluator) item;
206
                                        try {
207
                                                returnValue = this.myCompare(evaluator
208
                                                                .evaluate((EvaluatorData) f0), evaluator
209
                                                                .evaluate((EvaluatorData) f1));
210
                                        } catch (EvaluatorException e) {
211
                                                throw new DataEvaluatorRuntimeException(e);
212
                                        }
213
                                }
214
                        }
215

    
216
                        return returnValue;
217
                }
218

    
219
        }
220

    
221
}