Author: buildbot
Date: Wed Jan 11 17:37:38 2012
New Revision: 802395

Log:
Staging update by buildbot for stanbol

Modified:
    
websites/staging/stanbol/trunk/content/stanbol/docs/trunk/enhancer/STANBOL-414-specification.html

Modified: 
websites/staging/stanbol/trunk/content/stanbol/docs/trunk/enhancer/STANBOL-414-specification.html
==============================================================================
--- 
websites/staging/stanbol/trunk/content/stanbol/docs/trunk/enhancer/STANBOL-414-specification.html
 (original)
+++ 
websites/staging/stanbol/trunk/content/stanbol/docs/trunk/enhancer/STANBOL-414-specification.html
 Wed Jan 11 17:37:38 2012
@@ -195,12 +195,77 @@ enhancement engines.</p>
 </pre></div>
 
 
+<p>In addition to this I would propose to also include properties currently 
only provided by engines via the ServiceProperties interface the the properties 
of the service registration. By this it would be possible to access such 
information also via the ServiceReference without the need to retrieve the 
EnhancementEngine first.</p>
+<p>This would e.g. allow to determine the execution order of Enignes by 
directly retrieving the ServiceProperties#ENHANCEMENT_ENGINE_ORDERING directly 
+from the ServiceReference</p>
 <h3 id="enhancementenginemanager">EnhancementEngineManager</h3>
-<p>New Utility that keeps track of all active EnhancementEngines and supports 
lookup for Enhancement Engines based on the "stanbol.enhancer.engine.name" 
property.</p>
-<div class="codehilite"><pre><span class="o">+</span> <span 
class="n">getEngine</span><span class="p">(</span><span class="n">String</span> 
<span class="n">name</span><span class="p">)</span> <span class="p">:</span> 
<span class="n">EnhancementEngine</span>
-<span class="o">+</span> <span class="n">getEngines</span><span 
class="p">(</span><span class="n">String</span> <span 
class="n">name</span><span class="p">)</span> <span class="p">:</span> <span 
class="n">List</span><span class="sr">&lt;EnhancementEngine&gt;</span>
-<span class="o">+</span> <span class="n">isEngine</span><span 
class="p">(</span><span class="n">String</span> <span 
class="n">name</span><span class="p">)</span> <span class="p">:</span> <span 
class="n">boolean</span>
-<span class="o">+</span> <span class="n">getActiveEngines</span><span 
class="p">(</span><span class="n">Chain</span> <span 
class="n">chain</span><span class="p">)</span> <span class="p">:</span> <span 
class="n">Map</span><span class="sr">&lt;String,EnhancementEngine&gt;</span>
+<p>With the addition of enhancement chains and the RESTful interfaces for 
engines there will be much more components that will need to track active 
Enhancement Engines by the "stanbol.enhancer.engine.name" property and sort 
active engines by their service ranking. To satisfy this need one has two 
possible solutions:</p>
+<ol>
+<li>EnhancementEngineManager Service: OSGI Service that keeps track of all 
active engines.</li>
+<li>EngineTracker: Utility that implements EnhancementEngineManager but would 
be used similar to the <a 
href="http://www.osgi.org/javadoc/r4v42/org/osgi/util/tracker/ServiceTracker.html";>ServiceTracker</a>
 to track a single-, a specific set or all active EnhancementEngines.</li>
+</ol>
+<p>First lets define the EnhancementEngineManager interface</p>
+<div class="codehilite"><pre><span class="sr">/** Getter for the reference to 
the engine with the parsed name */</span>
+<span class="o">+</span> <span class="n">getReference</span><span 
class="p">(</span><span class="n">String</span> <span 
class="n">name</span><span class="p">)</span> <span class="p">:</span> <span 
class="n">ServiceReference</span>
+<span class="sr">/** Getter for all references to active engines with the 
parsed name */</span>
+<span class="o">+</span> <span class="n">getReferences</span><span 
class="p">(</span><span class="n">String</span> <span 
class="n">name</span><span class="p">)</span> <span class="p">:</span> <span 
class="n">List</span><span class="sr">&lt;ServiceReference&gt;</span>
+<span class="sr">/** Getter for the Engine for the given name */</span>
+<span class="o">+</span> <span class="n">getEngine</span><span 
class="p">(</span><span class="n">String</span> <span 
class="n">name</span><span class="p">)</span> <span class="p">:</span> <span 
class="n">EnhancementEngine</span>
+</pre></div>
+
+
+<h4 id="enginetracker">EngineTracker</h4>
+<p>Utility that internally uses <a 
href="http://www.osgi.org/javadoc/r4v42/org/osgi/util/tracker/ServiceTracker.html";>ServiceTracker</a>
 to keep track of active EnhancementEngines there names and service rankings. 
