Структура рассматриваемого компонента выглядит следующим образом:
Код: Выделить всё
myComponent (sling:resourceType=myapp/mycomponent, other properties)
Код: Выделить всё
col1 (sling:resourceType=myapp/container, cq:styleIds=[1, 2, 3], other properties)
Код: Выделить всё
title
Код: Выделить всё
text
Код: Выделить всё
container
Код: Выделить всё
button
Код: Выделить всё
button2
[*]
Код: Выделить всё
col2 (sling:resourceType=myapp/container, cq:styleIds=[4, 5, 6, 7], other properties)
Код: Выделить всё
image
Я хочу программно поменять местами содержимое и свойства col1 и col2, чтобы была достигнута следующая структура:
Код: Выделить всё
myComponent (sling:resourceType=myapp/mycomponent, other properties)
Код: Выделить всё
col1 (sling:resourceType=myapp/container, cq:styleIds=[4, 5, 6, 7], other properties)
Код: Выделить всё
image
Код: Выделить всё
col2 (sling:resourceType=myapp/container, cq:styleIds=[1, 2, 3], other properties)
Код: Выделить всё
title
Код: Выделить всё
text
Код: Выделить всё
container
Код: Выделить всё
button
Код: Выделить всё
button2
На самом деле это сводится к переименованию и изменению порядка ресурсов. Я хочу использовать этот код в сценарии Groovy, чтобы автоматически вносить изменения в несколько ветвей контента.
Похоже, что в Sling API нет метода переименования (хотя о его существовании предположили второй пилот и ChatGPT). Я хочу добиться того же эффекта, перемещая эти ресурсы.
В документации Apache Sling есть раздел о перемещении ресурсов с использованием либо сервлета Sling POST, либо API Sling Java.
Код: Выделить всё
Resource myResource2 = resourceResolver.getResource("/myresource2");
Map properties = myResource2.adaptTo(ValueMap.class);
Resource myResource3 = resourceResolver.create(null, "myresource3", properties);
resourceResolver.delete(myResource2);
resourceResolver.commit();
Я считаю, что этот фрагмент предназначен для иллюстрации эффект вызова сервлета Sling POST с определенными параметрами, а не предложение правильного способа перемещения ресурса.
В Javadoc для класса ResourceResolver указан ход > метод, который принимает два параметра: исходный путь и путь назначения, но при попытке его выполнить не удается
Код: Выделить всё
Resource col1 = parentResource.getChild('col1')
Resource col2 = parentResource.getChild('col2')
def tempResourcePath = parentResource.path + "/col1_temp"
resourceResolver.move(col1.path, tempResourcePath)
Код: Выделить всё
org.apache.sling.api.resource.PersistenceException: Destination resource does not exist.
Ресурс destAbsPath должен существовать, если не генерируется PersistenceException. Если дочерний ресурс с таким же именем уже существует в destAbsPath, генерируется PersistenceException.
Это противоречит цели использования перемещения
Это противоречит цели использования перемещения
code> для существенного переименования ресурса, сохраняя его под тем же родителем. Технически я мог бы использовать этот API для индивидуального перемещения всех потомков col1 и col2 во вновь созданный ресурс, но для этого потребуется немного больше кода, чем я ожидал бы в этой ситуации.
Есть ли более простой способ сделать это с помощью Sling API?
Подробнее здесь: https://stackoverflow.com/questions/787 ... -and-desce