Như ta đã biết, để chuyển từ trạng thái này, sang trạng thái kia thì cần có hàm chuyển trạng thái. Trong nghiên cứu của tôi, hàm chuyển trạng thái được mô tả trong các cạnh của biểu đồ trạng thái. Tập hợp các hàm chuyển trạng thái sẽ tạo thành giao thức mô tả hoạt động của đối tượng. FSM được xây dựng cần phải mô tả được giao thức này. Mặt khác, trong mã nguồn của chương trình, các trạng thái hầu như không
có ý nghĩa, các đoạn mã chỉ mô tảcác phương thức được thực hiện – chính là các cạnh của biểu đồ, và mục đích của việc kiểm chứng ởđây chính là kiểm tra xem các phương
thức trong mã nguồn của chương trình có được gọi theo đúng giao thức đã được chỉ ra
hay không. Để kiểm tra việc này, công cụ tự sinh aspect cần phải biết phương thức nào
được gọi trước, phương thức nào được gọi sau từđó sẽ kiểm tra được các vi phạm các giao thức ràng buộc đối tượng. FSM được xây dựng cần phải mô tả được điều này. Dựa vào bài báo [5] tôi xây dựng FSM gồm các thành phần dữ liệu sau:
HashMap<String, Set<String>> fsm = null; HashSet<String> entrySigs, exitSigs;
41
HashMap<String, Set<String>> stateMap = null;
Trong đó:
- entrySigs: Mô tả các cạnh đi ra từ trạng thái bắt đầu. - exitSigs: Mô tả các cạnh đi vào trạng thái kết thúc.
- fsm: Là một HashMap, với key chính là một cạnh đi ra từ một trạng thái trung gian. Value chính là các cạnh đi vào trạng thái này.
- stateMap: Biểu diễn các trạng thái và các cạnh đi vào trạng thái.
Hashmap này sẽđược dùng đểđánh số các trạng thái của biểu đồ. Thuật toán xây dựng FSM như sau:
- Input: tài liệu XMI mô tả biểu đồ trạng thái UML - Output: FSM nếu xây dựng được, nếu không sẽ báo lỗi. - Các bước thực hiện:
o Khởi tạo fsm, entrySigs, exitSigs, stateMap.
o Đọc file XMI, lấy ListStates và ListTransitions. o Duyệt từng State trong ListStates
Tạo giá trị cho stateMap:
• Nếu nó là trạng thái bắt đầu: thêm một phần tử mới với
key là “START”, value = null.
• Ngược lại thêm vào stateMap một phần tử với với key
là tên trạng thái hiện tại, value là tên của các cạnh đi vào đỉnh.
Nếu nó là trạng thái bắt đầu, lấy tên + precondition cho vào
entrySigs và cho vào fsm (biến fsm) với key là tên +
precondition còn value là: “START”.
Nếu nó là trạng thái kết thúc, lấy tên + precondition cho vào
exitSigs.
Nếu nó là trạng thái trung gian.
• Lấy tên của tất cả các cạnh đi vào trạng thái cho vào cấu trúc dữ liệu dạng “Set” trong Java.
• Duyệt từng cạnh đi ra từ trạng thái. Lấy tên +
precondition. Thêm vào fsm key là tên + precondition
của cạnh đi ra và value là “Set” chứa các cạnh đi vào ở
42