WCM 8.0 - Listando o conteúdo de uma Área de Site
Autor: Bernardo | Publicado: 2013-10-10T06:04:00-07:00

Diagrama




Instanciação da Workspace

Para se ter acesso ao conteúdo do WCM, via API (Advanced Program Interface), é preciso estabelecer uma Workspace (área de trabalho) do usuário com suas credenciais de acesso (identificador e senha).

Em termos de acesso HTTP, você deve estar se perguntando:


Mas o acesso HTTP não é feito sempre pelo usuário anônimo ?

Este fenômeno ´pode ser explicado pela natureza um pouco diferente dos Portais. O banco de dados é próprio, no entanto, no caso do WCM, o banco é interfaceado por uma camada de acesso de usuário, de forma a manter certos objetos exclusivos para usuários de hierarquia mais elevada. Por exemplo, a gerência do Portal pode julgar que os sites poderão ser criados somente por usuários de nível mais alto.

No caso de Portais cuja interface de acesso chegue DIRETAMENTE ao banco de dados (Oracle, Mysql), este acesso é regulado através dos tradicionais "GRANTs". Para o anônimo (ANONYMOUS) é dada a permissão de leitura e pronto. Em outras palavras, não existem OBJETOS como Site, Área de Site, Componentes e outros, como no WCM. Como consequência a administração do Portal Websphere/WCM fica mais trabalhosa.

Página de código e Bibliotecas necessárias

&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1" %&gt;
&lt;%@page import="com.ibm.workplace.wcm.api.*,
 com.ibm.workplace.wcm.api.exceptions.*,
 java.security.Principal,&nbsp;
 java.util.*,&nbsp;
 javax.servlet.*" %&gt;

As novidades em termo de bibliotecas Java são:



com.ibm.workplace.wcm.api.*
com.ibm.workplace.wcm.api.exceptions.*.



Ambas são propriedade da IBM, atreladas ao Websphere e WCM.

Instruções de instanciação da Workspace



Workspace ws = WCM_API.getRepository().getWorkspace("usuário","senha") ; &nbsp;
ws.setCurrentDocumentLibrary(ws.getDocumentLibrary("Nome da Biblioteca"));



Lembre-se, pelo explicado anteriormente, que para as visualizações pode ser utilizado um usuário unicamente com permissões de leitura. Já para inclusão e alteração de registros no WCM, deve-se utilizar um usuário com permissão de leitura/gravação.

Procura pelo PATH (caminho) da Área de Site

Para tirar qualquer ilusão sobre o WCM, lembre-se que O RESULTADO DE UMA BUSCA É SEMPRE UMA LISTA, e não diretamente um ou mais conteúdos. Esta lista será percorrida pelos iteradores WCM.

Instrução de Busca pelo PATH

DocumentIdIterator saIter1 = ws.findByPath(Biblioteca+"/"+rSiteArea,ws.WORKFLOWSTATUS_PUBLISHED);

A variável Biblioteca tem o nome da Biblioteca (String), e rSiteArea (String) tem o nome da área de site (simples ou composta, com os nomes dos níveis separados por "/"). O segundo parâmetro (WORKFLOWSTATUS_PUBLISHED) especifica que a área de site buscada está entre os conteúdos cujo status é PUBLICADO.

Então, relembrando, o resultado da busca é um apontador (ponteiro) para uma lista de identificadores de conteúdo. Não é uma lista de nomes e nem de títulos, mas de identificadores (IDs).

Por que buscar pelo PATH

O caso de divisão de conteúdos de um tipo por ANO é um bom exemplo. Como, por exemplo, Comunicados pode ser dividido por ano e Avisos também, ambos podem ter uma Área de Site de nome "2012", é preciso acessar cada um, corretamente, pelos seus caminhos:



Avisos/2012
Comunicados/2012



Leitura do primeiro Conteúdo

O método para percorrer a lista (iterador) de um resultado de Busca é next():

DocumentId docItem1 = (DocumentId)saIter1.next();

Cada elemento da lista é da classe DocumentId, ou seja, um identificador do conteúdo.

Acessando o documento descritor da Área de Site

Uma vez que temos o Id da Área de Site nas mãos, vamos acessar o Documento que corresponde à Área de Site. Pode pensar neste documento como uma folha de propriedades da área de site. A área de Site TAMBÉM corresponde a um item de conteúdo do WCM. Sendo a Área de Site um OBJETO, ela precisa ter uma folha de propriedades, como se fosse a sua CARTEIRA DE IDENTIDADE.

SiteArea saItem = (SiteArea)ws.getById(docItem1);



Um outro detalhe é o "cast", ou seja, forçamos este Documento a ser reconhecido como um Documento de Área de Site.



Obtendo a lista de documentos desta Área de Site



Precisamos obter, agora, a lista de conteúdos (IDs) desta área de site. Esta lista corresponde, em termos de acesso, a um novo iterador (esta é a forma típica de acesso do WCM). A instrução para este fim é:



DocumentIdIterator dit = saItem.getChildren();



Aqui a sugestão da sintaxe é a mesma do modelo de objetos do HTML. É como se os itens fossem os "NÓS FILHOS" da área de site.



Relacionando os conteúdos



De posse deste iterador, é possível estabelecer um loop while da seguinte forma:



while(dit.hasNext())&nbsp;{ out.println(dit.next().getName()); }



O método getName(), aplicado ao resultado do método next(), fornece o nome do item de conteúdo (String).



Código Completo




&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1" %&gt;

&lt;%@page import="com.ibm.workplace.wcm.api.*,

 com.ibm.workplace.wcm.api.exceptions.*,

 java.security.Principal,&nbsp;

 java.util.*,&nbsp;

 java.io.*,

 javax.servlet.*" %&gt;



.

 01_Lista_AreaSite_findPath.jsp

 


 

 &lt;%

 String Biblioteca = "imprensa";&nbsp;

 String rSiteArea = "noticias";

 // 1 - Estabelece uma Workspace

 Workspace ws = WCM_API.getRepository().getWorkspace("usuário","senha") ; &nbsp;

 ws.setCurrentDocumentLibrary(ws.getDocumentLibrary(Biblioteca));

 out.println("
[01_ListaConteudo_AreaSite.jsp] Conteúdos da Área de Site noticias:
");

 // 2 - Acha o siteArea pelo iterador (só traz um)

 DocumentIdIterator saIter1 = ws.findByPath(Biblioteca+"/"+rSiteArea,ws.WORKFLOWSTATUS_PUBLISHED);

 // 3 - Pega o primeiro ID (único), mas numa lista

 DocumentId docItem1 = (DocumentId)saIter1.next();

 out.println("docItem1.: "+docItem1.toString()+"
");

 // 4 - Vai em busca do conteúdo (no caso aquele cujo Id acabou de pegar) que tem este Id

 SiteArea saItem = (SiteArea)ws.getById(docItem1);

 // 5 - Pega o iterador de itens de conteúdo para o qual o Id pego anteriormente aponta

 DocumentIdIterator dit = saItem.getChildren();

 String S = null;

 int i = 0;

 while(dit.hasNext()){ out.println(dit.next().getName()); }

 %&gt;