5.1.1. Giới thiệu Eclipse
Eclipse là môi trƣờng phát triển tích hợp và là nền tảng đƣợc thiết kế để tích hợp công cụ phát triển ứng dụng. Theo thiết kế từ đầu, Eclipse tự nó không cung cấp chức năng hoàn thiện cho ngƣời dùng cuối, nó đóng vai trò nhƣ một môi trƣờng tích hợp các công cụ gắn thêm do ngƣời dùng tự định nghĩa. Các công cụ gắn thêm này sẽ giúp ngƣời dùng cuối thực hiện các tác vụ cần thiết, đồng thời sẽ làm phong phú thêm các khả năng ứng dụng của Eclipse trong thực tế.
Eclipse cung cấp mô hình giao diện chung cho các công cụ làm việc. Nó đƣợc thiết kế để chạy trên nhiều hệ điều hành khác nhau bằng cách cung cấp sự tích hợp mạnh mẽ với kiến trúc bên dƣới của hệ điều hành. Các thành phần gắn thêm có thể chạy trên API khả chuyển của Eclipse và không thay đổi trên bất kì hệ điều hành nào mà Eclipse hỗ trợ.
Nhân của Eclipse là một kiến trúc nền tảng cho việc tìm kiếm, tải và chạy các thành phần gắn thêm. Nền tảng điều khiển lôgic của việc tìm kiếm và chạy đúng mã lệnh. Giao diện của nền tảng cung cấp mô hình tƣơng tác với ngƣời dùng chuẩn. Mỗi thành phần gắn thêm có thể tập trung vào lƣợng nhỏ các tác vụ và hoàn thành tốt tác vụ đó. Có rất nhiều loại tác vụ: kiểm thử, xuất bản, biên dịch, gỡ lỗi…
Nền tảng Eclipse định nghĩa một kiến trúc mở, vì vậy mỗi nhà phát triển thành phần gắn thêm có thể tập trung vào miền chuyên gia của họ. Những nhà phát triển Eclipse chịu trách nhiệm phát triển nền tảng, sau đó những chuyên gia sẽ sử dụng để xây dựng nên các công cụ cho ngƣời dùng cuối. Nếu nền tảng đƣợc phát triển tốt, nhiều tính năng mới và các mức tích hợp có thể đƣợc gắn vào mà không ảnh hƣởng đến những công cụ khác.
Eclipse sử dụng mô hình bàn làm việc chung (common workbench) để tích hợp các công cụ dƣới khía cạnh của ngƣời dùng. Nhà phát triển có thể tạo ra công cụ và gắn vào Eclipse bằng cách sử dụng những móc đƣợc định nghĩa nhƣ các điểm mở rộng.
Nền tảng cũng đƣợc xây dựng dựa trên các lớp gắn vào, mỗi lớp định nghĩa một mở rộng cho điểm mở rộng của lớp gắn vào mức thấp và đến lƣợt nó lại định nghĩa những điểm mở rộng cho việc tùy biến mức cao hơn. Mô hình mở rộng này cho phép nhà phát triển thành phần gắn thêm cung cấp rất nhiều loại chức năng cho công cụ nền tảng cơ sở. Tài nguyên cho mỗi công cụ này, ví dụ nhƣ file và các loại dữ liệu khác, đều đƣợc định vị bằng mô hình tài nguyên chung cho nền tảng. Nền tảng cung cấp cho ngƣời dùng cách chung để làm việc với công cụ, và cung cấp việc quản lý tài nguyên tích hợp với những thành phần gắn vào do họ tạo ra.
5.1.2. Kiến trúc của Eclipse
Các thành phần gắn thêm tạo thành một hệ thống con định nghĩa các điểm mở rộng phục vụ cho các hành vi của hệ thống nền tảng. Các thành phần chính của hệ thống bao gồm:
- Engine thực thi (platform runtime)
- Bộ quản lý tài nguyên (Resource managerment) - Giao diện bàn làm việc (Workbench UI)
- Hệ thống trợ giúp (help)
- Hỗ trợ làm việc nhóm (team support) - Hỗ trợ dò lỗi (debug support)
- Công cụ phát triển java (Java Development Tool - JDT) và các tiện ích khác.
Hình 5.1: Kiến trúc tổng quan của Eclipse
Trong các thành phần gắn thêm này, chúng ta sẽ tập trung chủy yếu đến JDT. Đây là thành phần gắn thêm cung cấp đầy đủ các tính năng để Eclipse có thể thao tác với ngôn ngữ java. JDT đƣợc cài đặt bởi một nhóm các thành phần gắn thêm, bao gồm các thành phần có giao diện và các thành phần không có giao diện. Các thành phần không có giao diện là những thành phần đóng vai trò nòng cốt. Các thành phần chính của JDT là : dự án java, bộ soạn thảo mã nguồn, bộ tìm kiếm, bộ so sánh, bộ biên dịch, bộ thực thi, bộ gỡ rối. Trong các thành phần gắn thêm của JDT, JDT Core (org.eclipse.jdt.core) định nghĩa các thành phần cơ bản của ngôn ngữ java và mở các API để ngƣời dùng có thể gọi và thao tác với mã nguồn. Trong các gói chính của thành phần gắn thêm này gói org.eclipse.jdt.core.dom giúp ngƣời dùng thao tác với cây cú pháp trừu tƣợng, từ đó ngƣời dùng có thể thao tác với các thành phần cấu trúc của chƣơng trình.
Để thực thi việc phân tích mã nguồn chƣơng trình cài đặt RBAC viết bằng ngôn ngữ java, chúng ta sẽ xây dựng một thành phần gắn thêm tích hợp vào Eclipse. Thành phần gắn thêm này sẽ sử dụng thƣ viện JDT Core để thao tác với mã nguồn java. Từ đó kết hợp với cơ sở dữ liệu định nghĩa các luật RBAC để xây dựng nên cây cú pháp trừu tƣợng của ngôn ngữ LRBAC. Trên cơ sở đó sẽ từng bƣớc thực thi thuật toán kiểm chứng.
5.1.3. Các thành phần cơ bản của một thành phần gắn thêm trong Eclipse
Sau khi cài đặt, thành phần gắn thêm sẽ ở trong thƣ mục plugin trong thƣ mục cài Eclipse. Để hiểu rõ một thành phần gắn thêm chúng ta sẽ xem xét cấu trúc thƣ mục của một thành phần gắn thêm.
Hình 5.2 : Các thành phần cơ bản của một thành phần gắn thêm ant.
Trong hình vẽ 5.2 là cấu trúc của thƣ mục thành phần gắn thêm Ant, tích hợp trình biên dịch Ant vào Eclipse. Các tệp chính trong thƣ mục :
- Plugin.xml : là tệp tin khai báo của thành phần gắn thêm. Đây là tệp tin quan trọng nhất và không thể thiếu. Bản ghi này mô tả tên của thành phần gắn thêm, tên phiên bản và liệt kê danh sách các thƣ viện cần thiết cũng nhƣ tất cả các điểm mở rộng đƣợc sử dụng và định nghĩa trong thành phần gắn thêm.
- Plugin.properties : Các chuỗi ràng buộc đƣợc tham chiếu trong plugin.xml - About.html : Thông tin về tác giả và bản quyền.
- *.jar : Chứa các file byte code cần thiết để thực thi thành phần gắn thêm. - Lib : Thƣ mục chứa các thƣ viện cần thiết.
- Icons : Thƣ mục chứa các file ảnh cần cho thành phần gắn thêm.
Khi khởi động, Eclipse sẽ quét thƣ mục chứa các thành phần gắn thêm để tìm kiếm các thành phần gắn thêm đã đƣợc định nghĩa. Nếu có nhiều phiên bản của một thành phần gắn thêm, chỉ một phiên bản duy nhất đƣợc sử dụng. Mặc dù Eclipse đọc tất cả các bản ghi của các thành phần gắn thêm, tuy nhiên nó sẽ không nạp tất cả các thành phần gắn
thêm này ngay mà chỉ nạp thành phần gắn thêm khi thành phần gắn thêm đó đƣợc sử dụng lần đầu tiên. Điều này giúp tiết kiệm thời gian khởi động vì trong các hệ thống Eclipse lớn có thể có rất nhiều thành phần gắn thêm, và nhiều thành phần gắn thêm chỉ thực thi các tác vụ chuyên biệt và ít khi đƣợc sử dụng.
File plugin.xml của chƣơng trình đƣợc xây dựng :
<?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.2"?> <plugin> <extension point="org.eclipse.ui.popupMenus"> <objectContribution adaptable="false" id="net.sourceforge.earticleast.app.objectContribution1" objectClass="org.eclipse.jdt.core.ICompilationUnit"> <action class="net.sourceforge.earticleast.app.ASTArticleActionDelegate" id="net.sourceforge.earticleast.app.astArticleAction1" label="RBAC CHECK"/> </objectContribution> </extension> </plugin>
File plugin.xml định nghĩa điểm mở rộng của thành phần gắn thêm đƣợc hiển thị trong Eclipse. Thành phần gắn thêm do chúng ta định nghĩa đƣợc gắn vào điểm org.eclipse.ui.popupMenus là thành phần popupMenu của Eclipse. Khi ngƣời dùng thực thi sẽ gọi đến lớp net.sourceforge.earticleast.app.ASTArticleActionDelegate là đầu vào của chƣơng trình. Tƣơng ứng với hàm Main trong các chƣơng trình java thông thƣờng.
5.1.4. Cài đặt thuật toán dựa trên thành phần gắn thêm của Eclipse
5.1.4.1. Các bước tiến hành
Yêu cầu đầu tiên của việc thực thi thuật toán là xây dựng đƣợc cây cú pháp trừu tƣợng của chƣơng trình theo ngôn ngữ LRBAC. Để thực hiện đƣợc điều này, chúng ta cần thao tác với mã nguồn java của chƣơng trình để tìm ra các từ khóa của ngôn ngữ LRBAC. Chƣơng trình lấy đầu vào là cơ sở dữ liệu RBAC, trong cơ sở dữ liệu này đã chứa tập hợp các từ khóa cần thiết : Danh sách ngƣời dùng, danh sách vai trò, danh sách sự cho phép, danh sách thao tác và danh sách đối tƣợng.
Sử dụng các API có sẵn trong gói org.eclipse.jdt.core.dom chúng ta có thể thăm toàn bộ mã nguồn của chƣơng trình. Kết hợp với cơ sở dữ liệu RBAC có sẵn, chúng ta sẽ
xây dựng đƣợc cây AST của chƣơng trình theo ngôn ngữ LRBAC. Về cơ bản cây AST này sẽ là cây AST ở mức cao hơn so với cây AST của ngôn ngữ java.
Các công việc cần tiến hành có thể đƣợc khái quát dựa trên hình vẽ sau :
Hình 5.3. Các bƣớc tiến hành kiểm chứng.
Bƣớc 1 : Cung cấp mã nguồn của chƣơng trình đã đƣợc cài đặt các luật RBAC và cơ sở dữ liệu RBAC. Mã nguồn của chƣơng trình dƣới dạng tệp tin .java trong thƣ mục chứa chƣơng trình.
Bƣớc 2 : Phân tích ngữ pháp của mã nguồn. Mã nguồn ở bƣớc 1 sẽ đƣợc phân tích nhờ sử dụng các phƣơng thức phân tích mã nguồn đƣợc định nghĩa trong lớp org.eclipse.jdt.core.dom.ASTParser.
Bƣớc 3 : Sau bƣớc 2 chúng ta sẽ xây dựng đƣợc cây cú pháp trừu tƣợng của chƣơng trình java. Kết hợp với cơ sở dữ liệu RBAC đƣợc cung cấp chúng ta sẽ xây dựng đƣợc cây cú pháp trừu tƣợng của ngôn ngữ LRBAC.
Bƣớc 4 : Xây dựng bộ dữ liệu cho thuật toán. Từ cây cú pháp trừu tƣợng của ngôn ngữ LRBAC, kết hợp với các biểu thức điều kiện khi truy cập tài nguyên trong chƣơng
trình chúng ta sẽ xây dựng tập hợp các bộ <user, object, operation, resource>. Đây chính là đầu vào để thực thi thuật toán kiểm chứng.
Bƣớc 5 : Kiểm chứng tính đúng đắn của chƣơng trình cài đặt và cơ sở dữ liệu mô tả các luật RBAC. Dựa vào thuật toán đã mô tả ở chƣơng IV chúng ta sẽ kiểm chứng và thông báo kết quả.
5.1.4.2. Cài đặt chương trình
Cây cú pháp trừu tƣợng (AST) là cách để Eclipse xem xét mã nguồn của chƣơng trình : Các tệp tin java đều đƣợc biểu diễn dƣới dạng các nút của cây cú pháp trừu tƣợng. Những nút này là các lớp con của lớp ASTNode. Mỗi nút con đƣợc đặc trƣng bởi một thành phần của ngôn ngữ Java. Ví dụ nhƣ : nút biểu diễn khai báo phƣơng thức (MethodDeclaration), nút biểu diễn khai báo biến (VariableDeclarationFragment), nút biểu diễn phép gán (Assignment), … Để tìm ra các điều kiện ảnh hƣởng đến truy cập tài nguyên, chúng ta cần quan tâm đến các ASTNode nhƣ sau : ExpressionStatement, InfixExpression, DoStatement, ForStatement, WhileStatement.
Hình 5.4. Cây cú pháp trừu tƣợng.
Thông thƣờng cây cú pháp trừu tƣợng của ngôn ngữ java sẽ đƣợc tạo ra nhờ phân tích cú pháp của tệp tin chứa mã nguồn. Để thực hiện việc này chúng ta sử dụng lớp ASTParser có sẵn trong gói org.eclipse.jdt.core.dom. Khi đƣợc cài đặt, lớp này sẽ xử lý toàn bộ tệp tin mã nguồn java. Trong chƣơng trình, phƣơng thức parse (IcompilationUnit unit) sẽ phân tích cú pháp của mã nguồn đƣợc chứa trong tệp tin mà unit trỏ đến.
protected CompilationUnit parse(ICompilationUnit lwUnit) {
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(lwUnit);
parser.setResolveBindings(true);
return (CompilationUnit) parser.createAST(null);
Phƣơng thức ASTParser.newParser(AST.JLS3) sẽ hƣớng dẫn bộ phân tích cú pháp phân tích mã nguồn theo đặc tả ngôn ngữ java thế hệ thứ 3 (JLS3). JLS3 là đặc tả đƣợc cập nhật cho các cú pháp của ngôn ngữ java phiên bản thứ 5.
Phƣơng thức parser.setKind(ASTParser.K_COMPILATION_UNIT) sẽ chỉ tham số đầu vào cho bộ phân tích mã nguồn. IcompilationUnit là con trỏ trỏ đến tệp tin chứa mã nguồn java.
Mỗi chƣơng trình java đơn giản cũng có một cây cú pháp rất phức tạp. Để tìm ra nút của cây cú pháp trừu tƣợng, chúng tả sử dụng bộ thăm cây. Mỗi nút ASTNode đều cho phép tìm các nút con của nó nhờ sử dụng lớp ASTVisitor. Mỗi lớp con của lớp ASTNode đều có 2 phƣơng thức là visit() và endVisit(). Lớp ASTVisitor còn có thêm hai phƣơng thức là preVisit(ASTNode node) và postVisit(ASTNode node). Trong lớp ASTVisitor có các phƣơng thức để thao tác với tất cả các thành phần của ngôn ngữ java. Ở đây chúng ta cần quan tâm đến phƣơng thức để xác định việc truy cập đến các tài nguyên :
public boolean visit(ExpressionStatement node)
Phƣơng thức này đƣợc cài đặt trong lớp rbac.astvisitor.OperationFinder
Khi thăm cây, nếu gặp truy cập đến các tài nguyên, chúng ta tạo ra một bộ <User, Role, Operation, Object> mới theo nhƣ mô tả trong thuật toán. Sau đó chúng ta sẽ tìm cách thăm ngƣợc lại từ điểm này đến gốc của cây cú pháp trừu tƣợng. Khi gặp các điểm xác định điều kiện truy cập chúng ta sẽ thêm mới và cập nhật các bộ này. Các phƣơng thức để tìm ra các điểm điều kiện trong chƣơng trình cho phép truy cập vào các tài nguyên theo cơ sở dữ liệu RBAC.
public boolean visit(InfixExpression node) public boolean visit(IfStatement node) public boolean visit(DoStatement node) public boolean visit(WhileStatement node)
Khi tìm đến gốc của cây cú pháp trừu tƣợng chúng ta sẽ thực thi thuật toán kiểm chứng. Nếu thuật toán kiểm chứng trả về kết quả không thỏa mãn, chƣơng trình sẽ thông báo đến ngƣời dùng và kết thúc. Nếu thuật toán vẫn thỏa mãn chúng ta sẽ tiếp tục tìm kiếm từ điểm tiếp theo đến phần còn lại của cây cú pháp trừu tƣợng. Chƣơng trình kết thúc khi chúng ta đã thăm đƣợc toàn bộ cây trừu tƣợng. Nếu không tìm thấy bộ nào vi
phạm các luật RBAC đƣợc mô tả trong cơ sở dữ liệu có nghĩa là mã nguồn đã đƣợc cài đặt theo đúng các luật ràng buộc RBAC.