Разработка плагина Mozilla Firefox для Content Management Interoperability Services

В данной статье представлен обзор предлагаемого нового стандарта доступа к контенту - Content Management Interoperability Services (CMIS), а также приводится пример использования его сервисов в Mozilla Firefox.

Грег Мелан, архитектор и старший технический специалист, IBM

Грег Мелан (Greg Melahn) – архитектор и старший технический специалист направления Lotus в IBM. С Грегом можно связаться по адресу melahn@us.ibm.com.



Шунь Чжан, инженер-программист, IBM

Шунь Чжан (Shun Zhang) работает инженером-программистом IBM в Пекине и занимается технологиями Lotus Quickr, Web 2.0 и SOA. Связаться с ним можно по адресу shunzh@cn.ibm.com.



Хуи Цзян Хе, штатный инженер-программист, IBM

Хуи Цзян Хе (Hui Jian He) работает штатным инженером-программистом IBM в Пекине. Занимается Lotus Quickr. Связаться с ним можно по адресу hehuij@cn.ibm.com.



Сяо Ванг, стажер, IBM

Сяо Ванг (Xiao Wang) - стажер IBM Development Lab в Пекине и студент Пекинского университета. Связаться с ним можно по адресу wwxiao@cn.ibm.com.



08.03.2011

Примечание редактора. Хорошо знаете эту тему? Хотите поделиться своим опытом? Примите участие в wiki-программе IBM Lotus software today.

Lotus Quickr wiki

Введение и предпосылки

За прошедшие несколько десятилетий имел место значительный прогресс в предоставлении пользователям возможности взаимодействовать друг с другом. Благодаря интернет-протоколам, высокоскоростным сетям, дешевым устройствам и стандартизации форматов документов обмениваться информацией теперь стало проще, чем когда бы то ни было. Но мы до сих пор бьемся над улучшением совместной работы с бизнес-контентом. Почему?

Частично ответ состоит в том, что бизнес-информация продолжает храниться в закрытых хранилищах ("силосных ямах"), для которых производители программного обеспечения принимают собственные независимые решения по многим деталям организации информации и доступа к ней. В двух различных системах управления контентом, может храниться документ, созданный одним и тем же приложением и даже имеющий одно и то же количество битов (например, PDF-файл).

Система управления контентом, хранящая документ, принимает решения по таким важным вопросам, как используемый для доступа к документу API, возможные методы его поиска, дополнительные свойства, хранящиеся с документом, способы отслеживания изменений, назначаемые политики и т.д.

После сохранения в системе управления контентом документ попадает в своего рода "клетку", и к его информации становится трудно получить доступ из приложений, не спроектированных для работы с этим конкретным репозиторием. Эта проблема возникает не только с программным обеспечением различных компаний-производителей, но и с программными продуктами одного и того же производителя.

В случае с системами управления корпоративным контентом (enterprise content management – ECM) проблема совместного доступа к информации становится еще более острой, поскольку объемы информации в ECM-системах чрезвычайно велики, а сама информация является критически важной для деятельности. Возможности сотрудников использовать информацию могут определить успешность компании; фактически трудность совместного использования этой информации напрямую влияет на конкурентоспособность компании.

Стандарты управления контентом начали появляться в конце 90-х годов. Стандарты, подобные WebDAV и Java™ Content Repository (JCR), стали важными шагами, но в них отсутствовали многие возможности, необходимые для совместного использования корпоративного контента.

Несколько лет назад ассоциация Associates for Information and Image Management выступила спонсором проекта под названием Interoperable Enterprise Content Management (IECM) Project.

Группа разработчиков, представляющих производителей ECM, начала обсуждение идеи стандарта, заключающейся в облегчении совместного использования и управления контентом. Со временем в обсуждение были вовлечены еще несколько компаний-поставщиков средств ECM, и для написания формальной спецификации был сформирован технический комитет Advancement of Structured Information Standards (OASIS).

