Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Criando uma estrutura do site do IBM Lotus Web Content Management com um clique

Hebba Soliman, Senior Software Engineer, IBM
Hebba Soliman é engenheira de software senior no IBM Cairo Global Delivery Center (C-GDC). Ela tem grande experiência no desenvolvimento e design de aplicativos de Web usando o IBM Workplace Web Content Management e personalização.
Ahmed Khairy, IT Specialist, IBM
Ahmed Khairy é especialista em TI no IBM Cairo Technology Development Center, Egito. Ele trabalhou com vários produtos de software IBM em diferentes marcas de software da IBM. Atualmente ele está fazendo mestrado em Ciência da Computação na American University, no Cairo.

Resumo:  Leia a respeito de uma solução simples que permite definir estruturas de site no IBM® Lotus® Web Content Management de uma maneira automatizada. Esta solução permite economizar tempo em uma tarefa que costuma ser demorada e monótona.

Data:  15/Dez/2009
Nível:  Intermediário
Atividade:  7343 visualizações
Comentários:  


Nota do editor: Conhece muito sobre esse tópico? Deseja compartilhar seu conhecimento? Participe hoje do programa de wiki do software IBM Lotus.

Wiki do Lotus Web Content Management

Introdução

Se você trabalha com o IBM Lotus Web Content Management, uma de suas frequentes tarefas é a definição de estruturas de site. Esta tarefa é, por natureza, demorada e repetitiva; são necessárias mais de 10 etapas distintas para criar um único site ou área de site. Além disso, as estruturas de site não são portáteis; não é possível exportar sua estrutura de site de uma biblioteca em um servidor para uma biblioteca diferente em outro servidor. Em vez disso, é necessário recriar toda a estrutura de site manualmente.

Uma vez que a quantidade de sites e áreas de site que formam uma única estrutura de site pode chegar aos milhares, faz-se necessário um método para automatizar o processo de definição da estrutura de site e para facilitar a movimentação, exportação e importação. Neste artigo, é possível aprender uma maneira simples de definir sua estrutura de site como um arquivo XML e implementá-la.


Pré-requisitos

É necessário que você esteja familiarizado com as seguintes tecnologias:

  • IBM WebSphere® Portal V6.0 e posterior, sua administração e componentes
  • IBM Lotus Web Content Management
  • XML

Para demonstrar como é possível criar uma estrutura de site no Lotus Web Content Management sem que seja necessário criar manualmente todos os sites e áreas de site, este artigo usa as APIs e um arquivo XML do Lotus Web Content Management que contêm a estrutura do site. É possível criar o arquivo XML que contém a estrutura validando-a no esquema XML fornecido na seção Downloads deste artigo. O esquema XML valida a estrutura e os campos obrigatórios para evitar erros de tempo de execução.

É possível definir vários sites, áreas de site e componentes padrão para criar a estrutura de site no documento XML que contém a estrutura de site completa. Primeiramente, crie os seguintes pré-requisitos:

  • Biblioteca do Lotus Web Content Management
  • Modelos de desenvolvimento a serem usados na estrutura do site
  • Modelos de apresentação a serem usados na estrutura do site
  • Usuários a serem usados na seção de configurações de segurança
  • Fluxos de trabalho, ações do fluxo de trabalho e estágios do fluxo de trabalho a serem usados nos modelos de desenvolvimento

Em seguida, defina a estrutura do site na forma de um arquivo XML, especificando a biblioteca, sites, áreas do site e assim por diante. Para assegurar que as informações fornecidas são suficientes para criar um site no Lotus Web Content Management, o arquivo XML é baseado no esquema definido no arquivo XSD fornecido na seção Downloads deste artigo. O arquivo XSD contém todas as validações necessárias para criar uma estrutura de site completa, com conteúdo padrão que contêm alguns campos.

Em seguida, crie o componente JSP para analisar o arquivo XML e criar as áreas do site definidas nele.


Implementação

Nesta seção, descrevemos as etapas necessárias para implementar a solução. Começamos discutindo a criação do arquivo XML e do arquivo XSD e, em seguida, passamos ao componente JSP que analisa este arquivo.

