You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by bu...@apache.org on 2018/10/01 23:15:09 UTC

svn commit: r1036010 - in /websites/staging/felix/trunk/content: ./ documentation/subprojects/apache-felix-gogo/rfc-147-overview.html

Author: buildbot
Date: Mon Oct  1 23:15:08 2018
New Revision: 1036010

Log:
Staging update by buildbot for felix

Modified:
    websites/staging/felix/trunk/content/   (props changed)
    websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-gogo/rfc-147-overview.html

Propchange: websites/staging/felix/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Mon Oct  1 23:15:08 2018
@@ -1 +1 @@
-1842569
+1842572

Modified: websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-gogo/rfc-147-overview.html
==============================================================================
--- websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-gogo/rfc-147-overview.html (original)
+++ websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-gogo/rfc-147-overview.html Mon Oct  1 23:15:08 2018
@@ -92,162 +92,152 @@ h2:hover > .headerlink, h3:hover > .head
 <p>This is an overview of its main features:</p>
 <div class="toc">
 <ul>
-<li><a href="#standard-way-to-implement-and-run-commands-for-any-osgi-42-framework">Standard way to implement and run commands for any OSGi 4.2 framework</a></li>
+<li><a href="#standard-way-to-implement-and-run-commands-for-any-osgi-42-framework">Standard way to implement and run commands for any OSGi 4.2 framework</a><ul>
+<li><a href="#commands-can-have-any-signature">Commands can have any signature</a></li>
+<li><a href="#easy-to-use-interactively-no-unnecessary-syntax">Easy to use interactively - no unnecessary syntax.</a></li>
+<li><a href="#lists-maps-pipes-and-closures">Lists, maps, pipes and closures.</a></li>
+<li><a href="#leverages-existing-java-capabilities-via-reflection">Leverages existing Java capabilities, via reflection.</a></li>
+<li><a href="#easy-to-implement-and-test-commands-without-needing-osgi">Easy to implement and test commands without needing OSGi.</a></li>
+</ul>
+</li>
 <li><a href="#normal-commands-can-provide-control-primitives">Normal commands can provide control primitives.</a></li>
 </ul>
 </div>
 <h2 id="standard-way-to-implement-and-run-commands-for-any-osgi-42-framework">Standard way to implement and run commands for any OSGi 4.2 framework<a class="headerlink" href="#standard-way-to-implement-and-run-commands-for-any-osgi-42-framework" title="Permanent link">&para;</a></h2>
 <p>Commands are registered via service attributes, you don't have to register a specific service. This allows commands to be registered by existing services, just by adding the new attributes:</p>
-<p>{code:template=java}
-Dictionary<String, Object> dict = new Hashtable<String, Object>();
+<p><code>java
+Dictionary&lt;String, Object&gt; dict = new Hashtable&lt;String, Object&gt;();
 dict.put(CommandProcessor.COMMAND_SCOPE, "shell");
-dict.put(CommandProcessor.COMMAND_FUNCTION, new String<a href=""></a> {"sleep", "grep"});
-context.registerService(name, service, dict);</p>
-<div class="codehilite"><pre><span class="n">Scope</span> <span class="n">is</span> <span class="n">used</span> <span class="n">to</span> <span class="n">provide</span> <span class="n">a</span> <span class="n">namespace</span> <span class="k">for</span> <span class="n">commands</span><span class="p">.</span> <span class="n">The</span> <span class="n">commands</span> <span class="n">above</span> <span class="n">can</span> <span class="n">be</span> <span class="n">invoked</span> <span class="n">as</span> &quot;<span class="n">shell</span><span class="p">:</span><span class="n">sleep</span>&quot; <span class="n">and</span> &quot;<span class="n">shell</span><span class="p">:</span><span class="n">grep</span>&quot;<span class="p">.</span> <span class="n">If</span> <span class="n">the</span> <span class="n">scope</span> <span class="n">is</span> <span class="n">omitted</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">g</span><span class="p">.<
 /span> &quot;<span class="n">sleep</span>&quot; <span class="n">and</span> &quot;<span class="n">grep</span>&quot;<span class="p">)</span> <span class="n">then</span> <span class="n">the</span> <span class="n">first</span> <span class="n">matching</span> <span class="n">command</span> <span class="n">is</span> <span class="n">invoked</span><span class="p">.</span>
