MDA (Model Driven Architecture) là một hướng tiếp cận mới trong việc phát triển các hệ thống phần mềm.
1. Tổng quan
1.1. Tổng quan về MDA
1.2. Các frameworks sử dụng cho ứng dụng web
2. Áp dụng MDA vào quá trình phát triển ứng dụng Web
2.1. Các hướng tiếp cận hỗ trợ cho MDA
2.2. Lập mô hình ứng dụng web với UX
2.3. Giới thiệu về MDA Toolkit
2.4. Quy trình phát triển MDA với Rational XDE và MDA Toolkit
3. Hiện thực
3.1. Pattern và Code Template
3.2. Plugin
3.3. Ứng dụng web: WebLog
115 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3014 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ội bộ hoặc
trên Web site. Mỗi nhà phát triển cài đặt các chuyển đổi mong muốn và các plugin đi kèm
(plugin phụ thuộc). Khi chúng đã được cài đặt, nhà phát triển sẽ có một menu các mục
chọn mới và tập các preference mặc định mà khi được triệu gọi nó sẽ nhắc nhà phát triển
các thông số được yêu cầu trước khi triệu gọi chuyển đổi đó.
Tất cả luận lý chuyển đổi trong ánh xạ được lập code ở trong chuyển đổi được tải
xuống (từ trên mạng nội bộ hay mạng intranet) và được thực thi với các chuyển đổi này.
Chỉ riêng điều này thôi thì không đủ để đảm bảo rằng bất kỳ chuyển đổi nào cũng được sử
dụng một cách chính xác. Do đó, hầu hết các chuyển đổi được xây dựng tốt sẽ bao gồm
các phần mới để được thêm vào phần help online của Eclipse. Những phần này sẽ chỉ ra
khi nào, tại sao và làm như thế nào một chuyển đổi được triệu gọi. Dĩ nhiên, trong mỗi
môi trường, quy trình này sẽ được cập nhật và được giao tiếp sao cho phù hợp.
Toolkit MDA cho IBM Rational XDE Java đã xuất hiện từ cuối năm 2003, và được
sử dụng trong nhiều trường hợp khách hàng khác nhau và đã được đúc kết thành các bài
học kinh nghiệm như sau.
2.4.5. Các bài học trong việc thiết kế và ứng dụng các giải pháp MDA
Khi tạo các giải pháp MDA các bước sau cần được theo một cách nhất quán
• Kiểm tra các mô hình đang được sử dụng trong quy trình phát triển, và các kết nối
ngữ nghĩa giữa các thành phần thuộc các mô hình có mức trừu tượng khác nhau.
• Xác định các chuyển đổi cần thiết cho sự tự động hóa.
• Lập tài liệu các yêu cầu (requirement) chuyển đổi.
• Tạo ra các profile UML cần thiết.
• Phát triển code chuyển đổi.
• Lập tài liệu cách sử dụng, sau đó đóng gói và triển khai.
Những bước này thiết lập nên cơ sở của các project MDA khác nhau, và cùng với thiết kế
lặp điển hình và sự phát triển giảm rủi ro, chúng đã đề ra một hướng dẫn đắc lực đến cách
tiếp cận MDA.
2.4.5.1. Về vấn đề các kết nối mô hình ngữ nghĩa
Hướng dẫn 1: Phát triển các chuyển đổi chỉ khi các kết nối ngữ nghĩa giữa các
thành phần mô hình được hiểu rõ.
Trước bất kỳ nỗ lực nào để đưa sự tự động vào trong quy trình phát triển, ta phải có
một cái nhìn thông suốt và đầy đủ về tất cả các mô hình được sử dụng và được quản lý
trong quy trình. Đã thường xuyên xảy ra việc các nỗ lực phát triển bắt đầu với sự tạo ra
các mô hình không cần thiết, chỉ vì quy trình phát triển chưa phù hợp, đúng đắn cho rằng
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
82
các mô hình này là cần thiết. Các mô hình chỉ nên được tạo ra khi chúng cung cấp các
thông tin rõ ràng và có ích cho nỗ lực phát triển. Mặt khác, nhiều project thường bị mất
một số mô hình quan trọng và các khái niệm trừu tượng kết nối nhiều phần khác nhau của
hệ thống. Do đó bất kỳ khi nào một số lượng đáng kể sự thông dịch và hoạt động của con
người được sử dụng trong một phần cụ thể của project, ta có thể cần một mô hình hình
thức nhằm nắm bắt các quá trình suy nghĩ và các quyết định thiết kế được làm trong suốt
các hoạt động này.
Kết nối ngữ nghĩa giữa các thành phần trong các mô hình thuộc các mức trừu tượng
khác nhau có tầm quan trọng đặc biệt trong ngữ cảnh MDA. Hầu hết các hoạt động hiện
nay xung quanh vấn đề MDA liên quan đến sự tự động của các chuyển đổi mô hình, đặc
biệt là chuyển đổi giữa các mô hình ở mức trừu tượng cao hơn với các mô hình ở mức
trừu tượng thấp hơn. Điển hình là các kết nối kiểu “fan out”; nghĩa là một thành phần mô
hình đơn ở mức trừu tượng cao (ví dụ: use case) được kết nối đến nhiều thành phần mô
hình (ví dụ: các boundary, entity, controller) trong các mô hình cấp thấp hơn
Khả năng theo vết của các kết nối này quan trọng vì một số lý do, trong đó, lý do
quan trọng nhất là khả năng hỗ trợ các chuyển đổi tự động. Nhưng nó cũng có tầm quan
trọng trong môi trường phát triển lặp, nơi mà các chuyển đổi thường được triệu gọi nhiều
lần. Thông thường một chuyển đổi hiếm khi chuyển đổi một mô hình nguồn thành một
mô hình đích. Thường là có một mô hình nguồn chính cùng với một số thông số đa mục
đích sẽ tạo ra một tập các mô hình đích. Ví dụ, trong một hệ thống J2EE, một mô hình
phân tích chứa các thông tin sẽ được chuyển đổi thành một thiết kế cơ sở dữ liệu, một
Java interface, một số Java ServerPages (JSPs), và một số bản mô tả việc cấu hình hoặc
triển khai. Tất cả các mô hình này sẽ chi tiết hơn mô hình phân tích ban đầu và phải được
đồng bộ hóa để thực thi chính xác. Do đó, việc phát triển một chuyển đổi quản lý việc
truyền thông tin từ mô hình nguồn cấp cao thành một nhóm các mô hình cấp thấp, sẽ lợi
hơn việc phát triển các chuyển đổi riêng biệt cho từng cặp mô hình input và output. Chính
khả năng này cùng với nội dung ngữ nghĩa giữa các mô hình cấp thấp khác nhau làm cho
MDA trở thành một công nghệ thu hút mọi người.
Hơn thế nữa, một tính chất quan trọng của một chuyển đổi là khi được thực thi, chỉ
có những thành phần của mô hình đích có phụ thuộc trực tiếp vào mô hình nguồn thì mới
được cập nhật. Bất kỳ thông tin nào trong mô hình đích mà không phải được tạo ra bởi sự
chuyển đổi lần đầu tiên thì nên được giữ nguyên. Ngoài ra, các thành phần mô hình được
tạo bởi sự chuyển đổi không nên bị nhân bản trong mô hình đích trong mỗi lần gọi, tốt
hơn là chúng chỉ nên được cập nhật (hoặc được tạo nếu chưa có trong mô hình). Hàm API
của MDA Toolkit được xây dựng để các chuyển đổi tuân theo các quy luật thiết kế này.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
83
2.4.5.2. Về vấn đề xác định các chuyển đổi cần thiết
Hướng dẫn 2: Không phải tất cả các kết nối ngữ nghĩa đều tạo nên các chuyển đổi
MDA tốt.
Khi các kết nối ngữ nghĩa được xác định giữa các phần tử trong mô hình, chúng nên
được kiểm tra xem các luật quản lý các mối quan hệ của chúng có phù hợp cho sự tự động
hay không. Một chuyển đổi thích hợp chỉ có thể thực thi khi các luật này rõ ràng và không
bị nhập nhằng. Các luật có thể lớn và phức tạp hoặc cũng có thể nhỏ và đơn giản, trong cả
hai trường hợp đều có thể cần tạo nên một chuyển đổi để hiện thực chúng. Tuy nhiên, nếu
các luật định nghĩa các kết nối này sau đó sẽ xây dựng các phần tử mới trong các mô hình
khác, mà các phần tử mới này lại yêu cầu kinh nghiệm hay sự phán đoán của người phát
triển, thì sự tự động dễ dàng bị loại bỏ sau đó.
Một lý do khác để loại bỏ sự tự động là khả năng các mô hình không thể truy xuất
các phần tử cần thiết thông qua việc lập trình. Ví dụ, nếu hầu hết các bước chuyển đổi đều
liên quan đến việc đọc các tài liệu ngôn ngữ tự nhiên, bất chấp mức độ hình thức của nó,
thì cũng không thể phù hợp với sự tự động của MDA. Để minh hoạ cho điều này, ta có
thể thấy việc chuyển đổi một tài liệu đặc tả use case thành một mô hình phân tích thường
không thể thực hiện. Tuy nhiên, chuyển đổi một lược đồ tuần tự UML, hay lược đồ hoạt
động cùng với một use case, có thể phù hợp cho sự tự động.
2.4.5.3. Về vấn đề lập tài liệu các yêu cầu chuyển đổi
Hướng dẫn 3: Việc viết các chuyển đổi MDA nên được xem là một dự án phát
triển phần mềm
Chuyển đổi hiệu quả nhất là các chuyển đổi thực hiện tự động các công việc quá
nhàm chán hoặc quá phức tạp một cách nhất quán và đáng tin cậy. Sự động hóa MDA
đảm bảo tính nhất quán và trong hầu hết các trường hợp tiết kiệm được đáng kể thời gian
cũng như công sức lập trình cho các lập trình viên. Không có gì ngạc nhiên rằng hầu hết
các chuyển đổi thành công là các ví dụ phần mềm quan trọng. Khi sử dụng sự động hóa
MDA và sự tạo ra các chuyển đổi quan trọng, ta nên coi chúng như là một sự phát triển
phần mềm riêng biệt
Một chuyển đổi, đặc biệt khi được tạo ra với MDA Toolkit, là một ví dụ của phần
mềm tạo ra theo nhu cầu. Các requirement nên được hiểu rõ ràng và nên được kiểm tra cả
về mặt ngữ nghĩa và kỹ thuật. Tập hợp các đặc tả requirement được chứa trong tài liệu
ánh xạ. Tài liệu ánh xạ mô tả chi tiết các kết nối ngữ nghĩa giữa các thành phần lập mô
hình trong nhiều mô hình khác nhau tham gia trong chuyển đổi. Các requirement khác có
thể bao gồm vấn đề hiệu suất, vấn đề bảo mật, vấn đề khả mở rộng…
Hầu hết các chuyển đổi mà chúng ta quan tâm đến đều phải trải qua các giai đoạn
phân tích và thiết kế và kết quả cuối là một tập các class hiện thực chuyển đổi đó. Các vấn
đề khác, như test, triển khai và hướng dẫn cách sử dụng cũng nên có đầy đủ như trong
quy trình phát triển phần mềm truyền thống. Tuy các chuyển đổi MDA không đòi hỏi
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
84
phải có một nhóm phát triển lớn hiện thực nó, nhưng việc phát triển chúng như một phần
độc lập (tức là phải trải qua đầy đủ các giai đoạn) sẽ đảm bảo chất lượng của chuyển đổi.
Khi xác định các requirement cho một chuyển đổi hiện thực bằng MDA Toolkit, ta
phải xét ba hành vi khác nhau:
• Kiểm tra tính hợp lệ của các thông số nhập.
• Thực thi các logic hoặc các ánh xạ chuyển đổi cốt lõi.
• Kiểm tra các kết hợp ngữ nghĩa giữa các thành phần mô hình tham gia trong
chuyển đổi.
Sự thực thi logic chuyển đổi và sự bổ sung vào các mô hình đích là công việc quan
trọng nhất trong toàn bộ chuyển đổi. Tuy nhiên, kiểm tra tính hợp lệ của dữ liệu nhập và
kiểm tra việc chuyển đổi đã hoàn chỉnh chưa cũng rất quan trọng trong môi trường phát
triển lặp (việc chuyển đổi có thể được áp dụng nhiều lần trên cùng một mô hình nguồn).
Hướng dẫn 4: Kiểm tra tính toàn vẹn của tất cả các thông số và các artifact
tham gia trong một chuyển đổi trước khi thực thi chuyển đổi đó
Hầu hết các thứ đều có thể được triệu gọi và xử lý trong một chuyển đổi được tạo ra
bởi MDA Toolkit và MDA Toolkit không cung cấp cơ chế giám sát quy trình giao dịch.
Trong một số trường hợp, một chuyển đổi bắt đầu nhưng phải dừng trước khi được hoàn
tất, không có cơ chế đảm bảo rằng việc dừng chuyển đổi này sẽ xác lập lại (reset) tất cả
các thông số đầu vào trở về trạng thái trước khi chuyển đổi. Điều này là bởi vì MDA
Toolkit không giới hạn hay hạn chế các kiểu artifact có thể tham gia vào một chuyển đổi.
Điều này thì rất hữu ích khi trong một chuyển đổi có thể triệu gọi các Web services bên
ngoài hoặc có thể chỉnh sửa, bổ sung các artifact.
Nói chung, nhà phát triển chuyển đổi phải đảm bảo vào tính toàn vẹn của các artifact
được xử lý trong một chuyển đổi. Kết quả là cần phải đảm bảo rằng tập các artifact đầu
vào phải thuộc vào một trạng thái được định nghĩa (nghĩa là tất cả các thông số được yêu
cầu phải được xác định, các profile cần thiết phải được thêm vào trong mô hình và nội
dung cần thiết trong các mô hình là các artifact được kiem
Hướng dẫn 5: Cần một đặc tả của việc kiểm tra để duy trì sự toàn vẹn của
chuyển đổi sau khi thực hiện các thay đổi trong mô hình đích
Khi các chuyển đổi trở thành một phần trong quy trình phát triển lặp, dường như sau
mỗi chuyển đổi được thực thi, các artifact, cả input và output đều phải được cập nhật bằng
tay. Điều này là theo một quy tắc chung của phát triển hướng mô hình: các thay đổi được
đưa vào hệ thống trong các mô hình với mức trừu tượng thích hợp nhất, bất kể mức trừu
tượng đó là mức nào. Ví dụ, một thực thể Customer được mô tả trong mô hình phân tích
cấp cao có thể không chứa thông tin về cách lưu trữ (optimistic, pessimistic…). Vì vậy
các thay đổi đối với cách lưu trữ này không cần đưa vào mô hình phân tích, mà nên đưa
vào mô hình thiết kế nơi chúng có sẽ có ảnh hưởng nhiều nhất. Do do sự thêm vào một
thuộc tính khóa mới đối với class Customer sẽ có thể đòi hỏi một thay đổi trực tiếp lên
mô hình phân tích cấp cao. Khi chính xác và sau một ước lượng có thể, thay đổi này sẽ
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
85
được phản ánh chính xác lên mô hình cấp thấp, như kết quả của một chuyển đổi MDA tự
động.
Vì các quy trình phát triển lặp đều khuyến khích sự phát triển của mô hình thông
qua một quy trình phát triển, một đặc tính quan trọng cũa một chuyển đổi tốt là khả năng
phân tích trạng thái hiện tại của các artifact và so sánh chúng với trạng thái mong muốn
sau khi thực hiện xong chuyển đổi. Bước này được khuyến khích trong các chuyển đổi
được tạo bằng MDA Toolkit là bước kiểm chứng (verification). Thông thường bước kiểm
chứng này chạy riêng biệt và chạy sau khi các artifact đã trải qua chuyển đổi và các điều
chỉnh sau đó. Do đó, các mô hình và artifact cuối có thể trải qua sự tính chế thêm mà sự
tinh chế này không liên quan đến bất kỳ thông tin ngữ nghĩa nào được quản lý bởi quy
trình chuyển đổi. Trong suốt quá trình tinh chế này, các thay đổi (mặc dù không mong
muốn) có thể làm đứt các liên kết về ngữ nghĩa giữa các mô hình. Thực thi tường minh
bước kiểm chứng trong một chuyển đổi sẽ tạo ra một bản tường trình cho nhà phát triển
về bất kỳ các đứt quãng trong ánh xạ ngữ nghĩa được thiết lập bởi chuyển đổi ban đầu.
Các đứt quãng này sau đó có thể được thực hiện một cách chính xác hơn bởi nhà phát
triển, kết quả là sẽ có một số thay đổi trong mô hình đích hoặc mô hình nguồn hoặc cả hai.
Hướng dẫn 6: Trong hầu hết các trường hợp MDA, các ánh xạ mô hình đến mô
hình thường phức tạp và đòi hỏi sự thiết kế và hiện thực cẩn thận.
Logic cốt lõi trong một chuyển đổi thường là thuật toán trong đó một tập hợp các
thành phần mô hình được chuyển đổi thành một tập hợp khác. Trong một ánh xạ kiểu khai
báo đơn giản, các kết nối là tương đối đơn giản, dễ thực hiện, và có ít sự nhập nhằng.
Trong các chuyển đổi MDA có quy mô lớn, các ánh xạ luôn không quá đơn giản. Thường
một thành phần trong mô hình nguồn sẽ ánh xạ dến một cấu hình của các thành phần theo
một tập hợp các điều kiện phức tạp bao gồm các thành phần mô hình khác, các kết nối và
các stereotype và tag value của các profile UML khác nhau.
Lấy một ví dụ đơn giản một thực thể có tên là Addres. Thực thể này gồm nhiều
thuộc tính, một trong các thuộc tính đó được được đánh tag là khóa chính (trong profile
đánh dấu). Ánh xạ một class trừu tượng như thực thể này thành một đối tượng Java và
thiết kế cơ sở dữ liệu là tương đối dễ thực hiện (xem hình 2-20). Một đối tượng Java được
tạo ra với các thuộc tính được phản chiếu và các kiểu dữ liệu được hiệu chỉnh cho chính
xác. Các hàm get và set cũng được tạo thêm. Trong thiết kế cơ sở dữ liệu, một table và
các column được tạo ra với tên được điều chỉnh cho phù hợp với các chuẩn đặt tên của cơ
sở dữ liệu. Khóa chính (được xác định bởi tag trong profile đánh dấu) được gán. Các kiểu
dữ liệu được chuyển đổi với sự trợ giúp của profile đánh dấu. Profile đánh dấu có thể
được sử dụng để xác định các giá trị null và các thuộc tính cở sở dữ liệu điển hình khác.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
86
Hình 2-20: Ánh xạ một thực thể đơn giản vào các mô hình đối tượng và mô hình thiết
kế
Ví dụ đơn giản này đã minh họa cho việc ánh xạ một class trong mô hình trừu tượng
thành một class trong mô hình đối tượng và một table trong mô hình dữ liệu. Các thuộc
tính trong mô hình trừu tượng ánh xạ một-một các thuộc tính trong mô hình đối tượng và
các column trong mô hình dữ liệu. Các phương thức trong mô hình đối tượng tất cả đều
có thể truy ngược lại một thuộc tính mô hình trừu tượng. Tuy nhiên, trong ví dụ khác,
việc ánh xạ không còn quá dễ dàng. Xét một ví dụ thứ hai là một tập các class tham gia
trong hệ thống phân cấp trong mô hình phân tích (hình 2-21)
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
87
Hình 2-21: Mô hình phân tích
Các class RestrictedProduct và CommercialProduct là sự phân loại từ Product. Class
Product cũng xác định hai thuộc tính (code và supplier) là định danh đối tượng hay khóa
chính. Tuy nhiên chúng thường được xác định bằng tag value hoặc stereotype mà tag
value hay stereotype này có thể không xuất hiện trực tiếp trên lược đồ (có thể xem bằng
cách xem property của thuộc tính). Bằng cách sử dụng các quy tắc đặt tên của tổ chức và
các chiến lược ánh xạ thuộc tính, vẫn có ba cách rất khác nhau để một tập các class có thể
được chuyển đổi thành một mô hình cơ sở dữ liệu. Chúng ta có thể gọi đó là ba chiến lược
như sau “Roll Up”, “Roll Down” và “Separate Tables”, và các chiến lược này được hỗ trợ
bởi Data Modeler của IBM Rational XDE, như trong hình 2-22.
Hình 2-22: Chiến lược Roll up
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
88
Trong chiến lược đầu tiên, một bảng mới T_PRODUCT_TYPE được tạo ra bằng
cách lấy class cơ sở và thêm tiền tố _TYPE. Các column trong bảng này được định nghĩa
trước bởi ánh xạ và luôn được tạo ra giống nhau trong các lần áp dụng chuyển đổi. Table
này được sử dụng để cung cấp một phương tiện mở rộng để thêm vào các kiểu mới. Tất
cả các thuộc tính của các class con được đưa vào (roll up) trong một bảng chính.
Trong chiến lược Roll Down, được minh họa trong hình 2-23, tất cả các class cụ thể
(concrete class) được tạo bảng riêng cho nó. Trong đó các column trong class cơ sở được
nhân bản vào trong tất cả các bảng.
Hình 2-23: Chiến lược Roll Down
Cuối cùng là chiến lược Separate Tables, được minh họa trong hình 2-24, mỗi class
được ánh xạ thành một bảng, và các quan hệ định danh được tạo ra giữa class cơ sở và
class con để các thuộc tính của class cơ sở được ánh xạ trong table class cơ sở có thể được
truy xuất bởi các hàng dữ liệu tương ứng trong các table con. Trong cả ba chiến lược, các
table sử dụng khóa tổng hợp (composite key) được ngầm định bởi class cơ sở chính.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
89
Hình 2-24: Chiến lược Separate tables
Từ ví dụ này, rõ ràng các chiến lược ánh xạ không còn đơn giản và một số thành
phần trong mô hình trừu tượng có thể ánh xạ đồng thời đến nhiều thành phần khác nhau
trong thiết kế cơ sở dữ liệu. Ngoài ra, trong trường hợp Roll Up, ba class phân tích được
ánh xạ thành hai table, với chỉ một trong số chúng dùng chung tên với class phân tích.
Mô hình đối tượng cũng có thể có các yêu cầu cho chỉ một thuộc tính như một khóa đối
tượng (như trong J2EE). Kết quả chuyển đổi thành mô hình đối tượng Java được minh
họa trong hình 2-25. Vì có hai thuộc tính tạo nên một khóa đối tượng, một class khóa (key
class) mới được tạo ra và một quan hệ định hướng (direction association) được thêm vào
thiết kế đối tượng ngoài hàm get và set.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
90
Hình 2-25: Thiết kế đối tượng java với quan hệ tổng quát hóa và khóa kết hợp
Trường hợp này cũng minh họa cho các phức tạp tiềm ẩn trong các ánh xạ sử dụng
trong thực tế. Trương hợp này sẽ trở nên phức tạp hơn nhiều khi các luật quyết định chiến
lược ánh xạ phụ thuộc vào sự kết hợp giữa các tag value và cấu hình mô hình phân tích
(nghĩa là sử dụng Roll Up khi có nhiều nhất là ba class, thay thế các khóa tổng hợp với
một khóa integer được tạo tự động nếu giá trị tag override không được gán là False…)
Trong một tầm nhìn nhỏ, không có vấn đề nào là không vượt qua được, và mỗi trường
hợp, được kiểm tra tách biệt, làm rất tốt, thường tương ứng với những gì các nhà thiết kế
và phát triển đã phải làm bằng tay trong nhiều năm. Tuy nhiên, khi được tập họp lại vào
một chuyển đổi, mà cần phải cộng tác với cấu trúc và nội dung của các mô hình đích, các
logic phức tạp và đan xen lẫn nhau thường gây khó khăn cho việc biểu diễn các chuyển
đổi đơn thuần là kiểu khai báo. Trong các trường hợp này, các chuyển đổi tốt nhất là được
biểu diễn và hiện thực theo thuật toán. Đây cũng là kiểu sử dụng mặc định của MDA
Toolkit.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
91
Hướng dẫn 7. Các chuyển đổi có thể được thể hiện bằng khai báo hoặc bằng
câu lệnh. Nói chung, cách tiếp cận bằng câu lệnh thì phù hợp hơn khi mô tả các
chuyển đổi phức tạp.
Trong khi MDA Toolkit nhấn mạnh đến việc thể hiện theo kiểu câu lệnh, nó cũng
cho phép các pattern XDE triệu gọi, hoặc hỗ trợ các hàm khai báo.
MDA Toolkit cho phép các nhà phát triển chuyển đổi tạo ra các mô hình tham chiếu
(reference model) với tập các thành phần mô hình đã được định nghĩa trước, mà các thành
phần mô hình này có thể được copy có chọn lọc đến một mô hình đích và được thay đổi
trong suốt quá trình sao chép.
Hình 2-26 là một đoạn mẫu mô hình tham chiếu chứa các class và các quan hệ. Một
số class có thuộc tính và hàm. Các hàm có code template (code mẫu) cho chúng, được sử
dụng để tạo ra nội dung code của hàm hoàn chỉnh. Tên của các thành phần mô hình không
phải là tên Java hợp lệ, vì tập các class này không được sử dụng để tạo ra code trực tiếp.
Đúng hơn là, tập các class này sẽ được copy vào trong một code model, và trong lúc copy,
các tên thành phần sẽ được cập nhật cho phù hợp với tên thật của các class có trong mô
hình nguồn của chuyển đổi.
Hình 2-26: Một pattern của các thành phần mô hình trong mô hình tham chiếu
Quy trình tổng quan của chuyển đổi là xử lý một mô hình nguồn (một mô hình độc
lập platform, PIM) và tìm kiếm các class có tag là class được quản lý (<<managed
class>>), nghĩa là các class có stereotype hoặc tag value được xác định trong chuyển đổi.
Việc đánh dấu trong mô hình PIM chỉ ra rằng class nào cần được chuyển đổi thành một
tập các class trong mô hình PSM đích. Do đó đối với mỗi class được quản lý trong PIM,
tập hợp các class trong hình 2-26 sẽ được copy vào vị trí thích hợp trong PSM, và trong
suốt quá trình copy này, các tên sẽ được chỉnh sửa cho phù hợp với thông tin trong class
PIM nguồn.
Hình 2-27 thể hiện các kết quả của việc chuyển đổi một class trong PIM có
stereotype là > vào trong PSM. Kết quả là có 4 class mới được tạo
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
92
thành, các tên của các class này dựa trên tên của class PIM nguồn. Chuyển đổi không chỉ
copy trên cấu trúc và các thuộc tính class từ đoạn mẫu mô hình tham chiếu, mà còn tăng
cường thêm cho các class mới được tạo các thuộc tính và hàm của class PIM. Các hàm
get và set cũng được tạo thêm trong class PSM.
Hình 2-27: Áp dụng một pattern dựa trên mô hình tham chiếu
Loại tiếp cận này tăng cường kiểu định nghĩa pattern khai báo và trực quan với sự
điều khiển code bến dưới. Trong suốt quá trình chuyển đổi, các hàm callback được gán và
có thể được triệu gọi trong quá trình copy. Điều này cho phép nhà phát triển có cơ hội để
xác định và tinh chế các tên đích của tất cả các thành phần được copy. Sau khi tạo và
copy các thông tin trong mô hình tham chiếu, phần còn lại của chuyển đổi sẽ copy tất cả
các thuộc tính và hàm publuc của các class PIM và tạo ra các hàm get và set.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
93
2.4.5.4. Về vấn đề tạo UML Profile
Hướng dẫn 8: UML Profile có thể được sử dụng để để quản lý sự đánh dấu
(markup) như là một phần của sự chuyển đổi (transformation).
UML Profile được sử dụng trong hai cách riêng biệt và tách rời. Đầu tiên, vai trò
truyền thống của UML profile là cung cấp một cơ chế để mở rộng ngữ nghĩa của UML
theo các domain khác nhau. Profile lập mô hình dữ liệu và profile lập mô hình nghiệp vụ
là các ví dụ của các profile UML cho phép IBM Rational XDE lập mô hình các quá trình
nghiệp vụ và các thiết kế cơ sở dữ liệu vật lý, luận lý tương ứng.
Các profile cũng là cơ chế hữu ích để quản lý sự đánh dấu mô hình (model marking),
một yếu tố cần thiết của quá trình chuyển đổi mô hình của MDA. Đánh dấu là một bước
hoặc một kĩ thuật ở trong MDA mà trong đó, các thông tin thêm vào không phải thuộc
ngữ nghĩa của chính mô hình, và được dùng cho quá trình tự động sau này. Đánh dấu mô
hình thường chỉ được làm ngay trước khi một chuyển đổi đã sẵn sàng để triệu gọi. Dĩ
nhiên, một mô hình có thể được đánh dấu trong lúc nó đang được phát triển. Tuy nhiên,
vai trò và kỹ năng của các nhà phát triển tạo ra các mô hình không thích hợp cho việc
hiểu ý nghĩa và mục đích của các đánh dấu khác nhau.
Ví dụ, giả sử một mô hình thực thể trừu tượng đơn giản (một phần của mô hình phân
tích truyền thống) dùng UML để phát triển bởi các nhà phân tích. Mô hình này định nghĩa
một số thực thể persistent trong hệ thống, bao gồm các thuộc tính của chúng và các mối
quan hệ giữa chúng. Mô hình này sẽ được chuyển đổi sang một thiết kế cơ sở dữ liệu luận
lý (hoặc vật lý). Nhưng vấn đề xãy ra là khi sử dụng một mô hình phân tích để chuyển
sang một mô hình dữ liệu mới, bởi vì các thông tin lưu trong mô hình phân tích là không
đủ cho một mô hình dữ liệu làm việc. Ví dụ, một kiểu một thuộc tính String của một thực
thể có thể hiện thực thành một column kiểu char, varchar hoặc text. Thông tin về chiều
dài tối đa của cột cũng là một thông tin thường không được biểu diễn trong mô hình phân
tích.
Các chuyển đổi đi từ một mô hình trừu tượng cao sang mô hình trừu tượng thấp rồi
sang các mô hình có mức trừu tượng thấp hơn và chi tiết hơn nữa thường phải đối mặt với
bài toán thông tin chưa hoàn tất trong mô hình. Ngay cả khi ánh xạ các association vào
các field trong Java, việc xác định cách chuyển đổi các association có bậc là “1..n” cũng
không rõ ràng. Các ngữ nghĩa của set, list, và map cũng vượt quá phạm vi ngữ nghĩa của
hầu hết các mô hình phân tích UML, nhưng chúng lại được sử dụng trong các class Java.
UML profile như là một giải pháp ở đây để sử dụng cho giai đoạn chuyển đổi. Một profile
đánh dấu, phân biệt và tách hẳn khỏi bất kỳ một profile ngữ nghĩa nào, có thể được áp
dụng vào mô hình bao gồm các stereo type và các tag value chỉ dùng duy nhất cho việc
chuyển đổi. Một profile lập mô hình dữ liệu có thể chứa các tag mô tả chiều dài của cột...
Một Java profile chứa các thông tin về cách chuyển đổi một association thành một phần
tử trong class của Java. Bộ MDA toolkit cho phép tạo ra các profile sử dụng cho bất kỳ
mô hình nào có thể mở được bởi Rational XDE.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
94
2.4.5.5. Về vấn đề phát triển chuyển đổi
Hướng dẫn 9: Các chuyển đổi nên được tạo ra theo cách mà chúng có thể tham
gia vào một quá trình phát triển lặp đi lặp lại. Trong khi các chuyển đổi chỉ sử dụng
một lần có vẻ dễ dàng để phát triển, tuy vậy người ta cũng thấy rằng mức độ và khả
năng sử dụng của các chuyển đổi này cũng thấp như công sức đã bỏ ra để hiện thực
chuyển đổi đó.
Phát triển các chuyển đổi với MDA Toolkit để các chuyển đổi này tham gia vào quá
trình phát triển lặp yêu cầu người phát triển chú ý kỹ đến các thành phần trong thiết kế và
hiện thực. MDA API cung cấp các phương thức chính cho sự truy xuất và thao tác trên
mô hình chính là các API phục vụ cho quá trình phát triển chuyển đổi lặp. Ví dụ, khi tạo
một thuộc tính trên một class, phương thức createAttribute() của đối tượng
MdaClass mặc định đầu tiên sẽ kiểm tra kiểm tra xem có tồn tại một thuộc tính với tên đó
trong mô hình hay chưa, nếu đã có, nó sẽ không tạo một thuộc tính trùng lắp với thuộc
tính đó. Một điều thú vị là đây không phải là một hành vi mặc định của các API cung cấp
để truy xuất UML bởi vì bảng đặc tả UML không hề yêu cầu tên của các thuộc tính là duy
nhất. Do đó, về lý thuyết, các API này nên cho phép điều trùng lắp trên. Tuy nhiên, hầu
hết các chuyển đổi của chúng ta đều nhắm vào một ngôn ngữ lập trình như là Java hay
C++, do đó, trên thực tế ta sẽ không cho phép sự trùng lắp tên thuộc tính.
MDA Toolkit API có cách hiện thực như sau: khi nó so sánh các tên class cũng như
các tên của thuộc tính, nó tìm kiếm sự duy nhất trong container và sử dụng các so sánh
phân biệt chữ hoa và chữ thường (case-sensitive); khi so sánh các phương thức, nó thực
hiện các so trùng tên phương thức (có phân biệt chữ hoa và chữ thường) kết hợp với so
sánh kiểu dữ liệu của danh sách các đối số input và bỏ qua kiểu trả về của phương thức.
Do vậy, MDA toolkit API cho phép các nhà phát triển chuyển đổi với đích là C++ hoặc
Java phát triển một chuyển đổi cho phép sử dụng lặp một cách dễ dàng hơn.
Quá trình phát triển một chuyển đổi dựa vào MDA Toolkit nhỏ hơn nhiều so với
một bài tập phát triển code trong Java và cụ thể là trong phát triển một Eclipse Java
Plugin.
MDA Toolkit wizard cung cấp hầu hết code mà Eclipse yêu cầu và để cho các nhà
phát triển chuyển đổi nhắm vào việc hiện thực chuyển đổi logic.
Hướng dẫn 10: Một chuyển đổi tốt hiện thực các thủ tục kiểm chứng
(validation), chuyển đổi và xác nhận (verify).
Khi MDA Toolkit wizard tạo một project, nó cung cấp các stub cho ba phương thức
quan trọng này như trong ví dụ sau:
public boolean validate() throws Exception{
boolean valid = true;
return valid;
}
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
95
public void transform() throws Exception {
}
public boolean verify() throws Exception {
boolean verified;
return verified;
}
Phương thức quan trọng nhất là transform(), phương thức này được triệu gọi khi nhà
phát triển muốn triệu gọi quá trình chuyển đổi. Trong phương thức này các logic nghiệp
vụ của chuyển đổi được coding. Các logic nghiệp vụ của chuyển đổi thường được giao
cho các phương thức helper và các class xây dựng theo nhu cầu chuyển đổi riêng của từng
người để chúng thực hiện công việc chuyển đổi thật sự. Trong suốt quá trình chuyển đổi,
sẽ rất hữu ích khi viết các thông điệp chuyển đổi vào một nơi có thể thấy được để các nhà
phát triển có thể giám sát quá trình.
Một ví dụ chuyển đổi mẫu được chỉ ra trong ví dụ sau. Các tên các file mô hình
phân tích và mô hình thiết kế là các thông số. Các giá trị của thông số có thể được truy
xuất thông qua việc gọi một phương thức của class cha. Sau đó chúng sẽ được chuyển
sang các tham chiếu thành phần của mô hình MDA. Trong bảng này, mô hình phân tích
được quét để tìm các class có stereotype là “Persistent Object” (trong một profile) và
không là class con của class khác, bởi vì toàn bộ cây phân cấp được xử lý trong một chức
năng. Hầu hết công việc là phối hợp nhờ vào phương thức helper
processPersistenceObject(), một phương thức sử dụng các class được phân công
(delegate) để thực hiện công việc chuyển đổi.
Ví dụ: Hiện thực mẫu tìm các class có stereotype “PersistentObject” trong mô hình phân
tích.
public void transform() throws Exception {
writeln("Transformation has started ...");
String analysisModelFilename =
getStringParameter(TransformationParameters.
P_FILE_PIM_MODEL);
String designModelFilename =
getStringParameter(TransformationParameters.
P_FILE_PSM_MODEL);
MdaModel designModel = openModel("psm",
designModelFilename);
MdaModel analysisModel = openModel("pim",
analysisModelFilename);
if( pim != null && psm != null && stereotype.length()>0 ) {
MdaClass[] classes =
analysis.getMdaClasses(MdaOption.RECURSE);
for(int i=0;i<classes.length;i++) {
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
96
MdaClass pimCls = classes[i];
MdaGeneralization
ger=pimCls.getMDAGenaralizations();
if(ger.length()==0 &&
pimCls.isStereotyped(“MyCustomProfile”,
PersistentObject)){
processPersistentObject();
}
}
}
writeln("Transformation has completed.");
}
Phương thức validate() được gọi trước khi gọi phương thức transform() và
nếu validate() trả về một giá trị false, phương thức transform sẽ không được thực thi.
Trong hiện thực mẫu trong ví dụ sau, mô hình phân tích được kiểm tra để đảm bảo chắc
chắn rằng nó thật sự đang tồn tại và nó áp dụng một profile theo yêu cầu. Mô hình thiết kế
được kiểm tra về sự tồn tại của nó và nó là một mô hình code, tức có thể thực hiện kỹ
thuật roundtrip trên code Java.
Ví dụ: Mô hình phân tích được kiểm tra cho việc áp dụng các UML profile và kiểm tra
mô hình thiết kế để đảm bảo khả năng roundtrip.
public boolean validate() throws Exception{
boolean valid = true;
writeln(“Starting validation);
String designModelFilename=
getStringParameter(TransformationParamaters.P_FILE_PSM_MODEL;
MdaModel designModel =
openModel(“designModel”,designModelFilename);
if(designModel == null){
valid = false;
writeln(“The design model is a required parameter and
must exist.”);
}else{
if( !designModel.canRTE()){
valid = false;
writeln(“The design model must be an XDE Code
Model”);
}
}
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
97
String analysisModelFilename=
getStringParameter(TransformationParamaters.P_FILE_PIM_MODEL;
MdaModel analysisModel =
openModel(“analysisModel”,ModelFilename);
if(analysisModel == null){
valid = false;
writeln(“The analysis model is a required parameter and
must exist.”);
}else{
if(!analysisModel.hasProfile(“MyCustomProfile”){
valid = false;
writeln(“The profile “MyCustomProfile” must be”
+”applied to analysis model!”);
}
}
writeln(“Validation completed!”);
return valid;
}
Phụ thuộc vào mức xác nhận mong muốn, một method verify() có thể rất phức tạp,
ngang bằng với phương thức transform, và thường nó sử dụng các phương thức và class
helper tương tự với code chuyển đổi thực sự. Trong ví dụ sau, đoạn code mẫu này dùng
để nhận dạng các thành phần trong mô hình phân tích cần chuyển đổi.
Ví dụ: method verify()
public boolean verify() throws Exception {
writeln("Verifying transformation ...");
boolean verified = true;
String analysisModelFilename =
getStringParameter(TransformationParameters.P_FILE_PIM_MODEL;
String designModelFilename =
getStringParameter(TransformationParameters.P_FILE_PSM_MODEL;
MdaModel designModel = openModel("psm",
designModelFilename);
MdaModel analysisModel = openModel("pim",
analysisModelFilename);
if( pim != null && psm != null && stereotype.length()>0 ) {
MdaClass[] classes =
analysis.getMdaClasses(MdaOption.RECURSE);
for(int i=0;i<classes.length;i++) {
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
98
MdaClass pimCls = classes[i];
MdaGeneralization ger=pimCls.getMDAGenaralizations();
if(ger.length()==0 &&
pimCls.isStereotyped(“MyCustomProfile”,
PersistentObject)){
verifyPersistentObject(pimCls);
}
}
} else {
writeln("\tRequired parameters not available.");
}
writeln("Verification complete.");
return verified;
}
Sự phát triển và kiểm tra một chuyển đổi MDA tiến hành như các project Eclipse
plugin khác. Một chuyển đổi có thể được debug thông qua sử dụng Eclipse runtime
workbench.
2.4.5.6. Về vấn đề triển khai chuyển đổi
Hướng dẫn 11: Sử dụng kiến trúc Eclipse plugin để đơn giản hoá quá trình cài
đặt và nâng cấp các chuyển đổi MDA.
Khi một chuyển đổi được phát triển xong, cần phải triển khai và hướng dẫn sử dụng
chuyển đổi đó. Cơ chế Eclipse Update Manager cung cấp một một cơ chế thuân tiện cho
việc cài đặt các plugin vào trong Eclipse. Sử dụng các chức năng của Eclipse Plugin
Development Environment (PDE), chuyển đổi có thể được đóng gói và đặt trên internet
do đó dễ dàng tải (download) và cài đặt các chuyển đổi này và các plugin phụ thuộc khác.
Khi chuyển đổi đã được cài đặt, một menu chuyển đổi có thể được tích cực (thấy
được) ở bất kỳ khung làm việc nào (lập mô hình, code...). Nhà phát triển có thể tuỳ ý chạy
ba phương thức (validate, transform và verify) đồng thời hoặc chạy chúng riêng rẽ. Kết
quả sẽ xuất hiện trong mô hình đích và quá trình chuyển đổi sẽ được hiển thị trên cửa sổ
log (log view).
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
99
3. Hiện thực
3.1. Pattern và Code Template
3.1.1. DateHelperLib
-Bao gồm các phương thức xử lý ngày tháng như: so sánh hai ngày, định dạng
ngày tháng…
3.1.2. FileHelperLib
-Bao gồm các phương thức quản lý file như: copy file, xóa thư mục, lấy đuôi
file…
Người sử dụng có thể áp dụng hai hiện thực trên vào mô hình hệ thống và sinh code.
Code được sinh ra chưa tự import các thư viện Java, người sử dụng sẽ tự động import các
thư viện này thông qua chức năng hỗ trợ import của Rational XDE. (Click chuột phải vào
editor window, chọn Organize Import hoặc click trái vào phần gợi ý sửa lỗi trong editor
window).
3.2. Plugin
3.2.1. Plugin UserManagement
3.2.1.1. Chức năng
Thực hiện đọc mô hình UML, sinh ra các phương thức dựa theo Hibernate
framework để quản lý User ở tầng DAO (không hiện thực các method thuộc tầng
Business và tầng Presentation), mỗi phương thức bao gồm câu lệnh HQL và các lệnh khởi
tạo, đóng session, transaction. Các phương thức được sinh ra bao gồm:
• save: Lưu một đối tượng User vào table tương ứng trong cơ sở dữ liệu
• update: Cập nhật các thông tin của đối tượng User lên table trong cơ sở dữ liệu.
• remove: Xóa một đối tượng (một hàng) khỏi table trong cơ sở dữ liệu.
• validate: So trùng Username và Password
• isExist: Kiểm tra sự tồn tại của một đối tượng User trong table.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
100
• getUser: Trả về một đối tượng User trong table.
Hệ quản trị cơ sở dữ liệu quan hệ được sử dụng có thể là bất kỳ DBMS quan hệ nào:
Oracle, SQL Server, PostGreSQL…
3.2.1.2. Hiện thực:
• Platform đích: Hibernate, Java.
• Công cụ sử dụng: Rational XDE for Java, MDA Toolkit.
• Hiện thực plugin bằng ngôn ngữ Java dựa trên MDA transformation wizard do
MDA toolkit cung cấp trên công cụ Rational XDE.
• Bước 1: Dùng Rational XDE (có MDA Toolkit) tạo một profile UserProfile, bao
gồm các stereotype sau:
-Stereotype cho Class:
>
-Stereotype cho các thuộc tính (Atribute)
>
>
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
101
Hình 3-1: Mô tả một mô hình tạo các stereotype phục vụ cho plugin quản lý User
Sau khi hoàn chỉnh mô hình trên, ta sử dụng MDA Profile Tool để đăng ký một
profile mới với hệ thống, tên của profile này là UserManager. Từ đây, tất cả các mô hình
được lập trên Rational XDE đều có thể áp dụng profile này.
• Bước 2: Xây dựng plugin thực hiện chuyển đổi từ mô hình sang code:
-Tạo một plugin project dựa trên MDA Transformation Wizard.
-Đọc từ mô hình nguồn hệ thống, thực hiện các phương thức chính sau:
1. validate: kiểm tra tính hợp lệ các thông số Input.
2. transform: chỉ thực hiện khi validate thành công. Với bất kỳ class nào có áp
dụng «UserManagement» kiểm tra xem các phương thức và các thuộc tính
của nó có áp dụng các stereotype trong UserManager Profile hay không,
nếu có sinh ra các phương thức quản lý User tương ứng như đã nêu ở phần
chức năng.
Hiện thực cụ thể:
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
102
• Tìm trong mô hình hệ thống (trong Class Diagram) các class có stereotype là
«UserManagement».
• Với mỗi class có stereotype là «UserManagement»:
o Xác định tên table tương ứng với class này, khoá chính của table đó, file
nguồn tương ứng sẽ được sinh code:
Parameter param = new Parameter(".hbm");
String tableKeycolumn =
param.getTableKeyName(hibernateDir,
normalizeName(pimCls.getName().trim()));
String className = param.getTableName(hibernateDir,
normalizeName(pimCls.getName().trim()));
String FilePathToWrite=param.getFiletoWriteMethod
(hibernateDir,className);
o Duyệt qua các thuộc tính trong class này: Tìm trong class hai thuộc tính có
stereotype >, >. Phân tích file ánh xạ XML trong
thư mục Hibernate để tìm ra các thông số cần thiết cho các phương thức
được sinh ra. Sinh ra các phương thức save, update, remove, validate,
isExist, getUser để hiện thực tầng DAO, tương tác với table tương ứng với
class có stereotype > trong mô hình UML nói trên.
o Nếu người sử dụng có chọn sinh ra class Java Hibernate Session Factory, ta
sẽ sinh ra một class HibernateSessionFactory có các phương thức quản lý
việc khởi tạo và kết thúc của Session
3. verify: kiểm tra tính thống nhất giữa model và code sinh ra.
3.2.1.3. Hướng dẫn sử dụng plugin:
Công cụ sử dụng:
• Rational XDE (+MDA Toolkit)
• My Eclipse (+Hibernate Synchronizer)
Transformation được đóng gói dưới dạng plugin do đó, ta có thể lấy plugin này cho vào
thư mục plugins của công cụ RationalXDE.
3.2.1.3.1. Yêu cầu
-Người sử dụng phải áp dụng UserManager profile vào model hệ thống
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
103
-Người sử dụng dùng XDE lấy model hệ thống đã vẽ để sinh ra file script (chứa các câu
lệnh SQL) để tạo table theo một DBMS nhất định. Sau đó, dùng file script này và DBMS
đã chọn đó để tạo database.
-Dùng một MyEclipse (hoặc một IDE bất kỳ) có hỗ trợ Hibernate Synchronizer để ánh xạ
các table thành các đối tượng Java, một table tương ứng với ba thành phần sau:
• File XML ánh xạ giữa table và class
• Java Abstract Class
• Java Class thừa kế từ abstract class trên. Các method sẽ được ghi vào class này
Ba thành phần này sẽ được chứa trong cùng một thư mục Hibernate dùng tương tác với cơ
sở dữ liệu bên dưới.
3.2.1.3.2. Triệu gọi Transform
Các thông số Input:
• PIM Model: Tên file của mô hình UML hệ thống. Mô hình này phải áp dụng
profile UserManager
• Code (PSM) Model: Mô hình code cho project. Đây là mô hình trong đó các class
được sinh ra.
• Prefix: Prefix trong tên của các table.
• Hibernate Directory: Thư mục chứa các class Java do Hibernate Synchronizer
sinh ra.
• CreateSessionFactory: Check box cho phép người sử dụng chọn sinh ra Class
HibernateSessionFactory hay không.
• Session Factory Package: Nếu người sử dụng đánh dấu vào Check box “Create
SessionFactory”, người sử dụng phải xác định đường dẫn packge đích cho file
HibernateSession Factory.
Các thông số này có thể được thiết lập trên Eclipse Preferences chuẩn
(Windows|Preferences). Ở Preferences Dialog này, tập các thông số có thể được điền
trước do đó người phát triển không cần phải nhập các thông số này mỗi khi
transformation được triệu gọi.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
104
Hình 3-2: Eclipse Preferences
Hình 3-3: Transformation Dialog.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
105
• Quá trình transform bao gồm ba bước, tương ứng với ba checkbox trong
Transformation Dialog.
o validate: kiểm tra tính hợp lệ các thông số Input
o transform: chỉ thực hiện khi validate thành công. Với bất kỳ class nào có
apply > kiểm tra xem các method và các attribute của nó
có áp dụng các stereotype trong UserManager Profile hay không, nếu có các
method quản lý User tương ứng như đã nói ở phần chức năng sẽ được sinh
ra.
o verify: kiểm tra tính thống nhất giữa model và code sinh ra.
• Người sử dụng có thể đánh dấu một trong ba check box để yêu cầu thực hiện từng
chức năng tương ứng hoặc đánh dấu cả ba check box để yêu cầu thực hiện cả ba
chức năng (validate, transform, verify).
o Cho phép áp dụng plugin nhiều lần nếu có chỉnh sửa trên mô hình nguồn.
Các phương thức đã sinh ra của mô hình cũ sẽ được thay thế bằng các
phương thức tương ứng với mô hình mới đã chỉnh sửa.
• Sau khi đã đánh dấu vào các checkbox, nhấn nút OK để thực hiện quá trình sinh
code.
• Các thông điệp của quá trình sinh code sẽ xuất hiện trên log window của XDE. Do
đó, người sử dụng có thể dễ dàng theo dõi và kiểm soát quá trình sinh code
Kết quả:
-Các method được sinh ra trong file Java Class đã giới thiệu ở trên
3.2.2. Plugin Search
3.2.2.1. Chức năng
Hỗ trợ người sử dụng tạo phương thức có chức năng tìm kiếm trong file DAO (là
file chứa các chức năng thêm vào ngoài các chức năng cơ bản là load, update, retrieve,
delete, thực hiện trên đối tượng mang dữ liệu – transient data, cụ thể trong Hibernate là
các file class ánh xạ từ cơ sở dữ liệu lên).
• Input:
o Mô hình UX của ứng dụng có áp dụng profile SearchProfile. Mô hình này
chứa các class có stereotype là > và các attribute có stereotype là
>.
o Thư mục chứa file ánh xạ có extension là hbm của Hibernate.
• Output: Các phương thức có chức năng tìm kiếm trong các file DAO tương ứng.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
106
3.2.2.2. Hiện thực
• Platform đích: Hibernate, Java.
• Công cụ sử dụng: Rational XDE for Java, MDA Toolkit.
• Hiện thực plugin bằng ngôn ngữ Java dựa trên MDA transformation wizard do
MDA toolkit cung cấp trên công cụ Rational XDE.
Quy trình phát triển
• Bước 1: Tạo một plugin-in project sử dụng wizard MDAToolkit Transformation
Wizard.
• Bước 2: Định nghĩa các danh sách các thông số transform:
public static final String P_FILE_SEARCH_MODEL =
"searchModelTransformationSearch";
public static final String P_HIBERNATE_DIRECTORY = "HibernateDirectory";
• Bước 3: Định nghĩa các giá trị mặc định cho các thông số transform:
setDefault(P_FILE_SEARCH_MODEL,"");
setDefault(P_HIBERNATE_DIRECTORY,"");
• Bước 4: Định nghĩa các controls GUI cho các thông số transform:
addField(new FileFieldEditor(P_FILE_SEARCH_MODEL, "&Search Model file:",
parent));
addField(new DirectoryFieldEditor(P_HIBERNATE_DIRECTORY,"Hibernate
directory", parent));
• Bước 5: Định nghĩa logic chuyển đổi: được hiện thực trong hàm transform. Sau khi
lấy các thông số nhập (đã được validate hoặc chưa được validate, tùy vào người sử
dụng có check vào check box Validate hay không, do đó ta vẫn cần thực hiện bước
validate trong hàm này), ta sẽ phân tích:
o Bước 5.1: phân tích mô hình UX để lấy ra các class có stereotype là Search
và các attribute có stereotype là Search Attribute. Kết quả được chứa trong
ArrayList với mỗi phần tử trong ArrayList có kiểu là <MdaClass,
MdaAttribute[]> (mỗi class Search có một hoặc nhiều attribute Search)
o Bước 5.2: phân tích các file ánh xạ hbm để lấy ra các tên class (mỗi class
tương ứng với một table trong cơ sở dữ liệu), tên id và tên property thuộc
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
107
class đó. Kết quả được chứa trong ArrayList với mỗi phần tử trong
ArrayList có kiểu là .
o Bước 5.3: tạo một dialog mới sử dụng các kết quả vừa phân tích được, cho
phép người dùng ánh xạ giữa attribute Search và id hoặc property trong
class ánh xạ từ CSDL.
o Bước 5.4: sau khi người dùng tạo ra các cặp (attributeSearch, id|property),
tìm đến các file DAO tương ứng cho các class ánh xạ, tạo các hàm Search
trong file này, có dạng :
Search (session, SearchParamater) có kiểu trả về là ArrayList
Template của nội dung:
ArrayList arrRet = null;
String hSQL = "";
hSQL = ….
arrRet = (ArrayList) (find(hSQL, session));
return arrRet;
• Bước 6: Định nghĩa logic validate các thông số do user truyền vào.
3.2.2.3. Hướng dẫn sử dụng
• Bước 1: Chuyển vào perspective Modeling, mở mô hình UX của ứng dụng. Vào
properties->AppliedProfiles, chọn profile SearchProfile để thêm các stereotype
cần thiết cho chuyển đổi Search này.
• Bước 2: Trong mô hình UX, chọn các class cần thêm chức năng search. Thêm vào
stereotype > cho các class này bằng cách: click chuột vào class -> trong
phần properties-> Stereotype, thêm vào “Search”. Thêm vào stereotype
> cho attribute bằng cách: click chuột vào attribute->trong
phần properties-> Stereotype, thêm vào stereotype >.
• Bước 3: Vào menu Transform Æ TransformationSearch (nếu chưa kích hoạt thì
vào menu Window -> Customize Perspective. Trong mục Available Items chọn
Other, rồi check vào box TransfomationSearchMenus. Nhấn OK.).
• Bước 4: Trong TransformationSearch dialog. Nhập Search Model file: nhập đường
dẫn đến mô hình UX của ứng dụng. Nhập Hibernate directory: nhập đường dẫn
đến thư mục chứa các file hbm của Hibernate.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
108
Hình 3-4: TransformationSearch dialog.
• Bước 5: Chọn các action cần được thực hiện (validate: kiểm chứng thông số nhập,
transformation: thực hiện transform).
• Bước 6: Nhấn OK. Plugin sẽ phân tích mô hình và các file hbm để trích xuất thông
tin cho dialog tiếp theo gồm các class (có stereotype là Search) cùng các thuộc tính
(có stereotype là SearchAttribute), các class tương ứng với các table cùng với các
id, property tương ứng với các column trong table đó.
• Bước 7: Trong dialog SelectInfo dialog. Dùng combo ComboSearchAttribute
(chứa class Search) và list ListSearchAttribute (chứa attribute Search của class đó)
chọn attribute Search trong mô hình UX. Dùng combo ComboTable (chứa thông
tin table) và list ListColumn (chứa thông tin column) chọn column muốn ánh xạ
với attribute Search. Nhấn Select. Thông tin sẽ lập tức được hiển thị trong list
SelectedItems nhằm giúp người dùng dễ dàng theo dõi. Click chuột vào dòng
thông tin này, nhấn Remove sẽ loại bỏ được thông tin này.
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
109
Hình 3-5: SelectInfo dialog
• Bước 8: Sau khi chọn xong, nhấn button Transform để plugin tạo ra các phương
thức trong file DAO.
3.3. Ứng dụng web: WebLog
Hiện thực ứng dụng Web sử dụng các công nghệ hỗ trợ ứng dụng Web đã nghiên
cứu là UX (phần mô hình), JavaServer Faces, Hibernate (phần code) và các hướng tiếp
cận hỗ trợ MDA (code template, transformation plugin):
Ứng dụng Web này hiện thực các chức năng sau:
• Login vào hệ thống, logout khỏi hện thống, đăng ký làm thành viên. Xem các
thông tin (profile) và hiệu chỉnh một số thông tin của mình.
• Các chức năng của admin như: xem xét, cập nhật, thêm mới, xóa user của hệ
thống…
Mô hình của ứng dụng Web được vẽ dựa trên ngôn ngữ UML và mô hình UX như sau:
Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web
110
Hình 3-6: mô hình UX cho ứng dụng WebLog
Các file đính kèm theo tài liệu này:
- Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web.pdf