Criação do XML

O arquivo XML contém todas as informações necessárias para criar a estrutura do site. Ele contém o nome da biblioteca, a estrutura do site, a estrutura da área do site e seu conteúdo padrão. Um arquivo XML deve ser definido em uma estrutura que corresponda aos seus requisitos. Consulte o XML de exemplo na Listagem 1, que corresponde à estrutura do site mostrada na figura 1.


Figura 1. Estrutura do site

O site é formado por uma única área do site; esta área única é, por sua vez, formada por outra área do site.


Listagem 1. XML de exemplo usado na criação da estrutura do site
<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>

A Figura 2 mostra um exemplo de mapeamento entre os elementos XML e a saída criada após a implementação da solução.


Figura 2. Mapeando entre o XML e os objetos e seções do Lotus Web Content Management

Como é possível ver, o mapeamento da estrutura do site real para o arquivo XML é realizado de forma direta, com um elemento-raiz representando a biblioteca. Este elemento-raiz contém outro elemento que corresponde ao site, definindo seu nome e nome de exibição. As áreas do site são definidas em forma de aninhamento no arquivo XML a fim de obter a estrutura do site necessária.

Todo site e área do site contêm uma seção de configurações que traz as seções de configurações de segurança e o mapeamento do modelo. As restrições a seguir devem ser consideradas: As configurações de segurança e o mapeamento do modelo podem ser criados para cada site ou área do site em seu respectivo elemento ou no site ou área do site de posição mais elevada na árvore, sendo herdados por seus elementos-filho.

As configurações de segurança do conteúdo e os fluxos de trabalho são adicionados ao componente do modelo de desenvolvimento e não à seção de conteúdo padrão no arquivo XML.

Os modelos de desenvolvimento e de apresentação usados no mapeamento do modelo e na criação do conteúdo padrão devem ser criados previamente.

O conteúdo padrão pode ser reusado em várias áreas do site por meio da definição de seu nome. Após definir um elemento de conteúdo padrão completo no arquivo XML, é possível usá-lo definindo uma tag de conteúdo padrão contendo apenas o elemento do nome. Este recurso de reusar o conteúdo padrão em diferentes locais pode ser utilizado caso o conteúdo padrão já exista nessa biblioteca.


Validações do esquema XML

Conforme afirmado anteriormente, para evitar a perda de dados necessários para a criação de sites no Lotus Web Content Management, é necessário que o arquivo XML seja compatível com um XSD. Essa compatibilidade garante que as validações listadas na tabela 1 sejam verdadeiras.


Tabela 1. Elementos do esquema/validações dos atributos XML
ElementoElemento/atributoTipoIntervalo válidoValor
BibliotecaSites Elemento0..nNA
BibliotecaNomeAtributoObrigatóriocadeia de caractere
SiteSiteAreaElemento0..nNA
SiteNomeAtributoObrigatóriocadeia de caractere
SiteDisplayNameAtributoOpcionalcadeia de caractere
SiteConfiguraçõesElementoOpcionalNA
SiteAreaSiteAreaElemento0..nNA
SiteAreaNomeAtributoObrigatóriocadeia de caractere
SiteAreaDisplayNameAtributoOpcionalcadeia de caractere
SiteAreaConfiguraçõesElementoOpcionalNA
SiteAreaDefaultContentElementoOpcionalNA
DefaultContentNomeElementoObrigatórioNA
DefaultContentDisplayNameElementoOpcionalNA
DefaultContentAuthoringTempElementoOpcional (se o item já tiver sido criado anteriormente)NA
DefaultContentTextComponentElemento0..nNA
DefaultContentRichTextComponentElementoOpcionalNA
TextComponentFieldNameElementoObrigatório (referenciando o nome do campo TextComponent do Lotus Web Content Management, como no modelo de desenvolvimento)NA
TextComponentTextComponentElementoObrigatórioNA
TextComponentFieldNameElementoObrigatório (referenciando o nome do campo RichTextComponent do Lotus Web Content Management, como no modelo de desenvolvimento)NA
TextComponentTextComponentElementoObrigatórioNA
ConfiguraçõesTemplateMappingElemento0..nNA
ConfiguraçõesSecuritySettingsElementoOpcionalNA
TemplateMappingAuthoringTempElementoObrigatório (referencia o nome do modelo de desenvolvimento do Lotus Web Content Management)NA
TemplateMappingPresentationTempElementoObrigatório (referencia o modelo de apresentação do Lotus Web Content Management)NA
SecuritySettingsAccessRightElemento0..nNA
AccessRightTipoAtributoObrigatórioaddReadAccessMembers/
addEditAccessMembers
ou
addDeleteAccessMembers
AccessRightAcessoElemento1..nNA

