Desenvolvendo um plug-in do Mozilla Firefox para Content Management Interoperability Services

Este artigo apresenta uma visão geral de um novo padrão proposto para acessar conteúdo, chamado Content Management Interoperability Services (CMIS), e dá um exemplo de como utilizar esses serviços usando o Mozilla Firefox.

Gregory Melahn, Architect and Senior Technical Staff Member, IBM

Gregory Melahn photoGreg Melahn é Arquiteto e Membro Senior da Equipe Técnica nos portfólios de Workplace, Portal e Collaboration do software IBM. Entre em contato com Greg pelo e-mail melahn@us.ibm.com.



Shun Zhang, Software Engineer, IBM  

Shun Zhang é Engenheiro de Software na IBM em Pequim, focando no Lotus Quickr e em tecnologias Web 2.0 e SOA. Entre em contato com ele pelo e-mail shunzh@cn.ibm.com.


nível de autor Contribuidor do
        developerWorks

Yan Chen, Advisory Software Engineer, IBM

Chen Yan é Engenheiro Consultor de Software da IBM que trabalha com a equipe de desenvolvimento do IBM Lotus Quickr em Pequim, China, focando em computação social e colaboração de conteúdo. Entre em contato com Yan pelo e-mail cheny@cn.ibm.com.


nível de autor Contribuidor do
        developerWorks

Hui Jian He, Staff Software Engineer, IBM  

Hui Jian He é Engenheiro da Equipe de Software da IBM em Pequim, focando no Lotus Quickr. Entre em contato com ele pelo e-mail hehuij@cn.ibm.com.


nível de autor Contribuidor do
        developerWorks

Xiao Wang, Intern, IBM  

Xiao Wang é estagiário no Laboratório de Desenvolvimento da IBM em Pequim e aluno da Universidade de Pequim. Entre em contato com ele pelo e-mail wwxiao@cn.ibm.com.



11/Mar/2010

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

Wiki do Lotus Quickr


Introdução e Histórico

Durante as últimas décadas, houve um grande progresso no modo de nos conectarmos uns aos outros. A troca de informações hoje em dia é mais simples do que nunca, graças aos protocolos da Internet, redes de alta velocidade e padronização de formatos de documento. Mesmo assim, lutamos para colaborar com o conteúdo das empresas. Por quê?

Parte da resposta é o fato de que as informações das empresas continuam a ser armazenadas em silos de conteúdo, onde fornecedores de softwares decidem, de maneira independente, muitos dos detalhes sobre como a informação é organizada e acessada. Um documento armazenado em dois sistemas de gerenciamento de conteúdo distintos pode ter sido criado pelo mesmo aplicativo e pode possuir, de fato, o mesmo número de bits (um arquivo PDF, por exemplo).

Entretanto, o sistema de gerenciamento de conteúdo que armazena o documento determina detalhes importantes, tais como qual API é usado para acessar o documento, como ele pode ser procurado, quais propriedades adicionais são armazenadas com o documento, qual a sua versão, quais políticas podem ser designadas, etc.

Depois de armazenado em um sistema de gerenciamento de conteúdo, um documento está, até certo ponto, preso nesse local e é difícil para os aplicativos que não são designados para aquele repositório específico acessarem as informações. Esse problema ocorre não somente entre softwares de empresas distintas, mas também com softwares do mesmo fornecedor.

No caso dos sistemas de enterprise content management (ECM), esses problemas de compartilhamento se tornam críticos, pois o volume de informações dos sistemas ECM é extremamente grande e porque as informações em si são essenciais. O modo como os funcionários são capazes de utilizar essas informações pode determinar o sucesso da empresa; o fato de as informações serem de difícil compartilhamento afeta a competitividade da empresa.

Os padrões de gestão de conteúdo começaram a surgir no final dos anos 90. Padrões como WebDAV e Java™ Content Repository (JCR) foram passos importantes, mas ainda lhes faltam muitos recursos necessários para compartilhar o conteúdo empresarial.

Há alguns anos, a Associates for Information and Image Management apoiou uma iniciativa chamada Interoperable Enterprise Content Management (IECM) Project.

Uma equipe representando fornecedores ECM iniciou discussões sobre a idéia de um padrão para tornar mais fácil o compartilhamento e a gestão de conteúdo. Com o passar do tempo, mais fornecedores EMC se envolveram no debate e um comitê técnico da Organization for the Advancement of Structured Information Standards (OASIS) foi criado para redigir uma especificação formal.

