通過單擊操作建立 IBM Lotus Web Content Management 站點結構

genusBIT發表於2009-12-30
轉自:http://www.ibm.com/developerworks/cn/lotus/wcm-structure/index.html

簡介

如果您使用 IBM Lotus Web Content Management 的話,一個經常出現的任務就是定義站點結構。這個任務本身是重複的並且十分耗時;您必須採取 10 多個不同的步驟來建立一個站點或站點區域。而且,站點結構被有意設計為不可移植;您無法將站點結構從一個伺服器上的某個庫匯出到另一個伺服器上的不同庫。 相反,您需要手動重新建立整個站點結構。

由於構成單一站點結構的站點和站點區域數可能會達到數千個,因此您需要一種方法來自動化完成站點結構的定義並使它易於遷移、匯出和匯入。在本文中,您將學習一種簡單的方法來將站點結構定義為一個 XML 檔案並進行相應的部署。

先決條件

您應當熟悉以下這些技術:

  • IBM WebSphere® Portal V6.0 和更高版本,以及它的管理和元件
  • IBM Lotus Web Content Management
  • XML

為 了演示如何在 Lotus Web Content Management 中建立站點結構且無需手動建立所有站點和站點區域,本文使用 Lotus Web Content Management API 和一個包含站點結構的 XML 檔案。您可以通過針對本文下載部分提供的 XML 模式對包含站點結構的 XML 檔案進行驗證來建立它。XML 模式將驗證結構和必要欄位來預防執行時錯誤。

您可以定義許多站點、站點區域和預設內容來在包含完整站點結構的 XML 文件中建立站點結構。首先,建立下面這些必要部件:

  • Lotus Web Content Management 庫
  • 將在站點結構中使用的編寫模板
  • 將在站點結構中使用的演示模板
  • 將在安全設定部分中使用的使用者
  • 將在編寫模板中使用的工作流、工作流操作和工作流階段

然 後,以 XML 檔案的形式定義站點結構,指定庫、站點、站點區域等等。為了確保提供的資訊足夠用於在 Lotus Web Content Management 中建立站點,XML 檔案根據本文下載部分提供的 XSD 檔案中定義的模式進行構建。XSD 檔案包含建立完整站點結構所需的所有驗證,以及包含某些欄位的預設內容。

您可以建立一個 JSP 元件來解析 XML 檔案並建立其中定義的站點區域。

實現

在這個小節中,我們將描述實現解決方案所需的步驟。我們首先將討論如何建立 XML 檔案和 XSD 檔案,隨後討論用於解析檔案的 JSP 元件。

XML 建立

XML 檔案包含建立站點結構的所有資訊。它包含庫名、站點結構、站點區域結構和預設內容。需要在與您的需求相對應的結構中建立一個 XML 檔案。參見清單 1 中的 XML 示例,它與圖 1 所示的站點結構相對應。


圖 1. 站點結構
站點結構

站點結構由一個站點區域組成;這個站點區域反過來又由另一個站點區域組成。


清單 1. 建立站點結構所使用的 XML 示例
xsi:noNamespaceSchemaLocation="SiteCreation.xsd">




auth_news
pt_newsDetail



[all authenticated portal users]
anonymous portal user




Default_News
Default_News
auth_news

txt_headline
Headline for default Content


rtf_body
Body for the default Content




Default_News
Default_News
auth_news

txt_headline
Headline for default Content


rtf_body
Body for the default Content





Default_News




auth_news
pt_newsDetail



[all authenticated portal users]
anonymous portal user




文件選項

未顯示需要 JavaScript. 的文件選項

<!-- document.write(''); //--&gt <!-- document.write(''); //--&gt
將印表機的版面設定成橫向列印模式

列印本頁

將印表機的版面設定成橫向列印模式

列印本頁

將此頁作為電子郵件傳送

將此頁作為電子郵件傳送

將此頁作為電子郵件傳送

將此頁作為電子郵件傳送

討論

樣例程式碼

英文原文

英文原文


級別: 中級

Hebba Soliman, 高階軟體工程師, IBM
Ahmed Khairy, IT 專家, IBM

2009 年 12 月 29 日

瞭解一種使您能夠以自動化方式在 IBM® Lotus® Web Content Management 中定義站點結構的簡單解決方案。這個解決方案使您能夠節省花在既耗時又沉悶的任務上面的時間。

編輯注:您很精通這個主題嗎?希望分享您的經驗嗎?請馬上加入到 IBM Lotus 軟體 wiki 專案。

