Опубликован: 10.12.2007 | Уровень: специалист | Доступ: платный
Лекция 16:

Объекты XPCOM

16.3.5. Источники данных

Источники данных обеспечивают поддержку работы с фактами, необходимую для шаблонов XUL и хранилищ данных RDF. Платформа Mozilla содержит значительное количество интерфейсов, а также готовых объектов, которые могут использоваться для связывания источников данных с шаблонами, а также для работы с хранилищами фактов. Очевидный пример – конструкторы по умолчанию, а также представления содержимого, которые используются для заполнения шаблонов. Разработчик приложений может реализовать аналогичную или другую функциональность, используя те же интерфейсы.

Концепция источника данных воплощена в интерфейсе nsIRDFDataSource. Этот интерфейс поддерживает все операции, необходимые для работы с фактами RDF. Существует около 20 компонентов XPCOM, реализующих этот интерфейс. В разделе "Практика" приведены многочисленные примеры работы с этими компонентами. В этом разделе мы дадим краткое описание и классификацию основных интерфейсов, используемых для работы с RDF.

Отдельные факты могут быть сконструированы из простых объектов XPCOM, основанных на интерфейсах nsIRDFResource и nsIRDFLiteral. Как правило, читать из источника данных можно всегда, а записывать в него – при определенных условиях. Источник данных предоставляет простую функциональность, обеспечивающую добавление, удаление и изменение данных, а также запросы к ним. В отличие от других механизмов обработки данных, источники данных работают с логическими объектами (фактами), а не с потоками байтов или символов.

Полезные интерфейсы XPCOM для работы с источниками данных можно разделить на три группы:

Вспомогательные средства и утилиты. Они необходимы для выполнения базовых операций.

Дополнительные расширения. Некоторые интерфейсы расширяют базовую функциональность интерфейса nsIRDFDataSource для различных целей.

Поддержка содержимого. Существуют специализированные источники данных для содержимого определенного типа. Эти источники подразделяются на обычные, в которых данные берутся из файлов RDF, и внутренние, в которых источником фактов являются структуры данных платформы Mozilla.

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

Обратите внимание, что в именах методов интерфейса nsIRDFDataSource слово source (источник) не относится к источникам данных. Source и target (цель) в этих именах означают субъект и объект факта соответственно – см., например, метод GetSource().

16.3.5.1. Объекты-фабрики и вспомогательные объекты

При использовании шаблонов XUL доступ к объектам, имеющим интерфейс nsIRDFDataSource, обеспечивают объекты DOM этих шаблонов. В отсутствие шаблонов для непосредственного доступа к источникам данных из скрипта необходимо с самого начала создать объекты-фабрики.

Компоненты, используемые для непосредственной работы с RDF, приведены в таблице 16.9. Нотация {arg} означает, что может быть несколько вариантов данного параметра. Простейший способ увидеть их все – просмотреть содержимое массива window.Components.classes. Компоненты, приведенные в таблице, можно разделить на следующие четыре группы.

Таблица 16.9. Компоненты XPCOM для работы с RDF
Имя компонента Интерфейсы Назначение
@mozilla.org/rdf/rdf-service;1 nsIRDFService Отправная точка; позволяет создавать источники данных nsIRDFDataSource, субъекты, объекты и предикаты nsIRDFNode
@mozilla.org/rdf/container;1 nsIRDFContainer Создает объекты-контейнеры <Bag>, <Seq> или <Alt>
@mozilla.org/rdf/container-utils; 1 nsIRDFContainerUtils Вспомогательные методы для работы с объектами-контейнерами RDF
@mozilla.org/rdf/resource-factory;1?name={arg} различные Создание объектов, представляющих части факта
@mozilla.org/rdf/content-sink;1 nsIExpatSink Превращает объекты XML, основанные на RDF, в хранилище фактов
@mozilla.org/rdf/xml-parser;1 nsIRDFXMLParser Превращает документ RDF в объекты XML, основанные на RDF
@mozilla.org/rdf/xml-serializer;1 nsIRDFXMLSerializer nsIRDFXMLSource Превращает хранилище фактов в документ RDF
@mozilla.org/rdf/delegate-factory; 1?key={arg}&scheme={arg} nsIRDFDelegateFactory Позволяет связать ресурс (элемент факта) с объектом-делегатом, который выполняет определенные действия при изменении состояния ресурса