Em 2009, após anos de projeto, o comitê publicou a primeira versão da especificação proposta para comentários públicos. Vários fornecedores EMC já possuem protótipos que implementam o padrão proposto.


O básico sobre o CMIS

O padrão Content Management Interoperability Services (CMIS) proposto é simples e define um modelo de domínio extensível que consiste em quatro tipos de conteúdo base: documento, pasta, relacionamento e política. Os dois tipos de CMIS mais importantes são os tipos pasta e documento, pois é neles que se encontra a maioria do conteúdo.

Vamos examinar esses quatro tipos de conteúdo:

  • Documento CMIS. Similar a um arquivo, ele pode conter metadados do documento, tais como a autoria do documento, a data de modificação e propriedades customizadas que podem ser específicas de uma empresa em particular (veja a figura 1). O documento CMIS pode também conter um fluxo de conteúdo e rendições, tais como a visualização em miniatura de um documento.

    Figura 1. Diagrama de um documento CMIS
    Schematic of a CMIS document
  • Pasta CMIS. O tipo de contêiner é um recipiente com documentos CMIS e outras pastas CMIS (veja a figura 2). As pastas podem determinar que tipos de Documentos elas podem conter. É possível (como uma opção repositória CMIS) permitir que documentos sejam incluídos em múltiplas pastas ou até mesmo em nenhuma pasta.

    As pastas no CMIS repositório formam uma hierarquia precisa, na qual uma pasta pode ser apenas incluída dentro de uma única pasta de origem.

    Figura 2. Diagrama das pastas CMIS
    Schematic of CMIS folders
  • Relacionamento CMIS. Esse tipo de conteúdo é uma maneira de definir os relacionamentos entre objetos CMIS (veja a figura 3). Um objeto pode ter múltiplos relacionamentos com outros objetos. Os repositórios CMIS não necessitam impor qualquer semântica de relacionamento ou impor integridade referencial entre os dois objetos de um relacionamento.

    Figura 3. Diagrama de um relacionamento CMIS
    Schematic of a CMIS relationship
  • Política CMIS. Esse tipo de conteúdo é uma maneira de definir políticas administrativas para os objetos se gerenciarem, da maneira que são, fora do escopo de uma especificação CMIS. Pode-se, por exemplo, utilizar-se uma política CMIS para definir quais documentos estão sujeitos a políticas de retenção.

    Pode-se usar um conteúdo de uma política CMIS com bastante flexibilidade, pois ele é desconhecido para um repositório CMIS.

    Figura 4. Diagrama de uma política CMIS
    Schematic of CMIS policy

Esses tipos básicos podem ser subdivididos para definir novos tipos de conteúdo. É comum definir subtipos de um documento para um tipo específico de empresa. Pode-se, por exemplo, definir um subtipo de documento chamado "Proposta para o Cliente" com propriedades adicionais, tais como nome e informações de contato do cliente.

A especificação CMIS também define um conjunto de algumas dezenas de serviços de conteúdo para acessar esse conteúdo (veja a figura 5). Cada um desses serviços possui duas ligações, ambas baseadas em HTTP. Uma ligação utiliza o Atom Publishing Protocol e a outra utiliza os serviços da Web baseados no SOAP.

Figura 5. Serviços CMIS
CMIS services

Alguns desses serviços são necessários, mas muitos deles são opcionais, o que facilita para os fornecedores na hora de divulgar progressivamente o conteúdo de seus repositórios.

Um exemplo de serviço necessário é o getRepositoryInfo. Ele é necessário pois é um serviço usado para obter a coleção raiz no repositório para que seja possível começar a navegar pelo conteúdo. Também tem a ver a maneira com que o repositório descreve seus outros recursos.

Um exemplo de serviço opcional é o serviço de política, pois nem todos os repositórios podem (ou necessitam) expressar suas políticas administrativas de maneira geral.

Uma parte importante da especificação CMIS é o serviço de consulta, que é um dos serviços que mais diferenciam o CMIS das especificações anteriores. O princípio adotado para a consulta no CMIS era de se utilizar a linguagem de consulta que já era largamente entendida, o que, naturalmente, levou a escolha do Structured Query Language (SQL). A linguagem de consulta do CMIS é um subconjunto do SQL-92 (ISO/IEC 9075: 1992 – Database Language SQL) com poucas extensões. Se você já sabe SQL, será mais fácil consultar um repositório CMIS.

