Tải bản đầy đủ (.pdf) (36 trang)

JCIA-Report-2018-final

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.74 MB, 36 trang )

TRƯỜNG ĐẠI HỌC CƠNG NGHỆ
KHOA CƠNG NGHỆ THƠNG TIN

CƠNG TRÌNH THAM DỰ
HỘI NGHỊ SINH VIÊN NGHIÊN CỨU KHOA HỌC CẤP KHOA
NĂM HỌC 2017 – 2018

Tên cơng trình:

Bộ cơng cụ đảm bảo chất lượng mã nguồn
cho các ứng dụng doanh nghiệp

Họ và tên sinh viên: Bùi Quang Cường - Lớp K59CLC
Nguyễn Minh Hiếu - Lớp K59CLC
Đinh Tiến Lộc - Lớp K59CLC
Khoa: Công nghệ thông tin
Người hướng dẫn: PGS. TS. Phạm Ngọc Hùng

Hà Nội, 3/2018


ii
TÓM TẮT
Mã nguồn ứng dụng trở nên lớn và phức tạp sau quá trình dài phát triển, bảo trì và
nâng cấp. Vấn đề này đang dần phổ biến đối với các doanh nghiệp phát triển phần
mềm, gây khó khăn trong việc kiểm soát và đảm bảo chất lượng cho các ứng dụng.
Hiện nay đã có một số cơng cụ được đề xuất để giải quyết vấn đề trên nhưng chưa có
kết quả thỏa đáng. Nghiên cứu này đề xuất các phương pháp và xây dựng một bộ cơng
cụ tồn diện cho việc phân tích và đảm bảo chất lượng mã nguồn cho các ứng dụng
doanh nghiệp sử dụng các nền tảng J2EE phổ biến Struts 2, Hibernate, Spring. Đầu
tiên, mã nguồn của ứng dụng sẽ được tiền xử lý để tạo cây cấu trúc. Mỗi nút trên cây


đại diện cho một thành phần mã nguồn. Tiếp theo, các nút sẽ được phân tích theo các
cơng nghệ sử dụng trong ứng dụng để xác định mối quan hệ phụ thuộc. Cây cấu trúc
này được sử dụng làm đầu vào cho việc phân tích ảnh hưởng sự thay đổi và các chức
năng phân tích cấu trúc như xây dựng đồ thị dữ liệu; xây dựng kiến trúc về công nghệ,
cơ sở dữ liệu; tính tốn độ phức tạp mã nguồn. Phương pháp phân tích ảnh hưởng sự
thay đổi được đề xuất cải tiến theo hướng tự động hóa bằng phương pháp so sánh các
phiên bản mã nguồn. Hiện nay, bộ công cụ đang được triển khai thử nghiệm tại Trung
tâm công nghệ và quản lý chất lượng phần mềm Viettel (VITM) và nhận được nhiều
phản hồi tích cực.

Từ khóa: phân tích mã nguồn, phân tích ảnh hưởng thay đổi, dịng dữ liệu, ứng dụng
doanh nghiệp


iii
LỜI CAM ĐOAN
Tôi xin cam đoan rằng những nghiên cứu về các phương pháp thực hiện bộ công
cụ đảm bảo chất lượng mã nguồn cho các ứng dụng doanh nghiệp trong báo cáo này là
của tôi và chưa từng được nộp như một báo cáo nghiên cứu khoa học tại trường Đại
học Công Nghệ - Đại học Quốc Gia Hà Nội hoặc bất kỳ trường đại học khác. Những
gì tơi viết ra không sao chép từ các tài liệu, không sử dụng kết quả của người khác mà
khơng trích dẫn cụ thể. Tôi xin cam đoan dự án bộ công cụ đảm bảo chất lượng mã
nguồn cho các ứng dụng doanh nghiệp này là do tôi tự phát triển, không sao chép mã
nguồn người khác. Nếu sai tôi xin chịu hoàn toàn trách nhiệm theo quy định của
trường Đại học Công Nghệ - Đại học Quốc Gia Hà Nội.

Hà Nội, ngày 12 tháng 03 năm 2018
Sinh viên

Bùi Quang Cường



iv
MỤC LỤC
Đặt vấn đề

1

Phương pháp đề xuất

2

Tiền xử lí mã nguồn

3

Phân tích phụ thuộc

3

Phân tích phụ thuộc cho Java Core

3

Phân tích phụ thuộc cho Struts 2

4

Phân tích phụ thuộc cho các cơng nghệ kết nối CSDL


5

Phân tích JDBC
Phân tích Hibernate Framework

5
11

Quản lý các phiên bản

13

Xây dựng dòng dữ liệu

15

Xây dựng đồ thị dịng dữ liệu thơ

15

Chuẩn hóa đồ thị dịng dữ liệu

16

Biểu diễn kiến trúc hệ thống

17

Xây dựng kiến trúc cho ứng dụng


17

Biểu đồ lớp

19

Xây dựng thiết kế cơ sở dữ liệu của ứng dụng

19

Công cụ cài đặt và thực nghiệm

20

Bộ cơng cụ JCIA-VT

20

Áp dụng bộ cơng cụ cho ví dụ cụ thể

23

Kết luận

26

Tài liệu tham khảo và phụ lục

28


DANH SÁCH BẢNG


v
Bảng 1. Ý nghĩa các kiểu cạnh trong đồ thị chuỗi
Bảng 2. Danh sách các phương thức truy xuất CSDL có sẵn của Hibernate

7
13

DANH SÁCH HÌNH ẢNH
Hình 2-1. Mơ hình thiết kế của ứng dụng Struts 2

4

Hình 2-2. Quá trình phân tích phụ thuộc cho ứng dụng Struts 2

5

Hình 2-3. Ví dụ minh họa đồ thị chuỗi của Mã nguồn 5

8

Hình 2-4. Q trình xây dựng và dự đốn câu truy vấn

9

Hình 2-5. Q trình phân tích phụ thuộc cho Hibernate

11


Hình 2-6. So sánh cây cấu trúc giữa hai phiên bản mã nguồn

14

Hình 2-7. Quá trình xây dựng đồ thị dịng dữ liệu

15

Hình 2-8. Xử lí cạnh hai chiều trong đồ thị

16

