quinta-feira, 10 de outubro de 2013

WCM 8.0 - Listando o conteúdo de uma Área de Site

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

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

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") ;  
  • 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()) { 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

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" %>
<%@page import="com.ibm.workplace.wcm.api.*,
com.ibm.workplace.wcm.api.exceptions.*,
java.security.Principal, 
java.util.*, 
java.io.*,
javax.servlet.*" %>
.
01_Lista_AreaSite_findPath.jsp
<%
String Biblioteca = "imprensa"; 
String rSiteArea = "noticias";
// 1 - Estabelece uma Workspace
Workspace ws = WCM_API.getRepository().getWorkspace("usuário","senha") ;  
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()); }
%>












terça-feira, 8 de outubro de 2013

IBM WCM 8.0 - Mudanças de Estrutura de Site e Área de Site

No menu de Explorador de conteúdo do WCM do IBM WebSphere, nota-se a exclusão do item Site e do item Áreas de Site. Os conteúdos são listados por Categoria ou através dos itens de conteúdo, que abrem as Áreas de Site correspondentes.

Internamente, o acesso às áreas de site também mudou. O primeiro nível corresponde a Site, e daí por diante corresponde às áreas de site. Isto afeta os tipos de objetos utilizados para acesso via servlets. Vamos explicar tudo neste post.

O menu do WCM 6.0



O menu do WCM 8.0


O WCM 8 não tem o menu de Áreas de Site. Isto economiza recursos de enumeração destes objetos. Em contrapartida, os conteúdos são apresentados por Áreas de Site.

Quanto à performance, mesmo abrindo os menus no sinal de "+", o desempenho não é bom, pois não existem níveis armazenados em cache.








sábado, 15 de outubro de 2011

Conceitos WCM IV - Biblioteca (Library)

A Biblioteca é um repositório de objetos (Componentes). No estabelecimento de uma Workspace pode-se chamar Componentes de qualquer Biblioteca (utilizando a referência Biblioteca/Componente).

Só se pode referenciar um componente, um conteúdo, templates e categorias pela sua Biblioteca. Portanto, planeje bem a divisão dos seus objetos de site, de forma a permitir a manipulação pelos grupos corretos de usuário somente em suas Bibliotecas específicas.

Em uma empresa, os conteúdos deverão estar divididos em áreas de sites contidas em Bibliotecas como:


  • Comercial
  • Financeira
  • Imprensa
  • Recursos Humanos


Para que as informações de cada tipo de departamento, seção, gerência, superintendência e diretoria só sejam acessadas pelos seus mantenedores.

Já áreas como Planejamento e Auditoria deverão ter acesso a todas elas, por motivos óbvios.

A etapa de criação desta organização deverá ser bem feita, para evitar cruzamentos funestos de permissões, e consequentes alterações indevidas de conteúdos por áreas não desejadas. E não adianta nada o log de alterações de conteúdos depois que algo danoso já foi feito. Não adianta punir os agentes das alterações, pois a informação já terá sido perdida. Quem deve ser punido é o Gerenciador do Processo de implantação do Portal no WCM, pois dele é a responsabilidade de planejar a divisão das Bibliotecas pelos grupos de acesso.

Aconselhamos a consulta ao blog Gestão de Conhecimento.

sexta-feira, 2 de setembro de 2011

Listando e exibindo imagens do WCM através de um servlet - JSP - I

Mecanismo a princípio incompreensível é a manipulação de imagens por uma script JSP externa ao WCM, porém dentro do espaço do Websphere.

Alguns pontos teóricos necessários para se compreender a script que está mais abaixo:
  • Imagens não pertencem a uma área de site (sitearea) ou site específico. Elas pertencem e devem ser procuradas diretamente abaixo do nível biblioteca (Library);
  • As imagens são armazenadas na biblioteca como streams de bytes em java, e para exibição devem ser transformadas em arrays de bits;
  • Imagens, seja no formato jpeg, seja no formato gif, correspondem ao MIME (tipo de conteúdo para o protocolo http) image/jpeg;


Script JSP para listar as imagens de uma Biblioteca

Os trechos da script estão enumerados e explicados a seguir. Ao final, basta uní-los em uma script com extensão JSP.

