Statistics
| Revision:

root / branches / Mobile_Compatible_Hito_1 / libFMap / src-data / org / gvsig / data / vectorial / order / FeatureComparator.java @ 21606

History | View | Annotate | Download (4.2 KB)

1
package org.gvsig.data.vectorial.order;
2

    
3
import java.util.Comparator;
4
import java.util.Iterator;
5

    
6
import org.gvsig.data.exception.EvaluationExpressionException;
7
import org.gvsig.data.exception.ReadException;
8
import org.gvsig.data.vectorial.IFeature;
9
import org.gvsig.data.vectorial.IFeatureAttributeDescriptor;
10
import org.gvsig.data.vectorial.IFeatureID;
11
import org.gvsig.data.vectorial.IFeatureType;
12
import org.gvsig.data.vectorial.filter.FeatureFilterParser;
13

    
14
public class FeatureComparator implements Comparator {
15
        protected String expresionString;
16
        protected IFeatureType featureType;
17
        protected ComparatorToken[] tokens;
18

    
19
        public FeatureComparator(IFeatureType featureType,String expresion){
20
                this.featureType=featureType;
21
                this.expresionString=expresion;
22
                this.initExpressionList();
23

    
24
        }
25

    
26
        protected void initExpressionList(){
27
                String[] stokens = this.expresionString.split(",");
28
                tokens = new ComparatorToken[stokens.length];
29
                String stoken;
30
                int i;
31
                for (i=0;i<stokens.length;i++){
32
                        stoken = stokens[i].trim();
33
                        tokens[i] = new ComparatorToken(stoken,this.featureType);
34
                }
35
        }
36

    
37
        private IFeature toFeature(Object arg) throws ReadException{
38
                if (arg instanceof IFeatureID){
39
                        return ((IFeatureID)arg).getFeature(featureType);
40
                } else {
41
                        return (IFeature)arg;
42
                }
43
        }
44

    
45
        public int compare(Object arg0, Object arg1) {
46
                IFeature feature0, feature1;
47
                try {
48
                        feature0 = toFeature(arg0);
49
                        feature1 = toFeature(arg1);
50
                } catch (ReadException e1) {
51
                        throw new RuntimeException(e1);
52
                        //FIXME: OJO!!!! Revisar la excepcion que lanzamos aqui!!!!
53
                        // Tendriamos que lanzar un ReadException, pero
54
                        // no podemos por implementar el interface 'Comparator'.
55

    
56
                }
57

    
58

    
59
                int i,result;
60

    
61
                for (i=0;i<tokens.length;i++){
62
                        try {
63
                                result=tokens[i].compareFeatures(feature0, feature1);
64
                        } catch (ReadException e) {
65
                                throw new RuntimeException(e);
66
                                //FIXME: OJO!!!! Revisar la excepcion que lanzamos aqui!!!!
67
                                // Tendriamos que lanzar un ReadException, pero
68
                                // no podemos por implementar el interface 'Comparator'.
69
                        }
70
                        if (result != 0){
71
                                return result;
72
                        }
73
                }
74
                // Son iguales sus valores, pero si devolvemos
75
                // un 0 java puede considera que 'ES EL MISMO OBJETO'
76
                // y decidir NO A?ADIR a una lista una de las dos
77
                // features.
78
                // Por eso comparamo primero sus 'FeatureID' y
79
                // si son iguales devolvemos un 0 (es la misma feature)
80
                // sino devuelve -1.
81

    
82
                if (feature0.getID().equals(feature1.getID())){
83
                        return 0;
84
                }
85
                return -1;
86
        }
87

    
88
        private class ComparatorToken{
89
                private String textToken;
90
                private String textParser;
91
                private boolean ascendent=true;
92
                private FeatureFilterParser parser;
93
                private IFeatureType featureType;
94
                private boolean isSimple=false;
95

    
96
                public ComparatorToken(String textToken,IFeatureType featureType){
97
                        this.textToken= textToken;
98
                        this.featureType= featureType;
99

    
100
                        if (this.textToken.toLowerCase().endsWith(" desc")){
101
                                this.textParser = this.textToken.substring(0,this.textToken.length()-5);
102
                                this.ascendent=false;
103
                        } else if (this.textToken.toLowerCase().endsWith(" asc")) {
104
                                this.textParser = this.textToken.substring(0,this.textToken.length()-4);
105
                        } else{
106
                                this.textParser = this.textToken;
107
                        }
108
                        Iterator iter = this.featureType.iterator();
109
                        IFeatureAttributeDescriptor attribute;
110
                        while (iter.hasNext()){
111
                                attribute = (IFeatureAttributeDescriptor)iter.next();
112
                                if (attribute.getName().equalsIgnoreCase(this.textParser)){
113
                                        this.isSimple=true;
114
                                        this.textParser=attribute.getName();
115
                                        break;
116
                                }
117
                        }
118
                        if (!this.isSimple){
119
                                this.parser = new FeatureFilterParser(this.textParser,this.featureType);
120
                        }
121

    
122
                }
123

    
124
                public int compareFeatures(IFeature feature0,IFeature feature1) throws ReadException{
125
                        Comparable value0,value1;
126
                        if (this.isSimple){
127
                                value0 = (Comparable)feature0.get(this.textParser);
128
                                value1 = (Comparable)feature1.get(this.textParser);
129
                        }else{
130
                                value0 = parser.getValue(feature0);
131
                                value1 = parser.getValue(feature1);
132
                        }
133
                        if (ascendent){
134
                                if (value0 == null){
135
                                        return 1;
136
                                } else if (value1 == null){
137
                                        return -1;
138
                                }
139
                                return value0.compareTo(value1);
140
                        }else{
141
                                if (value1 == null){
142
                                        return 1;
143
                                } else if (value0 == null){
144
                                        return -1;
145
                                }
146
                                return value1.compareTo(value0);
147
                        }
148

    
149
                }
150

    
151
        }
152

    
153

    
154

    
155
}