WebCenter Content – Importação em Massa

Muitas implementações de soluções de gestão de conteúdo envolvem a migração de grandes quantidades de documentos de sistemas legados para o novo repositório. Neste post iremos analisar algumas opções e estratégias de migração que podem ser usadas, além de conhecer alguns fatores que podem impactar na performance.

OBS: O objetivo deste post não é ser um material completo sobre importação, uma vez que este assunto envolve diversos fatores. O processo de migração deve ser feito por especialistas, sempre seguindo as orientações da documentação. O Suporte Oracle também pode ser acionado em caso de dúvidas.

Extração do Legado

O grande desafio é realmente extrair os documentos dos repositórios legados, uma vez que a maioria é baseada em tecnologias antigas, e não oferecem muitas opções de integração, como java ou web services. A dica aqui é exportar os documentos para uma estrutura de pastas, e os metadados (atributos) para uma planilha Excel. Outra opção mais avançada é o desenvolvimento de uma aplicação que extrai os documentos do legado, ao mesmo tempo em que importa os documentos para o Content. Isso funciona melhor com menores volumes, mas para milhões e milhões de documentos, pode ser um caminho mais lento e sujeito à erros.

Preparando o ambiente para importação

O Content vem configurado out-of-the-box para funcionar em diferentes cenários, o que significa que ele não está nativamente otimizado para um cenário de importação em massa. Por isso, é recomendável fazer as seguintes configurações:

- Aumentar o tamanho da heap da JVM. Isso pode ser feito pelo Weblogic Console, seguindo a documentação. Um valor de 2GB é o ideal. Também é importante definir o mínimo e máximo com o mesmo valor (2048m), por motivos de performance.

- Caso não seja necessário converter para PDF, iniciar um workflow, e indexar full-text, o Fast CheckIn passa a ser um recurso altamente recomendável: com ele, o tempo de inserção é praticamente instantâneo! Porém, o documento só poderá ser buscado através dos metadados (conforme eu descrevi em um post anterior).

- Caso exista a necessidade de gerar o thumbnail, mas não a conversão para PDF, o Inbound Refinery não precisa ser usado;  a partir da versão 11.1.1.6, o próprio Content Server pode gerar os thumbnails, sem a necessidade de enviar o arquivo para o IBR. Esta configuração pode ser feita no menu Administration –> Configure Thumbnail Options

image

OBS: Lembre-se que esta operação irá passar a onerar o Content Server, portanto o dimensionamento do ambiente deverá ser feito de acordo, para acomodar esta nova demanda.

- Normalmente, os arquivos importados precisam de conversão e indexação, portanto o cenário de importação que iremos trabalhar será dividido em 3 etapas: Carga, Conversão e Indexação.

A recomendação é separar as etapas, ou seja, enquanto o BatchLoader estiver sendo executado, os servidores de Inbound Refinery devem ficar desabilitados (fora do ar), e o Auto-Indexer do Content (no applet Repository Manager, aba Indexer) deve ficar desabilitado:

image

Desta forma, podemos garantir que não haverá contenção no banco de dados, e que cada atividade tem todos os recursos à disposição. OBS: Não é mandatório separar as camadas desta forma, e para uma importação pequena (dezenas de milhares ou centenas de milhares), a importação, conversão e indexação podem ser feitas em paralelo. Mas quando estamos falando em milhões, é melhor separar as etapas.

  • Carga:

Nesta etapa, os documentos serão armazenados no repositório. A ferramenta padrão para esta atividade é o BatchLoader. Esta ferramenta trabalha com um arquivo texto de importação, que lista todos os arquivos que devem ser importados, e os atributos de cada um. O segredo aqui é usar um Excel como base para os atributos, porque com uma macro simples é possível gerar o arquivo de saída no formado do BatchLoader. Se você quiser um arquivo de exemplo com a macro, deixe um comentário!

Recomendações:

- Tire os servidores de IBR do ar e desabilite o Auto-Index antes de iniciar a importação.

- Caso você tenha um cluster de WebCenter Content (o que é sempre recomendado :) , divida a carga entre os nós do cluster. Ou seja, ao invés de importar 200.000 documentos no primeiro nó, importe 100.000 em cada nó do cluster, ao mesmo tempo. Isso vai otimizar bastante o processo de importação.

- Separe a carga em arquivos de batch. Cada arquivo deverá ter entre 10.000 e 15.000 documentos. Porém, é possível executar vários arquivos de batch na sequência, para que tenhamos 100.000, 200.000, 300.000 importações por vez.

Após terminar a importação, podemos fazer uma query no banco de dados para acompanhar o status do nosso processo:

select DSTATUS, count(DSTATUS) from REVISIONS group by DSTATUS;

GENWWW          100.000
DONE                                0
RELEASED       1.549.327

GenWWW são os documentos que acabaram de ser importados, e agora precisam ser convertidos. Após convertidos, os documentos mudarão o status para Done. Finalmente, quando terminarem de ser indexados e estiverem prontos para serem utilizados, ganharão o status Released.
OBS: Naturalmente o status DONE não vai aparecer no resultado da query se estiver com valor zero. Eu adicionei a informação apenas para esclarecimento.


 

  • Conversão:

