Как восстановить «версионный узел» в хранилище jackrabbit 2.1? - PullRequest
1 голос
/ 17 июля 2010

Jackrabbit 2.1 имеет версионные узлы.Мы хотим поддержать отмену удаления одного из этих узлов.«Найти его» кажется сложной частью.

1 Ответ

3 голосов
/ 22 сентября 2010

Не уверен, как правильно перебирать дерево версий - возможно, я думаю, перейдя по /jcr:system/jcr:versionStorage, см. JCR 1.0, раздел 8.2.2.1 и JCR 2.0, раздел 15.10 - но вы можете запросить дерево версий с помощью запроса типа

SELECT * FROM nt:frozenNode WHERE prop = 'value'

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

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

NodeIterator iter = res.getNodes();
while (iter.hasNext()) {
    Node frozenNode = iter.nextNode();
    Version v = (Version) frozenNode.getParent();
    // ...
}

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

Вы знаете, что он удаляется, когда jcr:frozenUuid замороженного узла не может быть найден в сеансе:

boolean deleted = false;
try {
    session.getNodeByUUID(
        frozenNode.getProperty(JcrConstants.JCR_FROZENUUID).getString()
    );
} catch (ItemNotFoundException e) {
    deleted = true;
} catch (RepositoryException e) {
    continue;
}

Чтобы восстановить его, возьмите версию и передайте ее менеджеру версий вместе с абсолютным путем для ее восстановления (который может быть получен из свойства, сохраненного на замороженном узле версии):

VersionManager vMgr = session.getWorkspace().getVersionManager();
vMgr.restore(path, v, true);

Если вы как-то знаете это без необходимости его поиска, вы также можете получить версию по ее UUID:

Version v = (Version) session.getNodeByUUID( versionUUID );
...