Hình 2-9. Xử lí chu trình trong đồ đồ thị

17

Hình 2-10. Phương pháp xây dựng kiến trúc cơng nghệ cho ứng dụng

19

Hình 2-11. Phương pháp xây dựng thiết kế cơ sở dữ liệu

20

Hình 3-1. Các thành phần chính bộ cơng cụ JCIA-VT

21

Hình 3-2. Giao diện tổng quan bộ cơng cụ JCIA-VT


23

Hình 3-3. Ví dụ phân tích dự án thực nghiệm

23

Hình 3-4. Nhật ký so sánh các phiên bản

25

Hình 3-5. Kết quả phân tích ảnh hưởng sự thay đổi

25

Hình 3-6. Ví dụ xây dựng dịng dữ liệu

26


vi

DANH SÁCH KÝ HIỆU, TỪ VIẾT TẮT
Ký hiệu

Từ gốc

Ý nghĩa

JDBC


Java Database Connectivity

Giao diện tiêu chuẩn dùng để
tương tác với các loại cơ sở dữ
liệu quan hệ của ngôn ngữ Java

DAO

Data Access Object

Đối tượng truy cập dữ liệu

CSDL

Cơ sở dữ liệu

CIA

Change Impact Analysis

Phân tích ảnh hưởng sự thay đổi

MVC

Model – View – Controller

Một mơ hình thiết kế ứng dụng
Web


AST

Abstract Syntax Tree

Cây cấu trúc trừu tượng

ERD

Entity Relationship Diagram

Biểu đồ quan hệ thực thể

API

Application Programming Interface

Giao diện lập trình ứng dụng

ORM

Object-relational Mapping

Ánh xạ quan hệ đối tượng

IoC & DI

Inversion of Control & Dependency
Injection

Sự đảo ngược điều khiển và tiêm

phụ thuộc


1
Đặt vấn đề
Hiện nay, các ứng dụng tại các doanh nghiệp thường được phát triển trong một thời gian
dài với quy mô lớn và độ phức tạp cao. Trải qua nhiều phiên bản nâng cấp, các ứng dụng
này thường thiếu tài liệu đặc tả và thiết kế. Có thể nói tài liệu gần như duy nhất của các
ứng dụng này là mã nguồn. Trong khi đó, q trình bảo trì và nâng cấp diễn ra thường
xuyên. Để đảm bảo chất lượng cho mỗi phiên bản mới, đội dự án cần thực hiện kiểm thử
lại toàn bộ hệ thống. Điều này là khơng thể bởi chi phí cho việc này rất tốn kém. Kết quả
là chúng ta khơng thể kiếm sốt toàn bộ sự ảnh hưởng của việc thay đổi và có thể dẫn đến
nhiều rủi ro lớn cho doanh nghiệp trong q trình vận hành. Đây là một bài tốn khó tổng
qt hóa vì các giải pháp đề xuất phụ thuộc chặt chẽ vào các công nghệ được sử dụng
trong ứng dụng. Đề xuất các giải pháp và xây dựng công cụ đủ tốt để giải quyết vấn đề
nêu trên đang là một trong những thách thức lớn và nhận được sự quan tâm nghiên cứu.
Phân tích ảnh hưởng sự thay đổi (Change Impact Analysis - CIA) được xem là một
giải pháp để giải quyết bài tốn trên. CIA có vai trò quan trọng trong các giai đoạn phát
triển, bảo trì và kiểm thử hồi quy. Đối với người quản lý và lập trình viên, CIA là cơng cụ
đánh giá phạm vi ảnh hưởng, ước lượng chi phí từ đó lên kế hoạch thực hiện thay đổi.
Đối với kiểm thử viên, trong q trình kiểm thử hồi quy, CIA có thể ứng dụng vào việc
xác định những ca kiểm thử có liên quan đến phần mã nguồn chỉnh sửa, điều này giúp
giảm số lượng các ca kiểm thử cần thực hiện từ đó rút ngắn thời gian và nỗ lực kiểm thử.
Các kĩ thuật CIA được thực hiện theo hai hướng tiếp cận chính là phân tích tĩnh (static
CIA) và phân tích động (dynamic CIA) [1]. Trong thực tế, hầu hết các nghiên cứu đề xuất
các phương pháp phân tích ảnh hưởng sự thay đổi liên quan đến static CIA. Nổi bật trong
số đó là kĩ thuật CIA dựa trên sự phân loại thay đổi [2], kĩ thuật dựa vào đồ thị Call
Graph [3] và kĩ thuật dựa trên tư tưởng giao thoa sóng nước WAVE-CIA [4]. Tuy nhiên,
Các kĩ thuật CIA sử dụng đầu vào là kết quả của q trình phân tích phụ thuộc từ ứng
dụng. Q trình này khơng thể tổng qt hóa cho tồn bộ các cơng nghệ và nền tảng hiện

có.
J2EE đang là một giải pháp phổ biến được sử dụng để triển khai cho các ứng dụng
Web doanh nghiệp hiện đại. Nó bao gồm nhiều công nghệ cốt lõi như EJB, JSF, CDI,
JAX-WS, JPA, JMS, v.v và có thể tích hợp nhiều framework khác như Spring, Struts,
Hibernate, Vaddin, GWT, Play!, Grails, v.v. Để giải quyết bài toán trên cho các ứng dụng