Componente JSP

Agora que você definiu a estrutura do seu site em um arquivo XML compatível com o XSD, é necessário criar um componente JSP que manipula a análise do arquivo XML e realiza a criação real do site do Lotus Web Content Management usando as APIs do Lotus Web Content Management para importar sua estrutura do site na biblioteca do Lotus Web Content Management.

Selecione New - JSP component. Crie o componente JSP com o nome jsp_createSiteStructure e deixe que ele aponte para um arquivo JSP cujo caminho seja /jsp/html/createSiteStructure.jsp. Armazene seus componentes JSP no portlet local Rendering. O caminho físico do arquivo JSP está em um diretório semelhante ao código mostrado na Listagem 2.


Listagem 2. Diretório do caminho físico
<websphere portal installation path>\installedApps\
WCM_Local_ng_Portlet_PA_dvme0nk.ear\PA_dvme0nk.war\jsp\html\
createSiteStructure.jsp

O arquivo JSP cria um botão chamado Create Site Structure que, quando clicado, inicia a análise do arquivo XML primeiramente analisando cada site. É possível editar o caminho para o arquivo XML. Pressupõe-se que o arquivo usado na Listagem 3 esteja no mesmo local do arquivo JSP. O código obtém o espaço de trabalho e se conecta à biblioteca definida no arquivo. Ver código na Listagem 3.


Listagem 3. O arquivo JSP que cria o novo conteúdo de comentário
<%@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 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();
	}	 
%>

É usada uma classe de utilitário que contém todos os métodos auxiliares do código JSP para criar a estrutura do site. Para os objetivos deste artigo, pode ser criado um componente JSP chamado wcmUtil.jsp e que contenha todos esses métodos. O componente JSP é incluído em createSiteStructure.jsp, conforme mostrado na Listagem 3, usando a seguinte listagem <%@ include file="wcmUtil.jsp"%>.

As Listagens 4 a 20 mostram os métodos usados em uma classe auxiliar para criar a estrutura do site.


Listagem 4. Conectar-se ao espaço de trabalho e à biblioteca
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;
}


Listagem 5. Analisar e criar o site
/*
	*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;
} 


Listagem 6. Analisar e criar a área do site
/*
*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;
}


Listagem 7. Analisar e criar o conteúdo padrão
/*
*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;
}


Listagem 8. Analisar o componente de texto
/*
*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;
  }
	
}


Listagem 9. Analisar o componente de rich text
/*
*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;
  }
}


Listagem 10. Criar e adicionar o componente de texto
/*
* 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;
}


Listagem 11. Criar e adicionar o componente de rich text
/*
* 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;
}


Listagem 12. Analisar o elemento das configurações
/*
*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;
}


Listagem 13. Adicionar SecuritySettings aos objetos do 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 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;
}


Listagem 14. Analisar e adicionar o SiteArea do Mapeamento do Modelo
/*
*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;		
}


Listagem 15. Salvando os objetos do Lotus Web Content Management no espaço de trabalho
/*
 * 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;		
}


Listagem 16. Recuperar os objetos do Lotus Web Content Management pelo caminho
/*
 * 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;
}


Listagem 17. Recuperar o elemento-filho pelo nome
/*
 * 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;
}


Listagem 18. Recuperar o valor do elemento pelo nome
/*
 * 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;			
}


Listagem 19. Recuperar o objeto do Lotus Web Content Management pelo nome
/*
 * 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;
}


Listagem 20. Fechar o espaço de trabalho do Lotus Web Content Management
/**
   * Closes the Lotus Web Content Management workspace
   */
