Tháng 6 năm 2007
- Giới thiệu
- Thiết kế và triển khai
- Lấy và triển khai Event Publisher
- Chạy ứng dụng
- Các bước tiếp theo và những điểm có thể cải thiện
- Phụ lục
Giới thiệu
Bạn có bao giờ muốn lưu giữ nhiều thông tin về các cuộc họp, sự kiện hoặc hội nghị trong một Bảng tính Google và dễ dàng chia sẻ cũng như tìm kiếm thông tin đó chưa? Tại Google, chúng tôi làm đúng như vậy với Lịch sự kiện dành cho nhà phát triển. Dữ liệu được đưa vào lịch đến từ nhiều nhân viên Google trên toàn công ty. Nhiều người trong số họ có quyền chỉnh sửa một Bảng tính trên Google nơi dữ liệu được lưu trữ. Trong bảng tính, những sự kiện chưa được xác nhận tồn tại cùng với những lượt tương tác được công bố rộng rãi. Đôi khi, mọi người còn nhập các sự kiện dự kiến, ngay cả trước khi đề xuất được gửi hoặc một cơ hội tài trợ tiềm năng được điều tra. "Người chỉnh sửa" chịu trách nhiệm xuất bản sự kiện và ghi lại các sự kiện đã xuất bản trên một cột trong bảng tính.
Tại sao chúng ta không duy trì những sự kiện này ngay trong Lịch Google? Lịch phù hợp để xác định thời gian và địa điểm của một sự kiện, nhưng khi cần duy trì nhiều thông tin có cấu trúc (chẳng hạn như danh sách diễn giả, thời hạn gửi bài, v.v.), thì bảng tính sẽ phù hợp hơn.

Bảng tính nguồn trên Google có danh sách sự kiện
Một đồng nghiệp của tôi tại Google đề xuất rằng chúng tôi nên tiếp tục duy trì các sự kiện trong Trang tính nhưng loại bỏ quy trình xuất bản thủ công các sự kiện đó lên lịch công khai bên ngoài của chúng tôi. Tôi cũng muốn có một dự án thú vị dựa trên nhiều API dữ liệu của Google ("GData" cho ngắn gọn) để trình bày tại Mashup Camp, và do đó Event Publisher ra đời.
Event Publisher là một ứng dụng được phát triển nhanh chóng, là ứng dụng minh hoạ khái niệm duy trì danh sách các sự kiện trong Trang tính và xuất bản các sự kiện đó lên cả Lịch và Google Base. Lịch Google là một cách tuyệt vời để chia sẻ sự kiện và giúp mọi người dễ dàng thêm sự kiện vào chế độ xem lịch của riêng họ. Mặc dù Lịch có chức năng tìm kiếm sự kiện, nhưng Google Base lại cung cấp một nơi khác để công khai sự kiện và có khả năng lưu trữ dữ liệu có cấu trúc theo cách dễ tìm kiếm.
Bảng tính, Lịch và Base đều cung cấp một API hỗ trợ đầy đủ các thao tác đọc/ghi. Thậm chí, mỗi dịch vụ này đều cung cấp quyền truy cập vào dữ liệu của mình bằng giao thức Google Data API!
Thiết kế và triển khai
Giai đoạn thiết kế của dự án này khá đơn giản: Tôi biết rằng mình muốn tạo một ứng dụng web để xuất bản dữ liệu trong bảng tính lên lịch. Mặc dù mục tiêu dài hạn là xây dựng một ứng dụng có thể dùng cho Lịch sự kiện dành cho nhà phát triển, nhưng mục tiêu ngắn hạn là tạo ra một bản kết hợp hoạt động được có thể minh hoạ trong Mashup Camp. Với những mục tiêu này, tôi đã chọn Thư viện ứng dụng Java GData vì đây là một trong những thư viện ứng dụng hoàn thiện hơn và tôi quen với việc viết các ứng dụng web Java. Việc sử dụng một trong các thư viện ứng dụng được cung cấp giúp tôi không phải lo lắng về giao thức GData thô và mô hình dữ liệu XML, thay vào đó, tôi có thể tập trung vào việc triển khai logic ứng dụng tương đối đơn giản cần thiết để xuất bản các sự kiện.
Tôi đã tải Thư viện ứng dụng Java xuống và bắt đầu thiết kế mô hình lớp cho nhà xuất bản sự kiện. Tôi đã tạo một servlet có tên là EventPublisherServlet, đóng vai trò là bộ điều khiển cho tất cả các yêu cầu đến ứng dụng web. Tôi cũng tạo một lớp có tên là EventPublisher để xử lý logic nghiệp vụ cho việc tương tác với Lịch, Base và Trang tính. Cuối cùng, tôi đã viết một lớp Bean để lưu trữ dữ liệu sự kiện. Giao diện người dùng của ứng dụng được phát triển bằng một số JSP.
Ưu điểm của việc sử dụng nhiều dịch vụ GData là chúng nhất quán trên các giao diện và nhiều thư viện ứng dụng bao gồm các lớp trợ giúp dành riêng cho dịch vụ đối với các dịch vụ yêu thích của Google. Vì Thư viện ứng dụng có cùng các lớp Dịch vụ, Mục nhập và Nguồn cấp dữ liệu cho 3 dịch vụ mà tôi đang sử dụng, nên tôi có thể dùng mã rất giống nhau để truy xuất các sự kiện từ Trang tính và xuất bản chúng lên Base và Lịch. Điều này giúp tôi rút ngắn đáng kể thời gian phát triển so với thời gian cần thiết để làm việc với 3 API riêng biệt. Bạn có thể muốn kiểm tra các phương thức publishEventToCalendar() và publishEventToBase() trong EventPublisher để xem những điểm tương đồng giữa các phương thức.
Lấy và triển khai Nhà xuất bản sự kiện
Ứng dụng Event Publisher được phân phối trong gói tải xuống Thư viện ứng dụng Java của Google Data. Sau khi tải Thư viện ứng dụng Java xuống, hãy tìm trong thư mục java/mashups/eventpub. Vui lòng xem phần cấu trúc dự án trong phần phụ lục để biết thêm thông tin về ý nghĩa của từng tệp trong ví dụ.
Ứng dụng có một số thư viện phụ thuộc cần được tải xuống trước khi tạo Trình xuất bản sự kiện. Sau khi định cấu hình các lựa chọn thích hợp về bản dựng và thời gian chạy (xem tệp README.TXT), bạn có thể dùng Ant để biên dịch các lớp Java và tạo tệp WAR. Sau đó, bạn có thể triển khai tệp WAR này vào công cụ servlet mà bạn yêu thích, chẳng hạn như Tomcat 5.5 mà tôi đã dùng để kiểm thử ứng dụng này. Tomcat, chạy theo cấu hình mặc định, chỉ yêu cầu bạn sao chép tệp deploy/EventPublisher.war đã tạo vào thư mục webapps của Tomcat. Sau đó, ứng dụng này sẽ được tự động triển khai và có thể truy cập qua http://hostname:8080/EventPublisher.
Chạy ứng dụng – Quy trình

