This sample illustrates the usage of the new DependencyManager annotations.

Sample description:

  This sample shows a basic "SpellChecker" application which provides a Felix "spellcheck" GOGO shell
  command. The GOGO "spellcheck" command accepts a string as parameter, which is checked for proper 
  existence. The SpellChecker class has a required/multiple (1..N) dependency over every available 
  "DictionaryService" services, which are internally used by the SpellChecker command, when checking 
  word existence).
  
  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 some meta type
  informations in the annotation, allowing to display the configuration parameters from WebConsole. 
  Each time you instantiate a factory configuration whose factory pid is "Dictionary Services", 
  then a corresponding "DictionaryService" service is instantiated and is then injected
  into the SpellChecker service. So, before testing, you first have to go to webconsole
  Configuration panel, and specify some dictionaries (see the "Dictionary Services" Factory PID).  
  Then, go to the felix GOGO 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 (from trunk, because the latest released version seems to have a problem)
     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, 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 gogo 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. 
