Play That Funky Music, Content Server!

Quem disse que um repositório de conteúdo tem que lidar apenas com documentos chatos e imagens escaneadas? Neste post vamos colocar um pouco de agito no nosso Content Server, criando um componente customizado para tocar arquivos MP3.

Neste tutorial, vamos ver como uma página padrão do Content Server pode ser modificada para oferecer novas funcionalidades. Neste caso, queremos que arquivos .mp3 carregados pelos usuários possam ser tocados diretamente da tela de informações do documento, sem a necessidade de download. Também iremos ver como usar o estilo CSS do Content Server para manter o padrão visual nas informações do componente customizado. Aqui uma visão de como o componente vai ser exibido na página:

image

Para este caso, vamos usar uma ferramenta open source chamada audio.js (http://kolber.github.io/audiojs/). Mas você pode usar qualquer outra que ofereça um player que possa ser embutido em uma página web. Inclusive nos meus testes o audio.js não funcionou bem com o Firefox, por isso se você for desenvolver para produção, recomendo fazer testes mais detalhados.

Como de costume, é muito importante você ler (e concordar) com os seguintes disclaimers:

DISCLAIMER1: Este tutorial serve apenas de exemplo, e não é recomendado ser aplicado como está em ambientes de produção. As instruções contidas neste artigo não são suportadas pela Oracle (ou pelo autor). Lembre-se de testar rigorosamente em ambientes não-produção antes de disponibilizar o componente para os usuários finais.

DISCLAIMER2: Este componente considera um número baixo de usuários concorrentes. Não foi feito nenhum estudo sobre uso de banda de rede ou outros fatores que possam impactar a performance. Para ambientes com grandes volumes de uso, é recomendável considerar outras opções, como streaming, etc.

DISCLAIMER3: O upload e playback de músicas dos gêneros de pagode, axé, sertanejo universitário e outros podem causar danos irreversíveis ao repositório de conteúdo (e aos usuários).

Dito isso, It’s time to rock & roll!

Criando o Componente

O primeiro passo é fazer o download do audio.js. No meu caso, como era um teste simples, eu descompactei os arquivos diretamente no Apache, ficando com a URL http://servidor/audiojs que eu uso no código. Mas caso você queira empacotar e distribuir este componente, o ideal é que ele seja relacionado entre os elementos do componente (mais informações aqui). De qualquer forma, os arquivos do audio.js precisam ficar em algum lugar ‘visível’ para o browser (o que significa que eles não podem ficar nas pastas do componente).

Depois disso, abra o ComponentWizard (acessível pela linha de comando <domain_home>/ucm/cs/bin/ComponentWizard) e crie um novo componente. O meu componente se chama SoundPlayer, mas se você quiser no futuro adicionar um player para vídeos ou outros formatos, pode chamar de MediaPlayer.

O que este componente vai fazer é sobrescrever a página de document information, ao invés de customizar. Isso significa que basta desabilitar o componente para que esta customização deixe de ser usada e a página volte a funcionar da forma nativa. Para sobrescrever a página, clique no botão Add… do painel Custom Resource Definition e selecione Resource – HTML Include/String.

image

Na caixa de pergunta “Você quer abrir o arquivo no editor de textos”, clique em No. Em seguida, clique no botão Add… do painel Custom HTML Includes. O include que queremos sobrescrever é o info_page_content, responsável por montar a tela de informações do documento. Porém, o include monta a página inteira, portanto queremos manter todo o conteúdo original, e apenas incluir a nossa lógica customizada. Desta forma, na tela de criação do include, defina o nome como info_page_content, e copie e cole o código abaixo. As partes em verde mostram o código customizado para inserir o player. Os endereços em vermelho são o caminho para o servidor e devem ser modificados (OBS: Existem variáveis IDOC que trazem o nome e endereço do servidor e devem ser usadas; mais informações aqui).

 

<$include std_page_begin$>
    <!–$IsStagingDoc=1$–>
    <!–$IsFailedIndex=1$–>
    <!– Do a loop on DOC_INFO so that all substitution tags will use DOC_INFO as their
    first place to find their values.  Otherwise their is confusion between this result set
    and the REVISION_HISTORY table that comes later.  For example ‘dStatus’ is a value in both
    tables–>
    <$loop DOC_INFO$>
    <$if dFormat like “*idcmeta*”$>
        <$showPrimaryMetaFileFields = “1″$>
    <$endif$>
    <$include doc_info_notify_data$>

    <$pageTitle = inc(“docinfo_page_title”)$>
    <$exec inc(“docinfo_menus_setup”)$>
    <$include page_menus_js_object_setup$>
    <$include std_page_heading$>
    <$include std_docinfo_doc_action_forms$>

    <table class=”xuiTable” cellpadding=”2″ cellspacing=”0″ summary=””>
    <$include special_checkin_fields1$>
    <$include std_revision_label_field$>
    <$include std_document_type_field$>
    <$include std_document_title_field$>
    <$include author_checkin_field$>
    <$include std_meta_fields$>
    <$include security_checkin_fields$>
    <$include checkout_author_info_field$>
    <$if IsStagingDoc$>
    <$include doc_date_fields$>
    <$endif$>
    <$rptStatus = rptDisplayMapValue(“StatusList”, dStatus)$>
    <$fieldName = “rptStatus”, fieldCaption = lc(“wwStatus”)$><$include std_displayonly_field$>
    <$if HasOriginal$>
    <$fieldName = “dDocFormats”, fieldCaption = lc(“wwFormats”)$><$include std_display_field$>
    <$endif$>
    <$include workflow_list_for_doc$>
    </table>

    <!– warnings and error messages –>
    <$include std_docinfo_error_msg$>
    <$if IsNotSyncRev$>
    <table class=”xuiTable” summary=””>
        <tr>
            <td align=center><span class=errorHighlight>
                <$lc(“wwLocalCopyNotSynced”, dDocName)$></span></td>
        </tr>
    </table>
    <$endif$>

    <$if IsStagingDoc$>
        <$include doc_provider_info$>
    <$endif$>

    <!– SoundPlayer Component Customization –>
    <!– Checks if file has audio extension and adds a player to the page –>
    <$if strEquals(dExtension,”mp3″)$>
      <script src=
http://servidor/audiojs/audio.min.js></script>
          <link rel=”stylesheet” href=
http://servidor/audiojs/index.css media=”screen”>
       <script>
        audiojs.events.ready(function() { audiojs.createAll(); });
       </script>   
    <div class=”xuiSubheading”> Audio File </div>
    <table align=”center” border=”0″ cellpadding=”2″ cellspacing=”0″ summary=”” style=”padding-left: 50px;” width=”40%”>
    <tr> <td class=”idcFieldCaption idcInfoCaption” nowrap=”nowrap”>
    This is an Audio File. Click to Play </td>
    </tr><tr>
    <td class=”idcFieldCaption idcInfoCaption”>
     <div align=”center”>
      <audio src=”<$DocUrl$>” preload=”auto”></audio>
     </div>
    </td> </tr>
    </table>
    <$endif$>
    <!– docinfo links –>
    <$include std_docinfo_links$>

    <!– additional actions and controls –>
    <table class=”xuiTable” summary=””>
    <tr>
        <$if ClientControlled$><$doingPopupActions=1$>
        <td width=”50%” align=right><$include doc_select_actions$></td>
        <$endif$>
        <td width=”50%” align=left><$include doc_info_extra_buttons$></td>
    </tr>
    </table>
    <$include doc_info_extra_controls$>

    <!– applets –>
    <$if HasOriginal and useDownloadApplet$>
        <form name=”downloadForm”>
        <input type=hidden name=dID value=”<$dID$>”>
        <input type=hidden name=dDocName value=”<$dDocName$>”>
        <input type=hidden name=dDocTitle value=”<$xml(dDocTitle)$>”>
        <input type=hidden name=dOriginalName value=”<$dOriginalName$>”>
        <input type=hidden name=docURL value=”<$if HasUrl$><$DocUrl$><$endif$>”>
        </form>
        <$include download_native_applet$>
    <$endif$>
    <$include info_page_content_extra$>

    <!– end loop on DOC_INFO–>
    <$endloop$>
    <br style=”line-height:15px”>
    <$if IsStagingDoc$>
    <!– present a problem report form –>
    <$include doc_add_problem_report$>
    <br style=”line-height:15px”>
    <$elseif IsWorkflowInfo$>
    <$else$>
    <!– Table holding information about all revisions of this document–>
    <$include doc_rev_table$>
    <br style=”line-height:15px”>
    <$endif$>

    <$include custom_info_page_content$>

<$include std_page_end$>

 

image

Depois disso, basta habilitar o componente, reiniciar o Content Server e fazer o check-in de um arquivo MP3 para testar. Você também pode criar um perfil para esconder os campos e manter o layout da página mais limpo. O componente como está oferece o player apenas para arquivos com a extensão .mp3. Você pode modificar o código para aceitar outros formatos de audio, como .wav, por exemplo.

Este foi rápido e fácil. Até a próxima!

Posted in Uncategorized | Leave a comment

Desenvolvendo Task Flows para o WebCenter Portal 11.1.1.8

Depois de uma prolongada ausência, nada como iniciar o ano com um exercício muito interessante: vamos criar um Task Flow para o WebCenter Portal. Este nosso Task Flow irá usar as tabelas do schema HR do banco para trazer informações sobre funcionários e departamentos. Este Task Flow será desenvolvido com o JDeveloper 11.1.1.8, publicado como uma shared library no Weblogic Server e consumido através do catálogo de recursos do Portal.

(pausa para responder sua provável pergunta: “Mas o que é um Task Flow”?)

Segundo a documentação:

“ADF task flows provide a modular approach for defining control flow in an application. Instead of representing an application as a single large JSF page flow, you can break it up into a collection of reusable task flows. Each task flow contains a portion of the application’s navigational graph. The nodes in the task flows are activities. An activity node represents a simple logical operation such as displaying a page, executing application logic, or calling another task flow.”

Basicamente um Task Flow é muito similar à um portlet: ele representa uma “mini-aplicação empacotada” que pode ser disponibilizada em páginas do Portal. Em termos de conceito, ambos fazem praticamente a mesma coisa, a diferença está na infra-estrutura de cada um: um portlet é disponibilizado (deployed) como uma aplicação e registrado como um recurso externo ao Portal. Um Task Flow é disponibilizado como uma biblioteca ADF, e adicionado à aplicação. Cada estratégia tem as suas vantagens e desvantagens, mas por motivos de espaço vamos deixar esta discussão para um futuro post.

Pré-Requisitos

Para desenvolver este exercício, você vai precisar de:

  • WebCenter Portal 11.1.1.8
  • JDeveloper 11.1.1.8 com a extensão do Portal instalada
  • Schema HR disponível no banco de dados

Parte 1 – Criando o Task Flow

Abra o JDeveloper e crie uma nova aplicação. Selecione o template Fusion Web Application (ADF) e defina o nome como HRTaskflow.

image

Aperte Next e em seguida Finish para criar a aplicação. Não iremos mudar nenhuma outra configuração.

Clique com o botão direito no projeto ViewController e selecione a opção New… na próxima janela, selecione ADF Task Flow.

image

OBS: Se esta opção não estiver disponível, clique na aba “All Technologies” da janela do assistente.

Na próxima tela, defina o nome do arquivo como hr-task-flow.xml e o nome do Task Flow como HRTaskFlow. Deixe os demais campos com as opções default e clique em OK.

image

Um Task Flow pode ser uma sequência de páginas (ou fragmentos de páginas, para ser exato), com chamadas à recursos externos, backing beans, etc. No nosso exercício, iremos fazer algo mais simples, com apenas uma página.

No diagrama do fluxo, insira uma View da paleta de componentes no diagrama. Defina o nome como HRView.

image

Clique duas vezes sobre a view e um assistente irá aparecer. Mantenha os valores padrão e clique em OK.

image

Arraste um componente do tipo Panel Stretch Layout para dentro da nova página. Uma estrutura contendo vários facets (start, top, center, bottom, end) irá aparecer na página.

image

No painel de Propriedades, defina os seguintes valores:

  • StartWidth: 0px
  • EndWidth: 0px
  • TopHeight: 50px
  • BottomHeight: 0px

image

Insira um componente Panel Group Layout no facet Top e outro no facet Center. Para facilitar, você pode usar o painel de estrutura da página para encaixar os componentes.

image

Defina as seguintes propriedades para cada um dos dois:

Panel Group Layout (center)

  • Halign: start
  • Valign: top
  • Layout: scroll
  • Width: 988px (OBS: Isto é por causa do template padrão das páginas do Portal)
  • Height: 550px (OBS: Isto é por causa do template padrão das páginas do Portal)

Panel Group Layout (top)

  • Halign: center
  • Valign: middle
  • Layout: vertical
  • Width: 988px (OBS: Isto é por causa do template padrão das páginas do Portal)

Arraste um componente do tipo Output Text para o Page Group Layout do facet Top.

image

Defina a propriedade Value como HR Departments and Employees. Para a formatação de cor e fonte, defina de acordo com a imagem abaixo:

image

No Panel Group Layout do facet Center, insira um componente Panel Group Layout (vertical), e dentro deste, um outro componente Panel Group Layout  (horizontal). Para ambos, defina o StyleClass como AFStretchWidth.

Dentro do Panel Group Layout horizontal, insira outros dois componentes Panel Group Layout (vertical – StyleClass AFStretchWidth). No primeiro Panel Group Layout, insira um componente Panel Splitter. Defina as seguintes propriedades para o Panel Splitter:

  • Orientation: vertical
  • Splitter Position: 100
  • Width: 400px
  • Height: 450px
  • Disabled: True

No segundo Panel Group Layout, insira um componente Panel Box. Defina a propriedade Text do Panel Box como “Employees from Department” e a propriedade Width para 580.

image

A estrutura do nosso Task Flow está pronta. Agora podemos inserir os dados do schema HR. Para isso, clique com o botão direito do mouse no projeto Model e selecione New… –> ADF Business Components –> Business Components from Table.

image

Em seguida ele irá abrir um assistente para conexão com o banco de dados. Clique no ícone + para criar uma nova conexão.

image

Defina os dados de conexão e faça o teste. Clique OK para criar a conexão.

image

Na próxima tela, clique em OK. O Jdeveloper irá conectar no banco de dados e apresentar um assistente aonde escolheremos as tabelas que serão usadas pela aplicação.

Nesta tela, clique no botão Query para trazer as tabelas disponíveis no schema escolhido. Selecione as tabelas Departments e Employees e clique no botão para que elas sejam movidas para a coluna da direita.

image

Clique em Next. Na próxima tela, mova as duas tabelas para a caixa da direita e clique Next novamente. Como iremos manter as demais configurações no padrão, podemos já clicar em Finish para fechar o assistente e criar os objetos na aplicação.

Voltando ao nosso Task Flow, podemos ver que a aba Data Controls agora possui um novo controle (se nada aparecer, você pode clicar no botão de Refresh). Repare que existe um objeto chamado DepartmentsView1, que representa a tabela Departments do banco de dados, e dentro deste objeto, um objeto chamado EmployeesView3. Este objeto representa o relacionamento master/detail entre as tabelas de Departaments e Employees. Mais especificamente, o relacionamento que diz quais funcionários pertencem a quais departamentos. O framework de desenvolvimento da Oracle já analisa estes relacionamentos no banco de dados e replica as regras na aplicação, sem que o desenvolvedor precise codificar esta lógica de negócios.

image

Arraste o objeto DepartmentsView1 para dentro do componente Panel Splitter, facet first. Selecione a opção para criar como Form –> ADF Read Only Form.

image

Nesse assistente, mantenha todos os campos, marque a caixa de opção Include Navigation Controls e clique em OK.

image

Arraste o objeto EmployeesView3 (que fica dentro do objeto DepartmentsView1, cuidado para não confundir) para dentro do Panel Splitter, facet second e selecione a opção Graph. Iremos mostrar os salários por cargo dentro do departamento (talvez não seja o exemplo mais politicamente correto :)

image

Selecione o gráfico de pizza (Pie) e o layout mais simples (afinal o espaço será restrito). Clique OK.

image

Defina os campos de acordo com a imagem e clique em OK

image

OBS: O gráfico possui várias propriedades que podem ser editadas, para definir cores, fontes, legenda, etc. Verifique no painel de propriedades as configurações disponíveis para os componentes do gráfico. Por exemplo, você pode esconder a legenda mudando o valor da propriedade Rendered do componente dvt:legendArea para False.

image

Arraste o objeto EmployeesView3 para dentro do Panel Box. Selecione Table –> ADF Read Only Table.

Apague os campos Salary, Commision e Manager. Marque as opções Enable Sorting e Single Row e clique em OK.

image

Repare que dentro do Panel Box foi criado um componente do tipo Table. Selecione este componente e defina a propriedade StyleClass como AFStretchWidth. Com isso a tabela será estendida para usar todo o espaço disponível.

Nosso Task Flow está pronto! Porém, ele não pode ser visualizado diretamente. Para que possamos fazer um teste antes do deploy para o Portal, precisamos criar uma nova página e inserir o Task Flow nesta página.

Clique com o botão direito no projeto ViewController e selecione New… –> JSF –> JSF Page.

image

Defina o nome da página como HRConsumer.jspx e clique em OK.

image

Arraste o hr-task-flow.xml para dentro da página. Selecione a opção Region.

image

Clique com o botão direito na página e selecione Run.

image

A aplicação irá ser carregada no browser.

image

Repare que quando você seleciona outro departamento, o gráfico e a tabela se atualizam automaticamente com a informação. Isso é gerenciado pelo framework de desenvolvimento da Oracle, aumentando a produtividade do desenvolvedor. Caso o Task Flow não funcione, ou você tenha problemas com layout, aproveite para fazer os ajustes agora.

Antes de seguirmos com o deployment, precisamos definir a conexão com o banco de dados. Para isso, clique com o botão direito no App Module e selecione Configurations…

image

Selecione o AppModuleLocal e clique em Edit. Na janela de edição, defina o nome do Data Source

image

OBS: Um datasource com o mesmo nome deve existir no Weblogic Server. Caso contrário o Task Flow não conseguirá conectar em runtime.

image

Clique em OK e faça a mesma configuração com o AppModuleShared. Clique em OK para fechar esta janela.

Agora iremos fazer o deployment do Task Flow para consumo no Portal.

Parte 2 – Deployment do Task Flow

Clique com o botão direito no projeto ViewController e escolha New… –> Deployment Profiles –> ADF Library JAR File.

image

Defina o nome do Deployment Profile como HRTaskflowADFLibrary e clique em OK.

Na tela seguinte, mantenha os valores padrão e clique em OK.

Podemos ver o nosso novo Deployment Profile nas propriedades do projeto. Clique OK para fechar a janela.

image

Clique no menu File –> New… –> General –> Generic Project para criar um novo projeto dentro da aplicação.

image

Defina o nome do projeto como MySharedLibrary e clique OK. Este projeto será usado para “empacotar” os projetos Model e ViewController para serem disponibilizados como uma biblioteca ADF.

Clique com o botão direito no projeto MySharedLibrary, selecione Project Properties. Na aba Deployment, clique no botão New…, selecione Archive Type WAR File e defina o nome como ADFSharedLibraryHRTF. Clique OK.

image

Vá na aba Profile Dependencies e marque a library HRTaskflowADFLibrary que criamos anteriormente.

image

Clique OK duas vezes para fechar as janelas de configuração. Agora podemos fazer o deployment para o servidor de aplicações.

Clique com o botão direito no projeto MySharedLibrary, selecione Deploy –> ADFSharedLibraryHRTF…

image

Selecione Deploy to Application Server e clique em Next. Selecione o seu servidor de aplicações aonde o WebCenter Portal está instalado (ou crie uma nova conexão) e clique em Next.

Na tela de seleção de instâncias, configure o deploy para o managed server do Portal (WC_Spaces). Marque a caixa de opção Deploy as a Shared Library.

image

Acompanhe a evolução do deployment na janela de log do JDeveloper. Quando o deployment estiver terminado, verifique no Weblogic Console se a biblioteca está disponível.

image

Agora iremos criar um projeto de extensão do Portal, que irá associar esta biblioteca ao Portal, para que o Task Flow que criamos apareça no catálogo de componentes. OBS: Este processo precisa ser feito apenas uma vez. Outros Task Flows podem ser associados à este projeto sem que uma nova extensão tenha que ser criada.

No JDeveloper, clique em File –> New –> Applications –> WebCenter Portal Server Extension (OBS: Esta opção aparece apenas na versão 11.1.1.8 da extensão. Se esta opção não aparecer para você, faça o update da extensão do Portal).

Defina um nome para a aplicação e clique em Finish.

image

Clique com o botão direito no projeto PortalSharedLibrary e selecione New –> Deployment Descriptors –> Weblogic Deployment Descriptor.

image

No assistente, selecione weblogic.xml e versão 10.3. Clique em Finish para criar o arquivo.

No editor do arquivo, vá na aba Libraries e adicione a library ADFSharedLibraryHRTF.

image

OBS: Este deve ser o mesmo nome da library que foi disponibilizada no Weblogic Server:

image

IMPORTANTE: Se esta é a primeira vez que você vai fazer o deployment de um Task Flow, pode passar direto para o deployment. Porém, se você vai adicionar um novo Task Flow à extensão (ou seja, se este é um re-deploy desta library), lembre-se de editar o arquivo MANIFEST.MF e incrementar o valor do atributo Implementation-Version. Para o primeiro deployment, o valor correto é o original: 11.1.2.

image

Clique com o botão direito no projeto PortalSharedLibrary e selecione Deploy –> extend.spaces.webapp…

image

Selecione Deploy to Application Server e clique em Next. Na próxima tela, selecione a conexão ao seu Application Server e clique em Next. Na tela de seleção de instância, selecione a instância aonde o Portal está rodando (WC_Spaces) e marque a opção Deploy as a Shared Library.

image

Clique em Next e em seguida Finish para iniciar o deployment.

Quando o deployment estiver terminado, reinicie o managed server do Portal (WC_Spaces) para que ele passe a utilizar a nova extensão. Agora nosso novo Task Flow está disponível (ou quase) dentro do nosso Portal!

Parte 3 – Consumindo o Task Flow dentro do Portal

Acesse o Portal como o usuário weblogic e clique no link Administration.

Clique na aba Shared Assets, e em Resource Catalogs. Se você não tiver um catálogo customizado, selecione um dos catálogos disponíveis e clique em Actions –> Copy. Defina o nome do novo catálogo e clique em OK. O Portal não permite que os catálogos default sejam editados, por isso temos que usar um catálogo customizado.

image

Selecione o seu novo catálogo e clique em Edit.

image

Selecione o ítem UI Components, depois clique em Add –> Add From Library.

image

Na janela de opções, selecione Task Flows e expanda Design Time. O nosso Task Flow HRTaskFlow deve aparecer na lista. Selecione este fluxo e clique em Add.

image

Clique no botão Save and Close para salvar este novo catálogo.

Voltando ao Portal, clique no link Portals da barra superior e selecione Create a Portal.

image

Selecione qualquer um dos templates, clicando no botão Use This. Na próxima tela, defina o nome do Portal, a URL e a segurança. Clique no botão Create para criar o novo Portal.

Uma vez criado o Portal, vá no menu Manage –> All Settings. Na aba Settings, defina o Resource Catalog como o que você criou e clique em Save.

image

Voltando ao Portal, crie uma nova página, selecione um layout e, no modo de edição, expanda UI Components e clique no botão Add do nosso Task Flow.

image

O Task Flow será inserido na página. Você pode configurar as opções para que ele utilize melhor o espaço disponível. Na aba Display Options, desmarque as opções Display Header e Allow Resize.

image

Clique no link Advanced e mude a opção Stretch Content para True. Pressione OK. Se quiser, insira outros Taskflows na página. Quando estiver pronto, clique em Save e View Portal.

Voilá! Nosso Task Flow está publicado no WebCenter Portal!

image

Como um bônus, uma visão da página acessada através de um tablet:

image

Até a próxima!

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

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!

[ATUALIZAÇÃO] Atualizando este post com uma dica muito interessante que eu recebi: adicionar o parâmetro DoRenameWhenPossible=true no config.cfg antes de iniciar o BatchLoader poderá aumentar muito a performance da importação. Este parâmetro faz com que os arquivos sejam movidos, ao invés de copiados, para a pasta vault durante a importação. Mais informações sobre como usar este parâmetro estão disponíveis neste artigo do suporte:

BatchLoader Throughput May Improve Using DoRenameWhenPossible=true: https://support.oracle.com/epmos/faces/DocumentDisplay?id=1087807.1

 

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