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 @ 40559

History | View | Annotate | Download (6.29 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
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 3
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., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.fmap.dal.feature;
25

    
26
import java.util.ArrayList;
27
import java.util.Comparator;
28
import java.util.Iterator;
29
import java.util.List;
30

    
31
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
32
import org.gvsig.tools.evaluator.Evaluator;
33
import org.gvsig.tools.evaluator.EvaluatorData;
34
import org.gvsig.tools.evaluator.EvaluatorException;
35
import org.gvsig.tools.lang.Cloneable;
36
import org.gvsig.tools.persistence.Persistent;
37
import org.gvsig.tools.persistence.PersistentState;
38
import org.gvsig.tools.persistence.exception.PersistenceException;
39

    
40
public class FeatureQueryOrder implements Persistent, Cloneable {
41

    
42
        private List members = new ArrayList();
43

    
44
        public class FeatureQueryOrderMember implements Persistent, Cloneable {
45
                String attributeName = null;
46
                Evaluator evaluator = null;
47
                boolean ascending;
48

    
49
                FeatureQueryOrderMember(String attributeName, boolean ascending) {
50
                        this.attributeName = attributeName;
51
                        this.ascending = ascending;
52
                }
53
                FeatureQueryOrderMember(Evaluator evaluator, boolean ascending) {
54
                        this.evaluator = evaluator;
55
            this.ascending = ascending;
56
                }
57
                public boolean hasEvaluator() {
58
                        return this.evaluator != null;
59
                }
60
                public Evaluator getEvaluator() {
61
                        return this.evaluator;
62
                }
63
                public boolean getAscending() {
64
                        return this.ascending;
65
                }
66
                public String getAttributeName() {
67
                        return this.attributeName;
68
                }
69
                public void loadFromState(PersistentState state)
70
                                throws PersistenceException {
71
                        this.attributeName = state.getString("attributeName");
72
                        this.ascending = state.getBoolean("ascending");
73
                        this.evaluator = (Evaluator) state.get("evaluator");
74
                }
75

    
76
                public void saveToState(PersistentState state)
77
                                throws PersistenceException {
78
                        state.set("attributeName", this.attributeName);
79
                        state.set("ascending", this.ascending);
80
                        if (this.evaluator != null) {
81
                                state.set("evaluator", evaluator);
82
                        }
83

    
84
                }
85

    
86
                public Object clone() throws CloneNotSupportedException {
87
                        // Nothing more to clone
88
                        return super.clone();
89
                }
90
        }
91

    
92
        public Object add(String attributeName, boolean ascending) {
93
        FeatureQueryOrderMember member = new FeatureQueryOrderMember(
94
                attributeName, ascending);
95
                if( members.add(member) ) {
96
                        return member;
97
                }
98
                return null;
99
        }
100

    
101
        public Object add(Evaluator evaluator, boolean ascending) {
102
                FeatureQueryOrderMember member = new FeatureQueryOrderMember(
103
                                evaluator,
104
                                ascending);
105
                if (members.add(member)) {
106
                        return member;
107
                }
108
                return null;
109
        }
110

    
111
        public Iterator iterator() {
112
                return members.iterator();
113
        }
114

    
115
        public boolean remove(FeatureQueryOrderMember member) {
116
                return members.remove(member);
117
        }
118

    
119
        public void remove(int index) {
120
                members.remove(index);
121
        }
122

    
123
        public void clear() {
124
                members.clear();
125
        }
126

    
127
        public int size() {
128
                return this.members.size();
129
        }
130

    
131
        public Comparator getFeatureComparator() {
132
                return new DefaultFeatureComparator(this);
133
        }
134

    
135
        public Object clone() throws CloneNotSupportedException {
136
                FeatureQueryOrder clone = (FeatureQueryOrder) super.clone();
137

    
138
                if (members != null) {
139
                        clone.members = new ArrayList(members.size());
140
                        for (int i = 0; i < members.size(); i++) {
141
                                clone.members.add(((Cloneable) members.get(i)).clone());
142
                        }
143
                }
144

    
145
                return clone;
146
        }
147

    
148
        public FeatureQueryOrder getCopy() {
149
                FeatureQueryOrder aCopy = new FeatureQueryOrder();
150
                Iterator iter = this.members.iterator();
151
                FeatureQueryOrderMember member;
152
                while (iter.hasNext()) {
153
                        member = (FeatureQueryOrderMember) iter.next();
154
                        if (member.hasEvaluator()) {
155
                                aCopy.add(member.getEvaluator(), member.getAscending());
156
                        } else {
157
                                aCopy.add(member.getAttributeName(), member.getAscending());
158
                        }
159
                }
160
                return aCopy;
161
        }
162

    
163
        public void loadFromState(PersistentState state)
164
                        throws PersistenceException {
165
                this.members = (List) state.get("menbers");
166
        }
167

    
168
        public void saveToState(PersistentState state) throws PersistenceException {
169
                state.set("menbers", members);
170
        }
171
        
172
        private class DefaultFeatureComparator implements Comparator {
173

    
174
                private FeatureQueryOrder order;
175

    
176

    
177
                public DefaultFeatureComparator(FeatureQueryOrder order) {
178
                        this.order = order;
179
                        // TODO optimizar en un array???
180

    
181
                }
182

    
183

    
184
                private int myCompare(Object arg0, Object arg1) {
185
                        if (arg0 == null){
186
                                if (arg1 == null){
187
                                        return 0;
188
                                } else{
189
                                        return 1;
190
                                }
191
                        } else if (arg1 == null){
192
                                if (arg0 == null) {
193
                                        return 0;
194
                                } else {
195
                                        return 1;
196
                                }
197
                        }
198
                        if (arg0 instanceof Comparable) {
199
                                return ((Comparable) arg0).compareTo(arg1);
200
                        } else if (arg1 instanceof Comparable) {
201
                                return ((Comparable) arg1).compareTo(arg0) * -1;
202
                        }
203

    
204
                        if (arg0.equals(arg1)){
205
                                return 0;
206
                        } else{
207
                                return -1;
208
                        }
209

    
210
                }
211

    
212
                public int compare(Object arg0, Object arg1) {
213
                        Iterator iter = this.order.iterator();
214
                        int returnValue = 0;
215
                        Feature f0 = (Feature) arg0;
216
                        Feature f1 = (Feature) arg1;
217
                        Object item;
218
                        String attrName;
219
                        Evaluator evaluator;
220
                        while (returnValue == 0 && iter.hasNext()) {
221
                                item = iter.next();
222
                                if (item instanceof String) {
223
                                        attrName = (String) item;
224
                                        returnValue = this
225
                                                        .myCompare(f0.get(attrName), f1
226
                                                        .get(attrName));
227
                                } else {
228
                                        evaluator = (Evaluator) item;
229
                                        try {
230
                                                returnValue = this.myCompare(evaluator
231
                                                                .evaluate((EvaluatorData) f0), evaluator
232
                                                                .evaluate((EvaluatorData) f1));
233
                                        } catch (EvaluatorException e) {
234
                                                throw new DataEvaluatorRuntimeException(e);
235
                                        }
236
                                }
237
                        }
238

    
239
                        return returnValue;
240
                }
241

    
242
        }
243

    
244
}