|
目标读者
本文读者应具备一定的 WebSphere Portal 使用和管理经验,同时还应具备编写 JACL 脚本的基本知识。
Portal Scripting Interface 是 IBM WebSphere Portal 提供基于 JACL 的脚本管理接口。本文以具体 JACL 脚本为例,向您介绍如何通过 Portal Scripting Interface 编写 WebSphere Portal 管理脚本。
如何运行 Portal Scripting Interface
Portal Scripting Interface 是 WebSphere Portal Server 提供的基于 JACL 的管理程序。在 WPS_HOME/bin 下有一个脚本程序 wpscript.bat(非 windows 平台对应于 wpscript.sh),它就是 WebSphere Portal 的脚本管理接口。wpscript.bat 需要在命令行下运行,有两种方式使用 Portal Scripting Interface:
-
交互方式:在命令行下一边输入 JACL 脚本一边解释运行,比较适用于一些简单的和一次性的操作;
-
提交脚本方式:事先编写好 JACL 脚本,然后将 JACL 脚本文件名作为命令行的参数传入执行,适用于复杂操作和需要重复执行的操作。
wpscript.bat 调用方式如下所示:
清单 1 运行Portal Scripting Interface
wpscript.bat –conntype <conntype> -port <port> -user <admin_id>
-password <password> -f <jacl filename>
|
下面我们对以上命令中所使用的参数做出说明:
-
-conntype:连接方式,可选参数,默认为 SOAP;
-
-port: 连接端口,对应于 wpconfig.properties 中的 WpsSoapPort 属性值;
-
-user 和 -password:用于创建连接的用户名和密码;
-
-f:JACL 文件的路径名,如果通过交互方式,省略这个参数。
打开 wpscript.bat,可以看到它的内容很简单,传入一些参数调用 wsadmin。wsadmin 是 WebSphere Application Server 的脚本管理接口,支持 JACL 和 Perl 脚本。wpscript.bat 是对 wsadmin 的扩展,传入 Portal 管理对象,在 JACL 脚本里通过对 Portal 管理对象的方法调用实现对 WebSphere Portal Server 的管理。
PSI 为用户提供了如下几个 Portal 管理对象:
-
Portal:Portal 登录接口
-
Content:内容组织管理接口
-
Layout:页面布局接口
-
Portlet:Portlet 管理接口
-
Look:Portal 外观主题管理接口
-
Access 和 PacList:这两个对象一起实现对 Portal 的 ACL 控制
本文不是 Portal Scripting Interface 的参考手册,因此只对示例中用到的对象和方法进行介绍。其他对象和方法可参考WebSphere Portal 信息中心,或者在 wpscript.bat 中使用 help 方法。
获取帮助
Portal Scripting Interface 提供了强大的帮助功能,通过 wpscript.bat 登录后,调用对象的 help 方法可以快速获取帮助,如 $Content help,将返回 Content 对象的说明以及它所支持的所有方法,如果带方法名作为参数,将返回该方法的详细说明,如 $Content help search。
脚本示例介绍
本文将指导用户编写一个 JACL 脚本。在 Home 下创建一个标题为 Stock 的页面,然后将 WebSphere Portal 自带的 My Stock Portlet 部署到该页面上,最后对页面的权限进行设置,使普通用户不能访问该页面。
Portal Bean-在 JACL 中登录 Portal
Portal 对象提供了 Portal 登录认证的接口。登录 WebSphere Portal 需要提供用户名和密码,通过 JACL 脚本访问 Portal 也同样需要提供登录认证信息,只有先登录成功之后才能对 Portal 中的各种对象进行操作,这是每个实现 Portal 管理的 JACL 脚本首先必须要做的事情。
用文本编辑工具新建一个文件 stock.jacl 并输入如下内容:
清单 2 实现登录和退出 Portal
$Portal login <admin_id> <password>
$Portal logout
|
这已经是一个可以被 wpscript.sh 调用的 JACL 脚本了,只是简单的登录 Portal 然后再退出。JACL 支持命令行参数,我们可以把 Portal 登录信息通过命令行传入,这样 Portal 的用户名或密码变化后不用修改 JACL 脚本。修改后的脚本如下所示:
清单 3 从命令行接收登录 Portal 的用户名和密码
if { $argc != 2 } {
puts "Syntax: wpscript sample.jacl <username> <password>."
exit
}
set user [lindex $argv 0]
set pwd [lindex $argv 1]
$Portal login $user $pwd
$Portal logout
|
在后面的介绍中,将逐步扩充这个脚本,使它完成管理功能。
除了登录验证的接口外,Portal 对象还提供了 Virtual Portal 选择的接口,如下所示:
$Portal setvp <virtual portal>
通过这个方法用户可以指定要登录哪个 Virtual Portal。
Content Bean-管理 Portal 内容(页面,标签和 URL)
Content 对象负责 Portal 内容的管理,这里的内容指页面、标签和 URL。通过 Content 对象我们可以遍历 Portal 中的所有页面、标签和URL。定位到操作的页面后,还可以通过Content对象对页面进行创建、删除和修改等操作。比如,要在实现在某个页面上部署一个 Portlet,就必须先通过这个接口定位要部署 Portlet 的页面。
在使用这个对象前,我们必须先弄清楚 Portal 中的内容是如何的管理的。在 WebSphere Portal 中,内容被组织成树状结构,并以一个不存在的虚节点 root 为根。每一个页面、标签和 URL 都是树中的一个节点。每个节点都有一个全局唯一的标志,通过遍历和查找,可以访问内容树中的每一个节点。Portal 的内容组织可以通过 Web 方式进行浏览,如下图所示:
图 1 WebSphere Portal 内容组织结构
Content 对象提供的方法可分为以下几类:
-
遍历和搜索:快速准确的定位到要指定的节点;
-
属性:获取和设置节点的属性,如uniquename,commonname,language等;
-
生命周期:节点的创建,删除等;
-
组织结构:节点在整个组织树中的位置变更。
本文将结合例子只讲述搜索和生命周期管理的方法,其他可参考WebSphere Portal 信息中心。
搜索
在脚本中通常要对某些指定的节点进行操作,之前必须找到并选定这个节点。每个节点都由全局唯一的 uniquename 标志的。脚本接口提供了如下两类查询方式:
$Content search <type> <by> <value>
search方法是返回所有符合条件的节点列表。
$Content find <type> <by> <value>
find 是返回唯一一个符合条件的节点,如果符合条件的节点多于一个或者不存在,find 调用将失败。
type 是查询类型,可以是 page,label,url 等,或者不带 type 参数,返回符合条件的任意类型的节点。
By 是查询标准,下面是一些常用的查询标准。
-
id:全局唯一标志;
-
uniquename:全局唯一名称;
-
commonnameis: 节点的通用名称;
-
commonnamehas: 节点通用名称中含有特定字符串。
通过调用 $Content help search-types 可以获取查询标准列表。
此示例中我们要在 My Work 目录下创建页面,因此必须先找到 My Work 节点,如下所示:
$Content find label uniquenane "wps.My Portal.My Work" select
在最后加上 select 方法表示查找到这个节点后并选中这个节点,以后所有的操作都是针对这个节点。
Content 提供的搜索是针对事先指定的节点以及它的子节点树的,如果事先没有选中哪个节点,将从虚节点 root 开始搜索。
生命周期管理
Content 提供了创建和删除节点的方法。
创建节点:
$Content create <type> <name> <markup>
type 可以是 page,label,externalurl,分别表示创建页面、标签和 url。在 create 调用中还可以加上 public,private 等标志,表示创建的页面是公共的还是私有等。
以父节点页面为模板创建新页面:
$Content derive <name> from <id>
name 是新页面的名称,id 是父节点的 ID 值,只有父节点是共享的页面时才可以调用。
删除节点:
$Content delect <id>
继续扩充 stock.jacl,在 Home 下创建一个标题为 Stock 的新页面。
清单 4 在 Home 下创建名为 Stock 的新页面并选定
# 找到并选中Home,新页面的父节点将是Home。
$Content find label uniquename " ibm.portal.Home " select
# 创建标题为Stock的页面并选中
set thePage [$Content create page "Stock" html public]
$Content select $thePage
|
Portlet Bean-操作 Portlet
Portlet 对象提供了对 WebSphere Portal 中部署的 Portlet 的控制,它提供了对 Portlet 部署的层次结构的访问。通过 JACL 脚本访问某个 Portlet,必须先通过 Portlet 对象进行定位,然后才能进行相应的操作。
在 Portal Scripting Interface 中所有的 Portlet 也是以树状结构组织的,但与 Content 不同,Portlet 组织树有特定的结构。
-
Portlet 组织树也以一个不存在的 root 节点为根;
-
它的所有子节点是 web module,对应于 Portlet 所在的 war 包;
-
第二层是 application,对应于 war 中所包含的 portlet application;
-
第三层是 portlet,对应于 application中所包含的所有 portlet。
-
每个 web module 节点的结构同 portlet.xml 中的组织结构一致。
对于 Portlet 组织树结构,是在 Portlet 打包时决定的,不能通过 Portlet 对象进行修改。
Portlet 对象提供了两类方法,搜索遍历和属性操作,具体的方法调用同 content 对象类似。Portlet 查询支持这些类型:webmodule,application,portlet,concrete(portlet或application),abstract,all 或 any。具体的查询标准可以参考 $Portlet help search-criteria 的输出。
继续扩充我们的例子,我们要通过 Portlet 对象搜索到 My Stock Portlet。
清单 5 查找 My Stock Portlet
# 找到 My Stock Portlet
set pid [$Portlet find portlet cn "My_Stock"]
|
Layout Bean-实现 Portal 页面布局
Layout 对象提供了页面布局管理的接口。我们知道 Portal 里的页面是用来放置 Portlet 的,页面可以划分成多个区域,每个区域上放置一个 Portlet,Layout 对象正是提供了对应的管理接口,允许用户控制页面的区域划分和每个区域中部署的 Portlet。
要使用 Layout 对象,必须先通过 Content 对象选中某个页面,然后Layout对象才能生效并指向该页面,当 dselect 该节点后 Layout 对象就不可用了。
我们先来看看 portal 中对页面布局的管理,页面的布局中只允许两种类型的组件存在,container 和 control。
-
Container 里可以包含 container 和 control,与 html 中的 table 概念类似,相当于行和列,在 $Layout 中可以创建水平或垂直 container。
-
Control 是叶子节点,对应于 portlet。
下面是一个含有两个 portlet 的页面的布局结构。
图 2. 页面布局结构
Layout 对象提供了三类方法调用,
-
搜索和遍历,同 Content 类似,支持 container,control 和 all or any 查询标准;
-
属性操作,具体参考 Info Center;
-
生命周期管理,container 或 control 的创建和删除。
创建一个container:
$Layout create container <orientation>
创建一个control:
$Layout create control <portlet_id>
回到本文的例子,我们在页面上部署一个 Portlet。参照上面的例子,只需要在页面中创建一个 container,并在该 container 中创建一个 control,结构如下图所示:
图 3. 页面 Stock 布局结构
清单 6 在页面 Stock 上部署 My Stock Portlet
$Layout create container horizontal select
$Layout create control $pid
|
其中,$pid 是 My Stock Portlet 的 id。
Access Bean 和 PacList Bean-控制 Portal 对象 ACL
WebSphere Portal 提供了完备的权限管理,其中的每个对象(页面、Portlet 等)都有自己的访问控制列表,可以对每个对象单独设置哪些用户进行访问。Access 和 PacList 这两个对象提供了对 Portal 中这套完备的权限管理体系的访问接口。通过这两个对象提供的接口,用户在 JACL 脚本中,可以对任何一个可以被访问到的 Portal 对象(页面、Portlet 等)进行访问控制列表的设置。
访问权限控制对 Content 和 Portlet 有效,在做相应操作前必须先选中 Content 节点或者 Portlet。
Access 对象用于读写控制对象,在读出控制对象后由 PacList 对象进行操作,最后再由 Access 对象写入。基本步骤如下所示:
1. 通过 Access 对象获取指定对象的访问权限对象并载入 PacList 对象。
set acl [$Access getacl Content [$Content current]]
$PacList view acl 或 $PacList edit acl
2. 通过 PacList 提供的方法对访问权限对象进行操作,如 grant,block,unblock 等。
3. 通过 Access 对象将访问权限对象写回。
$Access setacl $acl
在本文的例子,普通用户不能访问页面 Stock,如下所示:
清单 7 设置页面 Stock 的访问控制
set acl [$Access getacl Content [$Content current]]
$PacList block User propagation
$PacList block User inheritance
$PacList block PrivilegedUser propagation
$PacList block PrivilegedUser inheritance
$Access setacl $acl
|
完整的脚本代码
至此对 Portal Scripting Interface 提供的管理对象介绍完毕,下面是本文例子的完整脚本,在 WebSphere Portal Server V6.0 中调试通过。
清单 8 完整的stock.jacl
# stock.jacl
if { $argc != 2 } {
puts "Syntax: wpscript stock.jacl <username> <password>."
exit
}
set user [lindex $argv 0]
set pwd [lindex $argv 1]
$Portal login $user $pwd
# 找到并选中Home,新页面的父节点将是Home。
$Content find label uniquename "ibm.portal.Home" select
# 创建标题为Stock的页面并选中
set thePage [$Content create page "Stock" html public]
$Content select $thePage
# 找到My Stock Portlet
set pid [$Portlet find portlet cn "My_Stock"]
# 在页面上部署My Stock Portlet
$Layout create container horizontal select
$Layout create control $pid
# 设置访问权限,普通用户不能访问该页
set acl [$Access getacl Content [$Content current]]
$PacList block User propagation
$PacList block User inheritance
$PacList block PrivilegedUser propagation
$PacList block PrivilegedUser inheritance
$Access setacl $acl
puts "The deployment of My Stock portlet succeeded."
$Portal logout
|
运行和结果
在命令行下运行 wpscript.sh,如下图所示:
图 4. 脚本运行结果
成功运行后,用管理员登录,结果如下所示:
图 5. 管理员登录后的Portal页面
用普通用户登录访问,在 Home 下看不到 Stock 页面,如下所示:
图 6. 普通用户登录后的Portal页面
结束语
本文对 Portal Scripting Interface 进行了简要的介绍,WebSphere Portal Server 通过这些对象提供了强大的管理接口,用户可以通过这些接口编写出功能强大的管理脚本。
|