Lotus Web Content Management wiki

簡介

如 果您使用 IBM Lotus Web Content Management 的話,一個經常出現的任務就是定義站點結構。這個任務本身是重複的並且十分耗時;您必須採取 10 多個不同的步驟來建立一個站點或站點區域。而且,站點結構被有意設計為不可移植;您無法將站點結構從一個伺服器上的某個庫匯出到另一個伺服器上的不同庫。 相反,您需要手動重新建立整個站點結構。

由於構成單一站點結構的站點和站點區域數可能會達到數千個,因此您需要一種方法來自動化完成站點結構的定義並使它易於遷移、匯出和匯入。在本文中,您將學習一種簡單的方法來將站點結構定義為一個 XML 檔案並進行相應的部署。





回頁首


先決條件

您應當熟悉以下這些技術:

  • IBM WebSphere® Portal V6.0 和更高版本,以及它的管理和元件
  • IBM Lotus Web Content Management
  • XML

為 了演示如何在 Lotus Web Content Management 中建立站點結構且無需手動建立所有站點和站點區域,本文使用 Lotus Web Content Management API 和一個包含站點結構的 XML 檔案。您可以通過針對本文下載部分提供的 XML 模式對包含站點結構的 XML 檔案進行驗證來建立它。XML 模式將驗證結構和必要欄位來預防執行時錯誤。

您可以定義許多站點、站點區域和預設內容來在包含完整站點結構的 XML 文件中建立站點結構。首先,建立下面這些必要部件:

  • Lotus Web Content Management 庫
  • 將在站點結構中使用的編寫模板
  • 將在站點結構中使用的演示模板
  • 將在安全設定部分中使用的使用者
  • 將在編寫模板中使用的工作流、工作流操作和工作流階段

然 後,以 XML 檔案的形式定義站點結構,指定庫、站點、站點區域等等。為了確保提供的資訊足夠用於在 Lotus Web Content Management 中建立站點,XML 檔案根據本文下載部分提供的 XSD 檔案中定義的模式進行構建。XSD 檔案包含建立完整站點結構所需的所有驗證,以及包含某些欄位的預設內容。

您可以建立一個 JSP 元件來解析 XML 檔案並建立其中定義的站點區域。





回頁首


實現

在這個小節中,我們將描述實現解決方案所需的步驟。我們首先將討論如何建立 XML 檔案和 XSD 檔案,隨後討論用於解析檔案的 JSP 元件。

XML 建立

XML 檔案包含建立站點結構的所有資訊。它包含庫名、站點結構、站點區域結構和預設內容。需要在與您的需求相對應的結構中建立一個 XML 檔案。參見清單 1 中的 XML 示例,它與圖 1 所示的站點結構相對應。


圖 1. 站點結構
站點結構

站點結構由一個站點區域組成;這個站點區域反過來又由另一個站點區域組成。


清單 1. 建立站點結構所使用的 XML 示例
xsi:noNamespaceSchemaLocation="SiteCreation.xsd">




auth_news
pt_newsDetail



[all authenticated portal users]
anonymous portal user




Default_News
Default_News
auth_news

txt_headline
Headline for default Content


rtf_body
Body for the default Content




Default_News
Default_News
auth_news

txt_headline
Headline for default Content


rtf_body
Body for the default Content





Default_News




auth_news
pt_newsDetail



[all authenticated portal users]
anonymous portal user






圖 2 展示了 XML 元素和實現解決方案後生成的輸出之間的樣例對映。


圖 2. XML 與 Lotus Web Content Management 物件和區段之間的對映
XML 與 Lotus Web Content Management 物件和區段之間的對映

如您所見,實際站點結構與 XML 檔案之間的對映非常簡單,具有一個表示庫的根元素。這個根元素隨後包含另一個與站點對應的元素,定義它的名稱並顯示名稱。站點區域以巢狀方式在 XML 檔案中定義,用於獲得必需的站點結構。

每個站點和站點區域都包含一個設定區段,其中包含安全設定和模板對映區段。下面是必須加以考慮的限制因素:安全設定和模板對映可以在各自的元素或樹中的最高階別的站點或站點區域中針對每個站點或站點區域建立,並且其子元素將從父元素中繼承。

內容安全設定和工作流被新增到編寫模板元件中,而不是 XML 檔案中的預設內容區段中。

模板對映和預設內容建立中使用的編寫模板和演示模板必須提前建立。

