Insertions.java revision 567ba7d414e53451066008d98bbeacdfed876ace
1290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brownpackage annotator.find;
2290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
3567ba7d414e53451066008d98bbeacdfed876aceDan Brownimport java.util.ArrayList;
4290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brownimport java.util.Collection;
5290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brownimport java.util.Collections;
6290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brownimport java.util.HashMap;
7290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brownimport java.util.HashSet;
8290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brownimport java.util.Iterator;
9567ba7d414e53451066008d98bbeacdfed876aceDan Brownimport java.util.List;
10290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brownimport java.util.Map;
11290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brownimport java.util.NoSuchElementException;
12290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brownimport java.util.Set;
13290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
14290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown/**
15290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown * @author dbro
16290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown *
178f971580eef13b1a49953e94d5a7192bb12683c6Javier Thaine * The motivation for this class was to avoid wasting time going through an entire scene
188f971580eef13b1a49953e94d5a7192bb12683c6Javier Thaine * (which could involve many different classes) for every class. This makes an immense
198f971580eef13b1a49953e94d5a7192bb12683c6Javier Thaine * difference when a JAIF covers every class in a large codebase such as Hadoop.
208f971580eef13b1a49953e94d5a7192bb12683c6Javier Thaine *
21290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown */
22290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brownpublic class Insertions implements Iterable<Insertion> {
23290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  private static final Set<Insertion> EMPTY_SET =
24290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      Collections.<Insertion>emptySet();
258f971580eef13b1a49953e94d5a7192bb12683c6Javier Thaine  private Map<String, Set<Insertion>> store; // Map of class name to insertions
268f971580eef13b1a49953e94d5a7192bb12683c6Javier Thaine
27290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  private int size;
28290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
29290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  public Insertions() {
30290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    store = new HashMap<String, Set<Insertion>>();
31567ba7d414e53451066008d98bbeacdfed876aceDan Brown    size = 0;
32290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  }
33290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
34290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  public Set<Insertion> forClass(String cls) {
35290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    return store.containsKey(cls) ? store.get(cls) : EMPTY_SET;
36290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  }
37290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
38290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  public void add(Insertion ins) {
39290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    InClassCriterion icc = ins.getCriteria().getInClass();
40290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    String key = "";
41290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    if (icc != null) {
42290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      int i = icc.className.lastIndexOf('.');
43290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      key = i < 0 ? icc.className : icc.className.substring(i + 1);
44290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      i = key.indexOf('$');
45290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      if (i > 0) { key = key.substring(0, i); }
46290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    }
47567ba7d414e53451066008d98bbeacdfed876aceDan Brown
48567ba7d414e53451066008d98bbeacdfed876aceDan Brown    Set<Insertion> val = store.get(key);
49567ba7d414e53451066008d98bbeacdfed876aceDan Brown    if (val == null) {
50567ba7d414e53451066008d98bbeacdfed876aceDan Brown      val = new HashSet<Insertion>();
51567ba7d414e53451066008d98bbeacdfed876aceDan Brown      store.put(key, val);
52290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    }
53567ba7d414e53451066008d98bbeacdfed876aceDan Brown    size -= val.size();
54567ba7d414e53451066008d98bbeacdfed876aceDan Brown    val.add(ins);
55567ba7d414e53451066008d98bbeacdfed876aceDan Brown    size += val.size();;
56290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  }
57290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
58290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  public void addAll(Collection<? extends Insertion> c) {
59290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    for (Insertion ins : c) {
60290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      add(ins);
61290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    }
62290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  }
63290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
64290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  public int size() {
65290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    return size;
66290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  }
67290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
68290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  @Override
69290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  public Iterator<Insertion> iterator() {
70290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    return new Iterator<Insertion>() {
71290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      Iterator<Set<Insertion>> siter = store.values().iterator();
72290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      Iterator<Insertion> iiter = EMPTY_SET.iterator();
73290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
74290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      @Override
75290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      public boolean hasNext() {
76290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown        if (iiter.hasNext()) { return true; }
77290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown        while (siter.hasNext()) {
78290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown          iiter = siter.next().iterator();
79290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown          if (iiter.hasNext()) {
80290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown            return true;
81290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown          }
82290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown        }
83290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown        return false;
84290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      }
85290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
86290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      @Override
87290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      public Insertion next() {
88290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown        if (hasNext()) { return iiter.next(); }
89290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown        throw new NoSuchElementException();
90290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      }
91290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown
92290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      @Override
93290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      public void remove() {
94290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown        throw new UnsupportedOperationException();
95290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown      }
96290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown    };
97290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown  }
98567ba7d414e53451066008d98bbeacdfed876aceDan Brown
99567ba7d414e53451066008d98bbeacdfed876aceDan Brown  public List<Insertion> toList() {
100567ba7d414e53451066008d98bbeacdfed876aceDan Brown    List<Insertion> list = new ArrayList<Insertion>(size);
101567ba7d414e53451066008d98bbeacdfed876aceDan Brown    for (Set<Insertion> insertions : store.values()) {
102567ba7d414e53451066008d98bbeacdfed876aceDan Brown      list.addAll(insertions);
103567ba7d414e53451066008d98bbeacdfed876aceDan Brown    }
104567ba7d414e53451066008d98bbeacdfed876aceDan Brown    return null;
105567ba7d414e53451066008d98bbeacdfed876aceDan Brown  }
106290791bf3ace51eca8cb637b47e1e1d01d92111dDan Brown}
107