Một lớp sẽ có nhiều hàm, một hàm sẽ có nhiều nhánh, một nhánh có thể không chứa hoặc chứa nhiều nhánh con. Lớp LineEntry dùng để lưu trữ thông tin của dòng log bao gồm: tên lớp, chỉ số dòng trong code java, nội dung dòng code và chỉ số dòng đó trong file log. Lặp qua từng dòng log trong danh sách các dòng log, đưa thông tin từng dòng log vào từng đối tượng LineEntry.
public static List<ClassEntry> parseLog(String fileName) throws
IOException {
List<String> listOfLines = FileReader.readFile(fileName, false);
List<LineEntry> lineEntryList = new ArrayList<LineEntry>();
int index = 0;
for (String line : listOfLines) {
String[] arrays = line.split(".java");
String className = arrays[0].trim();
int lineNumber =
41
String lineInfo = arrays[1].split(":")[2];
if (!lineInfo.contains(MY_EXCEPTION)){
lineEntryList.add(new LineEntry(className, lineNumber,
lineInfo, index)); }
index++; }
List<ClassEntry> classEntries = getClassEntries(lineEntryList);
setMethodEntries(lineEntryList, classEntries); setBranchEntries(lineEntryList, classEntries); collectBranchesHaveSameMethod(lineEntryList, classEntries); reOrderBranches(lineEntryList, classEntries); return classEntries; }
- Lặp qua danh sách LineEntry, tìm thông tin các class và lưu vào danh sách ClassEntry. Đối với thông tin lớp có 2 trường hợp:
Lớp gọi hàm static : sẽ có dạng “<Tên lớp>.”
Lớp được khởi tạo trước khi gọi hàm : sẽ chứa tên lớp và dấu “(”. Tên lớp đã lưu trữ trong đối tượng LineEntry.
- Lặp qua từng ClassEntry trong danh sách ClassEntry, với mỗi đối tượng ClassEntry, lặp lại danh sách LineEntry để tìm thông tin của hàm. Sau đó lưu danh sách MethodEntry vào lại ClassEntry đang xét.
- Tương tự, lặp qua từng MethodEntry của ClassEntry, dựa vào danh sách LineEntry để tìm thông tin của nhánh và lưu vào danh sách BranchEntry của MethodEntry đang xét. Nếu dòng code nào bắt đầu bằng một trong các key word sau thì đó là nhánh: “if”, ”else”,“elseif”, “while”, “do”, ”for”, ”switch”, “case”.
5.3.2 Phân tích mã nguồn
Để có thể so sánh xem nhánh nào trong đồ thị chưa phủ chúng ta cần phân tích mã nguồn về dạng tương tự như dữ liệu vết đã phân tích. Từ dữ liệu vết thu được với các class, method kết hợp dò tìm trên mã nguồn chương trình sẽ biên tập lại mã nguồn đó thành các lớp lưu trữ tên lớp, tên phương thức, tên nhánh. Hình 5. 6 thể hiện biểu đồ tuần tự quá trình phân tích mã nguồn. Sau khi đã có một danh sách ClassEntry, ta lặp qua danh sách ClassEntry, với từng phần tử ClassEntry, lấy ra tên lớp. Sau đó tìm kiếm file java có tên lớp đó, hàm nào có xuất hiện trong file log của jpf thì sẽ đọc thông tin của hàm đó.
42