為 WebSphere Portal 開發 JACL 管理指令碼

CloudSpace發表於2009-04-09

如何執行 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  -port  -user  
-password  -f 

下面我們對以上命令中所使用的引數做出說明:

  • -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 Bean-在 JACL 中登入 Portal

Portal 物件提供了 Portal 登入認證的介面。登入 WebSphere Portal 需要提供使用者名稱和密碼,通過 JACL 指令碼訪問 Portal 也同樣需要提供登入認證資訊,只有先登入成功之後才能對 Portal 中的各種物件進行操作,這是每個實現 Portal 管理的 JACL 指令碼首先必須要做的事情。

用文字編輯工具新建一個檔案 stock.jacl 並輸入如下內容:


清單 2 實現登入和退出 Portal
$Portal login  
$Portal logout

這已經是一個可以被 wpscript.sh 呼叫的 JACL 指令碼了,只是簡單的登入 Portal 然後再退出。JACL 支援命令列引數,我們可以把 Portal 登入資訊通過命令列傳入,這樣 Portal 的使用者名稱或密碼變化後不用修改 JACL 指令碼。修改後的指令碼如下所示:


清單 3 從命令列接收登入 Portal 的使用者名稱和密碼
if { $argc != 2 }  {
    puts "Syntax: wpscript. sample.jacl  ."
exit
}

set user [lindex $argv 0]
set pwd [lindex $argv 1]

$Portal login $user $pwd
$Portal logout

在後面的介紹中,將逐步擴充這個指令碼,使它完成管理功能。

除了登入驗證的介面外,Portal 物件還提供了 Virtual Portal 選擇的介面,如下所示:

$Portal setvp

通過這個方法使用者可以指定要登入哪個 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

search方法是返回所有符合條件的節點列表。

$Content find

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 可以是 page,label,externalurl,分別表示建立頁面、標籤和 url。在 create 呼叫中還可以加上 public,private 等標誌,表示建立的頁面是公共的還是私有等。

以父節點頁面為模板建立新頁面:

$Content derive from

name 是新頁面的名稱,id 是父節點的 ID 值,只有父節點是共享的頁面時才可以呼叫。

刪除節點:

$Content delect

繼續擴充 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

建立一個control:

$Layout create control

回到本文的例子,我們在頁面上部署一個 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  ."
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 通過這些物件提供了強大的管理介面,使用者可以通過這些介面編寫出功能強大的管理指令碼。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14789789/viewspace-586927/,如需轉載,請註明出處,否則將追究法律責任。

相關文章