2
J2EE, một phương pháp kèm theo cơng cụ có tên JCIA [5] đã được đề xuất và xây dựng.
Tuy nhiên phương pháp này khá thô sơ và chỉ đề xuất phân tích cho một số cơng nghệ cốt
lõi của J2EE. Cơng cụ JCIA cịn đơn giản, chưa được hồn thiện và chưa mang lại tính
hiệu quả cao.
Dựa trên ý tưởng về phương pháp này, một phương pháp hoàn chỉnh đã được nghiên
cứu và đề xuất để thực hiện phân tích ảnh hưởng sự thay đổi cho các ứng dụng J2EE đa
nền tảng. Các framework phổ biến hiện nay: Spring, Struts, Hibernate sẽ được tập trung
hỗ trợ đầu tiên. Sau đó chúng tơi sẽ dần hồn thiện phương pháp cho các tất cả các nền
tảng khác. Ngồi ra, chúng tơi cũng đề xuất các giải pháp khác để đem lại nhiều góc nhìn
khách quan về hệ thơng ứng dụng như xây dựng dòng dữ liệu, tái hiện thiết kế kiến trúc
hệ thống và cơ sở dữ liệu, và tính tốn độ phức tạp mã nguồn. Một bộ công cụ được phát
triển như là phiên bản tiếp theo của công cụ JCIA để thực hiện các giải pháp đã đề xuất.
Phần còn lại của báo cáo được cấu trúc như sau. Phần 2 trình bày các phương pháp
thực hiện về tiền xử lý mã nguồn; phân tích phụ thuộc cho các cơng nghệ Struts 2, Spring,
Hibernate; quản lý các phiên bản phân tích; xây dựng dịng dữ liệu và cuối cùng là biểu
diễn các góc nhìn kiến trúc của ứng dụng. Tiếp theo, phần 3 trình bày bộ cơng cụ đảm
bảo chất lượng JCIA-VT, và kết quả đạt được qua thực nghiệm phân tích. Cuối cùng,
phần 4 tóm tắt các kết quả đạt được, kết luận, hạn chế và hướng nghiên cứu phát triển
trong tương lai.
Phương pháp đề xuất
Bộ công cụ phân tích mã nguồn cho các ứng dụng doanh nghiệp gồm ba bước chính: tiền
xử lí mã nguồn, phân tích phụ thuộc, xây dựng bộ công cụ dựa trên cây phụ thuộc.

● Tiền xử lý mã nguồn: Mã nguồn ứng dụng được phân tích và trích xuất ra những
thơng tin cần thiết để sinh dữ liệu dạng cây đơn giản, dễ thực hiện thao tác duyệt và
tìm kiếm.
● Phân tích phụ thuộc: Phân tích sâu cây dữ liệu tùy theo đặc điểm từng cơng nghệ
bằng phương pháp phân tích tĩnh để xác định sự phụ thuộc về cấu trúc và dữ liệu giữa
các thành phần trong mã nguồn ứng dụng.
● Xây dựng các công cụ: Xây dựng công cụ phục vụ cho việc phân tích ảnh hưởng,
phân tích cấu trúc và hiển thị kết quả cũng như các góc nhìn thiết kế của ứng dụng.


3
Tiền xử lí mã nguồn
Định nghĩa: (Cây cấu trúc) Cho mã nguồn ứng dụng J2EE, một cây cấu trúc của mã
nguồn này được định nghĩa T = (V, E) với V = {v1,v2,...,vk} là tập nút đại diện cho các
thành phần trong mã nguồn như thư mục; tệp; lớp, phương thức, thuộc tính (Java); thẻ
(XML, JSP); v,v. E = {(vi,vj) | vi,vj ∈V} là tập các cạnh. Mỗi cạnh (vi,vj) đại diện cho quan
hệ phụ thuộc giữa ni và nj có nghĩa là ni phụ thuộc vào nj.
Các ứng dụng doanh nghiệp J2EE, ngồi mã nguồn Java cịn sử dụng nhiều định
dạng mã nguồn như XML, JSP, XHTML, FreeMarker,...Với mỗi một định dạng lại có
cấu trúc và cú pháp khác nhau. Bộ tiền xử lý cần biến đổi những mã nguồn này về định
dạng chung là cây cấu trúc, các nút trên cây cấu trúc cần chứa những thông tin cần thiết
cho việc phân tích phụ thuộc cũng như cây cần được thiết kế để tối ưu cho việc duyệt và
tìm kiếm các nút trên cây dễ dàng.
Phân tích phụ thuộc
Qua quá trình nghiên cứu về đặc điểm thành phần mã nguồn các công nghệ và nền tảng
doanh nghiệp J2EE, nhóm đề xuất các loại phụ thuộc (Bảng phụ lục) và phương pháp
phân tích phụ thuộc cho một số các công nghệ và framework phổ biến Java Core, Struts
2, Hibernate, Spring. Đối với Spring, nhóm nghiên cứu đã hồn thiện phương pháp phân
tích phụ thuộc cho Spring Core và đang hồn thiện cho các mơ-đun khác nên sẽ khơng
được trình bày phương pháp phân tích trong báo cáo này.

Phân tích phụ thuộc cho Java Core
Các thành phần mã nguồn Java có ba loại phụ thuộc chính: quan hệ thừa kế, sử dụng
trường và gọi hàm. Tương ứng với các loại phụ thuộc này, ba thành phần riêng biệt trong
bộ phân tích phụ thuộc cho Java Core có chức năng phân tích các nút là thành phần Java
trên cây cấu trúc và xác định phụ thuộc Java Core giữa chúng. Ví dụ, từ Mã nguồn 1, bộ
phân tích phụ thuộc Java Core sẽ xác định được: phụ thuộc thừa kế từ nút A tới nút B, phụ
thuộc sử dụng trường từ nút A/f() tới nút A/a, phụ thuộc gọi hàm từ nút B/f() tới nút A/f().


4
Mã nguồn 1. Mẫu mã Java đơn giản
public class A {
int a;
public int f() { return a++; }
}

class B extends A {
public int f() { return super.f() + 5; }
}

Phân tích phụ thuộc cho Struts 2

Hình 2-1. Mơ hình thiết kế của ứng dụng Struts 2

Mã nguồn ứng dụng sử dụng Struts 2 được thiết kế theo mơ hình MVC 1 bao gồm ba
thành phần chính: View Result thường sử dụng mã nguồn JSP - View, Action Model sử
dụng mã nguồn Java - Model. Phần Controller được Struts 2 xử lý tự động thông qua lớp
FilterDispatcher kết hợp với tệp cấu hình do người dùng định nghĩa bằng mã nguồn
XML.
Mã nguồn 2. Mã cấu hình Struts 2 cho tính năng Add Book

method="execute">
1

/>

5
<result name="success">/WEB-INF/addbook-success.jsp</result>
<result name="error">/WEB-INF/addbook-error.jsp</result>
</action>

Thông tin các phụ thuộc giữa các thành phần mã nguồn Struts 2 dễ dàng được khai
thác từ tệp cấu hình. Trong Mã nguồn 2 trên, có một phụ thuộc từ thẻ <action> đến hàm
execute() của lớp AddBookAction và hai phụ thuộc từ hai thẻ <result> ra các tệp JSP
addbook-success.jsp và addbook-error.jsp.

