Đề tài Tìm Hiểu uPortal và xây dựng một chương trình Demo

Định nghĩa một cách tương đối, Portal là một phần mềm ứng dụng Web-based, định danh và xác thực người dùng đăng nhập, từ đó sẽ cung cấp giao diện mang tính cá nhân hóa cho người sử dụng. Thông qua giao diện này,người dùng dễ dàng truy cập, khai thác, tìm kiếm, giao tiếp với các ứng dụng, các thông tin, và với những người dùng khác. Đứng trên khía cạnh công nghệ, ngày nay portal được coi như một giải pháp(frame work) mà thông qua đó chúng ta có thể quy tụ, quản lý nhiềunguồn thông tin(bao gồm thông tin và ứng dụng phần mềm) khác nhau vào trong một thực thể phần mềm duy nhất-phần mềm portal. Từ đó, các thông tin được phân phối dưới dạng các dịch vụ cho từng người dùng khác nhau tuỳ thuộc vào nhóm quyền, vào nhu cầu cũng như mục đích của người dùng đó.Có thể nói, Portal như một cổng vào vạn năng cho người dùng tìm kiếm thông tin và tác nghiệp một cách thuận lợi và dễ dàng. Giải pháp uPortal được tổ chức JA-SIG phát triển trên nền công nghệ Java. Đây là portal thông dụng nhất (nổi tiếng nhất) trong các portal mã nguồn mở viết trên Java. Tuy vậy, các module nghiệp vụ không được JA-SIG phát triển do đó các hãng sử dụng giải pháp uPortal phải tự phát triển module nghiệp vụ hoặc tích hợp các module nghiệp vụ của hãng thứ 3