Через несколько лет проектирования, в 2009 году, комитет опубликовал первую версию предлагаемой спецификации для всеобщего обсуждения. Несколько производителей ECM уже имели прототипы, реализующие предложенный стандарт.


Основы CMIS

Предложенный стандарт Content Management Interoperability Services (CMIS) отличается простотой и определяет расширяемую доменную модель (extensible domain model), состоящую из контента четырех типов: document (документ), folder (папка), relationship (взаимоотношение) и policy (политика). Двумя самыми важными CMIS-типами являются типы folder и document, поскольку именно в них находится основная часть контента.

Давайте рассмотрим эти четыре типа контента:

  • CMIS-документ. Аналогично файлу, этот тип имеет свойства для хранения метаданных документа, таких как автор документа и дата изменения, а также специализированные свойства, которые могут быть специфичными для конкретной компании (см. рисунок 1). CMIS-документ может также содержать поток контента (content stream) и интерпретации (rendition), например, миниатюрный эскиз (thumbnail view) документа.

    Рисунок 1. Схематическое представление CMIS-документа
    Рисунок 1. Схематическое представление CMIS-документа
  • CMIS-папка. Этот тип контента представляет собой контейнер CMIS-документов и других CMIS-папок (см. рисунок 2). Папки могут определять, какого типа документы они могут содержать. Имеется возможность (через параметр CMIS-репозитория) разрешить документам содержаться в нескольких папках или даже вне папок.

    Папки в CMIS-репозитории образуют строгую иерархию, в которой папка может находиться внутри только одной родительской папки.

    Рисунок 2. Схематическое представление CMIS-папок
    Рисунок 2. Схематическое представление CMIS-папок
  • CMIS -взаимоотношение. Этот тип контента представляет собой способ определения взаимоотношений между CMIS-объектами (см. рисунок 3). Объект может иметь несколько взаимоотношений с другими объектами. От CMIS-репозиториев не требуется четко следовать какой-либо семантике взаимоотношений или ссылочной целостности между двумя объектами взаимоотношения.
    Рисунок 3. Схематическое представление CMIS-взаимоотношений
    Рисунок 3. Схематическое представление CMIS-взаимоотношений
  • CMIS-политика. Этот тип контента представляет собой способ определения политик администрирования для управления объектами посредством методов, которые сами по себе лежат вне сферы рассмотрения спецификации CMIS. Например, с помощью CMIS-политики можно определить, на какие документы распространяется политика сохранения документов.

    Содержимое CMIS-политики прозрачно для CMIS-репозитория, поэтому ее можно использовать достаточно гибко.

    Рисунок 4. Схематическое представление CMIS-политики
    Рисунок 4. Схематическое представление CMIS-политики

На основе этих основных типов можно создавать подтипы для определения новых видов контента. Подтипы документов обычно определяют для специфических видов деятельности. Например, можно определить подтип документа под названием Customer Proposal с дополнительными свойствами, такими как Customer Name и Customer Contact.

Спецификация CMIS также определяет набор из нескольких десятков сервисов для доступа к контенту (см. рисунок 5). Каждый сервис имеет два связывания, основанных на протоколе HTTP. Одно связывание использует протокол Atom Publishing Protocol, второе использует Web-сервисы, основанные на SOAP.

Рисунок 5. Сервисы CMIS
Рисунок 5. Сервисы CMIS

Некоторые из этих сервисов являются обязательными, но многие – нет, что позволяет производителям раскрывать содержимое своих репозиториев постепенно.

Примером обязательного сервиса является getRepositoryInfo. Он обязателен, потому что именно он используется для получения корневого набора объектов (root collection) в репозитории, служащего отправной точкой для навигации по контенту. Он также определяет способ описания репозиторием иных своих возможностей.

Примером необязательного сервиса является сервис policy, поскольку не все репозитории могут (или требуют) выражать административные политики общим способом.