A primeira dica é ter mais de uma instância de Inbound Refinery, preferencialmente em servidores físicos separados. O IBR não trabalha em cluster, portanto a configuração é muito simples, e você pode descontinuar os IBRs extras uma vez que a sua importação tenha terminado. 4 instâncias é um número bom para grandes importações. Basta registrar todas as instâncias como Providers no WebCenter Content, e ele distribui a carga automaticamente.

Uma vez que as importações terminaram, vamos ter algumas centenas de milhares de arquivos na fila de conversão (status GenWWW). A configuração out-of-the-box do WebCenter Content não prevê uma fila de conversão deste tamanho, portanto vamos ter que inserir um parâmetro de configuração no config.cfg do WebCenter Content, que vai definir como ele controla a fila de indexação:

- RefineryJobExpirationTime: define por quanto tempo um documento vai ficar na fila de conversão até expirar. O tempo padrão são 4 horas (14400 segundos). Vamos modificar este valor para 86400 (24 horas). Portanto, o parâmetro fica:

RefineryJobExpirationTime=86400

Antes de reiniciar o Content, vá no menu Administration –> System Audit Information. Na seção Tracing Sections, defina o tracing para ibrsupport. Desta forma poderemos ver se o parâmetro foi corretamente configurado:

image

Após reiniciar o Content vá no menu Administration –> System Audit Information e clique no link View Server Output. Aqui vemos como ficaram os parâmetros:

image

OBS: No config.cfg, o parâmetro é definido em segundos (86400), mas no output do sistema ele é representado em milissegundos (86400000).

Inicie os IBRs. Você pode acompanhar a evolução da conversão pela Web, na aba Items In Queue do IBR:

image

Ou pelo banco de dados, com estas queries:

select DSTATUS, count(DSTATUS) from REVISIONS group by DSTATUS;
(monitore a quantidade de GENWWW), e

select count(*) from refineryjobs;

Quando o número de GenWWW chegar à zero, podemos iniciar a Indexação. O resultado da query fica:

GENWWW                       0
DONE                   100.000
RELEASED       1.549.327


 

  • Indexação:

Se o seu banco de dados estiver com uma capacidade de processamento boa, você pode fazer a indexação ao mesmo tempo em que faz as conversões. Porém, ambos os processos utilizam pesadamente o banco de dados, portanto em sistemas com menos recursos, é interessante separar os processos.

Para iniciar a indexação, basta habilitar o auto-indexador no applet do Repository Manager. Você vai perceber que o processo iniciará em alguns momentos.

Uma vez que tudo estiver terminado, você pode iniciar o próximo lote.

Vale a pena testar estas quantidades para chegar no volume ideal para o seu ambiente: você pode importar muito mais do que 100.000 durante o dia, e deixar a conversão e a indexação rodando à noite, para importar mais no dia seguinte.

Até a próxima!

Posted in ECM, Oracle | Tagged , , , , , , | Leave a comment

2012 in review

Nada mal para um blog que teve 4 posts novos no ano…heheheh…

The WordPress.com stats helper monkeys prepared a 2012 annual report for this blog.

Here’s an excerpt:

600 people reached the top of Mt. Everest in 2012. This blog got about 1,900 views in 2012. If every person who reached the top of Mt. Everest viewed this blog, it would have taken 3 years to get that many views.

Click here to see the complete report.

Posted in Uncategorized | Leave a comment

WebCenter Sites – Navegação

Continuando com o post anterior, agora que estamos com o ambiente no ar, podemos explorar os recursos do WebCenter Sites.

OBS: Este post é uma continuação direta do anterior. Se você não tem um ambiente com o Sites instalado e rodando, clique no link anterior para fazer esta configuração.

Vamos acessar a interface do Contributor com o usuário demo, senha demo.

Na interface de contribuição, podemos ver dois grupos de pastas no painel à esquerda, Placed Pages e Unplaced Pages:

image

Placed Pages são as páginas que irão definir a estrutura de navegação do site: menus, mapa do site, etc. As Unplaced Pages não irão aparecer nos menus, podendo apenas ser acessadas diretamente (se o usuário souber a URL).

Podemos ver que a página Football está entre as páginas Unplaced, logo ela não aparece na barra de links do site:

image

(repare que a barra de navegação segue a estrutura da árvore Placed Pages)

Um duplo click na página Football irá abrir uma nova aba no Contribuidor, com esta página no modo preview:

image

A nossa página de Futebol precisa de alguns ajustes antes de ir para o ar. Vamos fazer algumas modificações e depois tornar a página visível aos usuários.

Para editar a página, clique no botão Edit (image), na barra de botões.

Movendo o mouse pela página, podemos ver as regiões de conteúdo (chamadas Slots). Podemos ver também que existem regiões vazias, aonde podemos adicionar conteúdo:

image

O primeiro passo é trocarmos o banner. No campo de busca (ao lado superior direito da tela), selecione Image e digite banner:

image

Nos resultados de busca, podemos ver que não existem outros banners para futebol:

image

Portanto, teremos que criar novos banners para substituir o atual. Como exemplo, criei alguns banner que podemos usar:

http://e20lad.files.wordpress.com/2012/11/banner_football_1.jpg