In addition to the implementation of the EnhancementEngineManager interface it 
would define the following Methods to construct and start/stop the tracker.</p>
+<div class="codehilite"><pre><span class="sr">/** Constructs a tracker for the 
parsed names. All if no names are parsed */</span>
+<span class="o">+</span> <span class="n">EnginesTracker</span><span 
class="p">(</span><span class="n">BundleContext</span> <span 
class="n">context</span><span class="p">,</span><span 
class="n">String</span><span class="o">...</span><span 
class="n">names</span><span class="p">)</span>
+<span class="sr">/** Constructs a tracker for the parsed names. all if names 
is NULL or empty */</span>
+<span class="o">+</span> <span class="n">EnginesTracker</span><span 
class="p">(</span><span class="n">BundleContext</span> <span 
class="n">context</span><span class="p">,</span><span class="n">Set</span><span 
class="sr">&lt;String&gt;</span> <span class="n">names</span><span 
class="p">,</span> <span class="n">ServiceTrackerCustomizer</span> <span 
class="n">customizer</span><span class="p">)</span>
+<span class="sr">/** Starts the tracking */</span>
+<span class="o">+</span> <span class="nb">open</span><span class="p">()</span>
+<span class="sr">/** Stops tracking and closes the tracker */</span>
+<span class="o">+</span> <span class="nb">close</span><span class="p">()</span>
+<span class="sr">/** Getter for the list of tracked engine names. Empty if all 
are tracked */</span>
+<span class="o">+</span> <span class="n">getTrackedEngines</span><span 
class="p">()</span> <span class="p">:</span> <span class="n">Set</span><span 
class="sr">&lt;String&gt;</span>
+</pre></div>
+
+
+<p>This utility can be used by Components that need to track a specific set of 
Engines. In addition it also allows users to provide an own 
ServiceTrackerCustomizer. This can be e.g. used to perform special actions on 
any change to an tracked Engine.</p>
+<p>A typically usage if this would be by the <em>WeightedChain</em> 
implementation that needs to track changes in referenced EnhancementEgninges to 
update the execution plan it needs to manage based on the 
ServiceProperties#ENHANCEMENT_ENGINE_ORDERING values.</p>
+<h4 id="enhancementenginemanager_service">EnhancementEngineManager Service</h4>
+<p>A Component registered for the EnhancementEngineManager service. 
Implementation could use an EngineTracker that tracks all EnhancementEngines. 
This service will be typically used by using</p>
+<div class="codehilite"><pre><span class="nv">@Reference</span>
+<span class="n">EnhancementEngineManager</span> <span 
class="n">engineManager</span><span class="p">;</span>
+</pre></div>
+
+
+<p>A typical use would be to retrieve the engines needed to asynchronously 
execute a chain</p>
+<div class="codehilite"><pre><span class="sr">//</span><span 
class="n">during</span> <span class="n">initialization</span> <span 
class="n">of</span> <span class="n">the</span> <span class="n">execution</span>
+<span class="n">Set</span><span class="sr">&lt;String&gt;</span> <span 
class="n">engineNames</span> <span class="o">=</span> <span 
class="n">chain</span><span class="o">.</span><span 
class="n">getEngines</span><span class="p">();</span>
+<span class="sr">//</span><span class="n">actually</span> <span 
class="n">this</span> <span class="n">should</span> <span class="ow">not</span> 
<span class="n">check</span> <span class="n">engines</span> <span 
class="n">referenced</span> <span class="n">by</span>
+<span class="sr">//o</span><span class="n">ptional</span> <span 
class="n">ExecutionNodes</span>
+<span class="k">for</span><span class="p">(</span><span 
class="n">String</span> <span class="n">engineName</span> <span 
class="p">:</span> <span class="n">chain</span><span class="o">.</span><span 
class="n">getEngines</span><span class="p">()){</span>
+    <span class="k">if</span><span class="p">(</span><span 
class="n">engineManager</span><span class="o">.</span><span 
class="n">getReference</span><span class="p">(</span><span 
class="n">engineName</span><span class="p">)</span> <span class="o">==</span> 
<span class="n">null</span><span class="p">){</span>
+        <span class="sr">//</span><span class="n">throw</span> <span 
class="n">exception</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+
+<span class="sr">//</span><span class="n">this</span> <span 
class="n">is</span> <span class="n">called</span> <span class="n">after</span> 
<span class="n">an</span> <span class="n">engine</span> <span 
class="n">completes</span> <span class="n">execution</span>
+<span class="sr">//</span><span class="ow">and</span> <span 
class="n">assumes</span> <span class="n">the</span> <span 
class="n">following</span> <span class="n">execution</span> <span 
class="n">states:</span>
+<span class="n">Collection</span><span class="sr">&lt;NonLiteral&gt;</span> 
<span class="n">executed</span><span class="p">;</span> <span 
class="sr">//</span><span class="n">already</span> <span 
class="n">executed</span> <span class="n">Engines</span>
+<span class="n">Collection</span><span class="sr">&lt;NonLiteral&gt;</span> 
<span class="n">running</span><span class="p">;</span> <span 
class="sr">//c</span><span class="n">urrently</span> <span 
class="n">running</span> <span class="n">Engines</span>
+
+<span class="n">Collection</span><span class="sr">&lt;NonLiteral&gt;</span> 
<span class="k">next</span> <span class="o">=</span> <span 
class="n">ExecutionPlanUtils</span><span class="o">.</span><span 
class="n">getExecuteable</span><span class="p">(</span><span 
class="n">plan</span><span class="p">,</span> <span 
class="n">executed</span><span class="p">);</span>
+<span class="k">for</span><span class="p">(</span><span 
class="n">NonLiteral</span> <span class="n">node</span> <span 
class="p">:</span> <span class="k">next</span><span class="p">){</span>
+    <span class="k">if</span><span class="p">(</span><span 
class="o">!</span><span class="n">running</span><span class="o">.</span><span 
class="n">contains</span><span class="p">(</span><span 
class="n">node</span><span class="p">)){</span>
+        <span class="n">String</span> <span class="n">engineName</span> <span 
class="o">=</span> <span class="n">EnhancementEngineHelper</span><span 
class="o">.</span><span class="n">getString</span><span class="p">(</span><span 
class="n">executionPlan</span><span class="p">,</span><span 
class="n">node</span><span class="p">,</span> <span 
class="n">EX_ENGINE</span><span class="p">));</span>
+        <span class="n">EnhancementEngine</span> <span class="n">engine</span> 
<span class="o">=</span> <span class="n">tracker</span><span 
class="o">.</span><span class="n">getEngine</span><span class="p">(</span><span 
class="n">engineName</span><span class="p">);</span>
+        <span class="k">if</span><span class="p">(</span><span 
class="n">engine</span> <span class="o">!=</span> <span 
class="n">null</span><span class="p">){</span>
+            <span class="sr">//</span> <span class="n">asynchronously</span> 
<span class="n">call</span> <span class="n">this</span> <span 
class="n">engine</span>
+        <span class="p">}</span> <span class="k">else</span> <span 
class="p">{</span>
+           <span class="sr">//c</span><span class="n">heck</span> <span 
class="k">if</span> <span class="n">optional</span> <span class="ow">and</span> 
<span class="n">throw</span> <span class="n">error</span> <span 
class="k">if</span> <span class="ow">not</span>
+        <span class="p">}</span>
+    <span class="p">}</span> <span class="sr">//</span> <span 
class="k">else</span> <span class="n">already</span> <span 
class="n">running</span> <span class="o">-&gt;</span> <span 
class="n">ignore</span>
+<span class="p">}</span>
 </pre></div>
 
 


Reply via email to