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