http://e20lad.files.wordpress.com/2012/11/banner_football_2.jpg

http://e20lad.files.wordpress.com/2012/11/banner_football_3.jpg 

http://e20lad.files.wordpress.com/2012/11/banner_football_4.jpg

Salve estes arquivos no seu desktop e siga estes passos para carregar os banners no Sites:

Na tela do Contributor, clique em Content –> New –> Image

image

Preencha os atributos no formulário de checkin e selecione o arquivo. Não esqueça de definir a Categoria como banner:

image

Repita os passos para criar os demais banners. Voltando à página Football, clique no link Content Tree no painel da esquerda, e expanda as pastas Media –> Banners. Podemos ver os banners que criamos nesta lista:

image

Com a página em modo de edição, clique em um dos novos banners e arraste até a página, posicionando por cima do banner atual:

image

Podemos ver que o banner foi substituído pelo novo:

image

Caso queira salvar a alteração, clique no botão Save (image). OBS: Caso a alteração não apareça imediatamente quando você salvar, verifique o cache do navegador.

Em seguida vamos trocar a ordem dos artigos em destaque. Com a página em modo de edição, clique no segundo artigo da lista e arraste para o lugar do primeiro artigo:

image

Podemos ver que a ordem dos artigos foi modificada:

image

Podemos também modificar a chamada do artigo. Para isso, clique no painel Article #1 para exibir o menu de opções. Clique na primeira opção (Edit):

image

O artigo entra em modo de edição. Clique no texto da chamada e faça alguma alteração:

image

Outra coisa que podemos também modificar é a forma como o artigo será exibido na página. Basta clicar no botão Change Content Layout:

image

Selecione outro layout para ver como a notícia será exibida na página:

image

Vamos agora criar uma nova notícia sobre futebol. Para isso, clique no menu Content –> New –> Article.

Dica: Você pode usar como exemplo os artigos do site http://www.news.com.au/sport/football, que também é feito com WebCenter Sites!

Selecione um layout e defina o título. Clique em Continue para editar o artigo.

image

Para preencher a categoria, selecione Article Category na caixa de busca, clique no botão para executar a busca, e arraste a categoria de Football a partir da caixa de resultados de busca:

image

Preencha os campos restantes. Não esqueça de preencher o campo Abstract (você precisará entrar no modo Form, clicando no botão Web image). Você pode também usar as imagens da notícia original, criando no Sites (Content –> New –> Image (for article)) e arrastando até o artigo.

Por fim, defina outros artigos como Related Stories, fazendo uma busca por Article com football no campo de busca, e arrastando os artigos para a barra da direita:

image

Quando tiver terminado, não esqueça de salvar. Clique no botão Preview (image) para ver como o artigo será exibido na página.

image

Feche o artigo e volte na página Football. Faça uma busca por Artigo com football no campo, localize o artigo que você criou e arraste até a área de “Top Stories”:

image

Finalmente, falta apenas colocarmos a página Football na navegação, para que os usuários possam navegar diretamente até a página. Para isso, basta arrastar a página da pasta Unplaced Pages para a Placed Pages, diretamente abaixo da página Baseball:

image

Voltando à página Home, vemos que Football agora faz parte da lista de links na barra de menus:

image

Por hoje é só! Espero que este tutorial ajude a conhecer um pouco mais os recursos do WebCenter Sites. Nos próximos posts, iremos investigar mais em detalhes os recursos “sob o capô” do WebCenter Sites!

Até a próxima!

Posted in Oracle, WebCenter Sites | Tagged , , | Leave a comment

WebCenter Sites – Primeiros Passos

Chega de falar de Content por enquanto, certo? :-) Nos próximos posts, iremos falar sobre os outros produtos da suite WebCenter, começando com o WebCenter Sites.

No ano passado, a Oracle adquiriu uma empresa chamada Fatwire, que era líder de mercado em um segmento chamado WEM – Web Experience Management. O WEM é visto como a evolução do conceito de WCM (Web Content Management); ou seja, não estamos falando mais de criar sites e publicar conteúdo nas páginas, mas de gerenciar a experiência do usuário, criando interações únicas para cada usuário. O WEM, além de conter a parte de criação e publicação de conteúdo, também consegue segmentar usuários de acordo com o seu perfil ou navegação, e recomendar conteúdo de acordo com esta segmentação; ele também incentiva a interação do usuário, através de ratings, reviews, comentários, compartilhamento em redes sociais, etc. Se você quiser conhecer mais sobre esta solução, confira este seminário gravado, que traz uma visão geral e demonstração desta nova solução Oracle.

Depois da aquisição, os produtos da Fatwire passaram a fazer parte do portfolio do WebCenter, que já tinha foco em gestão de conteúdo, portais e WCM. Os produtos também foram renomeados, para se adequarem à nova família, e agora este conjunto de soluções passa a se chamar Oracle WebCenter Sites.

Em abril deste ano a Oracle lançou a versão 11g do WebCenter Sites, a primeira após o rebranding do produto para se adequar ao padrão Oracle. Esta versão traz diversas melhorias na interface visual, focando na produtividade dos contribuidores.