Bibliotecas necessárias



<%@ page language="java" contentType="text/html; charset=ISO-8859-1" %>
<%@page import="com.ibm.workplace.wcm.api.*, com.ibm.workplace.wcm.api.exceptions.*,java.security.Principal, java.util.*, javax.servlet.*" %>
<%@page import="com.ibm.workplace.wcm.api.exceptions.*,
	java.security.Principal,
	java.io.*,
	java.lang.*" %>
<%@ taglib uri="/WEB-INF/tld/wcm.tld" prefix="wcm" %>


Declarações básicas HTML


O tipo de documento HTML, estilos e o content-type do META são todos triviais. Um acréscimo é a poderosa framework jQuery, cujo uso é justificado pelo fato dela oferecer uma compatibilidade de código javascript muito grande. Já existem versões mais avançadas, mas aqui está declarada em 1.3.2. A biblioteca javascript jquery.tablesorter não precisa ser entendida profundamente, mas oferece a seguinte vantagem:

Clicar no título da coluna que se quer ordenar da tabela de imagens provoca a ordenação do conteúdo da tabela pelo conteúdo desta coluna. Isto economiza chamadas ao banco do WCM . Esta ordenação é feita no micro cliente, e não no servidor.

Rotinas Javascript de apoio




A função init faz a inicialização da rotina de ordenação da biblioteca javascript jquery.tablesorter. Ela faz a leitura dos conteúdos das tags TH, que deverão estar dentro de tags THEAD. As linhas de resultado deverão estar também dentro de tags TBODY. Do contrário, o tablesorter não fará a correta interpretação da tabela. E não se esqueça que o atributo id da TABLE deverá ser Resultset.

Inicialização do código JSP


<%
String sNome = "";
String sSenha = "";
// Biblioteca Default
String Biblioteca = "";
if( request.getParameter("Bib") != null ) {
Biblioteca = request.getParameter("Bib");
}

Este trecho coleta parâmetros que serão aproveitados em toda a script. São eles:

NOME - Substitua pelo nome de usuário, registrado no LDAP e declarado no Websphere e WCM. Nestes dois últimos consta o Web Anonymous para acesso via HTTP. Como esta script vai abrir uma workspace que precisa de acesso tanto aos componentes quanto ao espaço de renderização, e a senha do Anonymous deve ser mantida em segredo, vamos precisar de um nome de usuário;
SENHA - Senha do usuário cujo identificador é NOME;
NOME DA BIBLIOTECA - É fornecido através da URL, que pode recebê-lo de um formulário. Neste caso, é um parâmetro de name Bib na URL ou num INPUT de FORM;

Isto corrobora nossa afirmação de que as imagens estão no nível das bibliotecas (Library), e não precisam de acesso à hierarquia das áreas de site.

Constantes para facilitar a leitura de código no trecho principal


// Constantes
String baseURL = "http:///wps/wcm/jsp/html/LeConteudoImprensa.jsp?Bib="+Biblioteca+"&Nome=";
String baseURLRest = "http:///wps/wcm/jsp/html/conteudoRestartar.jsp?Bib="+Biblioteca+"&Nome=";
String eRecDoc = "Não consegui recuperar o documento
";

String eAutorz = "Sem autorização
";


Workspace e cabeçalho


A workspace é estabelecida com base no usuário, conforme já explicamos. O cabeçalho da página é um simples header H1.

Busca pelas imagens e inicialização da lista com pointers





A lista de imagens é colocada num objeto do tipo iterador (iterator) na forma de ponteiros para cada uma delas. É preparado o cabeçalho da TABLE, na forma que é exigida pelo jquery.tablesorter.

Loop de exibição dos itens de imagem



Finalizações


Emite um fechamento de table () e fecha a workspace (é necessário). Fecha a script (%>), ajusta a tag IFRAME (onde a figura vai ser exibida) e fecha a tag BODY.


No próximo post mostraremos o servlet chamado no link VER para exibir a figura na IFRAME desta script.


















sexta-feira, 12 de agosto de 2011

Criando um site no WCM com JSP

O WCM (1) define e (2) acessa uma estrutura lógica hierárquica expressa da seguinte forma:




