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

View differences:

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