.4 Mã Aspect cho kiểm tra tính ràng buộc thời gian

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Kiểm tra ràng buộc thời gian sử dụng phương pháp AOP (Trang 57 - 62)

5.1.2.2 Template tổng hợp cho kiểm tra tính tuần tự và ràng buộc thời gian. thời gian.

Template sẽ gồm các phần của việc thiết kế ở trên, gồm 3 kiểu pointcut cho kiểm tra tính tuần tự, và 1 pointcut cho kiểm tra thời gian. Trong chương trình Java ta sẽ lưu

Template là các xâu ( String ), và sẽ thao tác với các xâu này để sinh mã aspect tự động. Phần đầu aspect, gồm import các package cần thiết, khai báo các đối tượng

ShareStateManager và ReadtoHashMap để đọc file xml lấy các thông tin cần thiết cho kiểm tra .

Khuân mẫu đầu aspect

static final String aspectHead =

"//PROTOCOL is:\r\n"+ "/*\r\n"+ "$PROTOCOL$\r\n"+ "*/\r\n"+ "import java.io.File;\r\n" + "import java.util.*;\r\n" +

"import org.aspectj.lang.JoinPoint;\r\n" + "import FSMGenerator.*;\r\n" +

" import ReadTimingConstraints.*; \r\n" + "public aspect AspectChecker { \r\n" +

" int NUMBER_OF_CLASSES = $NUMBEROFCLASSES$;\r\n" + " long t2;\r\n " +

" String mn;\r\n" +

" ReadtoHashMap constraints = new ReadtoHashMap();\r\n"+ " SharedStateManager sm = new

SharedStateManager(NUMBER_OF_CLASSES); \r\n" +

" static HashMap<String, Set<String>> fsm = null;\r\n" + " static HashSet<String> entrySigs, exitSigs;\r\n" + " AspectChecker(){\r\n" +

" if (fsm == null) loadProtocol();\r\n" + " }\r\n" +

"$ASPECT_BODIES$\r\n" + "}\r\n";

Xâu template cho pointcut bắt đầu : static String strPointcutEntry =

" pointcut pc_$METHODNAME$($METHOD_ARG$): $ARGS$ call ($METHOD_RETURN$ $METHOD_NAME$($METHOD_ARG_TYPE$)) ;\r\n" +

" before($METHOD_ARG$): pc_$METHODNAME$($METHOD_ARG_NAME$) {\r\n" + " Object o = thisJoinPoint.getTarget();\r\n"+ " if (!sm.isBinded(o)) \r\n"+ " sm.newSharedState(o);\r\n"+ " }\r\n" + " after($METHOD_ARG$): pc_$METHODNAME$($METHOD_ARG_NAME$) {\r\n" + " String s = thisJoinPoint.getSignature().toString();\r\n" + " Object o = thisJoinPoint.getTarget();\r\n" +

" log(\"change state: \" + sm.getSharedState(o).getState() + \" ---> \" + s); \r\n" +

" sm.setSharedState(o, s);\r\n" + " }\r\n";

Xâu template của pointcut trung gian: static String strPointcut =

" pointcut pc_$METHODNAME$($METHOD_ARG$): $ARGS$ call ($METHOD_RETURN$ $METHOD_NAME$($METHOD_ARG_TYPE$));\r\n" +

" before ($METHOD_ARG$):

" Object o = thisJoinPoint.getTarget();\r\n" + " if (!sm.isBinded(o))\r\n"+ " sm.bind(o);\r\n" + " String s = thisJoinPoint.getSignature().toString();\r\n"+ " if (! isValidState(o, s)) {\r\n" + " log(\"Invalid change: \" + sm.getSharedState(o).getState() + \" ---> \" + s); \r\n" + " log(thisJoinPoint);\r\n" + " }\r\n"+ " }\r\n" + " after($METHOD_ARG$): pc_$METHODNAME$($METHOD_ARG_NAME$) {\r\n" + " String s = thisJoinPoint.getSignature().toString();\r\n" + " Object o = thisJoinPoint.getTarget();\r\n" +

" log(\"change state: \" + sm.getSharedState(o).getState() + \" ---> \" + s); \r\n" +

" sm.setSharedState(o, s);\r\n" + " }\r\n";

Xâu template cho pointcut kết thúc : static String strPointcutExit =

" pointcut pc_$METHODNAME$($METHOD_ARG$): $ARGS$ call ($METHOD_RETURN$ $METHOD_NAME$($METHOD_ARG_TYPE$));\r\n" +

" before($METHOD_ARG$): pc_$METHODNAME$($METHOD_ARG_NAME$) {\r\n" + " Object o = thisJoinPoint.getTarget();\r\n" + " if (!sm.isBinded(o))\r\n"+ " sm.bind(o);\r\n" + " String s = thisJoinPoint.getSignature().toString();\r\n"+ " if (! isValidState(o, s)) {\r\n" + " log(\"Invalid change: \" + sm.getSharedState(o).getState() + \" ---> \" + s); \r\n" + " log(thisJoinPoint);\r\n" + " }\r\n"+ " }\r\n" + " after($METHOD_ARG$): pc_$METHODNAME$($METHOD_ARG_NAME$){\r\n" + " String s = thisJoinPoint.getSignature().toString();\r\n" + " Object o = thisJoinPoint.getTarget();\r\n" +