Xác thực tài khoản Google Trang tính thông qua AuthSub.
- Ứng dụng được tải bằng cách truy cập vào /EventPublisher trên máy chủ lưu trữ đang chạy ứng dụng. Trong trường hợp này, tôi đang chạy ứng dụng tại http://localhost:8080/EventPublisher
- Xác thực cho Google Trang tính
- Người dùng nhấp vào đường liên kết "xác thực" do hàm tĩnh tạo ra: AuthSubUtil.getRequestUrl().
- Người dùng sẽ được chuyển hướng đến các dịch vụ của Tài khoản Google. Tại đây, nếu chưa đăng nhập vào Google, người dùng sẽ được nhắc nhập thông tin đăng nhập.
- Người dùng cấp cho Event Publisher quyền truy cập vào dữ liệu của họ trong Trang tính.
- Người dùng được chuyển hướng trở lại Event Publisher bằng mã thông báo AuthSub dùng một lần trong URL. Event Publisher trao đổi mã thông báo dùng một lần để lấy mã thông báo phiên AuthSub bằng dịch vụ AuthSubSessionToken.
- Mã: Xem
EventPublisherServlet.processAcceptAuthSubToken()
- Tài liệu: Xem tài liệu về AuthSub
- Chọn bảng tính/trang tính
- Nhà xuất bản sự kiện sẽ chuyển hướng người dùng đến danh sách các bảng tính mà người dùng được uỷ quyền có thể truy cập.
- Sau khi chọn một bảng tính mà từ đó dữ liệu sự kiện sẽ được truy xuất, người dùng cũng được nhắc chọn trang tính thích hợp trong bảng tính đã chọn.
- Mã: Xem
EventPublisher.getSsList()
vàEventPublisher.getWsList()
- Truy xuất và liên kết tiêu đề cột
- Sau đó, ứng dụng sẽ sử dụng nguồn cấp dữ liệu ô của Trang tính để truy xuất hàng dữ liệu đầu tiên từ trang tính. Hàng đầu tiên này đại diện cho tiêu đề cột. Mỗi phần dữ liệu cần thiết sẽ được liệt kê cho người dùng và họ sẽ được nhắc chọn tiêu đề cột phù hợp nhất với dữ liệu. Trong ảnh chụp màn hình ở bên phải, mỗi loại dữ liệu cần thiết đều có một hộp chọn bên cạnh, nơi bạn sẽ chọn tiêu đề cột tương ứng. Hoạt động ánh xạ này được lưu trữ trong phiên của người dùng bằng cơ chế xử lý phiên của vùng chứa servlet.
- Mã: Xem
EventPublisherServlet.processListEvents()
- Truy xuất các mục và lưu trữ trong Beans
- Sau khi các cột được liên kết, Event Publisher sẽ truy xuất nguồn cấp dữ liệu danh sách Bảng tính chứa một mục nhập duy nhất cho mỗi hàng trong trang tính. Mỗi hàng đại diện cho một sự kiện duy nhất và dữ liệu từ hàng đó được điền vào các thực thể của Event Bean. Sau đó, tập hợp các đối tượng Bean sẽ được lưu trữ trong phiên và cũng được xuất ra màn hình để xác nhận – bằng cách sử dụng trang outputEventList.jsp.
- Xuất bản các mục vào Lịch và/hoặc Base
- Người dùng chọn mục tiêu xuất bản phù hợp (Lịch, Cơ sở hoặc cả hai) rồi nhấp vào nút "Xuất bản". Các sự kiện được đẩy từ tập hợp các đối tượng Sự kiện được lưu trữ trong phiên của người dùng đến các dịch vụ thích hợp bằng cách sử dụng các phương thức
publishEventsToBase()
vàpublishEventsToCalendar
trong EventPublisher. Các phương thức này tạo ra các đối tượng mục thuộc các loại phù hợp cho các dịch vụ:CalendarEventEntry
vàGoogleBaseEntry
. Sau đó, các mục này sẽ được đăng thông qua mộtHTTP POST
do các lớp dịch vụCalendarService
vàGoogleBaseService
thực hiện - Khi các sự kiện được xuất bản, các URL chỉnh sửa do mỗi dịch vụ đích trả về sẽ được lưu trữ trong Google Trang tính bằng phương thức
EventPublisher.updateSsEventEditUrl()
. Đối với các lần lặp lại trong tương lai của quy trình xuất bản, các sự kiện có chứa URL chỉnh sửa cho từng dịch vụ tương ứng trong Bảng tính sẽ được chỉnh sửa thay vì được tạo. Việc này giúp ngăn chặn dữ liệu sự kiện trùng lặp.
- Người dùng chọn mục tiêu xuất bản phù hợp (Lịch, Cơ sở hoặc cả hai) rồi nhấp vào nút "Xuất bản". Các sự kiện được đẩy từ tập hợp các đối tượng Sự kiện được lưu trữ trong phiên của người dùng đến các dịch vụ thích hợp bằng cách sử dụng các phương thức