Первая группа из одного интерфейса представляет собой отправную точку для работы с RDF из скрипта. Интерфейс nsIRDFService позволяет создавать объекты nsIRDFDataSource на основе URI, включая URL, имеющие схему rdf:. Соответствующие URL перечислены в таблице 16.11. Объект, представляющий подлежащее, дополнение или предикат факта, также может быть создан при помощи этого интерфейса на основе строки JavaScript. Для получения доступа к объекту, поддерживающему интерфейс nsIRDFService, используется метод getService(), а не createInstance().

Вторая группа компонентов, приведенных в таблице, предоставляет интерфейсы-фабрики для создания контейнеров RDF и работы с ними. Второй и третий компоненты в таблице обеспечивают простой способ создания структур данных, содержащих объекты, которые представляют ресурсы RDF. К этой же группе относятся компоненты resource-factory. Элементы фактов, создаваемые при помощи этих компонентов, содержат дополнительную информацию. В зависимости от значения, присвоенного параметру name, такой объект, помимо обычного субъекта, предиката или объекта факта, может содержать дополнительные данные о записях адресной книги, сообщениях электронной почты или конференций, а также о файлах. Эти данные и связанные с ними методы сопровождают ресурс RDF в процессе его обработки в хранилище фактов. При этом из скриптов JavaScript доступны только компоненты, относящиеся к подсистеме электронной почты. При обращении к этим компонентам параметр name может принимать следующие значения:

imap mailbox news moz-abdirectory moz-abldapdirectory 
moz-abmdbdirectory moz-aboutlookdirectory

Третья группа компонентов предназначена для непосредственного синтаксического анализа документов RDF. Обычным приложениям редко приходится работать на столь низком уровне. Обратное действие, создание документа RDF на основе хранилища фактов, или сериализация, используется в том случае, если приложению необходимо сохранять данные в перерыве между сеансами работы. Ни один из этих интерфейсов не используется для работы с отдельными фактами.

Наконец, применение последнего интерфейса в таблице 16.9, nsIRDFDelegateFactory, требует глубокого понимания архитектуры платформы. Оно позволяет привязать какое-либо действие к созданию или уничтожению ресурса, используемого в факте. Такой объект-делегат представляет собой наблюдатель для отдельного ресурса. Работа с этим интерфейсом на страницах нашей книги не рассматривается.

16.3.5.2. Расширенная функциональность источников данных.

Mozilla предоставляет ряд возможностей для расширения функциональности источников данных. Расширение выражается скорее в большей гибкости источников, чем в доступе к каким-либо дополнительным данным. Эти возможности доступны при помощи ряда интерфейсов XPCOM, которые описаны в таблице 16.10.

Таблица 16.10. Интерфейсы, расширяющие функциональность интерфейса nsIRDFDataSource
Имя интерфейса Компоненты, реализующие интерфейс Назначение
nsIRDFDataSource Все источники данных, но см. ограничения в таблице 16.12 Основные операции с хранилищем фактов, доступным с помощью источника данных
nsIRDFCompositeDataSource @mozilla.org/rdf/datasource;1?name=composite-datasource Составной источник данных, представляющий объединение фактов из одного или нескольких источников. Добавляемые факты добавляются в первый из этих источников
nsIRDFInMemoryDataSource @mozilla.org./rdf/datasource;1?name=in-memory-datasource Источник данных, основанный на хранилище фактов, которое не зависит от всех остальных фактов
nsIRDFPurgeableDataSource @mozilla.org/rdf/datasource;1?name=in-memory-datasource Позволяет удалить все факты в источнике данных
nsIRDFPropagatableDataSource @mozilla.org/rdf/datasource;1?name=in-memory-datasource @mozilla.org/browser/bookmarks-service;1 @mozilla.org/rdf/datasource;1?name=bookmarks Активизирует и отключает передачу событий, представляющих изменение фактов, любым наблюдателям
nsIRDFRemoteDataSource @mozilla.org/autocompleteSession;1?type=history @mozilla.org/browser/bookmarks-service;1 @mozilla.org/browser/global-history;1 @mozilla.org/rdf/datasource;1?name=bookmarks @mozilla.org/rdf/datasource;1?name=history @mozilla.org/rdf/datasource;1?name=xml-datasource Обеспечивает возможность синхронизации хранилища фактов, доступного с помощью источника данных, с исходным источником фактов. Идентификатор контракта xml-datasource преназначен для работы с произвольными файлами RDF

