WebSphere Portal Server 是 IBM 面向整合和協作的一個重要平台。WebSphere Portal Server 為用戶提供了三種管理方式:通過基於 Web 的方式管理 Portlet、XML Configuration Interface 和 Portal Scripting Interface。基於 Web 的管理 Portlet 方式需要用戶手動做各種操作,不能自動化管理操作,只適用於簡單的管理操作。XML Configuration Interface 需要用戶編寫 XML 配置文件,但該文件編寫比較麻煩並且缺乏流程控制,不夠靈活。Portal Scripting Interface 是從版本 5.1 引入的,並在版本 6.0 中得到了完善和增強,采用 JACL 方式來編寫管理腳本,相對前兩種方式,顯得更加的靈活。
目標讀者
本文讀者應具備一定的 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 的參考手冊,因此只對示例中用到的對象和方法進行介紹。
獲取幫助
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等;
生命周期:節點的創建,刪除等;
組織結構:節點在整個組織樹中的位置變更。
本文將結合例子只講述搜索和生命周期管理的方法。
搜索
在腳本中通常要對某些指定的節點進行操作,之前必須找到並選定這個節點。每個節點都由全局唯一的 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 通過這些對象提供了強大的管理接口,用戶可以通過這些接口編寫出功能強大的管理腳本。