Apache Jackrabbit

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:39, 14 июня 2019.
Apache Jackrabbit
250px
Разработчики: Apache Software Foundation
Выпущена: 15 March 2006 года; 15 years ago (2006-03-15)
Постоянный выпуск: 2.18.2 / 28 May 2019 года; 22 months ago (2019-05-28) [Источник 1]
Предыдущий выпуск: 2.19.3 / 9 May 2019 года; 22 months ago (2019-05-09)
Состояние разработки: Active
Написана на: Java
Операционная система: Кросс-платформенное программное обеспечение
Тип ПО: Хранилище данных(Content Repository)
Лицензия: Apache License 2.0
Веб-сайт jackrabbit.apache.org

Apache Jackrabbit (Апач Джекрэббит) — это полнофункциональный репозиторий контента, который реализует весь JCR API. Проект Jackrabbit был начат, когда Day Software, ведущий специалист по спецификации JSR-170, лицензировал свою первоначальную реализацию эталонной реализации JCR. Кодовая база Jackrabbit использовалась для официальной эталонной реализации (RI) и комплекта совместимости технологий (TCK), выпущенного вместе с окончательным JCR API.

Содержание

История

Проект Apache Jackrabbit имеет долгую историю, которая записана в архивах, различных списках рассылки, протоколах заседаний Apache и, конечно же, в базе кода Jackrabbit.[Источник 2]

Jackrabbit в 2002

  • Февраль - JSR 170 впервые упоминается в списке разработки слайдов.
  • Май - обсуждаются первоначальные идеи о создании Slide репозитория контента JSR 170

Jackrabbit в 2003

  • Февраль - первоначальная версия кодовой базы JCR RI была импортирована в Slide CVS
  • 17 февраля - поступило первое предложение о создании эталонной реализации Slide JSR 170.

Jackrabbit в 2004

  • 10 февраля - кодовая база JCR RI была удалена из Slide CVS.
  • 31 мая - JCR RI вернулось обратно в Slide CVS.
  • Август - обсуждается идея сделать JCR RI независимым проектом в Инкубаторе.
  • 28 августа - JCR Proposal был принят инкубатором PMC.
  • 7 сентября - проект был переименован в «Jackrabbit»
  • Сентябрь - был запущен инкубационный проект Apache Jackrabbit
  • Октябрь - был создан веб-сайт http://incubator.apache.org/jackrabbit/

Jackrabbit в 2005

  • Апрель - Jackrabbit успешно работал как проект и привлекал интерес как к другим проектам Apache (в частности, к Lenya и Graffito), так и к новым людям в сообществе Java.

Jackrabbit в 2006

  • 14 февраля - выпущен Apache Jackrabbit 0.9 (инкубационный)

Jackrabbit выполнил свой первый официальный инкубационный выпуск с версией 0.9 эталонной реализации Apache Jackrabbit и инструментами JCR-RMI. Day Software подтвердила, что jar версии 0.9 прошли TCK JCR 1.0 с текущим списком исключений.

  • 15 марта - совет директоров ASF одобрил решение о создании проекта верхнего уровня Apache Jackrabbit (TLP). Это решение завершило процесс инкубации для Jackrabbit и сделало его официальным проектом ASF.
  • 8 апреля - выпущен Apache Jackrabbit 1.0

Apache Jackrabbit 1.0 - полностью совместимая и стабильная реализация JSR-170. Разработанная из того же дерева исходных текстов, что и эталонная реализация JSR-170, версия 1.0 реализует полный API-интерфейс JCR, включая уровень 1, уровень 2, и все дополнительные функции, такие как управление версиями, транзакции и наблюдение.

  • 2 июня - выпущен Apache Jackrabbit 1.0.1
  • 12 октября - выпущен Apache Jackrabbit 1.1

Apache Jackrabbit 1.1 был инкрементным выпуском, который исправлял ряд проблем и вводил некоторые новые функции. Наиболее заметные изменения в этом выпуске были связаны с удалением зависимости Apache Xerces и с улучшенным кэш состояния элементов.

Среда сборки Jackrabbit была обновлена ​​до Maven 2 вместе с реструктуризацией проектов компонентов Jackrabbit.Первоначальная реализация кластеризации была добавлена ​​в ядро ​​Jackrabbit (позже она вышла в качестве бета-версии в версии 1.2). Зависимости Jackrabbit от Apache Lucene и Apache Derby были обновлены до более поздних версий.

Jackrabbit в 2007

  • 23 января - выпущен Apache Jackrabbit 1.2.1

Apache Jackrabbit 1.2.1 был инкрементным выпуском, который содержал ряд новых функций, улучшений и исправлений ошибок. Наиболее заметные изменения в этом выпуске - введение функции кластеризации и различные улучшения запросов.

  • 21 февраля - выпущен Apache Jackrabbit 1.2.2

Apache Jackrabbit 1.2.2 - это патч-релиз, который исправлял несколько проблем, о которых сообщалось после выпуска 1.2.1, и добавлял два улучшения кластеризации.

  • 11 марта - выпущен Apache Jackrabbit 1.2.3

Apache Jackrabbit 1.2.3 - это выпуск патча с исправлениями ошибок для таких проблем, как правильное сообщение о количестве запросов с контролируемым доступом и надлежащая очистка после индексации PDF-документов.

  • 25 апреля - выпущен Apache Jackrabbit 1.3

Apache Jackrabbit 1.3 - дополнительная версия функции. Наиболее заметными изменениями в этом выпуске были поддержка выделения результатов запроса, улучшения производительности благодаря новому диспетчеру сохранения пакетов и новому компоненту загрузчика классов для загрузки классов Java из хранилища содержимого.

  • 31 июля - выпущен Apache Jackrabbit 1.3.1