Важная часть спецификации CMIS – это сервис запросов (query), который является одним из сервисов, отличающий CMIS от других спецификаций. При разработке CMIS было решено взять за основу широко распространенный язык запросов, что естественным образом привело к выбору языка Structured Query Language (SQL). Язык запросов CMIS является подмножеством SQL-92 (ISO/IEC 9075: 1992 – Database Language SQL) с несколькими расширениями. Если вы уже знакомы с SQL, то вам будет легко выполнять запросы к CMIS-репозиторию.

Например, для каждого типа CMIS-документов в репозитории существует соответствующее ему имя логической таблицы, которое можно использовать в SQL-выражениях для выборки документов этого типа, используя свойства документа в качестве названий столбцов. Это означает, что получить список документов в репозитории будет так же просто, как и сформировать SQL-запрос, например SELECT * FROM DOCUMENT.

Обратите внимание на то, что мы используем понятие логической таблицы, поскольку реальная реляционная таблица для этого типа может и не существовать. Реализация CMIS-репозитория также не обязательно основана на реляционной базе данных (хотя во многих случаях это действительно так).

В язык запросов включены знакомые концепции, например внутренние и внешние соединения, полнотекстовый поиск с функцией оценивания для прогнозирования релевантности, предикаты, позволяющие распространять запрос на часть иерархии документов, а также сопоставление (collation).

В листинге 1 приведена пара простых примеров CMIS-запросов, демонстрирующих, как можно использовать язык запросов.

Листинг 1. Примеры 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 и IBM Lotus Quickr

IBM® Lotus® Quickr™ – это программный продукт, облегчающий совместную работу группы пользователей. Общий контент очень важен для совместной работы, и, аналогично CMIS, Lotus Quickr предоставляет простую модель контента и набор сервисов, основанных на Atom и Web-сервисах.

Поскольку Lotus Quickr был создан до начала работ по стандартизации CMIS, его организация модели данных и сервисы отличаются от CMIS. Поскольку основной шаблон программирования в Lotus Quickr (основанный на Atom и Web-сервисах) аналогичен применяемому в CMIS, разработчик, имеющий опыт работы с сервисами контента Lotus Quickr, легко сможет использовать CMIS. Фактически расширение CMIS Firefox, рассматриваемое в данной статье, происходит из расширения Lotus Quickr Firefox, описанного в техническом обзоре developerWorks® Разработка коннектора IBM Lotus Quickr Firefox с использованием сервисов Quickr (EN).

Одним из примеров, демонстрирующим, как сервисы контента Lotus Quickr развивались в сервисы CMIS, является сравнение документа сервиса Atom в Lotus Quickr с соответствующим документом сервиса для CMIS. В обоих случаях документ сервиса Atom перечисляет наборы Atom самого верхнего уровня, в которых можно найти контент. В Lotus Quickr эти наборы называются библиотеками документов, и в документе сервиса можно найти список этих библиотек. В CMIS контейнеры называются репозиториями; их список можно найти в документе сервиса. В любом случае внутри набора репозиториев или библиотек можно найти папки и документы, представляющие Atom-фиды и записи.

После получения контента одного из фидов, упомянутых в документе сервиса, можно также заметить, что Lotus Quickr и CMIS расширяют Atom, используя разные пространства имен XML. Например, в случае с фидом из Lotus Quickr мы видим пространство имен td (сокращение от teamspace documents) в качестве префикса для некоторых свойств документа Lotus Quickr, например как идентификатор документа:

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

Однако в CMIS мы видим, что идентификаторы описываются с пространством имен (как и следовало ожидать) cmis. Например, идентификатор документа может выглядеть в CMIS-фиде так:

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

Концепции одинаковы, просто они по-разному описываются в XML-документе.

Если бы у вас имелось основанное на Atom клиентское приложение, работающее с документами Lotus Quickr (например, коннектор Lotus Quickr Firefox), которое хотелось бы адаптировать для работы с CMIS-документами, вы могли бы использовать тот факт, что ваше клиентское приложение понимает синтаксис документов service Atom и знает, как использовать Atom-фиды.

