Zadania
Jednym z zadań, z jakimi mogą spotkać się deweloperzy AEM, jest przetwarzanie zawartości JCR. Czasami trzeba zaktualizować/zmodyfikować/spakować/przeanalizować ogromną ilość danych, a robienie tego w środowisku produkcyjnym sprawia, że jest to dwa razy trudniejsze.
Oto kilka typowych przypadków:
- Zmiana struktury treści (na przykład: news/feb/event -> news/2015-2016/feb/event);
- Modyfikowanie/naprawianie treści (na przykład: potrzeba zmiany „colour” na „color” na każdej stronie);
- Analiza treści (w MSM edytorzy używają zasobów z innej witryny, trzeba znaleźć wszystkie błędne użycia);
- Przygotowanie i pakowanie treści (np. podczas migracji z CQ5.x do AEM6.x należy najpierw przeanalizować zawartość i stworzyć prawidłowy pakiet do migracji).
Rozwiązania
Istnieje kilka rozwiązań i obejść dla każdego przypadku:
- Serwlety/JSP/Skryplety
- Pakiety narzędzi AEM. Dowiedz się, jak uprościć przetwarzanie wsadowe treści w Adobe Experience Manager za pomocą Groovy Console, dzięki czemu aktualizacje, analiza i migracja treści w środowisku produkcyjnym stają się dziecinnie proste.
- Narzędzia zewnętrzne
- Groovy Console
Skupmy się na Groovy Console. To niezawodne rozwiązanie, jeśli chodzi o rozwiązywanie problemów takich jak te wymienione powyżej.
Oto kilka zalet Groovy Console:
- Nie zaśmieca kodu projektu;
- Krótkie i przejrzyste skrypty;
- Predefiniowane usługi/metody.
Rozpoczęcie pracy
AEM Groovy Console jest hostowana na
https://github.com/Citytechinc/cq-groovy-console i jest dostępna dla wersji AEM/CQ5 począwszy od CQ5.4. Po zainstalowaniu Groovy Console na lokalnej instancji AEM/CQ5, przejdź do
http://:/etc/groovyconsole.html

Następujące predefiniowane zmienne są natychmiast dostępne dla każdego skryptu Groovy:
- session – javax.jcr.Session
- pageManager – com.day.cq.wcm.api.PageManager-resourceResolver-org.apache.sling.api.resource.ResourceResolver
- slingRequest – org.apache.sling.api.SlingHttpServletRequest-queryBuilder-com.day.cq.search.QueryBuilder-bundleContext-org.osgi.framework.BundleContext-log-org.slf4j.Logger
metody (niektóre z nich):
- getPage(String path) – Pobiera stronę dla danej ścieżki lub null, jeśli nie istnieje.
- getNode(String path) – Pobiera węzeł dla danej ścieżki. Wyrzuca javax.jcr.RepositoryException, jeśli nie istnieje.
- activate(String path) – Aktywuje węzeł pod daną ścieżką.
- deactivate(String path) – Dezaktywuje węzeł pod daną ścieżką.
Oraz importy:
- com.day.cq.search
- com.day.cq.tagging
- com.day.cq.wcm.api
- com.day.cq.replication
- javax.jcr
- org.apache.sling.api
- org.apache.sling.api.resource
Możesz również korzystać z historii i archiwów skryptów. Te funkcje pozwalają rozwiązać te problemy w łatwy i elegancki sposób.
Przykład
Załóżmy, że musimy znaleźć strony zawierające słowo „baking” w tytule i zamienić je na „banking”.
import com.day.cq.commons.jcr.JcrConstants
def search = "Baking"
def replace = "Banking"
def path = "/content/geometrixx"
def property = JcrConstants.JCR_TITLE;
def query = createSQL2Query(path, search , property)
def result = query.execute()
result.nodes.each{node ->
def title = node.get(property)Learn what AEM Dispatcher is and how it combines the capabilities of the Static Web Server and Content Management Server for better caching, load balancing, security, and request processing management.
node.set(JcrConstants.JCR_TITLE, title.replaceAll(search ,replace))
println node.path
}
save()
def createSQL2Query(path, term, property) {
def queryManager = session.workspace.queryManager
def statement = "SELECT * FROM [cq:PageContent] AS s WHERE ISDESCENDANTNODE([${path}]) and s.[${property}] like '%${term}%'"
def query = queryManager.createQuery(statement, "JCR-SQL2")
query
}
Jak widać, rozwiązanie z konsolą Groovy jest proste i logiczne.