CHƯƠNG 1 : PHÁT TRIỂN PHẦN MỀM HƯỚNG MÔ HÌNH
3.2. Sinh mã dựa trên thuật toán theo kiến trúc MVC
3.2.2. Xây dựng giải thuật sinh code tự động
Các giải thuật sinh code được xây dựng trên cơ sở phân tích mơ hình UWE và các quy tắc chuyển đổi tương ứng:
- Giải thuật CM2M: Từ mơ hình nội dung (mức PIM) được chuyển đổi sang
JavaModel (mức PSM), là một thể hiện của Java metamodel, sau đó chuyển đổi sang mã nguồn Java.
- Giải thuật NPROM2C: Từmơ hình điều hướng và xửlý được chuyển đổi sang JavaModel, sau đó được chuyển đổi sang mã nguồn Java, tương ứng thành phần Controller..
← ← ← ← ← ← ←
- Giải thuật PRES2V: Từ mơ hình trình bày được chuyển đổi sang JSPModel, là
một thể hiện của JSP metamodel, sau đó chuyển đổi sang mã JSP, tương ứng thành phần View..
a) Giải thuật CM2M
Giải thuật CM2M sinh mã thành phần Model từ mơ hình nội dung, Giải thuật SM2M được mô tảqua 2 bước, cụ thểnhư sau:
Bước 1: Đọc mơ hình, lấy ra biểu đồ nội dung, tạo danh sách chứa các lớp có trong biểu đồ.
Bước 2: Duyệt danh sách và thực hiện các chuyển đổi đối với từng lớp, từng thành phần sử dụng các quy tắc đã được trình bày ở trên.
Giải thuật CM2M
Input : contentModel // UWE Model
Output: listFiles // a list of Java Source Code files
/* Lấy danh sách các lớp có trong mơ hình nội dung */ 1 listClasses contentModel.getListClass() 2 foreach c in listClasses do 3 jc UWEClass2JavaClass(c) 4 listProperties c.getListProperties() 5 foreach p in listProperties do 6 j f , jg, js UWEProperty2JavaClassMember(p) 7 jc.members.add( j f , jg, js) 8 end 9 listOperations c.getListOperations() 10 foreach o in listOperations do 11 jm UWEOperation2JavaMethod(o) 12 jc.members.add( jm) 13 end 14 sourceCode jc.toCode()
15 Save sourceCode into the f ile
16 listFiles.add( f ile)
17 end
18 return listFiles b) Mô tả giải thuật PRES2V
Giải thuật PRES2V sinh mã thành phần View từ mơ hình trình bày Giải thuật SM2M được mô tảqua 2 bước, cụ thểnhư sau:
←
←
Bước 1: Đọc mơ hình, lấy ra biểu đồ trình bày, tạo danh sách chứa các lớp có trong
biểu đồ.
Bước 2: Duyệt danh sách bắt đầu từ lớp có khn mẫu "presentationPage", xác định các lớp con, đồng thời kết hợp với điều kiện bổ sung từ mơ hình điều hướng, thực hiện các chuyển đổi sử dụng các quy tắc đã được trình bày ở trên.
Giải thuật PRES2V
Input : presentationModel // UWE Model Output: listFiles // a list of JSP files
/* Lấy danh sách các lớp trong mơ hình trình bày*/ 1 listClasses presentationModel.getListClass()
2 foreach c in listClasses do
3 if c.getStereotype() = presentationPage then
4 documentName ← c.getName() + “. jsp” 5 jspRoot ← newJSPRoot(documentName)
6 htmlEl ← newJSPElement(name ←“html”) 7 headEl ← newJSPElement(name ← “head”) 8 bodyEl ← newJSPElement(name ← “body”)
9 titleEl ← newJSPElement(name ← “title”)
10 titleText ← newJSPTextNode(value ← c.getName())
11 titleEl.children ← titleText
12 bodyEl ← PreClass2JSP(bodyEl, c) 13 htmlEl.children ← {bodyEl, headEl}
14 jspRoot.children ← htmlEl
15 end
16 Create a f ile
17 f ile.name = jspRoot.documentName
18 sourceCode jspRoot.toCode()
19 Save sourceCode into the f ile
20 listFiles.add( f ile)
21 end
22 return listFiles
c) Giải thuật NPROM2C
Giải thuật NPROM2C sinh mã thành phần Controller từmơ hình điều hướng và xử lý (Navigation and Processing Model to Controller Code Generation). Giải thuật NPROM2C gồm 2 giải thuật nhỏhơn: NM2C sinh mã thành phần Controller từ mơ hình điều hướng, PROM2C sinh mã nguồn từ mơ hình xử lý.
←
❖ Giải thuật NM2C
Giải thuật NM2C
Input : navigationModel // UWE Model Output: file // a Java class
1 Create a f ile: f ile.name = navigationModel.getName()
2 uweClass ← navigationModel.getHomeClass()
3 jc ← Navi2JavaClass(uweClass)
4 naviNode ← newArrayList < NaviNode > 5 visit ← newMap < String, Boolean >
6 visit(uweClass.getQuali f iedName) ← true
7 queue ← newQueue < NaviNode >
8 queue.push(newNaviNode(e ← uweClass, linkNode ← “/”
9 while queue.isEmpty() = f alse do 10 node ← queue.pop()
11 stereoType ← node.getStereotype
12 if stereoType = “processClass” or stereoType = “query” then
13 naviNode.add(node)
14 end
15 lstElements ← node.getAssociateElement
16 foreach c in lstElements do
17 if visit[c.getQuali f iedName] = f alse then 18 visit[c.getQuali f iedName] = true
19 e ← uweClass 20 linkNode ← “/” + c.getName() 21 queue.push(newNaviNode(e, linkNode) 22 end 23 end 24 end
25 foreach node in naviNode do
26 jm ← NaviNode2JavaMethod(uweClass, node)
27 jc.members ← jm
28 end
29 sourceCode jc.toCode()
30 Save sourceCode into f ile
←
❖ Giải thuật PROM2C
Giải thuật PROM2C
Input : processModel // UWE Model
Output: listFiles // a list of Java classes 1 listClasses ← processModel.getListClasses() 2 foreach c in listClasses do 3 jc ← UWEClass2JavaClass(c) 4 listProperties ← c.getListProperties() 5 foreach p in listProperties do 6 j f , jg, js ← UWEProperty2JavaClassMember(p) 7 jc.members.add( j f , jg, js) 8 end 9 listOperations ← c.getListOperations() 10 foreach o in listOperations do 11 jm ← UWEOperation2JavaMethod(o) 12 jc.members.add( jm) 13 end 14 sourceCode ← jc.toCode()
15 Create a f ile: f ile.name = jc.getName()
16 Save sourceCode into f ile
17 listFiles.add( f ile)
18 end
19 return listFiles
Luận án đã xây dựng 03 giải thuật CM2M, PRES2V và NPROM2C(NM2C, PROM2C) để sinh code từcác mơ hình UWE. Trong đó, giải thuật CM2M Sinh code từ mơ hình nội dung; Giải thuật PRES2V sinh code từ mơ hình trình bày; Giải thuật NPROM2C sinh code từ mơ hình điều hướng và mơ hình xử lý.