#jackrabbit #jcr
#jackrabbit #jcr
Вопрос:
Я играю с репозиторием JCR — конкретно Jackrabbit — для хранения данных для моего текущего проекта. Все идет нормально, хотя, к сожалению, документацию иногда бывает немного сложно найти. С чем я сейчас борюсь, так это с настройкой данных модульного тестирования для некоторых тестов. Я запустил Jackrabbit в памяти и импортирую свои Nodetypes.cnd и data.xml правильно загружайте файлы в него, чтобы у меня были исходные данные для тестирования. Однако я не могу понять, как импортировать из data.xml файл, в котором узел имеет несколько свойств с одинаковым именем.
В частности, из-за того, как структурированы данные, у меня есть узел правил, который ссылается на другие узлы правил, где одно правило фактически работает с точки зрения других правил. Я реализовал это, установив в узле правил свойство «множественное правило (ПУТЬ)», то есть просто список путей узла к узлам правил, которые связаны. Я могу легко добавить одну ссылку в свой xml, написав
<rule1 name="Rule #1" description="This is Rule number 1" rule="/rules/rule2" />
который корректно создает правило с именем «rule1», которое имеет ссылку на «rule2». Что я хочу, чтобы иметь возможность создавать это правило, используя метод session.ImportXML (), где у него более одной ссылки… Я пытался
<rule1 name="Rule #1" description="This is Rule number 1" rule="/rules/rule2,/rules/rule3" />
<rule1 name="Rule #1" description="This is Rule number 1" rule="/rules/rule2" rule="/rules/rule3" />
<rule1 Rule #1" description="This is Rule number 1">
<@rule>/rules/rule2</@rule>
<@rule>/rules/rule3</@rule>
</rule1>
И ни одно из них не сработало. На самом деле — достаточно очевидно — второй и третий даже не анализируются как XML.
Есть ли способ сделать это? Или мне нужно изменить процесс импорта, чтобы он работал здесь по-другому?
Импорт буквально выполнен с
InputStream xml = getClass().getResourceAsStream("/jcr/data.xml");
session.importXML(session.getRootNode().getPath(), xml, ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW);
Так что абсолютно ничего особенного в этом вообще нет.
Ответ №1:
Я предполагаю, что «data.xml » — это XML-файл для просмотра документа, который вы хотите импортировать в репозиторий. Jackrabbit не определяет, как импортировать / экспортировать многозначное свойство с несколькими значениями из / в документное представление репозитория. Из спецификации JCR 2.0 кажется, что интерпретация многозначного свойства зависит от реализации. Однако Jackrabbit поддерживает импорт многозначных свойств из системного представления репозитория. То же самое для экспорта.
Вы можете загрузить или экспортировать системное представление репозитория с помощью Session.exportSystemView () API или вручную создать его для вашего тестового репозитория.
Вот пример. Примечание — «автомобиль: двигателей (строка) несколько».
<car='http://www.modeshape.org/examples/cars/1.0'>
[car:Car] > nt:unstructured, mix:created, mix:referenceable
- car:maker (string)
- car:model (string)
- car:year (string) < '(19|20)[0-9]{2}' // any 4 digit number starting with '19' or '20'
- car:msrp (string) < '[$][0-9]{1,3}[,]?[0-9]{3}([.][0-9]{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:alternateModels (reference) < 'car:Car'
- car:engines (string) multiple
Ниже приведен пример системного представления XML репозитория, содержащего вышеупомянутый CND.
Обратите внимание, что многозначное свойство «car:двигатели» представлено в виде элемента списка.
<sv:property sv:name="car:engines" sv:type="String" sv:multiple="true">
<sv:value>1.8L</sv:value>
<sv:value>1.5L</sv:value>
</sv:property>
Этот системный XML-файл может быть импортирован в другой репозиторий с помощью Session.ImportXML() API, как вы это делаете.
<?xml version="1.0" encoding="UTF-8"?>
<sv:node sv:name="Hybrid" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fn_old="http://www.w3.org/2004/10/xpath-functions" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:car="http://www.modeshape.org/examples/cars/1.0" xmlns:rep="internal" xmlns:nt="http://www.jcp.org/jcr/nt/1.0">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>nt:unstructured</sv:value>
</sv:property>
<sv:property sv:name="jcr:mixinTypes" sv:type="Name" sv:multiple="true">
<sv:value>mix:referenceable</sv:value>
</sv:property>
<sv:property sv:name="jcr:uuid" sv:type="String">
<sv:value>7e999653-e558-4131-8889-af1e16872f4d</sv:value>
</sv:property>
<sv:node sv:name="Toyota Prius">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>car:Car</sv:value>
</sv:property>
<sv:property sv:name="jcr:uuid" sv:type="String">
<sv:value>0111cbd0-8f9b-4588-8ded-d66907174bcd</sv:value>
</sv:property>
<sv:property sv:name="car:engines" sv:type="String" sv:multiple="true">
<sv:value>1.8L</sv:value>
<sv:value>1.5L</sv:value>
</sv:property>
<sv:property sv:name="car:maker" sv:type="String">
<sv:value>Toyota</sv:value>
</sv:property>
<sv:property sv:name="car:model" sv:type="String">
<sv:value>Prius</sv:value>
</sv:property>
<sv:property sv:name="car:mpgCity" sv:type="Long">
<sv:value>48</sv:value>
</sv:property>
<sv:property sv:name="car:mpgHighway" sv:type="Long">
<sv:value>45</sv:value>
</sv:property>
<sv:property sv:name="car:msrp" sv:type="String">
<sv:value>$21,500</sv:value>
</sv:property>
<sv:property sv:name="car:userRating" sv:type="Long">
<sv:value>4</sv:value>
</sv:property>
<sv:property sv:name="car:valueRating" sv:type="Long">
<sv:value>5</sv:value>
</sv:property>
<sv:property sv:name="car:year" sv:type="String">
<sv:value>2008</sv:value>
</sv:property>
<sv:property sv:name="jcr:created" sv:type="Date">
<sv:value>2011-06-13T23:45:59.175-04:00</sv:value>
</sv:property>
<sv:property sv:name="jcr:createdBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:node sv:name="carImage">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>nt:file</sv:value>
</sv:property>
<sv:property sv:name="jcr:created" sv:type="Date">
<sv:value>2011-06-13T23:45:59.181-04:00</sv:value>
</sv:property>
<sv:property sv:name="jcr:createdBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:node sv:name="jcr:content">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>nt:resource</sv:value>
</sv:property>
<sv:property sv:name="jcr:uuid" sv:type="String">
<sv:value>7de51be4-1466-414b-a3ff-d840095e61bf</sv:value>
</sv:property>
<sv:property sv:name="jcr:data" sv:type="Binary">
<sv:value/>
</sv:property>
<sv:property sv:name="jcr:encoding" sv:type="String">
<sv:value>binary</sv:value>
</sv:property>
<sv:property sv:name="jcr:lastModified" sv:type="Date">
<sv:value>2011-05-18T16:14:30.000-04:00</sv:value>
</sv:property>
<sv:property sv:name="jcr:lastModifiedBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:property sv:name="jcr:mimeType" sv:type="String">
<sv:value>image/jpeg</sv:value>
</sv:property>
</sv:node>
</sv:node>
<sv:node sv:name="carImage">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>nt:file</sv:value>
</sv:property>
<sv:property sv:name="jcr:created" sv:type="Date">
<sv:value>2011-06-13T23:45:59.322-04:00</sv:value>
</sv:property>
<sv:property sv:name="jcr:createdBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:node sv:name="jcr:content">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>nt:resource</sv:value>
</sv:property>
<sv:property sv:name="jcr:uuid" sv:type="String">
<sv:value>6ad955e2-6e75-4833-904c-6ee3bf7c18b6</sv:value>
</sv:property>
<sv:property sv:name="jcr:data" sv:type="Binary">
<sv:value/>
</sv:property>
<sv:property sv:name="jcr:encoding" sv:type="String">
<sv:value>binary</sv:value>
</sv:property>
<sv:property sv:name="jcr:lastModified" sv:type="Date">
<sv:value>2011-05-18T16:14:30.000-04:00</sv:value>
</sv:property>
<sv:property sv:name="jcr:lastModifiedBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
<sv:property sv:name="jcr:mimeType" sv:type="String">
<sv:value>image/jpeg</sv:value>
</sv:property>
</sv:node>
</sv:node>
</sv:node>
<sv:node sv:name="Toyota Highlander">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>car:Car</sv:value>
</sv:property>
<sv:property sv:name="jcr:uuid" sv:type="String">
<sv:value>99b2afd4-74e8-4a45-a6d2-623bfc66387a</sv:value>
</sv:property>
<sv:property sv:name="car:maker" sv:type="String">
<sv:value>Toyota</sv:value>
</sv:property>
<sv:property sv:name="car:model" sv:type="String">
<sv:value>Highlander</sv:value>
</sv:property>
<sv:property sv:name="car:mpgCity" sv:type="Long">
<sv:value>27</sv:value>
</sv:property>
<sv:property sv:name="car:mpgHighway" sv:type="Long">
<sv:value>25</sv:value>
</sv:property>
<sv:property sv:name="car:msrp" sv:type="String">
<sv:value>$34,200</sv:value>
</sv:property>
<sv:property sv:name="car:userRating" sv:type="Long">
<sv:value>4</sv:value>
</sv:property>
<sv:property sv:name="car:valueRating" sv:type="Long">
<sv:value>5</sv:value>
</sv:property>
<sv:property sv:name="car:year" sv:type="String">
<sv:value>2008</sv:value>
</sv:property>
<sv:property sv:name="jcr:created" sv:type="Date">
<sv:value>2011-06-13T23:45:59.191-04:00</sv:value>
</sv:property>
<sv:property sv:name="jcr:createdBy" sv:type="String">
<sv:value>admin</sv:value>
</sv:property>
</sv:node>
</sv:node>