Hình 2-2. Q trình phân tích phụ thuộc cho ứng dụng Struts 2

Hình 2-2 mơ tả q trình phân tích phụ thuộc cho một ứng dụng sử dụng Struts 2.
Đầu tiên, trình xác nhận đóng vai trị kiểm tra mã nguồn dự án có sử dụng Struts 2 hay
không, đầu ra là nút trên cây cấu trúc tương ứng với tệp struts.xml (tệp cấu hình chính
của Struts 2). Tiếp theo một trình phân tích cú pháp sẽ được sử dụng để tìm kiếm tất cả
tệp cấu hình Struts 2 được khai báo trong struts.xml, sau đó duyệt tất cả các tệp cấu hình,
thu thập và lưu trữ thông tin vào các Configuration Model (chứa thông tin của các đối
tượng cấu hình Struts 2: Package, Action, Result, Result Type, Interceptor, Interceptor
Stack). Ở bước cuối, trình phân tích phụ thuộc chính sẽ thực hiện việc đọc thơng tin từ
Configuration Model kết hợp với phân tích cây cấu trúc để xác định các phụ thuộc và gán
phụ thuộc vào cây cấu trúc.
Phân tích phụ thuộc cho các cơng nghệ kết nối CSDL
Phân tích JDBC

Các ứng dụng Java sử dụng JDBC như là một chuẩn để truy xuất cơ sở dữ liệu. JDBC
chịu trách nhiệm quản lí kết nối với CSDL, gửi các câu truy vấn được tạo từ Java tới
CSDL và xử lí kết quả sau truy vấn thành các đối tượng của Java. Trong ứng dụng doanh


6
nghiệp, các câu truy vấn thường được tạo từ trước. Sau đó, qua q trình chỉnh sửa để
phù hợp với nghiệp vụ, rồi được gửi cho CSDL bằng cách truyền vào phương thức
createQuery. Một ví dụ về sử dụng câu truy vấn được dùng trong ứng dụng Sample như
Mã nguồn 5.
Mã nguồn 3. Một phần trong chương trình Sample
protected String createPart(String a) { return “Book where author=” + a; }
public List<Book> getBookListOrder(int order, boolean group, boolean
isOrderId, Session session){
List<Book> books = new ArrayList<>();
String groupStr = “ group by “;
if (group) groupStr += “id”; else groupStr = “”;
String orderStr = “ order by”;
if (order == 0)
orderStr = “”;
else {
if (isOrderId) orderStr+=” id”;
else orderStr+=”year”;
if (order == -1) orderStr += “desc”; else orderStr = “asc”;
}
books=session.createQuery(“from” + getTableName() + groupStr +orderStr);
return books;
}

Làm sao để biết được câu truy vấn cuối cùng có giá trị gì, gây ảnh hưởng đến bảng

nào của CSDL? Hiện tại, có một vài công cụ giải quyết được vấn đề này như: JSA [6],
JDBC Checker [7], v.v. Nhưng các công cụ phải chuyển mã nguồn Java sang dạng
bytecode để xử lí. Do đó, chúng tơi đề xuất một phương pháp để dự đoán giá trị của câu
truy vấn từ mã nguồn Java bằng đồ thị chuỗi như trong Hình 2-4.
Định nghĩa 1: (Phép toán gộp) Cho hai tập A = {a1 , a2 ,..., an} và B = {b1, b2
,...,bm}. Phép tốn gộp hai tập A và B, kí hiệu: A ○ B là một tập C thỏa mãn:
C = {(a + b) | a ∈ A và b ∈ B}
Định nghĩa 2: (Đồ thị chuỗi) Đồ thị gốc r là nút rỗng, có hướng thể hiện q trình
thay đổi giá trị của một chuỗi kí tự, kí hiệu G = <V, E>, V là tập các đỉnh, E = V × OP ×
V biểu diễn tập các cạnh của đồ thị với các kiểu cạnh: OP = {INIT, CONCAT}. Mỗi đỉnh


7
v ∈ V gồm ba giá trị, kí hiệu v = (l, t, c, Rv). Trong đó:
l ∈ {STRING, VARIABLE, METHOD, APPENDABLE, UNDEFINED} là nhãn



của đỉnh.


t ∈ {UNION, PRODUCT} là kiểu xử lí của đỉnh.



c: thơng tin lưu trữ của đỉnh. Với l = STRING, c thể hiện cho một chuỗi kí tự. Với
l = VARIABLE hoặc APPENDABLE, c thể hiện cho tên biến. Với l = METHOD,
c thể hiện cho tên hàm.
Rv: tập dự đoán chứa những giá trị chuỗi có thể có của đỉnh v. Nếu vl = STRING,




Rv được khởi tạo là {vc}, ngược lại là {∅}
Ý nghĩa các các kiểu cạnh được thể hiện trong Bảng 1. Biểu thức v1 (label) v2 biểu
thị một cạnh có hướng từ đỉnh v1 tới đỉnh v2 với kiểu là label.
Bảng 1. Ý nghĩa các kiểu cạnh trong đồ thị chuỗi
Biểu thức

Ý nghĩa

Tương đương mã nguồn Java

v1 (INIT) v2

Giá trị của v2 là
giá trị khởi tạo
của v1

String var = “init value”;
StringBuilder b = new StringBuilder();
method() {return “value”;}

v1 (CONCAT) v2

Giá trị v2 được
thêm vào giá trị
của v1

var += “concat value”;
b.append(“append value”);


Ví dụ về đồ thị chuỗi sinh ra từ Mã nguồn 3 được biểu diễn ở Hình 2-3. Quá trình
sinh đồ thị và giải đồ thị để dự đoán tập kết quả được mơ hình bằng Hình 2-4. Trước hết,
mọi câu lệnh trong mã nguồn đều được quét qua và chỉ những câu lệnh sử dụng hàm
createQuery được giữ lại để xử lí. Nút mới được tạo tùy theo kiểu của tham số truyền
vào: biến, phương thức, v.v. và thêm vào đồ thị. Nếu phần tử vừa thêm là một phương
thức, nội dung của phương thức sẽ được quét, giá trị trong câu lệnh return sẽ được xử lí
và được thêm vào đồ thị. Còn khi phần tử vừa thêm là biến cục bộ, bộ sinh đồ thị sẽ quét
trọng phương thức sử dụng biến đó. Nếu tìm thấy câu lệnh thay đổi giá trị biến, đỉnh mới
được tạo tùy theo việc thay đổi là khởi tạo (INIT) hay cộng gộp (CONCAT) và thêm vào
đồ thị.