pdf31 trang | Chia sẻ: ngtr9097 | Lượt xem: 2348 | Lượt tải: 4download
Bạn đang xem trước 20 trang tài liệu Đề tài Tìm Hiểu uPortal và xây dựng một chương trình Demo, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN MẠNG VÀ TRUYỀN THÔNG  B ÀI TẬP LẬP TRÌNH MẠNG N ÂNG CAO Đề 18: Tìm Hiểu uPortal và xây dựng một chương trình Demo Sinh viên : Trần Huỳnh Tiến Lơṕ : 07T3 Nhóm : 10A Cán bộ hướng dẫn : Huỳnh Công Pháp Đà Nẵng 2011 Tìm Hiểu uPortal và xây dựng một chương trình Demo Mục lục CHƯƠNG 1. CƠ SỞ LÝ THUYẾT ...............................................................2 1.1. Giới thiệu uPortal ..................................................................................3 1.1.1. Tôn̉g quan ....................................................................................3 1.1.2. Các khái niệm cơ bản ...................................................................3 1.2. Các thẻ định dạng (Stylesheets) .............................................................6 1.3. Các kênh ứng dụng trong uPortal ..........................................................8 1.4. Cấu trúc các đối tượng bên trong uPortal ............................................13 1.5. Khả năng tích hợp của uPortal với các hạ tầng thông tin sẵn có ..........13 CHƯƠNG 2. CAÌ ĐẶT VA ̀XÂY DỰNG PORTLET TRONG UPORTAL .................................................................................................................................17 2.1. Cać bước thực hiện ..............................................................................17 2.1.1. Cài đặt uPortal ............................................................................17 2.1.2. Cài đặt Plugins xây dựng Portlet cho NetBeans ........................19 2.2. Xây dựng BodyCheckPortlet ...............................................................19 2.2.1. Tạo Project BodyCheckPortlet ...................................................19 2.2.2. Xây dựng BodyCheckPortlet ......................................................20 2.2.3. Build BodyCheckPortlet.war ......................................................24 2.3. Triên̉ khai BodyCheckPortlet lên uPortal .............................................25 2.3.1. Triên̉ khai BodyCheckPortlet ....................................................25 2.3.2. Xuất ban̉ BodyCheckPortlet ......................................................26 2.3.3. Sử dụng BodyCheckPortlet trong trang uPortal .........................29 Chương 1. CƠ SỞ LÝ THUYẾT Trần Huỳnh Tiến Lớp : 07T3 Nhóm 10A Trang 2 Tìm Hiểu uPortal và xây dựng một chương trình Demo 1.1. Giới thiệu uPortal 1.1.1. Tôn̉g quan Định nghĩa một cách tương đối, Portal là một phần mềm ứng dụng Web- based, định danh và xác thực người dùng đăng nhập, từ đó sẽ cung cấp giao diện mang tính cá nhân hóa cho người sử dụng. Thông qua giao diện này,người dùng dễ dàng truy cập, khai thác, tìm kiếm, giao tiếp với các ứng dụng, các thông tin, và với những người dùng khác. Đứng trên khía cạnh công nghệ, ngày nay portal được coi như một giải pháp(frame work) mà thông qua đó chúng ta có thể quy tụ, quản lý nhiều nguồn thông tin(bao gồm thông tin và ứng dụng phần mềm) khác nhau vào trong một thực thể phần mềm duy nhất-phần mềm portal. Từ đó, các thông tin được phân phối dưới dạng các dịch vụ cho từng người dùng khác nhau tuỳ thuộc vào nhóm quyền, vào nhu cầu cũng như mục đích của người dùng đó.Có thể nói, Portal như một cổng vào vạn năng cho người dùng tìm kiếm thông tin và tác nghiệp một cách thuận lợi và dễ dàng. Giải pháp uPortal được tổ chức JA-SIG phát triển trên nền công nghệ Java. Đây là portal thông dụng nhất (nổi tiếng nhất) trong các portal mã nguồn mở viết trên Java. Tuy vậy, các module nghiệp vụ không được JA-SIG phát triển do đó các hãng sử dụng giải pháp uPortal phải tự phát triển module nghiệp vụ hoặc tích hợp các module nghiệp vụ của hãng thứ 3 Hiện tại, uPortal chỉ áp dụng tiêu chuẩn Portlet API (JSR 168) cho phiên bản 3.0, điều đó có nghĩa là các ứng dụng đã viết cho uPortal hoặc đã tích hợp với uPortal sẽ phải xây dựng lại từ đầu khi nâng cấp lên phiên bản 3.0. Hiện tại ở Việt Nam một số phiên bản uPortal 2.x đã được một số đơn vị Việt hoá và đưa sử dụng ở một số nơi như: giải pháp VPortal của VietSoftware cho UBND TP Hà Nội giải pháp Asia Portal của Asia Soft cho UBND tỉnh Vĩnh Phúc. 1.1.2. Các khái niệm cơ bản Trần Huỳnh Tiến Lớp : 07T3 Nhóm 10A Trang 3 Tìm Hiểu uPortal và xây dựng một chương trình Demo Nền phần mềm uPortal là sản phẩm nguồn mở, được cung cấp miễn phí với đầy đủ mã nguồn, nhưng nhiều ứng dụng (channel) trên nền uPortal là các sản phẩm thương mại. Channel là các đơn nguyên chứa đựng thông tin và ứng dụng trong uPortal. Với các phần mềm cổng thông tin thương mại, ứng dụng channel còn có tên gọi khác là các portlet. Tư tưởng chủ đạo của uPortal là tạo ra một giao tiếp (interface) chung cho các thông tin và ứng dụng. Để thực hiện điều này, tất cả thông tin xuất ra các channel đều phải được cho dưới dạng XML. Người dùng, thông qua trình duyệt web của mình sẽ chọn lựa các kiểu trình bày thông tin khác nhau sử dụng các thẻ định dạng XSL (stylesheets) để có được các trang thông tin trình bày theo yêu cầu riêng. Điểm xuất phát cho tích hợp trình diễn thông tin luôn là một lớp trừu tượng của các channels: tài liệu mô tả trình bày trên giao diện người dùng (user layout document). Quá trình tích hợp các channel diễn ra tự động qua ba công đoạn để kết xuất tài liệu cuối cùng hiển thị trên trình duyệt người dùng bằng các ngôn ngữ định dạng văn bản HTML, XHTML, WML. Các thuật ngữ chính trong phát triển ứng dụng channel: Biến đổi cấu trúc (structure transformation) trừu tượng của người dùng (userLayout) thành ngôn ngữ cấu trúc trình bày trang để hiển thị cuối cùng, xác định bởi các thẻ định dạng trang (stylesheet). Khi đã có các thẻ này, uPortal sẽ tiến hành các vòng lặp sắp xếp - trình bày (rendering cycle) trên dữ liệu XML của mỗi channel, đưa vào cấu trúc chung của tài liệu. Biến đổi trang trí (theme transformation) từ kết quả của biến đổi cấu trúc thành ngôn ngữ định dạng trang, thông qua các thẻ trang trí (theme stylesheet). Thí dụ trang trí bảng lồng nhau ngầm định (nested-tables) sẽ biến thành tài liệu có các thẻ tab-column trong ngôn ngữ HTML hay WML. Chuyển các dữ liệu (serialization) đã được biến đổi cùng với nội dung của các channel cho các trình duyệt, cùng các thông tin về quy tắc của ngôn ngữ (language) và phương tiện (media) trình bày trang. uPortal hỗ trợ một số kiểu channel như sau 1. Custom Channel: dùng cho các ứng dụng web kết xuất thông tin XML, viết bằng Java. Trần Huỳnh Tiến Lớp : 07T3 Nhóm 10A Trang 4 Tìm Hiểu uPortal và xây dựng một chương trình Demo 2. RSS (Rich Sumary Sites) Channel: kết xuất các thông tin theo chuẩn trao đổi RSS. 3. XML/XSL Channel: kết xuất các thông tin thô được lưu trũ dạng XML 4. Inline Frame Channel: dùng trình bày các ứng dụng trong các khung có thanh kéo (giống như các frame trong các trang web) 5. Image Channel: hiển thị các ảnh độc lập, có nhãn (label) 6. Remote / WebProxy Channel: kết xuất các thông tin và ứng dụng website tại chỗ hay từ xa vào cổng thông tin. Các phiên bản tiếp sau của uPortal sẽ hỗ trợ trao đổi và truy cập thông tin dựa trên các dịch vụ Web theo các chuẩn SOAP, UDDI, WSDL, … Tuy thuộc vào nội dung của từng channel mà ta sẽ chọn để đưa các kiểu channel khác nhau vào cổng thông tin. Đối với những uPortal custom channel ứng dụng website thì ta cần phải tuân thủ theo một số quy tắc được đề ra trong tài liệu này để phát triển. Mỗi channel trong uPortal có thể trình diễn thông tin tĩnh hay tương tác với người sử dụng ở mức giao tiếp với ứng dụng theo mô hình J2EE (multi-tier web application). Như vậy các nhóm triển khai channel ở tầng bussiness logic của ứng dụng có thể tiến hành công việc song song với nhóm thực hiện trình bày giao tiếp của ứng dụng. Họ chỉ cần thống nhất với nhau về các dữ liệu input và output theo chuẩn XML. Môi trường phát triển các ứng dụng cho uPortal hoàn toàn dùng XML/XSL và công nghệ Java Servlet/Java Beans để làm việc, không sử dụng JSP. Khi có yêu cầu trình diễn một thông tin nào đó thì dữ liệu kết xuất XML sẽ được gởi đến cổng thông tin để trình diễn tại thời điểm các mã Java phát sinh. Các thông tin gởi đến trình duyệt sẽ được tự động biến đổi phù hợp vào độ phân giải của màn hình, chuẩn định dạng (HTML,XHTML,WML) của các trình duyệt khác nhau, trong đó các thiết bị truy cập Internet di động. Về thực chất, công nghệ uPortal cho phép tích hợp một website truyền thống (HTML) và một gateway (WAP/WML) mà không cần phải đầu tư phát triển riêng rẽ. Trần Huỳnh Tiến Lớp : 07T3 Nhóm 10A Trang 5 Tìm Hiểu uPortal và xây dựng một chương trình Demo 1.2. Các thẻ định dạng (Stylesheets) Cả hai kiểu biến đổi cấu trúc và biến đổi trình bày trong uPortal đều được thực hiện thông qua các thẻ định dạng XSLT stylesheets. Mỗi thẻ được đăng ký với hệ thống cần được mô tả trong tập tin câấ u hì nh SDF (stylesheet description file). Các chi tiết để đăng ký thẻ này với uPortal được mô tả trong tài liệu triển khai và cấu hình uPortal. Thẻ định dạng cấu trúc (Structure stylesheets) Thẻ này định nghĩa biết đổi XSLT của cấu trúc trình bày phân lớp của người dùng thành các thẻ cấu trúc tương đương cho trình bày trang. Các thẻ này phải tiếp nhận dữ liệu với cả hai phần tử gốc là và . Khuông dạng (DTD) của tài liệu kết xuất do tác giả của thẻ định dạng lựa chọn, tuy nhiên phải tuân theo các quy tắc sau : Phần tử trong tài liệu kết xuất phải chứa tất cả thuộc tính và các phần tử con đã có trong tài liệu gốc userLayout. Nói cách khác, XSLT có thể sinh ra các thuộc tính và phần tử con trong thẻ khi sao chép chúng từ userLayout, nhưng không thể bỏ đi hay viết lại các thuộc tính hay phần tử con của thẻ này trong tài liệu userLayout. Phần tử cần phải xuất hiện trong tài liệu kết xuất khi và chỉ khi nội dung của channel này sẽ được tích hợp vào trong trình diễn cuối cùng. Nói cách khác, một trong các mục đích của biến đổi cấu trúc là chọn lựa các tập con của các channel từ tài liệu userLayout mà nội dung của nó cần cho trình diễn cuối cùng. Để có trình diễn phong phú và linh hoạt từ tài liệu trừu tượng userLayout, các thẻ định dạng thường cần biết thêm các thông tin bổ xung. dạng thông tin đơn giản nhất được chuyển cho stylesheet cà các tham số (parameters) ở dạng name value. Các tham số khai báo trong các stylesheet sử dụng kiểu định dạng chuẩn . Tham số cần phải được mô tả trong tập tin SDF và tập tin này phải được đăng ký với uPortal. Thí dụ cấu trúc ngầm định tab-column của thẻ XSLT (tab-column.xsl) khai báo tham số : “activeTab” sẽ quả lý các tab mà người dùng hiện đang nhìm thấy. Trong một số trường hợp, các thông tin này cần được liên kết với các phần tử của userlayout do các biến tham số không đủ cho mục đích này. Các thẻ định dạng cấu trúc cần khai báo (trong tập tin mô tả) các thuộc tính liên kết với các phần tử hay của userLayout . có các thuộc tính của các Trần Huỳnh Tiến Lớp : 07T3 Nhóm 10A Trang 6 Tìm Hiểu uPortal và xây dựng một chương trình Demo folder được định nghĩa thông qua the định dạng cấu trúc. Thí dụ tabcolumn.sdf sẽ khai báo thuộc tính “width” tương ứng với phần tử của userLayout, và diễn giải giá trị của thuộc tính này như độ rộng của cột cho các phần tử folder nào được dịch thành các phần tử . Portal có thể giữ giá trị của cả hai tham số và thuộc tính, định nghĩa bởi stylecheet. Tham số sẽ truyền cho stylesheet khi bắt đầu quá trình dịch. Các giá trị thuộc tính folder và channel sẽ được trộn vào tài liệu userLayout ngay trước khi biết đổi, nói cách khác stylesheet có thể chờ đợi các thuộc tính được khai báo có mặt trong tài liệu gốc. Các giá trị của các tham số và thuộc tính định nghĩa trong stylesheet có thể được thay đổi thông qua cú pháp URL, hoặc bằng cách tương tác với lớp UserPreferences một cách trực tiếp. (xem chi tiết dưới đây) Nếu kết quả của biến đổi cấu trúc sẽ được lồng trong các phần tử mà nội dung của nó không được hiển thị trong trình diễn cuối cùng, điều này sẽ làm giảm thiểu hiệu năng hoạt động của Portal vì phải tốn thời gian dịch các kênh không cần thiết một cách vô ích. Gợi ý: chúng ta có thể thường chỉ chọn một số channel để dịch, nhưng cho thông tin về nhiều channel khác trong trình diễn chỉ với mục đích kiểm soát di chuyển quá trình dịch. Trong trường hợp này, hãy kiểm tra chỉ dịch phần tử mô tả các channel thêm thành gì đó khác với các phần tử . Các tham số sau luôn chuyển giao cho các thẻ định dạng cấu trúc: userLayoutRoot – một Id của userLayout node định nghĩa một cấu trúc cây sẽ cần được dịch. Mục đích của tham số này là cho phép khả năng “zoom” tới phần cụ thể của user layout. Thí dụ layout tab-column ngầm định cho phép xem một channel trong một chế độ toàn màn hình (“full-screen” mode), khi mà một channel được chọn chiếm toàn bộ trạng thái thực của màn hình trình duyệt, với chỉ còn header và footer của Portal được thấy. Nhiệm vụ của thiết kế stylesheet là xác định cách mà chế độ “zoom” này được trình diễn, và phần tử nào trong layout có thể được “zoom-in”. baseActionURL - là địa chỉ URL mà các tham số chuẩn của HTTP request có thể thêm vào. Tham số này cho phép các stylesheet kiến tạo nên các đích (target) để trả lại các tham số về portal. Tham số này cũng truyền cho các thẻ định dạng XSLT stylesheet, ở đây nó càng quan trọng hơn. Các biến đổi cấu trúc ít khi tích hợp các Trần Huỳnh Tiến Lớp : 07T3 Nhóm 10A Trang 7 Tìm Hiểu uPortal và xây dựng một chương trình Demo phần tử URL vì các tài liệu cần kết xuất của chúng cần phải độc lập với mọi ngôn ngữ trình bày trang cụ thể. Thẻ định dạng kiểu dáng trình bày (Theme stylesheet) Theme stylesheet dùng cho quá trình dịch kết quả của biến đổi cấu trúc thành ngôn ngữ trình bày trang. Các thẻ định dạng kiểu dáng này cần phải có khả năng hiểu được các kết xuất sinh ra từ qúa trình dịch cấu trúc. Vì các kết xuất thường thay đổi khá nhiều, các thẻ theme cần phải mô tả trong các tập tin định hình những biến đổi cấu trúc mà chúng có thể xử lý. Các hạn chế trong khuôn dạng kết xuất là giống như trường hợp thẻ định dạng cấu trúc (các thẻ chứa phần tử ). Trong số các thông tin khác nhau, tập tin mô tả định dạng cho các thẻ theme phải chứa đăc̣ tả về thông tin mime type của đích, tên của bộ truyền (serialize) được sử dụng để tạo ra luồng biểu diễn ký tự (character stream) và dạng của thiết bị có thể hiểu được ngôn ngữ trình bày văn bản. Các theme stylesheet có thể xác định các tham và thuộc tính riêng của channel. Nhưng chúng không thể xác định thuộc tính folder vì sự tồn tại của folder có thể khong được đảm bảo duy trì sau quá trình biến đổi cấu trúc. Các tham số chuẩn như baseActionURL và userLayoutRoot được chuyển cho các thẻ theme XSLT. Các thuộc tính channel định nghĩa trong stylesheet cũng sẽ được bổ xung ngay trước khi quá trình dịch xảy ra. 1.3. Các kênh ứng dụng trong uPortal Channel là các nguồn thông tin đơn vị của Portal. Nền Portal sẽ phối hợp các channel lại để tạo ra kết xuất các thông tin chứa trong channel. Tuy nhiên Portal không phải là khung chứa (container) của các channel như một số kiến trúc khác trong công nghệ Java (servlet, EJB). Chu trình sống của channel bao gồm những giai đọan sau: 1. Kiến tạo (Creation) tại thời điểm này các mã của lớp channel và các tài nguyên cần thiết khác được kiến tạo và tài liệu channel publishing document (CPD file) cũng được viết ra. Tài liệu CPD cho biết các thông tin mô tả và mục đích của channel, đặc tả các lớp Java của channel, mô tả tham số cấu hình và chu trình xuất bản cũng như đăng ký channel này. Tất cả tiến trình trên được thực hiện bởi tác giả Trần Huỳnh Tiến Lớp : 07T3 Nhóm 10A Trang 8 Tìm Hiểu uPortal và xây dựng một chương trình Demo của channel. Sau khi kết thúc quá trình, channel có thể chuyển giao để cài đặt trong Portal. 2. Đăng ký với Portal (Registration). Khi người quản trị Portal nhận được một channel mới, channel này cần phải được đăng ký với hệ thống. Trong quá trình đăng ký, Portal sẽ được cho biết sự hiện diện của channel và channel sẽ được gán cho kiểu channelTypeId. 3. Xuất bản (Publishing). Để các channel đã đăng ký có thể trở nên hưu ích cho người dùng, chúng phải được xuất bản trên Portal. Quá trình này bao gồm việc cấu hình và gán các giá trị cho tham số của channel, và sắp xếp chúng thành từng loại để dễ dàng sử dụng sau này. 4. Đăng ký sử dụng (Subscription). Người dùng của Portal có thể thực hiện quá trình đăng ký để đưa channel vào cấu trúc trình bày riêng của mình. Đăng ký channel sẽ kết thúc cấu hình channel bằng việc gán tất cả tham số cần thiết. các channel được sử dụng sẽ phân biệt bởi channelSubscribeID, là thông tin duy nhất riêng cho mổi user layout. Trong nội tại Portal, channel là các đối tượng Java được xây dựng từ giao tiếp IChannel. Channel cùng là các thực thể duy trì trạng thái (statefull entities) và trải qua phần lớn chu kỳ sống của chúng trong quá trình dịch. Chu trình dịch bắt đầu bằng lời gọi tới phương thức để cập nhật trạng thái của channel, setRuntinmeData() và tiến tới phương thức renderXML(). Các channel phải có khả năng trình diễn các trạng thái của chúng trong khuôn dạng XML (thực tế là một luồng SAX stream thay cho các chuỗi ký tự hay luồng ký tự). Giao tiếp IChannel Lớp org.jasig.portal.IChannel là giao diện nguyên thủy của các kênh trong uPortal. Các phương thức sau được ứng dụng trong Ichannel 1. Phương thức setStaticData() đuợc gọi một lần duy nhất ngay sau khi khởi tạo channel. 2. Mỗi một chu trình dịch (rendering cycle) sẽ chứa lời gọi đến phương thức setRuntimeData() ngay trước khi gọi phương thức renderXML(). Trần Huỳnh Tiến Lớp : 07T3 Nhóm 10A Trang 9 Tìm Hiểu uPortal và xây dựng một chương trình Demo 3. Phương thức receiveEvent() có thể được gọi trong chu trình dịch, nhưng phải ngay trước lời gọi renderXML(). 4. Phương thức getRuntimeProperties() có thể được gọi trong chu trình dịch, trước lời gọi phương thức renderXML(), nhưng sau lời gọi phương thức setRuntimeData(). Khi thực hiện quá trình dịch với phương thức renderXML(), các channels cần phải cung cấp các luồng dữ liệu dạng SAX theo khuôn dạng well-formed XML. Khi đó tài liệu XML sẽ được kết xuất. Tác giả của channels (publisher) có thể cung cấp một số tham số thay đổi để người dùng channel lựa chọn trong quá trình đăng ký vào channel. Một cách tương tự, giao diện org.jasig.portal.IMultithreadedChannel có thể được thi công bởi một channel cần phải trở thành một thành phần của tài liệu được xây dựng bởi ngôn ngữ định dạng trang hiện hữu. Dữ liệu ChannelRuntimeData chức các thông tin về các yêu cầu gửi tới. Mặc dù uPortal không ch phép các kênh bình thường truy cập đến các đổi tượng của HTTP requests trực tiếp, các tham số chứa trong HTTP sẽ được chuyển giao đến channel trong yêu cầu HTTP hiện hữu vào đối tượng ChannelRuntimeData, cùng với các thành phần thông tin khác. uPortal sử dụng context path của các yêu cầu URL gửi tới để xác định các kênh cần nhận dữ liệu. Các kênh cũng có thể kiến tạo phương thức tự đánh địa chỉ (self-addressing) URL đích bằng cách thêm vào danh sách các tham số gửi tới baseActionURL dành cho mỗi channel trong ChannelRuntimeData. Theo quy ước, uPortal dành các tên gọi tham số bắt đầu bằng “uP_”. Nó không quy định rõ các channel phải sinh ra các thông tin nội dung như thế nào. Nói chung các channel phải dựa trên quá trình dịch XML thành các khuông dạng khác nhau, dựa trên XSLT để có thể trao đổi thông tin kết xuất với nhiều khuôn dạng khác nhau. Giao tiếp IPrivileged Một số channels đòi hỏi phải truy cập các cấu trúc bên trong nền Portal, tương tác trực tiếp với các đối tượng HTTP sessions, request và response và độ ưu tiên khi xử lý. Các channel này phải thi công bằng giao tiếp IPrivileged, và thường được Trần
Luận văn liên quan