扩展 IBM Mashup Center 的数据范围

简介

通过使用 IBM Mashup Center,可以快速轻松地 “混合(mashup)” 数据和服务,并在网页上组合信息。可以通过 IBM Mashup Center 的 InfoSphere MashupHub 提供的默认插件使用许多企业数据源。但是在某些情况下,希望使用组织特有的新数据源。InfoSphere MashupHub 提供一个可扩展的插件模型,您和合作伙伴可以通过这个模型扩展数据和服务的范围。

要想从本文获得最大的收获,您应该相当熟悉 IBM Mashup Center 并具备一些 Java 和 JSP 经验。关于 IBM Mashup Center 的更多信息,请查阅 IBM Mashup Center 网页

本文将讨论 HelloWorld(hellodemo)示例插件并修改它来实现一个基本的语言翻译服务,从而介绍 IBM Mashup Center 扩展的关键方面。在本文中,还要使用 Google 提供的轻量翻译服务,这个服务可以翻译最长 500 字节的文本。关于这个翻译服务的细节可以在 Google AJAX Language API Developer's Guide 中找到。在本文中,将使用三个主要参数调用这个服务:

  • 要翻译的文本
  • 源语言
  • 目标语言

这个翻译服务以 Javascript. Object Notation(JSON)格式返回结果。InfoSphere MashupHub 示例插件将把结果转换为一个 Atom feed。

什么是插件?

InfoSphere MashupHub 提供一个插件接口,这个接口定义的方法用来生成 feed、访问插件元数据以及把服务器端插件实例连接到客户端 Javascript。关于接口规范的详细信息可以在产品安装目录中的 \Hub\installedApps\Mashup Hub.ear\mashuphub-enterprise.war\client\doc\userdoc\MashupHubAPIRef.pdf 中找到,也可以从 IBM MashupHub API Reference 下载。

本文没有深入探讨这个插件 API。图 1 是取自以上规范的关系模型图。


图 1. 插件 API 关系模型
插件 API 关系模型

这个插件模型主要用来创建新的数据源类型,当用户创建新的 feed 时会看到新类型。新安装的 IBM Mashup Center(见图 2)不包含标签为 “Translation” 的选项。但是,后面会演示如何把翻译服务添加为 feed 数据源。


图 2. 生成新的 feed 源对话框
生成新的 feed 源对话框

插件必须处理两个任务:

  • feed 创建:指定义 feed 所需的代码。
  • feed 生成:指在调用时实际产生数据和格式所需的代码。


Hello World 示例 feed 创建分析

首先,在 \Hub\installedApps\Mashup Hub.ear\mashuphub-enterprise.war\client\doc\pluginsamples 中找到 hellodemo 示例。在看到 HelloWorld 示例时,会有以下文件:

  • HelloViewBean.java
  • HelloEditor.java
  • HelloGenerator.java
  • AtomGenerator.java
  • hello.zip

任何 InfoSphere MashupHub 插件都有两个主要操作:一个用来创建 feed,另一个用来生成 feed。AtomGenerator.java 和 HelloGenerator.java 实现 feed 生成,其他文件(package.xml 除外,这个文件是整个插件的元数据)实现 feed 创建。

hello.zip 文件需要一种特定的目录结构。把 hello.zip 复制到 \Hub\installedApps\Mashup Hub.ear\mashuphub-enterprise.war\WEB-INF\plugins 并重新启动 Web 应用服务器,以部署这个文件。InfoSphere MashupHub 的所有第三方插件都必须使用这种目录结构。hello.zip 文件包含以下文件:

  • package.xml
  • hello.jsp
  • 以上 Java 源代码文件编译产生的 .class 文件
  • 图标文件

我们先看看 package.xml 文件,然后讨论插件代码的实现。

package.xml 文件


图 3. Hello 示例 package.xml 文件
Hello 示例 package.xml 文件

