{"id":23939,"date":"2016-07-29T19:19:00","date_gmt":"2016-07-29T19:19:00","guid":{"rendered":"https:\/\/site.axamit.com\/?p=370"},"modified":"2026-07-01T10:01:24","modified_gmt":"2026-07-01T10:01:24","slug":"bulkverwerking-van-content-in-aem-met-behulp-van-groovy-console","status":"publish","type":"post","link":"https:\/\/axamit.com\/nl\/blog\/adobe-experience-manager\/bulkverwerking-van-content-in-aem-met-behulp-van-groovy-console\/","title":{"rendered":"Bulkverwerking van content in AEM met behulp van Groovy Console"},"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\">Taken<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Een van de taken waar AEM-ontwikkelaars mee te maken kunnen krijgen, is de verwerking van JCR-content. Soms is het nodig om een enorme hoeveelheid gegevens bij te werken\/wijzigen\/bundelen\/analyseren, en dit in een productieomgeving doen maakt het twee keer zo moeilijk.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier zijn enkele veelvoorkomende gevallen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wijziging van de contentstructuur (bijvoorbeeld, nieuws\/februari\/evenement -&gt; nieuws\/2015-2016\/februari\/evenement);<\/li>\n\n\n\n<li>Aanpassing\/reparatie van content (bijvoorbeeld de noodzaak om &#8216;colour&#8217; te wijzigen in &#8216;color&#8217; op elke pagina);<\/li>\n\n\n\n<li>Contentanalyse (in MSM gebruiken editors assets van een andere site, alle onjuiste gebruiken moeten worden gevonden);<\/li>\n\n\n\n<li>Contentvoorbereiding en -verpakking (bijv. tijdens een migratie van CQ5.x naar AEM6.x, moet de content eerst worden geanalyseerd en een correct migratiepakket worden gemaakt).<\/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\">Oplossingen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Voor elk geval zijn er verschillende oplossingen en workarounds:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Servlets\/JSP\/Scriptlets<\/li>\n\n\n\n<li>AEM-hulpprogrammapakketten. Ontdek hoe u de batchverwerking van content in Adobe Experience Manager kunt vereenvoudigen met <a href=\"https:\/\/axamit.com\/nl\/blog\/adobe-experience-manager\/batchverwerking-van-content-in-aem-met-de-groovy-console-2\/\">Groovy Console<\/a>, waardoor contentupdates, analyse en migratie eenvoudig worden in een productieomgeving.<\/li>\n\n\n\n<li>Externe tools<\/li>\n\n\n\n<li>Groovy Console<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Laten we ons richten op Groovy Console. Dit is de &#8216;silver bullet&#8217; (wonderoplossing) als het gaat om het oplossen van problemen zoals hierboven genoemd.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier zijn enkele voordelen van Groovy Console:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Vervuilt de projectcode niet;<\/li>\n\n\n\n<li>Korte en duidelijke scripts;<\/li>\n\n\n\n<li>Voorgedefinieerde services\/methoden.<\/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\">Aan de slag<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">De AEM Groovy Console wordt gehost op<\/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> en is beschikbaar voor AEM\/CQ5-versies vanaf CQ5.4. Nadat u Groovy Console op uw lokale AEM\/CQ5-instantie hebt ge\u00efnstalleerd, gaat u naar <\/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;6a5aeb66ebec2&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a5aeb66ebec2\" 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=\"https:\/\/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\">De volgende voorgedefinieerde variabelen zijn direct beschikbaar voor elk Groovy-script:<\/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\">methoden (enkele daarvan):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>getPage(String path) &#8211; Haalt een pagina op voor het opgegeven pad of null als deze niet bestaat.<\/li>\n\n\n\n<li>getNode(String path) &#8211; Haalt een node op voor het opgegeven pad. Werpt javax.jcr.RepositoryException als deze niet bestaat.<\/li>\n\n\n\n<li>activate(String path) &#8211; Activeert de node op het opgegeven pad.<\/li>\n\n\n\n<li>deactivate(String path) &#8211; Deactiveert de node op het opgegeven pad.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En imports:<\/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\">U kunt ook gebruikmaken van de geschiedenis en archieven van scripts. Deze functies stellen u in staat om deze problemen op een gemakkelijke en elegante manier op te lossen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voorbeeld<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Laten we zeggen dat we pagina&#8217;s moeten vinden met het woord \u201ebaking\u201d in de titel en dit moeten vervangen door het woord \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 <a href=\"https:\/\/axamit.com\/nl\/blog\/adobe-experience-manager\/wat-is-de-dispatcher-in-aem-2\/\">AEM Dispatcher<\/a> 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\">Zoals u ziet, is de oplossing met de Groovy console eenvoudig en logisch.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Taken Een van de taken waar AEM-ontwikkelaars mee te maken kunnen krijgen, is de verwerking van JCR-content. Soms [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":5015,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[158],"tags":[],"class_list":["post-23939","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-adobe-experience-manager"],"acf":{"cta":"Zadzwo\u0144 do nas","phone":"+1 (438) 383-6878","meta-description":"Ontdek hoe u batch contentverwerking in Adobe Experience Manager kunt vereenvoudigen met Groovy Console, waardoor contentupdates, analyse en migratie een fluitje van een cent worden in een live omgeving."},"_links":{"self":[{"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/posts\/23939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/comments?post=23939"}],"version-history":[{"count":1,"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/posts\/23939\/revisions"}],"predecessor-version":[{"id":23940,"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/posts\/23939\/revisions\/23940"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/media\/5015"}],"wp:attachment":[{"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/media?parent=23939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/categories?post=23939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/axamit.com\/nl\/wp-json\/wp\/v2\/tags?post=23939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}