-
-<span class="n">Commands</span> <span class="n">can</span> <span class="n">have</span> <span class="n">any</span> <span class="n">signature</span> <span class="o">-</span> <span class="n">arguments</span> <span class="n">are</span> <span class="n">coerced</span> <span class="n">to</span> <span class="n">call</span> <span class="n">the</span> <span class="n">best</span> <span class="n">matching</span> <span class="n">method</span> <span class="n">using</span> <span class="n">reflection</span><span class="p">.</span> <span class="n">A</span>  <span class="n">argument</span> <span class="n">is</span> <span class="n">inserted</span> <span class="k">if</span> <span class="n">required</span><span class="p">:</span>
-
-<span class="p">{</span><span class="n">code</span><span class="p">:</span><span class="n">template</span><span class="p">=</span><span class="n">java</span><span class="p">}</span>
-<span class="n">public</span> <span class="n">void</span> <span class="n">sleep</span><span class="p">(</span><span class="n">long</span> <span class="n">millis</span><span class="p">)</span> <span class="n">throws</span> <span class="n">InterruptedException</span><span class="p">{</span>
-    <span class="n">Thread</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">millis</span><span class="p">);</span>
-<span class="p">}</span>
-
-<span class="n">public</span> <span class="n">void</span> <span class="n">sleep</span><span class="p">(</span><span class="n">String</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span> <span class="n">throws</span> <span class="n">Exception</span><span class="p">;</span>
-
-<span class="n">public</span> <span class="n">boolean</span> <span class="n">grep</span><span class="p">(</span><span class="n">CommandSession</span> <span class="n">session</span><span class="p">,</span> <span class="n">String</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span> <span class="n">throws</span> <span class="n">Exception</span><span class="p">;</span>
-</pre></div>
-
-
+dict.put(CommandProcessor.COMMAND_FUNCTION, new String[] {"sleep", "grep"});
+context.registerService(name, service, dict);</code></p>
+<p>Scope is used to provide a namespace for commands. The commands above can be invoked as <code>shell:sleep</code> and <code>shell:grep</code>. If the scope is omitted (e.g. <code>sleep</code> and <code>grep</code>) then the first matching command is invoked.</p>
+<h3 id="commands-can-have-any-signature">Commands can have any signature<a class="headerlink" href="#commands-can-have-any-signature" title="Permanent link">&para;</a></h3>
+<p>Arguments are coerced to call the best matching method using reflection. A <code>CommandSession</code> argument is inserted if required:</p>
+<p>```java
+public void sleep(long millis) throws InterruptedException{
+    Thread.sleep(millis);
+}</p>
+<p>public void sleep(String[] args) throws Exception;</p>
+<p>public boolean grep(CommandSession session, String[] args) throws Exception;
+```</p>
 <p>The <code>CommandSession</code> interface provides methods for executing commands and getting and setting session variables:</p>
-<p>{code:template=java}
+<p><code>java
 public interface org.apache.felix.service.command.CommandSession {
     Object execute(CharSequence commandline) throws Exception;
     Object get(String name);
     void put(String name, Object value);
     ...
-}</p>
-<div class="codehilite"><pre><span class="n">h2</span><span class="p">.</span> <span class="n">Easy</span> <span class="n">to</span> <span class="n">use</span> <span class="n">interactively</span> <span class="o">-</span> <span class="n">no</span> <span class="n">unnecessary</span> <span class="n">syntax</span><span class="p">.</span>
-
-<span class="o">//</span> <span class="n">simple</span> <span class="n">command</span>
-
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-<span class="n">g</span>! <span class="n">echo</span> <span class="n">hello</span> <span class="n">world</span>
-<span class="n">hello</span> <span class="n">world</span>
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-
-<span class="o">//</span> <span class="n">session</span> <span class="n">variables</span>
-
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-<span class="n">g</span>! <span class="n">msg</span> <span class="p">=</span> &quot;<span class="n">hello</span> <span class="n">world</span>&quot;
-<span class="n">g</span>! <span class="n">echo</span> $<span class="n">msg</span>
-<span class="n">hello</span> <span class="n">world</span>
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-
-<span class="o">//</span> <span class="n">execution</span> <span class="n">quotes</span> <span class="p">()</span> <span class="o">-</span> <span class="n">similar</span> <span class="n">to</span> <span class="n">bash</span> <span class="n">backquotes</span>
-
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-<span class="n">g</span>! <span class="p">(</span><span class="n">bundle</span> 1<span class="p">)</span> <span class="n">location</span>
-<span class="n">file</span><span class="p">:</span><span class="o">/</span><span class="n">Users</span><span class="o">/</span><span class="n">derek</span><span class="o">/</span><span class="n">Downloads</span><span class="o">/</span><span class="n">felix</span><span class="o">-</span><span class="n">framework</span><span class="o">-</span>3<span class="p">.</span>0<span class="p">.</span>0<span class="o">/</span><span class="n">bundle</span><span class="o">/</span><span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">felix</span><span class="p">.</span><span class="n">bundlerepository</span><span class="o">-</span>1<span class="p">.</span>6<span class="p">.</span>2<span class="p">.</span><span class="n">jar</span>
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-
-<span class="n">h2</span><span class="p">.</span> <span class="n">Provides</span> <span class="n">lists</span><span class="p">,</span> <span class="n">pipes</span> <span class="n">and</span> <span class="n">closures</span><span class="p">.</span>
-
-<span class="o">//</span> <span class="n">lists</span> <span class="o">-</span> <span class="o">\</span><span class="p">[</span><span class="o">\</span><span class="p">]</span>
-
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-<span class="n">g</span>! <span class="n">list</span> <span class="p">=</span> <span class="p">[</span>1 2 <span class="n">a</span> <span class="n">b</span><span class="p">]</span>
+}</code></p>
+<h3 id="easy-to-use-interactively-no-unnecessary-syntax">Easy to use interactively - no unnecessary syntax.<a class="headerlink" href="#easy-to-use-interactively-no-unnecessary-syntax" title="Permanent link">&para;</a></h3>
+<ul>
+<li>
+<p>basic commands</p>
+<p><code>shell
+g! echo hello world
+hello world</code>
+- session variables</p>
+<p><code>shell
+g! msg = "hello world"
+g! echo $msg
+hello world</code></p>
+</li>
+<li>
+<p>execution quotes <code>()</code> - similar to bash backquotes</p>
+<p><code>shell
+g! (bundle 1) location
+file:/Users/derek/Downloads/felix-framework-3.0.0/bundle/org.apache.felix.bundlerepository-1.6.2.jar</code></p>
+</li>
+</ul>
+<h3 id="lists-maps-pipes-and-closures">Lists, maps, pipes and closures.<a class="headerlink" href="#lists-maps-pipes-and-closures" title="Permanent link">&para;</a></h3>
+<ul>
+<li>
+<p>lists - <code>[]</code></p>
+<p><code>shell
+g! list = [1 2 a b]
 1
 2
-<span class="n">a</span>
-<span class="n">b</span>
-
-<span class="n">g</span>! <span class="n">map</span> <span class="p">=</span> <span class="p">[</span><span class="n">Jan</span><span class="p">=</span>1 <span class="n">Feb</span><span class="p">=</span>2 <span class="n">Mar</span><span class="p">=</span>3<span class="p">]</span>
-<span class="n">Jan</span>                 1
-<span class="n">Feb</span>                 2
-<span class="n">Mar</span>                 3
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-
-<span class="o">//</span> <span class="n">pipes</span>
-
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-<span class="n">g</span>! <span class="n">bundles</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">gogo</span>
-    2<span class="o">|</span><span class="n">Active</span>     <span class="o">|</span>    1<span class="o">|</span><span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">felix</span><span class="p">.</span><span class="n">gogo</span><span class="p">.</span><span class="n">command</span> <span class="p">(</span>0<span class="p">.</span>6<span class="p">.</span>0<span class="p">)</span>
-    3<span class="o">|</span><span class="n">Active</span>     <span class="o">|</span>    1<span class="o">|</span><span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">felix</span><span class="p">.</span><span class="n">gogo</span><span class="p">.</span><span class="n">runtime</span> <span class="p">(</span>0<span class="p">.</span>6<span class="p">.</span>0<span class="p">)</span>
-    4<span class="o">|</span><span class="n">Active</span>     <span class="o">|</span>    1<span class="o">|</span><span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">felix</span><span class="p">.</span><span class="n">gogo</span><span class="p">.</span><span class="n">shell</span> <span class="p">(</span>0<span class="p">.</span>6<span class="p">.</span>0<span class="p">)</span>
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-
-<span class="o">//</span> <span class="n">closures</span> <span class="o">-</span> <span class="p">{}</span>
-
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-<span class="n">g</span>! <span class="n">echo2</span> <span class="p">=</span> <span class="p">{</span> <span class="n">echo</span> <span class="n">xxx</span> $<span class="n">args</span> <span class="n">yyy</span> <span class="p">}</span>
-<span class="n">g</span>! <span class="n">echo2</span> <span class="n">hello</span> <span class="n">world</span>
-<span class="n">xxx</span> <span class="n">hello</span> <span class="n">world</span> <span class="n">yyy</span>
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-
-<span class="n">h2</span><span class="p">.</span> <span class="n">Leverages</span> <span class="n">existing</span> <span class="n">Java</span> <span class="n">capabilities</span><span class="p">,</span> <span class="n">via</span> <span class="n">reflection</span><span class="p">.</span>
-
-<span class="o">//</span> <span class="n">exception</span> <span class="n">handling</span> <span class="o">-</span> <span class="n">console</span> <span class="n">shows</span> <span class="n">summary</span><span class="p">,</span> <span class="n">but</span> <span class="n">full</span> <span class="n">context</span> <span class="n">available</span>
-
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-<span class="n">g</span>! <span class="n">start</span> <span class="n">xxx</span>
-<span class="n">E</span><span class="p">:</span> <span class="n">Cannot</span> <span class="n">coerce</span> <span class="n">start</span><span class="p">[</span><span class="n">xxx</span><span class="p">]</span> <span class="n">to</span> <span class="n">any</span> <span class="n">of</span> <span class="p">[(</span><span class="n">Bundle</span><span class="p">)]</span>
-<span class="n">g</span>! $<span class="n">exception</span> <span class="n">printstacktrace</span>
-<span class="n">java</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">IllegalArgumentException</span><span class="p">:</span> <span class="n">Cannot</span> <span class="n">coerce</span> <span class="n">start</span><span class="p">[</span><span class="n">xxx</span><span class="p">]</span> <span class="n">to</span> <span class="n">any</span> <span class="n">of</span> <span class="p">[(</span><span class="n">Bundle</span><span class="p">)]</span>
-        <span class="n">at</span> <span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">felix</span><span class="p">.</span><span class="n">gogo</span><span class="p">.</span><span class="n">runtime</span><span class="p">.</span><span class="n">shell</span><span class="p">.</span><span class="n">Reflective</span><span class="p">.</span><span class="n">method</span><span class="p">(</span><span class="n">Reflective</span><span class="p">.</span><span class="n">java</span><span class="p">:</span>162<span class="p">)</span>
-        <span class="n">at</span> <span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">felix</span><span class="p">.</span><span class="n">gogo</span><span class="p">.</span><span class="n">runtime</span><span class="p">.</span><span class="n">shell</span><span class="p">.</span><span class="n">Command</span><span class="p">.</span><span class="n">execute</span><span class="p">(</span><span class="n">Command</span><span class="p">.</span><span class="n">java</span><span class="p">:</span>40<span class="p">)</span>
-        <span class="n">at</span> <span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">felix</span><span class="p">.</span><span class="n">gogo</span><span class="p">.</span><span class="n">runtime</span><span class="p">.</span><span class="n">shell</span><span class="p">.</span><span class="n">Closure</span><span class="p">.</span><span class="n">execute</span><span class="p">(</span><span class="n">Closure</span><span class="p">.</span><span class="n">java</span><span class="p">:</span>211<span class="p">)</span>
-        <span class="n">at</span> <span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">felix</span><span class="p">.</span><span class="n">gogo</span><span class="p">.</span><span class="n">runtime</span><span class="p">.</span><span class="n">shell</span><span class="p">.</span><span class="n">Closure</span><span class="p">.</span><span class="n">executeStatement</span><span class="p">(</span><span class="n">Closure</span><span class="p">.</span><span class="n">java</span><span class="p">:</span>146<span class="p">)</span>
-        <span class="n">at</span> <span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">felix</span><span class="p">.</span><span class="n">gogo</span><span class="p">.</span><span class="n">runtime</span><span class="p">.</span><span class="n">shell</span><span class="p">.</span><span class="n">Pipe</span><span class="p">.</span><span class="n">run</span><span class="p">(</span><span class="n">Pipe</span><span class="p">.</span><span class="n">java</span><span class="p">:</span>91<span class="p">)</span>
-<span class="p">...</span>
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-
-<span class="o">//</span> <span class="n">add</span> <span class="n">all</span> <span class="n">public</span> <span class="k">methods</span> <span class="n">on</span> <span class="n">java</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">System</span> <span class="n">as</span> <span class="n">commands</span><span class="p">:</span>
-
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-<span class="n">g</span>! <span class="n">addcommand</span> <span class="n">system</span> <span class="p">(</span><span class="n">loadClass</span> <span class="n">java</span><span class="p">.</span><span class="n">lang</span><span class="p">.</span><span class="n">System</span><span class="p">)</span>
-<span class="n">g</span>! <span class="n">system</span><span class="p">:</span><span class="n">getproperties</span>
-<span class="n">sun</span><span class="p">.</span><span class="n">io</span><span class="p">.</span><span class="n">unicode</span><span class="p">.</span><span class="n">encodingUnicodeLittle</span>
-<span class="n">java</span><span class="p">.</span><span class="n">version</span>        1<span class="p">.</span>5<span class="p">.</span>0<span class="n">_19</span>
-<span class="n">java</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">path</span>     <span class="n">bin</span><span class="o">/</span><span class="n">felix</span><span class="p">.</span><span class="n">jar</span>
-<span class="n">java</span><span class="p">.</span><span class="n">awt</span><span class="p">.</span><span class="n">graphicsenvapple</span><span class="p">.</span><span class="n">awt</span><span class="p">.</span><span class="n">CGraphicsEnvironment</span>
-<span class="n">user</span><span class="p">.</span><span class="n">language</span>       <span class="n">en</span>
-<span class="n">sun</span><span class="p">.</span><span class="n">os</span><span class="p">.</span><span class="n">patch</span><span class="p">.</span><span class="n">level</span>  <span class="n">unknown</span>
-<span class="n">os</span><span class="p">.</span><span class="n">version</span>          10<span class="p">.</span>6<span class="p">.</span>2
-<span class="p">[</span><span class="n">snip</span><span class="p">]</span>
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-
-<span class="n">h2</span><span class="p">.</span> <span class="n">Easy</span> <span class="n">to</span> <span class="n">implement</span> <span class="n">and</span> <span class="n">test</span> <span class="n">commands</span> <span class="n">without</span> <span class="n">needing</span> <span class="n">OSGi</span><span class="p">.</span>
-
-<span class="n">Command</span> <span class="n">implementations</span> <span class="n">don</span><span class="o">&#39;</span><span class="n">t</span> <span class="n">need</span> <span class="n">to</span> <span class="n">reference</span> <span class="n">any</span> <span class="n">OSGi</span> <span class="n">interfaces</span><span class="p">.</span> <span class="n">They</span> <span class="n">can</span> <span class="n">use</span> <span class="n">System</span><span class="p">.</span><span class="n">in</span><span class="p">,</span> <span class="n">System</span><span class="p">.</span><span class="n">out</span> <span class="n">and</span> <span class="n">System</span><span class="p">.</span><span class="n">err</span><span class="p">,</span> <span class="n">just</span> <span class="n">as</span> <span class="n">you</span> <span class="n">would</span> <span class="n">in</span> <span class="n">a</span> <span class="n">trivial</span> <span class="n">Java</span> <span class="n">application</spa
 n><span class="p">.</span> <span class="n">The</span> <span class="n">ThreadIO</span> <span class="n">service</span> <span class="n">transparently</span> <span class="n">manages</span> <span class="n">the</span> <span class="n">singleton</span> <span class="n">System</span><span class="p">.</span><span class="n">out</span> <span class="n">etc</span><span class="p">,</span> <span class="n">so</span> <span class="n">that</span> <span class="n">each</span> <span class="n">thread</span> <span class="n">sees</span> <span class="n">the</span> <span class="n">appropriate</span> <span class="n">stream</span><span class="p">:</span>
-
-<span class="p">{</span><span class="n">code</span><span class="p">:</span><span class="n">template</span><span class="p">=</span><span class="n">java</span><span class="p">}</span><span class="n">public</span> <span class="n">void</span> <span class="nb">cat</span><span class="p">(</span><span class="n">String</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span> <span class="n">throws</span> <span class="n">Exception</span> <span class="p">{</span>
-    <span class="k">for</span> <span class="p">(</span><span class="n">String</span> <span class="n">arg</span> <span class="p">:</span> <span class="n">args</span><span class="p">)</span>
-        <span class="n">IOUtil</span><span class="p">.</span><span class="n">copy</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">System</span><span class="p">.</span><span class="n">out</span><span class="p">);</span>
-    <span class="p">}</span>
-</pre></div>
-
-
+a
+b</code></p>
+</li>
+<li>
+<p>maps - <code>[]</code>
+    <code>shell
+    g! map = [Jan=1 Feb=2 Mar=3]
+    Jan                 1
+    Feb                 2
+    Mar                 3</code></p>
+</li>
+<li>
+<p>pipes - <code>|</code></p>
+<p><code>shell
+g! bundles | grep gogo
+    2|Active     |    1|org.apache.felix.gogo.command (0.6.0)
+    3|Active     |    1|org.apache.felix.gogo.runtime (0.6.0)
+    4|Active     |    1|org.apache.felix.gogo.shell (0.6.0)</code></p>
+</li>
+<li>
+<p>closures - <code>{}</code></p>
+<p><code>shell
+g! echo2 = { echo xxx $args yyy }
+g! echo2 hello world
+xxx hello world yyy</code></p>
+</li>
+</ul>
+<h3 id="leverages-existing-java-capabilities-via-reflection">Leverages existing Java capabilities, via reflection.<a class="headerlink" href="#leverages-existing-java-capabilities-via-reflection" title="Permanent link">&para;</a></h3>
+<ul>
+<li>
+<p>exception handling - console shows summary, but full context available</p>
+<p><code>shell
+g! start xxx
+E: Cannot coerce start[xxx] to any of [(Bundle)]
+g! $exception printstacktrace
+java.lang.IllegalArgumentException: Cannot coerce start[xxx] to any of [(Bundle)]
+        at org.apache.felix.gogo.runtime.shell.Reflective.method(Reflective.java:162)
+        at org.apache.felix.gogo.runtime.shell.Command.execute(Command.java:40)
+        at org.apache.felix.gogo.runtime.shell.Closure.execute(Closure.java:211)
+        at org.apache.felix.gogo.runtime.shell.Closure.executeStatement(Closure.java:146)
+        at org.apache.felix.gogo.runtime.shell.Pipe.run(Pipe.java:91)
+...</code></p>
+</li>
+<li>
+<p>add all public methods on <code>java.lang.System</code> as commands:</p>
+<p><code>shell
+g! addcommand system (loadClass java.lang.System)
+g! system:getproperties
+sun.io.unicode.encodingUnicodeLittle
+java.version        1.5.0_19
+java.class.path     bin/felix.jar
+java.awt.graphicsenvapple.awt.CGraphicsEnvironment
+user.language       en
+sun.os.patch.level  unknown
+os.version          10.6.2
+[snip]</code></p>
+</li>
+</ul>
+<h3 id="easy-to-implement-and-test-commands-without-needing-osgi">Easy to implement and test commands without needing OSGi.<a class="headerlink" href="#easy-to-implement-and-test-commands-without-needing-osgi" title="Permanent link">&para;</a></h3>
+<p>Command implementations don't need to reference any OSGi interfaces. They can use <code>System.in</code>, <code>System.out</code> and <code>System.err</code>, just as you would in a trivial Java application. The <code>ThreadIO</code> service transparently manages the singleton <code>System.out</code> etc, so that each thread sees the appropriate stream:
+<code>java
+public void cat(String[] args) throws Exception {
+    for (String arg : args) {
+        IOUtil.copy(arg, System.out);
+    }
+}</code></p>
 <h2 id="normal-commands-can-provide-control-primitives">Normal commands can provide control primitives.<a class="headerlink" href="#normal-commands-can-provide-control-primitives" title="Permanent link">&para;</a></h2>
-<p>{code:template=java}public void each(CommandSession session, Collection<Object> list, Function, closure) throws Exception {
+<p><code>java
+public void each(CommandSession session, Collection&lt;Object&gt; list, Function closure) throws Exception {
     for (Object x : list) {
         closure.execute(session, null);
     }
-}</p>
-<div class="codehilite"><pre><span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-<span class="n">g</span>! <span class="n">each</span> <span class="p">[</span><span class="n">Jan</span> <span class="n">Feb</span> <span class="n">Mar</span><span class="p">]</span> <span class="p">{</span> <span class="n">echo</span> $<span class="n">it</span> <span class="o">|</span> <span class="n">grep</span> <span class="p">.</span> <span class="p">}</span>
-<span class="n">Jan</span>
-<span class="n">Feb</span>
-<span class="n">Mar</span>
-<span class="p">{</span><span class="n">noformat</span><span class="p">}</span>
-
-<span class="p">{</span><span class="n">note</span><span class="p">}</span>
-<span class="n">The</span> <span class="n">default</span> <span class="o">*</span><span class="n">echo</span><span class="o">*</span> <span class="n">command</span> <span class="n">_returns_</span> <span class="n">a</span> <span class="n">String</span> <span class="n">and</span> <span class="n">does</span> <span class="n">not</span> <span class="n">write</span> <span class="n">to</span> <span class="n">System</span><span class="p">.</span><span class="n">out</span><span class="p">.</span> <span class="n">Also</span><span class="p">,</span> <span class="n">by</span> <span class="n">default</span><span class="p">,</span> <span class="n">the</span> <span class="n">console</span> <span class="n">prints</span> <span class="n">the</span> <span class="n">results</span> <span class="n">of</span> <span class="n">each</span> <span class="n">command</span><span class="p">,</span> <span class="n">so</span> <span class="o">*</span><span class="n">echo</span><span class="o">*</span> <span class="
 n">appears</span> <span class="n">to</span> <span class="n">behave</span> <span class="n">as</span> <span class="n">you</span> <span class="n">would</span> <span class="n">expect</span><span class="p">.</span>
-<span class="n">However</span><span class="p">,</span> <span class="n">the</span> <span class="n">console</span> <span class="n">does</span> <span class="n">not</span> <span class="n">see</span> <span class="n">the</span> <span class="o">*</span><span class="n">each</span><span class="o">*</span> <span class="n">closure</span> <span class="n">above</span><span class="p">,</span> <span class="n">so</span> <span class="n">the</span> <span class="n">result</span> <span class="n">of</span> <span class="n">echo</span> <span class="n">would</span> <span class="n">not</span> <span class="n">be</span> <span class="n">seen</span><span class="p">.</span> <span class="n">This</span> <span class="n">is</span> <span class="nb">why</span> <span class="n">it</span> <span class="n">is</span> <span class="n">piped</span> <span class="n">into</span> <span class="o">*</span><span class="n">grep</span><span class="o">*</span><span class="p">,</span> <span class="n">as</span> <span class="n">the</span> 
 <span class="n">_result_</span> <span class="n">of</span> <span class="n">the</span> <span class="n">command</span> <span class="n">as</span> <span class="n">well</span> <span class="n">as</span> <span class="n">its</span> <span class="n">output</span> <span class="n">is</span> <span class="n">written</span> <span class="n">to</span> <span class="n">a</span> <span class="n">pipeline</span><span class="p">.</span>
-
-<span class="p">{</span><span class="n">note</span><span class="p">}</span>
-</pre></div>
+}</code></p>
+<p><code>shell
+g! each [Jan Feb Mar] { echo $it | grep . }
+Jan
+Feb
+Mar</code></p>
+<p><strong>Note:</strong> The default <em>echo</em> command <em>returns</em> a String and does not write to System.out. Also, by default, the console prints the results of each command, so <em>echo</em> appears to behave as you would expect.
+However, the console does not see the <em>each</em> closure above, so the result of echo would not be seen. This is why it is piped into <em>grep</em>, as the <em>result</em> of the command as well as its output is written to a pipeline.</p>
       <div class="timestamp" style="margin-top: 30px; font-size: 80%; text-align: right;">
-        Rev. 1712598 by cziegeler on Wed, 4 Nov 2015 17:48:20 +0000
+        Rev. 1842572 by rotty3000 on Mon, 1 Oct 2018 23:14:14 +0000
       </div>
       <div class="trademarkFooter"> 
         Apache Felix, Felix, Apache, the Apache feather logo, and the Apache Felix project