8

Hình 2-3. Ví dụ minh họa đồ thị chuỗi của Mã nguồn 5

Trong trường hợp giá trị mới đó được tạo nên bởi nhiều thành phần nhỏ, ví dụ như
“from” + getTableName() + groupStr +orderStr thì mỗi thành phần được nối trực tiếp đến

phần tử thêm cuối cùng trong đồ thị với cạnh kiểu CONCAT. Những đoạn câu lệnh ở
trong cặp if…then, then…else được tính như một đồ thị con có đỉnh là phần tử được thêm
cuối cùng trong đồ thị, và đỉnh gốc đó được đặt kiểu PRODUCT. Trong trường hợp câu
lệnh cần thêm vào đồ thị ở trong vòng lặp, ta phải xác định giá trị được thêm ở dạng
chuỗi kí tự bình thường, hay là phần tử của một mảng. Nếu là một chuỗi kí tự, giá trị của
đỉnh được thêm vào đồ thị có dạng <<(value)+>>. Nếu là phần tử của mảng, toàn bộ
phương thức sẽ được quét lại lần nữa để tìm ra những giá trị được thêm vào mang, sau đó
được thêm vào đồ thị. Cứ quét như vậy tới cuối phương thức hoặc khơng cịn nút nào
được thêm mới nữa thì kết thúc việc sinh đồ thị.



9

Hình 2-4. Q trình xây dựng và dự đốn câu truy vấn

Như Hình 2-3, tập dự đốn của nút gốc chính là kết quả của đoạn mã nguồn “from”
+ getTableName() + groupsr + orderStr. Do vậy, bộ giải đồ thị sử dụng phương pháp đệ
quy cùng thuật toán duyệt tiền thứ tự để dự đốn tập câu truy vấn có thể được tạo ra. Mỗi
kiểu xử lí t của đỉnh v thể hiện cách thêm giá trị các đỉnh ra của v vào tập dự đoán Rv như
nào. Giả sử đỉnh v có tập đỉnh ra là VOUT = {v1, v2,...,vn}. Gọi VCONCAT ⊂ VOUT là tập đỉnh
thỏa mãn ∀ vi ∈ VCONCAT, cạnh từ v đến vi có nhãn CONCAT, theo thứ tự FIFO (First In
First Out - đỉnh được thêm vào cây trước sẽ được lấy ra trước). Với RV là tập dự đốn của
đỉnh v, khi đó:
 v UNION VOUT → Rv = Rv ○ Rv1 ○ Rv2 ○…○ Rvn với v1, v2,…, vn ∈ VOUT
 v PRODUCT VOUT → Rv = (Rv ○ Rv1) ∪ (Rv ○ Rv2) ∪…∪ (Rv ○ Rvt) với v1, v2,…,
vt ∈ VCONCAT. Còn lại, ∀ vj ∈ VOUT \ VCONCAT, tập dự đoán Rvj sẽ được thêm trực
tiếp vào tập dự đốn R của đỉnh METHOD, VARIABLE và APPENDABLE phía
trên gần nhất.
Theo Hình 2-3, phương pháp giải đồ thị để tìm tập dự đoán như sau:
q = R”from” + R”getTableName” ○ R”group” ○ R”order”
= {“from”} ○ ({“Book where author=”} ○ R”a”) ○ R“group by” ○ R”order by”
= {“from”} ○ ({“Book where author=”} ○ {“<<UNDEFINED>>”}) ○ ({“group
by”} ○ {“id”} ∪ {“”}) ○ (({“order by”} ○ R”id”) ∪ ({“order by”} ○ R”year”) ∪ “”)


10
= {“from”} ○ {“Book where author= <<UNDEFINED>>”} ○ {“group by id”, “”} ○
(({“order by”} ○ (({“id”} ○ {“desc”}) ∪ ({“id”} ○ {“asc”}))) ∪ ({“order by”}
○(({“year”} ○ {“desc”}) ∪ ({“year”} ○ {“asc”})))) ∪ “”)
= {“from Book where author= <<UNDEFINED>>”} ○ {“group by id”, “”} ○

(({“order by”} ○ {“id desc”, “id asc”}) ∪ ({“order by”} ○ {“year desc”, “year asc”})
∪ {“”})
= {“from Book where author= <<UNDEFINED>> group by”, “from Book where
author=<<UNDEFINED>> group by id”} ○ ({“order by id desc”, “order by id
asc”} ∪ {“order by year desc”, “order by year asc”} ∪ {“”})
= {“from Book where author= <<UNDEFINED>> group by”, “from Book where
author=<<UNDEFINED>> group by id”} ○ {“order by id desc”, “order by id
asc”, “order by year desc”, “order by year asc”, “”}
= [“from Book where author= <<UNDEFINED>>”,
“from Book where author= <<UNDEFINED>> group by id”,
“from Book where author= <<UNDEFINED>> order by id desc”,
“from Book where author= <<UNDEFINED>> group by id order by id desc”,
“from Book where author= <<UNDEFINED>> order by id asc”,
“from Book where author= <<UNDEFINED>> group by id order by id asc”]
Sau khi tập dự đoán được xây dựng xong, các câu truy vấn được phân tích. Các bảng
sử dụng trong câu ở các vị trí quan trọng như: sau “from”, sau “join”, v.v. sẽ được lấy ra.
Danh sách những bảng này sẽ được thêm vào cây cấu trúc và sinh phụ thuộc.
Ưu điểm của phương pháp này là có thể phân tích, và dự đốn được các trường hợp
có thẻ xảy ra của một đối tượng lưu chuỗi mà không cần phải chạy mã nguồn trong JVM.
Điểm hạn chế là khơng xác định được chính xác giá trị cụ thể của đối tượng. Mặt khác
phương pháp chỉ xây dựng được giá trị dựa trên mã nguồn cho trước chứ không xử lí
được những trường hợp thay đổi giá trị do ngoại cảnh trong quá trình chạy trong JVM.
Như đồ thị ở Hình 2-3, do biến a là biến được truyền thừ ngồi vào phương thức, nên a
có giá trị là <<UNDEFINED>> do không thể xác định được giá trị.


