Nghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web

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

pdf115 trang | Chia sẻ: lvcdongnoi | Lượt xem: 3014 | Lượt tải: 1download
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:

  • pdfNghiên cứu và áp dụng công nghệ MDA, các framework hỗ trợ ứng dụng Web.pdf