通過定義預設內容的名稱,預設內容可以在多個站點區域中重用。當您在 XML 檔案中定義了完整的預設內容元素後,您可以通過定義一個只包含名稱元素的預設內容標記來使用它。如果預設內容已經存在於庫中,也可以使用在多個不同位置重用預設內容這一特性。





回頁首


XML 模式驗證

如前所述,為了避免丟失 Lotus Web Content Management 用於站點建立的資料,您需要使 XML 檔案遵從一個 XSD 檔案。這種遵從性可以保證表 1 中列出的驗證是有效的。


表 1. XML 模式元素/屬性驗證
元素元素/屬性型別有效範圍
LibrarySites 元素0..nNA
LibraryName屬性必要字串
SiteSiteArea元素0..nNA
SiteName屬性必要字串
SiteDisplayName屬性可選字串
SiteSettings元素可選NA
SiteAreaSiteArea元素0..nNA
SiteAreaName屬性必要字串
SiteAreaDisplayName屬性可選字串
SiteAreaSettings元素可選NA
SiteAreaDefaultContent元素可選NA
DefaultContentName元素必要NA
DefaultContentDisplayName元素可選NA
DefaultContentAuthoringTemp元素可選(如果已定義了項的話)NA
DefaultContentTextComponent元素0..nNA
DefaultContentRichTextComponent元素可選NA
TextComponentFieldName元素必要(像在編寫模板中一樣引用 Lotus Web Content Management TextComponent 欄位名)NA
TextComponentTextComponent元素必要NA
TextComponentFieldName元素必要(像在編寫模板中一樣引用 Lotus Web Content Management RichTextComponent 欄位名)NA
TextComponentTextComponent元素必要NA
SettingsTemplateMapping元素0..nNA
SettingsSecuritySettings元素可選NA
TemplateMappingAuthoringTemp元素必要(引用 Lotus Web Content Management 編寫模板名)NA
TemplateMappingPresentationTemp元素必要(引用 Lotus Web Content Management 演示模板)NA
SecuritySettingsAccessRight元素0..nNA
AccessRightType屬性必要addReadAccessMembers/
addEditAccessMembers
or
addDeleteAccessMembers
AccessRightAccess元素1..nNA

JSP 元件

您 已經在一個遵循 XSD 的 XML 檔案中定義了您的站點結構,現在需要建立一個 JSP 元件來處理對 XML 檔案的解析,並使用 Lotus Web Content Management API 將站點結構匯入到 Lotus Web Content Management 庫來執行實際的 Lotus Web Content Management 站點建立工作。

選擇 New - JSP 元件。使用名稱 jsp_createSiteStructure 建立 JSP 元件,然後將其指向路徑為 /jsp/html/createSiteStructure.jsp 的 JSP 檔案。將您的 JSP 元件儲存在本地 Rendering portlet 中。這個 JSP 檔案的物理路徑位於一個目錄中,類似清單 2 中的程式碼。


清單 2. 物理路徑目錄
\installedApps\
WCM_Local_ng_Portlet_PA_dvme0nk.ear\PA_dvme0nk.war\jsp\html\
createSiteStructure.jsp

JSP 檔案建立了一個稱為 Create Site Structure 的按鈕,單擊此按鈕時將開始解析 XML 檔案,首先將解析每一個站點。XML 檔案的路徑現在可以進行編輯。清單 3 中的檔案被認為位於與 JSP 檔案相同的位置。程式碼將進入工作空間並連線到檔案中的定義的庫。參見清單 3 中的程式碼。


清單 3. 建立新的評論內容的 JSP 檔案
charset=UTF-8" pageEncoding="UTF-8"%>
.
.
.








