Не уверен, как правильно перебирать дерево версий - возможно, я думаю, перейдя по /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 );