Để thực hiện việc sinh mã nguồn, ta cần thêm một bước chuyển đổi từ các mô hình mức PSM thu được ở trên sang code Java và JSP. Việc này được hỗ trợ bởi các truy vấn ATL.
Truy vấn ATL là chức năng do ATL cung cấp để thực hiện các hành động xử lý, tính toán trên các mô hình nguồn mà không sinh ra mô hình đích. Trong đó, có việc sinh chuỗi kí tự và ghi ra file. Các truy vấn ATL nhận đầu là các mô hình Java, JSP thu được ở phần trên và cho đầu ra là các file mã nguồn .java và .jsp tương ứng. 3.3.3.1. Sinh code từ mô hình java
Để thực hiện sinh mã nguồn từ các mô hình java tác giả đã phát triển 06 truy vấn ATL, được thể hiện tại bảng 3.11.
Bảng 3.11. Các truy vấn sinh mã từ mô hình java
Tên truy vấn Mục đích
Java2Code Duyệt tất cả class, gọi toString() để sinh mã và ghi ra file toString Sinh mã cho một phần tử nào đó (package, class, field,
method, parameter)
visibility Sinh mã phần access modifier (private, default, protected, public)
scope Sinh mã từ khoá static
fullName Sinh mã cho tên package, kiểu dữ liệu kèm theo đường dẫn package đầy đủ
Chi tiết truy vấn ATL Java2Code:
query Java2Code = JAVA!Type.allInstances()
-> select(e | e.oclIsTypeOf(JAVA!JavaClass)) -> collect(x | x.toString()
.writeTo('/UWE2JAVA/Output/java/' +
thisModule.getPackageName()
.replaceAll('.', '/') + '/' + x.name + '.java')); 3.3.3.2. Sinh code từ mô hình JSP
Để thực hiện sinh mã nguồn từ các mô hình JSP tác giả đã sử dụng 04 truy vấn ATL, được thể hiện tại bảng 3.12.
Bảng 3.12. Truy vấn ATL sinh mã mô hình JSP
Tên truy vấn Ý nghĩa
JSP2Code Duyệt tất cả các nút Root, với mỗi nút Root, gọi getChildren duyệt tất cả các thẻ (mỗi thẻ gọi getAttributes duyệt tất cả các thuộc tính) và gọi toCode để sinh mã, ghi vào file tương ứng
getChildren Duyệt tất cả các thẻ
getAttributes Duyệt tất cả các thuộc tính
toCode Sinh mã cho một phần tử (thẻ hoặc thuộc tính) Chi tiết truy vấn JSP2Code:
query JSP2Code = JSP!Root.allInstances()
-> collect(n | n.getChildren()
-> iterate(n; acc: String = '' | acc + n.toCode()) .writeTo('/UWE2JAVA/Output/resources/jsp/' +
n.documentName));
3.4. Thử nghiệm sinh mã cho ứng dụng web benhthuysan.vn 3.4.1. Công cụ sinh mã CODEGER-UWE 3.4.1. Công cụ sinh mã CODEGER-UWE
Công cụ hỗ trợ đầy đủ là yếu tố quan trọng quyết định thành công của phương pháp hoặc kỹ thuật phát triển phần mềm nói chung và ứng dụng Web nói riêng [1]. Việc sử dụng công cụ sinh mã sẽ cải thiện quy trình phát triển phần mềm và làm tăng chất lượng của mã được tạo ra [2]. Đối với phương pháp UWE (UML-based Web Engineering) cũng đã có một số công cụ như ArgoUWE, UWE4JSF [3]. Đây là công
cụ tự động sinh mã ứng dụng Web với nền tảng JSF (JavaServer Faces) từ mô hình UWE, bao gồm một chuỗi các plugin được tích hợp trong môi trường mô hình hóa Eclipse EMF (Eclipse Modeling Framework), được xây dựng và đóng gói thành các thư viện Java (.jar). Đây là minh chứng cho khả năng sinh mã nguồn cho ứng dụng Web hướng mô hình theo phương pháp UWE, nhưng hiện tại đã không còn được tiếp tục phát triển và không thể vận hành với các phiên bản mới của Eclipse cũng như UWE profile. Công cụ MagicUWE hỗ trợ thiết kế hệ thống ứng dụng web với phương pháp UWE [4], giúp phát triển ứng dụng web các hoạt động lập mô hình bằng cách sử dụng cấu hình UWE và chuyển đổi giữa các mô hình UWE. MagicUWE được triển khai như một plugin cho công cụ MagicDraw. Tuy nhiên, công cụ này chủ yếu tập trung vào chuyển đổi mô hình, chưa tập trung cho việc sinh mã. Trong nội dung này, tác giả trình bày công cụ CODEGER-UWE, một plugin được tác giả xây dựng và tích hợp trong phần mềm MagicDraw cho phép sinh mã nguồn từ bốn mô hình UWE, tương ứng với các thành phần trong mô hình Web MVC.
CODEGER-UWE là công cụ được tích hợp các quy tắc chuyển đổi mô hình và các giải thuật sinh mã, để tạo ứng dụng web một cách tự động từ các mô hình UWE tương ứng với các thành phần trong mô hình Web MVC. Đây là một công cụ với quy trình phát triển rõ ràng, tiện dụng, áp dụng công cụ để phát triển ứng dụng web sẽ làm giảm rất nhiều thời gian cho việc phát triển ứng dụng Web.
Hình 3.19.Kiến trúc CODEGER –UWE
Quy tắc chuyển đổi mô hình
Chuyển đổi mô hình được phân chia thành một vài mô đun. Công việc cần làm là thiết lập từng mô đun cho mỗi công đoạn chuyển đổi mô hình UWE. Trong mô đun
này đã tích hợp 31 quy tắc chuyển đổi từ mô hình yêu cầu sang mô hình nội dung, điều hướng, xử lý và trình bày với ngôn ngữ chuyển đổi mô hình ATL. Để chuyển đổi từ CIM sang PIM, đầu vào là mô hình yêu cầu (CIM), dựa trên UML Metamodel, UWE Metamodel và UWE Profile được ánh xạ với nhau, chúng gồm các phần có quan hệ tuyến tính với nhau. Ngoài ra, UWE Meta-model còn là sự mở rộng của UML Meta-model. Do đó, việc chuyển đồi phần lớn gồm các quy tắc sẽ ánh xạ các thành phần khuôn mẫu UML (stereotype) sang các thành phần tương ứng của UWE Metamodel và các thành phần UML cơ bản được lồng ghép vào. Các quy tắc ATL được phân chia theo mỗi mô hình UWE để xử lý việc chuyển đổi. Kết quả sau chuyển đổi là các mô hình nội dung, điều hướng, xử lý và trình bày cho ứng dụng Web được tạo ra.
Quy tắc và giải thuật sinh code
Chuyển đổi từ CIM sang PIM đơn thuần chỉ là ánh xạ giữa mô hình UML và mô hình UWE. Đối với chuyển đổi UWE2JSF (hay là từ PIM sang PSM) trong CODEGER-UWE áp dụng phương pháp khuôn mẫu và metamodel, kết hợp với sự tương đồng về mặt định nghĩa của bốn mô hình trong UWE là mô hình nội dung, điều hướng, xử lý, trình bày với ba thành phần trong mô hình MVC