Импорт XML в репозиторий JCR - многозначные свойства - PullRequest
0 голосов
/ 10 июня 2011

Я играю с репозиторием JCR - специально для Jackrabbit - для хранения данных для моего текущего проекта.Все идет хорошо, хотя, к сожалению, иногда трудно найти документацию.То, с чем я сейчас борюсь, это настройка данных модульных тестов для некоторых тестов.Я запустил Jackrabbit в памяти и правильно импортирую в него свои файлы Nodetypes.cnd и data.xml, чтобы у меня были начальные данные для проверки.Однако я не могу понять, как импортировать из файла data.xml, где узел имеет несколько свойств с одинаковым именем.

В частности, из-за того, как данные структурированы, у меня есть узел правил, который связывается с другими узлами правил - где одно правило фактически работает в терминах других правил.Я реализовал это, имея свойство на узле Rules, которое является «правилом (PATH) множественным», поэтому просто список путей узлов к узлам правил, которые связаны.Я могу легко добавить одну ссылку в свой 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 Ответ

1 голос
/ 14 июня 2011

Я предполагаю, что «data.xml» - это XML-документ для просмотра документов, который вы хотите импортировать в репозиторий.Jackrabbit не определяет, как импортировать / экспортировать многозначное свойство с несколькими значениями из / в представление документа репозитория.Как видно из спецификации JCR 2.0 , интерпретация многозначного свойства зависит от реализации.Однако Jackrabbit поддерживает импорт многозначных свойств из системного представления хранилища.То же самое для экспорта.

Вы можете загрузить или экспортировать системное представление хранилища с помощью API Session.exportSystemView () или создать его вручную для своего тестового хранилища.

Вот пример.Примечание. «Car: engine (string) множественный».

<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: engine» представлено в виде элемента списка.

<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-код можно импортировать в другой репозиторий, используя API-интерфейс Session.importXML ().

<?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>
...