Revision 43532 trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultInterpreter.java
DefaultInterpreter.java | ||
---|---|---|
1 | 1 |
package org.gvsig.expressionevaluator.impl; |
2 | 2 |
|
3 |
import java.util.ArrayList; |
|
4 |
import java.util.Comparator; |
|
5 |
import java.util.Date; |
|
6 |
import java.util.HashMap; |
|
7 |
import java.util.List; |
|
8 |
import java.util.Map; |
|
9 |
import org.apache.commons.lang3.tuple.Pair; |
|
3 | 10 |
import org.gvsig.expressionevaluator.SymbolTable; |
4 | 11 |
import org.gvsig.expressionevaluator.Interpreter; |
5 | 12 |
import org.gvsig.expressionevaluator.Code; |
... | ... | |
13 | 20 |
|
14 | 21 |
public class DefaultInterpreter implements Interpreter { |
15 | 22 |
|
23 |
private class DefaultCache implements Cache { |
|
24 |
|
|
25 |
private Map<Pair<Object,Object>,Pair<Object,Long>> data; |
|
26 |
|
|
27 |
public DefaultCache() { |
|
28 |
this.data = new HashMap<>(); |
|
29 |
} |
|
30 |
|
|
31 |
@Override |
|
32 |
public Object get(Object context, Object key) { |
|
33 |
Pair<Object, Long> v = this.data.get( Pair.of(context, key) ); |
|
34 |
return v.getLeft(); |
|
35 |
} |
|
36 |
|
|
37 |
@Override |
|
38 |
public void put(Object context, Object key, Object value) { |
|
39 |
if( this.data.size()>this.getMaxElements() ) { |
|
40 |
this.reduce(); |
|
41 |
} |
|
42 |
this.data.put(Pair.of(context, key), Pair.of(value, new Date().getTime())); |
|
43 |
} |
|
44 |
|
|
45 |
@Override |
|
46 |
public void remove(Object context, Object key) { |
|
47 |
this.data.remove(Pair.of(context, key)); |
|
48 |
} |
|
49 |
|
|
50 |
@Override |
|
51 |
public void removeAll() { |
|
52 |
this.data = new HashMap<>(); |
|
53 |
} |
|
54 |
|
|
55 |
private int getMaxElements() { |
|
56 |
return 100; |
|
57 |
} |
|
58 |
|
|
59 |
private void reduce() { |
|
60 |
List<Map.Entry<Pair<Object, Object>, Pair<Object, Long>>> entries = |
|
61 |
new ArrayList<>(this.data.entrySet()); |
|
62 |
entries.sort(new Comparator<Map.Entry<Pair<Object, Object>, Pair<Object, Long>>>() { |
|
63 |
@Override |
|
64 |
public int compare(Map.Entry<Pair<Object, Object>, Pair<Object, Long>> o1, Map.Entry<Pair<Object, Object>, Pair<Object, Long>> o2) { |
|
65 |
return o1.getValue().getRight().compareTo(o2.getValue().getRight()); |
|
66 |
} |
|
67 |
}); |
|
68 |
for( int i=0; i<this.getMaxElements()/2; i++ ) { |
|
69 |
this.data.remove(entries.get(i).getKey()); |
|
70 |
} |
|
71 |
} |
|
72 |
|
|
73 |
} |
|
74 |
|
|
16 | 75 |
private SymbolTable symbolTable = null; |
17 | 76 |
private Double accuracy; |
18 | 77 |
private Code currentCode; |
78 |
private final Cache cache; |
|
19 | 79 |
|
20 | 80 |
public DefaultInterpreter() { |
21 | 81 |
this.symbolTable = SQLSymbolTable.getInstance(); |
82 |
this.cache = new DefaultCache(); |
|
22 | 83 |
} |
23 | 84 |
|
24 | 85 |
@Override |
86 |
public Cache getCache() { |
|
87 |
return this.cache; |
|
88 |
} |
|
89 |
|
|
90 |
@Override |
|
25 | 91 |
public void setSymbolTable(SymbolTable symbolTable) { |
26 | 92 |
this.symbolTable = symbolTable; |
27 | 93 |
} |
Also available in: Unified diff