“Simplicity is the ultimate sophistication.“ – Leonardo da Vinci
While working on huge amounts of Enterprise content data, I am sure you guys must have faced scenarios wherein there is a need to modify some part of content with a particular property or some property/node is wrongly edited and you are asked to find all those nodes and correct that property . Similar sort of problems become cumbersome if the amount of data is quite huge. General approach to solve this would be to write either some Groovy script or write some Java code to parse the content and change the necessary nodes. To overcome this redundant issue in content and to make a scalable approach to deal with all these content related issues, Apache came up with Sling Pipes.
What are Sling Pipes ?
Its a tool where you can load content tree nodes , perform some operation and either Retrieve an output or Modify the nodes. The aim here is to provide reusable blocks called pipes which can be configured for any possible operation on content.
Install Sling Pipes in AEM
To begin with , you would AEM 6.1 + . Start with the download of the github project from here and build it using
mvn clean install -DskipTests
Once the build is successful, upload the jar file : org.apache.sling.pipes-0.0.9-SNAPSHOT.jar in /system/console/bundles. If the bundle doesnt get resolved download the org.apache.sling.query jar from LINK1 and LINK2 and upload in AEM.
Make sure both the bundles are in Active state .
A Pipe is basically a jcr node which has several properties :
- sling:resourceType= slingPipes/plumber
- name= to be used as an id and could be a key for output bindings.
- path= defines pipe’s input . If its not present previous pipes output will be used as input for this pipe.
- expr= expression through which the pipe will execute
- additionalBinding= It is a node you can add to set “global” bindings (property=value) in pipe execution
- additionalScripts= scripts which can be used as expressions.
- conf=optional child node to add additional configurations.
Reader Pipes :
|Base Pipe||Dummy pipe, output=input||sling:resourceType = slingPipes/base|
|Sling Query Pipe||executes $(getInput()).children(expression)||
|JSON Pipe||feeds bindings with remote json||
|MultiPropertyPipe||iterates through values of input multi value property and write them to bindings||
|XPath Pipe||gets resources from the xpath query.||
|Authorizable Pipe||retrieve authorizable resource corresponding to the id passed in expression||
|Parent Pipe||outputs the parent resource of input resource||
|Filter Pipe||outputs the input resource if its matches its configuration||
|Container Pipe||used to assemble a sequence of pipe.||
|Reference Pipe||executes the pipe referenced in path property.||
|Write Pipe||Writes nodes and properties to the input of pipe||
|Move Pipe||used to move input to target path.||
|Remove Pipe||removed the input resource (node or prop) and returns the parent.||
|Path Pipe||get or create path in an expression.||
Execute Sling Pipe
Once the configurations are ready , broadly there are 2 ways to execute a pipe. If its just a GET call / read operation you can directly call it from browser or use cURL command. If its a POST call / write operation, you have to use cURL. Besides these basics you can also pass few parameters to execute a pipe. We will see more with examples.
There are few configurations at the link which explains how the node structure should be in place to make it work. Besides that you can also check the link to explore more. I have also tried few things to test Sling Pipes. You can also install the below attached package from the link below in AEM 6.1 to do some practice on Sling Pipes.
Sling Pipes is apparently quite new in the AEM world , so it you might not get much context about it online. If you need to explore something complex using Sling Pipes, start with basics and then try to build upon the complex scenarios. You may also comment below few scenarios where content modification is needed and I can help you explore the usage of Sling Pipes in that use case. Going forward , I am sure this would be boon to us. Happy Exploring. !!
Read More – https://adapt.to/2016/en/schedule/introduction-to-sling-pipes.html
18 thoughts on “Sling Pipes”
Hi Hashim, I am not very clear about the real life use case of sling pipes. Can you give me some cases where i can use them??
Hi, Lets say you have 1000 pages of a particular template A . And somehow you found that the name of the template should be B, or the path of template should be something different, or you want to modify the same template to D but want to retain both the templates A and D.
Now the problem will come up when you want to make these changes for 1000 pages on template A. How sling pipes can be helpful is that, you can create one to modify the content in one go for all the above cases.
There can be several examples where its quite useful , when you want to work on the content pages and want to modify something .
Hi Hashim. Why not use groovy console, and why use Sling Pipes in such scenarios?
There could be several reasons which I could think of :
Groovy console is like an additional package which should be installed on the instance, while Sling Pipes would come inbuilt in future AEMs as its a Sling Feature. Sometimes client are not comfortable with an additional package in environment.
If we use Groovy, there is coding involved and its not simpler and reusable. While with sling pipes just with some property / node modifications content modifications scenarios could be covered. You can reuse sling pipes to create various content update scenarios.
In anycase , you can use either to solve the issue of Content updates. Nothing hard and fast.
On execution of these sling pipes, i am getting a maximum of 11 results in the JSON even though the size of the JSON is more than 11. Any insights why?
Could you check the Configurations for JSON MAX Results in Default Get Servlet. If the configuration present there is 200, try to change it to 1000 and check.
Also try to use Query Builder if the results are in line with Sling Pipes.
Do let me know if this works .
Can we change the name of the node through sling pipes /
Hi, Sling Pipes might not be useful in that scenario. You can use cURL for that if that is needed in an automated fashion.
Please let me know the curl command for renaming the node name.
You can try to use Chrome to generate cURL commands – something similar to this –
Nice article!! Just wondering, if I run this script on Author environment, is there is way to activate the updated nodes via Sling Pipes or do I need to go for Tree Activation after I am done modifying the nodes/properties. I know as part of Groovy script, we can code to activate the nodes too as they get updated.
Hi, I dont think it has provision for Activation yet. You can either use Tree activation or Query packager for this. http://adobe-consulting-services.github.io/acs-aem-commons/features/query-packager.html
I am looking at a usecase where, I have to chnage the sling:resourceType of the content nodes under a particular path. I have to leave the component name as it is, but change the path prefixed. eg:- if my sling:resourceType is test/components/b , I would like to change those to test1/components/b . Could you please let me know how I can acheive this ? I would like to know if any string operation is possible in the conf node we set.
Hi Veena, You can make use of Groovy in this case. Check out the script Modify a property in complete hierarchy. https://hashimkhan.in/aem-adobecq5-code-templates/groovy-script/
Do let me know if this works . While with sling pipes just with some property / node modifications content modifications scenarios could be covered.
It works. Thats why it is . Try it yourself to check.
I have a scenario to delete some nodes based on a condition using SQL/JCR2. Like for example, I want to delete a node if a condition is true. Will Sling Pipes help in that scenario?
I may add a delete query instead of update. Will that work?
Yes, you can use the Sling pipes to achieve this using a Remove pipe or you can also check out Groovy Scripting to achieve this. https://hashimkhan.in/aem-adobecq5-code-templates/groovy-script/