Liên kết dữ liệu bắt buộc với các cột trong bảng tính và xem trước các sự kiện sẽ được xuất bản.
Các bước tiếp theo và những điểm có thể cải thiện
Như đã đề cập trước đó trong bài viết này, ứng dụng này hiện chỉ là một nguyên mẫu. Đây không phải là mã sẵn sàng cho việc phát hành. Để chuẩn bị cho việc phát hành Event Publisher, bạn cần phải thêm một số quy trình xử lý lỗi. Hiện tại, các lỗi chỉ được gửi đến stderr. Thay vào đó, các lỗi xảy ra trong quá trình truy xuất, xuất bản hoặc các hành động khác sẽ xuất hiện trong trình duyệt của người dùng.
Ngoài ra, bạn cần lưu ý rằng để duy trì tính toàn vẹn của tập dữ liệu, Google Base sẽ hết hạn các mặt hàng sau một khoảng thời gian nếu bạn không cập nhật. Nếu một sự kiện đã được thêm vào Google Base, thì Nhà xuất bản sự kiện sẽ cố gắng cập nhật sự kiện đó bằng URL chỉnh sửa được lưu trữ trong Google Trang tính. Nếu mục sự kiện trong Base đã hết hạn, thì URL chỉnh sửa sẽ không còn hợp lệ và lỗi 404 sẽ được trả về tại thời điểm xuất bản. Giải pháp tạm thời là thử chèn sự kiện khi nhận được phản hồi 404.
Một tính năng khác có thể được thêm vào ứng dụng Event Publisher là khả năng lưu trữ và xuất bản thời gian chính xác của các sự kiện thay vì chỉ có ngày. Vì Google Base yêu cầu phải có thời gian gắn với sự kiện, nên việc lưu trữ thời gian của mỗi sự kiện sẽ ngăn chặn việc thời gian tuỳ ý được liên kết với các sự kiện trong mục nhập Base. Lịch cũng có thể trình bày các sự kiện vào thời điểm thích hợp.
Bạn cũng có thể muốn có một cơ chế lưu trữ dữ liệu liên tục để lưu trữ cấu hình cho các bảng tính cụ thể, bao gồm cả việc liên kết cột. Dữ liệu này có thể ở dạng một bảng tính riêng biệt trên Google Trang tính, một cơ sở dữ liệu hoặc bộ nhớ trên ổ đĩa cục bộ.
Tôi hy vọng bài viết này sẽ khơi gợi trí tưởng tượng của bạn để đưa ra một số ý tưởng mới tuyệt vời cho các ứng dụng sử dụng Google Data API! Nếu muốn xem nguồn của ứng dụng này hoặc tạo và sửa đổi ứng dụng cho phù hợp với nhu cầu của mình, bạn có thể tìm thấy ứng dụng này trong Thư viện ứng dụng Java của Google Data API trong thư mục mashups/eventpub. Ngoài ra, chúng tôi rất mong nhận được ý kiến phản hồi của bạn về bài viết này trong diễn đàn dành cho nhà phát triển Google Data API. Đối với các câu hỏi liên quan đến một dịch vụ cụ thể, vui lòng đăng trong nhóm thảo luận dành riêng cho dịch vụ.