Por exemplo, para cada tipo de documento CMIS no repositório, há um nome de tabela lógica correspondente que pode ser usado em uma instrução SQL para selecionar documentos daquele tipo, utilizando as propriedades do documento como nomes de colunas. Isso significa que seria tão simples quanto configurar uma consulta SQL, tal como SELECT * FROM DOCUMENT, para se obter uma lista de documentos no repositório.

Observe que usamos o termo tabela lógica, pois não é necessariamente certo que haverá uma tabela do banco de dados relacional real para esse tipo. Nem é certo que a implementação de um repositório CMIS é baseada em um banco de dados relacional (apesar de muitas serem).

Há conceitos familiares inclusos na linguagem de consulta, tais como junções internas e externas; pesquisa em todo o texto com função de contagem, para permitir que o repositório signifique a relevância; predicados, para que você estenda a consulta para partes da hierarquia do documento; e ordenação.

A listagem 1 mostra dois exemplos simples de consultas CMIS, ilustrando como a linguagem de consulta pode ser usada.

Listagem 1. Exemplos de consultas CMIS

                SELECT Y.EMPNO, X.ANNUALSALARY FROM EMPLOYEE AS X JOIN SALARY AS Y ON
                ( X.EMPNO = Y.EMPNO )WHERE( 50000 >= X.ANNUALSALARY ) AND ( Y.MANAGER = ‘Y’ )
                
                SELECT * FROM document WHERE IN_FOLDER(‘/email/customers/ourbestcustomer’)
                AND CONTAINS (‘invoice’) AND title LIKE ‘%project a%’

CMIS e IBM Lotus Quickr

IBM® Lotus® Quickr™ é um software que facilita a colaboração entre equipes. O compartilhamento de conteúdo é importante para a colaboração, e como o CMIS, o Lotus Quickr introduziu um modelo de conteúdo simples, baseado no Atom e nos serviços da Web.

Devido ao fato de o Lotus Quickr ter sido desenvolvido antes do esforço de padronização do CMIS, os detalhes do modelo de dados e dos serviços que foram introduzidos foram diferentes do CMIS. Já que a padrão de programação básico do Lotus Quickr (baseado no Atom e nos serviços da Web) é similar ao padrão do CMIS, um desenvolvedor que tem conhecimento sobre os serviços de conteúdo do Lotus Quickr pode facilmente aprender a utilizar também o CMIS. Na verdade, a extensão CMIS do Firefox discutida neste artigo foi derivada da extensão do Lotus Quickr Firefox descrita no White Paper do developerWorks® "Developing an IBM Lotus Quickr Firefox connector using Quickr services."

Um exemplo que mostra como os serviços de conteúdo do Lotus Quickr deram origem ao CMIS é comparar o documento de serviço Atom com o documento de serviço para CMIS. Em ambos os casos, o documento de serviço Atom lista as coleções Atom mais altas onde é possível encontrar conteúdo. No Lotus Quickr, essas coleções são chamadas de bibliotecas de documentos, e pode-se visualizar uma lista dessas bibliotecas no documento de serviço. No caso do CMIS, os contêineres são chamados de repositórios, que podem ser vistos listados no documento de serviço. Em qualquer um dos casos, pode-se encontrar pastas e documentos dentro da biblioteca ou coleção do repositório representados por feeds Atom e entradas.

Quando se obtém o conteúdo de um dos feeds mencionados no documento de serviço, pode-se também observar que o Lotus Quickr e o CMIS estendem o Atom utilizando espaços de nome XML distintos. Por exemplo, no caso de um feed do Lotus Quickr, observa-se um espaço de nome td (abreviatura para teamspace documents) como um prefixo para algumas propriedades do documento Lotus Quickr, tais como o identificador do documento:

<td:uuid>bdb6ad804ca3662aadc7ff3cc4e9abbc</td:uuid>

Entretanto, em CMIS, pode-se observar que os identificadores são descritos com espaço de nomes CMIS com nomes como cmis (como já se poderia esperar). Por exemplo, em um feed CMIS, o identificador do documento se parece com este exemplo:

<propertyId localName="cmis:objectId" propertyDefinitionId="cmis:objectId">
<value>bdb6ad804ca3662aadc7ff3cc4e9abbc</value>
</propertyId>

