This sample illustrates the usage of the new DependencyManager annotations.

Sample description:

  This sample shows a basic "SpellChecker" application which provides a Felix "spellcheck" shell
  command. The SpellChecker class is a Felix Shell command (it provides a "Command" service),
  which accepts a string as parameter. So, when you type a string, the command just says if the
  specified string has been found from one of its injected dictionaries. The SpellChecker class has a
  required/multiple (1..N) dependency over any available DictionaryService.
  
  A DictionaryService is defined using a FactoryConfigurationAdapterService annotation, allowing to
  instantiate many DictionaryService service instances from webconsole. This annotation actually registers
  a ManagedServiceFactory into the Registry, and you can specify the meta type informations regarding
  the properties metadata.
   
  So, before testing, you first have to go to webconsole Configuration panel, and specify some
  dictionaries (see the DictionaryService Factory PID). 
  Then, go to the felix shell, and you will then see the "spellcheck" command (when typing "help").
  
  Notice that in the sample, you will also find a DictionaryAspect Service (DictionaryAspect.java), which
  decorates the EnglishDictionary service, by adding some additional words to *all* provided 
  DictionaryService services. The DictionaryAspect also show how to use a ConfigurationDependency annotation, 
  allowing to configure the words from webconsole. A ConfigurationDependency actually registers a ManagedService object
  in the Registry, which also implements a MetaTypeProvider service for metatype support.

How to test:

  1) Install the following bundles:

     org.apache.felix.configadmin
     org.apache.felix.metatype
     org.apache.felix.http.jetty
     org.apache.felix.webconsole

     org.apache.felix.dependencymanager
     org.apache.felix.dependencymanager.shell
     org.apache.felix.dependencymanager.runtime
     org.apache.felix.dependencymanager.samples.annotation

  2) Start felix
  3) Go to web console, in the Configuration pannel
  4) Edit the "Dictionary Services" Configuration, add some dictionaries. By default, an English dictionary is 
     displayed. Just click on "save", then click on your refresh web browser: 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 shell.

  5) Just type "spellcheck hello", and the command should reply a fantastic message, like "word hello is correct".
  
  6) You can also click on the "Aspect Dictionary" button, in order to decorate *all* Dictionaries using 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, all DictionaryService instances will be decorated with the aspect service.
     So, now, if you type "spellcheck aspect", then the message: "word aspect is correct" should be displayed. 

