简介:GridSphere 门户框架
在上一年,基于 Portlet 的门户已成为门户服务器平台的最令人兴奋的领域之一。Java Specification Request (JSR)168(即 portlet API)的出现将允许门户供应商提供公共编程模型,该模型允许开发人员更快地将新功能插入到门户服务器中,消费者可以轻松地使用这些功能。现在,许多门户供应商支持 portlet,包括 IBM WebSphere、Sun One Portal Server、Oracle 9iAS 和 Jakarta Jetspeed 项目。
GridSphere 门户 提供一个基于 portlet 的高级开放源代码门户。GridSphere 是在欧盟提供基金的 GridLab 项目 下开发的,提供了一个非常复杂的门户,该门户为各种终端用户提供高度定制的环境。portlet 模型向用户提供了一个灵活易用的接口,并向门户开发人员提供了一个模型,用于创建可插入的和动态的应用程序支持。下面简要列出核心的 GridSphere 特性:
Portlet API 的实现与 IBM WebSphere Portal Server 4.2 或更高版本紧密兼容。
易于开发并易于与插入到 GridSphere portlet 容器中的“第三方 portlet”集成。
级别更高的模型,用于使用可视的 bean 和 GridSphere User Interface (UI) 标签库构建复杂的 portlet。
灵活的基于 XML 的门户表示描述,可以轻松对其进行修改来创建自定义的门户布局。
对基于角色的访问控制(Role Based Access Control,RBAC)提供内置的支持,RBAC 将用户分为 guest、user、admin 和 super user。
复杂的服务模型,允许创建“用户服务”,可以按照用户权限限制服务方法。
通过 Hibernate for RDBMS 数据库支持提供数据的持久性。
为 portlet 服务的服务端测试集成了 Junit/Cactus 单位测试,包括生成测试报告。
GridSphere 核心 portlet 提供基本功能,包括登录、注销、用户和访问控制管理。
由于 GridSphere portlet API 几乎与 WebSphere portlet API 完全相同,所以您应该多看看 developerWorks 文章,这些文章在 参考资料 和 IBM WebSphere Portal Zone 中列出。在理论上,使用 IBM WebSphere Portal Server 开发本文中的示例 portlet 应该不难。GridSphere API 与 JSR Portlet API 1.0 最后的规范非常类似,gridSphere 的将来版本是符合 JSR 168 的。
GridSphere 项目
GridSphere Web 站点提供关于开发 portlet 的附加文档、有关使用 GridSphere 的信息和其他资源的集合。要获得这些信息,请加入 GridSphere 邮件列表中。
当前的 GridSphere 版本提供了一个门户、一个 portlet 容器和一组有用的核心 portlet,包括用户和组管理以及布局定制和 portlet 订阅。
安装 GridSphere
从 http://www.gridsphere.org 下载最新的 GridSphere 版本并按照指示安装该门户。前提条件是您必须在系统中安装了 Java 技术 Ant 和 Tomcat 4.1.X servlet 容器。安装了 GridSphere 后,可以只启动 Tomcat,然后在 Web 浏览器中,单击 http://127.0.0.1:8080/gridsphere/gridsphere 查看该门户。初始配置允许您以“root”身份登录,而且不用输入口令。登录后,转至 Administration-Users 选项卡,单击 root 用户来编辑配置文件。更改口令和其他设置,包括您的登录名和电子邮件地址。登录后,您就成为 GridSphere 门户管理员。
图 1. GridSphere 用户管理器 portlet
网格服务简介
在提供对用户的虚拟组织(Virtual Organization,VO)内的计算资源和数据资源的安全统一访问方面,门户正变得越来越复杂,所以网格 portlet 必须依靠某种类型的中间件来执行这些操作。开放网格服务基础设施(Open Grid Services Infrastructure,OGSI)规定如何创建网格服务,而 OGSI 是整体开放网格服务体系结构(Open Grid Services Architecture,OGSA)的一部分。Globus Toolkit 3.0 (GT3) 提供了 OGSI 的 Java 参考实现。GT3 提供了强制性网格服务特性,如服务调用、生存期管理、服务数据接口、依赖底层公钥基础设施(Public Key Infrastructure,PKI)的安全接口。网格服务扩展了 Web 服务,因此在实际中,编程模型很相似。
简而言之,使用 GT3 创建网格服务的步骤如下所示:
创建定义服务接口的 WSDL 接口。可以采用工具转换采用 Java 或 C 语言编写现有接口以生成 WSDL。
使用 GT3 工具从 WSDL 服务器接口生成客户机和服务器存根(stub)。
填写服务器骨架(skeleton)实现代码。
配置服务部署描述符并部署服务到宿主容器。
幸运的是,GT3 与一组供我们使用的示例服务绑定在一起。因此,我们将集中讨论使用现有服务和现有的客户机存根代码来访问服务。 幸运的是,您下载的 Tomcat 服务器还可以充当 OGSI 网格服务宿主环境,允许 GridSphere 门户框架和 OGSA GT3 示例服务一起运行。
下一节准备开发示例 portlet,您应从 Globus Web site 下载最新的 GT3 版本。要构建示例并部署到 Tomcat 容器中,请发出下列命令,其中 $CATALINA_HOME 设置为下载 Tomcat 的位置。
% ant
% ant samples
% ant -Dtomcat.dir=$CATALINA_HOME deployTomcat
现在,由于示例 portlet 需要一些 GT3 类,所以需要将 OGSA Web 应用程序的库复制到 portlet 可以找到的 Tomcat 共享库目录。
% cp $CATALINA_HOME/webapps/ogsa/WEB-INF/lib/*.jar $CATALINA_HOME/shared/lib/
根据 GT3 User's Guide(请参阅“参考资料”),最后一步是将下列条目添加到 $CATALINA_HOME/conf/web.xml 中,配置 Tomcat 以接受 WSDL、GWSDL 和 XSD 文件扩展名:
<mime-mapping
<extensiongwsdl</extension
<mime-typetext/xml</mime-type
</mime-mapping
<mime-mapping
<extensionwsdl</extension
<mime-typetext/xml</mime-type
</mime-mapping
<mime-mapping
<extensionxsd</extension
<mime-typetext/xml</mime-type
</mime-mapping
编写网格计数器服务 portlet
在网格 portlet 示例中,我们使用 Globus Toolkit 提供的示例 OGSI 计数器服务编写一个简单的加减数字的 portlet。计数器服务表示为 CounterPortType,它是基 GridService 接口的子类,有三个方法,如下面的图 2 所示:
图 2. 计数器服务的 UML 图
add(int a) 和 subtract(int b) 方法添加或减去提供的值并返回新值。getValue() 方法只返回静态计数器值的当前结果。
1. 编写 portlet
在计数器 portlet 示例中,用户可以输入整数值,然后单击 "Add" 或 "Subtract" 按钮加上或减去计数器服务的值,并显示已更新的计数器值。
当第一次实例化 portlet 时,init() 方法被调用,向该 portlet 提供由任何后续 portlet 请求使用的所有必需的初始信息或配置信息。portlet 编程模型将表示(portlet 的呈现)和逻辑(当某个动作发生时必须执行的操作)分为不同的 portlet 方法。portlet 容器负责调用 doView() 呈现方法来显示 portlet,并在 portlet 收到事件(如按钮单击或表单提交)时,负责调用 actionPerformed() 方法。Portlet 可以向用户提供几种模式,包括 Edit、Configure 或 Help,从而向用户提供特定模式的接口。portlet 必须提供适当的呈现方法,如 doEdit 用于支持编辑模式。对于熟悉 servlet 的人员而言,portlet 开发非常相似,只是 servlet 的 doGet 或 doPost() 方法由 actionPerformed() 和 doXXX() portlet 方法取代。portlet 编程和 servlet 编程的另一个显著差别在于 PortletResponse、PortletConfig 和 PortletContext 类的使用,这些类在现有的由 Java Servlet API 提供的 HttpServletRequest、HttpServletResponse、ServletConfig 和 ServletContext 类的基础上装饰(也就是提供)了附加的功能。
最终的 portlet 如下所示:
清单 1. 计数器服务 portlet
public class GridCounterPortlet extends AbstractPortlet {
public static final String VIEW_JSP = "/jsp/ogsa/counter/view_counter.jsp";
// Create a URL for the counter service
private static final String counterUrl =
"http://127.0.0.1:8080/ogsa/services/samples/counter/basic/CounterFactoryService";
private LocatorType locator = null;
private CounterPortType counter = null;
public void init(PortletConfig config) throws UnavailableException {
super.init(config);
try {
// Create a grid service handle from the service URL
URL GSH = new URL(counterUrl);
// Get a reference to the CounterService Factory
OGSIServiceGridLocator gridLocator = new OGSIServiceGridLocator();
Factory factory = gridLocator.getFactoryPort(GSH);
GridServiceFactory counterFactory = new GridServiceFactory(factory);
// Create a new CounterService instance and get a refe