发布活动 - 混搭 Google 电子表格、日历和 Base

Ryan Boyd,Google Data API 团队
2007 年 6 月
  1. 简介
  2. 设计和实现
  3. 获取和部署事件发布者
  4. 运行应用
  5. 后续步骤和潜在改进
  6. 附录

简介

您是否曾想在 Google 电子表格中维护有关会议、活动或会议的大量信息,并轻松共享和搜索这些信息?在 Google,我们通过开发者活动日历来做到这一点。日历中的数据来自整个公司中各种各样的 Google 员工,其中许多人拥有对存储数据的 Google 电子表格的修改权限。在电子表格中,未确认的活动与广为人知的互动活动并存。有时,用户甚至会在提交提案或调查潜在赞助之前输入潜在活动。“编辑者”负责发布活动,并在电子表格的列中记录已发布的活动。

为什么我们不直接在 Google 日历中维护这些活动?Google 日历非常适合确定活动的具体时间和地点,但如果要维护大量结构化信息(例如演讲者名单、提交截止日期等),电子表格会更适合。

包含活动的 Google 电子表格的屏幕截图
包含活动列表的源 Google 电子表格

我的一位 Google 同事建议我们继续在 Google 表格中维护活动,但移除将活动发布到外部公开日历的手动流程。我还想在 Mashup Camp 上展示一个基于多个 Google Data API(简称“GData”)的有趣项目,于是 Event Publisher 就诞生了。

Event Publisher 是一款快速开发的、概念验证型应用,可在电子表格中维护活动列表,并将其发布到 Google 日历和 Google Base。Google 日历提供了一种出色的方式来共享活动,让其他人可以轻松地将这些活动添加到自己的日历视图中。虽然 Google 日历也提供活动搜索功能,但 Google Base 还提供另一种宣传活动的途径,并且擅长以易于搜索的方式存储结构化数据。

电子表格、日历和 Base 各自提供一个支持完整读/写操作的 API。更棒的是,这些服务都使用 Google Data API 协议公开了对其数据的访问权限!

设计和实现

此项目的设计阶段非常简单:我知道自己想制作一个 Web 应用,用于在日历上发布电子表格数据。虽然长期目标是构建一个可用于开发者活动日历的应用,但短期目标是制作一个可在 Mashup Camp 期间演示的实用混搭概念验证。考虑到这些目标,我选择了 GData Java 客户端库,因为它是比较成熟的客户端库之一,而且我熟悉如何编写 Java Web 应用。使用提供的某个客户端库后,我无需再担心原始 GData 协议和 XML 数据模型,而是可以专注于实现发布活动所需的相对简单的应用逻辑。

我下载了 Java 客户端库,并开始设计事件发布者的类模型。我创建了一个名为 EventPublisherServlet 的 servlet,它充当进入 Web 应用的所有请求的控制器。我还创建了一个名为 EventPublisher 的类,用于处理与日历、Base 和电子表格互动的业务逻辑。最后,我编写了一个用于存储事件数据的 Bean 类。该应用的用户界面是使用少量 JSP 开发的。

使用多个 GData 服务的优势在于,这些服务在接口方面保持一致,并且许多客户端库都包含特定于服务的辅助类,可用于您喜爱的 Google 服务。由于客户端库针对我使用的这三项服务提供了相同的 Service、Entry 和 Feed 类,因此我能够使用非常相似的代码从电子表格中检索活动,并将其发布到 Base 和日历。与使用三个不同的 API 相比,这大大缩短了我的开发时间。您可以检查 EventPublisher 中的 publishEventToCalendar() 和 publishEventToBase() 方法,了解不同方法之间的相似之处。

获取和部署事件发布者

Event Publisher 应用作为 Google Data Java 客户端库下载的一部分进行分发。下载 Java 客户端库后,请查看 java/mashups/eventpub 目录。如需详细了解示例中每个文件的含义,请参阅附录中的项目结构部分。

应用有许多依赖库,需要在构建 Event Publisher 之前下载这些库。配置适当的 build 和运行时选项(请参阅 README.TXT 文件)后,可以使用 Ant 编译 Java 类并生成 WAR 文件。然后,您可以将此 WAR 文件部署到您最喜欢的 servlet 引擎,例如我在测试此应用时使用的 Tomcat 5.5。在默认配置下运行的 Tomcat 只需要将生成的 deploy/EventPublisher.war 文件复制到其 webapps 目录即可。然后,系统会自动部署该应用,并通过 http://hostname:8080/EventPublisher 提供访问权限。

运行应用 - 流程