下面解释 package.xml 文件的关键元素:

  • Name:用于用户选择 New Feed 之后显示的选项列表。
  • Author:插件作者的姓名。
  • Version:这个插件的版本号,用来识别插件的最新版本。
  • Category:指定应该在哪个子列表下面显示这个插件。当前的有效类别是 departmental 和 enterprise。
  • Editor:指定提供插件编辑器界面的类。
  • Generator:指定提供插件生成器界面的类。
  • Description:这个插件的简要描述。
  • 图标路径指定装载插件图标的位置。

图 4 是翻译服务的 package.xml 文件示例:


图 4. 翻译插件的 package.xml 文件
翻译插件的 package.xml 文件

HelloEditor 类

HelloEditor 扩展基类 BaseEditorPlugin,这要求实现 renderEditor 方法。这是一个重要的框架钩子,可以通过它为创建和定制 feed 实例所需的输入参数定义用户界面。

在这里,有一个输入参数,它是将放到 feed 中的简单文本字符串。但是,为了提示用户,要设置一个 ViewBean 并把它添加到一个表单和一个 frame. 中,然后把它传递回框架以便在用户界面中显示。我们要为用户构建一个简单的对话框,所以还要设置几个标准的标签和标题。

注意,表单上要设置一个名为 “saveParam” 的回调函数。这个回调函数可以在用户单击 Submit 之后处理用户输入。本文后面会详细讨论这个主题。


图 5. Hello 插件中的 renderEditor 方法定义
Hello 插件中的 renderEditor 方法定义

HelloViewBean 类

HelloViewBean.java 中的代码见图 6。


图 6. Hello 插件中定义的 HelloViewBean 方法
Hello 插件中定义的 HelloViewBean 方法

ViewBean 负责提供 JSP 文件(在这里是 hello.jsp)的路径,框架使用这个文件显示实际的输入控件。ViewBean 还可以传递由 JSP 使用的额外数据(比如可用选项的动态列表),但是这个简单示例不需要传递任何额外数据。在多屏幕向导式界面中,可以使用后缀为每个屏幕提供惟一的 ID。但是,这对于这个 HelloWorld 示例没什么意义,因为只有一个屏幕。

对于本文,只需要考虑两段代码。第一段是 getJSPPath 方法,第二个是反映新名称的 suffix 属性(用于更复杂的向导)。JSPPath 指定用来显示编辑器的 JSP 文件。这个 JSP 文件提供创建插件时所用的 HTML 用户界面。图 7 给出 Hello World 插件的 JSP 文件的显示结果。


图 7. Hello 插件编辑器
Hello 插件编辑器

对于翻译插件,只需对这个文件做两处修改:修改 suffix 和 JSP 文件名,反映翻译时要调用的 JSP 文件。


图 8. 翻译插件中的 ViewBean 类定义
翻译插件中的 ViewBean 类定义

hellodemo.jsp 文件

肯定可以编写比图 9 复杂得多的 JSP 文件,但是这个文件说明了几个重要问题。这个用户界面非常简单,只有一个标签和两个表单控件:一个复选框和一个文本框。控件中使用的 HTML ID(hellotext 和 prompt)被传递给 saveParams 方法。复选框决定每次运行 feed 时是否向用户提示 hellotext 字符串。


图 9. Hello 插件中的 Hello.jsp 类定义
Hello 插件中的 Hello.jsp 类定义

因为在翻译服务中要使用三个参数,所以要建立一个文本框(用来输入要翻译的文本)和两个选择列表(用来选择源语言和目标语言)。只有以后需要使用已创建的 feed 时,才有必要提示翻译文本。下面是翻译服务的 JSP 文件。注意,三个表单输入分别名为 “transtext”、“languagein” 和 “languageout”;后面处理表单时要引用这些输入。

参见副文件中的 清单 1. 翻译插件中的 translate.jsp 类定义

图 10 显示翻译服务编辑器的外观。


图 10. 翻译插件编辑器
翻译插件编辑器

需要保存这个 feed 的参数,以便在生成器中使用它们。在用户单击 Submit 之后,saveParam 回调函数读取并保存用户输入。现在看看 HelloEditor 类。图 11 给出 hello 示例中的 saveParam 回调函数,这个方法保存一个简单的字符串。