" log(\"change state: \" + sm.getSharedState(o).getState() + \" ---> \" + s); \r\n" +

" if (exitSigs.contains(s))\r\n" + " sm.reset(o);\r\n" + " }\r\n";

Phần còn lại của mã aspect chứa các phương thức cho việc : đưa ra thông báo vi phạm, khởi tạo và đọc thông tin từ file xml về biểu đồ UML.

Static String aspectTail =

" void log(JoinPoint jp){\r\n" + " String s = \"WRONG: \" +\r\n" + " jp.getSourceLocation() + \":\" + \r\n" + " jp.getSignature();\r\n" + " System.out.println(s);\r\n" + " }\r\n" + " void log(String s) {\r\n" + " System.out.println(\"INF: \"+ s);\r\n" + " }\r\n" +

" void logTiming(JoinPoint jp) { \r\n" + // new " System.out.println(jp.getSourceLocation().toString() + jp.getSignature().toString());\r\n" +

" }\r\n" +

" boolean isValidState(Object o, String st){\r\n" + " boolean b = fsm.containsKey(st);\r\n" +

" SharedState state = sm.getSharedState(o);\r\n" + " String objState = state.getState();\r\n" +

" if (b)\r\n" +

" b = fsm.get(st).contains(objState);\r\n" + " return b;\r\n" +

" }\r\n" +

" public void loadProtocol(){\r\n" + " try{\r\n" +

" File xmlFile = new File (\"./src/model/sequence.xml\");\r\n" + " SequenceDiagramFSM colfsm = new

SequenceDiagramFSM(xmlFile);\r\n" +

" fsm = colfsm.fsm;\r\n" +

" entrySigs = colfsm.entrySigs;\r\n" + " exitSigs = colfsm.exitSigs;\r\n" +

" constraints.Read(xmlFile); \r\n" + " } catch (Exception e)\r\n" + " {\r\n" +

" e.printStackTrace();\r\n" + " }\r\n" +

5.1.2.3 Sinh mã Aspect tự động từ máy trạng thái và Template

Đến đây ta đã làm được các việc : đọc XML để lấy đặc tả ràng buộc trình tự gọi phương thức và ràng buộc thời gian, thiết kế template aspect cho việc kiểm tra ràng buộc. Từ các kết quả đó, chúng ta sẽ cài đặt chương trình tự động sinh mã aspect phục vụ cho kiểm tra.

Như đã trình bày các pointcut trong aspect này được chia ra làm ba loại : - pc_entry: pointcut dùng để bắt phương thức đầu tiên trong giao thức - pc_exit: pointcut dùng để bắt phương thức cuối cùng trong giao thức - pc: pointcut dùng để bắt các phương thức khác.

Và việc sinh mã aspect cũng sẽ làm với từng loại pointcut này.

Ngoài ra trong mã aspect sẽ còn các phương thức nhằm khởi tạo và lấy dữ liệu từ xml, phục vụ cho việc kiểm tra chương trình khi chạy.

Thuật toán của chương trình sẽ được cài đặt như sau :

- Duyệt lần lượt các hàm trong entrySigs tạo ra loại pointcut pc_entry và các advice.

- Duyệt lần lượt các hàm trong exitSigs tạo ra loại pointcut pc_exit và các advice. - Duyệt lần lượt các hàm trong key của fsm, tạo ra loại pointcut pc và các advice - Ba loại pointcut này đều được tạo ra bằng cách xử lý các xâu ký tự, tách chuỗi thành tên hàm, kiểu trả về, tên tham số truyền vào, kiểu tham số truyền vào…

- Kết hợp các pointcut và advice đã tạo ra ở trên thành aspect kiểm chứng hoàn chỉnh.

- Thêm nữa, để quản lý trạng thái của SharedState, ta cần phải có dữ liệu của FSM mô tả biểu đồ trình tự UML. Vì vậy, trong aspect này sẽ chứa thêm phần mã nguồn tạo ra FSM từ biểu đồ trình tự UML như trong chương 4 đã trình bày.

5.2 Ví dụ chạy thử nghiệm

Trên cơ sở hệ thống thực nghiệm các module được cài đặt và mô tả như ở phần 5.1, chúng tôi đã chạy thử nghiệm thành công trên hệ thống ATM

5.2.1 Biểu đồ tuần tự và ràng buộc thời gian

Chúng ta đã biết biểu đồ tuần tự thể hiện sự hoạt động của hệ thống thực trong cụ thể từng tình huống nào đó, mà ở đây là các giao dịch với máy ATM, bao gồm các phương thức, thông điệp trao đổi giữa các đối tượng trong quá trình hoạt động, được biểu diễn cụ thể trong một thứ tự về thời gian ( lifeline ). Trong bài chúng ta sẽ xét 1 giao dịch đó là rút tiền với biểu đồ tuần tự như sau :

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Kiểm tra ràng buộc thời gian sử dụng phương pháp AOP (Trang 57 - 62)

Tải bản đầy đủ (PDF)

(76 trang)