O Repositório é um cenário em um momento, onde existem usuários com sessões estabelecidas e transações ativas. Usaremos o termo transação apesar de não ser muito apropriado para Gerenciamento de Conteúdo. Cada transação estabelece uma Workspace usando um usuário e senha, e várias podem ser estabelecidas por usuário (pelo menos ao nível da API).

O Site

O site não está em uma Workspace; ele reside em uma Biblioteca das várias que podem existir de Documentos (Document Library) mas é manipulado  em uma Workspace. Em outras palavras, a Workspace é uma situação ativa que modifica uma Biblioteca de Documentos do WCM. Portanto, a figura anterior é um "retrato" de algo acontecendo no WCM.

Criando uma área de site no WCM com JSP

Existem algumas bibliotecas necessárias para que um site seja criado em uma Biblioteca:


<%@page import="java.util.*,
java.security.*,
java.io.*,
java.net.*,
java.text.*,
javax.servlet.http.*"%>
<%@page import="com.ibm.workplace.wcm.api.*,
com.ibm.workplace.wcm.api.exceptions.*"%>

As primeiras são do "mínimo de java" para manipular servlets. O segundo grupo são também "o mínimo de bibliotecas" WCM utilizadas para criar o site.

Coletando dados do usuário

// Usuário autenticado
String sNome = session.getAttribute("Nome").toString();
String sSenha = session.getAttribute("Senha").toString(); 

Estas são variáveis de sessão, à semelhança do ASP, espécie de cookies, com o usuário e a senha, para que o WCM saiba que quem entrou está autorizado a criar Workspaces.

Coletando dados do site


// Parâmetros para o novo site
String sNomeSite = request.getParameter("NomeSite");
String sTituloSite = request.getParameter("TituloSite");
String sDescricaoSite = request.getParameter("DescricaoSite");
String Biblioteca = request.getParameter("Bib");

Um site deve ter um nome, um título, uma descrição, e pertencer a uma Biblioteca. O site é de uma Biblioteca e não do Workspace.

Configurando um Workspace

// Configura workspace
Workspace ws = WCM_API.getRepository().getWorkspace(sNome,sSenha);
Workspace workspace = ws;

Confirmamos, com os comandos acima, o que dissemos sobre Workspace: Ela é um espaço intermediário para poder manipular os documentos das bibliotecas. É uma transação no sentido meio torto do termo.

Entrando no nível das Bibliotecas


// Acessa a Biblioteca de documentos
DocumentLibrary dl = ws.getDocumentLibrary(Biblioteca);
ws.setCurrentDocumentLibrary(dl);


Os documentos da Biblioteca apontada nos parâmetros para o novo site são referenciados por um ponteiro (dl).

Configurando as propriedades do objeto para criação do site


// Cria o SCHEMA do site
Site siteCriado = ws.createSite();
siteCriado.setName(sNomeSite);
siteCriado.setTitle(sTituloSite);
siteCriado.setDescription(sDescricaoSite);

Como tudo no WCM funciona a base de manipulação de objetos através da sua API, basta alimentar os parâmetros para o método createSite desta mesma API.

Concluindo a transação


// Grava o SCHEMA no WCM
String[] saveErrors = ws.save(siteCriado);
// Dá o logoff
ws.logout();



sexta-feira, 5 de agosto de 2011

Servlets JSP

Onde colocar

Os servlets escritos em JSP devem ser colocados na árvore de diretórios do Websphere em:


c:\ibm\wp_profile\installedApps\node\wcm.ear\ilwwcm.war\jsp\html\

onde node é o nome da aplicação criada para ser a base de diretórios da instalação do WCM. Qualquer dúvida, procure com o buscador de arquivos do seu servidor o nome "wcm.ear".

Criando o componente JSP





sexta-feira, 29 de julho de 2011

Incluindo bibliotecas já criadas no WCM

Uma das operações meio escondidas do WCM, por ser pouco usada, é a inclusão de uma Biblioteca que foi criada para desenvolvimento.

Na orelha de Conteúdo da Web, clique em Personalizar:



Aparece a tela:


Selecione um nome da esquerda e pressione Incluir, ou um nome da direita e pressione Remover.

Pressione OK e pronto.