Также можно изменить ваше клиентское приложение таким образом, чтобы оно понимало различные пространства имен XML. При таком изменении, скорее всего, основная структура программы и основные способы работы пользователей не изменились бы, а изменилась бы та часть, которая занимается синтаксическим анализом XML.


Плагин Firefox CMIS

Теперь, когда вы кое-что знаете о CMIS, давайте рассмотрим пример использования CMIS для доступа к репозиторию документов. В примере используется архитектура плагина Mozilla Firefox, основанная на языке XML User Interface Language (XUL) и инструментальном пакете Dojo Toolkit.

Архитектура плагина

XUL – это интегрированная среда, в которой можно разрабатывать приложения для пользователей, используя:

  • простой язык разметки с изображениями и таблицами стилей CSS;
  • контроллер, написанный на JavaScript;
  • локализованные строки.

Приложения подобного рода исполняет среда исполнения XUL, входящая в такие приложения Mozilla, как Firefox. Поведение Mozilla можно расширять путем написания своих собственных XUL-приложений, которые можно установить в Firefox.

Кроме того, плагин использует инструментальный пакет Dojo для управления взаимодействием с CMIS-репозиториями. Например, он использует расширение Atom, поставляемое в Dojo, для выборки документа service Atom из CMIS-репозитория, а также использует его для подготовки HTTP-запросов на выполнение CMIS-операций, например, создание документа (см. рисунок 6).

Рисунок 6. Компоненты плагинов Lotus Quickr и CMIS
Рисунок 6. Компоненты плагинов Lotus Quickr и CMIS

Доступ к CMIS-репозиторию

Чтобы использовать плагин для управления документами в CMIS-репозитории, необходимо прежде всего убедиться в том, что в вашей системе управления контентом развернуты CMIS-сервисы.

Например, IBM разработала CMIS-сервисы, обеспечивающие доступ к IBM FileNet® и IBM Content Manager. Дополнительная информация приведена в документе Предварительное описание технологии IBM Content Manager и IBM FileNet для OASIS CMIS (EN).

Затем необходимо получить URL-адрес документа сервиса CMIS на сервере, а также, если сервер является защищенным, идентификатор и пароль пользователя, что обычно предполагает общение с администратором системы управления контентом.

Документ сервиса представляет собой XML-документ, формат которого определен протоколом публикации Atom и расширен согласно стандарту CMIS. В нем перечислены CMIS-репозитории, управляемые этим сервером. Рассматривайте его как CMIS-каталог. Документ сервиса также описывает возможности репозитория и содержит полезные ссылки на наборы документов, например, проверенные документы. Формат документа сервиса описан в разделе REST-связывания спецификации CMIS.

Щелкните правой кнопкой мыши на древовидном списке CMIS-плагина для отображения окна Add Repository (см. рисунок 7), в котором можно ввести URL-адрес документа сервиса и информацию о полномочиях, если сервер является защищенным.

Рисунок 7. Окно Add Repository
Рисунок 7. Окно Add Repository

Нажмите кнопку Next в окне для активизации функции doNext() в AddRepositoryDialog.js, чтобы извлечь и выполнить синтаксический анализ документа сервиса CMIS, используя следующую функцию Dojo:

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

Связывание кнопки, вызывающей функцию doNext(), является частью определения диалогового окна XUL. См. строку ondialogextra1="doNext() в addRepositoryDialog.xul.

В листинге 2 приведен пример документа сервиса CMIS с сервера IBM FileNet, извлеченного при помощи диалогового окна XUL.

Листинг 2. Пример кода документа сервиса CMIS