try {

//if button clicked
if( request.getParameter("buttonName") !=
null && request.getParameter("buttonName").equals("CreateSiteStructure")) {

//path to the XML file containing the site structure
File file = newFile("/opt/app/WebSphere/PortalServer/installedApps/WCM_Local_ng_
Portlet_PA_dm010y1.ear/dm010y1.war/jsp/html/NewsSiteStructure.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);

doc.getDocumentElement().normalize();

Element docEle = doc.getDocumentElement();
String libraryName = docEle.getAttribute("Name");

System.out.println("libraryName = " +libraryName);
workspace = openWorkspaceLibrary(request, libraryName);

//retrieve all site elements
NodeList nl = docEle.getElementsByTagName("Site");

//loop over site elements
if(nl != null) {
for(int i = 0 ; i < nl.getLength();i++) {

Element el = (Element)nl.item(i);
Site site = createSite(el);

DocumentId siteId = site.getId();
System.out.println("site = "+ site.getName());

//for every site element, retrieve site area child elements
NodeList SiteAreaNodeList = el.getChildNodes();
for (Node node = el.getFirstChild(); node != null;
node = node.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE &&
node.getNodeName().equals("SiteArea")) {
Element siteAreaEL = (Element)node;

SiteArea sa = createSiteArea(siteAreaEL, siteId);
if (sa != null){
System.out.println("site area = " + sa.getName());
}
else{
out.println("Error in creation of site area tree,
check logs for more information about the error");
}
}
}
}
}
closeWorkspace();
out.println("Cretion Completed");
}
}catch(FileNotFoundException e){
out.println("XML File not found!");
}catch (org.xml.sax.SAXParseException saxEx){
out.println("Exception In parsing document: "+ saxEx.getMessage());
}
catch (Exception e) {
System.out.println("Exception: "+ e.getClass());
e.printStackTrace();
}
%>

這裡使用了一個實用類,它包含了 JSP 程式碼中用來建立站點結構的所有 helper 方法。基於本文的目的,可以建立一個名為 wcmUtil.jsp 的 JSP 元件來包含所有這些方法。這個 JSP 元件被包含在 createSiteStructure.jsp 中,如清單 3 所示,使用其中的 。

清單 4 - 20 展示了在 helper 類中用於建立站點結構的方法。


清單 4. 連線到工作空間和庫
private Workspace workspace;
/*
*Connect to Lotus Web Content Management workspace with current user if
*logged in or anonymous if user is not logged in
*
*Set the Lotus Web Content Management document library to aLibraryName
*/
public Workspace openWorkspaceLibrary(HttpServletRequest request, String aLibraryName)
throws ServiceNotAvailableException, OperationFailedException {
// Connect to WCM Workspace
if (request.getUserPrincipal() != null)
{
workspace = WCM_API.getRepository().getWorkspace
(request.getUserPrincipal());
} else
{
workspace = WCM_API.getRepository().getAnonymousWorkspace();
}

//set library to the passed library name
if (workspace != null) {
DocumentLibrary docLib = workspace.getDocumentLibrary
(aLibraryName);
if(docLib != null){
workspace.setCurrentDocumentLibrary(docLib);
}
}

return workspace;
}


清單 5. 解析和建立站點
/*
*Parse site element
*If site already available, retrieve the site object, edit the site
*If site not already created, create a new site and set the name and
*display name and its settings
*Save the site to the workspace
*/
public Site createSite(Element aSiteElement){

String siteName = aSiteElement.getAttribute("Name");
String siteDisplayName = aSiteElement.getAttribute("DisplayName");
Site site = null;
try{

DocumentId siteId = getWCMDocumentByName(siteName, DocumentTypes.Site);
if (siteId != null){
site = (Site)workspace.getById(siteId);
}
else{
site = workspace.createSite();
site.setName(siteName);
}
site.setTitle(siteDisplayName);
site = (Site)retrieveAddSettings(site, aSiteElement, false);

workspace.save(site);

}catch(Exception e){
System.out.println("Exception = "+e);
e.printStackTrace();

}
return site;
}


清單 6. 解析和建立站點區域
/*
*Parse site area element
*If site area already available, retrieve the site area object, edit the site area
*If site area not already created, create a new site area and set the name
*and display name and its settings
*Add a default content to the site area if available
*Save the site area to the workspace
*/
public SiteArea createSiteArea(Element aSiteAreaElement, DocumentId parentId){
String siteAreaName = aSiteAreaElement.getAttribute("Name");
String siteAreaDisplayName = aSiteAreaElement.getAttribute("DisplayName");

SiteArea sa = null;
try{
String parentPath = workspace.getPathById(parentId, true, true);
String siteAreaPath = parentPath+ "/"+ siteAreaName;
DocumentId siteAreaId = getWCMDocumentByPath(siteAreaPath,
Workspace.WORKFLOWSTATUS_ALL);

if (siteAreaId != null){
sa = (SiteArea)workspace.getById(siteAreaId);
}else{
sa = workspace.createSiteArea(parentId, null, 1);
}

sa = (SiteArea)retrieveAddSettings(sa, aSiteAreaElement, true);
if (sa != null){
sa.setTitle(siteAreaDisplayName);

sa.setName(siteAreaName);
workspace.save(sa);
sa = addDefaultContentToSiteArea(sa, aSiteAreaElement);

if (sa != null){

boolean saved = saveToWorkspace(sa);
System.out.println("site area = " + sa.getName());

if (!saved){
return null;
}

//checking if site area contains any other site area children
NodeList SiteAreaNodeList = aSiteAreaElement.getChildNodes();

for (Node node = aSiteAreaElement.getFirstChild(); node != null;
node = node.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE &&
node.getNodeName().equals("SiteArea")) {
Element siteAreaEL = (Element)node;

SiteArea childSA = createSiteArea(siteAreaEL, sa.getId());
if (childSA != null){
System.out.println("childSA for = " +sa.getName()+ " =
" + childSA.getName());
}
else{
return null;
}
}
}
}
else{
return null;
}
}
return sa;
}catch(Exception e){
System.out.println("Exception = "+e);
e.printStackTrace();

}
return null;
}


