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

Giới thiệu Spring Roo, Phần 3: Phát triển các phần bổ sung Spring Roo pptx

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 (393 KB, 28 trang )

Giới thiệu Spring Roo, Phần 3: Phát triển các
phần bổ sung Spring Roo
Kiến trúc phần bổ sung của Spring Roo
Dưới dạng mẫu đơn giản nhất của mình, một phần bổ sung là một thành phần phần mềm bổ sung
một khả năng cụ thể cho một ứng dụng phần mềm. Ví dụ, trong hầu hết các trình duyệt web, các
phần bổ sung cung cấp sự hỗ trợ video. Một ví dụ khác là Eclipse (một IDE mã nguồn mở mà
nhiều nhà phát triển Java™ sử dụng hoặc ít nhất đều biết). Hầu hết các khả năng đều do các phần
bổ sung cung cấp, như hỗ trợ JUnit, hỗ trợ SVN, v.v Tôi đang sử dụng cụm từ phần bổ sung
làm một thuật ngữ chung dùng cho các trình cắm thêm và các phần mở rộng.
Spring Roo cũng có khái niệm về các phần bổ sung như sau:
1. Để cho phép các nhà phát triển bên thứ ba tạo ra các khả năng để mở rộng các khả năng
của Spring Roo.
2. Để giúp Spring Roo dễ dàng bổ sung các tính năng mới.
3. Để giúp Spring Roo vẫn còn một chút nổi trội (tức là, làm giảm kích cỡ của Spring Roo).
Các thành phần logic của Spring Roo
Spring Roo được chia thành hai phần logic.
Các thành phần cốt lõi của Spring Roo: Để cho phép phát triển phần bổ sung, Spring Roo
cung cấp một tập các thành phần cốt lõi để tạo thành một môi trường thực hiện được lưu trữ trên
máy chủ cho các phần bổ sung khác nhau. Các thành phần này là Classpath (Đường dẫn lớp), hỗ
trợ Process Manager (Trình quản lý quy trình) và Shell (Trình vỏ). Trong đó, Process Manager
hỗ trợ Project (Dự án) và File Undo (Hoàn lại tệp). Project hỗ trợ Model (Mô hình), Metadata
(Siêu dữ liệu) và File Monitor (Giám sát tệp). Cuối cùng, có một thành phần Support (Hỗ trợ),
được tất cả sử dụng. Hình 1 đưa ra một biểu diễn trực quan về các mối quan hệ này.

Hình 1. Các thành phần cốt lõi Spring Roo

Chúng ta hãy bàn về một số các mô đun cốt lõi:
1. Support (Hỗ trợ) — Mô đun org.springframework.roo.support cung cấp các lớp
tiện ích phổ biến được tất cả các mô đun cốt lõi và các phần bổ sung sử dụng. Một số lớp
tiện ích gồm có Assert, FileCopyUtils, XmlUtils, StringUtils, FileUtils, v.v Ví
dụ, nếu bạn muốn sao chép nội dung của một tệp vào tệp khác, bạn có thể sử dụng tiện


ích FileCopyUtils để làm việc đó cho bạn.
2. Metadata (Siêu dữ liệu) — Mô đun org.springframework.roo.metadata cung cấp một
giao diện nhà cung cấp dịch vụ siêu dữ liệu và việc thực hiện gồm có đăng ký phụ thuộc
và lưu trữ trong bộ nhớ đệm.
3. File monitor (Giám sát tệp) — Mô đun org.springframework.roo.file.monitor xuất bản
các sự kiện sau khi phát hiện ra các thay đổi hệ thống tệp (cách thực hiện mặc định sử
dụng thăm dò đĩa có mở rộng tự động).
4. File undo (Hoàn lại tệp) — Mô đun org.springframework.roo.file.undo cung cấp một
phương tiện hoàn lại tệp để sử dụng theo trình quản lý quy trình.
5. Project (Dự án) — Mô đun org.springframework.roo.project trừu tượng hóa các hệ thống
xây dựng dự án phía người dùng cuối điển hình như Apache Maven và Apache Ant.
6. Process manager (Trình quản lý quy trình) — Mô đun
org.springframework.roo.process.manager cung cấp một sự trừu tượng hóa hệ thống tệp
như-ACID gồm có khôi phục đĩa và đồng bộ hóa quá trình.
7. Classpath (Đường dẫn lớp) — Mô đun org.springframework.roo.classpath thực hiện
phân tích cú pháp cây cú pháp trừu tượng và kết buộc kiểu của các đơn vị biên dịch Java
và AspectJ.
Các thành phần cốt lõi của Spring Roo: Spring Roo cung cấp tất cả chức năng thông qua các
phần bổ sung. Các phần bổ sung cơ bản kèm theo Roo V1.1.3 là:
 Add-On Creator (Bộ tạo phần bổ sung) — Phần bổ sung
org.springframework.roo.addon.creator cho phép dễ dàng tạo các phần bổ sung Roo của
bên thứ ba.
 Backup (Sao lưu) — Phần bổ sung org.springframework.roo.addon.backup cho phép
thực hiện các bản sao lưu trong một tệp ZIP bằng cách gõ backup.
 Cloud Foundry (Xưởng tạo mẫu đám mây) — Phần bổ sung
org.springframework.roo.addon.cloud.foundry cung cấp sự hỗ trợ cho VMware Cloud
Foundry (Xưởng tạo mẫu đám mây của VMware).
 Configurable (Có thể cấu hình) — Phần bổ sung
org.springframework.roo.addon.configurable cung cấp sự hỗ trợ để đưa vào chú thích
@Configurable của Spring thông qua một ITD (Intertype Declaration - Khai báo giữa các

kiểu) của AspectJ.
 Database reverse engineering (Kỹ thuật đảo ngược cơ sở dữ liệu) — Phần bổ sung
org.springframework.roo.addon.dbre cung cấp sự hỗ trợ cho kỹ thuật đảo ngược gia tăng
của cơ sở dữ liệu hiện có.
 Data on Demand (Dữ liệu theo yêu cầu) — Phần bổ sung
org.springframework.roo.addon.dod cung cấp sự hỗ trợ để tạo tự động dữ liệu ví dụ mẫu
thường dùng cho các bài kiểm tra tích hợp.
 Email (Thư điện tử) — Phần bổ sung org.springframework.roo.addon.email cung cấp sự
hỗ trợ để tích hợp và cấu hình hỗ trợ thư điện tử của Spring trong dự án đích.
 Entity (Thực thể) — Phần bổ sung org.springframework.roo.addon.entity cung cấp sự hỗ
trợ rộng rãi để bảo trì tự động các lớp @Entity của Java Persistence API (API Tồn tại lâu
bền của Java).
 Dynamic Finder (Bộ dò tìm động) — Phần bổ sung
org.springframework.roo.addon.finder tạo ra các bộ dò tìm ngôn ngữ truy vấn JPA tương
thích hoàn toàn với mã an toàn-kiểu.
 Git — Phần bổ sung org.springframework.roo.addon.git cung cấp sự hỗ trợ để tích hợp
GIT trong dự án. Mỗi lệnh được thực hiện thành công sẽ được cam kết tự động với một
kho lưu trữ GIT cục bộ.
 GWT (Bộ công cụ Web của Google) — Phần bổ sung
org.springframework.roo.addon.gwt cung cấp sự hỗ trợ để dựng giao diện người dùng
(UI) bằng cách sử dụng GWT (Google Web Toolkit).
 JavaBean — Phần bổ sung org.springframework.roo.addon.javabean tự động duy trì các
getter/các setter của JavaBean cho các lớp với một chú thích @RooJavaBean.
 JDBC (Kết nối cơ sở dữ liệu Java) — Phần bổ sung org.springframework.roo.addon.jdbc
gói gọn việc truy cập tuân thủ-OSGi với các trình điều khiển JDBC (Java DataBase
Connectivity) được phân phối trong các bó khác nhau (chủ yếu được các phần bổ sung
khác sử dụng).
 JMS (Hệ thống thông báo Java) — Phần bổ sung org.springframework.roo.addon.jms
