Author: buildbot Date: Fri Sep 1 15:00:17 2017 New Revision: 1017563 Log: Staging update by buildbot for sling
Modified: websites/staging/sling/trunk/content/ (props changed) websites/staging/sling/trunk/content/documentation/bundles/sling-pipes.html Propchange: websites/staging/sling/trunk/content/ ------------------------------------------------------------------------------ --- cms:source-revision (original) +++ cms:source-revision Fri Sep 1 15:00:17 2017 @@ -1 +1 @@ -1806960 +1806970 Modified: websites/staging/sling/trunk/content/documentation/bundles/sling-pipes.html ============================================================================== --- websites/staging/sling/trunk/content/documentation/bundles/sling-pipes.html (original) +++ websites/staging/sling/trunk/content/documentation/bundles/sling-pipes.html Fri Sep 1 15:00:17 2017 @@ -166,7 +166,7 @@ h2:hover > .headerlink, h3:hover > .head <p>Plumber can provider a PipeBuilder with <code>newPipe(ResourceResolver resolver)</code> API, that gives a fluent API to quickly configure and run pipes. e.g. </p> -<div class="codehilite"><pre>`<span class="n">plumber</span><span class="p">.</span><span class="n">newPipe</span><span class="p">(</span><span class="n">resolver</span><span class="p">).</span><span class="n">xpath</span><span class="p">(</span><span class="s">'//element(*,nt:unstructured)[@sling:resourceType='</span><span class="n">to</span><span class="o">/</span><span class="n">delete</span><span class="o">'</span><span class="p">]</span>"<span class="p">).</span><span class="n">rm</span><span class="p">().</span><span class="n">run</span><span class="p">();</span>` +<div class="codehilite"><pre><span class="n">plumber</span><span class="p">.</span><span class="n">newPipe</span><span class="p">(</span><span class="n">resolver</span><span class="p">).</span><span class="n">xpath</span><span class="p">(</span><span class="s">'//element(*,nt:unstructured)[@sling:resourceType='</span><span class="n">to</span><span class="o">/</span><span class="n">delete</span><span class="o">'</span><span class="p">]</span>"<span class="p">).</span><span class="n">rm</span><span class="p">().</span><span class="n">run</span><span class="p">();</span> </pre></div> @@ -182,7 +182,10 @@ e.g. </p> <li><code>conf(Object...)</code> add an extra configuration node with key/value properties/values</li> </ul> <p>note that that configuration part has shortcuts for some pipes. Typically, above sample is a shorter equivalent of </p> -<p><code>plumber.newPipe(resolver).pipe('slingPipes/xpath').expr('//element(*,nt:unstructured)[@sling:resourceType='to/delete']").pipe('slingPipes/rm').run();</code></p> +<div class="codehilite"><pre><span class="n">plumber</span><span class="p">.</span><span class="n">newPipe</span><span class="p">(</span><span class="n">resolver</span><span class="p">).</span><span class="n">pipe</span><span class="p">(</span><span class="s">'slingPipes/xpath'</span><span class="p">).</span><span class="n">expr</span><span class="p">(</span><span class="s">'//element(*,nt:unstructured)[@sling:resourceType='</span><span class="n">to</span><span class="o">/</span><span class="n">delete</span><span class="o">'</span><span class="p">]</span>"<span class="p">).</span><span class="n">pipe</span><span class="p">(</span><span class="s">'slingPipes/rm'</span><span class="p">).</span><span class="n">run</span><span class="p">();</span> +</pre></div> + + <p>when available, shortcuts will be specified next to each pipe type documentation.</p> <p>Once you are happy with the pipe you have created, you can terminate the builder with following command:</p> <ul> @@ -205,7 +208,10 @@ e.g. </p> </ul> <p>which will return you the path of the resources that have been through the output of the configured pipe.</p> <p>In the eventuality of a long execution (synchronous or asynchronous), you can retrieve the status of a pipe, by executing</p> -<p>GET /etc/pipes/mySamplePipe<strong>.status</strong>.json</p> +<div class="codehilite"><pre><span class="n">GET</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">pipes</span><span class="o">/</span><span class="n">mySamplePipe</span><span class="o">**</span><span class="p">.</span><span class="n">status</span><span class="o">**</span><span class="p">.</span><span class="n">json</span> +</pre></div> + + <h5 id="request-parameter-binding">Request Parameter <code>binding</code><a class="headerlink" href="#request-parameter-binding" title="Permanent link">¶</a></h5> <p>you can add as <code>bindings</code> parameter a json object of global bindings you want to add for the execution of the pipe</p> <p>e.g.</p> @@ -227,7 +233,10 @@ object are expressions and can reuse eac <p>will returns something similar to</p> -<p>{"size":2, "items":[{'user':'John Smith','path':'/home/users/q/q123jk1UAZS'},{'user':'John Doe','path':'/home/users/q/q153jk1UAZS'}]}</p> +<div class="codehilite"><pre><span class="p">{</span>"<span class="nb">size</span>"<span class="p">:</span>2<span class="p">,</span> "<span class="n">items</span>"<span class="p">:[{</span><span class="s">'user'</span><span class="p">:</span><span class="s">'John Smith'</span><span class="p">,</span><span class="s">'path'</span><span class="p">:</span><span class="s">'/home/users/q/q123jk1UAZS'</span><span class="p">},{</span><span class="s">'user'</span><span class="p">:</span><span class="s">'John Doe'</span><span class="p">,</span><span class="s">'path'</span><span class="p">:</span><span class="s">'/home/users/q/q153jk1UAZS'</span><span class="p">}]}</span> +</pre></div> + + <h5 id="request-parameter-dryrun">Request Parameter <code>dryRun</code><a class="headerlink" href="#request-parameter-dryrun" title="Permanent link">¶</a></h5> <p>if parameter dryRun is set to true, and the executed pipe is supposed to modify content, it will log (at best it can) the change it <em>would</em> have done, without doing anything</p> <h5 id="request-parameter-size">Request Parameter <code>size</code><a class="headerlink" href="#request-parameter-size" title="Permanent link">¶</a></h5> @@ -367,7 +376,7 @@ is the path of the current resource of p <h2 id="sample-configurations">sample configurations<a class="headerlink" href="#sample-configurations" title="Permanent link">¶</a></h2> <h5 id="slingquery-write">slingQuery | write<a class="headerlink" href="#slingquery-write" title="Permanent link">¶</a></h5> <p>write repository user prefix Ms/Mr depending on gender</p> -<div class="codehilite"><pre> .newPipe(resolver).xpath('/jcr:root/home/users//element(*,rep:Users)') +<div class="codehilite"><pre> plumber.newPipe(resolver).xpath('/jcr:root/home/users//element(*,rep:Users)') .$('nt:unstructured#profile') .write("fullName","<span class="cp">${</span><span class="p">(</span><span class="n">profile</span><span class="o">.</span><span class="n">gender</span> <span class="o">===</span> <span class="s">'female'</span> <span class="err">?</span> <span class="s">'Ms '</span> <span class="o">+</span> <span class="n">profile</span><span class="o">.</span><span class="n">fullName</span> <span class="p">:</span> <span class="s">'Mr '</span> <span class="o">+</span> <span class="n">profile</span><span class="o">.</span><span class="n">fullName</span><span class="p">)</span><span class="cp">}</span>") .run() @@ -376,7 +385,7 @@ is the path of the current resource of p <h5 id="slingquery-multiproperty-authorizable-write">slingQuery | multiProperty | authorizable | write<a class="headerlink" href="#slingquery-multiproperty-authorizable-write" title="Permanent link">¶</a></h5> <p>move badge<->user relation ship from badge->users MV property to a user->badges MV property</p> -<div class="codehilite"><pre> .newPipe(resolver).echo('/etc/badges/jcr:content/par') +<div class="codehilite"><pre> plumber.newPipe(resolver).echo('/etc/badges/jcr:content/par') .$('[sling:resourceType=myApp/components/badge]').name('badge') .pipe('slingPipes/multiProperty').path('<span class="cp">${</span><span class="n">path</span><span class="o">.</span><span class="n">badge</span><span class="cp">}</span>/profiles').name('profile') .auth('<span class="cp">${</span><span class="n">profile</span><span class="cp">}</span>').name('user') @@ -386,75 +395,37 @@ is the path of the current resource of p </pre></div> -<h3 id="xpath-json-write">xpath | json | write<a class="headerlink" href="#xpath-json-write" title="Permanent link">¶</a></h3> -<p>this use case is for completing repository profiles with external system's data (that has an json api)</p> -<div class="codehilite"><pre>{ - "jcr:primaryType": "nt:unstructured", - "jcr:description": "this pipe retrieves json info from an external system and writes them to the user profile, uses moment.js, it - distributes modified resources using publish distribution agent", - "sling:resourceType": "slingPipes/container", - "distribution.agent": "publish", - "additionalScripts": "/etc/source/moment.js", - "conf": { - "jcr:primaryType": "sling:OrderedFolder", - "profile": { - "jcr:primaryType": "sling:OrderedFolder", - "expr": "/jcr:root/home/users//element(profile,nt:unstructured)[@uid]", - "jcr:description": "query all user profile nodes", - "sling:resourceType": "slingPipes/xpath" - }, - "json": { - "jcr:primaryType": "sling:OrderedFolder", - "expr": "<span class="cp">${</span><span class="p">(</span><span class="n">profile</span><span class="o">.</span><span class="n">uid</span> <span class="err">?</span> <span class="s">'https://my.external.system.corp.com/profiles/'</span> <span class="o">+</span> <span class="n">profile</span><span class="o">.</span><span class="n">uid</span><span class="o">.</span><span class="n">substr</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="s">'/'</span> <span class="o">+</span> <span class="n">profile</span><span class="o">.</span><span class="n">uid</span> <span class="o">+</span> <span class="s">'.json'</span> <span class="p">:</span> <span class="s">''</span><span class="p">)</span><span class="s">",</span> - <span class="s">"jcr:description"</span><span class="p">:</span> <span class="s">"retrieves json information relative to the given profile, if the uid is not found, expr is empty: the pipe will do nothing"</span><span class="p">,</span> - <span class="s">"sling:resourceType"</span><span class="p">:</span> <span class="s">"slingPipes/json"</span> - <span class="cp">}</span>, - "write": { - "jcr:primaryType": "sling:OrderedFolder", - "path": "path.profile", - "jcr:description": "write json information to the profile node", - "sling:resourceType": "slingPipes/write", - "conf": { - "jcr:primaryType": "sling:OrderedFolder", - "background": "<span class="cp">${</span><span class="n">json</span><span class="o">.</span><span class="n">opt</span><span class="p">(</span><span class="s">'background'</span><span class="p">)</span><span class="cp">}</span>", - "about": "<span class="cp">${</span><span class="n">json</span><span class="o">.</span><span class="n">opt</span><span class="p">(</span><span class="s">'about'</span><span class="p">)</span><span class="cp">}</span>", - "birthday": "<span class="cp">${</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">opt</span><span class="p">(</span><span class="s">'birthday'</span><span class="p">)</span> <span class="err">?</span> <span class="n">moment</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">opt</span><span class="p">(</span><span class="s">'birthday'</span><span class="p">),</span> \<span class="s">"MMMM DD</span><span class="se">\"</span><span class="s">).toDate() : '')</span><span class="cp">}</span>", - "mobile": "<span class="cp">${</span><span class="n">json</span><span class="o">.</span><span class="n">opt</span><span class="p">(</span><span class="s">'mobile'</span><span class="p">)</span><span class="cp">}</span>" - } - } - } -} -</pre></div> - - -<h3 id="xpath-parent-rm">xpath | parent | rm<a class="headerlink" href="#xpath-parent-rm" title="Permanent link">¶</a></h3> -<div class="codehilite"><pre><span class="p">{</span> - "<span class="n">jcr</span><span class="p">:</span><span class="n">primaryType</span>"<span class="p">:</span> "<span class="n">nt</span><span class="p">:</span><span class="n">unstructured</span>"<span class="p">,</span> - "<span class="n">jcr</span><span class="p">:</span><span class="n">description</span>"<span class="p">:</span> "<span class="n">this</span> <span class="n">pipe</span> <span class="n">removes</span> <span class="n">user</span> <span class="n">with</span> <span class="n">bad</span> <span class="n">property</span> <span class="n">in</span> <span class="n">their</span> <span class="n">profile</span>"<span class="p">,</span> - "<span class="n">sling</span><span class="p">:</span><span class="n">resourceType</span>"<span class="p">:</span> "<span class="n">slingPipes</span><span class="o">/</span><span class="n">container</span>"<span class="p">,</span> - "<span class="n">conf</span>"<span class="p">:</span> <span class="p">{</span> - "<span class="n">jcr</span><span class="p">:</span><span class="n">primaryType</span>"<span class="p">:</span> "<span class="n">sling</span><span class="p">:</span><span class="n">OrderedFolder</span>"<span class="p">,</span> - "<span class="n">profile</span>"<span class="p">:</span> <span class="p">{</span> - "<span class="n">jcr</span><span class="p">:</span><span class="n">primaryType</span>"<span class="p">:</span> "<span class="n">sling</span><span class="p">:</span><span class="n">OrderedFolder</span>"<span class="p">,</span> - "<span class="n">expr</span>"<span class="p">:</span> "<span class="o">/</span><span class="n">jcr</span><span class="p">:</span><span class="n">root</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">users</span><span class="o">//</span><span class="n">element</span><span class="p">(</span><span class="n">profile</span><span class="p">,</span><span class="n">nt</span><span class="p">:</span><span class="n">unstructured</span><span class="p">)[@</span><span class="n">bad</span><span class="p">]</span>"<span class="p">,</span> - "<span class="n">jcr</span><span class="p">:</span><span class="n">description</span>"<span class="p">:</span> "<span class="n">query</span> <span class="n">all</span> <span class="n">user</span> <span class="n">profile</span> <span class="n">nodes</span> <span class="n">with</span> <span class="n">bad</span> <span class="k">properties</span>"<span class="p">,</span> - "<span class="n">sling</span><span class="p">:</span><span class="n">resourceType</span>"<span class="p">:</span> "<span class="n">slingPipes</span><span class="o">/</span><span class="n">xpath</span>" - <span class="p">},</span> - "<span class="n">parent</span>"<span class="p">:</span> <span class="p">{</span> - "<span class="n">jcr</span><span class="p">:</span><span class="n">primaryType</span>"<span class="p">:</span> "<span class="n">sling</span><span class="p">:</span><span class="n">OrderedFolder</span>"<span class="p">,</span> - "<span class="n">jcr</span><span class="p">:</span><span class="n">description</span>"<span class="p">:</span> "<span class="n">get</span> <span class="n">the</span> <span class="n">parent</span> <span class="n">node</span> <span class="p">(</span><span class="n">user</span> <span class="n">node</span><span class="p">)</span>"<span class="p">,</span> - "<span class="n">sling</span><span class="p">:</span><span class="n">resourceType</span>"<span class="p">:</span> "<span class="n">slingPipes</span><span class="o">/</span><span class="n">parent</span>" - <span class="p">},</span> - "<span class="n">rm</span>"<span class="p">:</span> <span class="p">{</span> - "<span class="n">jcr</span><span class="p">:</span><span class="n">primaryType</span>"<span class="p">:</span> "<span class="n">sling</span><span class="p">:</span><span class="n">OrderedFolder</span>"<span class="p">,</span> - "<span class="n">jcr</span><span class="p">:</span><span class="n">description</span>"<span class="p">:</span> "<span class="n">remove</span> <span class="n">it</span>"<span class="p">,</span> - "<span class="n">sling</span><span class="p">:</span><span class="n">resourceType</span>"<span class="p">:</span> "<span class="n">slingPipes</span><span class="o">/</span><span class="n">rm</span>"<span class="p">,</span> - <span class="p">}</span> - <span class="p">}</span> -<span class="p">}</span> +<h5 id="echo-echo-json-write">echo | $ | $ | echo | json | write<a class="headerlink" href="#echo-echo-json-write" title="Permanent link">¶</a></h5> +<p>this use case is for completing repository website with external system's data (that has an json api), +it does </p> +<ul> +<li>loop over "my:Page" country/language tree under <code>/content/mySite</code>, </li> +<li>fetch json with contextual parameter that must be in upper case, </li> +<li>and write part of the returned json in the current resource. </li> +</ul> +<p>This pipe is run asynchronously in case the execution takes long.</p> +<div class="codehilite"><pre>plumber.newPipe(resolver) + .echo("/content/mySite") + .$('my:Page') + .$('my:Page').name("localePage") + .echo('<span class="cp">${</span><span class="n">path</span><span class="o">.</span><span class="n">localePage</span><span class="cp">}</span>/jcr:content').name("content") + .json('https://www.external.com/api/<span class="cp">${</span><span class="n">content</span><span class="o">.</span><span class="n">country</span><span class="o">.</span><span class="n">toUpperCase</span><span class="p">()</span><span class="cp">}</span>.json.name('api') + .write('cachedValue','<span class="cp">${</span><span class="n">api</span><span class="o">.</span><span class="n">remoteJsonValueWeWant</span><span class="cp">}</span>') + .runAsync(null) </pre></div> +<h5 id="xpath-parent-rm">xpath | parent | rm<a class="headerlink" href="#xpath-parent-rm" title="Permanent link">¶</a></h5> +<ul> +<li>query all user profile nodes with bad properties,</li> +<li>get the parent node (user node)</li> +<li> +<p>remove it</p> +<p>plumber.newPipe(resolver) +.xpath("/jcr:root/home/users//element(profile,nt:unstructured)[@bad]") +.parent().rm().run()</p> +</li> +</ul> <p>some other samples are in https://github.com/npeltier/sling-pipes/tree/master/src/test/</p> <h1 id="compatibility">Compatibility<a class="headerlink" href="#compatibility" title="Permanent link">¶</a></h1> <p>For running this tool on a sling instance you need:</p> @@ -464,7 +435,7 @@ is the path of the current resource of p <li>jackrabbit api (2.7.5+) (used in AuthorizablePipe)</li> </ul> <div class="timestamp" style="margin-top: 30px; font-size: 80%; text-align: right;"> - Rev. 1806694 by npeltier on Wed, 30 Aug 2017 13:59:44 +0000 + Rev. 1806970 by npeltier on Fri, 1 Sep 2017 14:59:54 +0000 </div> <div class="trademarkFooter"> Apache Sling, Sling, Apache, the Apache feather logo, and the Apache Sling project