图 11. Hello 插件中的 saveParam 方法定义
Hello 插件中的 saveParam 方法定义

通过 RequestData 对象获取输入(来自 hello.jsp 表单中的 “hellotext” 控件)。创建一个参数对象并把默认值设置为用户输入。产品中的 Javadoc 描述了这个参数对象的方法。把这个对象添加到条目对象中,条目对象保存信息。还为 feed 生成一个惟一的 URL 并把这个 feed 和 URL 发布到 IBM Mashup Center 中。

看一下以 HelloEditor 类作为基础的 TranslateEditor 类。对于用户界面,renderEditor 只把 “Hello” 引用改为对翻译文本的引用。因为增加了参数,saveParam 方法要复杂一些。添加三个参数 “transtext”、“languagein” 和 “languageout”,它们依次直接对应于 JSP 文件输入。这些参数都是非可选的字符串。如清单 2 所示,只有在没有提供值的情况下,才会提示 transtext 参数。每个参数的默认值都基于来自 JSP 文件的用户输入。表 1 列出每个参数的显示名和帮助文本。


表 1. 翻译插件的参数

参数名 显示名 帮助文本
Transtext Text to Translate Enter text to Translate
Langaugein Language In Select language
Languageout Language Out Select language to translate

参见副文件中的 清单 2. 翻译插件中的 saveParam 方法定义

当然,需要在条目中添加三个参数,为 feed 源生成一个惟一的 URL 并把 feed 源发布到 InfoSphere MashupHub。为了帮助您了解翻译插件的外观以及文本在页面上的位置,图 12 给出产生的屏幕的快照,其中显示翻译插件的参数的提示。


图 12. 翻译插件提示
翻译插件提示

用来创建 feed 的用户界面的代码已经完成了。现在需要生成实际 feed 的代码。

Hello World 示例 feed 生成分析

本节讨论 Hello 示例中的最后两个 Java 文件:AtomGenerator.java 和 HelloGenerator.java。这些文件根据用户输入生成一个 Atom feed。

HelloGenerator 类

HelloGenerator 类扩展 BaseGeneratorPlugin 并实例化一个包含 generateFeed 方法的 FeedContent 对象。


图 13. Hello 插件中的 HelloGenerator 类定义
Hello 插件中的 HelloGenerator 类定义

AtomGenerator 类

AtomGenerator 类负责生成实际 feed 的主要工作。正如下面可以看到的,提供的示例中代码并不太多。下面使用 Abdera 库,因为它提供 IETF Atom Syndication Format 和 Atom Publishing Protocol 标准(RFC 4287 和 5023)的实现。Abdera 的文档可以在 Apache Wiki 上找到,还可以在 Apache 网站 找到 JavaDoc。下面的代码为 user、title、subtitle、URL 和 hellotext 设置基本字符串。在运行时,可以接收 feed 参数,在这里捕捉 hellotext 参数并把它包含在 Hello World feed 的结果中。然后实例化一个 Abdera 类,这样便于设置 feed 的 ID、title、subtitle 和 generator。然后使用 abdera.getFactory.newEntry 在 feed 中添加一个条目,并设置这个条目的 title、ID、updated、author 和 summary 字段。title 是放置参数数据的地方。现在可以添加这个条目并返回 feed。


图 14. Hello 插件中的 generateAtomDocument 方法
Hello 插件中的 generateAtomDocument 方法

TranslateGenerator 类是一个非常简单的实现,所有代码都与 HelloGenerator 代码相同,见图 15。


图 15. 翻译插件中的 TranslateGenerator 定义
翻译插件中的 TranslateGenerator 定义

