Рубрики
Без рубрики

Обновление контента с помощью строповых труб

Вы все еще обновляете контент вручную? Попробуйте строповые трубы. Несколько недель назад я видел какой-то твит о том, как… Помечено apache sling, sling pipes, aem, java.

Вы все еще обновляете контент вручную? Попробуйте строповые трубы.

Несколько недель назад я увидел твит о том, как ребята из Adobe используют Sling pipes для обновления игрового контента, поэтому мне стало любопытно и я пробую это сделать.

Давайте посмотрим, что я выяснил…

Sling pipes – это простой инструмент для выполнения операций CRUD над ресурсами в репозитории AEM. Но достаточно ли он мощный, чтобы заменить ваши заводные скрипты? Давайте рассмотрим это на следующих примерах.

Вступление

Просто чтобы привлечь ваше внимание, допустим, в прошлом вы приняли какое-то неправильное решение во время разработки какого-то вашего компонента, и теперь вам нужно обновить весь контент с помощью этого компонента. С помощью строповых труб это очень просто.

Пример

plumber.newPipe(resourceResolver)
  .echo("/content/yoursite")
  .$("nt:unstructured[sling:resourceType=projectName/components/content/imageSlider]")
  .write("autoplay", true)
  .run()

5 строк? Да, вы можете установить для свойства автозапуск значение true во всем своем контенте с помощью компонента ImageSlider в 5 строках, и я почти уверен, что вы не можете сделать это так просто с помощью своего заводного кода, или вы можете сделать это вручную в crx/de на целый день…

Так что же, черт возьми, происходит в этом коде, что это за методы?!

Я объясню это позже более подробно, но в tl;dr;

  • водопроводчик является OSGi сервисом, и для запуска всей этой магии вам нужно передать ResourceResolver объект в метод new Pipe . После этого вам нужно вызвать каналы (методы), чтобы достичь того, чего вы хотите.
  • echo(“путь”) используется для получения корневого ресурса по определенному пути.
  • $(выражение) является оболочкой выражений запроса Sling, и я использую его здесь для фильтрации определенных ресурсов с помощью компонента ImageSlider
  • write(conf) созрел для записи/обновления ресурсов/свойств, в этом случае я создаю или обновляю свойство автозапуска со значением true
  • run() используется для выполнения кода

Все еще интересуешься? Позвольте мне объяснить вам, что такое строповые трубы более подробно.

О Строповых Трубах

Sling pipes – это набор инструментов для выполнения операций извлечения – преобразования – загрузки путем объединения проверенных блоков кода. Слинг-труба по сути, представляет собой поток ресурсов слинга, инкапсулирующий хорошо известные операции слинга.

Существует 3 типа труб:

  • каналы считывания – используются для получения ресурсов
  • каналы записи – для записи/обновления ресурсов в репозитории, в зависимости от конфигурации и ввода
  • логические каналы – они ссылаются на другие каналы, связывая их в цепочку или используя их результаты в общем виде

Считывающие трубки

Используется для получения ресурсов.

Базовая труба: эхо (путь)

Используется для получения ресурса по заданному пути

Допустим, вы хотите получить ресурс “/контент/мы-розничная торговля”.

plumber.newPipe(resourceResolver)
  .echo("/content/we-retail")
  .run()

Тип Xpath: xpath(выражение)

Используется для получения ресурса с заданным запросом xpath

Допустим, вы хотите получить все nt:неструктурированные ресурсы с изображением героя компонентом в разделе “/контент/мы-розничная торговля”.

plumber.newPipe(resourceResolver)
  .xpath("/jcr:root/content/we-retail//element(*, nt:unstructured)[(@sling:resourceType = 'weretail/components/content/heroimage')]")
  .run()

Строповые трубы Запроса

Оболочка для выполнения методов запроса Sling способом sling pipe.

  • Найти трубу: $(expr)
  • Детская трубка: дети(expr)
  • Труба для братьев и сестер: братья и сестры(expr)
  • Родительский канал: родительский()
  • Ближайшая труба: ближайшая (expr)

Вот более подробная информация о запросе Sling

Тот же пример, что и в предыдущем, допустим, вы хотите получить все ресурсы с компонентом изображение героя в разделе “/контент/мы-розничная торговля”.

plumber.newPipe(resourceResolver)
  .echo("/content/we-retail")
  .$("nt:unstructured[sling:resourceType=weretail/components/content/heroimage]")
  .run()

Писатель трубит

Используется для изменения ресурсов.

Канал записи: запись(conf)

Используется для записи заданных узлов и свойств в текущий входной ресурс

Допустим, вы хотите создать/обновить свойство “foo” со значением “bar” и свойство “foo2” со значением “bar 2”.

Пожалуйста, дайте мне знать, можно ли писать разные значения, кроме строк, таких как long, дата, логическое значение?