Apache Jackrabbit 1.3.1 - это выпуск патча с исправлениями ошибок и улучшениями для кластеризации, запросов и других функций.

  • 8 октября - выпущен Apache Jackrabbit 1.3.3

Apache Jackrabbit 1.3.3 - это выпуск патча с исправлениями ошибок для таких функций, как одновременное управление версиями, ведение журнала и тесты JCR API.

Jackrabbit в 2008

  • 15 январь - выпущен Apache Jackrabbit 1.4

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

  • 20 февраля - выпущен jackrabbit-core 1.4.1

В этом выпуске была исправлена ​​регрессия двоичных свойств ( JCR-1346 ), а также другие проблемы, о которых сообщалось в выпуске Apache Jackrabbit 1.4. В отличие от предыдущих выпусков Jackrabbit, этот выпуск содержал только один компонент.

  • Июнь - сделано несколько небольших выпусков компонентов и один более старый выпуск обслуживания:
    • jackrabbit-core 1.4.2 / 26 марта 2008 - в этом выпуске были исправлены исключение одновременной модификации, о котором сообщалось в JCR-1359, и две взаимоблокировки одновременного управления версиями, о которых сообщалось в JCR-1462 и JCR-1480.
    • jackrabbit-jcr-commons 1.4.2 / 2 апреля 2008
    • jakcrabbit-jcr-rmi 1.4.1 / 9 апреля 2008
    • Apache Jackrabbit 1.3.4 / 8 мая 2008
    • jackrabbit-core 1.4.3 / 8 мая 2008 - этот выпуск добавлял функциональность, чтобы помочь восстановлению после несоответствий репозитория.
    • jackrabbit-core 1.4.4 / 9 мая 2008 - была исправлена ​​пользовательская регрессия диспетчера персистентности ( JCR-1556 ), представленная в выпуске патча 1.4.3. Также были включены два исправления хранилища базы данных.
    • jackrabbit-core 1.4.5 / 9 июня 2008
  • Декабрь - выпущен Apache Jackrabbit 1.5

Также был запущен новый компонент изолированной программной среды для реализации предложенной спецификации служб управления взаимодействием контента (CMIS) поверх хранилища контента JCR.

Jackrabbit в 2009

  • 20 января - выпущен Apache Jackrabbit 1.5.2

Apache Jackrabbit 1.5.2 - это релиз безопасности и исправления ошибок, который исправлял проблемы, о которых сообщалось в предыдущих выпусках. Также релиз 1.5.2 содержал исправление проблемы безопасности CVE-2009-0026 (проблемы межсайтового скриптинга в веб-приложении).

Чтобы запустить подпроект JCR Commons, было выпущено отдельное POM родительского Jackrabbit:

  • org.apache.jackrabbit: parent: 2 6 февраля
  • 4 июня - выпущен Apache Jackrabbit 2.0 alpha1

В первом альфа-выпуске Apache Jackrabbit 2.0 была реализована предложенная окончательная версия (PFD) версии API JCR 2.0, которая была указана в запросе спецификации Java 283 (JSR 283). Цель этого альфа-релиза заключалась в том,чтобы дать людям возможность протестировать и проверить новые функции JCR 2.0 до их выпуска.

  • 11 августа - выпущен Apache Jackrabbit 1.6

Jackrabbit использовал сервер Nexus по адресу repository.apache.org для подготовки и развертывания выпусков в центральном репозитории Maven.

  • 15 сентября - выпущен jackrabbit-core 1.4.10

jackrabbit-core 1.4.10 был предназначен для пользователей, которые еще не были готовы перейти на более свежие выпуски Jackrabbit, но которым по-прежнему было необходимо повышение производительности кластеризации по сравнению с выпуском JCR-1988.

  • 23 сентября - выпущен jackrabbit-core 1.4.11

jackrabbit-core 1.4.11 был предназначен для пользователей,которым требовалось исправление форматирования XPath из выпуска JCR-2052.

Jackrabbit в 2010

  • 27 января - выпущен Apache Jackrabbit 2.0.0

Apache Jackrabbit 2.0.0 - полностью совместимая и готовая к реализации реализация JCR 2.0.

  • 22 апреля - выпущен Apache Jackrabbit 2.1
  • 15 декабря - выпущен Apache Jackrabbit 2.2

Архитектура Jackrabbit

Общая архитектура Jackrabbit (в соответствии с рисунком 1) может быть описана на трех уровнях: уровень приложения контента (Content Application), уровень API и уровень реализации репозитория контента (Content Repository Implementation).

Рисунок 1 – Схема архитектуры Jackrabbit


Приложения для контента

Приложения контента (Content Application) через API JSR-170 взаимодействуют с реализацией репозитория контента. Существует множество приложений, доступных для JSR-170 хранилищ, некоторые из них являются общепринятыми (например, сервер WebDAV) другие приложения могут быть очень специфичными и могут использовать репозиторий контента в качестве хранилища информации, используемой приложениями. Java-приложения могут использовать репозиторий содержимого JSR-170 в качестве замены для чего угодно, от файлов свойств, XML-конфигурации, определенных частей функциональности реляционной базы данных до прямой файловой системы или управления BLOB-объектами. Использование репозитория контента позволяет приложению работать с произвольно большим иерархическим пространством в масштабируемом режиме, автоматически получая прибыль от сервисов репозитория, таких как управление версиями, запрос, операции или пространства имен, которые делают репозиторий контента идеальным хранилищем данных для многих приложений.

«Приложение общего содержимого» (приложение, которое не имеет конкретной функциональной направленности, но допускает общий самоанализ и манипулирование хранилищем) использует возможности типов узлов, управления доступом и других средств для отображения пользовательского интерфейса или сетевого протокола. Примерами таких универсальных приложений являются «Обозреватель контента» ("Content Explorer"), «Сервер WebDAV» или «Сервер Subversion» (или общие приложения Portal, CMS или DMS).

