Author: buildbot
Date: Fri Mar 6 09:45:59 2015
New Revision: 942560
Log:
Staging update by buildbot for felix
Modified:
websites/staging/felix/trunk/content/ (props changed)
websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager-4/guides/annotations.html
Propchange: websites/staging/felix/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Fri Mar 6 09:45:59 2015
@@ -1 +1 @@
-1664555
+1664572
Modified:
websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager-4/guides/annotations.html
==============================================================================
---
websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager-4/guides/annotations.html
(original)
+++
websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager-4/guides/annotations.html
Fri Mar 6 09:45:59 2015
@@ -223,7 +223,7 @@ you want, from ConfigAdmin ...</p>
<span class="cm"> * We store all configured words in a thread-safe data
structure, because ConfigAdmin</span>
<span class="cm"> * may invoke our updated method at any time.</span>
<span class="cm"> */</span>
- <span class="kd">private</span> <span
class="n">CopyOnWriteArrayList</span><span class="o"><</span><span
class="n">String</span><span class="o">></span> <span
class="n">m_words</span> <span class="o">=</span> <span class="k">new</span>
<span class="n">CopyOnWriteArrayList</span><span class="o"><</span><span
class="n">String</span><span class="o">>();</span>
+ <span class="kd">private</span> <span class="kd">final</span> <span
class="n">CopyOnWriteArrayList</span><span class="o"><</span><span
class="n">String</span><span class="o">></span> <span
class="n">m_words</span> <span class="o">=</span> <span class="k">new</span>
<span class="n">CopyOnWriteArrayList</span><span class="o"><</span><span
class="n">String</span><span class="o">>();</span>
<span class="cm">/**</span>
<span class="cm"> * Our Dictionary language.</span>
@@ -264,33 +264,54 @@ properties configured by ConfigAdmin. Th
properties are changing. Every properties are propagated to our service
properties,
unless the properties starting with a dot ("."). Configuration properties
starting with
a dot (".") are considered private and are not propagated.</p>
-<p>Notice that this annotation also supports optional meta type attributes,
which allow to
-customize the ConfigAdmin GUI, with custom messages, like heading/property
title,
-property type, property description, etc ...). So, let's revisit our
DisctionaryImpl
-service, but this time with meta type support:</p>
-<div class="codehilite"><pre><span
class="nd">@FactoryConfigurationAdapterService</span><span
class="o">(</span><span class="n">factoryPid</span><span
class="o">=</span><span
class="s">"DictionaryImplFactoryPid"</span><span class="o">,</span>
- <span class="n">propagate</span><span class="o">=</span><span
class="kc">true</span><span class="o">,</span>
- <span class="n">updated</span><span class="o">=</span><span
class="s">"updated"</span><span class="o">,</span>
- <span class="n">heading</span><span class="o">=</span><span
class="s">"Dictionary Services"</span><span class="o">,</span>
- <span class="n">description</span><span class="o">=</span><span
class="s">"Declare here some Dictionary instances, allowing to
instantiates some DictionaryService services for a given dictionary
language"</span><span class="o">,</span>
- <span class="n">metadata</span><span class="o">={</span>
- <span class="nd">@PropertyMetaData</span><span class="o">(</span>
- <span class="n">heading</span><span class="o">=</span><span
class="s">"Dictionary Language"</span><span class="o">,</span>
- <span class="n">description</span><span class="o">=</span><span
class="s">"Declare here the language supported by this dictionary.
"</span> <span class="o">+</span>
- <span class="s">"This property will be propagated with the
Dictionary Service properties."</span><span class="o">,</span>
- <span class="n">defaults</span><span class="o">={</span><span
class="s">"en"</span><span class="o">},</span>
- <span class="n">id</span><span class="o">=</span><span
class="s">"lang"</span><span class="o">,</span>
- <span class="n">cardinality</span><span class="o">=</span><span
class="mi">0</span><span class="o">),</span>
- <span class="nd">@PropertyMetaData</span><span class="o">(</span>
- <span class="n">heading</span><span class="o">=</span><span
class="s">"Dictionary words"</span><span class="o">,</span>
- <span class="n">description</span><span class="o">=</span><span
class="s">"Declare here the list of words supported by this
dictionary."</span><span class="o">,</span>
- <span class="n">defaults</span><span class="o">={</span><span
class="s">"hello"</span><span class="o">,</span> <span
class="s">"world"</span><span class="o">},</span>
- <span class="n">id</span><span class="o">=</span><span
class="s">"words"</span><span class="o">,</span>
- <span class="n">cardinality</span><span class="o">=</span><span
class="n">Integer</span><span class="o">.</span><span
class="na">MAX_VALUE</span><span class="o">)</span>
- <span class="o">}</span>
-<span class="o">)</span>
+<p>Notice that you can mix standard bnd metatype annotations with DM
annotations, in order
+describe configurations meta data (default values, property labels, etc ...
see http://www.aqute.biz/Bnd/MetaType).
+So, let's revisit our DisctionaryImpl service, but this time with meta type
support:</p>
+<p>First, we define an interface for describing our configuration metadata,
with bnd metatype annotations:</p>
+<div class="codehilite"><pre><span class="kn">import</span> <span
class="nn">java.util.List</span><span class="o">;</span>
+
+<span class="kn">import</span> <span
class="nn">aQute.bnd.annotation.metatype.Meta.AD</span><span class="o">;</span>
+<span class="kn">import</span> <span
class="nn">aQute.bnd.annotation.metatype.Meta.OCD</span><span class="o">;</span>
+
+<span class="nd">@OCD</span><span class="o">(</span><span
class="n">name</span><span class="o">=</span><span class="s">"Spell
Checker Dictionary (annotation)"</span><span class="o">,</span> <span
class="n">factory</span> <span class="o">=</span> <span
class="kc">true</span><span class="o">,</span>
+ <span class="n">description</span> <span class="o">=</span> <span
class="s">"Declare here some Dictionary instances, "</span><span
class="o">)</span>
+<span class="kd">public</span> <span class="kd">interface</span> <span
class="nc">DictionaryConfiguration</span> <span class="o">{</span>
+ <span class="nd">@AD</span><span class="o">(</span><span
class="n">description</span> <span class="o">=</span> <span
class="s">"Describes the dictionary language"</span><span
class="o">,</span> <span class="n">deflt</span> <span class="o">=</span> <span
class="s">"en"</span><span class="o">)</span>
+ <span class="n">String</span> <span class="nf">lang</span><span
class="o">();</span>
+
+ <span class="nd">@AD</span><span class="o">(</span><span
class="n">description</span> <span class="o">=</span> <span
class="s">"Declare here the list of words supported by this dictionary.
This properties starts with a Dot and won't be propagated with Dictionary
OSGi service properties"</span><span class="o">)</span>
+ <span class="n">List</span><span class="o"><</span><span
class="n">String</span><span class="o">></span> <span
class="n">words</span><span class="o">();</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>Next, here is our DictionaryImpl that will use the bnd "Configurable"
helper in order to retrieve the actual configuration:</p>
+<div class="codehilite"><pre><span class="kn">import</span> <span
class="nn">org.apache.felix.dm.annotation.api.FactoryConfigurationAdapterService</span><span
class="o">;</span>
+<span class="kn">import</span> <span
class="nn">org.apache.felix.dm.annotation.api.ServiceDependency</span><span
class="o">;</span>
+<span class="kn">import</span> <span
class="nn">org.apache.felix.dm.annotation.api.Start</span><span
class="o">;</span>
+<span class="kn">import</span> <span
class="nn">org.osgi.service.log.LogService</span><span class="o">;</span>
+<span class="kn">import</span> <span
class="nn">aQute.bnd.annotation.metatype.Configurable</span><span
class="o">;</span>
+
+<span class="nd">@FactoryConfigurationAdapterService</span><span
class="o">(</span><span class="n">factoryPidClass</span> <span
class="o">=</span> <span class="n">DictionaryConfiguration</span><span
class="o">.</span><span class="na">class</span><span class="o">,</span> <span
class="n">propagate</span> <span class="o">=</span> <span
class="kc">true</span><span class="o">,</span> <span class="n">updated</span>
<span class="o">=</span> <span class="s">"updated"</span><span
class="o">)</span><span class="n">factoryPid</span><span
class="o">=</span><span
class="s">"DictionaryImplFactoryPid"</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">class</span> <span
class="nc">DictionaryImpl</span> <span class="kd">implements</span> <span
class="n">DictionaryService</span> <span class="o">{</span>
- <span class="o">...</span> <span class="n">code</span> <span
class="n">same</span> <span class="n">as</span> <span class="n">before</span>
+ <span class="kd">private</span> <span class="kd">final</span> <span
class="n">CopyOnWriteArrayList</span><span class="o"><</span><span
class="n">String</span><span class="o">></span> <span
class="n">m_words</span> <span class="o">=</span> <span class="k">new</span>
<span class="n">CopyOnWriteArrayList</span><span class="o"><</span><span
class="n">String</span><span class="o">>();</span>
+
+ <span class="kd">protected</span> <span class="kt">void</span> <span
class="nf">updated</span><span class="o">(</span><span
class="n">Dictionary</span><span class="o"><</span><span
class="n">String</span><span class="o">,</span> <span class="o">?></span>
<span class="n">config</span><span class="o">)</span> <span class="o">{</span>
+ <span class="k">if</span> <span class="o">(</span><span
class="n">config</span> <span class="o">!=</span> <span
class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+ <span class="c1">// We use the bnd "Configurable" helper
in order to get an implementation for our DictionaryConfiguration
interface.</span>
+ <span class="n">DictionaryConfiguration</span> <span
class="n">cnf</span> <span class="o">=</span> <span
class="n">Configurable</span><span class="o">.</span><span
class="na">createConfigurable</span><span class="o">(</span><span
class="n">DictionaryConfiguration</span><span class="o">.</span><span
class="na">class</span><span class="o">,</span> <span
class="n">config</span><span class="o">);</span>
+
+ <span class="n">m_lang</span> <span class="o">=</span> <span
class="n">cnf</span><span class="o">.</span><span class="na">lang</span><span
class="o">();</span>
+ <span class="n">m_words</span><span class="o">.</span><span
class="na">clear</span><span class="o">();</span>
+ <span class="k">for</span> <span class="o">(</span><span
class="n">String</span> <span class="n">word</span> <span class="o">:</span>
<span class="n">cnf</span><span class="o">.</span><span
class="na">words</span><span class="o">())</span> <span class="o">{</span>
+ <span class="n">m_words</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span class="n">word</span><span
class="o">);</span>
+ <span class="o">}</span>
+ <span class="o">}</span>
+ <span class="o">}</span>
+
+ <span class="kd">public</span> <span class="kt">boolean</span> <span
class="nf">checkWord</span><span class="o">(</span><span
class="n">String</span> <span class="n">word</span><span class="o">)</span>
<span class="o">{</span>
+ <span class="k">return</span> <span class="n">m_words</span><span
class="o">.</span><span class="na">contains</span><span class="o">(</span><span
class="n">word</span><span class="o">);</span>
+ <span class="o">}</span>
<span class="o">}</span>
</pre></div>
@@ -366,30 +387,13 @@ component, but by default, the pid is s
<p>Notice that like the <em>@FactoryConfigurationAdapterService</em>, the
<em>@ConfigurationDependency</em>
annotation also supports meta type attributes.</p>
<h2 id="how-to-run-the-sample-code">How to run the sample code</h2>
-<p>Install the following bundles:</p>
-<div class="codehilite"><pre><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">configadmin</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">metatype</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">http</span><span
class="p">.</span><span class="n">jetty</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">webconsole</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">dependencymanager</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">dependencymanager</span><span class="p">.</span><span
class="n">shell</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">dependencymanager</span><span class="p">.</span><span
class="n">runtime</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">dependencymanager</span><span class="p">.</span><span
class="n">samples</span><span class="p">.</span><span
class="n">annotation</span>
-</pre></div>
-
-
-<p>Start felix.</p>
-<p>Go to web console: in the Configuration panel, edit the "Dictionary
Services" Configuration. By default, an English dictionary is displayed.
Just click on "save", then refresh your web browser (click on refresh):
you will see a new dictionary service instance. At this point, a
DictionaryService service will be enabled (with the service property
"lang=en"), and the SpellCheck component will be injected with it. Then
you should see the "spellcheck" command, when typing "help" on the gogo
shell.</p>
-<p>Just type "spellcheck hello", and the command should reply a fantastic
message, like "word hello is correct".</p>
-<p>You can also click on the "Aspect Dictionary" button, in order to decorate
the
-English dictionary with some custom words. By default, the "aspect" word is
-pre configured, but you can click on the "+" button in order to add more
words.
-Then click on Save. At this point, the English DictionaryService will be
decorated with
-the aspect service. So, now, if you type "spellcheck aspect", then the
message
-"word aspect is correct" should be displayed.</p>
+<p>Just import the Dependency source distribution in bndtools and check the
following samples:</p>
+<ul>
+<li>org.apache.felix.dependencymanager.samples/src/org/apache/felix/dependencymanager/samples/dictionary/annot/README</li>
+<li>org.apache.felix.dependencymanager.samples/src/org/apache/felix/dependencymanager/samples/dictionary/api/README</li>
+</ul>
<div class="timestamp" style="margin-top: 30px; font-size: 80%;
text-align: right;">
- Rev. 1663924 by marrs on Wed, 4 Mar 2015 10:39:19 +0000
+ Rev. 1664572 by pderop on Fri, 6 Mar 2015 09:45:33 +0000
</div>
<div class="trademarkFooter">
Apache Felix, Felix, Apache, the Apache feather logo, and the Apache
Felix project