现在看看如何修改翻译服务的 AtomGenerator。源服务产生 JSON,而我们需要产生 XML。可以使用 InfoSphere MashupHub 提供的 JSON4J 支持。JSON4J.jar 的文档可以在 IBM Information Center 中找到。在构建自己的插件时,还可以利用这个文档了解 MashupHub 中库的功能。如果代码要依赖这些库,可以把 jar 添加到 \Hub\installedApps\Mashup Hub.ear\mashuphub-enterprise.war\WEB-INF\lib 中的库文件夹。现在看看清单 3。可以下载本文提供的源代码,打开自己喜欢的编辑器并查看 AtomGenerator 文件。

参见副文件中的 清单 3. 翻译插件中的 generateAtomDocument 方法定义

先从 generateAtomDocument 方法开始,这个方法与 hellodemo 示例中的方法相似,其中为 user、title、subtitle、URL 和参数(transtext、languagein 和 languageout)设置字符串。然后把参数捕捉到这些字符串中。这个翻译服务要求源语言和目标语言用 “|” 字符连接起来。在第 106 行上,把字符串 resultingtext 赋值给 getTranslation 方法的结果。这个方法使用 languagepair 和 transtext 字符串产生结果(应该是正确的译文)。然后生成 feed,结果放在这个 feed 的惟一条目的标题中。

在下面的代码中,getTranslation 方法获取前面提到的参数字符串。使用这些参数构建一个 URL。按照 GET 方法通过 HTTP 使用这个 URL 连接 ajax.googleapis.com。这个 Google 服务要求设置 referrer 头,这在第 50 行上完成。到编写本文时,这个服务只支持 GET 方法。把 GET 方法的结果放到 StringBuffer strBuff 中。

参见副文件中的 清单 4. 翻译插件中的 getTranslation 方法定义

使用 JSON4J 方法解析 JSON 结果。预期的结果采用 JSON 格式,见清单 5(这是请求把 “Hello, World” 翻译为意大利语的结果)。注意,结果实际上是嵌套的,这要求执行解析方法两次。然后把 responseData 对象中的文本返回给 generateAtomDocument 方法(这个方法完成 feed)。


清单 5. Google 翻译服务的响应示例

{"responseData": {
    "translatedText":"Ciao mondo"
 },
 "responseDetails": null, "responseStatus": 200}

现在,要构建文件并把它们部署到 InfoSphere MashupHub 和 IBM Mashup Center 中。

构建和部署

为了构建示例,需要在机器上安装 Java 5 JDK,还需要在类路径中包含 InfoSphere MashupHub 库。如果 IBM Mashup Center 不是安装在默认位置,那么需要修改第一行来反映它的位置。清单 6 是一个帮助构建 hellodemo 示例插件的脚本。

参见副文件中的 清单 6. Hello 插件的构建命令

清单 7 构建刚才创建的翻译服务插件。

参见副文件中的 清单 7. 翻译插件的构建命令

构建了这些插件之后,就要部署它们。按照下面的目录结构为 hellodemo 创建 ZIP 文件。


图 16. Hello 插件的 ZIP 文件的内容
Hello 插件的 ZIP 文件的内容

以相同的方式为翻译插件创建 ZIP 文件。


图 17. 翻译插件的 ZIP 文件的内容
翻译插件的 ZIP 文件的内容

要想在 IBM Mashup Center 中部署插件,只需把 translate_deploy.zip(或 hello_deploy.zip)复制到 \Hub\installedApps\Mashup Hub.ear\mashuphub-enterprise.war\WEB-INF\plugins 中,然后重新启动 Web 应用服务器。还需要重新启动 IBM Mashup Center 的应用服务器,才能看到这些修改。

这是首选方法。此外,还可以把文件复制到特定位置。如果希望使用批处理方法,可以使用附录 A 中的批处理脚本。


结束语

我们讨论了示例代码,并以此为基础开发了一个非常有用的翻译服务。由于主要使用 IBM Mashup Center 中的代码,这个过程非常快。现在可以使用这些 feed 和服务构建出执行轻量翻译的 Mashup。建议您看看 下载 中提供的使用翻译服务的演示程序。您现在掌握了扩展 IBM Mashup Center 数据范围的基本工具,可以利用它们满足自己的需要。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15082138/viewspace-594518/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15082138/viewspace-594518/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值