«Специализированное приложение с контентом» работает в предположении, что существуют определенные типы узлов, которые хотя бы частично знакомы с моделью данных, представленной определенными типами узлов. В основном эти типы узлов определяются самим приложением и поставляются вместе с ним. Эти приложения используют репозиторий контента в качестве своего постоянного уровня как естественную эволюцию от использования RDBMS или файловой системы. Примеры «Специализированных приложений контента» имеют очень широкий диапазон от «Управления коллекцией DVD» ("DVD Collection Management”) до «Доски объявлений» (“Message Board”), «Рабочего процесса и BPM» (Workflow and BPM”), но также они могут дополнять «Системы планирования ресурсов предприятия» (Enterprise Resource Planning Systems) следующего поколения.

API хранилища контента

Уровень API хранилища содержимого (контента) разделен на два основных раздела.

  • API хранилища контента, определенный JSR-170
  • Ряд особенностей хранилища содержимого, которые были удалены из спецификации JSR-170, так как их трудно реализовать на существующих не-Java хранилищах контента.

Лишь очень немногие (в основном административные) приложения используют API не-JSR-170, предоставляемые Jackrabbit.

Реализация репозитория контента

Реализация репозитория контента (Content Repository Implementation) отражает основные строительные блоки реализации репозитория контента Jackrabbit.

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

В репозитории контента есть три области: область репозитория, область рабочего пространства и область сеанса.

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

Это неполный список, который включает в себя некоторые из наиболее важных компонентов реализации хранилища содержимого.[Источник 3]

Компоненты Jackrabbit

Проект Apache Jackrabbit состоит из ряда связанных компонентов. [Источник 4]

Jackrabbit API

API-компонент проекта Apache Jackrabbit. Он содержит расширения интерфейса, которые поддерживают Apache Jackrabbit в дополнение к стандартному JCR API.

Внешние зависимости

  • JCR

Jackrabbit JCR Commons

Компонент JCR Commons проекта Apache Jackrabbit. Он содержит ряд классов общего назначения для использования с JCR API.

Jackrabbit JCR Tests

Компонент тестов JCR проекта Apache Jackrabbit.Он содержит набор тестовых наборов API JCR, предназначенных для проверки соответствия реализации.

Jackrabbit Core

Это основной компонент проекта Apache Jackrabbit. Он содержит ядро полностью совместимой с JSR 170 реализации хранилища контента Apache Jackrabbit.

Выпуски

  • jackrabbit-core 1.4.4 / 9 мая 2008
  • jackrabbit-core 1.4.3 / 8 мая 2008
  • jackrabbit-core 1.4.2 / 26 марта 2008
  • jackrabbit-core 1.4.1 / 20 февраля 2008

Jackrabbit зависимости

  • Jackrabbit API
  • Jackrabbit JCR Commons
  • Jackrabbit SPI
  • Jackrabbit SPI Commons
  • Jackrabbit Text Extractors

Внешние зависимости

Jackrabbit Text Extractors

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

Поддерживаемые форматы документов

В настоящее время поддерживаются следующие форматы документов:

  • Microsoft Word (org.apache.jackrabbit.extractor.MsWordTextExtractor)
    • application/vnd.ms-word
    • application/msword
  • Microsoft Excel (org.apache.jackrabbit.extractor.MsExcelTextExtractor)
    • application/vnd.ms-excel
  • Microsoft PowerPoint (org.apache.jackrabbit.extractor.MsPowerPointTextExtractor)
    • application/vnd.ms-powerpoint
    • application/mspowerpoint
  • Portable Document Format (PDF) (org.apache.jackrabbit.extractor.PdfTextExtractor)
    • application/pdf
  • OpenOffice (org.apache.jackrabbit.extractor.OpenOfficeTextExtractor)
    • application/vnd.oasis.opendocument.database
    • application/vnd.oasis.opendocument.formula
    • application/vnd.oasis.opendocument.graphics
    • application/vnd.oasis.opendocument.presentation
    • application/vnd.oasis.opendocument.spreadsheet
    • application/vnd.oasis.opendocument.text
  • Rich Text Format (RTF) (org.apache.jackrabbit.extractor.RTFTextExtractor)
    • application/rtf
  • HyperText Markup Language (HTML) (org.apache.jackrabbit.extractor.HTMLTextExtractor)
    • text/html
  • Extensible Markup Language (XML) (org.apache.jackrabbit.extractor.XMLTextExtractor)
    • text/xml

Jackrabbit JCR-RMI

JCR-RMI - это прозрачный уровень удаленного вызова методов (RMI) для репозитория контента для API технологии Java (JCR). Уровень обеспечивает удаленный доступ к репозиториям содержимого JCR и совместим со всеми реализациями JCR.

Настройка удаленного хранилища

Настройка серверной части уровня JCR-RMI проста. После создания экземпляра локального репозитория JCR необходимо "обернуть" его в удаленный адаптер и создать привязку RMI для репозитория.

Repository repository = ...; // The local repository
String name = ...; // The RMI URL for the repository

RemoteAdapterFactory factory = new ServerAdapterFactory();
RemoteRepository remote = factory.getRemoteRepository(repository);
Naming.bind(name, remote); // Make the RMI binding using java.rmi.Naming

Доступ к удаленному хранилищу

Класс,ClientRepositoryFactory предоставляет удобный механизм для поиска удаленного репозитория JCR-RMI.

В следующем примере показано, как напрямую использовать ClientRepositoryFactory:

String name = ...; // The RMI URL of the repository

ClientRepositoryFactory factory = new ClientRepositoryFactory();
Repository repository = factory.getRepository(name);

ClientRepositoryFactory также может использоваться через JNDI. В следующем примере демонстрируется настройка и использование JCR-RMI в веб-приложении Tomcat 5.5:

context.xml:

<Resource name="jcr/Repository" auth="Container"
    type="javax.jcr.Repository"
    factory="org.apache.jackrabbit.rmi.client.ClientRepositoryFactory"
    url="..."/>

web.xml:

<resource-env-ref>
  <description>The external content repository</description>
  <resource-env-ref-name>jcr/Repository</resource-env-ref-name>
  <resource-env-ref-type>javac.jcr.Repository</resource-env-ref-type>
</resource-env-ref>

…SomeServlet.java:

Context initial = new InitialContext();
Context context = (Context) initial.lookup("java:comp/env");
Repository repository = (Repository) context.lookup("jcr/Repository");

В приведенном выше примере только файл конфигурации context.xml содержит прямые ссылки на уровень JCR-RMI. Все остальные части веб-приложения могут быть реализованы с использованием стандартных интерфейсов JCR.

Jackrabbit WebDAV Library

Этот компонент предоставляет интерфейсы и общие служебные классы, используемые для построения сервера или клиента WebDAV.

Были интегрированы следующие RFC:

  • RFC 4918 (WebDAV - HTTP-расширения для распределенной авторизации, устаревшие RFC 2518)
  • RFC 3253 (DeltaV - версиями расширений для WebDAV)
  • RFC 3648 (протокол упорядоченных коллекций)
  • RFC 3744 (протокол контроля доступа)
  • RFC 5323 (ПОИСК WebDAV; ранее DASL - Поиск и поиск DAV)
  • RFC 5842 (Привязка расширений к распределенному веб-авторингу и управлению версиями (WebDAV))

Jackrabbit JCR Server

Этот компонент содержит две реализации JCR-сервера на основе WebDAV:

  • Simple Webdav Server (Простой Сервер Webdav)
  • JCR Webdav Server

Простой Webdav Server

WebDAV (уровни соответствия 1, 2 и 3) и реализация DeltaV-совместимого сервера WebDAV для доступа к хранилищу JSR170.

Дополнительную информацию, такую как конфигурация, а также сам SimpleWebdavServlet.java, можно найти в проекте Jackrabbit Web Application.

Пакеты:

  • org.apache.jackrabbit.server - включает в себя общие функциональные возможности сервера
  • org.apache.jackrabbit.server.io - осуществляет импорт и экспорт объектов
  • org.apache.jackrabbit.webdav.simple - осуществляет реализацию WebDAV на стороне сервера (DavResource, ResourceConfig,…)

JCR Webdav Server

Это сервер, который используется для удаленных вызовов JSR170 через WebDAV.

Пакеты:

  • org.apache.jackrabbit.server - включает в себя общие функциональные возможности сервера
  • org.apache.jackrabbit.server.jcr - JCR-Server
  • org.apache.jackrabbit.webdav.jcr - осуществляет реализацию WebDAV на стороне сервера (DavResources, Reports, Properties)

Jackrabbit JCR Servlet

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

Jackrabbit JCA Resource Adapter

Этот компонент упаковывает хранилище содержимого Jackrabbit в качестве адаптера ресурсов JCA 1.0. При этом упакованный адаптер может быть развернут на широком спектре серверов приложений.

Хранилище содержимого Jackrabbit, встроенное в пакет JCA, запускается при первом доступе и выключается, когда адаптер не развернут или развернут повторно.

Jackrabbit SPI

SPI обеспечивает разделение между временными и постоянными компонентами репозитория JCR.

Временный компонент («клиент хранилища») реализован поверх постоянного компонента («сервер хранилища») как потребитель SPI и, в свою очередь, предоставляет API JCR приложению. SPI не предназначен для непосредственного использования приложением.

Основные цели

Основными целями подхода SPI являются определение поддержки клиент-серверной архитектуры и упрощение реализации JCR API.

Архитектура клиент-сервер

SPI обеспечивает естественное разделение между клиентским и серверным компонентами удаленного хранилища JCR. SPI разработан с учетом этого использования, что позволяет реализации минимизировать сетевой трафик. SPI позволяет сопоставлять протоколы с такими протоколами, как WebDAV, SOAP или другие, простым, но значимым способом.

Поддержка внедрения

Введение SPI может упростить реализацию JCR поверх существующего репозитория, сократив задачу до одной из реализаций SPI. Такая реализация могла бы тогда полагаться на общий переходный уровень (такой как, например, Jackrabbit JCR to SPI, чтобы обеспечить JCR API)

Обзор архитектуры и дизайна

Функции, предоставляемые SPI:

  • Чтение и запись в постоянное хранилище;
  • Аутентификация;
  • Контроль доступа;
  • Блокировка;
  • Запрос;
  • Управление версиями;
  • Прямой импорт в рабочую область XML;
  • Хранение центрального реестра пространства имен;
  • Управление типами узлов, соблюдение ограничений, а также хранение определений;

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

Основными интерфейсами SPI являются RepositoryService и Batch.

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

Batch представляет собой интерфейс для упорядоченного списка примитивных операций из постоянного слоя. Batch предоставлен RepositoryService для того, чтобы сделать указанную последовательность изменений.

Кроме того, SPI определяет интерфейсы для внутренних представлений имени JCR, идентификатора JCR и идентификаторов элементов. Сам SPI использует только имена и пути в их полной квалификации.

Существующие реализации

В настоящее время проект Jackrabbit предоставляет единую реализацию SPI:

  • Jackrabbit SPI для JCR: реализация интерфейсов SPI, охватывающая реализацию API JCR, например, таких как ядро ​​Jackrabbit.

Другие реализации SPI можно найти в папке sandbox проекта Jackrabbit.

  • SPI для WebDAV:
    • Реализация SPI поверх WebDAV, соединяющегося с JCR-сервером Jackrabbit.
  • SPI-RMI:
    • Уровень RMI используется для удаленной реализации SPI.
  • SPI Logger:
    • Реализация утилиты для регистрации использования SPI.

На рисунке 2 представлены существующие и запланированные реализации SPI.

Рисунок 2 – Существующие и запланированные реализации SPI

Jackrabbit SPI Commons

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

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

Jackrabbit JCR to SPI

Этот компонент предоставляет JCR API приложению и является потребителем реализации интерфейсов SPI.

Jackrabbit JCR to SPI предназначен для использования в качестве общей реализации переходного компонента, который размещен поверх постоянного состояния репозитория JCR. Последний представлен реализацией SPI.

Это означает, что JCR для SPI обрабатывает:

  • временное хранение ожидающих изменений
  • преобразование пространств имен в префиксы
  • Отображения пространства имен локального сеанса
  • Сеансовый импорт XML
  • XML экспорт

Jackrabbit SPI to JCR

Этот компонент содержит реализацию интерфейсов SPI, охватывающих реализацию JCR API.

Jackrabbit OCM

Этот подпроект Jackrabbit является службой сохранения объектов и запросов JCR. Этот инструмент позволяет сохранять объекты Java в репозитории, совместимом с JCR, включая ассоциации, наследование, полиморфизм, композицию и инфраструктуру коллекций Java.

Кроме того, этот компонент отображения содержимого объекта позволяет выражать запросы с помощью критериев на основе Java, а также на языке запросов JCR. Он также предлагает такие функции, как поддержка версий и блокировка объектов.

Jackrabbit OCM Node Management

Этот компонент упрощает регистрацию типов узлов и пространств имен, на которые есть ссылки в дескрипторах отображения OCM.

Конфигурация Jackrabbit

Для установки экземпляра репозитория контента во время выполнения Apache Jackrabbit необходимы две части информации [Источник 5]:

  • Домашний каталог репозитория

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

  • Файл конфигурации репозитория

Файловая система с конфигурацией XML. Этот файл определяет имена классов и свойств различных компонентов Jackrabbit, которые используются для управления и для доступа к хранилищу контента. Jackrabbit анализирует этот файл конфигурации и создает экземпляры указанных компонентов при создании экземпляра репозитория содержимого во время выполнения.

Эти два параметра конфигурации передаются либо непосредственно в Jackrabbit при создании экземпляра репозитория, либо косвенно через параметры настройки фабрики объектов JNDI или какой-либо другой системы управления компонентами.

Конфигурация репозитория

Файл конфигурации репозитория, обычно называемый repository.xml, определяет глобальные параметры, такие как параметры безопасности, управления версиями и кластеризации. Шаблон конфигурации рабочего пространства по умолчанию также включен в файл конфигурации репозитория.

Структура верхнего уровня файла конфигурации хранилища показана ниже.

<!DOCTYPE Repository
      PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.5//EN"
      "http://jackrabbit.apache.org/dtd/repository-1.5.dtd">
<Repository>
  <FileSystem .../>
  <Security .../>
  <Workspaces .../>
  <Workspace .../>
  <Versioning .../>
  <SearchIndex .../>  <!-- optional -->
  <Cluster .../>      <!-- optional, available since 1.2 -->
  <DataStore .../>    <!-- optional, available since 1.4 -->
</Repository>


Элементы конфигурации репозитория:

  • FileSystem: виртуальная файловая система, используемая хранилищем для хранения таких вещей, как зарегистрированные пространства имен и типы узлов.
  • Безопасность: настройка аутентификации и авторизации.
  • Рабочие пространства (Workspaces): настройка того, где и как управляются рабочие пространства.
  • Рабочая область (Workspace): шаблон конфигурации рабочей области по умолчанию.
  • Управление версиями (Versioning): настройка хранилища версий для всего хранилища.
  • SearchIndex: Конфигурация поискового индекса, который охватывает дерево содержимого /jcr:system.
  • Кластер (Cluster): конфигурация кластеризации.
  • DataStore: конфигурация хранилища данных.

Элементы конфигурации бина

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

<ConfigurationElement class="fully.qualified.ClassName">
  <param name="property1" value="...">
  <param name="property2" value="...">
<ConfigurationElement>

Переменные конфигурации

Jackrabbit поддерживает конфигурационные переменные вида $ {name}. Эти переменные могут использоваться, чтобы избежать жесткого кодирования определенных параметров в файлах конфигурации.

Следующие переменные доступны во всех версиях Jackrabbit:

  • $ {rep.home}: домашний каталог репозитория.
  • $ {wsp.name}: имя рабочей области. Доступно только в конфигурации рабочего пространства.
  • $ {wsp.home}: домашний каталог рабочей области. Доступно только в конфигурации рабочего пространства.

Начиная с версии Jackrabbit 1.4 стало возможным использовать системные свойства или любые специфичные для приложения настройки в качестве переменных конфигурации.

Конфигурация безопасности

Элемент конфигурации безопасности используется для указания параметров аутентификации и авторизации для хранилища.

Структура элемента конфигурации безопасности:

<Security appName="Jackrabbit">
  <SecurityManager .../>     <!-- optional, available since 1.5 -->
  <AccessManager .../>   <!-- mandatory until 1.4, optional since 1.5 -->
  <LoginModule .../>     <!-- optional -->
</Security>

По умолчанию Jackrabbit использует службу аутентификации и авторизации Java (JAAS) для аутентификации пользователей, которые пытаются получить доступ к хранилищу. Параметр appName в элементе <Security /> используется в качестве имени приложения JAAS хранилища.

Если аутентификация JAAS недоступна или (как это часто бывает) слишком сложна для настройки, Jackrabbit позволяет указать JAAS LoginModule для репозитория, который затем используется для аутентификации пользователей репозитория. Класс SimpleLoginModule, по умолчанию включенный в Jackrabbit, реализует простой механизм аутентификации, который принимает любое имя пользователя и любой пароль в качестве действительных учетных данных аутентификации.

Как только пользователь прошел аутентификацию, Jackrabbit будет использовать настроенный AccessManager для управления тем, какие части содержимого репозитория пользователь может просматривать и изменять.

Конфигурация рабочего пространства

Репозиторий Jackrabbit содержит одно или несколько рабочих пространств, каждое из которых настроено в отдельном файле конфигурации workspace.xml. Элемент Workspaces конфигурации репозитория указывает, где и как управляются рабочие пространства. Конфигурация хранилища также содержит шаблон конфигурации рабочего пространства по умолчанию, который используется для создания workspace.xml файла новой рабочей области, если более конкретная конфигурация не была задана при создании рабочего пространства.

Параметры рабочего пространства в файле конфигурации репозитория:

<Workspaces rootPath="${rep.home}/workspaces"
    defaultWorkspace="default"
    configRootPath="..."  <!-- optional -->
    maxIdleTime="..."/>   <!-- optional -->
<Workspace .../>   <!-- default workspace configuration template -->

В элементе Workspaces указаны следующие глобальные параметры конфигурации рабочего пространства:

  • rootPath:

собственный каталог файловой системы для рабочих пространств. Подкаталог автоматически создается для каждого рабочего пространства, и путь к этому подкаталогу можно использовать в конфигурации рабочего пространства в качестве переменной $ {wsp.path}.

  • defaultWorkspace:

имя рабочей области по умолчанию. Это рабочее пространство создается автоматически при первом запуске хранилища.

  • configRootPath:

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

  • maxIdleTime:

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

Шаблон конфигурации рабочей области и все файлы конфигурации workspace.xml имеют следующую структуру:

<Workspace name="${wsp.name}">
    <FileSystem .../>
    <PersistenceManager .../>
    <SearchIndex .../>        <!-- optional -->
    <ISMLocking .../>         <!-- optional, available since 1.4 -->
</Workspace>

Элементы конфигурации рабочей области:

  • FileSystem: виртуальная файловая система, переданная диспетчеру постоянства и индексу поиска.
  • PersistenceManager: настройка постоянства для содержимого рабочей области.
  • SearchIndex: настройка индекса поиска рабочей области.
  • ISMLocking: конфигурация блокировки для одновременного доступа к содержимому рабочей области.

Конфигурация версий

Истории версий всех измененных узлов хранятся в хранилище версий всего репозитория, настроенном в элементе управления версиями конфигурации репозитория. Конфигурация управления версиями очень похожа на конфигурацию рабочей области, поскольку они оба используются Jackrabbit для хранения содержимого. Основное различие между управлением версиями и конфигурацией рабочей области заключается в том, что для хранилища версий не указан индекс поиска, так как истории версий индексируются и ищутся с использованием индекса поиска по всему хранилищу. Другое отличие состоит в том, что для конфигурации управления версиями нет переменных $ {wsp.name} или $ {wsp.path}. Вместо этого в конфигурации явно указывается собственный путь к файловой системе хранилища версий.

Структура конфигурации управления версиями:

<Versioning rootPath="${rep.home}/version">
  <FileSystem .../>
  <PersistenceManager .../>
  <ISMLocking .../>       <!-- optional, available since 1.4 -->
</Versioning>

Элементы конфигурации управления версиями:

  • FileSystem: виртуальная файловая система, переданная диспетчеру постоянства.
  • PersistenceManager: конфигурация персистентности для хранилища версий.
  • ISMLocking: конфигурация блокировки для одновременного доступа к содержимому рабочей области.

Начало работы с Apache Jackrabbit

Для начала работы с Jackrabbit нужно ознакомиться с JCR API, а затем загрузить спецификацию JSR 170 [Источник 6].

Первые шаги

Шаг 0: Начало работы

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

В качестве альтернативы, при использовании системы сборки Apache Maven, можно настроить свой первый проект со следующими зависимостями:

<dependencies> 
    <!-- The JCR API --> 
    <dependency> 
        <groupId>javax.jcr</groupId> 
        <artifactId>jcr</artifactId> 
        <version>2.0</version> 
    </dependency> 

    <!-- Jackrabbit content repository --> 
    <dependency> 
        <groupId>org.apache.jackrabbit</groupId> 
        <artifactId>jackrabbit-core</artifactId> 
        <version>2.12.1</version>
    </dependency> 

    <!-- Use Log4J for logging --> 
    <dependency> 
        <groupId>org.slf4j</groupId> 
        <artifactId>slf4j-log4j12</artifactId> 
        <version>1.5.11</version> 
    </dependency> 
</dependencies>

Шаг 1: Вход в Jackrabbit

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

import javax.jcr.GuestCredentials;
import javax.jcr.Repository;
import javax.jcr.Session; 
import org.apache.jackrabbit.commons.JcrUtils;

/** 
* First hop example. Logs in to a content repository and prints a 
* status message. 
*/ 
public class FirstHop { 

    /** 
    * The main entry point of the example application. 
    * 
    * @param args command line arguments (ignored) 
    * @throws Exception if an error occurs 
    */ 
    public static void main(String[] args) throws Exception { 
        Repository repository = JcrUtils.getRepository();
        Session session = repository.login(new GuestCredentials());
        try { 
            String user = session.getUserID(); 
            String name = repository.getDescriptor(Repository.REP_NAME_DESC); 
            System.out.println( 
            "Logged in as " + user + " to a " + name + " repository."); 
        } finally { 
            session.logout(); 
        } 
    } 
}

Также можно скачать исходный файл как FirstHop.java. Если у пользователя настроен classpath, то можно скомпилировать приложение с помощью javac FirstHop.java и запустить его с помощью java FirstHop, чтобы получить следующий вывод.

Logged in as anonymous to a Jackrabbit repository.

Помимо создания вышеуказанной строки состояния, приложение копирует файл конфигурации репозитория по умолчанию в repository.xml и создает исходный репозиторий содержимого Jackrabbit в подкаталоге jackrabbit.

Продолжаем читать для подробной разбивки приложения FirstHop:

import javax.jcr.Repository; 
import javax.jcr.Session;

Интерфейсы JCR API находятся в пакете javax.jcr, который находится в библиотеке jcr-2.0.jar. Обещание API JCR состоит в том, что если вы используете эти интерфейсы только в своем контент-приложении, то оно должно оставаться в основном независимым от базовой реализации хранилища содержимого.

import org.apache.jackrabbit.commons.JcrUtils;

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

public class FirstHop 
public static void main(String[] args) throws Exception

Пример FirstHop - это простое автономное приложение, которое хорошо вписывается в метод main () и позволяет JVM позаботиться о возможных исключениях. Более содержательные приложения с контентом также могут быть написаны как веб-приложение или EJB-компоненты с различными шаблонами установки и обработки ошибок.

Repository repository = JcrUtils.getRepository();

Метод JcrUtils.getRepository () возвращает объект, который реализует интерфейс JCR Repository. Фактическая реализация зависит от файлов JAR, доступных на пути к классам, и в этом примере это TransientRepository. Реализация содержит служебную функцию, которая позаботится о начальной конфигурации и построении хранилища при запуске первого сеанса. Таким образом, пока нет необходимости в ручной настройке, если вы не хотите прямого контроля над настройкой хранилища.

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

Session session = repository.login(new GuestCredentials());

Метод Repository.login (Credentials) запускает сеанс хранилища, используя рабочее пространство по умолчанию и некоторые учетные данные пользователя. В примере FirstHop используется GuestCredentials, и Jackrabbit отображает его на доступного только для чтения анонимного пользователя.

Поскольку мы используем класс TransientRepository в качестве реализации Repository, то этот шаг также приведет к инициализации хранилища.

try { ... } finally { session.logout(); }

Метод Session.logout () в ветви finally закрывает сеанс, и поскольку это единственный сеанс, который мы запустили, TransientRepository закрывается автоматически.

String user = session.getUserID();

Имя пользователя или идентификатор пользователя, связанного с сеансом, доступно с помощью метода Session.getUserID (). Jackrabbit возвращает "anonymous" по умолчанию.

String name = repository.getDescriptor(Repository.REP_NAME_DESC);

Каждая реализация хранилища содержимого публикует ряд строковых дескрипторов, которые описывают различные свойства реализации, такие как уровень реализации и поддерживаемые дополнительные функции JCR. Дескриптор REP_NAME_DESC содержит имя реализации репозитория, в данном случае «Jackrabbit».

Шаг 2: Работа с содержимым

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

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

import javax.jcr.Repository; 
import javax.jcr.Session; 
import javax.jcr.SimpleCredentials; 
import javax.jcr.Node; 
import org.apache.jackrabbit.commons.JcrUtils;

/** 
* Second hop example. Stores, retrieves, and removes example content. 
*/ 
public class SecondHop { 

    /** 
    * The main entry point of the example application. 
    * 
    * @param args command line arguments (ignored) 
    * @throws Exception if an error occurs 
    */ 
    public static void main(String[] args) throws Exception { 
    Repository repository = JcrUtils.getRepository();
        Session session = repository.login( 
        new SimpleCredentials("admin", "admin".toCharArray()));
        try { 
            Node root = session.getRootNode(); 

            // Store content 
            Node hello = root.addNode("hello"); 
            Node world = hello.addNode("world"); 
            world.setProperty("message", "Hello, World!"); 
            session.save(); 

            // Retrieve content 
            Node node = root.getNode("hello/world"); 
            System.out.println(node.getPath()); 
            System.out.println(node.getProperty("message").getString()); 

            // Remove content 
            root.getNode("hello").remove(); 
            session.save(); 
        } finally { 
            session.logout(); 
        } 
    } 

}

Базовая структура этого приложения такая же, как в примере с First Hop, поэтому мы просто рассмотрим различия:

import javax.jcr.SimpleCredentials; 
import javax.jcr.Node;

Это два новых класса, которые нам нужны для этого примера. Класс SimpleCredentials является простой реализацией интерфейса Credentials, используемого для передачи явных учетных данных пользователя в метод Repository.login (Credentials).

Интерфейс Node используется для управления узлами содержимого в хранилище. Для управления свойствами содержимого существует связанный интерфейс Property, но в этом примере мы используем интерфейс Property только косвенно.

new SimpleCredentials("admin", "admin".toCharArray())

Как обсуждалось в примере с First Hop, вход в систему с помощью GuestCredentials возвращает анонимный сеанс только для чтения в конфигурации по умолчанию для Jackrabbit. Чтобы иметь возможность хранить и удалять содержимое, нам нужно создать сеанс с доступом для записи, а для этого нам нужно передать учетные данные с именем пользователя и паролем в

Repository.login(Credentials credentials) method.

Механизм входа по умолчанию в Jackrabbit принимает только имя пользователя и пароль в качестве действительных учетных данных для известных пользователей. Хранилище Jackrabbit с конфигурацией по умолчанию создаст пользователя-администратора при первой инициализации. Таким образом, нам нужно создать и использовать экземпляр SimpleCredentials с именем пользователя и исходным паролем по умолчанию для пользователя admin, в данном случае «admin» и «admin».

Конструктор SimpleCredentials следует соглашению JAAS, представляющему имя пользователя в виде обычной строки, а пароль в виде массива символов, поэтому нам нужно использовать метод String.toCharArray ().

Node root = session.getRootNode();

Каждый сеанс JCR связан с рабочим пространством, которое содержит одно дерево узлов. Простой способ получить доступ к корневому узлу - вызвать метод Session.getRootNode (). Наличие ссылки на корневой узел позволяет нам легко сохранять и извлекать содержимое в текущем рабочем пространстве.

Node hello = root.addNode("hello"); 
Node world = hello.addNode("world");

Новые узлы содержимого могут быть добавлены с помощью метода Node.addNode (String relPath). Метод берет имя (или относительный путь) добавляемого узла и создает именованный узел во временном хранилище, связанном с текущим сеансом. Пока временное хранилище не будет сохранено, добавленный узел будет виден только в текущем сеансе.

Этот фрагмент кода создает два новых узла, называемых «hello» и «world», где «hello» является дочерним элементом корневого узла, а «world» - дочерним элементом «hello».

world.setProperty("message", "Hello, World!");

Чтобы добавить некоторое содержимое в структуру, созданную с использованием узлов «hello» и «world», мы используем метод Node.setProperty (String name, String value), чтобы добавить строковое свойство с именем «message» в узел «world». Значением свойства является строка «Hello, World!».

Также как и добавленные узлы, свойство сначала создается во временном хранилище, связанном с текущим сеансом. Если указанное свойство уже существует, то этот метод изменит значение этого свойства.

session.save();

Метод Session.save () сохраняет все ожидающие изменения во временном хранилище. Изменения записываются в постоянное хранилище репозитория и становятся видимыми для всех сеансов, обращающихся к одной и той же рабочей области. Без этого вызова все изменения при закрытии сеанса будут потеряны навсегда.

Node node = root.getNode("hello/world");

Метод Node.getNode (String relPath) возвращает ссылку на узел по заданному пути относительно этого узла. Синтаксис пути соответствует общепринятым правилам файловой системы.

System.out.println(node.getPath());

Путь к узлу или свойству можно получить с помощью метода Item.getPath (). Интерфейс Item является суперинтерфейсом Node и Property и содержит все функциональные возможности, общие для узлов и свойств.

Шаг 3: Импорт содержимого

Чтобы добавить содержимое немного эффективнее, можно использовать средства импорта JCR, такие как Session.importXML. Пример приложения, показанный ниже, импортирует XML-файл под названием test.xml из текущего каталога в новый узел хранилища содержимого с именем importxml. После импорта содержимого XML приложение рекурсивно сбрасывает содержимое всей рабочей области с помощью простого метода dump ().

                //output the repository content
                dump(root); 
            } finally { 
                session.logout(); 
            } 
        } 

    /** Recursively outputs the contents of the given node. */ 
    private static void dump(Node node) throws RepositoryException { 
        // First output the node path 
        System.out.println(node.getPath()); 
        // Skip the virtual (and large!) jcr:system subtree 
        if (node.getName().equals("jcr:system")) { 
            return; 
        } 

        // Then output the properties 
        PropertyIterator properties = node.getProperties(); 
        while (properties.hasNext()) { 
            Property property = properties.nextProperty(); 
            if (property.getDefinition().isMultiple()) { 
                // A multi-valued property, print all values 
                Value[] values = property.getValues(); 
                for (int i = 0; i < values.length; i++) { 
                    System.out.println( 
                    property.getPath() + " = " + values[i] .getString()); 
                } 
            } else { 
                // A single-valued property 
                System.out.println( 
                property.getPath() + " = " + property.getString()); 
            } 
        } 

        // Finally output all the child nodes recursively 
        NodeIterator nodes = node.getNodes(); 
        while (nodes.hasNext()) { 
            dump(nodes.nextNode()); 
        } 
    } 
}