O conceito é o mesmo; eles são somente descritos de maneira diferente em um documento XML.

Caso houvesse um cliente para um documento Lotus Quickr baseado em Atom (como um conector Firefox Lotus Quickr, por exemplo) que você quisesse adaptar para que ele funcionasse com documentos CMIS, seria possível reutilizar o fato de seu cliente entender a sintaxe dos documentos de serviço Atom e como os feeds Atom são usados.

Também se pode modificar seu cliente para que ele entenda espaços para nome XML distintos. Essa modificação provavelmente significa que você manterá a estrutura básica do seu programa e grande parte da experiência do usuário, mas modificará a parte na qual o XML é analisado.


O plug-in CMIS para Firefox

Agora que já mostramos um pouco a respeito do CMIS, veremos exemplos de como utilizar o CMIS para acessar um repositório de documentos. O exemplo utiliza a arquitetura de plug-in do Mozilla Firefox, baseada na XML User Interface Language (XUL) e o kit de ferramentas Dojo.

Arquitetura do plug-in

O XUL é uma estrutura com a qual se podem desenvolver aplicativos baseados na experiência de um usuário, construído utilizando:

  • Uma linguagem de marcações com imagens e folhas de estilo CSS
  • Um controlador escrito em JavaScript
  • Cadeias de caracteres sensíveis ao código de idioma

Um tempo de execução XUL incluído nos aplicativos Mozilla, como o Firefox, executa esse tipo de aplicativos. Pode-se estender o comportamento do Mozilla criando seu próprio aplicativo XUL que pode ser instalado no Firefox.

Além disso, o plug-in utiliza o kit de ferramentas Dojo para gerenciar a conversa entre ele o os repositórios CMIS. Por exemplo, ele usa extensões Atom incluídas no Dojo para buscar o documento de serviço Atom do repositório CMIS e utilizá-lo para preparar os pedidos de HTTP para executarem operações CMIS, tais como a criação de um documento (veja a figura 6).

Figura 6. Componentes do CMIS e plug-ins Lotus Quickr
Components of the CMIS and Lotus Quickr plug-ins

Acessando um repositório CMIS

Para utilizar um plug-in para gerenciar documentos em um repositório CMIS, deve-se, primeiramente, se certificar de que os serviços CMIS foram implementados pelo sistema de gerenciamento de conteúdo.

A IBM desenvolveu serviços CMIS que fornecem acesso ao IBM FileNet® e IBM Content Manager. Consulte o White Paper, “IBM FileNet and IBM Content Manager Technology Preview for OASIS CMIS,” para maiores informações.

A seguir, é necessário obter o URL do documento de serviço CMIS do servidor e usar o ID e a senha se o servidor estiver protegido, o que geralmente significa entrar em contato com o administrador de gerenciamento de conteúdo.

O documento de serviço é um documento XML cujo formato é definido pelo protocolo de publicação Atom e que foi estendido pelo padrão CMIS. Ele lista os repositórios CMIS gerenciados por esse servidor. Pense nele como seu diretório CMIS. O documento de serviço também descreve os recursos do repositório e possui links úteis com as coleções de documentos, tais como os documentos que já foram retirados. O formato do documento de serviço faz parte da ligação REST da especificação CMIS.

Clique com o botão direito na visualização em árvore do plug-in CMIS para exibir a janela Add Repository (veja a figura 7) na qual se pode inserir o URL do documento de serviço e as credenciais, caso o servidor esteja protegido.

Figura 7. Janela Add Repository
Add Repository window

Clique no botão Next na janela para invocar a função doNext() em AddRepositoryDialog.js para recuperar e analisar o documento de serviço CMIS, utilizando a seguinte função Dojo:

dojox.atom.io.getService: function(url, callback, errorCallback, scope)

A conexão do botão que invoca a função doNext() fazia parte da definição de diálogo XUL. Observe a linha ondialogextra1="doNext() in addRepositoryDialog.xul.

A listagem 2 traz um exemplo de um documento de serviço CMIS de um servidor IBM FileNet que foi buscado utilizando um diálogo XUL.

Listagem 2. Exemplo de código de documento de serviço CMIS