public void closeWorkspace() {
	WCM_API.getRepository().endWorkspace();
}

OBSERVAÇÃO: A manipulação de exceção é realizada apenas para fins de ilustração, e não para manipulação da qualidade da produção. Se necessário, ela deve ser modificada para atender às suas expectativas e necessidades.

Importantes avisos foram reportados pela classe auxiliar:

  • Os usuários são notificados por uma mensagem de aviso que houve erros e que a criação não foi concluída com êxito.
  • Os erros são registrados no arquivo SystemOut.log para que você possa examinar mais informações sobre o erro.
  • Os erros que ocorrem quando os usuários do repositório não são encontrados resultam no registro de um erro, mas também são geradas mensagens Creation Completed para os usuários.

Aprimoramentos

É possível aprimorar a solução proposta neste artigo por meio do seu uso. Por exemplo, é possível fazer o seguinte:

  • Criar conteúdos usando XML
  • Adicionar componentes mais complexos ao conteúdo e ao conteúdo padrão
  • Alterar o XML para criar a mesma estrutura inúmeras vezes alterando apenas o nome da área do site

Conclusão

Neste artigo, apresentamos uma solução simples que permite definir estruturas do site de maneira automatizada. Há diversos usos possíveis desta solução; por exemplo, é possível definir áreas do site em diversos servidores ou ter um site com uma grande quantidade de estruturas de site repetidas dentro dele. Esta solução permite economizar tempo em uma tarefa que costuma ser demorada e monótona.


Agradecimentos

Os autores gostariam de expressar sua gratidão a Mourad El-Badry, Raul Munoz Serrano e Tamer El-Mekky, que dedicaram algum tempo de sua ocupada agenda para revisar este artigo e fornecer seus comentários.



Downloads

NomeTamanhoMétodo de download
SiteCreation.xsd3628BHTTP
NewsSiteStructure.xml1933BHTTP

Informações sobre métodos de download


Recursos

Sobre os autores

Hebba Soliman é engenheira de software senior no IBM Cairo Global Delivery Center (C-GDC). Ela tem grande experiência no desenvolvimento e design de aplicativos de Web usando o IBM Workplace Web Content Management e personalização.

Ahmed Khairy é especialista em TI no IBM Cairo Technology Development Center, Egito. Ele trabalhou com vários produtos de software IBM em diferentes marcas de software da IBM. Atualmente ele está fazendo mestrado em Ciência da Computação na American University, no Cairo.

Ajuda para Relatar Abuso

Relatar abuso

Obrigado. Esta entrada foi sinalizada para atenção do moderador.


Ajuda para Relatar Abuso

Relatar abuso

Falha no envio do Relatório de abuso. Tente novamente mais tarde.


developerWorks: Registre-se


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Selecione seu nome de exibição

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

(Deve possuir de 3 a 31 caracteres.)


Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Classificar este artigo

Comentários

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Lotus, WebSphere
ArticleID=455958
ArticleTitle=Criando uma estrutura do site do IBM Lotus Web Content Management com um clique
publish-date=12152009
author1-email=hsoliman@eg.ibm.com
author1-email-cc=
author2-email=KHAIRY@eg.ibm.com
author2-email-cc=

Conheça a IBM da sua cidade

Virtual Branch Office Brasil

A IBM está mais perto do que você imagina!


Tags

Help
Use o campo de pesquisa para encontrar todos os tipos de conteúdo no My developerWorks com essa tag.

Use a barra de rolagem para ver mais ou menos tags.

Tags populares mostra as principais tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Minhas tags mostra suas tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Use o campo de pesquisa para localizar todos os tipos de conteúdo no Meu developerWorks com essa tag. Tags populares mostra as tags principais para essa zona de conteúdo particular (por exemplo, tecnologia Java, Linux, WebSphere). My tags shows your tags for this particular content zone (for example, Java technology, Linux, WebSphere). Minhas tags mostra as suas tags para essa zona de conteúdo em particular (por exemplo, tecnologia Java, Linux, WebSphere).