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 |
} |