Как перебирать узлы jcr в заданном порядке c? - PullRequest
1 голос
/ 13 февраля 2020

Я работал с итератором для перечисления и обхода дочерних узлов, и я получаю это аномальное поведение, когда итератор перечисляет узлы в разном порядке каждый раз. Мне нужно перебирать узлы, поскольку они присутствуют в crx / de. Есть ли способ сделать это, чтобы контролировать порядок листинга!

Map<String, String> map = new HashMap<String, String>();
map.put("path", getResource().getPath());
map.put("1_property", "sling:resourceType");
map.put("1_property.operation", "equals");
map.put("1_property.value", "/path/to/some/node");

QueryBuilder queryBuilder = 
               getResourceResolver().adaptTo(QueryBuilder.class);
Query query = queryBuilder.createQuery(PredicateGroup.create(map),
               getResourceResolver().adaptTo(Session.class));
SearchResult result = query.getResult();

В итераторе ниже, что я получаю Resource next - это узлы ресурсов в некотором случайном порядке.

Iterator<Resource> resources = result.getResources();
while (resources.hasNext()) {
    Resource next = resources.next();
    //The operations
}

Он должен повторяться, поскольку он присутствует в crx, вместо этого он принимает заказ эксклюзивных ящиков_3, эксклюзивных ящиков__1, эксклюзивных ящиков__2.

enter image description here

1 Ответ

2 голосов
/ 13 февраля 2020

Полагаю, вы используете Oak.

Я вспомнил, что читал что-то о порядке расположения узлов в OAK:

С Apache Oak это изменилось. Узлы Oak не упорядочены, если только у его родителя нет типа узла, который поддерживает упорядочение.

Чтобы проиллюстрировать разницу между sling:folder (упорядочение не требуется) и sling:orderedFolder (упорядочение требуется), я провел небольшой тест. Я написал небольшой тест для создания 5000 узлов, затем добавил дополнительные узлы, произвел произвольное чтение и впоследствии удалил их. Для каждой операции создается или удаляется один узел, за которым следует save().

Вот ссылка: https://cqdump.wordpress.com/2015/07/09/1000-nodes-per-folder-and-oak-orderable-nodes/

Итак, вам нужно иметь родительский узел с основным типом sling:OrderedFolder, который в основном является порядком узлов.

Пожалуйста, используйте Sling API для итерации. Вот как вы должны строить вещи в AEM.

Редактировать: пропустите QueryBuilder и попробуйте Resource#listChildren или Resource#getChildren.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...