清單 7. 解析和建立預設內容
/*
*Parse the default content element
*If content already available, retrieve the content object, and edit it
*If content not already created, create a new content object and set the
*name and display name and its settings
*If authoring template provided, overwrite if already set
*Add text components and rich text components to the content
*Save the default content to the site area
*/
public SiteArea addDefaultContentToSiteArea(SiteArea aSiteArea,
Element aSiteAreaElement){

DocumentId defaultContentId = null;

Element defaultel = getChildByName(aSiteAreaElement, "DefaultContent");
String contentName = getElementValueByTagName("Name", defaultel);

defaultContentId = getWCMDocumentByName(contentName, DocumentTypes.Content);

Content content = null;

String contentDisplayName = getElementValueByTagName("DisplayName", defaultel);

String authoringTempName = getElementValueByTagName("AuthoringTemp", defaultel);

DocumentId defaultAuthId = null;

if (! authoringTempName.equals("")){
defaultAuthId = getWCMDocumentByName(authoringTempName,
DocumentTypes.AuthoringTemplate);

}
System.out.println("defaultAuthId = "+ defaultAuthId);
try{

//if content already existing in the library, re-use it
if (defaultContentId != null){
content = (Content)workspace.getById(defaultContentId);

//if authoring template provided in the file, overwrite the existing one
if (defaultAuthId != null){
content.setAuthoringTemplateID(defaultAuthId);
}
}
else if (defaultAuthId != null){
//if content not available, create a new one
content = workspace.createContent(defaultAuthId, aSiteArea.getId(),null,
ChildPosition.START);
defaultContentId = content.getId();
content.setName(contentName);
}
else{
System.out.println("Exception = Authoring Template for default content "+
contentName + " is missing");
return null;
}

if (! contentDisplayName.equals("")){
content.setTitle(contentDisplayName);
}

content = retrieveAddTextComponentToContent(content, defaultel);

if (content == null){
return null;
}
content = retrieveAddRichTextComponentToContent(content, defaultel);

if (content == null){
return null;
}

while(!content.isPublished()){
content.nextWorkflowStage();
}
workspace.save(content);

}catch(Exception e){
System.out.println("Exception = "+e);
e.printStackTrace();
}

System.out.println("defaultContent for = " +aSiteArea.getName()+ " = " +
defaultContentId.getName());
aSiteArea.setDefaultContent(defaultContentId);
return aSiteArea;
}


清單 8. 解析文字元件
/*
*Parse DefaultContent element
*Search for text component elements
*Looping over all text component child elements
*Calling method addTextComponent to add the
*text component to the content
*/
public Content retriveAddTextComponentToContent(Content aContent,
Element aContentElement){

NodeList texttnl = aContentElement.getChildNodes();

for (Node node = aContentElement.getFirstChild();
node != null;
node = node.getNextSibling()) {
if (node.getNodeType() ==
Node.ELEMENT_NODE &&
node.getNodeName().equals("TextComponent")) {
Element textCompel = (Element)node;

String textField =
getElementValueByTagName("FieldName", textCompel);
String text =
getElementValueByTagName("Value", textCompel);
aContent =
addTextComponent(aContent, textField, text);

if (aContent != null){
System.out.println("adding textField =
"+ textField+" to content "
+aContent.getName());
}
}
}
if (aContent == null){
return null;
}
else{

return aContent;
}

}


