{"id":23401,"date":"2016-07-29T19:19:00","date_gmt":"2016-07-29T19:19:00","guid":{"rendered":"https:\/\/site.axamit.com\/?p=370"},"modified":"2026-06-23T07:06:17","modified_gmt":"2026-06-23T07:06:17","slug":"masowe-przetwarzanie-tresci-w-aem-za-pomoca-konsoli-groovy","status":"publish","type":"post","link":"https:\/\/axamit.com\/pl\/blog\/adobe-experience-manager\/masowe-przetwarzanie-tresci-w-aem-za-pomoca-konsoli-groovy\/","title":{"rendered":"Masowe przetwarzanie tre\u015bci w AEM za pomoc\u0105 konsoli Groovy"},"content":{"rendered":"<div class=\"custom-toc\"><ul><\/ul><\/div>\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h2 class=\"wp-block-heading\">Zadania<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Jednym z zada\u0144, z jakimi mog\u0105 spotka\u0107 si\u0119 deweloperzy AEM, jest przetwarzanie zawarto\u015bci JCR. Czasami trzeba zaktualizowa\u0107\/zmodyfikowa\u0107\/spakowa\u0107\/przeanalizowa\u0107 ogromn\u0105 ilo\u015b\u0107 danych, a robienie tego w \u015brodowisku produkcyjnym sprawia, \u017ce jest to dwa razy trudniejsze.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oto kilka typowych przypadk\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zmiana struktury tre\u015bci (na przyk\u0142ad: news\/feb\/event -&gt; news\/2015-2016\/feb\/event);<\/li>\n\n\n\n<li>Modyfikowanie\/naprawianie tre\u015bci (na przyk\u0142ad: potrzeba zmiany \u201ecolour\u201d na \u201ecolor\u201d na ka\u017cdej stronie);<\/li>\n\n\n\n<li>Analiza tre\u015bci (w MSM edytorzy u\u017cywaj\u0105 zasob\u00f3w z innej witryny, trzeba znale\u017a\u0107 wszystkie b\u0142\u0119dne u\u017cycia);<\/li>\n\n\n\n<li>Przygotowanie i pakowanie tre\u015bci (np. podczas migracji z CQ5.x do AEM6.x nale\u017cy najpierw przeanalizowa\u0107 zawarto\u015b\u0107 i stworzy\u0107 prawid\u0142owy pakiet do migracji).<\/li>\n<\/ul>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h2 class=\"wp-block-heading\">Rozwi\u0105zania<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Istnieje kilka rozwi\u0105za\u0144 i obej\u015b\u0107 dla ka\u017cdego przypadku:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Serwlety\/JSP\/Skryplety<\/li>\n\n\n\n<li>Pakiety narz\u0119dzi AEM. Dowiedz si\u0119, jak upro\u015bci\u0107 przetwarzanie wsadowe tre\u015bci w Adobe Experience Manager za pomoc\u0105 Groovy Console, dzi\u0119ki czemu aktualizacje, analiza i migracja tre\u015bci w \u015brodowisku produkcyjnym staj\u0105 si\u0119 dziecinnie proste.<\/li>\n\n\n\n<li>Narz\u0119dzia zewn\u0119trzne<\/li>\n\n\n\n<li>Groovy Console<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Skupmy si\u0119 na Groovy Console. To niezawodne rozwi\u0105zanie, je\u015bli chodzi o rozwi\u0105zywanie problem\u00f3w takich jak te wymienione powy\u017cej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oto kilka zalet Groovy Console:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nie za\u015bmieca kodu projektu;<\/li>\n\n\n\n<li>Kr\u00f3tkie i przejrzyste skrypty;<\/li>\n\n\n\n<li>Predefiniowane us\u0142ugi\/metody.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h2 class=\"wp-block-heading\">Rozpocz\u0119cie pracy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">AEM Groovy Console jest hostowana na<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/Citytechinc\/cq-groovy-console\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/Citytechinc\/cq-groovy-console<\/a> i jest dost\u0119pna dla wersji AEM\/CQ5 pocz\u0105wszy od CQ5.4. Po zainstalowaniu Groovy Console na lokalnej instancji AEM\/CQ5, przejd\u017a do <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/\/etc\/groovyconsole.html\">http:\/\/:\/etc\/groovyconsole.html<\/a><\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ac555974f226&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ac555974f226\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1193\" height=\"843\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"http:\/\/axamit.com\/wp-content\/uploads\/2016\/07\/groovyconsole_2.webp\" alt=\"\" class=\"wp-image-6639\" srcset=\"https:\/\/axamit.com\/wp-content\/uploads\/2016\/07\/groovyconsole_2.webp 1193w, https:\/\/axamit.com\/wp-content\/uploads\/2016\/07\/groovyconsole_2-300x212.webp 300w, https:\/\/axamit.com\/wp-content\/uploads\/2016\/07\/groovyconsole_2-1024x724.webp 1024w, https:\/\/axamit.com\/wp-content\/uploads\/2016\/07\/groovyconsole_2-768x543.webp 768w\" sizes=\"auto, (max-width: 1193px) 100vw, 1193px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nast\u0119puj\u0105ce predefiniowane zmienne s\u0105 natychmiast dost\u0119pne dla ka\u017cdego skryptu Groovy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>session &#8211; javax.jcr.Session<\/li>\n\n\n\n<li>pageManager &#8211; com.day.cq.wcm.api.PageManager-resourceResolver-org.apache.sling.api.resource.ResourceResolver<\/li>\n\n\n\n<li>slingRequest &#8211; org.apache.sling.api.SlingHttpServletRequest-queryBuilder-com.day.cq.search.QueryBuilder-bundleContext-org.osgi.framework.BundleContext-log-org.slf4j.Logger<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">metody (niekt\u00f3re z nich):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>getPage(String path) &#8211; Pobiera stron\u0119 dla danej \u015bcie\u017cki lub null, je\u015bli nie istnieje.<\/li>\n\n\n\n<li>getNode(String path) &#8211; Pobiera w\u0119ze\u0142 dla danej \u015bcie\u017cki. Wyrzuca javax.jcr.RepositoryException, je\u015bli nie istnieje.<\/li>\n\n\n\n<li>activate(String path) &#8211; Aktywuje w\u0119ze\u0142 pod dan\u0105 \u015bcie\u017ck\u0105.<\/li>\n\n\n\n<li>deactivate(String path) &#8211; Dezaktywuje w\u0119ze\u0142 pod dan\u0105 \u015bcie\u017ck\u0105.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Oraz importy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>com.day.cq.search<\/li>\n\n\n\n<li>com.day.cq.tagging<\/li>\n\n\n\n<li>com.day.cq.wcm.api<\/li>\n\n\n\n<li>com.day.cq.replication<\/li>\n\n\n\n<li>javax.jcr<\/li>\n\n\n\n<li>org.apache.sling.api<\/li>\n\n\n\n<li>org.apache.sling.api.resource<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mo\u017cesz r\u00f3wnie\u017c korzysta\u0107 z historii i archiw\u00f3w skrypt\u00f3w. Te funkcje pozwalaj\u0105 rozwi\u0105za\u0107 te problemy w \u0142atwy i elegancki spos\u00f3b.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Za\u0142\u00f3\u017cmy, \u017ce musimy znale\u017a\u0107 strony zawieraj\u0105ce s\u0142owo \u201ebaking\u201d w tytule i zamieni\u0107 je na \u201ebanking\u201d.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.day.cq.commons.jcr.JcrConstants\ndef search =  \"Baking\"\ndef replace = \"Banking\"\ndef path = \"\/content\/geometrixx\"\ndef property = JcrConstants.JCR_TITLE;\ndef query = createSQL2Query(path,  search , property)\ndef result = query.execute()\nresult.nodes.each{node -&gt; \n    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.\n    node.set(JcrConstants.JCR_TITLE, title.replaceAll(search ,replace))\n    println node.path\n}\nsave()  \ndef createSQL2Query(path, term, property) {\n    def queryManager = session.workspace.queryManager\n    def statement = \"SELECT * FROM &#91;cq:PageContent] AS s WHERE ISDESCENDANTNODE(&#91;${path}]) and s.&#91;${property}] like '%${term}%'\"\n    def query = queryManager.createQuery(statement, \"JCR-SQL2\")\n    query\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jak wida\u0107, rozwi\u0105zanie z konsol\u0105 Groovy jest proste i logiczne.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Zadania Jednym z zada\u0144, z jakimi mog\u0105 spotka\u0107 si\u0119 deweloperzy AEM, jest przetwarzanie zawarto\u015bci JCR. Czasami trzeba zaktualizowa\u0107\/zmodyfikowa\u0107\/spakowa\u0107\/przeanalizowa\u0107 [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":5015,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[157],"tags":[],"class_list":["post-23401","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-adobe-experience-manager"],"acf":{"cta":"Give Us a Call","phone":"+1 (438) 383-6878","meta-description":"Odkryj, jak upro\u015bci\u0107 przetwarzanie tre\u015bci wsadowych w Adobe Experience Manager za pomoc\u0105 Groovy Console, sprawiaj\u0105c, \u017ce aktualizacje, analizy i migracje tre\u015bci s\u0105 dziecinnie proste w \u015brodowisku produkcyjnym."},"_links":{"self":[{"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/posts\/23401","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/comments?post=23401"}],"version-history":[{"count":1,"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/posts\/23401\/revisions"}],"predecessor-version":[{"id":23402,"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/posts\/23401\/revisions\/23402"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/media\/5015"}],"wp:attachment":[{"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/media?parent=23401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/categories?post=23401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/axamit.com\/pl\/wp-json\/wp\/v2\/tags?post=23401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}