1 6 package de.uka.ipd.coverage.natures.all_uses; 7 8 import java.util.*; 9 10 import org.apache.bcel.classfile.LineNumberTable; 11 import org.apache.bcel.classfile.Method; 12 13 18 public class UsesCoverage { 19 20 private ArrayList coveredUses = new ArrayList(); 22 private ArrayList uncoveredUses = new ArrayList(); 24 private DefinitionFreePath dfp; 25 26 public UsesCoverage(DefinitionFreePath dfp) { 27 this.dfp = dfp; 28 } 29 30 public void addCoveredUsesByteCodePositions(Integer [] byteCodePositions) { 31 List byteCodeList = Arrays.asList(byteCodePositions); 32 this.coveredUses.addAll(getSourceLineNumbers(byteCodeList)); 33 } 34 35 public void addUncoveredUsesByteCodePositions(Integer [] byteCodePositions) { 36 List byteCodeList = Arrays.asList(byteCodePositions); 37 this.uncoveredUses.addAll(getSourceLineNumbers(byteCodeList)); 38 } 39 40 41 44 public int[] getCoveredUsesSourceLineNumbers() { 45 return convertToIntArray(coveredUses); 46 } 47 48 51 public int[] getUncoveredUsesSourceLineNumbers() { 52 return convertToIntArray(uncoveredUses); 53 } 54 55 private int[] convertToIntArray(List sourceLineList) { 56 int[] result = new int[sourceLineList.size()]; 57 for (int i = 0; i < result.length; i++) { 58 result[i] = ((Integer ) sourceLineList.get(i)).intValue(); 59 } 60 return result; 61 } 62 63 69 private List getSourceLineNumbers(List byteCodePositions) { 70 LineNumberTable lnt = dfp.getRegisteredMethod().getMethod().getLineNumberTable(); 71 List result = new ArrayList(byteCodePositions.size()); 72 for (Iterator iter = byteCodePositions.iterator(); iter.hasNext();) { 73 Integer byteCodePos = (Integer ) iter.next(); 74 int sourcecodeLine = lnt.getSourceLine(byteCodePos.intValue()); 75 result.add(new Integer (sourcecodeLine)); 76 } 77 return result; 78 } 79 80 93 public static UsesCoverage merge(UsesCoverage inventory, UsesCoverage additionalUses) { 94 if (!inventory.dfp.hasSameDefinitionAs(additionalUses.dfp) 96 104 && !referenceDifferentConstructors(inventory.dfp, additionalUses.dfp)) { 105 throw new AssertionError (" Cannot merge Uses with different definitions. Requested merging of " + inventory.toString() + " and " + additionalUses ); } 107 UsesCoverage result = new UsesCoverage(inventory.dfp); 108 List addUsesCovered = (List) additionalUses.coveredUses.clone(); 109 List addUsesUncovered = (List) additionalUses.uncoveredUses.clone(); 110 List invUsesCovered = (List) inventory.coveredUses.clone(); 111 List invUsesUncovered = (List) inventory.uncoveredUses.clone(); 112 113 while (invUsesCovered.size() > 0) { 114 Object line = invUsesCovered.get(0); 115 addUsesCovered.remove(line); 116 addUsesUncovered.remove(line); 117 invUsesUncovered.remove(line); 118 invUsesCovered.remove(0); 119 result.coveredUses.add(line); 120 } 121 122 while (addUsesCovered.size() > 0) { 123 Object line = addUsesCovered.get(0); 124 invUsesUncovered.remove(line); 125 addUsesUncovered.remove(line); 126 addUsesCovered.remove(0); 127 result.coveredUses.add(line); 128 } 129 130 while (addUsesUncovered.size() > 0) { 131 Object line = addUsesUncovered.get(0); 132 invUsesUncovered.remove(line); 133 addUsesUncovered.remove(0); 134 result.uncoveredUses.add(line); 135 } 136 137 for (Iterator iter = invUsesUncovered.iterator(); iter.hasNext();) { 138 result.uncoveredUses.add(iter.next()); 139 } 140 return result; 141 } 142 143 149 private static boolean referenceDifferentConstructors(DefinitionFreePath dfp2, DefinitionFreePath dfp3) { 150 Method method2 = dfp2.getRegisteredMethod().getMethod(); 151 Method method3 = dfp3.getRegisteredMethod().getMethod(); 152 String constructorName = "<init>"; if (constructorName.equals(method2.getName()) 154 && constructorName.equals(method3.getName())) { 155 if (method2 != method3) { 156 return true; 157 } 158 } 159 return false; 160 } 161 162 public String toString() { 163 String result = " def (" + dfp.getDefinition() + "), covered uses ("; for (Iterator iter = coveredUses.iterator(); iter.hasNext();) { 165 Integer element = (Integer ) iter.next(); 166 result = result + " " + element.toString(); } 168 result = result + "), uncovered uses ("; for (Iterator iter = uncoveredUses.iterator(); iter.hasNext();) { 170 Integer element = (Integer ) iter.next(); 171 result = result + " " + element.toString(); } 173 result = result + ");"; return result; 175 } 176 } 177 | Popular Tags |