清單 9. 解析富文字元件
/*
*Parse DefaultContent element
*Search for rich text component elements
*Looping over all rich text component child elements
*Calling method addRichTextComponent to add the rich text
*component to the content
*/
public Content retrieveAddRichTextComponentToContent
(Content aContent, Element aContentElement){
NodeList richTexttnl = aContentElement.getChildNodes();
for (Node node = aContentElement.getFirstChild(); node != null;
node = node.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE &&
node.getNodeName().equals("RichTextComponent")) {
Element richtextCompel = (Element)node;

String textField =
getElementValueByTagName("FieldName",
richtextCompel);
String text =
getElementValueByTagName("Value",
richtextCompel);

aContent =
addRichTextComponent(aContent, textField, text);

if (aContent != null){
System.out.println("adding richtextField =
"+ textField+" to content "+
aContent.getName());
}
}
}
if (aContent == null){
return null;
}
else{
return aContent;
}
}


清單 10. 建立和新增文字元件
/*
* Get text component from the content according to
*the text component name
* Set the text component with the value sent
* Add the text component to the content
*/
public Content addTextComponent
(Content aContent, String aTextField, String aValue){

try{
TextComponent txtComp =
(TextComponent) aContent.getComponent(aTextField);
txtComp.setText(aValue);
aContent.setComponent(aTextField, txtComp);
}catch(ComponentNotFoundException ex){
System.out.println
("Exception: "+aTextField+" is not a valid TextComponent");
return null;
}catch(Exception e){
System.out.println("Exception = "+e);
return null;
}

return aContent;
}