AuthSub 身份验证流程的屏幕截图
通过 AuthSub 向 Google 表格账号进行身份验证。
  • 通过访问运行该应用的主机上的 /EventPublisher 来加载该应用。在我的示例中,我是在 http://localhost:8080/EventPublisher 上运行应用
  • Google 电子表格的身份验证
    • 用户点击由静态函数 AuthSubUtil.getRequestUrl() 生成的“身份验证”链接。
    • 系统会将用户重定向到 Google 账号服务,如果用户尚未登录 Google,系统会提示用户输入凭据。
    • 用户向 Event Publisher 授予访问其 Google 表格数据的权限。
    • 用户会被重定向回事件发布者,网址中包含一次性 AuthSub 令牌。事件发布者使用 AuthSubSessionToken 服务将一次性令牌换成 AuthSub 会话令牌。
    • 代码:请参阅 EventPublisherServlet.processAcceptAuthSubToken()
    • 文档:请参阅 AuthSub 文档
  • 选择电子表格/工作表
    • 用户由事件发布者重定向到授权用户可访问的电子表格列表。
    • 在选择要从中检索活动数据的电子表格后,系统还会提示用户选择所选电子表格中的相应工作表。
    • 代码:请参阅 EventPublisher.getSsList()EventPublisher.getWsList()
  • 映射字段的屏幕截图 映射字段的屏幕截图
    将必需的数据映射到电子表格列,并预览要发布的事件。
  • 检索和映射列标题
    • 然后,应用使用电子表格单元格 Feed 从电子表格中检索第一行数据,该第一行数据表示列标题。系统会向用户列出每项所需数据,并提示用户选择与相应数据最匹配的列标题。在右侧的屏幕截图中,每种所需的数据类型旁边都有一个选择框,您可以在其中选择相应的列标题。此映射使用 servlet 容器的会话处理机制存储在用户的会话中。
    • 代码:请参阅 EventPublisherServlet.processListEvents()
  • 检索条目并存储在 Bean 中
    • 映射列后,Event Publisher 会检索包含工作表中每行的单个条目的电子表格列表 Feed。每一行都表示一个事件,相应行中的数据会填充到 Event Bean 的实例中。然后,Bean 的集合会存储在会话中,并使用 outputEventList.jsp 页面输出到屏幕以供确认。
  • 将条目发布到 Google 日历和/或 Base
    • 用户选择合适的发布目标(日历、基础或两者),然后点击“发布”按钮。使用 EventPublisher 中的 publishEventsToBase()publishEventsToCalendar 方法,将存储在用户会话中的 Event 对象集合中的事件推送到相应服务。这些方法会为服务创建相应类型的条目对象CalendarEventEntryGoogleBaseEntry。然后,通过 服务CalendarServiceGoogleBaseService 执行的 HTTP POST 发布这些条目
    • 发布活动后,每个目标服务返回的修改网址会使用 EventPublisher.updateSsEventEditUrl() 方法存储在 Google 电子表格中。在未来的发布流程迭代中,系统会修改包含电子表格中每个相应服务的修改网址的事件,而不是创建事件。这样可以防止出现重复的事件数据。

后续步骤和潜在改进

如本文前文所述,此应用目前仅为原型。它不是可用于生产环境的代码。为了让 Event Publisher 能够发布到生产环境,需要添加一些错误处理功能。目前,错误仅发送到 stderr。相反,在检索、发布或其他操作期间发生的错误应显示在用户的浏览器中。

此外,请注意,为保持数据集的完整性,Google Base 会在一段时间后使未更新的商品过期。如果某个活动已添加到 Google Base,活动发布者会尝试使用存储在 Google 电子表格中的修改网址来更新该活动。如果 Base 中的活动商品已过期,则修改网址不再有效,并且在发布时会返回 404 错误。一种解决方法是在收到 404 响应时尝试插入相应事件。

可以添加到 Event Publisher 应用的另一项功能是能够存储和发布确切的活动时间,而不仅仅是日期。由于 Google Base 要求为活动附加时间,因此存储每个活动的时间可防止任意时间与 Base 条目中的活动相关联。日历还可以在适当的时间显示活动。

您可能还希望拥有一个持久性数据存储机制来存储特定电子表格的配置(包括列映射)。这可以是单独的 Google 电子表格、数据库或本地磁盘存储空间。

希望本文能激发您的想象力,让您想出一些利用 Google Data API 的绝妙新应用创意!如果您有兴趣查看此应用的源代码,或者构建并修改此应用以满足您的需求,可以在 Google Data API Java 客户端库mashups/eventpub 目录下找到此应用。此外,欢迎您在 Google Data API 开发者论坛中针对本文提供反馈。如果您有与特定服务相关的问题,请在特定服务的讨论组中发帖提问。

附录

其他资源