Проверка содержимого в JCR - PullRequest
1 голос
/ 16 мая 2011

Мы оцениваем несколько технологий для создания хранилища WSDL и XSD, используемых в нашей организации.Один из возможных вариантов - использовать Apache JackRabbit , который реализует JCR 1.0 и 2.0.Это почти соответствует нашим ожиданиям по загрузке содержимого, аутентификации и управления версиями.Однако мы также планируем загрузить в репозиторий несколько фрагментов метаданных (например, selectedBy, lastModifiedBy, lastModifiedTime и т. Д.) С WSDL и XSD.Мы прочитали несколько постов в StackOverflow, спецификациях JCR и вики-страницах на сайте JackRabbit, но не совсем поняли - как валидировать метаданные, которые мы загружаем?Например, если мы загружаем метаданные как контент, отформатированный в XML, мы хотим, чтобы репозиторий проверял XML на соответствие схеме XML.С точки зрения API JCR, есть ли способ включить проверку XML при импорте содержимого XML через Session.importXML ?

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Как говорит Рэндалл, JCR API не предоставляет хуков для проверки контента во время его хранения.

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

Другим вариантом является использование Apache Sling [1], который предоставляет основанный на OSGi прикладной уровень сценариев поверх хранилища JCR. С Sling вы можете перехватывать HTTP-запросы POST, например, для проверки данных перед их сохранением.

[1] http://sling.apache.org

1 голос
/ 16 мая 2011

Вы можете попробовать посмотреть ModeShape .Это также реализация JCR с открытым исходным кодом (лицензированная LGPL), но она имеет понятие « sequencers », которое автоматически извлекает информацию из загруженных файлов и сохраняет эту информацию в виде структурированного контента (например, подграфов узлов исвойства) в хранилище, где его можно искать, запрашивать и получать к нему доступ, как и к любому другому содержимому хранилища.ModeShape уже имеет довольно много последовательностей, но еще не имеет секвенсоров WSDL или XSD (они должны появиться в следующем выпуске, примерно в конце мая 2011 года).

Я руководитель проектадля ModeShape, и я тоже использую его для хранения файлов WSDL и XSD (а также других форматов файлов).Фактически, мы используем репозитории JCR для хранения всех видов структурированных метаданных.

Как вы упомянули, JCR предоставляет способ импорта контента, но импортируемые файлы XML имеют один из двух определенных форматов.по спецификации JCR (системный вид и вид документа).В формате System View XML используются специфичные для JCR элементы и атрибуты, а в представлении документа элементы отображаются в узлы, а атрибуты - в свойства (на самом деле это немного более детально).И поскольку этот процесс импорта приведет к дополнительному содержимому репозитория (узлам и свойствам), репозитории JCR действительно проверяют эту структуру, используя механизм типов узлов JCR.

Вот пример файла XML в формате Document View:

<?xml version="1.0" encoding="UTF-8"?>
<Hybrid xmlns:car="http://www.modeshape.org/examples/cars/1.0" 
        xmlns:jcr="http://www.jcp.org/jcr/1.0" 
        xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 
        xmlns:mix="http://www.jcp.org/jcr/mix/1.0" 
        jcr:primaryType="nt:unstructured" 
        jcr:uuid="7e999653-e558-4131-8889-af1e16872f4d"
        jcr:mixinTypes="mix:referenceable">
    <Toyota_x0020_Prius jcr:primaryType="car:Car" 
          jcr:mixinTypes="mix:referenceable" 
          jcr:uuid="e92eddc1-d33a-4bd4-ae36-fe0a761b8d89" 
          car:year="2008" car:msrp="$21,500" car:mpgHighway="45" 
          car:model="Prius" car:valueRating="5" car:maker="Toyota" 
          car:mpgCity="48" car:userRating="4"/>
    <Toyota_x0020_Highlander jcr:primaryType="car:Car" 
          jcr:mixinTypes="mix:referenceable" 
          jcr:uuid="f6348fbe-a0ba-43c4-9ae5-3faff5c0f6ec" 
          car:year="2008" car:msrp="$34,200" car:mpgHighway="25" 
          car:model="Highlander" car:valueRating="5" car:maker="Toyota" 
          car:mpgCity="27" car:userRating="4"/>
</Hybrid>

Здесь «гибрид» - это узел «nt: неструктурированный», который содержит два узла типа «автомобиль: автомобиль».Тип узла 'car: Car' определяется следующим образом:

[car:Car] > nt:unstructured, mix:created
  - car:maker (string)
  - car:model (string)
  - car:year (string) < '(19|20)\d{2}'  // any 4 digit number starting with '19' or '20'
  - car:msrp (string) < '[$]\d{1,3}[,]?\d{3}([.]\d{2})?'   // of the form "$X,XXX.ZZ", "$XX,XXX.ZZ" or "$XXX,XXX.ZZ" 
                                                           // where '.ZZ' is optional
  - car:userRating (long) < '[1,5]'                        // any value from 1 to 5 (inclusive)
  - car:valueRating (long) < '[1,5]'                       // any value from 1 to 5 (inclusive)
  - car:mpgCity (long) < '(0,]'                            // any value greater than 0
  - car:mpgHighway (long) < '(0,]'                         // any value greater than 0
  - car:lengthInInches (double) < '(0,]'                   // any value greater than 0
  - car:wheelbaseInInches (double) < '(0,]'                // any value greater than 0
  - car:engine (string)
  - car:alternateModels (reference)  < 'car:Car'

Если этот тип узла зарегистрирован в репозитории JCR, он будет гарантировать, что ваша импортированная структура контента действительна в соответствии с определением типа узла.

Если вы говорите о проверке значений содержимого (например, значений метаданных, структуры двоичных файлов и т. Д.), Мне неизвестно о какой-либо реализации репозитория JCR, которая может сделать это «из коробки».Репозитории JCR имеют более общее назначение, поэтому это может быть сделано вашим приложением, используя прослушиватели событий JCR для наблюдения за загрузкой новых файлов (или содержимого) XML в репозиторий, извлечения только что загруженного двоичного содержимого и использованиядругие библиотеки для выполнения проверки.

Наконец, вы говорите о хранении дополнительных свойств в загруженных файлах.Некоторое время назад я написал сообщение в блоге , в котором говорится о том, как определить и использовать типы узлов mixin, сделать это с помощью узлов JCR 'nt: file' и 'nt: folder'.

Hopeэто помогает.

...