Примечание редактора. Эта тема вам хорошо знакома? Хотите поделиться опытом? Примите участие в вики-программе по IBM Lotus.
| Вики по Lotus Web Content Management |
|---|
Тем, кто работает с IBM Lotus Web Content Management, приходится часто повторять определение структуры сайта. Эта трудоемкая и рутинная процедура требует более чем 10 различных шагов при создании каждого сайта и каждой области сайта. Более того, структуры сайтов по своей природе не портативны; нельзя экспортировать структуру сайта из одной библиотеки на одном сервере в другую библиотеку на другом. Вместо этого приходится воспроизводить всю структуру сайта вручную.
Так как количество сайтов и областей сайтов, составляющих одну структуру сайта, может исчисляться тысячами, необходим метод для автоматизации процесса определения структуры сайта и облегчения его переноса, экспорта и импорта. В этой статье приводится простой способ определения структуры сайта в виде XML-файла и его развертывания надлежащим образом.
Требуется знание следующих технологий:
- IBM WebSphereВ® Portal V6.0 и более поздних версий, его администрирование и компоненты;
- Lotus Web Content Management;
- XML.
Для того чтобы продемонстрировать, как можно создать структуру сайта в Lotus Web Content Management без ручного создания всех сайтов и областей сайтов, в данной статье используются API Lotus Web Content Management и 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-файл должен быть определен в структуре, которая соответствует вашим требованиям. Пример XML-файла, приведенный в листинге 1, соответствует структуре сайта, показанной на рисунке 1.
Рисунок 1. Структура сайта
Этот сайт состоит из одной области сайта; эта единственная область сайта, в свою очередь, состоит из другой области сайта.
Листинг 1. Пример XML-файла, используемого при создании структуры сайта
<Library Name="Library" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="SiteCreation.xsd">
<Site Name="SITE" DisplayName="SITE">
<SiteArea Name="News" DisplayName="News">
<Settings>
<TemplateMapping>
<AuthoringTemp>auth_news</AuthoringTemp>
<PresentationTemp>pt_newsDetail</PresentationTemp>
</TemplateMapping>
<SecuritySettings>
<AccessRight Type="addReadAccessMembers">
<Access>[all authenticated portal users]</Access>
<Access>anonymous portal user</Access>
</AccessRight>
</SecuritySettings>
</Settings>
<DefaultContent>
<Name>Default_News</Name>
<DisplayName>Default_News</DisplayName>
<AuthoringTemp>auth_news</AuthoringTemp>
<TextComponent>
<FieldName>txt_headline</FieldName>
<Value>Headline for default Content</Value>
</TextComponent>
<RichTextComponent>
<FieldName>rtf_body</FieldName>
<Value>Body for the default Content</Value>
</RichTextComponent>
</DefaultContent>
<SiteArea Name="2009News" DisplayName="2009 News">
<DefaultContent>
<Name>Default_News</Name>
<DisplayName>Default_News</DisplayName>
<AuthoringTemp>auth_news</AuthoringTemp>
<TextComponent>
<FieldName>txt_headline</FieldName>
<Value>Headline for default Content</Value>
</TextComponent>
<RichTextComponent>
<FieldName>rtf_body</FieldName>
<Value>Body for the default Content</Value>
</RichTextComponent>
</DefaultContent>
</SiteArea>
<SiteArea Name="2008News" DisplayName="2008 News">
<DefaultContent>
<Name>Default_News</Name>
</DefaultContent>
</SiteArea>
</SiteArea>
<Settings><!—Site Settings -
<TemplateMapping>
<AuthoringTemp>auth_news</AuthoringTemp>
<PresentationTemp>pt_newsDetail</PresentationTemp>
</TemplateMapping>
<SecuritySettings>
<AccessRight Type="addReadAccessMembers">
<Access>[all authenticated portal users]</Access>
<Access>anonymous portal user</Access>
</AccessRight>
</SecuritySettings>
</Settings>
</Site>
</Library>
|
Рисунок 2 иллюстрирует пример отображения между элементами XML-файла и выходными данными после реализации решения.
Рисунок 2. Соответствие между XML и объектами и разделами Lotus Web Content Management
Как видно из рисунка, реальная структура сайта однозначно отображается на XML-файл, причем корневым элементом служит библиотека. Этот корневой элемент содержит другой элемент, который соответствует сайту, определяя его имя и отображаемое имя. Для получения необходимой структуры сайта в XML-файле определяются вложенные области сайта.
Каждый сайт и каждая область сайта содержит раздел настройки с параметрами настройки безопасности и шаблон расположения разделов. Необходимо иметь в виду следующие ограничения.
Параметры безопасности и шаблон отображения могут создаваться для каждого сайта или каждой области сайта в соответствующем элементе или в корне дерева сайта или области сайта с нисходящими дочерними элементами.
Параметры безопасности контента и процессы добавляются в компонент шаблона авторинга, а не в раздел контента по умолчанию XML-файла.
Шаблоны авторинга и шаблоны представления, используемые при отображении шаблона и при создании контента по умолчанию, должны быть созданы заранее.
Контент по умолчанию можно многократно использовать в различных областях сайта путем определения его имени. После определения полного элемента контента по умолчанию в XML-файле его можно использовать, определяя тег контента по умолчанию с единственным элементом имени. Эту возможность многократного использования контента по умолчанию в разных местах можно применять и в том случае, когда контент по умолчанию для данной библиотеки уже существует.
Как уже отмечалось, чтобы не пропустить данные, необходимые Lotus Web Content Management для создания сайта, нужно убедиться, что XML-файл соответствует XSD-файлу. Такая проверка гарантирует выполнение соотношений, перечисленных в таблице 1.
Таблица 1. Проверка элементов/атрибутов XML-схемы
| Элемент | Элемент/атрибут | Тип | Допустимые значения | Значение |
|---|---|---|---|---|
| Library | Sites | Элемент | 0..n | Нет |
| Library | Name | Атрибут | Обязательный | Строка |
| Site | SiteArea | Элемент | 0..n | Нет |
| Site | Name | Атрибут | Обязательный | Строка |
| Site | DisplayName | Атрибут | Необязательный | Строка |
| Site | Settings | Элемент | Необязательный | Нет |
| SiteArea | SiteArea | Элемент | 0..n | Нет |
| SiteArea | Name | Атрибут | Обязательный | Строка |
| SiteArea | DisplayName | Атрибут | Необязательный | Строка |
| SiteArea | Settings | Элемент | Необязательный | Нет |
| SiteArea | DefaultContent | Элемент | Необязательный | Нет |
| DefaultContent | Name | Элемент | Обязательный | Нет |
| DefaultContent | DisplayName | Элемент | Необязательный | Нет |
| DefaultContent | AuthoringTemp | Элемент | Необязательный (если уже был создан ранее) | Нет |
| DefaultContent | TextComponent | Элемент | 0..n | Нет |
| DefaultContent | RichTextComponent | Элемент | Необязательный | Нет |
| TextComponent | FieldName | Элемент | Обязательный (ссылка на имя поля Lotus Web Content Management TextComponent, как в шаблоне авторинга) | Нет |
| TextComponent | TextComponent | Элемент | Обязательный | Нет |
| TextComponent | FieldName | Элемент | Обязательный (ссылка на имя поля Lotus Web Content Management RichTextComponent, как в шаблоне авторинга) | Нет |
| TextComponent | TextComponent | Элемент | Обязательный | Нет |
| Settings | TemplateMapping | Элемент | 0..n | Нет |
| Settings | SecuritySettings | Элемент | Необязательный | Нет |
| TemplateMapping | AuthoringTemp | Элемент | Обязательный (ссылка на имя шаблона авторинга Lotus Web Content Management) | Нет |
| TemplateMapping | PresentationTemp | Элемент | Обязательный (ссылка на шаблон представления Lotus Web Content Management) | Нет |
| SecuritySettings | AccessRight | Элемент | 0..n | Нет |
| AccessRight | Type | Атрибут | Обязательный | addReadAccessMembers/ addEditAccessMembers или addDeleteAccessMembers |
| AccessRight | Access | Элемент | 1..n | Нет |
Теперь, когда структура сайта определена в XML-файле, соответствующем XSD, нужно создать компонент JSP для выполнения анализа XML-файла и фактического создания сайта в Lotus Web Content Management. Для импорта структуры сайта в библиотеку Lotus Web Content Management используются API Lotus Web Content Management.
Выберите New – JSP component. Создайте компонент JSP с именем jsp_createSiteStructure, и пусть он указывает на файл JSP, путь которого: /jsp/html/createSiteStructure.jsp. Сохраните свои компоненты JSP в локальном портлете Rendering. Физический путь к файлу JSP находится в каталоге, подобном приведенному в листинге 2.
Листинг 2. Физический путь к каталогу
<websphere portal installation path>\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, который создает новый контент комментария
<%@page language="java" contentType="text/html;
charset=UTF-8" pageEncoding="UTF-8"%>
.
.
.
<%@ include file="wcmUtil.jsp"%>
<FORM name="form1" method="post" action="#">
<INPUT TYPE="HIDDEN" NAME="buttonName" VALUE="CreateSiteStructure">
<INPUT TYPE="SUBMIT" value="Create Site Structure">
</FORM>
<%
try {
//если нажата кнопка
if( request.getParameter("buttonName") !=
null && request.getParameter("buttonName").equals("CreateSiteStructure")) {
//путь к XML-файлу, содержащему структуру сайта
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);
//извлечение всех элементов сайта
NodeList nl = docEle.getElementsByTagName("Site");
//цикл по элементам сайта
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());
//для каждого элемента сайта извлекаются дочернии элементы области сайта
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();
}
%>
|
Здесь используется класс utility, который содержит все вспомогательные методы из кода JSP для создания структуры сайта. Для целей данной статьи можно создать компонент JSP wcmUtil.jsp, содержащий все эти методы. Компонент JSP включен в createSiteStructure.jsp, как показано в листинге 3, с использованием кода <%@ include file="wcmUtil.jsp"%>.
В листингах 4-20 показаны методы, используемые во вспомогательном классе для создания структуры сайта.
Листинг 4. Подключение к рабочей области и библиотеке
private Workspace workspace;
/*
*Подключение к рабочей области Lotus Web Content Management текущего
*пользователя, если он зарегистрирован в системе, или анонимного, если
*пользователь не зарегистрирован
*
*Настройка библиотеки документов Lotus Web Content Management на aLibraryName
*/
public Workspace openWorkspaceLibrary(HttpServletRequest request, String aLibraryName)
throws ServiceNotAvailableException, OperationFailedException {
// Подключение к рабочему пространству WCM
if (request.getUserPrincipal() != null)
{
workspace = WCM_API.getRepository().getWorkspace
(request.getUserPrincipal());
} else
{
workspace = WCM_API.getRepository().getAnonymousWorkspace();
}
//присвоение библиотеке переданного имени
if (workspace != null) {
DocumentLibrary docLib = workspace.getDocumentLibrary
(aLibraryName);
if(docLib != null){
workspace.setCurrentDocumentLibrary(docLib);
}
}
return workspace;
}
|
Листинг 5. Анализ и создание сайта
/*
*Анализирует элемент site
*Если сайт уже существует, извлекает объект site и редактирует сайт
*Если сайт еще не создан, создает новый сайт и определяет его имя, отображаемое
*имя и параметры настройки
*Сохраняет сайт в рабочей области
*/
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. Анализ и создание области сайта
/*
*Анализирует элемент site area
*Если область сайта уже существует, извлекает объект site area и редактирует область
*сайта
*Если область сайта еще не создана, создает новую область сайта и определяет ее имя,
*отображаемое имя и параметры настройки
* Добавляет в область сайта контент по умолчанию, если он есть
*Сохраняет область сайта в рабочей области
*/
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;
}
//проверка, содержит ли область сайта какие-либо другие
//дочерние элементы области сайта
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. Анализ и создание контента по умолчанию
/*
*Анализирует элемент default content
*Если контент уже существует, извлекает объект content и редактирует его
*Если контент еще не создан, создает новый объект content и определяет его имя,
*отображаемое имя и параметры настройки
*Если имеется шаблон авторинга, перезаписывает то, что уже создано
*Добавляет в контент компоненты text и rich text
*Сохраняет контент по умолчанию для области сайта
*/
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 (defaultContentId != null){
content = (Content)workspace.getById(defaultContentId);
//если в файле уже есть шаблон, перепишем его
if (defaultAuthId != null){
content.setAuthoringTemplateID(defaultAuthId);
}
}
else if (defaultAuthId != null){
//если контента нет, создадим новый
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. Анализ компонента text
/*
*Анализирует элемент DefaultContent
*Ищет элементы компонента text
*Обходит все дочерние элементы компонента text
*Вызывает метод addTextComponent для добавления в контент компонента text
*/
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. Анализ компонента rich text
/*
*Анализирует элемент DefaultContent
*Ищет элементы компонента rich text
*Обходит все дочерние элементы компонента rich text
*Вызывает метод addRichTextComponent для добавления в контент компонента rich text
*/
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. Создание и добавление компонента text
/*
*Извлекает компонент text из контента в соответствии с именем компонента text
*Настраивает компонент text с помощью переданного значения
*Добавляет компонент text к контенту
*/
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. Создание и добавление компонента rich text
/*
*Извлекает компонент rich text из контента в соответствии с именем RTF
*Настраивает компонент rich text с помощью переданного значения
*Добавляет компонент rich text к контенту
*/
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. Анализ элемента settings
/*
*Анализирует элемент site area или site
*Ищет элемент settings
*Вызывает метод retrieveAddTemplateMapping для добавления отображения шаблона к сайту
*или области сайта
*Вызывает метод addSecuritySettings для добавления параметров безопасности к сайту или
*области сайта
*/
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
/*
*Анализирует элемент settings
*Ищет элемент SecuritySettings
*Для каждого элемента SecuritySettings ищет элемент AccessRight
*Обходит элементы AccessRight и определяет тип доступа
*В соответствии с типом доступа вызывает определенный метод Lotus Web Content
*Management для добавления прав доступа
*/
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 Object =
"+aWCMObject.getName()+" members = "+access);
}else if(accessType.equals
("addEditAccessMembers")){
aWCMObject.addEditAccessMembers(new String[]{access});
System.out.println("addEditAccessMembers for Object =
"+aWCMObject.getName()+" members =
"+access);
}else if(accessType.equals
("addDeleteAccessMembers")){
aWCMObject.addDeleteAccessMembers
(new String[]{access});
System.out.println
("addDeleteAccessMembers for Object =
"+aWCMObject.getName()+" members = "+access);
}
}
}
}
}
}
}
}
return aWCMObject;
}
|
Листинг 14. Анализ и добавление Template Mapping SiteArea
/*
*Анализирует элемент settings
*Ищет элемент TemplateMapping
*Для каждого элемента TemplateMapping
*получает имена шаблона авторинга и шаблон представления
*Извлекает из имен объект Lotus Web Content Management
*Если запись уже содержит отображение шаблона с тем же шаблоном авторинга,
*удаляет его и добавляет новый
*Иначе, добавляет новое отображение шаблона
*Сохраняет объект, будь то сайт или область сайта
*/
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 в рабочей области
/*
*Этот вспомогательный метод получает объект документа Lotus Web Content Management и
*добавляет его в рабочую область
*/
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 по пути
/*
*Этот вспомогательный метод получает объект Lotus Web Content Management по его пути и
*возвращает 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. Получение дочернего элемента по имени
/*
*Этот вспомогательный метод получает дочерний элемент в соответствии с содержащимся в
*нем именем другого элемента, если тот содержит только один дочерний элемент с таким
*именем
*/
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. Получение значения элемента по имени
/*
*Этот вспомогательный метод возвращает строковое значение данного элемента
*/
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 по имени
/*
*Этот вспомогательный метод возвращает DocumentId объекта Lotus Web Content
*Management по его имени
*/
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
/**
* Закрывает рабочую область Lotus Web Content Management
*/
public void closeWorkspace() {
WCM_API.getRepository().endWorkspace();
}
|
ПРИМЕЧАНИЕ. Обработка исключений выполняется только в целях иллюстрации, но не для работы на производственном уровне качества. Ее нужно модифицировать по мере необходимости для удовлетворения соответствующих ожиданий и требований.
Основные предупреждения, полученные от вспомогательного класса:
- пользователи уведомляются предупредительным сообщением о том, что имели место ошибки и что процесс создания не был успешно завершен.
- ошибки регистрируются в файле SystemOut.log, чтобы можно было изучить более подробную информацию об ошибке.
- ошибки, которые возникают, когда пользователи в репозитории не найдены, приводят к регистрации ошибки, но также генерируются сообщения Creation Completed.
Пользуясь решением, предлагаемым в этой статье, вы можете усовершенствовать его. Например, можно сделать следующее:
- создать контент с помощью XML;
- добавить более сложные компоненты к контенту по умолчанию и к контентам;
- изменить XML для создания одной и той же структуры любое количество раз с изменением только имени области сайта.
В этой статье мы приводим простое решение, которое позволяет автоматически определять структуру сайтов. Такое решение может применяться в самых разных целях. Например, может понадобиться определение области сайта на нескольких серверах или в том случае, когда сайт содержит большое количество повторяющихся структур. Это решение позволяет сэкономить время при выполнении трудоемкой и рутинной процедуры. Это решение позволяет сэкономить время при выполнении трудоемкой и рутинной процедуры.
| Имя | Размер | Метод загрузки |
|---|---|---|
| SiteCreation.xsd | 3628 байт | HTTP |
| NewsSiteStructure.xml | 1933 байт | HTTP |
- Оригинал статьи (EN).
-
Прочтите статью End-to-end Web content in WebSphere Portal using Web Content Management 6.0 в разделе Lotus портала developerWorks (EN).
-
Дополнительная информация: Информационный центр IBM WebSphere Portal Version 6.0. (EN)