Еще один интересный метод:

void dump(Node node)

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

property.getDefinition().isMultiple()

Если это значение true, то мы имеем дело с массивом значений:

Value[] values = property.getValues();

Также можно использовать предоставленные ярлыки API, чтобы получить желаемое значение:

property.getString()

Очень хорошей точкой входа для примеров кода, связанных с утилитами, является JcrUtils.

Источники

  1. Apache Jackrabbit News // Официальный сайт Apache Jackrabbit [2019-2019]. URL: http://jackrabbit.apache.org/jcr/index.html (дата обращения: 01.06.2019)
  2. История Apache Jackrabbit // Официальный сайт Apache Jackrabbit [2019-2019]. URL: http://jackrabbit.apache.org/jcr/jackrabbit-history.html (дата обращения: 05.06.2019)
  3. Архитектура Apache Jackrabbit // Официальный сайт Apache Jackrabbit [2019-2019]. URL: http://jackrabbit.apache.org/jcr/jackrabbit-architecture.html (дата обращения: 17.04.2019)
  4. Компоненты Apache Jackrabbit // Официальный сайт Apache Jackrabbit [2019-2019]. URL: http://jackrabbit.apache.org/jcr/jackrabbit-components.html (дата обращения: 17.04.2019)
  5. Конфигурация Apache Jackrabbit // Официальный сайт Apache Jackrabbit [2019-2019]. URL: http://jackrabbit.apache.org/jcr/jackrabbit-configuration.html (дата обращения: 06.06.2019)
  6. First Hops // Официальный сайт Apache Jackrabbit [2019-2019]. URL: http://jackrabbit.apache.org/jcr/first-hops.html (дата обращения: 02.06.2019)