Pode-se observar que o documento de serviço contém informações importantes, incluindo nomes de repositórios. No exemplo na listagem 2, há somente um repositório CMIS, chamado FNSPStore (esse nome é mostrado nos elementos XML <title> E <repositoryId>.

Quando o Dojo busca e analisa esse documento de serviço CMIS, ele armazena as informações desse documento de serviço em um objeto do tipo dojox.atom.io.model.Service. Utilizando esse objeto, o plug-in obtém as informações necessárias sobre o repositório e as salva em uma array chamada gData.

Então o plug-in classifica a lista para que ela possa ser apresentada ao usuário. Pode-se visualizar todo o andamento desse processo na função handleService() em addRepository.js. Após a exibição das listas de repositórios classificadas na próxima janela Add Repository (veja a figura 8), pode-se selecionar o repositório que lhe interessa.

Figura 8. Lista de repositórios
List of repositories

Quando se clica em Salvar, a função doOK() em addRepositoryDialog.js é invocada. A conexão desse botão com a função do JavaScript está feita no arquivo AddrepositoryDialog.xul pela linha ondialogaccept="doOK();". A árvore na janela do CMIS Connector é atualizada durante a manipulação da função doOK() (veja a figura 9).

Figura 9. Lista de repositórios após a adição do repositório FNSPStore
Repository list after adding the FNSPStore repository

A lista de repositórios com seus dados associados é salva no sistema de arquivos no perfil ativo do usuário atual do Firefox. Por isso que uma lista de repositórios será vista na próxima vez que uma janela do Firefox for aberta. O local do diretório de perfil do Firefox depende do sistema; por exemplo, no Microsoft® Windows® XP, o local é:

C:\Documents and Settings\<user>\Application Data\mozilla\firefox\profiles

É claro que o objetivo maior do CMIS é acessar conteúdo em diferentes repositórios e não somente conteúdos de um só fornecedor. Devido ao fato de o plug-in ter sido criado de acordo com a especificação do padrão CMIS proposta, ele pode ser usado para gerenciar documentos armazenados em qualquer sistema, contanto que o sistema também implemente o padrão proposto.

Ao pesquisar repositórios CMIS na Internet, podem-se encontrar, baixar grátis e testar vários deles. Há também uma lista de provedores de repositório CMIS e alguns clientes CMIS interessantes disponível no artigo wiki Lotus Quickr, "Implementations of CMIS."

Explorando um repositório CMIS

Após localizar o repositório CMIS salvo no plug-in, pode-se clicar duas vezes no repositório para começar a explorar seu conteúdo. Essa ação faz com que a coleção raiz do documento de serviço seja usada para buscar os nomes das pastas e dos documentos do repositório. Essa coleção raiz foi descoberta anteriormente quando o repositório foi adicionado à função handleService() function em addRepository.js.

A busca pelo conteúdo dessa coleção raiz é um outro caso no qual o kit de ferramentas Dojo é usado. A função getChildrenData(/*cmiscon.TreeNode*/ node) em cmisconnector.js utiliza a função dojo.xhrGet para emitir um pedido de HTTP XML para obter o documento de feed Atom listando as pastas e os documentos na coleção raiz. Um feed como esse se parece com o mostrado na listagem 3.

Listagem 3. Exemplo de feed

Observe que esse exemplo de feed contém tanto uma pasta CMIS quanto um documento CMIS, cada um representado por uma entrada Atom. No caso da pasta, a entrada contém a propriedade do tipo de objeto com o valor cmis:folder. No caso de documentos, o valor é cmis:document.

Quando o plug-in analisa o feed CMIS e encontra a entrada cmis:document, ele cria um nó na árvore do plug-in, utilizando um mini-ícone de um documento para representar o documento. O plug-in se lembra dos dados associados aquele nó, o ID do documento e o link para o fluxo de conteúdo do documento (os bits do documento).

Esse link é encontrado no link edit-media da entrada do documento, seguindo os padrões Atom. A busca do link é feita através de HTTP GET e os conteúdos são exibidos na janela do navegador, do lado direito do plug-in.

Quando o plug-in encontra uma entrada cmis:folder, ele cria um nó na árvore do plug-in, utilizando um mini-ícone de uma pasta para representar o nó. Ele também se lembra, nos dados associados a esse nó, do valor do link inativo da entrada Atom dessa pasta. O link inativo é um feed CMIS de pastas e documentos. Pode-se observar que o padrão de navegação das pastas e documentos é recursivo. Começando pela coleção raiz e trabalhando de cima para baixo pela hierarquia da pasta, o plug-in descobre o conteúdo quando o usuário clica na árvore. Cada nível na hierarquia é representado por um feed Atom.

Adicionando documentos a um repositório CMIS

Adicionar documentos a um repositório CMIS é tão simples como arrastá-los até a pasta. Em cmisconnector.xul, pode-se ver as opções de arrastar e soltar que se aplicam ao controle árvore exibido no conteúdo da barra lateral CMIS. Com relação aos outros arquivos XUL, há uma associação com um arquivo JavaScript correspondente no qual a lógica para a manipulação das operações de arrastar e soltar são especificadas. Um observador, chamado cmisDNDObserver, contém as funções para determinar se um nó em uma árvore pode ser arrastado e se ele pode ser solto. O cmisDNDObserver se encontra em cmisconnector.js.

A função canDrop em cmisconnector.js é invocada quando um objeto arrastado passa sobre um nó em uma árvore de repositório CMIS. Se a resposta é verdadeira quando o objeto debaixo do ponteiro do mouse for um nó representado um repositório CMIS ou uma pasta CMIS. Caso contrário, a resposta é falsa.

A função de soltar em cmisconnector.js é invocada quando o usuário solta uma página da Web, um outro documento CMIS ou um arquivo local em cima do nó na barra lateral da árvore de documentos representando um repositório CMIS ou uma pasta CMIS. A função de soltar determina em qual feed URL publicar o documento e então invoca a função uploadUrl.

Primeiro, a função uploadUrl baixa o documento, utilizando a função downloadFile, salva-o como um arquivo local e então invoca a função uploadFile. A função uploadFile determina o nome do documento CMIS baseando-se nas opções de usuário descritas na próxima seção, “Opções de Conector CMIS.” Então a função createEntry é invocada para publicar o documento junto ao repositório CMIS.

Ao olhar para o JavaScript na função createEntry, pode-se observar que esse processo é uma questão de seguir as etapas definidas no Protocolo de Publicação Atom; ou seja, criar uma entrada de documento CMIS, que é somente uma especialização de uma entrada Atom, e então usar a operação HTTP POST para criar o documento CMIS.

O recurso que o Dojo fornece em dojo.rawXhrPost, que simplifica a criação dos pedidos de HTTP XML, é usada aqui. O Dojo também fornece funções em dojo.rawXhrPost para extrair o link edit-media da entrada do documento CMIS que retornou, para que ela possa ser usada pela função uploadFile para fazer o upload do conteúdo do arquivo para o fluxo de conteúdo do documento CMIS.

Deve-se também se ter observado que o parâmetro HTTP CMIS, versioningState=checkedout, é usado na operação HTTP POST. Esse parâmetro verifica o documento recém-criado no repositório CMIS.

Esse parâmetro foi necessário para permitir que se fizesse o upload do conteúdo do arquivo para o novo documento CMIS. Caso contrário, necessitaríamos verificar o documento para se obter uma cópia de trabalho privada que possa ser atualizada. Uma outra opção é codificar o conteúdo do arquivo usando como base a codificação de 64-bits e postar esse conteúdo codificado com um HTTP POST original que criou o documento CMIS.

Criando uma pasta CMIS

Uma pasta pode ser criada na coleção raiz do repositório ou na subpasta do repositório. Pode-se adicionar pastas ao repositório CMIS clicando com o botão direito sobre a pasta e inserido o nome da nova pasta, como mostra a figura 10.

Figura 10. Janela do título da pasta
Folder title window

Essa janela é mostrada através da função window.prompt que faz parte da função JavaScript chamada de newFolder em cmisconnector.js. A associação da função newFolder com a opção de menu que aparece quando se clica com o botão direito pode ser vista nó código cmisconnector.xul:

<menuitem id="miNewFolder" label="&newFolder.label;
"accesskey="&newFolder.accesskey;"
oncommand="newFolder();"/>

Ao ver o JavaScript na função newFolder, pode-se observar que esse código é similar ao mecanismo de criação de um documento CMIS, exceto que, neste caso, é uma entrada da pasta CMIS que está sendo postada utilizando dojo.rawXhrPost.


Opções do conector CMIS

O plug-in fornece alguns pontos de customização tanto para usuário quanto para o desenvolvedor. O primeiro ponto de customização é uma opção que permite ao usuário especificar que nome usar para o documento CMIS. As outras opções, que documento CMIS e tipos de pasta utilizar e como manipular as propriedades CMIS, podem ser modificadas pelo desenvolvedor.

Nome do documento

O plug-in permite ao usuário decidir como criar o nome do documento CMIS (o propriedade chamada cmis:document) quando um arquivo for arrastado e solto em uma pasta no plug-in. O usuário pode especificar essas opções selecionando Ferramentas - Complementos, no menu do Firefox.

Na janela de Complementos, pode-se especificar se o nome do documento CMIS (cmis:name) deve derivar-se do URL do documento ou página da Web arrastado ou se deve derivar do texto do link do documento ou página da Web solta (veja a figura 11). Observe que, quando se arrasta e solta arquivos locais, os valores são os mesmos.

Figura 11. Janela de complementos
Add-ons window

Qualquer que seja a opção escolhida, se você selecionar a opção "Prompt document name when drag and drop" (mostrar o nome do documento na hora de arrastar e soltar), você será avisado cada vez que arrastar e soltar um arquivo ou página da Web em uma pasta CMIS.

Ao selecionar essa opção, também aparecerá uma janela para renomear (Rename) quando um documento for solto, permitindo que você especifique um nome diferente do texto do link ou URL computado pelo plug-in (veja a figura 12).

Figura 12. Janela para renomear
Rename window

A janela de opções especificada no arquivo XUL, options.xul. Quando um documento é solto, essas opções são lidas e colocadas em um objeto chamado gPrefs. Então a opção onDrop em cmisconnector.js é usada para selecionar qual valor, no objeto solto, usar para o nome do documento CMIS.

Pasta base e tipos de documento

Quando o plug-in cria uma pasta CMIS ou um documento CMIS, um modelo para a entrada Atom é usado para controlar o que é postado pelo repositório CMIS. Esses modelos estão contidos nos arquivos NewFolderForPost.xml e NewDocForPost.xml. Nesses arquivos, pode-se configurar o tipo usado para criar a pasta ou documento CMIS. Esse recurso é importante pois alguns repositórios CMIS não permitem a criação de instâncias do tipo base cmis:folder ou cmis:document.

Por exemplo, caso se queira que o plug-in use um tipo customerfolder, pode-se especificar esse nome no arquivo NewFolderForPost.xml, como mostra o exemplo da listagem 4.

Listagem 4. Especificação de um tipo customerfolder

                <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
                <atom:entry
                    xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"
                    xmlns:atom="http://www.w3.org/2005/Atom" 
                    xmlns:app="http://www.w3.org/2007/app"
                    xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/">
                        <atom:title type="text">FolderTitle</atom:title> 
                        <cmisra:object>
                            <cmis:properties> 
                                <cmis:propertyId propertyDefinitionId="cmis:objectTypeId">
                                    <cmis:value>customerfolder</cmis:value> 
                                </cmis:propertyId>
                            </cmis:properties> 
                        </cmisra:object> 
                        <cmis:terminator/>
                </atom:entry>

Propriedades

Clique com o botão direito na pasta ou documento para exibir a janela de Propriedades. Essa janela é definida pelo arquivo propertiesDialog.xul e os valores são inseridos nessa janela pelo JavaScript no arquivo propertiesDialog.js. As propriedades que são mostradas e como elas são gerenciadas são controladas pela configuração definida pelo arquivo property.cfg.

Pode-se modificar o arquivo property.cfg para adicionar os nomes de quaisquer propriedades não definidas pelo CMIS. Por exemplo, se um repositório define a propriedade chamada myrepository:tags e você quer que essa propriedade possa ser modificada pelo usuário, pode-se adicionar uma linha a ao arquivo property.cfg como essa:

myrepositoryxyz:tags = true


Mais informações a respeito do plug-in CMIS

Como foi mencionado na seção anterior, o plug-in CMIS foi criado com o uso de janelas XUL, JavaScript, folhas de estilo CSS e arquivos de código do idioma. Pelo fato de o plug-in incluir todo o código de origem, é possível explorar o origem desse plug-in para se observar com mais detalhes como ele funciona.

Uma maneira fácil de fazer essa verificação é implementar o plug-in em um ambiente de desenvolvimento de aplicativo, tal como o Eclipse. (Pode-se baixar o ambiente de desenvolvimento Eclipse pelo Web site Eclipse Ganymede.)

Tornamos essa verificação mais fácil organizando o código como um projeto Eclipse e empacotando-o em um arquivo ZIP. Para implementar o plug-in no Eclipse, baixe o arquivo cmisconnector.zip file na seção de Downloads deste artigo, extraia o arquivo e crie um projeto Java baseado no código de origem desse arquivo.

Depois de importar o código de origem para o Eclipse, pode-se visualizá-lo e criar o plug-in selecionando o projeto e então selecionando Project - Build project no menu na parte superior. A operação de criação cria um arquivo chamado cmisconnector@ibm.com.xpi.

Para instalar o arquivo do plug-in que você criou desta maneira, clique duas vezes no arquivo cmisconnector@ibm.com.xpi que está na pasta-raiz do projeto. Isso faz com que o Mozilla Firefox se inicie e a janela de instalação do software é exibida, avisando sobre a instalação do plug-in (veja a figura 13).

Figura 13. Instalação do plug-in
Install the plug-in

Clique no botão Instalar Agora na janela e reinicie o Firefox. Agora o plug-in que você criou pode ser usado.


Dicas de depuração

Após a implementação do plug-in CMIS, seria útil usar um depurador de código de origem que permite passear pelo código, para entender melhor como ele foi estruturado. No caso de um conector Firefox, o código de origem está escrito em JavaScript, então é necessário um depurador de JavaScript.

Há várias alternativas, mas usamos o depurador Venkman JavaScript para criar esse plug-in. Ele pode ser baixado da página do projeto do depurador Venkman JavaScript. Após implementar o depurador Venkman JavaScript, deve-se configurar a opção que permite ver o código na barra lateral. Para executar essa etapa, no menu principal do depurador, selecione Debug e então ative Exclude Browser Files para desligar essa opção.

Agora é possível ver o código de origem do JavaScript para o plug-in CMIS; entretanto, observe que somente o JavaScript que foi carregado está visível em qualquer momento. Por exemplo, o código de origem dentro do cmisconnector.js não estará visível até que o plug-in CMIS esteja realmente carregado (veja a figura 14) e o código de origem em addRespositoryDialog.js não estará visível até que a janela Add Repository seja usada.

Figura 14. Depurador do JavaScript
JavaScript debugger

Depois de carregar o JavaScript, pode-se observar o código de origem e os pontos de interrupção definidos. Por exemplo, a figura 15 mostra o ponto de interrupção definido na função GetChildren() em cmisconnector.js.

Depois de definir o ponto de interrupção, ao expandir os elementos de uma pasta no plug-in, você parará nessa linha do código e poderá inspecionar as variáveis e começar a passear pelo código usando as teclas F5, F12 e F11.

Figura 15. Definição do ponto de interrupção na função GetChildren()
Breakpoint set in GetChildren() function

Olhando adiante

A especificação CMIS continuará a ser melhorada com os comentários do público; da mesma maneira, nosso plug-in CMIS continuará a ser revisado quando as novas versões do padrão proposto forem publicadas.

Quando a especificação for aprovada e se tornar um padrão OASIS oficial, uma versão final do plug-in será publicada. Além disso, partes opcionais da especificação CMIS, tais como o controle de acesso e as rendições, podem ser incluídas em versões posteriores do plug-in.


Conclusão

O CMIS é um importante padrão OASIS proposto que facilita o compartilhamento de conteúdo entre diferentes fornecedores. A Mozilla fornece uma estrutura para extensão do navegador, usando plug-ins escritos em XUL e JavaScript.

Usar as definições de serviço do CMIS com a estrutura de plug-ins Mozilla permite desenvolver novos tipos de aplicativos que estendem os recursos do navegador para trabalhar com conteúdos de diversas origens.

Mesmo pensando que o exemplo de código deste artigo é uma maneira útil de começar, encorajamos você a aprender mais a respeito do padrão CMIS e da estrutura de plug-ins Mozilla propostos e a desenvolver seus próprios tipos de aplicativos de conteúdo. A seção de Recursos abaixo inclui alguns links úteis que o ajudarão a aprender mais.


Download

DescriçãoNomeTamanho
Code samplecmisconnector@ibm.com_src.zip107KB

Recursos

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

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

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

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

Elija su nombre para mostrar



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

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

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

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

 


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


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Lotus
ArticleID=973176
ArticleTitle=Desenvolvendo um plug-in do Mozilla Firefox para Content Management Interoperability Services
publish-date=03112010