清單 11. 建立和新增富文字元件
/*
* Get rich text component from the content according to the RTF name
* Set the rich text component with the value sent
* Add the rich text component to the content
*/
public Content addRichTextComponent(Content aContent,
String aTextField, String aValue){
try{
RichTextComponent richTxtComp =
(RichTextComponent) aContent.getComponent(aTextField);
richTxtComp.setRichText(aValue);
aContent.setComponent(aTextField, richTxtComp);
RichTextComponent rtf =
(RichTextComponent)aContent.getComponent(aTextField);
}catch(ComponentNotFoundException ex){
System.out.println("Exception:
"+aTextField+" is not a valid RichTextComponent");
return null;
}catch(Exception e){
System.out.println("Exception = "+e);
return null;
}

return aContent;
}


清單 12. 解析設定元素
/*
*Parse site area or site element
*Search for settings element
*call method retrieveAddTemplateMapping to add template mapping to site or site area
*call method addSecuritySettings to add security settings to site or site area
*/
public Object retrieveAddSettings(SiteFrameworkContainer aWCMObject,
Element aObjectElement, boolean isSiteArea){

Element settingsel = getChildByName(aObjectElement, "Settings");
if ( settingsel!= null){
if(isSiteArea )
{
aWCMObject = (SiteArea)retrieveAddTemplateMapping
(aWCMObject, settingsel);
aWCMObject = (SiteArea)addSecuritySettings
(aWCMObject, settingsel);
}
else
{
aWCMObject = (Site)retrieveAddTemplateMapping
(aWCMObject, settingsel);
aWCMObject = (Site)addSecuritySettings
(aWCMObject, settingsel);
}
}
return aWCMObject;
}


清單 13. 將 SecuritySettings 新增到 Lotus Web Content Management 物件
/*
*Parse settings element
*Search for SecuritySettings element
*For every SecuritySettings element, find the AccessRight element
*loop over the AccessRight elements and get the type of the access
*According to the access type, a specific method in Lotus
*Web Content Management
*will be called to add the access rights
*/
public Object addSecuritySettings
(SiteFrameworkContainer aWCMObject, Element settingsel){

for (Node node = settingsel.getFirstChild(); node != null;
node = node.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE &&
node.getNodeName().equals("SecuritySettings")) {
Element secel = (Element)node;
NodeList accessRightsnl = secel.getChildNodes();

for (Node accessRightNode = secel.getFirstChild(); accessRightNode !=
null; accessRightNode = accessRightNode.getNextSibling()) {
if (accessRightNode.getNodeType() == Node.ELEMENT_NODE &&
accessRightNode.getNodeName().equals("AccessRight")) {
Element accessRightsel = (Element)accessRightNode;

String accessType = accessRightsel.getAttribute("Type");

NodeList accessnl = accessRightsel.getChildNodes();

if(accessnl != null ) {

for(int y = 0 ; y < accessnl.getLength();y++) {

Node accnode = accessnl.item(y);

if (accnode.getNodeType() ==
accnode.ELEMENT_NODE &&
accnode.getNodeName().equals("Access")) {
Element el = (Element)accnode;
String access = el.getFirstChild().getNodeValue();
if (accessType.equals("addReadAccessMembers")){
aWCMObject.addReadAccessMembers(new String[]{access});
System.out.println("addReadAccessMembers for bject =
"+aWCMObject.getName()+" members = "+access);
}else if(accessType.equals
("addEditAccessMembers")){
aWCMObject.addEditAccessMembers(new String[]{access});
System.out.println("addEditAccessMembers for bject =
"+aWCMObject.getName()+" members =
"+access);

}else if(accessType.equals

("addDeleteAccessMembers")){

aWCMObject.addDeleteAccessMembers
(new String[]{access});
System.out.println
("addDeleteAccessMembers for bject =
"+aWCMObject.getName()+" members = "+access);
}

}
}
}
}
}
}
}
return aWCMObject;
}


清單 14. 解析和新增 Template Mapping SiteArea
/*
*Parse settings element
*Search for TemplateMapping element
*For every TemplateMapping element
*Get the authoring template and presentation template names
*Retrieve the Lotus Web Content Management object from the names
*If item already contains a template mapping with the same authoring template,
*remove it and add the new one
*Else, add the new template mapping
*Save the object, either the site or site area
*/
public Object retrieveAddTemplateMapping
(SiteFrameworkContainer aWCMObject,
Element settingsel){
DocumentId authId = null;
DocumentId presId = null;

NodeList tempnl = settingsel.getChildNodes();

for (Node node = settingsel.getFirstChild(); node !=
null; node = node.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE &&
node.getNodeName().equals("TemplateMapping")) {
Element tempel = (Element)node;

String authoringTemp =
getElementValueByTagName("AuthoringTemp", tempel );
String presTemp =
getElementValueByTagName("PresentationTemp", tempel );

authId = getWCMDocumentByName(authoringTemp,
DocumentTypes.AuthoringTemplate);

presId = getWCMDocumentByName(presTemp,
DocumentTypes.PresentationTemplate);

if (authId != null){
try{
if (aWCMObject.hasTemplateMapping(authId)){
}

if (!aWCMObject.hasTemplateMapping(authId)){
aWCMObject.addTemplateMapping(authId, presId);
}
else{

DocumentIdIterator docIt = aWCMObject.getAuthoringTemplateIds();
if (docIt.hasNext()){
DocumentId dids = (DocumentId)docIt.next();
aWCMObject.removeTemplateMapping(dids);
aWCMObject.addTemplateMapping(authId, presId);
}
}

System.out.println("TemplateMapping authName = "+authoringTemp+"
and presName = "+presTemp +" added to object " + aWCMObject.getName());
workspace.save(aWCMObject);
}catch(Exception e){
System.out.println("Exception ="+e);
e.printStackTrace();
}
}else{
return null;
}
}
}

return aWCMObject;
}


清單 15. 將 Lotus Web Content Management 物件儲存到工作空間
/*
* This is a helper method that receives a Lotus Web Content Management
* document object and adds it to the workspace
*/
public boolean saveToWorkspace(com.ibm.workplace.wcm.api.Document wcmDocument){

try{
String[] errors = workspace.save(wcmDocument);

for (int i = 0; i < errors.length; i++){
System.out.println("Error while saving "+
wcmDocument.getName()+ " : "+errors[i]);
}
if (errors.length > 0 ){
return false;
}
}catch(Exception e){
System.out.println("Exception = "+e);
e.printStackTrace();
return false;
}
return true;
}


清單 16. 按路徑檢索 Lotus Web Content Management 物件
/*
* This is a helper method that retrieves a Lotus Web Content Management
* object by its path and returns the DocumentId
*/
public DocumentId getWCMDocumentByPath(String wcmPath, int workFlowStatus) {
DocumentId wcmDocumentId = null;
try{


if(wcmPath != null){
DocumentIdIterator docIdIter = workspace.findByPath(wcmPath, workFlowStatus);
if(docIdIter != null && docIdIter.hasNext()){
wcmDocumentId = docIdIter.nextId();
}
}
}catch(Exception e){
System.out.println("Exception = "+e);
e.printStackTrace();
}

return wcmDocumentId;
}


清單 17. 按名稱檢索子元素
/*
* This is a helper method that gets the child element according to
* its name of another element if
* it contains only one child with that name
*/
private Element getChildByName(Element element, String name) {
Element rEl = null;
for (Node node = element.getFirstChild(); node != null; node =
node.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE &&
node.getNodeName().equals(name)) {
rEl = (Element)node;
break;
}
}
return rEl;
}


清單 18. 按名稱檢索元素值
/*
* This is a helper method that returns a string value of the given element
*/
public String getElementValueByTagName(String aTagName, Element aElement){
String elementValue = "";

NodeList nodeList = aElement.getElementsByTagName(aTagName);
if(nodeList != null && nodeList.getLength() > 0) {
Element el = (Element)nodeList.item(0);
elementValue = el.getFirstChild().getNodeValue();
}

return elementValue;
}


清單 19. 按名稱檢索 Lotus Web Content Management 物件
/*
* This is a helper method that returns the DocumentId of a Lotus Web
* Content Management object based on its name
*/
public DocumentId getWCMDocumentByName(String wcmName, DocumentType documentTypes){

DocumentId wcmDocumentId = null;
try{
if(wcmName != null){

DocumentIdIterator docIdIter = workspace.findByName(documentTypes, wcmName);
if(docIdIter != null && docIdIter.hasNext()){
wcmDocumentId = docIdIter.nextId();

}
}
}catch(Exception e){
System.out.println("Exception = "+e);
e.printStackTrace();
}
if (wcmDocumentId == null && ( (documentTypes.equals
(DocumentTypes.AuthoringTemplate)) || (documentTypes.equals
(DocumentTypes.PresentationTemplate)) )){
System.out.println("Exception: "+wcmName+" could not be found in the Repository");
}
return wcmDocumentId;
}


清單 20. 關閉 Lotus Web Content Management 工作空間
/**
* Closes the Lotus Web Content Management workspace
*/
public void closeWorkspace() {
WCM_API.getRepository().endWorkspace();

增強

使用本文給出的解決方案可以進一步實現增強。例如,您可以執行下面的操作:

  • 使用 XML 建立內容
  • 向預設內容新增更復雜的元件
  • 通過只更改站點區域的名稱,修改 XML 以多次建立相同的結構

    結束語

    在本文中, 我們給出了一個簡單的解決方案,它使您能夠以一種自動化方式定義站點結構。使用這種解決方案的用例非常多樣;例如,您可能需要在多個伺服器上定義站點區 域,或者您的站點中具有大量重複的站點結構。這個解決方案幫助您避免將時間浪費在執行大量既耗時又單調的任務上。

}

注意:在這裡給出異常處理只是出於演示目的,而不適合用於生產目的。應當在必要時進行修改以滿足您的預期和要求。

helper 類給出一些重要警告:

  • 使用者將收到一條警告訊息,表示出現一些錯誤並且建立無法成功完成。
  • 錯誤被記錄到 SystemOut.log 檔案中,因此您可以從該檔案獲得更多有關錯誤的訊息。
  • 當在儲存庫中沒有找到使用者時將出現錯誤,這將導致一個錯誤被記錄到日誌中,但是也會為使用者生成一條 Creation Completed 訊息。


圖 2 展示了 XML 元素和實現解決方案後生成的輸出之間的樣例對映。


圖 2. XML 與 Lotus Web Content Management 物件和區段之間的對映
XML 與 Lotus Web Content Management 物件和區段之間的對映

如您所見,實際站點結構與 XML 檔案之間的對映非常簡單,具有一個表示庫的根元素。這個根元素隨後包含另一個與站點對應的元素,定義它的名稱並顯示名稱。站點區域以巢狀方式在 XML 檔案中定義,用於獲得必需的站點結構。

每個站點和站點區域都包含一個設定區段,其中包含安全設定和模板對映區段。下面是必須加以考慮的限制因素:安全設定和模板對映可以在各自的元素或樹中的最高階別的站點或站點區域中針對每個站點或站點區域建立,並且其子元素將從父元素中繼承。

內容安全設定和工作流被新增到編寫模板元件中,而不是 XML 檔案中的預設內容區段中。

模板對映和預設內容建立中使用的編寫模板和演示模板必須提前建立。

通過定義預設內容的名稱,預設內容可以在多個站點區域中重用。當您在 XML 檔案中定義了完整的預設內容元素後,您可以通過定義一個只包含名稱元素的預設內容標記來使用它。如果預設內容已經存在於庫中,也可以使用在多個不同位置重用預設內容這一特性。


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

相關文章