cung cấp sự hỗ trợ để cấu hình các thiết lập JMS (Java Messaging System) trong dự án
đích.

 JPA (API tồn tại lâu bền của Java) — Phần bổ sung org.springframework.roo.addon.jpa
cài đặt một trình cung cấp JPA cụ thể và thiết lập JDBC cho phù hợp.
 JSON (Ký pháp đối tượng JavaScript) — Phần bổ sung
org.springframework.roo.addon.json bổ sung các phương thức tuần tự hóa và không tuần
tự hóa có liên quan đến JSON cho các POJO (Plain old Java object – Đối tượng Java bình
thường).
 Logging (Ghi nhật ký) — Phần bổ sung org.springframework.roo.addon.logging thiết lập
Log4j, gồm có cấu hình mức-ghi nhật ký dựa vào-lệnh.
 Pluralization (Số nhiều) — Phần bổ sung org.springframework.roo.addon.plural cung
cấp số nhiều của các danh từ (chủ yếu được các phần bổ sung khác sử dụng).
 Property Editor (Trình soạn thảo đặc tính) — Phần bổ sung
org.springframework.roo.addon.property.editor quản lý các trình soạn thảo đặc tính, khi
Spring MVC (Model-View-Controller – Bộ điều khiển Khung nhìn-Mô hình) yêu cầu.
 Property File (Tệp đặc tính) — Phần bổ sung org.springframework.roo.addon.propfiles
cung cấp sự hỗ trợ để quản lý các tệp đặc tính trong dự án đích.
 RooBot Client (Máy khách RooBot) — Phần bổ sung
org.springframework.roo.addon.roobot.client cung cấp sự hỗ trợ để quản lý phần bổ sung
thông qua máy chủ RooBot.
 Security (Bảo mật) — Phần bổ sung org.springframework.roo.addon.security thiết lập
Spring Security, gồm các trang đăng nhập, các bộ lọc và các phụ thuộc.
 Serializable (Có thể tuần tự hóa) — Phần bổ sung
org.springframework.roo.addon.serializable bổ sung sự hỗ trợ java.io.Serializable (chẳng
hạn như bảo trì UID – Mã định danh người dùng) cho các kiểu Java cần thiết.
 Solr cung cấp sự hỗ trợ để cấu hình và tích hợp các tính năng của Apache Solr trong dự
án đích — Phần bổ sung org.springframework.roo.addon.solr cung cấp sự hỗ trợ để cấu
hình và tích hợp các tính năng của Apache Solr trong dự án đích.
 Integration Test (Kiểm tra tích hợp) — Phần bổ sung
org.springframework.roo.addon.test tạo ra các bài kiểm tra tích hợp JUnit cho các thực
thể của dự án.
 ToString — Phần bổ sung org.springframework.roo.addon.tostring tạo ra một phương

thức toString() hợp lệ cho bất kỳ lớp nào có chú thích @RooToString.
 WebFlow — Phần bổ sung org.springframework.roo.addon.web.flow cung cấp sự hỗ trợ
để cấu hình và tích hợp các tính năng Spring Web Flow (Luồng Web Spring) trong dự án
đích.
 Web MVC Controller (Bộ điều khiển MVC Web) — Phần bổ sung
org.springframework.roo.addon.web.mvc.controller cung cấp sự hỗ trợ cho cấu hình và
tích hợp các bộ điều khiển MVC của Spring trong dự án đích.
 Web MVC Embedded (Web MVC được nhúng) — Phần bổ sung
org.springframework.roo.addon.web.mvc.embedded cung cấp phần mở rộng cho phần bổ
sung MVC, cho phép bổ sung các tính năng nhúng như các bản đồ, các đoạn video, v.v
vào các trang web.
 Web MVC JSP — Phần bổ sung org.springframework.roo.addon.web.mvc.jsp cấu hình
và tích hợp các tính năng JSP MVC của Spring trong dự án đích.
 Selenium (Selen) — Phần bổ sung org.springframework.roo.addon.web.selenium cung
cấp cấu hình và tích hợp các bài kiểm tra web Selen trong dự án đích.
Bây giờ chúng ta đã xem xét các thành phần cốt lõi của Spring Roo và các phần bổ sung cơ bản
do Spring Roo cung cấp, hãy viết các phần bổ sung riêng của chúng ta.
Về đầu trang
Môi trường thời gian chạy OSGi
Spring Roo được dựa trên OSGi, là lý tưởng cho kiến trúc phần bổ sung của Roo. OSGi cung cấp
một cơ sở hạ tầng rất tốt để phát triển các ứng dụng hướng dịch vụ nhúng và mô đun.
Trình vỏ Roo sử dụng Apache Felix làm khung công tác thời gian chạy OSGi của mình cùng với
SCR (Service Component Runtime - Thời gian chạy của thành phần dịch vụ) để quản lý thành
phần và OBR (Repository Bundle OSGi – OSGi gói kho lưu trữ) cho độ phân giải gói. Có sẵn
các lệnh OSGi khác nhau trong trình vỏ Roo, mà bạn có thể xem chúng bằng cách gõ lệnh help
osgi (Trợ giúp osgi), như trong Liệt kê 1.

Liệt kê 1. Lệnh help của Roo với OSGi

roo> help osgi

* osgi find - Finds bundles by name
* osgi framework command - Passes a command directly
through to the Felix shell infrastructure
* osgi headers - Display headers for a specific bundle
* osgi install - Installs a bundle JAR from a given URL
* osgi log - Displays the OSGi log information
* osgi obr deploy - Deploys a specific OSGi Bundle Repository (OBR) bundle
* osgi obr info - Displays information on a specific OSGi Bundle Repository
(OBR) bundle
* osgi obr list - Lists all available bundles from the
OSGi Bundle Repository (OBR) system
* osgi obr start - Starts a specific OSGi Bundle Repository (OBR) bundle
* osgi obr url add - Adds a new OSGi Bundle Repository (OBR) repository file
URL
* osgi obr url list - Lists the currently-configured
OSGi Bundle Repository (OBR) repository file URLs
* osgi obr url refresh - Refreshes an existing
OSGi Bundle Repository (OBR) repository file URL
* osgi obr url remove - Removes an existing
OSGi Bundle Repository (OBR) repository file URL
* osgi ps - Displays OSGi bundle information
* osgi resolve - Resolves a specific bundle ID
* osgi scr config - Lists the current SCR configuration
* osgi scr disable - Disables a specific SCR-defined component
* osgi scr enable - Enables a specific SCR-defined component
* osgi scr info - Lists information about a specific SCR-defined component
* osgi scr list - Lists all SCR-defined components
* osgi start - Starts a bundle JAR from a given URL
* osgi uninstall - Uninstalls a specific bundle
* osgi update - Updates a specific bundle

* osgi version - Displays OSGi framework version

Về đầu trang
Lệnh tạo phần bổ sung của Spring Roo
Spring Roo được gói chung cùng với các lệnh tạo phần bổ sung để tạo ra các kiểu của các phần
bổ sung khác nhau. Add-on Creator, trưng ra nhiều lệnh addon create (tạo phần bổ sung), cũng
là một phần bổ sung Roo. Roo hiện hỗ trợ bốn kiểu phần bổ sung:
1. Phần bổ sung quốc tế — Phần bổ sung này hỗ trợ các bản dịch ngôn ngữ bổ sung cho
các ứng dụng Spring MVC được dựng lên của Roo (ví dụ, bản dịch bổ sung cho ngôn
ngữ Hin-đi).
2. Phần bổ sung đơn giản — Phần bổ sung đơn giản hỗ trợ các bổ sung nhỏ cho các dự án
phụ thuộc hoặc cấu hình dự án hoặc cả hai (ví dụ, thực hiện một số sửa đổi pom.xml của
maven giống như việc bổ sung một số tệp lưu trữ Java (JAR) hoặc các trình cắm thêm
Maven).
3. Phần bổ sung nâng cao — Phần bổ sung này làm công việc nặng nhọc và được sử dụng
để xây dựng một phần bổ sung Spring Roo có đủ tính năng, có yêu cầu tạo mã Java (ví
dụ, xây dựng một phần bổ sung có thể viết các phương thức equals (bằng nhau) và
hashcode (mã băm) cho đối tượng miền của bạn). Đã có một phần bổ sung cộng đồng
cho các chức năng này.
4. Phần bổ sung trình bao bọc — Phần bổ sung này bao bọc một tạo phẩm Maven để tạo
ra một gói tuân thủ-OSGi. Phần bổ sung này cần thiết khi một phần bổ sung yêu cầu một
phụ thuộc để hoàn thành chức năng của nó. Ví dụ, phần bổ sung kỹ thuật đảo ngược cơ
sở dữ liệu của Spring Roo yêu cầu trình điều khiển JDBC Postgres để hoàn thành nhiệm
vụ của mình, vì vậy bạn sẽ bọc trình điều khiển JDBC Postgres nhờ sử dụng phần bổ
sung này.
Các phần bổ sung này tạo ra các lệnh để giảm nhẹ việc phát triển phần bổ sung Roo bằng cách
tạo các phần bổ sung mới như sau:
httppgp://
Phiên bản 1.1 của Spring Roo đã giới thiệu Pretty Good Privacy (PGP - Tính riêng tư rất tốt),
cho phép những người dùng xác định đã tin vào các nhà phát triển nào để ký phần mềm sẽ được

