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