Agora vem a boa notícia: se você é um cliente ou parceiro Oracle, você pode baixar uma versão de testes desta ferramenta, chamada de JSK (Jump-Start Kit). O JSK é um ambiente com a ferramenta funcionando, e um site de exemplo, aonde podemos experientar a navegação como colaboradores.  Neste post iremos ver como fazer o download, instalar este JSK e navegar pelo site de exemplo que a ferramenta traz.

Disclaimer: Esta JSK só pode ser utilizada para testes e aprendizado. Este não é um ambiente preparado para produção, e não possui suporte técnico da Oracle. Antes de implementar um ambiente em produção, entre em contato com a Oracle para obter apoio técnico. Este ambiente está disponível apenas para clientes e parceiros Oracle, pois o download é disponibilizado como um patch pelo suporte técnico.

A JSK está disponível no site do Suporte, como um patch. Siga os passos abaixo para fazer o download:

1) Acesse o site do suporte, através do endereço https://support.oracle.com

2) Após fazer o login, clique na aba Patches & Updates:

image

3) Na tela de busca, clique em Product or Family (Advanced) e preencha os campos com as seguintes informações:

Product is: Oracle WebCenter Sites (obs: conforme você vai digitando ele encontra automaticamente)

Release is: Sites 11gR1

Platform is: Aqui você escolhe aonde vai instalar, no meu caso é Windows 32 bits

image

Clique em Search para executar a busca

4) O patch que procuramos se chama Oracle WebCenter Sites 11gR1 JumpStartKit:

image

5) Após o download, descompacte o arquivo zip. O arquivo que iremos instalar se chama JSK_Installer11.1.1.6.0.jar. Ele vem com um arquivo readme.txt que contém as instruções de instalação. Leia este arquivo antes de seguir com a instalação.

6) Antes de instalar o JSK, uma JDK 1.6 precisa estar instalada. Caso você não tenha a JDK 1.6, faça a instalação agora. Também é recomendado definir a variável de ambiente JAVA_HOME, uma vez que a JDK esteja instalada:

image

7) Para iniciar a instalação, digite java –jar JSK_Installer11.1.1.6.0.jar no prompt de comando, na pasta aonde está o arquivo JAR. No Windows, o instalador pode ser iniciado através de um duplo clique no arquivo:

image

8) Clique em Next para iniciar a configuração

9) Marque a última caixa de opção (ConfigureJSKAfterInstall) e clique em Next

10) Selecione o Application Server e a Porta que você irá usar (eu vou manter a porta padrão 8080)

11) Mantenha as demais opções com os valores padrão e clique em Next para iniciar a instalação (IMPORTANTE: não instale o Sites em uma pasta com espaços no nome, como c:\webcenter sites\etc. Use sempre um caminho de instalação sem espaços ou caracteres especiais, como ç, ã, é, etc.). O meu caminho de instalação está definido como c:\oracle\webcenter\sites\11gr1.

image

12) Quando a instalação terminar, clique em Next e em seguida em Done para encerrar o instalador

13) Na pasta aonde o Sites foi instalado, um arquivo Run.bat (ou Run.sh) está disponível para iniciar o ambiente. Execute este arquivo para abrir a JSK:

image

Clique no botão Start para iniciar o ambiente. A mensagem Started Application Server será exibida quando o servidor estiver no ar.

OBS: Os browsers recomendados para a UI de Contribuição são o IE 7,8,9, Firefox 10 ou superior, Google Chrome 14, Safari 5+. Consulte a matriz de certificação para mais detalhes.

14) Para acessar o Sites, clique no menu Launch –> Contributor UI (ou abra um browser e acesse http://localhost:8080/cs)

image

15) Os usuários disponíveis neste ambiente são demo/demo e fwadmin/xceladmin. Vamos iniciar nossa navegação logando como o usuário contribuidor (demo/demo):

image

O Sites exibe uma lista com os sites que o usuário tem permissão de acesso. Selecione o site avisports. Em seguida será exibida a lista com os aplicativos que o usuário tem acesso. Para o usuário demo, a única aplicação é o Contributor. Se você fizer login como fwadmin, ele irá mostrar mais opções.

image

Clique no ícone do Contributor para acessar o ambiente de contribuição. Vamos dar uma olhada rápida na interface de Contribuição:

image

Para vermos como está o nosso site, expanda a pasta Placed Pages e clique duas vezes em Home:

image

A página será aberta na interface do Contribuidor. Para visualizarmos como usuário final, clique no menu View –> Preview in New Window:

image

Aproveite para navegar no site e conhecer as áreas que ele apresenta.

Para este artigo não ficar muito grande, vamos parar por aqui. No próximo post iremos ver como gerenciar este site, criando e editando novas páginas e artigos. Não perca!!

[]’s

Posted in WebCenter Sites | Tagged , | Leave a comment

Trabalhando com Filtros no WebCenter Content (componente de exemplo)

Neste post iremos conhecer o recurso de Filtros do WebCenter Content. Ao final do artigo, você  irá encontrar um componente de exemplo, com o código fonte.

