Với yêu cầu đặt ra đối với ứng dụng Công báo điện tử hoạt động theo mô hình kiến trúc MVC, sử dụng cơ sở dữ liệu là MSSQL Server 2008. Nhƣ đã trình bày tại mục 4.2.2, bộ sinh mã Acceleo JavaEE Generator chƣa có tính năng chuyển đổi từ mô hình Entity sinh ra bộ script tạo lập cơ sở dữ liệu trong MSSQL Server. Do đó, Luận văn bổ sung thêm tính năng sinh mã SQL để tạo lƣợc đồ CSDL MS SQL Server đƣợc trình bày nhƣ dƣới đây.
Trong module sinh mã theo kiến trúc của Hibernate Framework sử dụng tất cả 3 gói project gồm có:
- org.obeonetwork.dsl.entity.gen.java.common: Tổ chức thƣ viện duyệt các Entity
trong mô hình Entity.
- org.obeonetwork.dsl.entity.gen.java.dao: Duyệt các Entity sinh ra các lớp DAO.
- org.obeonetwork.dsl.entity.gen.java.hibernate: Kết hợp với 2 project trên để
sinh ra các lớp và file cấu hình của theo chuẩn của Hibernate.
Để tạo template sinh mã SQL tạo lƣợc đồ CSDL, Luận văn thực hiện thao tác trên project Gen.Java.Dao. Đầu tiên khởi tạo một package trong project Gen.Java.Dao là
org.obeonetwork.dsl.entity.gen.java.dao.file.mssqlserver, sau đó khởi tạo template sqlCreate.mtl, template này thực hiện sinh mã sql để tạo lƣợc đồ CSDL trong MSSQL
Server. Cấu trúc file và project của template nhƣ Hình 5.25.
71
Việc xây dựng nội dung của template sqlCreate.mtl thực hiện theo đúng nguyên lý của Acceleo M2T đƣợc trình bày tại mục 4.1.4. Mô hình nguồn của template là mô hình Entity, mô hình Entity là môt thể hiện của Entity metamodel và có các metaconcept đã đƣợc trình bày tại mục 4.2.1.1
Nhƣ biểu diễn trên Hình 5.26, nội dung khai báo trong thẻ [module…/] cho biết metamodel đƣợc sử dụng trong template là các mô hình Entity hoặc Ecore hoặc Enviroment. Trong thẻ [import…/] thực hiện gọi/tham chiếu tới các template khác trong module sinh mã giống nhƣ việc import một package trong Java.
Hình 5.26 Nội dung Template sqlCreate.mtl – phần 1
72
Nhƣ biểu diễn trên Hình 5.27, trong cú pháp xây dựng template của MOFM2T mỗi thẻ [template…] giống nhƣ một phƣơng thức trong Java, trong một thẻ [template…] có thể gọi tới một [template…] khác cũng tƣơng tự nhƣ việc gọi hàm/phƣơng thức trong các ngôn ngữ lập trình Java/C/C++. Trong sqlCreate.mtl có nhiều template,
trong đó có template chính (main) là [template public generateSqlCreate(root :
Root)], khi template generateSqlCreate đƣợc gọi, một file có dạng tên (tên-mô hình)-
sqlserver2008-script.sql đƣợc tạo ra bởi thẻ [file (root.fullFilePath(), false, 'UTF-8')]. Nội dung của file (tên-mô hình)-sqlserver2008-script.sql đƣợc ghi bởi các nội dung trong các thẻ [template…] [/template], trong đó những nội dung không nằm trong các thẻ [..] sẽ đƣợc ghi trực tiếp lên ra file, còn các nội dung trong thẻ […] sẽ đƣợc thực thi theo cú pháp của ngôn ngữ xây dựng template. Ví dụ nhƣ ở Hình 5.27, với dòng lệnh Drop database [root.projectName()/] trong template sẽ sinh ra một dòng lệnh tƣơng ứng ở file mã nguồn đầu ra là Drop database congbaodientu, bởi đoạn mã Drop
database không nằm trong thẻ [] sẽ thể hiện nguyên dạng text ở kết quả đầu ra, đoạn
mã [root.projectName()/] khi thực thi trả về tên của project model là congbaodientu. Trong template generateSqlCreate thực hiện chuyển đổi từ mô hình sang mã nguồn đƣợc mô tả nhƣ sau:
- Mỗi Entity trong mô hình tƣơng ứng với một Bảng trong lƣợc đồ CSDL. Trong đó tên Entity tƣơng ứng là tên bảng, mỗi thuộc tính của entity tƣơng ứng là một trƣờng trong bảng, mỗi quan hệ 1-1, 1-N sẽ tạo các trƣờng khoá ngoài.
- Mỗi quan hệ N-N trong giữa các Entity sẽ tƣơng ứng với một Bảng trung gian.
Template sqlCreate.mtl đƣợc import và gọi trong module sinh mã Hibernate. Kết quả đầu ra khi thực thi template này là một file có đuôi mở rộng .sql đƣợc tạo với các câu lệnh khởi tạo cơ sở dữ liệu, tạo các bảng cùng các trƣờng và các mối quan hệ giữa các bảng theo cú pháp có thể thực thi trong MS SQL Server (xem Hình 5.28)
73
Hình 5.28 Mã nguồn sinh ra bởi sqlCreate.mtl