Система шаблонов XUL не только позволяет использовать составные источники данных, но и поддерживает список аргументов, переданных атрибуту XUL источников данных. Фактически, составной источник данных представляет собой контейнер, содержащий другие источники данных. Он также реализует интерфейс nsIRDFDataSource. Каждый метод этого интерфейса просматривает отдельные источники данных, содержащиеся в контейнере, и при необходимости поочередно вызывает соответствующие методы каждого из них.

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

Интерфейс nsIRDFRemoteDataSource предоставляет возможность сохранить текущее состояние хранилища фактов в том месте, откуда были взяты исходные данные, или загрузить данные оттуда в хранилище фактов. Как правило, это место представляет собой файл RDF или его эквивалент. Файл может быть локальным или удаленным, но в любом случае доступна лишь крайне ограниченная функциональность. Сохранение реализовано с помощью метода Flush(), а загрузка – с помощью метода Refresh(). Flush(), поддерживается только для URL типа file:,а Refresh() – для URL типов file: и http:.

16.3.5.3. Типы содержимого.

Не все источники данных одинаковы. Они могут отличаться характером содержимого, а также способами доступа к нему. Эти различия – основная причина сложностей при использовании источников данных. С точки зрения разработчика приложений не всегда очевидно, какие именно факты доступны при помощи тех или иных источников данных, и каким образом их можно получить. Все источники данных основаны на компонентах XPCOM, имена которых имеют следующий вид:

@mozilla.org/rdf/datasource;1?name={arg}

Допустимые значения для {arg} приведены в крайнем левом столбце таблицы 16.12.

Характер содержимого, которое доступно приложению при помощи источника данных, очевиден только в случае обычных файлов RDF, просматривая которые, разработчик может непосредственно получить представление о характере исходных файлов. Этого нельзя сделать с внутренними источниками данных, с содержимым которых можно познакомиться лишь следующими способами:

  • используя сам источник данных;
  • изучая исходный код платформы;
  • найдя пример исходного файла в папке профиля пользователя.

Внутренние источники данных, содержащие информацию о закладках, истории просмотра страниц, поиске, а также некоторых типах внутренних данных, используют файлы в папке профиля пользователя. Как правило, эти файлы не являются документами RDF.

Такая "анонимность" содержимого представляет собой серьезную проблему для шаблонов XUL и скриптов, которые пытаются работать с внутренними источниками данных. В обоих случаях необходимо знать структуру данных заранее. К счастью, работа с внутренними источниками данных необходима лишь для узкого круга задач.

В разделе "Отладка" этой лекции приведены примеры кода, позволяющего просматривать содержимое источников данных. В таблице 16.11 приведены субъекты верхнего уровня, а также часто используемые предикаты для большинства внутренних источников данных. Специальное значение rdf:null означает отсутствие источника данных, а не пустой источник.

Помимо специфики содержимого, для многих источников данных Mozilla характерна ограниченная функциональность. Это означает, что, даже если вам известна структура содержимого источника данных, функциональность источника может оказаться недостаточной для того, чтобы получить доступ к этому содержимому. В таких случаях, хотя соответствующий объект XPCOM формально поддерживает интерфейс nsIRDFDataSource, многие методы этого интерфейса не выполняют никаких действий, возвращая исключение или сообщение об ошибке. Работа над этими компонентами – источниками данных - еще не завершена.

