Перейти к тексту

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

Вся введенная информация защищена.

  • Закрыть [x]

При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

Вся введенная информация защищена.

  • Закрыть [x]

Создание структуры сайта в IBM Lotus Web Content Management одним нажатием кнопки

Гебба Солиман, старший инженер-программист, IBM
Гебба Солиман (Hebba Soliman) работает старшим инженером-программистом в Международном центре IBM в Каире (Cairo Global Delivery Center – C-GDC). У нее богатый опыт разработки и проектирования Web-приложений в IBM Workplace Web Content Management и их персонализации.
Ахмед Хайри, специалист по ИТ, IBM
Ахмед Хайри является специалистом по ИТ Центра развития современных технологий IBM в Каире. Работал с различными программными продуктами IBM на разных программных платформах IBM. В настоящее время учится на магистра вычислительной техники в Американском университете в Каире.

Описание:  Прочтите о простом решении, которое позволяет автоматически создавать структуры сайтов в IBM Lotus Web Content Management. Это решение экономит время при выполнении трудоемкой и рутинной процедуры.

Дата:  25.03.2011
Уровень сложности:  средний
Активность:  5429 просмотров
Комментарии:  


Примечание редактора. Эта тема вам хорошо знакома? Хотите поделиться опытом? Примите участие в вики-программе по 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-файл должен быть определен в структуре, которая соответствует вашим требованиям. Пример 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 и объектами и разделами Lotus Web Content Management

Как видно из рисунка, реальная структура сайта однозначно отображается на XML-файл, причем корневым элементом служит библиотека. Этот корневой элемент содержит другой элемент, который соответствует сайту, определяя его имя и отображаемое имя. Для получения необходимой структуры сайта в XML-файле определяются вложенные области сайта.

Каждый сайт и каждая область сайта содержит раздел настройки с параметрами настройки безопасности и шаблон расположения разделов. Необходимо иметь в виду следующие ограничения.

Параметры безопасности и шаблон отображения могут создаваться для каждого сайта или каждой области сайта в соответствующем элементе или в корне дерева сайта или области сайта с нисходящими дочерними элементами.

Параметры безопасности контента и процессы добавляются в компонент шаблона авторинга, а не в раздел контента по умолчанию XML-файла.

Шаблоны авторинга и шаблоны представления, используемые при отображении шаблона и при создании контента по умолчанию, должны быть созданы заранее.

Контент по умолчанию можно многократно использовать в различных областях сайта путем определения его имени. После определения полного элемента контента по умолчанию в XML-файле его можно использовать, определяя тег контента по умолчанию с единственным элементом имени. Эту возможность многократного использования контента по умолчанию в разных местах можно применять и в том случае, когда контент по умолчанию для данной библиотеки уже существует.


Валидация по XML-схеме

Как уже отмечалось, чтобы не пропустить данные, необходимые Lotus Web Content Management для создания сайта, нужно убедиться, что XML-файл соответствует XSD-файлу. Такая проверка гарантирует выполнение соотношений, перечисленных в таблице 1.


Таблица 1. Проверка элементов/атрибутов XML-схемы
ЭлементЭлемент/атрибутТипДопустимые значенияЗначение
LibrarySites Элемент0..nНет
LibraryNameАтрибутОбязательныйСтрока
SiteSiteAreaЭлемент0..nНет
SiteNameАтрибутОбязательныйСтрока
SiteDisplayNameАтрибутНеобязательныйСтрока
SiteSettingsЭлементНеобязательныйНет
SiteAreaSiteAreaЭлемент0..nНет
SiteAreaNameАтрибутОбязательныйСтрока
SiteAreaDisplayNameАтрибутНеобязательныйСтрока
SiteAreaSettingsЭлементНеобязательныйНет
SiteAreaDefaultContentЭлементНеобязательныйНет
DefaultContentNameЭлементОбязательныйНет
DefaultContentDisplayNameЭлементНеобязательныйНет
DefaultContentAuthoringTempЭлементНеобязательный (если уже был создан ранее)Нет
DefaultContentTextComponentЭлемент0..nНет
DefaultContentRichTextComponentЭлементНеобязательныйНет
TextComponentFieldNameЭлементОбязательный (ссылка на имя поля Lotus Web Content Management TextComponent, как в шаблоне авторинга)Нет
TextComponentTextComponentЭлементОбязательныйНет
TextComponentFieldNameЭлементОбязательный (ссылка на имя поля Lotus Web Content Management RichTextComponent, как в шаблоне авторинга)Нет
TextComponentTextComponentЭлементОбязательныйНет
SettingsTemplateMappingЭлемент0..nНет
SettingsSecuritySettingsЭлементНеобязательныйНет
TemplateMappingAuthoringTempЭлементОбязательный (ссылка на имя шаблона авторинга Lotus Web Content Management)Нет
TemplateMappingPresentationTempЭлементОбязательный (ссылка на шаблон представления Lotus Web Content Management)Нет
SecuritySettingsAccessRightЭлемент0..nНет
AccessRightTypeАтрибутОбязательныйaddReadAccessMembers/
addEditAccessMembers
или
addDeleteAccessMembers
AccessRightAccessЭлемент1..nНет

Компонент JSP

Теперь, когда структура сайта определена в 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.xsd3628 байтHTTP
NewsSiteStructure.xml1933 байтHTTP

Информация о методах загрузки


Ресурсы

Об авторах

Гебба Солиман (Hebba Soliman) работает старшим инженером-программистом в Международном центре IBM в Каире (Cairo Global Delivery Center – C-GDC). У нее богатый опыт разработки и проектирования Web-приложений в IBM Workplace Web Content Management и их персонализации.

Ахмед Хайри является специалистом по ИТ Центра развития современных технологий IBM в Каире. Работал с различными программными продуктами IBM на разных программных платформах IBM. В настоящее время учится на магистра вычислительной техники в Американском университете в Каире.

Помощь по сообщениям о нарушениях

Сообщение о нарушениях

Спасибо. Эта запись была помечена для модератора.


Помощь по сообщениям о нарушениях

Сообщение о нарушениях

Сообщение о нарушении не было отправлено. Попробуйте, пожалуйста, позже.


developerWorks: вход


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

Выберите ваше отображаемое имя

При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

(Должно содержать от 3 до 31 символа.)


Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Оценить эту статью

Комментарии

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Lotus, WebSphere
ArticleID=643333
ArticleTitle=Создание структуры сайта в IBM Lotus Web Content Management одним нажатием кнопки
publish-date=03252011
author1-email=hsoliman@eg.ibm.com
author1-email-cc=
author2-email=KHAIRY@eg.ibm.com
author2-email-cc=

Теги

Help
Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Используйте ползунок, чтобы отразить больше или меньше тегов.

КнопкаПопулярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere).

Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).

Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Кнопка Популярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere). Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).