Как можно заметить, документ сервиса содержит полезную информацию, включая имена репозиториев. В примере, приведенном в листинге 2, имеется только один CMIS-репозиторий под названием FNSPStore (это имя отображается в XML-элементах <title> и <repositoryId>.

После извлечения и анализа документа сервиса CMIS Dojo сохраняет информацию из этого документа в объект типа dojox.atom.io.model.Service. Используя этот объект, плагин получает необходимую информацию о репозитории и затем сохраняет информацию в массиве gData.

Затем плагин сортирует список так, чтобы его можно было представить пользователю. Можно заметить, что все эти действия происходит в функции handleService() в addRepository.js. После отображения отсортированного списка репозиториев в следующем окне Add Repository (см. рисунок 8) можно выбрать репозитории, которыми вы интересуетесь.

Рисунок 8. Список репозиториев
Рисунок 8. Список репозиториев

При нажатии кнопки Save вызывается функция doOK() в addRepositoryDialog.js. Связывание этой кнопки с JavaScript-функцией осуществляется в файле AddrepositoryDialog.xul в строке ondialogaccept="doOK();". При работе функции doOK() обновляется древовидный список в окне CMIS Connector (см. рисунок 9).

Рисунок 9. Список репозиториев после добавления репозитория FNSPStore
Рисунок 9. Список репозиториев после добавления репозитория FNSPStore

Список репозиториев вместе с ассоциированными с ними данными сохраняется в файловой системе в активном профиле текущего пользователя Firefox; поэтому список репозиториев появляется при следующем открытии окна Firefox. Местоположение каталога профилей Firefox зависит от системы; например, в Microsoft® Windows® XP используется следующее местоположение:

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

Конечно же, общим смыслом CMIS является доступ к контенту в разных репозиториях, а не только к контенту от одного производителя. Поскольку плагин был создан согласно предложенной спецификации CMIS-стандарта, его можно использовать для управления документами, хранящимися в любой системе, если система также реализует предложенный стандарт.

Выполнив поиск CMIS-репозиториев в интернете, можно обнаружить несколько доступных для загрузки с целью бесплатного тестирования. Также список поставщиков CMIS-репозиториев и некоторые интересные клиентские приложения CMIS можно найти в статье Lotus Quickr wiki Реализации CMIS (EN).

Исследование CMIS-репозитория

После сохранения в плагине местоположения CMIS-репозитория можно дважды щелкнуть левой кнопкой мыши на репозитории с целью исследования его контента. Это действие вызывает использование корневого набора из документа сервиса для извлечения названий папок и документов из репозитория. Этот корневой набор был сформирован ранее, при добавлении репозитория в функцию handleService() в addRepository.js.

Извлечение контента этого корневого набора является еще одним примером использования инструментального пакета Dojo. Функция getChildrenData(/*cmiscon.TreeNode*/ node) в cmisconnector.js использует функцию dojo.xhrGet для выдачи XML HTTP-запроса на получение документа Atom-фида, перечисляющего папки и документы в корневом наборе. Такой фид выглядит примерно так, как показано в листинге.

Листинг 3. Пример фида

Обратите внимание на то, что этот пример фида содержит и CMIS-папку, и CMIS-документ, каждый из которых представлен записью Atom. Запись для папки содержит свойство object type со значением cmis:folder. Запись для документа содержит значение cmis:document.

Когда плагин в процессе синтаксического анализа CMIS-фида встречает запись cmis:document, он создает в дереве плагина узел, представляя его миниатюрной пиктограммой документа. Плагин запоминает данные, ассоциированные с этим узлом, идентификатор документа и ссылку на поток контента документа (биты документа).

Эта ссылка находится в ссылке edit-media записи документа, следующей за соглашениями Atom. Ссылка извлекается посредством запроса HTTP GET, и контент отображается в окне браузера в правой части плагина.

Когда плагин встречает запись cmis:folder, он создает в дереве плагина узел, представляя его миниатюрной пиктограммой папки. Он также запоминает данные, ассоциированные с этим узлом, значение ссылки down из записи Atom для этой папки. Ссылка down сама по себе является CMIS-фидом папок и документов. Можно заметить, что схема навигации по папкам и документам является рекурсивной. Начиная с корневого набора и проходя вниз по древовидной иерархии, плагин обнаруживает контент, как это делает пользователь, щелкая по дереву. Каждый уровень в иерархии представляется как Atom-фид.

Добавление документов в CMIS-репозиторий

Добавление документов в репозиторий выполняется так же легко, как перетаскивание их в папку. В cmisconnector.xul можно увидеть параметры операции drag-and-drop, применяющиеся к элементу управления tree, отображаемому в контентом боковой панели CMIS. Как и для остальных XUL-файлов, существует ассоциация между соответствующим JavaScript-файлом, в котором определяется логика обработки операций drag-and-drop. Обозреватель (observer), называемый cmisDNDObserver, содержит функцию для обработки возможности перетаскивания узла дерева и возможности узла принимать перетаскиваемый объект. Обозреватель cmisDNDObserver находится в файле cmisconnector.js.

Функция canDrop в cmisconnector.js вызывается, когда перетаскиваемый объект проходит над узлом в дереве CMIS-репозиториев. Она возвращает значение true, когда объект, расположенный ниже указателя мышки, является узлом, представляющим CMIS-репозиторий или CMIS-папку; в противном случае возвращается значение false.

Функция drop в cmisconnector.js вызывается, когда пользователь отпускает Web-страницу, другой CMIS-документ или локальный файл на узле в дереве документов в боковой панели, представляющем CMIS-репозиторий или CMIS-папку. Функция drop определяет, какой URL фида публикует документ, и затем вызывает функцию uploadUrl.

Функция uploadUrl сначала загружает документ, используя функцию downloadFile, сохраняет его как локальный файл, а затем вызывает uploadFile. Функция uploadFile определяет название CMIS-документа на основе пользовательского параметра, рассматриваемого в следующем разделе "Параметры CMIS Connector". Затем он вызывает функцию createEntry для публикации документа в CMIS-репозитории.

Просматривая JavaScript-код в функции createEntry, можно заметить, что этот процесс следует шагам, определенным в протоколе Atom Publishing Protocol, т.е. создает запись о CMIS-документе, которая является просто сериализацией записи Atom, а затем использует операцию HTTP POST для создания CMIS-документа.

Здесь используется возможность, предоставляемая Dojo в dojo.rawXhrPost и упрощающая выполнение асинхронных XML HTTP-запросов. Dojo также предоставляет в dojox.atom.io.model средства для извлечения ссылки edit-media из возвращенной записи CMIS-документа. Они используются функцией uploadFile для выгрузки контента файла в поток контента CMIS-документа.

Возможно, вы заметили, что в операции HTTP POST используется параметр CMIS HTTP versioningState=checkedout. Этот параметр производит выгрузку вновь созданного документа в CMIS-репозиторий.

Этот параметр был нужен для того, чтобы разрешить выгрузку контента файла в новый CMIS-документ. В противном случае необходимо изымать документ для получения частной рабочей копии, которую можно изменять. Альтернативным способом является кодирование контента с использованием 64-разрядного кодирования и отправка этого контента с исходным запросом HTTP POST, создавшим CMIS-документ.

Создание CMIS-папки

Новую папку можно создать как в корневом наборе репозитория, так и в подпапке репозитория. Чтобы добавить папку в CMIS-репозиторий, можно щелкнуть правой кнопкой мыши на папке и ввести имя новой папки, как показано на рисунке 10.

Рисунок 10. Окно имени папки
Рисунок 10. Окно имени папки

Это окно отображается благодаря функции window.prompt, вызываемой из JavaScript-функции newFolder в cmisconnector.js. Ассоциация функции NewFolder с элементом меню, отображающимся при щелчке правой кнопки мыши, находится в коде cmisconnector.xul:

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

Просматривая JavaScript-код функции newFolder, можно заметить, что этот код аналогичен механизму создания CMIS-документа за исключением того, что в данном случае это запись CMIS-папки, отправляемая при помощи dojo.rawXhrPost.


Параметры CMIS-коннектора

Плагин предоставляет ряд точек адаптации как пользователем, так и разработчиком. Первой точкой адаптации является параметр, позволяющий пользователю указывать, что использовать в качестве имени CMIS-документа. Другие параметры (какие типы CMIS-документа и папки использовать и как обрабатывать CMIS-свойства) могут изменяться разработчиком.

Имя документа

Плагин позволяет пользователю решить, как создавать имя CMIS-документа (свойство под названием cmis:document) при перетаскивании и отпускании файла на папке в плагине. Пользователь может указать эти параметры, выбрав Tools - Add-ons в меню Firefox.

В окне Add-ons можно указать, должно ли имя CMIS-документа (cmis:name) порождаться из URL-адреса перетащенного документа или Web-страницы, либо из текста ссылки перетащенного документа или Web-страницы (см. рисунок 11). Отметим, что в случае перетаскивания локальных файлов эти значения идентичны.

Рисунок 11. Окно Add-ons
Рисунок 11. Окно Add-ons

Независимо от выбранного варианта при установке флажка Prompt document name when drag and drop при каждой операции перетаскивания файла или Web-страницы в CMIS-папку будет выдаваться запрос имени документа.

Также, если выбрать этот параметр, при перетаскивании документа будет отображаться окно Rename, что позволяет указать имя, отличное от текста ссылки или URL, вычисленных плагином (см. рисунок 12).

Рисунок 12. Окно переименования
Рисунок 12. Окно переименования

Окно параметров описано в XUL-файле options.xul. При перетаскивании документа эти параметры считываются и помещаются в объект под названием gPrefs. Затем посредством функции onDrop в cmisconnector.js определяется, какое значение в перетащенном объекте использовать для имени CMIS-документа.

Базовые типы папок и документов

При создании в плагине CMIS-папки или CMIS-документа для управления тем, что отправляется в CMIS-репозиторий, используется шаблон для записи Atom. Эти шаблоны содержатся в файлах NewFolderForPost.xml и NewDocForPost.xml. В этих файлах можно установить тип, используемый для создания CMIS-папки или документа. Это важная возможность, поскольку некоторые CMIS-репозитории не позволяют создавать экземпляры базовых типов cmis:folder или cmis:document.

Например, если вы хотите, чтобы плагин использовал тип customerfolder, укажите это имя в файле NewFolderForPost.xml, как в примере, приведенном в листинге 4.

Листинг 4. Указание типа 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>

Свойства

Щелкните правой кнопкой мыши на папке или документе для отображения окна Properties. Это окно определяется в файле propertiesDialog.xul, а значения вставляются в это окно JavaScript-кодом в файле propertiesDialog.js. Отображаемые свойства и способы управления ими контролируются конфигурацией, определяемой в файле property.cfg.

Можно изменить файл property.cfg и добавить названия любых свойств, не определенных стандартом CMIS. Например, если репозиторий определяет свойство под названием myrepository:tags и вы хотите, чтобы это свойство могло изменяться пользователем, можно добавить следующую строку в файл property.cfg:

myrepositoryxyz:tags = true

Дополнительная информация о плагине CMIS

Как упоминалось в предыдущем разделе, плагин CMIS построен на основе XUL-окон, JavaScript, таблиц стилей CSS и локальных файлов. Поскольку плагин включает в себя весь исходный код, можно более детально исследовать его, чтобы разобраться в его работе.

Простой способ провести такое исследование – развернуть плагин в интегрированной среде разработки приложений, например Eclipse (среду разработки Eclipse можно загрузить с Web-сайта Eclipse Ganymede).

Чтобы еще больше облегчить такое исследование, мы организовали код как Eclipse-проект и упаковали его в ZIP-файл. Для развертывания плагина в Eclipse загрузите файл cmisconnector.zip, ссылка на который приведена в разделе "Загрузка" данной статьи, разархивируйте его и создайте Java-проект на основе исходного кода, находящегося в этом файле.

После импорта исходного кода в Eclipse можно просмотреть его и скомпоновать плагин, выбрав проект, а затем выбрав пункт Project - Build из верхнего меню. Операция компоновки создает файл под названием cmisconnector@ibm.com.xpi.

Для установки созданного таким образом файла плагина дважды щелкните левой кнопкой мыши на файле cmisconnector@ibm.com.xpi, находящемся в корневой папке проекта. При этом загружается Mozilla Firefox и отображается окно Software Installation, запрашивающее разрешение на установку плагина (см. рисунок 13).

Рисунок 13. Установка плагина
Рисунок 13. Установка плагина

Нажмите в окне кнопку Install Now, перезапустите Firefox – и только скомпонованный вами плагин можно использовать!


Советы по отладке

После развертывания CMIS-плагина полезно просмотреть исходный код в пошаговом режиме в отладчике, чтобы лучше понять структуру кода. Коннектор Firefox написан на JavaScript, поэтому необходим отладчик JavaScript.

Существует много вариантов, но мы для данного плагина использовали JavaScript-отладчик Venkman, который можно загрузить со страницы проекта Venkman JavaScript Debugger. После развертывания JavaScript-отладчика Venkman необходимо настроить параметр, позволяющий видеть исходный код в боковой панели. Для этого выберите пункт Debug в основном меню отладчика и выберите Exclude Browser Files для отключения этого параметра.

Теперь вы можете просматривать исходный JavaScript-код плагина CMIS; однако отметим, что в каждый момент виден только уже загруженный JavaScript-код. Например, исходный код в cmisconnector.js невидим до тех пор, пока плагин CMIS не будет загружен (см. рисунок 14), а исходный код в addRespositoryDialog.js не будет видим до тех пор, пока не будет использоваться окно Add Repository.

Рисунок 14. JavaScript-отладчик
Рисунок 14. JavaScript-отладчик

После загрузки JavaScript можно просматривать исходный код и устанавливать точки прерывания. Например, на рисунке 15 показана точка прерывания, установленная в функции GetChildren() файла cmisconnector.js.

Если эта точка прерывания установлена, то при развертывании элементов папки в плагине выполнение кода остановится в данной точке и можно будет просмотреть значения переменных и начать пошаговое выполнение кода, используя клавиши F5, F12 и F11.

Рисунок 15. Точка прерывания в функции GetChildren()
Рисунок 15. Точка прерывания в функции GetChildren()

Заглядывая в будущее

Спецификация CMIS будет продолжать совершенствоваться с учетом откликов общественности, и по мере публикации новых версий предложенного стандарта будет пересматриваться и наш плагин CMIS.

После утверждения спецификации, когда она станет официальным стандартом OASIS, будет опубликована окончательная версия этого плагина. Кроме того, в последующие версии плагина может быть включены необязательные части спецификации CMIS, например, управление доступом и интерпретация.


Заключение

CMIS – это важный стандарт, предлагаемый OASIS, облегчающий совместное использование контента из разных источников. Mozilla предоставляет интегрированную среду для расширения браузера при помощи плагинов, написанных на языке JavaScript и XUL.

Использование определений сервисов из CMIS вместе с интегрированной средой Mozilla позволяет разрабатывать приложения нового типа, расширяющие возможности браузера по работе с контентом, полученным из разных источников.

Хотя мы надеемся, что предоставленный в статье исходный код будет полезен для начала работы, мы предлагаем вам более подробно изучить стандарт CMIS и интегрированную среду плагинов Mozilla и разрабатывать свои собственные приложения, работающие с контентом. В разделе "Ресурсы" приводятся полезные ссылки на дополнительную информацию.


Загрузка

ОписаниеИмяРазмер
Пример кодаcmisconnector@ibm.com_src.zip107 КБ

Ресурсы

Научиться

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Lotus
ArticleID=645813
ArticleTitle=Разработка плагина Mozilla Firefox для Content Management Interoperability Services
publish-date=03082011