11
Phân tích Hibernate Framework
ORM Framework (Object Relational Mapping Framework) là những công cụ giúp
chuyển đổi và ánh xạ những kiểu cấu trúc dữ liệu từ những hệ thống không tương thích

về đối tượng phù hợp. Hibernate là một trong những framework này, ánh xạ các bảng
trong CSDL với các đối tượng Java gọi là thực thể và đồng thời sử dụng JDBC để quản lí
và cải tiến các thao tác đến CSDL. Hibernate sử dụng hai phương pháp ánh xạ là dùng tệp
ánh xạ XML hoặc dùng Annotation để định nghĩa thông tin bảng trực tiếp trong lớp Java.
Do Hibernate có thể quản lí các bảng được ánh xạ, nên các bảng của CSDL được sử dụng
sẽ được xác định ngay đầu tiên khi các tệp cấu hình được phân tích.
Các bước phân tích phụ thuộc cho Hibernate được mơ tả như Hình 2-5. Đầu tiên, bộ
phân tích sẽ tìm tệp cấu hình hibernate.hbm.xml để xác định xem mã nguồn có sử dụng
Hibernate hay khơng. Nếu tìm thấy, bộ phân tích sẽ đọc các thẻ có trong tệp cấu hình đó
và chỉ ra các thẻ XML khai báo việc ánh xạ đối tượng. Mỗi thẻ XML có thể khai báo một
tệp ánh xạ XML khác hoặc một lớp Java. Bộ phân tích sẽ xác định tệp cấu hình ánh xạ
theo cách thức nào, từ đó sẽ có cách phân tích tương ứng. Các nút thể hiện cho bảng, cột
của CSDL được tạo và thêm vào cây cấu trúc hiện tại. Cùng với đó, các nút này được bộ
phân tích truy vấn sử dụng để tìm những thành phần có khả năng tác động đến CSDL.

Hình 2-5. Q trình phân tích phụ thuộc cho Hibernate

Mã nguồn 4 là một phần tệp cấu hình trong dự án Sample, bộ phân tích sẽ tìm tất cả
các thẻ <mapping> - thẻ chứa thơng tin ánh xạ giữa bảng của CSDL với một lớp trong
Java - gọi là các thực thể. Với phương pháp ánh xạ bằng XML, thẻ <mapping> sử dụng


12
thuộc tính là “resource” cùng với tên tệp XML chứa thơng tin ánh xạ. Cịn với phương
pháp Annotation, thuộc tính là “class” và tên lớp Java với đầy đủ package. Ví dụ, trong
mã nguồn 5 của tệp ánh xạ book.hbm.xml, thực thể Book được ánh xạ với bảng book trong
thẻ <class>. Khóa chính BOOK_ID được ánh xạ với thuộc tính bookId trong thẻ <id>,
BOOK_NAME với name và BOOK_AUTHOR với author trong thẻ .
Mã nguồn 4. Một phần tệp hibernate.cfg.xml của chương trình Sample
<hibernate-configuration>

<session-factory>

jdbc:mysql://localhost:3306/Book
</property> ....
<mapping resource="book.hbm.xml" />
</session-factory>
</hibernate-configuration>
Mã nguồn 5. Tệp ánh xạ book.hbm.xml của chương trình Sample
<hibernate-mapping>
<class name="vn.sample.hbm.Book" table="book">
<id name="bookId" type="java.lang.Integer">
<column name="BOOK_ID" />
<generator class="identity" />
</id>

<column name="BOOK_NAME" length="10"/>
</property>

<column name="BOOK_AUTHOR" length="20" />
</property>
</class>
</hibernate-mapping>

Hibernate hiện có hai cách thức tương tác với CSDL là dùng phương thức được xây
dựng sẵn có sử dụng thực thể hoặc sử dụng câu truy vấn. Do đó bộ phân tích Hibernate sẽ
chia ra làm hai phần nhỏ là phân tích hàm tương tác thực thể và phân tích câu truy vấn.
Hibernate đã xây dựng sẵn các phương thức tương tác với CSDL bằng thực thể, danh
sách các phương thức cho trong Bảng 2. Tham số truyền vào các hàm này có thể là tên
của thực thể Java dưới dạng “package.name” ví dụ như “sample.entity.Book”. Đi kèm
với tên thực thể là đối tượng Java chứa các giá trị cần gửi cho CSDL, hoặc chỉ cần gửi đối



13
tượng Java là đủ. Các phương thức này có các đặc điểm khá riêng biệt nên chúng dễ được
tìm thấy bằng các quét qua từng câu lệnh. Sau đó phân tích các tham số truyền vào
phương thức này và xác định thực kiểu thực thể của tham số.
Bảng 2. Danh sách các phương thức truy xuất CSDL có sẵn của Hibernate
Phương thức
delete(Object object)
delete(String entityName, Object object)

Mơ tả
Xóa một bản ghi

get(Class clazz, Serializable id)
get(String entityName, Serializable id)

Lấy thông tin bản ghi

load(Class clazz, Serializable id)
load(Object object, Serializable id)

Lấy thông tin bản ghi

merge(Object object)
merge(String entityName, Object object)

Cập nhật bản ghi

persist(Object object)

persist(String entityName, Object object)

Lưu bản ghi

save(Object object)
save(String entityName, Object object)

Lưu bản ghi

update(Object object)
update(String entityName, Object object)

Cập nhật bản ghi

Ngoài câu truy vấn SQL thơng thường, Hibernate cịn hỗ trợ dùng ngơn ngữ truy
vấn HQL - ngôn ngữ truy vấn làm việc trên các thực thể khác với SQL làm việc trên các
bảng - ví dụ như “from sample.entity.Book” hay chỉ đơn giản “from Book”. Do đó, bộ
phân tích JDBC API sẽ được sử dụng cho phân tích truy vấn của Hibernate, nhưng khơng
chỉ tìm bảng được gọi mà cịn xác định những thực thể có tham gia trong câu truy vấn.
Quản lý các phiên bản
Mã nguồn dự án luôn thay đổi liên tục, để tiết kiệm thời gian và công sức cho việc phân
tích thay đổi cũng như giúp lưu trữ lịch sử phân tích nhiều phiên bản mã nguồn của cùng
một dự án. Một bộ quản lý và so sánh các phiên bản mã nguồn được đề xuất thực hiện.