plumber.newPipe(resourceResolver)
  .echo("/content/we-retail")
  .write('foo','bar','foo2','bar2')
  .run()

Путь трубы: mkdir(expr)

Используется для создания ресурса в заданном местоположении.

Допустим, вы хотите создать ресурс “мастер” в местоположении “/контент/мы-розничная торговля/мастер”. Это создаст узел “слинг:Папка”.

Пожалуйста, дайте мне знать, можно ли указать другой jcr:primaryType?

plumber.newPipe(resourceResolver)
  .mkdir("/content/we-retail/master")
  .run()

Перемещение трубы: mv (expr)

Перемещает ресурс или свойство по целевому пути

В следующем примере основной ресурс будет перемещен из “/контент/мы-розничная торговля/мастер” в “/контент/мы-розничная торговля/язык-мастер”.

plumber.newPipe(resourceResolver)
  .echo("/content/we-retail/master")
  .mv("/content/we-retail/language-master")
  .run()

Удалить трубу: rm()

Удаляет ресурс или свойство в определенном местоположении.

В следующем примере будет удален основной ресурс по заданному пути “/контент/мы-розничная торговля/мастер”.

plumber.newPipe(resourceResolver)
  .echo("/content/we-retail/master")
  .rm()
  .run()

Упаковочная труба: pkg (expr)

Создает пакет и добавляет текущий ресурс в качестве фильтра.

В следующем примере будет упакован весь наш розничный контент

plumber.newPipe(resourceResolver)
  .echo("/content/we-retail")
  .pkg("/etc/packages/we-retail-content.zip")
  .run()

Как использовать его в вашем проекте AEM

Хорошо, как запустить все это в вашем проекте AEM? Вы можете настроить и выполнить канал с помощью java, groovy console, http или jmx

Зависимости

Вам нужно добавить “org.apache.sling.запрос” & “org.apache.sling.pipes” в качестве зависимостей, и вам необходимо встроить их как часть вашего пакета или установить как отдельные пакеты (мой рекомендуемый способ).


    org.apache.sling
    org.apache.sling.query
    4.0.2
    provided


    org.apache.sling
    org.apache.sling.pipes
    3.1.0
    provided



  org.apache.jackrabbit
  filevault-package-maven-plugin
  true
  
      true
      mixed
      pipes
      
          
          
              org.apache.sling
              org.apache.sling.query
              /apps/pipes-vendor-packages/application/install
          
          
              org.apache.sling
              org.apache.sling.pipes
              /apps/pipes-vendor-packages/application/install
          
      
  

Выполнение кода

Вы можете написать в заводной консоли .

def plumber = getService("org.apache.sling.pipes.Plumber")

plumber.newPipe(resourceResolver)
  .echo("/content/yoursite")
  .$("nt:unstructured[sling:resourceType=projectName/components/content/imageSlider]")
  .write("autoplay", true)
  .run()

Вы можете написать в вас Класс Java .

@Component(service = SlingPipesExamples.class, immediate = true)
public class SlingPipesExamples {

    private static final Logger logger = LoggerFactory.getLogger(SlingPipesExamples.class);

    private static final String SERVICE_USER = "sling-pipes-service-user";

    @Reference
    private ResourceResolverFactory resourceResolverFactory;

    @Reference
    private Plumber plumber;

    public void example() {
        try (final ResourceResolver resourceResolver = this.resourceResolverFactory.getServiceResourceResolver(this.getAuthenticationInfo())) {
            PipeBuilder pipeBuilder = this.plumber.newPipe(resourceResolver);
            // your logic with pipes
        } catch (final LoginException e) {
            logger.error("Exception during creating service resource resolver ", e);
        }
    }

    private Map getAuthenticationInfo() {
        return Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, SERVICE_USER);
    }

}

Вы можете создать ресурс в определенном местоположении, например “/etc/sling-pipes/пример” и выполнить его с помощью HTTP-запроса



Подводить итоги

В основном это то, что я обнаружил до сих пор. В целом мне нравятся Sling-трубы, особенно сейчас, когда с помощью нескольких строк кода вы можете многое сделать. Не пробовал с некоторыми более сложными примерами но я думаю, что это было бы почти то же самое.

Для получения более подробной информации загляните в официальную документацию .

Дайте мне знать, если для mkdir можно ли указать другой jcr:primaryType? Если это только “слинг:Папка”, то 👎

Также для записи канала можно ли записать в свойство какое-то значение, отличное от строки?

Я надеюсь, что вы чему-то научитесь и попробуете Слинговые трубы. Дайте мне знать, что вы думаете и каков ваш опыт работы со строповыми трубами:)

Оригинал: “https://dev.to/mkovacek/updating-aem-content-with-sling-pipes-2d5i”