tải về và kích hoạt trong trình vỏ Roo. Trong thực tế, hiện nay mọi bản phát hành của Roo tự
được ký theo PGP. Một trình xử lý giao thức mới có tên là httppgp:// đã được giới thiệu trong
Roo để cho biết rằng một URL cũng có sẵn chữ ký được gỡ bỏ lớp bảo vệ PGP. Điều này cung
cấp một biểu mẫu bảo mật mở để giúp bảo vệ những người dùng khỏi các bản tải mã độc. Những
tiêu chuẩn này cũng cho phép sử dụng các công cụ PHP độc lập để kiểm tra độc lập các hoạt
động của Roo.
 Đã tích hợp với việc kiểm soát mã nguồn SVN (Subversion - Phiên bản con) của Google
Code (Mã Google).
 Đã lưu trong một kho lưu trữ Maven công khai được tạo ra như là một phần của dự án mã
Google.
 Tương thích với RooBot, một dịch vụ lưu trữ trên VMware để tạo chỉ mục nội dung quan
trọng trong các tệp OBR công khai của Roo. Các tệp OBR là một biểu diễn siêu dữ liệu
gói dựa trên XML. Để phù hợp với RooBot, các phần bổ sung sẽ là:
1. Tuân thủ-OSGi.
2. Các tạo phẩm do PGP ký với các khóa công khai.
3. Đã đăng ký thông qua giao thức httppgp://.
Khi sử dụng lệnh tạo phần bổ sung addon create của Roo, bạn sẽ nhận được tất cả các tính
năng đã đề cập ở trên, được cấu hình tự động cho các phần bổ sung của bạn. Điều này chắc chắn
làm giảm thời gian tạo và xuất bản các phần bổ sung ra thế giới bên ngoài.
Trước khi chúng ta bắt đầu viết các phần bổ sung, hãy chắc chắn rằng bạn có một môi trường
chức năng của Spring Roo. Có thể tìm thấy các hướng dẫn để cài đặt Spring Roo trong Phần 1
của loạt bài này.
Về đầu trang
Tôi muốn hỗ trợ ngôn ngữ Hin-đi (tạo phần bổ sung i18n)
Khi bạn tạo một ứng dụng web dựa trên MVC của Spring bằng cách sử dụng Spring Roo, bạn có
thể thêm sự hỗ trợ cho các ngôn ngữ khác nhau bằng lệnh web mvc language (ngôn ngữ mvc
web). Spring Roo hỗ trợ tiếng Anh, tiếng Đức, tiếng Tây Ban Nha, Ý, Hà Lan và Thụy Điển, có
thể dùng ngay được. Hỗ trợ quốc tế được cung cấp bởi phần bổ sung Web MVC JSP (Web MVC
JavaServer Pages - Các trang JavaServer của MVC web), được kích hoạt chỉ sau khi bạn có các
tệp JSPX trong thư mục webapp của mình. Các tệp JSPX do một lệnh của trình điều khiển tạo ra