14
Bộ so sánh mã nguồn nhận đầu vào là phiên bản mã nguồn đã được thay đổi. Một
trình kiểm tra sẽ quét toàn bộ mã nguồn mới, so sánh với mã nguồn gốc để tìm ra những
tệp có nội dung thay đổi hoặc tệp mới hoặc tệp bị xóa. Đối với những tệp thay đổi, các bộ
tiền xử lý tương ứng với mã nguồn của tệp đó sẽ được sử dụng để tạo cây cấu trúc mới.

Tiếp theo, thông tin nút gốc của cây sẽ được sử dụng để định danh nút này trên cây cấu
trúc của mã nguồn gốc. Sau khi định danh được nút biểu diễn tệp thay đổi, một trình
duyệt cây sẽ duyệt hậu thứ tự đồng thời trên cây cấu trúc mới của tệp thay đổi và phần
cây con trên cây cấu trúc mã nguồn gốc để tìm ra những nút được thêm mới, xóa đi hoặc
thay đổi nội dung. Cuối cùng, kết thúc quá trình so sánh mã nguồn, ta sẽ nhận được tệp
thay đổi một cách hoàn toàn tự động để cung cấp cho bộ phân tích ảnh hưởng thay đổi.

Hình 2-6. So sánh cây cấu trúc giữa hai phiên bản mã nguồn

Hình 2-6 minh họa cho ví dụ ý tưởng so sánh hai phiên bản mã nguồn của dự án
Sample. Sau khi định danh được nút Book.java trên cây cấu trúc mã nguồn gốc, ta thực
hiện duyệt hậu thứ tự đồng thời trên hai cây. Khi duyệt các cây với độ sâu cấp ba, ta nhận
thấy nút thuộc tính có tên id đã được thay đổi kiểu và nút phương thức
removeAuthor(_authorId) tồn tại trên cây mới nhưng khơng có trên cây gốc vì vậy nút
này đã được thêm mới.


15
Xây dựng dòng dữ liệu
Đồ thị dòng dữ liệu là một khía cạnh của phân tích cấu trúc. Đồ thị dòng dữ liệu biểu diễn
một thứ tự đầy đủ các nút từ nút mở đầu dòng dữ liệu đến nút cuối cùng mà dữ liệu được
sử dụng. Với ứng dụng J2EE, nút mở đầu thường là các phần tử thuộc phần View, như là
tệp JSP, HTML, v.v. Sau đó, thơng tin được gửi tới các lớp nghiệp vụ để xử lí. Sau khi
lớp nghiệp vụ tương tác với CSDL, kết quả được trả về và hiển thị. Do đó, đồ thị dòng dữ
liệu phải thể hiện một hướng đi rõ ràng và khơng có chu trình.
Cách thức xây dựng dịng dữ liệu được mơ tả như Hình 2-7. Để xây dựng đồ thị
dòng dữ liệu, đầu tiên phương pháp này tạo một đồ thị ở dạng thô, tập trung vào phần dữ
liệu của dịng. Sau đó đồ thị được chuẩn hóa và giữ lại thơng tin cần thiết cho việc hiển
thị.


Hình 2-7. Q trình xây dựng đồ thị dịng dữ liệu

Xây dựng đồ thị dịng dữ liệu thơ
Các cạnh của đồ thị cần xây dựng được chia thành hai loại: DBTOVIEW (cạnh thể hiện
truyền dữ liệu được truyền từ CSDL đến lớp hiển thị của ứng dụng) và VIEWTODB
(cạnh thể hiện truyền dữ liệu từ lớp hiển thị đến CSDL). Mỗi đồ thị có một đỉnh gốc là
đỉnh bắt đầu của dịng dữ liệu. Đầu tiên tìm danh sách các phụ thuộc lô-gic của đỉnh gốc,
mỗi phụ thuộc sẽ được ánh xạ sang tập các cạnh. Với mỗi phụ thuộc trong danh sách trên,
nếu nó là phụ thuộc chưa được xử lý, nút gốc của phụ thuộc và tập cạnh ánh xạ sẽ được
thêm vào đồ thị. Sau đó, nút đích của phụ thuộc tiếp tục được xử lí, cịn phụ thuộc đó sẽ
được gán nhãn converted để bỏ qua trong quá trình sinh đồ thị.


16
Chuẩn hóa đồ thị dịng dữ liệu
Đồ thị thơ được tạo ra ở trên đang lưu trữ các đỉnh và cạnh chứa tất cả các thông tin của
cây cấu trúc ứng với mã nguồn ứng dụng đang phân tích. Do đó, việc chuẩn hóa giúp loại
bỏ những thơng tin khơng cần thiết nhằm tăng hiệu năng xử lí và giảm thiểu dung lượng
cho đồ thị. Mục đích của việc chuẩn hóa là làm rõ các đường đi trong đồ thị. Đầu tiên, các
cạnh hai chiều sẽ được xử lý. Cạnh hai chiều là cạnh mà giữa hai đỉnh của cạnh đó có các
cạnh thuộc cả hai kiểu DBTOVIEW và VIEWTODB. Mơ hình minh họa phương pháp xử
lý được thể hiện trong Hình 2-8. Tư tưởng chính của phương pháp này là tìm nút có cạnh
hai chiều, nhân đơi nút đó, và phân loại các cạnh vào hai nút.

Hình 2-8. Xử lí cạnh hai chiều trong đồ thị

Trong minh họa này, đỉnh 4 được xử lí đầu tiên do là đỉnh thấp nhất chứa đỉnh lá,
chứa cả hai cạnh kiểu DBTOVIEW và VIEWTODB với cùng một đỉnh khác. Đỉnh 4’
được tạo với các thông tin giống đỉnh 4. Những cạnh bao gồm cả cạnh tới và cạnh ra của
đỉnh 4 kiểu VIEWTODB được chuyển sang cho đỉnh 4’, đỉnh 4 chỉ giữ lại những cạnh