Filtros são classes Java executadas quando ocorrem determinados eventos no Content Server. O livro do Bex é leitura obrigatória para quem vai trabalhar com Filtros; o apêndice H é dedicado a descrever os Filtros existentes no repositório e, mesmo tendo sido escrito para a versão 7.5, ainda pode ser usado como base para o estudo, embora algumas coisas tenham mudado. Uma lista de alguns Filtros disponíveis na 11g pode ser encontrada no componente HowToComponents.

Os Filtros são usados quando precisamos introduzir uma lógica customizada durante a execução de algum recurso padrão do Content Server; por exemplo, precisamos validar alguns metadados antes que o check-in seja concluído, ou precisamos modificar o mecanismo de login para conceder (ou retirar) permissões para um grupo de usuários logo após a autenticação. No meu caso, a necessidade era evitar que determinados usuários pudessem fazer download de plantas AutoCAD.

O requerimento do cliente era: usuários que não forem da área de Engenharia podem buscar e visualizar os documentos, mas não podem fazer download do arquivo nativo (.dwg), apenas da conversão (PDF ou HTML). Como sabemos, o Content Server não separa a política de segurança entre o arquivo nativo e o convertido; basicamente, o usuário vai ver tudo ou não vai ver nada… para mudarmos este comportamento, precisamos customizar o Content Server.

Uma opção seria modificar a tela de Content Information, avaliando as permissões do usuário e ocultando o link do arquivo nativo. Mas esta proteção funcionaria apenas na tela de Content Information, deixando um risco razoável. Isso também não funcionaria para aplicações integrando com o Content Server através de Java ou Web Services.

Portanto a decisão foi implementar através de um Filtro. Para isso, precisamos escrever uma classe Java. A declaração do Filtro precisa seguir este formato:

