{"id":23397,"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:05:33","modified_gmt":"2026-06-23T07:05:33","slug":"traitement-par-lots-du-contenu-dans-aem-avec-groovy-console","status":"publish","type":"post","link":"https:\/\/axamit.com\/fr\/blog\/adobe-experience-manager\/traitement-par-lots-du-contenu-dans-aem-avec-groovy-console\/","title":{"rendered":"Traitement par lots du contenu dans AEM avec 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\">T\u00e2ches<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;une des t\u00e2ches que les d\u00e9veloppeurs AEM peuvent rencontrer est le traitement de contenu JCR. Parfois, vous devez mettre \u00e0 jour\/modifier\/packager\/analyser une quantit\u00e9 immense de donn\u00e9es, et le faire dans un environnement de production rend la t\u00e2che deux fois plus difficile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici quelques cas typiques :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Modification de la structure du contenu (par exemple, actualit\u00e9s\/f\u00e9v\/\u00e9v\u00e9nement -&gt; actualit\u00e9s\/2015-2016\/f\u00e9v\/\u00e9v\u00e9nement) ;<\/li>\n\n\n\n<li>Modification\/correction de contenu (par exemple, il faut changer &lsquo;colour&rsquo; en &lsquo;color&rsquo; sur chaque page) ;<\/li>\n\n\n\n<li>Analyse de contenu (sur MSM, les \u00e9diteurs utilisent des assets d&rsquo;un autre site web, il faut trouver toutes les utilisations incorrectes) ;<\/li>\n\n\n\n<li>Pr\u00e9paration et empaquetage de contenu (par exemple, lors de la migration de CQ5.x vers AEM6.x, vous devez d&rsquo;abord analyser le contenu et cr\u00e9er un package valide pour la migration).<\/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\">Solutions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il existe plusieurs solutions et contournements pour chaque cas :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Servlets\/JSP\/Scriptlets<\/li>\n\n\n\n<li>Packages utilitaires AEM. D\u00e9couvrez comment vous pouvez simplifier le traitement par lots de contenu dans Adobe Experience Manager \u00e0 l&rsquo;aide de la console Groovy, ce qui facilite les mises \u00e0 jour de contenu, l&rsquo;analyse et la migration dans un environnement de production.<\/li>\n\n\n\n<li>Outils externes<\/li>\n\n\n\n<li>Console Groovy<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Concentrons-nous sur la console Groovy. C&rsquo;est une solution miracle pour r\u00e9soudre les probl\u00e8mes mentionn\u00e9s ci-dessus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici quelques avantages de la console Groovy :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>N&rsquo;alt\u00e8re pas le code du projet ;<\/li>\n\n\n\n<li>Scripts courts et clairs ;<\/li>\n\n\n\n<li>Services\/m\u00e9thodes pr\u00e9d\u00e9finis.<\/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\">D\u00e9marrage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La console Groovy d&rsquo;AEM est h\u00e9berg\u00e9e sur<\/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> et est disponible pour les versions AEM\/CQ5 \u00e0 partir de CQ5.4. Une fois la console Groovy install\u00e9e sur une instance AEM\/CQ5 locale, rendez-vous sur <\/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;6ac555ab0fd90&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ac555ab0fd90\" 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\">Les variables pr\u00e9d\u00e9finies suivantes sont imm\u00e9diatement disponibles pour tout script 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\">m\u00e9thodes (quelques-unes d&rsquo;entre elles) :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>getPage(String path) &#8211; R\u00e9cup\u00e8re la page pour le chemin donn\u00e9, ou null si elle n&rsquo;existe pas.<\/li>\n\n\n\n<li>getNode(String path) &#8211; R\u00e9cup\u00e8re le n\u0153ud pour le chemin donn\u00e9. Lance javax.jcr.RepositoryException s&rsquo;il n&rsquo;existe pas.<\/li>\n\n\n\n<li>activate(String path) &#8211; Active le n\u0153ud au chemin donn\u00e9.<\/li>\n\n\n\n<li>deactivate(String path) &#8211; D\u00e9sactive le n\u0153ud au chemin donn\u00e9.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Et les 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\">Vous pouvez \u00e9galement utiliser les archives d&rsquo;historique et de scripts. Ces fonctionnalit\u00e9s vous permettent de r\u00e9soudre ces probl\u00e8mes de mani\u00e8re simple et \u00e9l\u00e9gante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Supposons que nous devions trouver des pages avec le mot \u00ab baking \u00bb dans le titre et le remplacer par \u00ab banking \u00bb.<\/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\">Comme vous pouvez le voir, la solution de la console Groovy est simple et logique.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e2ches L&rsquo;une des t\u00e2ches que les d\u00e9veloppeurs AEM peuvent rencontrer est le traitement de contenu JCR. Parfois, vous [&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":[159],"tags":[],"class_list":["post-23397","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":"D\u00e9couvrez comment simplifier le traitement par lots de contenu dans Adobe Experience Manager \u00e0 l'aide de Groovy Console, ce qui facilite les mises \u00e0 jour, l'analyse et la migration de contenu dans un environnement en direct."},"_links":{"self":[{"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/posts\/23397","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/comments?post=23397"}],"version-history":[{"count":1,"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/posts\/23397\/revisions"}],"predecessor-version":[{"id":23398,"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/posts\/23397\/revisions\/23398"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/media\/5015"}],"wp:attachment":[{"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/media?parent=23397"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/categories?post=23397"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/axamit.com\/fr\/wp-json\/wp\/v2\/tags?post=23397"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}