kiểu DBTOVIEW. Sau đó, tìm tiếp lên các đỉnh 3, 2, 1 và thực hiện tương tự.
Sau khi đã xử lý được hết các cạnh hai chiều, bước chuẩn hóa cuối cùng là xóa đi
các chu trình có trong đồ thị. Chu trình của đồ thị dịng dữ liệu tồn tại khi một nút chứa
các cạnh thuộc cả hai loại VIEWTODB và DBTOVIEW. Tư tưởng của bước này cũng
khá giống bước xử lí cạnh hai chiều: Tìm những nút nào có cạnh liên quan thuộc cả hai
loại VIEWTODB và DBTOVIEW, sau đó nhân đơi nút và xếp hai loại cạnh vào hai nút.


17
Đồ thị sẽ được duyệt theo kiểu tiền thứ tự. Như Hình 2-9, đỉnh 1 là đỉnh gây ra chu
trình cho đồ thị. Tạo đỉnh 1’ giống đỉnh 1, những cạnh kiểu VIEWTODB của đỉnh 1 sẽ
được chuyển sang cho đỉnh 1’, đỉnh 1 chỉ giữ lại những cạnh kiểu DBTOVIEW. Duyệt
tiếp các đỉnh tiếp theo thấy được đỉnh 3 có dấu hiệu tồn tại chu trình, và được xử lí như
đỉnh 1. Kết thúc duyệt, kết quả là đồ thị được chuẩn hóa và được hiển thị.

Hình 2-9. Xử lí chu trình trong đồ đồ thị

Biểu diễn kiến trúc hệ thống
Kiến trúc dự án bao gồm nhiều góc nhìn khác nhau, công cụ này tập trung vào xây dựng
ba góc nhìn chính trong kiến trúc:
 Kiến trúc cơng nghệ: công nghệ sử dụng tại mỗi tầng, mối liên hệ giữa các công
nghệ với nhau.
 Sơ đồ lớp: sơ đồ biểu thị mối quan hệ giữa các lớp trong cùng một gói (package).
 Thiết kế cơ sở dữ liệu: nếu dự án sử dụng framework Hibernate, cơng cụ sẽ có thể
phân tích và dựng mơ hình cơ sở dữ liệu trực quan dạng ERD.
Xây dựng kiến trúc cho ứng dụng
Thực tế trong các dự án, điều các thành viên dự án quan tâm là: công nghệ sử dụng, phiên
bản công nghệ, công nghệ được sử dụng tại đâu. Hơn nữa, các thành viên quản trị muốn
có góc nhìn tổng quan về mặt công nghệ của dự án: tại mỗi thành phần sử dụng ngôn ngữ,
phiên bản, và cách liên kết. Chức năng phân tích kiến trúc cơng nghệ, cho phép người



18
dùng có thể có cái nhìn tổng quan về mặt kiến trúc các công nghệ sử dụng của dự án đầu
vào. Ví dụ: tầng trình diễn sử dụng AngularJS, tầng nghiệp vụ sử dụng Spring 4, tầng kết
nối cơ sở dữ liệu sử dụng Hibernate. Trong Hình 2-10 thể hiện các bước xây dựng kiến
trúc cơng nghệ.
(1) Bộ phân tích kiến trúc hệ thống được kích hoạt một lần ngay sau khi q trình
phân tích mã nguồn hồn tất.
(2) Phân tích tất cả các tệp tin thư viện (định dạng .jar) để xác định các thư viện mà dự
án có thể sử dụng, từ các thư viện được thêm vào dự án bước đầu có thể xác định
được framework sử dụng trong dự án.
(3) Phân tích tệp pom.xml nếu dự án sử dụng Maven2. Đây cũng là một cách xác định
các thư viện được sử dụng trong dự án.
(4) Danh sách các framework ứng viên sẽ được xác định sau hai quá trình trên. Dựa
trên thực tế triển khai đã định nghĩa được thư viện tương ứng với framework trong
tệp rule.xml
(5) Tiến hành thực hiện xác thực đối với các framework ứng viên. Đối với mỗi
framework có một cấu hình đặc trưng, dựa vào các đặc trưng này có thể xác định
chính xác framework được sử dụng trong dự án đầu vào.
(6) Danh sách sau quá trình thực hiện xác thực. Các framework được xác định vào các
tầng ứng dụng tương ứng.
(7) Tiến hành xây dựng kiến trúc đối với các framework đã phát hiện được. Kiến trúc
công nghệ được chuẩn hóa cho q trình hiển thị giao diện. Kiến trúc công nghệ
được xây dựng tham khảo dựa trên mô hình MVC, các framework được đặt vào
từng vị tầng cụ thể tương ứng giúp người dùng hình dung một cách rõ ràng kiến
trúc công nghệ được mã nguồn đầu vào sử dụng.
(8) Biểu diễn kiến trúc ứng dụng lên giao diện người dùng.

2





19

Hình 2-10. Phương pháp xây dựng kiến trúc cơng nghệ cho ứng dụng

Biểu đồ lớp
Trong thiết kế hệ thống, sơ đồ lớp là một thành phần không thể thiếu, dưới đây là các
bước để xây dựng sơ đồ lớp trong bộ cơng cụ:
(1) Q trình dựng sơ đồ lớp của một gói được bắt đầu khi sự kiện chuột người dùng
được kích hoạt trên giao diện.
(2) Dựa vào phụ thuộc đã được phân tích ngay từ ban đầu, tiến hành tìm tất cả các lớp
và thuộc tính của nó. Sau đó, tiến hành phân tích phụ thuộc giữa các lớp để xác
định quan hệ làm tiền đề cho sinh sơ đồ lớp.
(3) Từ mối quan hệ và các thuộc tính đã tìm được, xây dựng sơ đồ lớp cần thiết cho
quá trình hiển thị trên giao diện.
(4) Hiển thị giao diện với các ký hiệu đúng theo chuẩn UML 2.0.
Xây dựng thiết kế cơ sở dữ liệu của ứng dụng
Trong thiết kế hệ thống, thiết kế cơ sở dữ liệu là thành phần quan trọng, trong Hình 2-11
thể hiện các bước sinh biểu đồ thực thể quan hệ (ERD) của cơ sở dữ liệu.


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×