public class GetFileFilter implements FilterImplementor {
     
public int doFilter(Workspace ws, DataBinder binder, ExecutionContext cxt) throws DataException, ServiceException
   {

return CONTINUE;

}

Os retornos possíveis são CONTINUE, FINISHED ou ABORT, e o que cada um faz vai depender do Filtro que está sendo executado. CONTINUE significa que o código Java foi executado com sucesso, e que o evento que disparou o Filtro pode continuar.

O que a gente quer fazer é interceptar o download do arquivo. Para isso, existe um filtro chamado checkDownloadOverride, que é executado durante algum serviço de download, como o GET_FILE. Agora que já sabemos qual filtro usar, vamos rever as nossas regras.

Iremos trabalhar com 2 restrições: por extensão de arquivo e por Role de usuário. Não queremos restringir o download de todos os documentos do repositório, apenas de algumas extensões (.dwg, etc). E temos que garantir que os usuários da área de Engenharia (e Administradores) possam acessar os arquivos nativos.

O método que executa o Filtro traz um binder com diversas informações. Então já conseguimos pegar as informações sobre qual é o arquivo solicitado e quem é o usuário:

String dUser = binder.getLocal(“dUser”);
String dDocName = binder.getLocal(“dDocName”);
String dID = binder.getLocal(“dID”);
String dExtension = binder.getLocal(“dExtension”);
String idcService = binder.getLocal(“IdcService”);

Em seguida, precisamos verificar se o serviço é o GET_FILE ou o WEBDAV_GET (este é o serviço usado pelo Windows Explorer quando estamos com o DIS), que são serviços executados quando o usuário quer fazer o download de algum arquivo:

if (!idcService.equals(GET_FILE) && !idcService.equals(WEBDAV_GET))
    {
            return CONTINUE;
    }

Existem alguns serviços internos do Content Server que caem no mesmo filtro, por isso esta checagem é importante.

Para facilitar um pouco a vida do administrador do Content Server, iremos criar 2 parâmetros no nosso componente: um que guarda as extensões de arquivos que devem ser protegidas (ExtensionsToControl) e um que guarda as Roles que o usuário precisa ter para conseguir acessar o arquivo nativo (RolesAllowedNative). Este código é usado para trazer o valor do parâmetro:

//Get file extensions that must be monitored
String ExtensionsToControl = “”;
if(SharedObjects.getEnvironmentValue(“ExtensionsToControl”) != null)
ExtensionsToControl = SharedObjects.getEnvironmentValue(“ExtensionsToControl”);  

//Validates file extension
if (ExtensionsToControl.indexOf(dExtension) <=0)
    {
           return CONTINUE;
    }

Em seguida usamos um código parecido para trazer o parâmetro que diz quais Roles o usuário precisa ter para acessar o arquivo. Porém, como estamos falando em mais de uma role, precisamos fazer um loop para testar cada uma:

String RolesAllowedList = “”;
String RolesAllowed[];

//Get roles allowed to download native files
if(SharedObjects.getEnvironmentValue(“RolesAllowedNative”) != null)
    RolesAllowedList = SharedObjects.getEnvironmentValue(“RolesAllowedNative”);       
RolesAllowed = RolesAllowedList.split(“,”);

//Check if user has the roles allowed to access native file
for (int x=0;x<RolesAllowed.length;x++){
        if (SecurityUtils.isUserOfRole(userData, RolesAllowed[x]))
        {
        return true;                  
        }
}

SecurityUtils.isUserOfRole é um método disponibilizado pelo Content Server para validar se o usuário tem uma determinada Role. Nesta validação, caso o usuário tenha pelo menos uma das Roles necessárias, ele poderá baixar o arquivo.

Para compilar este código, você precisa adicionar o arquivo idcserver.jar no classpath do seu projeto. Este arquivo está localizado na pasta do Content Server %MW_HOME%\Oracle_ECM1\ucm\idc\jlib. Uma vez que a nossa classe está pronta, podemos criar o componente (que é necessário para declararmos o Filtro).

A criação do componente é feita pelo Component Wizard (se você nunca criou um componente, recomendo este tutorial), da forma tradicional. A única diferença é que precisamos declarar o filtro, e isso é feito no arquivo .hda do componente. Procure esta seção:

@ResultSet Filters
4
type
location
parameter
loadOrder
@end

Com a declaração do Filtro, o arquivo ficará assim:

@ResultSet Filters
4
type
location
parameter
loadOrder
checkDownloadOverride
ucmutils.GetFileFilter
null
10
@end

checkDownloadOverride é o Filtro que queremos usar e ucmutils.GetFileFilter é o nome da classe Java que será executada. Não precisamos declarar um método, porque por padrão ele executa o método doFilter.

Também não esqueça de declarar os parâmetros:

image

OBS: O parâmetro SuppressOutputMessages define se as mensagens de debug serão exibidas no output do servidor (false significa que serão exibidas). Para visualizar estas mensagens, acesse o menu Administration –> System Audit Information. Na seção Tracing Sections Information, inclua UCMUtils, marque a opção Save e clique em Update:

image

Depois disso, as mensagens de debug irão aparecer na página View Server Output (o link fica na própria página System Audit Information).

image

Quando um usuário sem permissão tenta acessar o arquivo nativo, o output do servidor também exibe o erro:

image

E o usuário recebe uma mensagem de erro:

image

Esta mensagem aparece porque o nosso código Java lança uma exceção quando o usuário não tem a permissão necessária:

throw new ServiceException(“User does not have permission to download file.”);

Como lançamos a exceção, a mensagem de erro ficará gravada no log. As informações do output do servidor não vão para o log, para não ocuparem espaço em disco.

Para fazer download do componente de exemplo, clique aqui.

Aqui entra o obrigatório disclaimer: Este não é um componente oficial da Oracle. Desta forma, a Oracle não se responsabiliza por qualquer dano ou perda de dados que possam ocorrer devido ao uso do mesmo. O autor (eu!) também se isenta de qualquer responsabilidade.

O código fonte Java está disponível no componente, na pasta Classes. Você pode modificar conforme o escopo da alteração que você precise fazer.

Para o próximo post, iremos mudar de assunto… stay tuned!

Posted in ECM, Oracle | 2 Comments

Fast Check-in com UCM 11g

Recentemente estive em um cliente (bah, guri!) que precisava de um recurso para carregar centenas ou milhares de documentos metadata-only no UCM. E o checkin normal estava gerando uma fila de indexação muito grande, sendo que a indexação era desnecessária neste caso.

Felizmente, na versão 11g do UCM o recurso de Fast Check-In faz parte do core do produto, e pode ser usado de forma muito simples, com o uso de um parâmetro adicional.

Neste post vamos ver como trabalhar com o Fast Check-in. O ambiente é um UCM 11.1.1.6, rodando em Windows. Para fazer os checkins, eu criei uma aplicação Java simples, que usa a API RIDC para fazer os check-ins. Para fins de teste, criei 2 campos, PersonName e PersonNumber:

image

Nesta aplicação, o usuário diz quantos conteúdos ele quer criar, define o nome e número da pessoa, e diz se quer usar o parâmetro de Fast Check-In. O código fica desta forma:

// create the manager and context
IdcClientManager manager = new IdcClientManager ();
IdcClient idcClient = manager.createClient(“idc://localhost:4444″);
IdcContext userContext = new IdcContext (“weblogic”);

//get the binder and set checkin metadata
DataBinder binder = idcClient.createBinder ();
binder.putLocal (“IdcService”, “CHECKIN_NEW”);
binder.putLocal (“dID”, “”);
binder.putLocal (“dDocName”, “”);
binder.putLocal (“dDocAuthor”, “weblogic”);
binder.putLocal (“dDocAccount”, “”);
binder.putLocal (“dDocType”, “Document”);
binder.putLocal (“dSecurityGroup”, “Public”);
binder.putLocal (“dRevLabel”, “1″);
binder.putLocal (“createPrimaryMetaFile”, “true”);
binder.putLocal (“dDocTitle”, “Document for Person “+personName+ ” 000″ + i );
binder.putLocal (“xpersonName”, personName + ” 000″ + i );
binder.putLocal (“xpersonNumber”, “000″ + i + personNumber );
binder.putLocal (“primaryFile”, “” );
//verify checkbox to set Fast Checkin parameter
if (FCCheck.isSelected()){
binder.putLocal (“DirectReleaseNewCheckinDoc”, “1″ );
}
//execute the request
ServiceResponse response = idcClient.sendRequest (userContext, binder);
//get the binder
DataBinder serverBinder = response.getResponseAsBinder ();

Ou seja, o documento vai ser do tipo Document, com grupo de segurança Public. O título vai ser ‘Document for Person’ + o nome da pessoa. Também existe uma checagem para ver se o checkin tem que ser feito com o parâmetro do Fast Check-In. O parâmetro neste caso é o DirectReleaseNewCheckinDoc=1.

Para o primeiro teste, não iremos usar o Fast Check-In. Após feito os checkins, os documentos já aparecem na tela de busca:

image

Lembrando que estes documentos passaram pelo processo normal de indexação full-text (o UCM está configurado para OracleTextSearch).

Agora iremos criar outros 5 conteúdos, mas desta vez usando o Fast Check-In:

image

Os documentos foram publicados com o recurso de Fast Check-In, o que fez com que eles não seguissem pelo processo de conversão-indexação-workflow. Mas isso permite que eles estejam disponíveis (Released) praticamente imediatamente, o que é um requisito para este caso específico.

Mas agora uma surpresa: quando vamos na tela de busca, não conseguimos visualizar os documentos que criamos:

image

Mas por quê eles não aparecem? O motivo está na documentação:

DirectReleaseNewCheckinDoc: Directs content items being checked in to bypass Inbound Refinery, workflow, and indexing. The default is 0. To enable, set DirectReleaseNewCheckinDoc=1.

Before you enable this setting, take into account the following important considerations.

  • A content item checked in this way can only be found by searching with DATABASE.METADATA. However, other content items can still go through regular checkin and be FULLTEXT indexed.

Ou seja, quando formos buscar este conteúdo, devemos usar um parâmetro de busca para dizer que queremos fazer a busca por metadados. Segundo a documentação, o parâmetro de busca que deve ser usado é o SearchEngineName, que neste caso deve ter o valor ‘database’.

Para fazer este teste, montei um código IDOC muito simples, que executa duas buscas, uma usando o default e outra usando este parâmetro. O código ficou desta forma:

<h3> Regular Search for Type Document </h3>

 <$QueryText=dDocType <matches> `Document`“$>
<$ResultCount=100$>
<$executeService(“
GET_SEARCH_RESULTS“)$>
 <$if SearchResults$>
    <b> Found <$TotalRows$> Results </b> <br>
  <table border=”1″ width=”80%” align=”center”>
  <tr bgcolor=”#CCCCCC”>
     <td align=”center”> <b> Doc ID </b> </td>
     <td align=”center”> <b> Doc Title </b> </td>
     <td align=”center”> <b> Person Name </b> </td>
<td align=”center”> <b> Person Number </b> </td>
</tr>
  <$loop SearchResults$>
  <tr>
<td
align=”center”>
         <a href=”<$HttpCgiPath$>?IdcService=DOC_INFO_BY_NAME&dDocName=<$dDocName$>” target=”new”>
          <$dDocName$></a>
</td>
<td>
<$dDocTitle$></td>
<td>
<$xpersonName$></td>
<td>
<$xpersonNumber$></td>
</tr>

<$endloop$>
  </table>
<$else$>

<b>
Regular Search found no documents! </b>

<$endif$>

<br/><hr/><br/>

<h3> Modified Search for Type Document </h3>

 <$QueryText=dDocType <matches> `Document`“$>
<$ResultCount=100$>

<$SearchEngineName=”database”$>
<$executeService(“

GET_SEARCH_RESULTS“)$>
 <$if SearchResults$>
    <b> Found <$TotalRows$> Results </b> <br>
  <table border=”1″ width=”80%” align=”center”>
  <tr bgcolor=”#CCCCCC”>
     <td align=”center”> <b> Doc ID </b> </td>
     <td align=”center”> <b> Doc Title </b> </td>
     <td align=”center”> <b> Person Name </b> </td>
<td align=”center”> <b> Person Number </b> </td>
</tr>
  <$loop SearchResults$>

<tr>
<td
align=”center”>
         <a href=”<$HttpCgiPath$>?IdcService=DOC_INFO_BY_NAME&dDocName=<$dDocName$>” target=”new”>
          <$dDocName$></a>
</td>
<td>
<$dDocTitle$></td>
<td>
<$xpersonName$></td>
<td>
<$xpersonNumber$></td>
</tr>

<$endloop$>
  </table>
<$else$>

<b>
Modified Search found no documents! </b>

<$endif$>


Rodando este código no UCM, vemos 2 resultados de busca:

image

A primeira busca (padrão) localizou 19 documentos. A segunda busca, modificada com o parâmetro SearchEngineName=’database’ encontra 24 documentos, os 19 da outra busca e os 5 que criamos com o Fast Check-In.

Na minha aplicação Java, também executei as duas buscas, usando a API RIDC. Os resultados (naturalmente) foram os mesmos:

image

Como vimos, o Fast Check-In pode ser uma opção para inserir grandes volumes de conteúdo de forma muito rápida, mas a busca tem que ser feita com um parâmetro adicional.

Até a próxima!

[]’s

OBS: Para fazer checkin de conteúdo metadata-only, você precisa definir estes parâmetros no config.cfg e reiniciar o UCM:

createPrimaryMetaFile=true
AllowPrimaryMetaFile=true

[ATUALIZANDO…]

Para buscar os documentos pela interface do UCM, você também precisará setar o parâmetro que define o motor de busca a ser usado.

Uma forma simples de fazer isso é criar uma regra, e definir um Side Effect para esta regra:

image

Criei uma regra chamada “DocumentMetaOnlySearch”, que possui uma condição de ativação para “Search” (ou seja, só será executada em caso de uma busca). Como um Side Effect, estou mudando o engine de busca para Metadata Only.

Se quisermos, podemos definir quais campos o usuário irá selecionar na busca, ou podemos definir valores padrão (no meu caso, Content Type = Document e Security Group = Public):

image

Depois inserimos esta regra em um novo Perfil:

image

Para que o link de busca não apareça nas opções de Check-In, precisamos marcar a opção Restrict Personalization Links e definir a seguinte regra no campo “has script for the check-in link”: <%isLinkActive=0%>:

image

Podemos ver que esta opção agora aparece no menu Search, mas não no New Check-In:

image

Por fim, comparamos as duas buscas:

Standard Search com os parâmetros dDocType=Document e dSecurityGroup=Public:

image

Total: 12 resultados.

Busca Metadata-Only com os mesmos parâmetros definidos:

image

Total: 17 resultados.

Posted in ECM, Oracle | 1 Comment

UCM 10g–Workshop

Ano passado, criei um workshop de UCM 10g para parceiros Oracle. O objetivo deste workshop era permitir que parceiros especialistas em outras soluções (normalmente Portal ou SOA/BPM) pudessem ter um primeiro contato com o UCM, e conhecer a sua estrutura e principais funcionalidades.

Pois bem, um ano se passou, e acho que chegou a hora de compartilhar este workshop com todos. Por isso, carreguei os 7 exercícios que compõe o Workshop neste blog.

O Workshop foi criado de forma a mostrar o passo-a-passo, desde o download dos produtos, instalação, configuração, até recursos mais avançados, como auditoria, captura, etc. Tudo o que você precisa ter para fazer este workshop é uma estação Windows e vontade de aprender. Todos os passos, desde a configuração do sistema operacional e instalação do banco estão inclusas no material. Você poderia fazer estes exercícios em outro sistema operacional, como Linux. Basta adaptar os passos para o novo SO.

Como é de praxe, aqui vai o tradicional disclaimer:

  • Este material não deve ser usado para implementações em produção. Antes de implementar o UCM, entre em contato com a Consultoria Oracle ou um parceiro especializado.
  • Este material não substitui os treinamentos oficiais oferecidos pela Oracle. Somente os treinamentos oficiais abordam os conceitos básicos da ferramenta, que serão de vital importância para implementação/manutenção do sistema
  • Este não é um material oficial da Oracle. Desta forma, a Oracle não se responsabiliza por qualquer dano ou perda de dados que possam ocorrer devido ao uso do mesmo. O autor (eu!) também se isenta de qualquer responsabilidade.

O Workshop está dividido em 7 capítulos:

  • Exercício 01: Instalação do UCM: No primeiro tutorial, veremos quais produtos serão necessários para a instalação, e como preparar o sistema operacional e instalar o banco de dados. Em seguida faremos a instalação do UCM e iremos configurar a conversão para PDF, marca d’água e integração com Windows e email. OBS: Pode ser que alguns links para download estejam quebrados. Neste caso, procure no site pela versão indicada ou deixe um comentário neste post!
  • Exercício 02: Hands-On do UCM: Agora que o nosso UCM está instalado, iremos conhecer um pouco mais a sua estrutura, e configurar os principais recursos: metadados, perfis, regras de segurança, listas dependentes, workflows, estruturas de pastas, pastas virtuais e muito mais.
  • Exercício 03: Criação de Componente: Neste exercício, iremos customizar o UCM, criando um novo componente. Este componente é muito simples, o objetivo dele é permitir que usuários criem uma lista de documentos favoritos. O objetivo deste exercício é mostrar uma opção de customização do UCM.
  • Exercício 04: Componente Dashboard: Este exercício foca nos recursos de auditoria do UCM. O componente Dashboard traz uma visão administrativa mais dinâmica, e permite que um administrador visualize informações sobre o histórico de um documento ou do comportamento de um usuário.
  • Exercício 05: Aplicação de Patches no UCM: Este é o exercício mais curto de todos. O objetivo é instalarmos os patches mais recentes para atualizar os componentes do UCM para a versão mais nova.
  • Exercício 06: Integração com BPEL:  Neste exercício, iremos instalar o SOA Suite 10g e permitir que os workflows do UCM iniciem processos BPEL, que irão decidir a aprovação de um documento.
  • Exercício 07: Document Capture e Distributed Document Capture: O Document Capture e o Distributed Document Capture são as ferramentas de captura da Oracle, que permitem que documentos sejam digitalizados, indexados e armazenados no UCM. Neste exercício, veremos como instalar e configurar estas ferramentas, e como fazer a integração com o UCM.

Este workshop também é recomendado para quem está trabalhando com o UCM 11g, pois os conceitos de administração são praticamente os mesmos, o que permite que os conhecimentos adquiridos nestes exercícios sejam reaproveitados na nova versão.

Algum tema que você gostaria de ver nesse workshop? Envie sua sugestão!

[]’s

 

 

 

 

Posted in ECM | 5 Comments