và lệnh này có thể chuyển đổi một ứng dụng dựa vào JAR đơn giản thành một ứng dụng web
MVC của Spring.
Là một người Ấn Độ, tôi muốn bổ sung sự hỗ trợ tiếng Hin-đi trong ứng dụng web của mình.
Spring Roo cung cấp một lệnh addon create i18n, trong đó cung cấp một phần mở rộng cho
lệnh web mvc install language (ngôn ngữ cài đặt mvc web) để bổ sung sự hỗ trợ cho một
ngôn ngữ mới như Hin-đi. Điều duy nhất mà nó đòi hỏi là bản dịch của tệp messages.properties
theo ngôn ngữ dự kiến.
Khi Spring Roo tạo ra một ứng dụng web MVC của Spring, nó tạo ra hai tệp đặc tính:
application.properties và messages.properties. Tệp application.properties chứa các thuộc tính đặc
trưng-ứng dụng, như tên của ứng dụng. Tệp messages.properties chứa các đặc tính, không đặc
trưng cho bất kỳ ứng dụng nào, như thông báo "Bạn có chắc chắn muốn xóa mục này không?"
khi bạn nhấn vào nút xóa hoặc các thông báo như đăng nhập, đăng xuất, v.v Vì thế, khi bạn viết
một phần bổ sung i18n, bạn phải cung cấp bản dịch cho tệp messages.properties.
Bây giờ chúng ta đã bàn về sự hỗ trợ quốc tế mặc định trong Spring Roo, chúng ta hãy viết một
phần bổ sung i18n để có thể bổ sung sự hỗ trợ ngôn ngữ Hin-đi. Tôi sẽ hướng dẫn cách bạn có
thể thiết lập một dự án dựa theo mã của Google, viết một phần bổ sung bằng cách sử dụng lệnh,
xuất bản và phát hành nó ra thế giới bên ngoài, cuối cùng đăng ký với dịch vụ RooBot. Việc
đăng ký với dịch vụ RooBot rất quan trọng vì điều này sẽ cho phép RooBot tạo chỉ mục phần bổ
sung của bạn và hiển thị nó khi các nhà phát triển khác tìm kiếm bằng cách sử dụng lệnh addon
search (tìm kiếm phần bổ sung).
Thiết lập dự án
Tài liệu hướng dẫn Spring Roo giải thích rõ việc thiết lập dự án của bạn và kho lưu trữ Maven
dựa trên mã Google, vì thế tôi sẽ không nhắc lại nó nữa. Tôi chỉ lưu ý rằng tôi sẽ sử dụng tên dự
án là "roo-hind-addon."
Tạo một phần bổ sung i18n
Một khi bạn đã thiết lập dự án, bạn sẽ có một thư mục rỗng có tên là roo-hindi-addon (phần bổ
sung-tiếng hin đi-Roo). Đi vào thư mục đó và gõ lệnh roo. Khi ở trong trình vỏ, gõ lệnh addon
create i18n. Nếu ấn phím tab, bạn sẽ thấy rằng lệnh này có bảy thuộc tính. Trong số bảy thuộc
tính này, ba thuộc tính là bắt buộc: topLevelPackage (gói mức cao nhất của phần bổ sung mới),
locale (các chữ viết tắt tên địa phương như "it" cho nước Ý và messageBundle (đường dẫn đủ

điều kiện đến tệp message_xx.properties, ở đây xx là tên địa phương). Bốn thuộc tính khác là tùy
chọn: language (tên đầy đủ của ngôn ngữ), flagGraphic (đường dẫn đầy đủ đến tệp xx.png, ở
đây xx là tên lá cờ), description (mô tả của phần bổ sung) và projectName (tên của dự án (nếu
không được cung cấp, hãy sử dụng tên gói mức cao nhất)). Tôi sẽ đề nghị bạn sử dụng thuộc tính
projectName và bảo đảm giá trị của nó là tên của dự án được lưu trữ dựa theo mã Google. Vì
vậy, trong trường hợp của chúng ta, projectName sẽ là roo-hindi-addon.
Trong số các thuộc tính đã đề cập ở trên, quan trọng nhất là messageBundle, chỉ rõ tệp
messages.properties đã dịch. Để dịch tệp messages.properties sang ngôn ngữ Hin-đi, tùy chọn dễ
nhất là sử dụng một dịch vụ như Google translate, (Phiên dịch của Google), chuyển đổi mỗi đặc
tính theo từng cái một, sau đó viết chúng vào tệp messages_hi.properties. Tuy nhiên, dịch vụ này
không làm việc trong trường hợp của chúng ta vì các tệp đặc tính Java sử dụng tiêu chuẩn mã
hóa ISO-8859-1, không hỗ trợ các ký tự Hin-đi. Để khắc phục vấn đề này, tôi sử dụng một trình
cắm thêm Eclipse tên là Eclipse ResourceBundle Editor (trình soạn thảo gói tài nguyên Eclipse),
cho phép bạn chuyển đổi và tạo ra các gói tài nguyên cho các ngôn ngữ khác nhau. Bạn có thể
cài đặt nó bằng cách sử dụng trang web cập nhật
Việc chuyển đổi tệp messages.properties sang
tệp messages_hi.properties không nằm trong phạm vi của bài này. Trình cắm thêm Editor
ResourceBundle dễ sử dụng. Xin lưu ý là nếu các ký tự ngôn ngữ được hỗ trợ, thì không cần sử
dụng trình soạn thảo ResourceBundle nữa. Tệp messages_hi.properties sẽ trông giống như Liệt
kê 2.

Liệt kê 2. Tệp messages_hi.properties ví dụ mẫu

button_cancel = \u0930\u0926\u094D\u0926
button_end = \u0905\u0902\u0924
button_find = \u0916\u094B\u091C\u0947\u0902
button_home = \u0918\u0930


Xem toàn bộ tệp. Một khi bạn có tệp messages_hi.properties đã dịch, bạn đã sẵn sàng để tạo

phần bổ sung này bằng cách chỉ cần gõ một lệnh duy nhất. Bạn có thể tạo phần bổ sung tiếng
Hin-đi bằng cách gõ lệnh từ Liệt kê 3 vào trình vỏ Roo.

Liệt kê 3. Lệnh để tạo phần bổ sung tiếng Hin-đi

addon create i18n locale hi topLevelPackage
org.xebia.roo.addon.i18n.hindi
messageBundle <location to messages_hi.properties> \
language hindi projectName roo-hindi-addon
flagGraphic <full path to flag hi.png>

Liệt kê 4 cho thấy các tạo phẩm do lệnh addon create i18n tạo ra.

Liệt kê 4. Các tạo phẩm được tạo ra

Created ROOT/pom.xml
Created ROOT/readme.txt
Created ROOT/legal
Created ROOT/legal/LICENSE.TXT
Created SRC_MAIN_JAVA
Created SRC_MAIN_RESOURCES
Created SRC_TEST_JAVA
Created SRC_TEST_RESOURCES
Created SRC_MAIN_WEBAPP
Created SRC_MAIN_RESOURCES/META-INF/spring
Created ROOT/src/main/assembly
Created ROOT/src/main/assembly/assembly.xml
Created SRC_MAIN_RESOURCES/org/xebia/roo/addon/i18n/hindi
Created
SRC_MAIN_RESOURCES/org/xebia/roo/addon/i18n/hindi/messages_hi.properties

Created SRC_MAIN_RESOURCES/org/xebia/roo/addon/i18n/hindi/hi.png
Created SRC_MAIN_JAVA/org/xebia/roo/addon/i18n/hindi
Created SRC_MAIN_JAVA/org/xebia/roo/addon/i18n/hindi/HindiLanguage.java

Lệnh này đã tạo ra một dự án Maven có thể được nhập khẩu vào Eclipse (với m2eclipse) hoặc
Bộ công cụ SpringSource thông qua File > Import > Maven > Existing Maven projects. Bạn
không cần nhập khẩu dự án này bởi vì chúng ta không cần sửa đổi phần bổ sung này.
Bây giờ chúng ta có thể cài đặt phần bổ sung này, sử dụng nó trong các dự án của chúng ta và
xuất bản nó ra thế giới bên ngoài. Nhưng trước tiên, chúng ta hãy bàn về một số các tạo phẩm để
hiểu rõ hơn về mã được tạo ra:
 pom.xml — Tạo phẩm này là một cấu hình dự án Maven tiêu chuẩn. Pom.xml được tạo
có rất nhiều trình cắm thêm được cấu hình sẵn, thực hiện công việc liên quan để ký các
tạo phẩm bằng PGP, phát hành phần bổ sung này bằng trình cắm thêm phát hành Maven
và tạo các gói OSGi bằng trình cắm thêm gói Maven. Nó cũng bổ sung các phụ thuộc
OSGi và Felix vào dự án, mà các phụ thuộc này cần cho phần bổ sung để chạy bên trong
trình vỏ Roo.
 assembly.xml — Tạo phẩm này định nghĩa các cấu hình được trình cắm thêm lắp ráp
Maven sử dụng để đóng gói phần bổ sung.
 messages_hi.properties — Tạo phẩm này là tệp bó thông báo mà chúng ta đã cung cấp
trong lúc tạo phần bổ sung, được sao chép vào thư mục tài nguyên.
 hi.png — Tạo phẩm này là tệp PNG lá cờ mà chúng ta đã cung cấp trong khi tạo phần bổ
sung, được sao chép vào thư mục tài nguyên.
 HindiLanguage.java — Tạo phẩm này là tệp Java duy nhất do phần bổ sung này tạo ra,
được sử dụng để thu nhận thông tin tương ứng với ngôn ngữ cụ thể. Ví dụ, nó cung cấp
tên địa phương, tệp tài nguyên gói thông báo, v.v
Thêm sự hỗ trợ tiếng Hin-đi vào ứng dụng của chúng ta
Bây giờ tôi sẽ cho bạn thấy cách bạn có thể thêm sự hỗ trợ tiếng Hin-đi vào ứng dụng của mình
bằng cách sử dụng phần bổ sung mà chúng ta vừa mới tạo ra:
1. Thoát khỏi trình vỏ Roo và chạy lệnh mvn clean install. Trong quá trình xây dựng,
lệnh này sẽ yêu cầu cụm từ mật khẩu GPG của bạn.

2. Sau khi đã xây dựng phần bổ sung Roo, hãy mở dòng lệnh mới và tạo một thư mục có tên
là i18n-hindi-client (máy khách-tiếng Hin-đi-i18n). Chúng ta sẽ tạo ra một máy khách
đơn giản cho phần bổ sung của mình.
3. Vào thư mục i18n-hindi-client và gõ lệnh roo.
4. Thực hiện các lệnh sau trong trình vỏ Roo. Việc này sẽ tạo ra một ứng dụng web MVC
đơn giản của Spring.

Liệt kê 5. Các lệnh Roo để tạo ra ứng dụng web MVC

project
topLevelPackage com.shekhar.roo.i18n.client \
projectName i18n-hindi-client persistence setup
provider HIBERNATE
database HYPERSONIC_IN_MEMORY entity
class ~.domain.MyUser field string
fieldName name
notNull controller all
package ~.web
5.
6. Gõ lệnh này và nhấn phím tab: web mvc language code de en es it nl sv
Bạn sẽ không thấy sự hỗ trợ ngôn ngữ Hin-đi ở đâu cả. Điều này là do chúng ta vẫn chưa
cài đặt phần bổ sung tiếng Hin-đi.
7. Để cài đặt phần bổ sung này, hãy gõ:
osgi start url file:///<location to addon target
folder>/org.xebia.roo.addon.i18n.hindi-0.1.0.BUILD-SNAPSHOT.jar
8.
9. Lệnh này sẽ cài đặt và kích hoạt phần bổ sung tiếng Hin-đi Spring Roo của chúng ta. Bạn
có thể xem trạng thái của phần bổ sung này bằng cách sử dụng lệnh osgi ps, hiển thị
thông tin gói OSGi và tình trạng của nó như sau:
[ 95] [Active ] [ 1] roo-hindi-addon (0.1.0.BUILD-SNAPSHOT)

10.
11. Một lần nữa, gõ lệnh web mvc language –code và nhấn phím tab. Lúc này, bạn sẽ thấy
một mã cho ngôn ngữ Hin-đi. Chọn mã và sự hỗ trợ ngôn ngữ Hin-đi sẽ được thêm vào
ứng dụng của bạn.
web mvc language –code hi
12.
13. Thoát khỏi trình vỏ Roo và gõ lệnh mvn tomcat:run. Bạn sẽ thấy lá cờ Ấn Độ ở cuối
trang. Nhấn chuột vào lá cờ đó và ứng dụng của bạn sẽ được hiển thị bằng tiếng Hin-đi,
như trong Hình 2.

Hình 2. Sự hỗ trợ ngôn ngữ Hin-đi

Một khi bạn đã kiểm tra xem phần bổ sung này có đang hoạt động tốt không trong hệ thống phát
triển của mình, bạn có thể đẩy phần bổ sung vào dự án mã Google mà chúng ta đã tạo ra.
Triển khai trong ứng dụng
Bây giờ chúng ta đã thấy rằng phần bổ sung mà chúng ta đã tạo ra đang hoạt động, chúng ta hãy
xem xét cách tạo sẵn ngôn ngữ Hin-đi cho ứng dụng này:
1. roo-hindi-addon đã được khởi động khi sử dụng lệnh osgi start.
2. Khi phần bổ sung này khởi động, lớp HindiLanguage đã được lệnh addon create
i18n tạo ra, được đăng ký với i18nComponent (Thành phần i18n), là một người nghe
dịch vụ OSGi để đăng ký và không đăng ký các phần bổ sung i18n. Lớp HindiLanguage
được đánh dấu với các chú thích @Component và @Service do Apache Felix cung cấp.
Các chú thích này bảo đảm rằng các thành phần và các dịch vụ được đăng ký bằng trình
vỏ Roo và sẵn sàng sử dụng.
3. Khi chúng ta gõ lệnh web mvc install language –code và nhấn phím tab, dịch vụ
hoàn thành bằng phím tab gọi phương thức getSupportedLanguages() của lớp
i18nComponent, phương thức này trả về java.util.Set của các phần bổ sung i18n. Do
lớp HindiLanguage đã được đăng ký với i18nComponent, nên nó cũng được trả về.
Xuất bản các phần bổ sung ra thế giới bên ngoài
Thật dễ xuất bản các phần bổ sung ra thế giới bên ngoài do lệnh create của Roo đã thực hiện

hầu hết mọi thứ cho chúng ta bằng cách cài đặt tất cả các trình cắm thêm Maven cần thiết.
Chuyển đến thư mục gốc của dự án và gõ các lệnh trong Liệt kê 6.

Liệt kê 6. Xuất bản dự án Roo

svn add pom.xml src/ legal/ readme.txt
svn commit -m "Roo Hindi Addon first version"
mvn release:prepare release:perform

Trình cắm thêm phát hành Maven sẽ hỏi phiên bản phát hành, tên thẻ và phiên bản phát triển.
Bạn chỉ có thể chọn mặc định và tiến lên. Sẽ mất vài phút để phát hành và xuất bản các tạo phẩm
vào dự án mã Google. Sau đó, bạn có thể xem các tạo phẩm của phần bổ sung trong dự án mã
Google của mình.
Đăng ký phần bổ sung của bạn với RooBot
Một khi bạn đã phát hành trình cắm thêm của mình, bạn có thể gửi nó qua thư điện tử tới địa chỉ
để đăng ký kho lưu trữ phần bổ sung của bạn. Dòng chủ đề của thư
điện tử phải chứa tệp repository.xml. Ví dụ, với phần bổ sung mà chúng ta vừa tạo ra, tệp
repository.xml là
Để biết thêm thông tin về đăng ký với RooBot, xin vui lòng tham khảo tài liệu hướng dẫn Spring
Roo.
Về đầu trang
Tôi muốn Giám sát ứng dụng Java của mình (tạo phần bổ sung đơn giản)
Có một yêu cầu phổ biến trong nhiều ứng dụng doanh nghiệp, đó là bạn muốn giám sát ứng dụng
Java của mình để xác định các nghẽn cổ chai hiệu năng của ứng dụng. Tôi cũng có một yêu cầu
tương tự, vì vậy tôi quyết định xem xét một số giải pháp nguồn mở có sẵn. JAMon (Java
Application Monitor – Bộ giám sát ứng dụng Java) là một API Java an toàn-luồng, hiệu năng
cao, miễn phí cho phép bạn dễ dàng giám sát các ứng dụng sản xuất.
Để bổ sung sự hỗ trợ JAMon trong ứng dụng web của bạn:
1. Bạn phải thêm tệp lưu trữ Java (JAR) của jamon vào tệp pom.xml của mình.
2. Bạn phải định nghĩa một bean JamonPerformanceMonitorInterceptor trong tệp ngữ

cảnh ứng dụng của mình. Định nghĩa bean mẫu trông giống như mã trong Liệt kê 7.

Liệt kê 7. Mã JamonPerformanceMonitorInterceptor

<bean id="jamonPerformanceMonitorInterceptor" class=\
"org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor">
<property name="trackAllInvocations" value="true"></property>

<property name="useDynamicLogger" value="true"></property>
</bean>

<bean id="autoProxyCreator"
class=\
"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<idref
bean="jamonPerformanceMonitorInterceptor" />
</list>
</property>
<property name="beanNames">
<list>
<value>speakerController</value>
<value>talkController</value>
</list>
</property>
</bean>

Đây không phải là một định nghĩa bean đơn giản mà bất kỳ nhà phát triển nào cũng có thể dễ
dàng nhớ được và tôi nghĩ rằng sẽ thật thú vị nếu tôi có thể tự động hóa cấu hình văn bản soạn

sẵn này. Vì vậy, tôi quyết định viết một phần bổ sung có thể tự động hoá quá trình bổ sung phụ
thuộc JAMon và nối vào bean của bộ chặn. Bạn quyết định chọn cái nào khi bạn cần một phần
bổ sung đơn giản hay nâng cao?
1. Sử dụng một phần bổ sung đơn giản khi bạn muốn thêm các phụ thuộc Maven, thêm
các tạo phẩm cấu hình hoặc thêm cả hai vào dự án của bạn.
2. Sử dụng một phần bổ sung nâng cao khi bạn cần viết phần bổ sung đủ tính năng để
nâng cao các kiểu Java hiện có, giới thiệu các kiểu Java mới và các ITD (Khai báo giữa
các kiểu) của AspectJ hoặc thực hiện cả hai dự án của bạn.
Yêu cầu của chúng ta là bổ sung jamon.jar vào classpath và viết một tệp ngữ cảnh của ứng dụng
sẽ chứa định nghĩa bean của mình. Sẽ tốt hơn là viết một tệp ngữ cảnh ứng dụng Spring mới chứ
không sử dụng các tệp ngữ cảnh hiện có vì nó giúp mô đun hóa các ngữ cảnh ứng dụng. Từ các
yêu cầu này, rõ ràng là chúng ta nên viết một phần bổ sung đơn giản có thể bổ sung sự hỗ trợ
JAMon cho bất kỳ ứng dụng web nào.
Thiết lập dự án
Chúng ta cần thực hiện thiết lập dự án theo cách tương tự như chúng ta đã làm với phần bổ sung
quốc tế. Tôi sẽ đặt tên dự án này là "spring-roo-addon-jamon".
Tạo một phần bổ sung đơn giản
Một khi bạn đã thiết lập dự án này, bạn sẽ có một thư mục có tên là spring-roo-addon-jamon chỉ
với thư mục .svn. Chuyển vào thư mục spring-roo-addon-jamon và khởi động trình vỏ Spring
Roo. Sau đó, gõ lệnh sau:
addon create simple
topLevelPackage org.xebia.roo.addon.jamon \
projectName spring-roo-addon-jamon

Thế là xong! Phần bổ sung được tạo ra.
Cài đặt phần bổ sung đã tạo
Bạn có thể cài đặt phần bổ sung bằng lệnh sau:
osgi start url file://<Location to addon
target folder>/org.xebia.roo.addon.jamon-0.1.0.BUILD-SNAPSHOT.jar


Một khi bạn đã cài đặt phần bổ sung này, hãy tạo ra một máy khách đơn giản như chúng ta đã tạo
ra cho phần bổ sung i18n để kiểm tra. Phần bổ sung đã tạo ra này đưa ra hai lệnh:
1. Lệnh say hello, một lệnh in một thông báo chào mừng trên trình vỏ Roo . Lệnh này sẽ
luôn có sẵn và bạn có thể gõ nó bất cứ lúc nào trong khi trình vỏ Roo đang chạy.
2. Lệnh web mvc install tags thay thế các thẻ MVC mặc định được tạo ra khi bạn dựng
lên một ứng dụng web. Lệnh này sẽ chỉ có sẵn khi bạn đã tạo ra một ứng dụng web.
Xem xét mã đã tạo
Bây giờ bạn đã kiểm tra phần bổ sung, hãy xem các tệp được phần bổ sung này tạo ra, như trong
Liệt kê 8.

Liệt kê 8. Các tệp được tạo ra cho spring-roo-addon-jamon

Created ROOT/pom.xml
Created ROOT/readme.txt
Created ROOT/legal
Created ROOT/legal/LICENSE.TXT
Created SRC_MAIN_JAVA
Created SRC_MAIN_RESOURCES
Created SRC_TEST_JAVA
Created SRC_TEST_RESOURCES
Created SRC_MAIN_WEBAPP
Created SRC_MAIN_RESOURCES/META-INF/spring
Created SRC_MAIN_JAVA/com/shekhar/roo/addon/jamon
Created SRC_MAIN_JAVA/com/shekhar/roo/addon/jamon/JamonCommands.java
Created SRC_MAIN_JAVA/com/shekhar/roo/addon/jamon/JamonOperations.java
Created SRC_MAIN_JAVA/com/shekhar/roo/addon/jamon/JamonOperationsImpl.java
Created SRC_MAIN_JAVA/com/shekhar/roo/addon/jamon/JamonPropertyName.java
Created ROOT/src/main/assembly
Created ROOT/src/main/assembly/assembly.xml
Created SRC_MAIN_RESOURCES/com/shekhar/roo/addon/jamon

Created SRC_MAIN_RESOURCES/com/shekhar/roo/addon/jamon/info.tagx
Created SRC_MAIN_RESOURCES/com/shekhar/roo/addon/jamon/show.tagx

Các tạo phẩm pom.xml, assembly.xml, LICENSE.TXT và readme.txt giống như các tạo phẩm
được phần bổ sung i18n tạo ra. Chúng ta thảo luận chúng ở trên, vì thế tôi sẽ không nói lại về
chúng ở đây. Các tạo phẩm được quan tâm nhiều hơn là JamonCommands, JamonOperations,
JamonOperationsImpl và JamonPropertyName. Chúng ta hãy bàn về chúng từng cái một để hiểu
mã được tạo ra bằng lệnh phần bổ sung đơn giản.
1. JamonCommands.java:JamonCommands — Đây là một lớp, thực hiện một giao diện
đánh dấu có tên là CommandMarker và trưng ra hai lệnh, say hello và web mvc install
tags, như trong Liệt kê 9.

Liệt kê 9. Mã được tạo ra từ JamonCommands.java:JamonCommands

@Component
@Service
public class JamonCommands implements CommandMarker {

@Reference private JamonOperations operations;

@Reference private StaticFieldConverter staticFieldConverter;


protected void activate(ComponentContext context) {
staticFieldConverter.add(JamonPropertyName.class);
}


protected void deactivate(ComponentContext context) {
staticFieldConverter.remove(JamonPropertyName.class);

}

@CliAvailabilityIndicator("say hello")
public boolean isSayHelloAvailable() {
return true;
}

@CliCommand(value = "say hello",
help = "Prints welcome message to the Roo shell")
public void sayHello(@CliOption(key = "name", mandatory = true,
help = "State your name") String name,
@CliOption(key = "contryOfOrigin", mandatory = false,
help = "Country of origin") JamonPropertyName country) {

log.info("Welcome " + name + "!");
log.warning("Country of origin: " + (country == null ? \
JamonPropertyName.NOT_SPECIFIED.getPropertyName() :
country.getPropertyName()));

log.severe("It seems you are a running JDK "
+ operations.getProperty("java.version"));
log.info("You can use the default JDK logger anywhere in your"
+ " add-on to send messages to the Roo shell");
}

@CliAvailabilityIndicator("web mvc install tags")
public boolean isInstallTagsCommandAvailable() {
return operations.isInstallTagsCommandAvailable();
}


@CliCommand(value = "web mvc install tags",
help="Replace default Roo MVC tags used for scaffolding")
public void installTags() {
operations.installTags();
}
}

Tôi đã gỡ bỏ tất cả các nhận xét do bộ tạo mã này tạo ra để giảm sự dài dòng của mã này.
Chúng ta hãy xem xét các thành viên quan trọng của lớp này:
a. CommandMarker — Tất cả các lớp lệnh cần thực hiện giao diện
CommandMarker và cần được chú thích bằng các chú thích @Component và
@Service sao cho chúng được đăng ký và các lệnh của chúng trở nên có sẵn trong
trình vỏ Roo. Các trường được chú thích bằng @Reference là các phụ thuộc của
lớp JamonCommands được thùng chứa OSGi Roo bên dưới chèn vào. Tất cả các
lớp được chú thích bằng @Component và @Service annotations có thể được
chèn vào trong các phần bổ sung khác.
b. Các phương thức Activate (Kích hoạt) và Deactivate (Không kích hoạt) —
Các phương thức activate và deactivate là các phương thức được gọi khi bạn
cài đặt phần bổ sung bằng cách sử dụng lệnh addon install hoặc loại bỏ phần
bổ sung bằng cách sử dụng lệnh addon remove. Các phương thức này cho phép
bạn móc nối vào vòng đời của phần bổ sung, do thùng chứa OSGi Roo bên dưới
quản lý.
c. Các phương thức được chú thích bằng @CliAvailabilityIndicator — Các
phương thức được chú thích bằng @CliAvailabilityIndicator là các phương
thức giúp ẩn giấu các lệnh khi chúng không có sẵn. Ví dụ, lệnh security setup
(thiết lập bảo mật), để cài đặt Spring Security vào dự án, không nhìn thấy được
cho đến khi dự án trở thành một ứng dụng web. Lệnh này không đòi hỏi là bạn
cần có các phương thức như vậy, nhưng chúng có ích vì chúng không cho phép
người dùng thực hiện các lệnh mà không bảo đảm ở thời điểm đó. Ví dụ, việc
thực hiện lệnh security setup trước khi người dùng có một ứng dụng web chẳng

có ý nghĩa gì cả.
d. Các phương thức được chú thích bằng @CliCommand — Các phương thức được
chú thích bằng @CliCommand đăng ký lệnh này với trình vỏ Roo. Chú thích
@CliCommand có hai thuộc tính: value (giá trị), định nghĩa tên lệnh và help (trợ
giúp), định nghĩa thông báo trợ giúp được hiển thị khi bạn gõ lệnh help. Mỗi lệnh
có thể định nghĩa các thuộc tính bắt buộc và không bắt buộc bằng cách sử dụng
chú thích @CliOption được đưa ra như là một phần của lệnh. Ví dụ, lệnh say
hello có một thuộc tính bắt buộc là name và thuộc tính không bắt buộc là
country.
2. JamonOperationsImpl.java — Các lớp lệnh cần thực hiện một số hoạt động khi thực
hiện một lệnh. Các hoạt động này do các lớp hoạt động thực hiện.
JamonOperationsImpl là một lớp các hoạt động có trách nhiệm thực hiện các công việc
thực tế, giống như việc bổ sung một phụ thuộc vào pom.xml hoặc sao chép tài nguyên tới
vị trí mong muốn. Lớp JamonOperationsImpl thực hiện các hoạt động của nó bằng cách
sử dụng các dịch vụ cốt lõi do khung công tác Spring Roo cung cấp. Ví dụ, để thêm một
phụ thuộc, nó sử dụng giao diện ProjectOperations. Để sao chép các tệp, nó sử dụng
giao diện FileManager. Chúng ta hãy xem xét mã dùng cho lớp JamonOperationsImpl
(xem Liệt kê 10) để hiểu rõ hơn về phần bổ sung Roo.

Liệt kê 10. JamonOpertionsImpl

@Component
@Service
public class JamonOperationsImpl implements JamonOperations {
private static final char SEPARATOR = File.separatorChar;

@Reference private FileManager fileManager;
@Reference private ProjectOperations projectOperations;

public boolean isInstallTagsCommandAvailable() {

return projectOperations.isProjectAvailable() &&
fileManager.exists(projectOperations.getProjectMetadata().
getPathResolver().getIdentifier(Path.SRC_MAIN_WEBAPP,
"WEB-INF" + SEPARATOR + "tags"));
}

public String getProperty(String propertyName) {

Assert.hasText(propertyName, "Property name required");
return System.getProperty(propertyName);
}

public void installTags() {
PathResolver pathResolver =
projectOperations.getProjectMetadata().getPathResolver();
createOrReplaceFile(pathResolver.getIdentifier(
Path.SRC_MAIN_WEBAPP, "WEB-INF" + SEPARATOR +
"tags" + SEPARATOR + "util"), "info.tagx");

createOrReplaceFile(pathResolver.getIdentifier(
Path.SRC_MAIN_WEBAPP, "WEB-INF" + SEPARATOR +
"tags" + SEPARATOR + "form"), "show.tagx");
}


private void createOrReplaceFile(String path, String fileName)
{
String targetFile = path + SEPARATOR + fileName;
MutableFile mutableFile =
fileManager.exists(targetFile) ?

fileManager.updateFile(targetFile) :
fileManager.createFile(targetFile);
try {

FileCopyUtils.copy(TemplateUtils.getTemplate(getClass(),
fileName), mutableFile.getOutputStream());
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
}

Lớp JamonOperationsImpl sử dụng dịch vụ: isInstallTagsCommandAvailable kiểm
tra xem lệnh đã có sẵn chưa và installTags cài đặt các thẻ vào dự án đích. Để thực hiện
các hoạt động này, lớp JamonOperationsImpl sử dụng một số dịch vụ và tiện ích cốt lõi
của Spring Roo:
1. Lớp ProjectOperations : JamonOperationsImpl sử dụng dịch vụ
ProjectOperations để kiểm tra xem dự án có sẵn chưa và để nhận được đường
dẫn của thư mục tags (các thẻ).
2. Lớp FileManager : JamonOperationsImpl sử dụng dịch vụ FileManager để
kiểm tra xem một tệp có tồn tại ở một đường dẫn cụ thể không và để nhận được
bản cập nhật hoặc tạo ra một MutableFile. MutableFile (tệp có thể thay đổi
được) là một lớp đặc trưng Roo biểu diễn một trình xử lý cho một tệp có thể được
sửa đổi.
3. Lớp tiện ích TemplateUtils : TemplateUtils được sử dụng để thu được một
InputStream cho các tệp khuôn mẫu (info.tagx và show.tagx) trong gói phần bổ
sung của chúng ta.
4. Lớp tiện ích FileCopyUtils : FileCopyUtils được sử dụng để sao chép các
khuôn mẫu (của TemplateUtils) đến MutableFile (của FileManager).
Sửa đổi một phần bổ sung để đáp ứng các yêu cầu của chúng ta

Trong phần đầu tiên về phần bổ sung đơn giản, chúng ta đã thảo luận hai yêu cầu mà chúng ta
phải đáp ứng sao cho phần bổ sung của chúng ta có thể cấu hình JAMon trong bất kỳ ứng dụng
web MVC nào của Spring. Các yêu cầu là:
1. Bổ sung tệp lưu trữ Java (JAR) của JAMon vào pom.xml của bạn
2. Định nghĩa một bean JamonPerformanceMonitorInterceptor trong tệp ngữ cảnh của ứng
dụng.
Để đáp ứng các yêu cầu này, chúng ta sẽ thực hiện các thay đổi trong lớp JamonCommands để hỗ
trợ lệnh jamon setup. Sau đó, chúng ta sẽ bổ sung một hoạt động tương ứng với lệnh jamon
setup để thực hiện công việc thực tế để đáp ứng các yêu cầu.
Lớp JamonCommands — Lớp JamonCommands bây giờ sẽ có hai phương thức: isInstallJamon
để kiểm tra xem lệnh jamon setup có sẵn chưa và installJamon để cài đặt JAMon khi thực
hiện lệnh jamon setup . (Liệt kê 11.)

Liệt kê 11. Mã cho JamonCommands

@Component
@Service
public class JamonCommands implements CommandMarker {

private Logger log = Logger.getLogger(getClass().getName());

@Reference private JamonOperations operations;

@CliAvailabilityIndicator("jamon setup")
public boolean isInstallJamon() {
return operations.isInstallJamonAvailable();
}

@CliCommand(value = "jamon setup", help = "Setup Jamon into your
project")

public void installJamon() {
operations.installJamon();
}
}


Đây là tất cả những thứ mà chúng ta cần trong lớp JamonCommands. Nó chỉ cần trưng ra lệnh
jamon setup và phần công việc còn lại được ủy thác cho lớp JamonOperationsImpl. (Liệt kê
12.)

Liệt kê 12. Mã cho JamonOperationsImpl

JamonOperationsImpl

JamonOperationsImpl need to implement two methods – \
isInstallJamonAvailable() and installJamon().

The isinstallJamonAvailable() method returns a boolean indicating whether
command is available at this location or not. I want to enable JAMon only for
the web
applications so we need to perform the check whether the project is
a web application or not. To do that we will write the code as shown below

public boolean isInstallJamonAvailable() {
return projectOperations.isProjectAvailable() &&
fileManager.exists(projectOperations.getPathResolver()
.getIdentifier(Path.SRC_MAIN_WEBAPP, "/WEB-
INF/web.xml"));
}



Mã được hiển thị trong Liệt kê 12 sử dụng dịch vụ ProjectOperations để kiểm tra xem một dự
án có sẵn tại vị trí này chưa và để lấy đường dẫn của tệp web.xml (tệp web.xml chỉ tồn tại cho
các ứng dụng web). Dịch vụ FileManager được sử dụng để kiểm tra xem tệp web.xml có tồn tại
tại vị trí theo quy định của ProjectOperations không.
Phương thức thứ hai mà chúng ta cần thực hiện là installJamon(), sẽ bổ sung phụ thuộc
JAMon vào tệp pom.xml và thêm định nghĩa bean cho webmvc-config.xml. Trước khi chúng ta
viết mã cho phương thức này, chúng ta phải tạo ra một tệp XML có tên là configuration.xml bên
trong thư mục src/main/resources/org/xebia/roo/addon/jamon. Cấu trúc thư mục,
org/xebia/roo/addon/jamon, giống như cấu trúc gói của phần bổ sung Roo của bạn. Tệp
configuration.xml định nghĩa phiên bản JAMon và phụ thuộc tệp lưu trữ Java (JAR) của JAMon,
như trong Liệt kê 13.

Liệt kê 13. Các nội dung của tệp configuration.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration>
<jamon>
<properties>
<jamon.version>2.4</jamon.version>
</properties>
<dependencies>
<dependency>
<groupId>com.jamonapi</groupId>
<artifactId>jamon</artifactId>
<version>${jamon.version}</version>
</dependency>
</dependencies>
</jamon>
</configuration>


Hãy viết mã để bổ sung phụ thuộc vào tệp pom.xml, như trong Liệt kê 14.

Liệt kê 14. Các nội dung của tệp pom.xml

public void installJamon() {

Element configuration = XmlUtils.getConfiguration(getClass());
updatePomProperties(configuration);
updateDependencies(configuration);
}

private void updatePomProperties(Element configuration) {
List<Element> properties = \
XmlUtils.findElements("/configuration/jamon/properties/*"
, configuration);
for (Element property : properties) {
projectOperations.addProperty(new Property(property));

}
}

private void updateDependencies(Element configuration) {

List<Dependency> dependencies = new ArrayList<Dependency>();
List<Element> jamonDependencies = XmlUtils.findElements(
"/configuration/jamon/dependencies/dependency",
configuration);
for (Element dependencyElement : jamonDependencies) {
dependencies.add(new Dependency(dependencyElement));

}
projectOperations.addDependencies(dependencies);
}


Đây là một cơ chế tiêu chuẩn để bổ sung một phụ thuộc vào tệp pom.xml và bạn có thể thấy nó
được sử dụng trong hầu hết các phần bổ sung Roo. Mã được hiển thị trong Liệt kê 14 là tự giải
thích và sử dụng lớp tiện ích của Spring Roo, là XmlUtils, để đọc nội dung từ tệp
configuration.xml và sau đó sử dụng dịch vụ ProjectOperations để cập nhật tệp pom.xml.
Một khi chúng ta đã bổ sung phụ thuộc pom.xml, chúng ta cần tạo ra một cấu hình Spring riêng
biệt, là web-jamon-config.xml, sẽ chứa định nghĩa bean cho
JamonPerformanceMonitorInterceptor.

Liệt kê 15. Các nội dung của web-jamon-config.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="
xmlns:context="
xmlns:mvc=" \
xmlns:p="
xmlns:xsi="
xsi:schemaLocation=\
" \

\

\




<bean id="jamonPerformanceMonitorInterceptor"
class=\
"org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor">
<property name="trackAllInvocations" value="true"></property>

<property name="useDynamicLogger" value="true"></property>
</bean>

<bean id="autoProxyCreator"
class=\
"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<idref
bean="jamonPerformanceMonitorInterceptor" />
</list>
</property>
<property name="beanNames">
<list>
<value></value>
</list>
</property>
</bean>

</beans>

Trong tệp web-jamon-config.xml được hiển thị trong Liệt kê 15, chúng ta đã cấu hình tất cả mọi
thứ cần thiết cho JAMon trong một ứng dụng dựa trên Spring. Điều duy nhất mà tôi đã không chỉ
rõ là tên của các bean để giám sát. Bộ tạo mã không thể dự đoán điều này, do đó, nó được để lại
cho các nhà phát triển phần bổ sung quy định.

Bây giờ chúng ta cần viết mã sẽ sao chép tệp web-jamon-config.xml này vào thư mục
WEB_INF/spring, nơi lưu trữ tệp webmvc-config.xml và mã cho câu lệnh add import trong tệp
webmvc-config.xml để nhập khẩu tệp web jamon-config.xml. (Liệt kê 16.)

Liệt kê 16. Mã để xử lý manipulate pom.xml

public void installJamon() {

// update pom.xml code
PathResolver pathResolver =

projectOperations.getProjectMetadata().getPathResolver();
String resolvedSpringConfigPath =
pathResolver.getIdentifier(Path.SRC_MAIN_WEBAPP,

"/WEB-INF/spring");
if (fileManager.exists(resolvedSpringConfigPath + "/web-jamon-
config.xml")) {
return;
}
copyTemplate("web-jamon-config.xml", resolvedSpringConfigPath);

String webMvcConfigPath = resolvedSpringConfigPath + "/webmvc-
config.xml";

new XmlTemplate(fileManager).update(webMvcConfigPath, new
DomElementCallback() {
public boolean doWithElement(Document document, Element root)
{
if (null ==

XmlUtils.findFirstElement\
("/beans/import[@resource='web-jamon-config.xml']",
root)) {
Element element = document.createElement("import");
element.setAttribute("resource", "web-jamon-
config.xml");
root.appendChild(element);
return true;
}
return false;
}
});

}

private void copyTemplate(String templateFileName, String
resolvedTargetDirectoryPath) {

try {
FileCopyUtils.copy(TemplateUtils.getTemplate(getClass(),
templateFileName), fileManager.createFile(
resolvedTargetDirectoryPath + "/" +
templateFileName).getOutputStream());
} catch (IOException e) {
throw new IllegalStateException(
"Encountered an error during copying of resources for Jamon
addon.", e);
}
}


Lớp XmlTemplate được sử dụng ở trên đến từ phần bổ sung luồng web Spring. Vì vậy, bạn cần
thêm một phụ thuộc cho phần bổ sung luồng web này trong phần bổ sung của bạn. (Liệt kê 17.)

Liệt kê 17. Thêm phụ thuộc cho phần bổ sung luồng web

<dependency>
<groupId>org.springframework.roo</groupId>

<artifactId>org.springframework.roo.addon.web.flow</artifactId>
<version>${roo.version}</version>
<type>bundle</type>
</dependency>

Trong Liệt kê 17, roo.version là phiên bản của Roo mà bạn đang sử dụng.
Điều cuối cùng chúng ta cần làm trong phần bổ sung này là cấu hình ghi nhật ký dự án và thiết
lập mức ghi nhật ký để theo dõi. Điều này được thực hiện bằng cách sử dụng
LoggingOperations, là một lớp các hoạt động cho phần bổ sung log4j. Để sử dụng lớp này,
trước tiên chúng ta cần thêm phụ thuộc của phần bổ sung ghi nhật ký vào tệp pom.xml, như
trong Liệt kê 18.

Liệt kê 18. Mã XML để thêm phụ thuộc cho phần bổ sung ghi nhật ký

<dependency>
<groupId>org.springframework.roo</groupId>
<artifactId>org.s
pringframework.roo.addon.logging</artifactId>
<version>${roo.version}</version>
<type>bundle</type>
</dependency>


Sau khi thêm phụ thuộc này vào pom.xml, hãy thêm LoggingOperation vào lớp
JamonOperationsImpl bằng dòng sau:
@Reference private LoggingOperations loggingOperations;

Tiếp theo, thêm dòng sau vào phương thức installJamon:
loggingOperations.configureLogging(LogLevel.TRACE, LoggerPackage.PROJECT);

Đó là tất cả mã mà chúng ta cần viết cho phần bổ sung này. Toàn bộ mã cho lớp
JamonOperationsImpl được hiển thị trong Liệt kê 19.

Liệt kê 19. Mã đã hoàn thành cho lớp JamonOperationsImpl

@Component
@Service
public class JamonOperationsImpl implements JamonOperations {
@Reference private FileManager fileManager;
@Reference private ProjectOperations projectOperations;
@Reference private LoggingOperations loggingOperations;


public boolean isInstallJamonAvailable() {
return projectOperations.isProjectAvailable() &&
fileManager.exists(projectOperations.getPathResolver()
.getIdentifier(Path.SRC_MAIN_WEBAPP,"/WEB-INF/web.xml"));
}


public void installJamon() {
Element configuration = XmlUtils.getConfiguration(getClass());
updatePomProperties(configuration);

updateDependencies(configuration);
PathResolver pathResolver =

projectOperations.getProjectMetadata().getPathResolver();
String resolvedSpringConfigPath =
pathResolver.getIdentifier(Path.SRC_MAIN_WEBAPP,
"/WEB-INF/spring");
if (fileManager.exists(resolvedSpringConfigPath
+ "/web-jamon-config.xml")) {
return;
}


copyTemplate("web-jamon-config.xml",
resolvedSpringConfigPath);

String webMvcConfigPath = resolvedSpringConfigPath
+ "/webmvc-config.xml";


new XmlTemplate(fileManager).update(webMvcConfigPath,
new DomElementCallback() {
public boolean doWithElement(Document document, Element
root) {
if (null == XmlUtils.findFirstElement(
"/beans/import[@resource='web-jamon-config.xml']",
root)) {

Element element = document.createElement("import");
element.setAttribute("resource", "web-jamon-

config.xml");
root.appendChild(element);
return true;
}
return false;
}
});
loggingOperations.configureLogging(LogLevel.TRACE,
LoggerPackage.PROJECT);
}

private void copyTemplate(String templateFileName,
String resolvedTargetDirectoryPath) {
try {
FileCopyUtils.copy(
TemplateUtils.getTemplate(getClass(), templateFileName),
fileManager.createFile(resolvedTargetDirectoryPath + "/" +
templateFileName).getOutputStream());
} catch (IOException e) {
throw new IllegalStateException(
"Encountered an error during copying of resources for Jamon
addon.", e);
}
}

×