Adobe

How to Export/Import Namespaces Between AEM Instances

Recently, I ran into a scenario where I needed to export namespaces from one AEM instance and import them to another. I previously wrote two groovy scripts on how to do this and they work very well. However, they require the AEM Groovy Console which is hard to put into a production environment, because of the risk for any code execution, including malicious code or code that might break the instance. So I got to thinking, is there really no possible way to do this with OOTB tools? Turns out, there is!
 

TL:DR https://gist.github.com/ahmed-musallam/c060b81b165f292d97f4c9aa01ffe9dd

 

The CND Importer

Adobe - Content for Everyone
Content for Everyone

Companies that can quickly and consistently meet the demands of consumers are thriving in an era of infinite content. Learn about how to build fluid experiences for your omnichannel customers.

Get the Guide

The nodetypes console in crx/explorer has a tool that can import jackrabbit CND. The CND contains notation for namespaces, which we can use to our advantage. Say I want to add a namespace whose URI is http://namespace.com/test and whose prefix is test. I can prepare it in CND as <'test'='http://namespace.com/test'> and then import it!
To import a CND:

  1. Go to http://localhost:4502/crx/explorer/nodetypes/index.jsp
  2. Click the “Import Node Types”
  3. Paste the CND
  4. Check the checkbox titled “Automatically register defined namespaces.”
  5. Submit


It’s that easy!

Exporting Existing Namespaces as a CND

This one was interesting, because I could not find anything that did this OOTB. Since I can go to http://localhost:4502/crx/explorer/ui/namespace_editor.jsp and see all namespaces, I could put together a small JS script to extract those namespaces and print them into a nice CND. You just need to open the namespace editor, run the script below in chrome console, and voila!

I know this script is a hacky way to get the namespaces. But it works very well for this purpose ¯\_(ツ)_/¯

(function(){
  var namespacesCnd = "";
  document.querySelectorAll("#mainTable > tbody table > tbody > tr")
  .forEach(tr => {
    var url = tr.children[0].innerHTML.replace("&nbsp;", "").trim();
    var prefix = tr.children[1].innerHTML.replace("&nbsp;", "").trim();
    namespacesCnd += "<'" + prefix +"'='" + url +"'>\n"
  });
  console.log(namespacesCnd)
})()


 
Once exported, you can use the CND importer and import them to any AEM instance!

Tags

About the Author

Ahmed is an Adobe Technical Lead and expert in the Adobe Experience Cloud.

More from this Author

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Subscribe to the Weekly Blog Digest:

Sign Up
Categories