Степень поддержки интерфейса nsIRDFDataSource для каждого из существующих источников данных представлена в таблице 16.12. Данные таблицы соответствуют версии Mozilla 1.4 и отражают лишь принципиальное наличие той или иной функции. Перед работой с некоторыми редко используемыми источниками данных могут понадобиться сложные подготовительные действия, которые не рассматриваются в этом курсе.

Источники данных, не имеющие URI с префиксом rdf:, не могут быть подключены к шаблону XUL при помощи атрибутов XML. Однако они могут быть подключены к шаблону при помощи скрипта. Источники данных, которые не зарегистрированы в XPCOM при параметрах сборки по умолчанию, не могут быть использованы ни из XUL, ни из XML. Составной источник данных composite-datasource может быть использован лишь в том случае, если может использоваться хотя бы один из исходных источников. В большинстве случаев рекомендуется непосредственно работать с отдельными источниками данных, не объединяя их в составной источник.

Таблица 16.11. Отправные точки для работы с внутренними источниками данных
URI с префиксом rdf: URN/URI верхнего уровня Предикаты, используемые в качестве контейнера для фактов
rdf:addressdirectory moz-abdirectory:// http://home.netscape.com/NC-rdf#child и http://home.netscape.com/NC-rdf#CardChild
rdf:bookmarks NC:BookmarksRoot NC:PersonalToolbarFolder Использует контейнеры RDF
rdf:charset-menu Различные (например, NC:BrowserCharsetMenuRoot ) Использует контейнеры RDF
rdf:files NC:FilesRoot http://home.netscape.com/NC-rdf#child
rdf:history NC:HistoryRoot NC:HistoryByDate http://home.netscape.com/NC-rdf#child
rdf:httpindex URL индекса
rdf:internetsearch NC:SearchEngineRoot NC:LastSearchRoot NC:SearchResultsSitesRoot NC:FilterSearchUrlRoot NC:FilterSearchSitesRoot SearchCategoryRoot LastSearchMode http://home.netscape.com/NC-rdf#child
rdf:ispdefaults
rdf:local-store Нет; используйте любой URI Контейнеры не используются; каждый URI представляет собой лишь набор свойств
rdf:localsearch Корневым является любой URI с префиксом find: Контейнеры не используются; каждый URI представляет собой лишь набор свойств
rdf:mailnewsfolders Корневой URI отсутствует; используйте URL серверов http://home.netscape.com/NC-rdf#child
rdf:msgaccountmanager msgaccounts:/
rdf:msgfilters Корневой URI отсутствует; используйте URL серверов
rdf:smtp NC:smtpservers http://home.netscape.com/NC-rdf#child
rdf:subscribe Корневой URI отсутствует; используйте URL серверов http://home.netscape.com/NC-rdf#child
rdf:window-mediator NC:WindowMediatorRoot Использует контейнеры RDF
Таблица 16.12. Поддержка интерфейса nsIRDFDataSource в различных источниках данных.
Имя, используемое в идентификаторе контракта Есть ли URL с префиксом rdf:? Зарегистрирован ли в XPCOM при параметрах сборки по умолчанию? Интерфейс XPCOM для определенного типа содержимого Поддержка assert() Поддержка ArcLabelsOut() Поддержка GetAllResources() Поддержка команд
addressdirectory v v v v v v
bookmarks v v v v v v
charset-menu v v v v v v
files v v v
history v v v v v
httpindex v v v v v v v
internetsearch v v v v v
ispdefaults v v
local-store v v v v v
localsearch v v v
mailnewsfolder v v v v v v
msgaccountmanager v v v v
msgfilters v v v
smtp v v v
subscribe v v v v
window-mediator v v v v v v v
chrome v v v v
mailsounds v
registry v
relatedlinks v v v
in-memory-datasource v v v v
composite-datasource v возможно v v
xml-datasource (RDF files) v v только для URL с префиксом file: v v v
Дмитрий Гуменюк
Дмитрий Гуменюк
Россия, Звенигород
Konstantin Grishko
Konstantin Grishko
Россия, Москва, Московский финансово-промышленный университет "Синергия", Москва