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/09 13:30:09 UTC

svn commit: r1036184 - in /websites/staging/felix/trunk/content: ./ documentation/subprojects/apache-felix-dependency-manager/guides/whatsnew-r12.html

Author: buildbot
Date: Tue Oct  9 13:30:09 2018
New Revision: 1036184

Log:
Staging update by buildbot for felix

Added:
    websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/guides/whatsnew-r12.html
Modified:
    websites/staging/felix/trunk/content/   (props changed)

Propchange: websites/staging/felix/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Tue Oct  9 13:30:09 2018
@@ -1 +1 @@
-1843259
+1843260

Added: websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/guides/whatsnew-r12.html
==============================================================================
--- websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/guides/whatsnew-r12.html (added)
+++ websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/guides/whatsnew-r12.html Tue Oct  9 13:30:09 2018
@@ -0,0 +1,290 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE- 2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+  <head>
+    <title>Apache Felix - </title>
+    <link rel="icon" href="/res/favicon.ico">
+    <link rel="stylesheet" href="/res/site.css" type="text/css" media="all">
+    <link rel="stylesheet" href="/res/codehilite.css" type="text/css" media="all">
+    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+  </head>
+  <body>
+    <div class="title">
+      <div class="logo">
+        <a href="http://felix.apache.org/">
+          <img border="0" alt="Apache Felix" src="/res/logo.png">
+        </a>
+      </div>
+      <div class="header">
+        <a href="http://www.apache.org/">
+          <img border="0" alt="Apache" src="/res/apache.png">
+        </a>
+      </div>
+    </div>
+    
+    <div class="menu"> 
+      <style type="text/css">
+/* The following code is added by mdx_elementid.py
+   It was originally lifted from http://subversion.apache.org/style/site.css */
+/*
+ * Hide class="elementid-permalink", except when an enclosing heading
+ * has the :hover property.
+ */
+.headerlink, .elementid-permalink {
+  visibility: hidden;
+}
+h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
+<p><a href="/news.html">News</a>  <br />
+<a href="/license.html">License</a>  <br />
+<a href="/downloads.cgi">Downloads</a>  <br />
+<a href="/documentation.html">Documentation</a>  <br />
+<a href="/mailinglists.html">Mailing Lists</a>  <br />
+<a href="/documentation/community/contributing.html">Contributing</a>  <br />
+<a href="/sitemap.html">Site Map</a>  <br />
+<a href="http://www.apache.org/">ASF</a>  <br />
+<a href="http://www.apache.org/security/">Security</a>  <br />
+<a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>  <br />
+<a href="http://www.apache.org/foundation/thanks.html">Sponsors</a>    </p>
+<iframe
+    src="http://www.apache.org/ads/button.html"
+    style="border-width:0; float: left"
+    frameborder="0"
+    scrolling="no"
+    width="135"
+    height="135">
+</iframe>
+    </div>
+    
+    <div class="main">
+      <div class="breadcrump" style="font-size: 80%;">
+        <a href="/">Home</a>&nbsp;&raquo&nbsp;<a href="/documentation.html">Documentation</a>&nbsp;&raquo&nbsp;<a href="/documentation/subprojects.html">Apache Felix Subproject Documentation</a>&nbsp;&raquo&nbsp;<a href="/documentation/subprojects/apache-felix-dependency-manager.html">Apache Felix Dependency Manager</a>
+      </div>
+
+      <h1></h1>
+      <style type="text/css">
+/* The following code is added by mdx_elementid.py
+   It was originally lifted from http://subversion.apache.org/style/site.css */
+/*
+ * Hide class="elementid-permalink", except when an enclosing heading
+ * has the :hover property.
+ */
+.headerlink, .elementid-permalink {
+  visibility: hidden;
+}
+h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
+<p>Title: Dependency Manager - What's new in release r12?</p>
+<p>This section describes some enhancements and API modification which have been performed in the dependency manager r12 release.
+Mainly,</p>
+<ul>
+<li>annotation API has been simplified</li>
+<li>support for user-defined annotation property types</li>
+<li>DM API has been reworked to simplify the definition of aspect and adapters.</li>
+<li>Lightweight support for OSGI service scopes</li>
+<li>The dependency manager is now built using bndtools 3.5.0 as well as with bndlib 3.5.0</li>
+<li>dependencymanager-deps is not used anymore (all required build time binary dependencies are now downloaded from maven central, and the gradle wrapper jar is also downloaded from the gradlew script). Moreover semantic versioning is now using a baseline that is downloaded from maven central.</li>
+<li>released artifacts are also signed with SHA1</li>
+</ul>
+<h2 id="api-enhancements">API enhancements<a class="headerlink" href="#api-enhancements" title="Permanent link">&para;</a></h2>
+<p>Some enhancements have been done in the dm API:</p>
+<ul>
+<li>the api to define aspects and adapters have been reworked (but dm API remains backward compatible)</li>
+<li>you can now declare multiple property type interfaces when using Configuration Dependency or Factory Components (this was needed to implement the enhancements for the annotations)</li>
+<li>configuration dependency using metatypes can now declare property types</li>
+<li>Allow to specify if propagated configuration dependencies must override service service properties (it was not possible to override service properties with propagated service properties so far)</li>
+<li>Added the following signatures in Component interface:</li>
+<li>setInterface(Class serviceName, Dictionary properties)</li>
+<li>setInterface(Class[] serviceNames, Dictionary properties)</li>
+</ul>
+<h3 id="aspectadapters-api-enhancements">Aspect/Adapters API enhancements<a class="headerlink" href="#aspectadapters-api-enhancements" title="Permanent link">&para;</a></h3>
+<p>So far, aspects or adapters were defined using many methods from DependencyManager or DependencyActivatorBase classes:</p>
+<p>For example, in DependencyManager.java, we have many signatures</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">DependencyManager</span> <span class="o">{</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAdapterService</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">serviceInterface</span><span class="o">,</span> <span class="n">String</span> <span class="n">serviceFilter</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAdapterService</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">serviceInterface</span><span class="o">,</span> <span class="n">String</span> <span class="n">serviceFilter</span><span class="o">,</span> <span class="n">String</span> <span class="n">autoConfig</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAdapterService</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">serviceInterface</span><span class="o">,</span> <span class="n">String</span> <span class="n">serviceFilter</span><span class="o">,</span> <span class="n">String</span> <span class="n">add</span><span class="o">,</span> <span class="n">String</span> <span class="n">change</span><span class="o">,</span> <span class="n">String</span> <span class="n">remove</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAdapterService</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">serviceInterface</span><span class="o">,</span> <span class="n">String</span> <span class="n">serviceFilter</span><span class="o">,</span> <span class="n">String</span> <span class="n">add</span><span class="o">,</span> <span class="n">String</span> <span class="n">change</span><span class="o">,</span> <span class="n">String</span> <span class="n">remove</span><span class="o">,</span> <span class="n">String</span> <span class="n">swap</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAdapterService</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">serviceInterface</span><span class="o">,</span> <span class="n">String</span> <span class="n">serviceFilter</span><span class="o">,</span> <span class="n">String</span> <span class="n">autoConfig</span><span class="o">,</span> <span class="n">Object</span> <span class="n">callbackInstance</span><span class="o">,</span> <span class="n">String</span> <span class="n">add</span><span class="o">,</span> <span class="n">String</span> <span class="n">change</span><span class="o">,</span> <span class="n">String</span> <span class="n">remove</span><span class="o">,</span> <span class="n">String</span> <span class="n">swap</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">propagate</span><span class="o">)</span> <span class="o">{...}</span>
+
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createFactoryConfigurationAdapterService</span><span class="o">(</span><span class="n">String</span> <span class="n">factoryPid</span><span class="o">,</span> <span class="n">String</span> <span class="n">update</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">propagate</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createFactoryConfigurationAdapterService</span><span class="o">(</span><span class="n">String</span> <span class="n">factoryPid</span><span class="o">,</span> <span class="n">String</span> <span class="n">update</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">propagate</span><span class="o">,</span> <span class="n">Object</span> <span class="n">callbackInstance</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createFactoryConfigurationAdapterService</span><span class="o">(</span><span class="n">String</span> <span class="n">factoryPid</span><span class="o">,</span> <span class="n">String</span> <span class="n">update</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">propagate</span><span class="o">,</span> <span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">configType</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createFactoryConfigurationAdapterService</span><span class="o">(</span><span class="n">String</span> <span class="n">factoryPid</span><span class="o">,</span> <span class="n">String</span> <span class="n">update</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">propagate</span><span class="o">,</span> <span class="n">Object</span> <span class="n">callbackInstance</span><span class="o">,</span> <span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">configType</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAdapterFactoryConfigurationService</span><span class="o">(</span><span class="n">String</span> <span class="n">factoryPid</span><span class="o">,</span> <span class="n">String</span> <span class="n">update</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">propagate</span><span class="o">,</span><span class="n">String</span> <span class="n">heading</span><span class="o">,</span> <span class="n">String</span> <span class="n">desc</span><span class="o">,</span> <span class="n">String</span> <span class="n">localization</span><span class="o">,</span> <span class="n">PropertyMetaData</span><span class="o">[]</span> <span class="n">propertiesMetaData</span><span class="o">)</span> <span class="o">{...}</span>
+
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createBundleAdapterService</span><span class="o">(</span><span class="kt">int</span> <span class="n">bundleStateMask</span><span class="o">,</span> <span class="n">String</span> <span class="n">bundleFilter</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">propagate</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createBundleAdapterService</span><span class="o">(</span><span class="kt">int</span> <span class="n">bundleStateMask</span><span class="o">,</span> <span class="n">String</span> <span class="n">bundleFilter</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">propagate</span><span class="o">,</span> <span class="n">Object</span> <span class="n">callbackInstance</span><span class="o">,</span> <span class="n">String</span> <span class="n">add</span><span class="o">,</span> <span class="n">String</span> <span class="n">change</span><span class="o">,</span> <span class="n">String</span> <span class="n">remove</span><span class="o">)</span> <span class="o">{...}</span>
+
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createResourceAdapterService</span><span class="o">(</span><span class="n">String</span> <span class="n">resourceFilter</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">propagate</span><span class="o">,</span> <span class="n">Object</span> <span class="n">callbackInstance</span><span class="o">,</span> <span class="n">String</span> <span class="n">callbackChanged</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createResourceAdapterService</span><span class="o">(</span><span class="n">String</span> <span class="n">resourceFilter</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">propagate</span><span class="o">,</span> <span class="n">Object</span> <span class="n">callbackInstance</span><span class="o">,</span> <span class="n">String</span> <span class="n">callbackSet</span><span class="o">,</span> <span class="n">String</span> <span class="n">callbackChanged</span><span class="o">)</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createResourceAdapterService</span><span class="o">(</span><span class="n">String</span> <span class="n">resourceFilter</span><span class="o">,</span> <span class="n">Object</span> <span class="n">propagateCallbackInstance</span><span class="o">,</span> <span class="n">String</span> <span class="n">propagateCallbackMethod</span><span class="o">,</span> <span class="n">Object</span> <span class="n">callbackInstance</span><span class="o">,</span> <span class="n">String</span> <span class="n">callbackChanged</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createResourceAdapterService</span><span class="o">(</span><span class="n">String</span> <span class="n">resourceFilter</span><span class="o">,</span> <span class="n">Object</span> <span class="n">propagateCallbackInstance</span><span class="o">,</span> <span class="n">String</span> <span class="n">propagateCallbackMethod</span><span class="o">,</span> <span class="n">Object</span> <span class="n">callbackInstance</span><span class="o">,</span> <span class="n">String</span> <span class="n">callbackSet</span><span class="o">,</span> <span class="n">String</span> <span class="n">callbackChanged</span><span class="o">)</span> <span class="o">{...}</span>
+
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAspectService</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">serviceInterface</span><span class="o">,</span> <span class="n">String</span> <span class="n">serviceFilter</span><span class="o">,</span> <span class="kt">int</span> <span class="n">ranking</span><span class="o">,</span> <span class="n">String</span> <span class="n">autoConfig</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAspectService</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">serviceInterface</span><span class="o">,</span> <span class="n">String</span> <span class="n">serviceFilter</span><span class="o">,</span> <span class="kt">int</span> <span class="n">ranking</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAspectService</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">serviceInterface</span><span class="o">,</span> <span class="n">String</span> <span class="n">serviceFilter</span><span class="o">,</span> <span class="kt">int</span> <span class="n">ranking</span><span class="o">,</span> <span class="n">String</span> <span class="n">add</span><span class="o">,</span> <span class="n">String</span> <span class="n">change</span><span class="o">,</span> <span class="n">String</span> <span class="n">remove</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAspectService</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">serviceInterface</span><span class="o">,</span> <span class="n">String</span> <span class="n">serviceFilter</span><span class="o">,</span> <span class="kt">int</span> <span class="n">ranking</span><span class="o">,</span> <span class="n">String</span> <span class="n">add</span><span class="o">,</span> <span class="n">String</span> <span class="n">change</span><span class="o">,</span> <span class="n">String</span> <span class="n">remove</span><span class="o">,</span> <span class="n">String</span> <span class="n">swap</span><span class="o">)</span> <span class="o">{...}</span>
+    <span class="kd">public</span> <span class="n">Component</span> <span class="nf">createAspectService</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">serviceInterface</span><span class="o">,</span> <span class="n">String</span> <span class="n">serviceFilter</span><span class="o">,</span> <span class="kt">int</span> <span class="n">ranking</span><span class="o">,</span> <span class="n">Object</span> <span class="n">callbackInstance</span><span class="o">,</span> <span class="n">String</span> <span class="n">add</span><span class="o">,</span> <span class="n">String</span> <span class="n">change</span><span class="o">,</span> <span class="n">String</span> <span class="n">remove</span><span class="o">,</span> <span class="n">String</span> <span class="n">swap</span><span class="o">)</span> <span class="o">{...}</span>
+</pre></div>
+
+
+<p>So, in this new release, we have simplified the usage of the aspect/adapters like this:
+instead of having to use some of the many methods from the DependencyManager or DependencyActivatorBase,
+we have added some new interfaces for the aspect and adapters, and these interfaces are extending the Component interface.
+All other existing methods have been moved to DependencyManagerCompat/DependencyActivatorBaseCompat classes and the
+DependencyManager/DependencyActovatorBase classes are now extending the compat classes: this allows to simplify the
+reading of the javadocs for DependencyManager/DependencyActovatorBase.</p>
+<p>For example, let's first show how an factory pid component was declared so far (a factory pid component is one which
+can be instantated multiple times using a "factory configuration" created using standard "configuration admin" service):</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Activator</span> <span class="kd">extends</span> <span class="n">DependencyActivatorBase</span> <span class="o">{</span>
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">BundleContext</span> <span class="n">context</span><span class="o">,</span> <span class="n">DependencyManager</span> <span class="n">dm</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+        <span class="n">dm</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">createFactoryConfigurationAdapterService</span><span class="o">(</span><span class="s">&quot;my.factory.pid&quot;</span><span class="o">,</span> <span class="s">&quot;updated&quot;</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="n">MyConfig</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">setInterface</span><span class="o">(</span><span class="n">MyService</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">(),</span> <span class="kc">null</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">setImplementation</span><span class="o">(</span><span class="n">MyServiceImpl</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">createServiceDependency</span><span class="o">().</span><span class="na">setService</span><span class="o">(</span><span class="n">LogService</span><span class="o">.</span><span class="na">class</span><span class="o">)));</span> <span class="c1">// NullObject </span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>So, now, there is a new FactoryComponent interface which extends the Component interface and it contains all the
+various parameters used when declaring a factory pid component. So the example above becomes:</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Activator</span> <span class="kd">extends</span> <span class="n">DependencyActivatorBase</span> <span class="o">{</span>
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">BundleContext</span> <span class="n">context</span><span class="o">,</span> <span class="n">DependencyManager</span> <span class="n">dm</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+        <span class="n">dm</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">createFactoryComponent</span><span class="o">()</span>
+            <span class="o">.</span><span class="na">setFactoryPid</span><span class="o">(</span><span class="s">&quot;my.factory.pid&quot;</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">setPropagate</span><span class="o">(</span><span class="kc">true</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">setConfigType</span><span class="o">(</span><span class="n">MyConfig</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">setInterface</span><span class="o">(</span><span class="n">MyService</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">(),</span> <span class="kc">null</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">setImplementation</span><span class="o">(</span><span class="n">MyServiceImpl</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">createServiceDependency</span><span class="o">().</span><span class="na">setService</span><span class="o">(</span><span class="n">LogService</span><span class="o">.</span><span class="na">class</span><span class="o">)));</span> <span class="c1">// NullObject </span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>now, we explain what the new interfaces look like: Indeed as you can imagine, there is an issue when
+you extend the Component interface, because the various Component setter methods return a Component type.
+So, what we would like is to be able to introduce a generic type in the Component interface , and such
+generic type can then be used to allow the Component setter methods to return not the Component type,
+but instead return the aspect/adapter sub classes. This is what we have done, let's show a pseudo code,
+so you can understand how it works:</p>
+<p>First, the Component annotation have been reworked like this:</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">Component</span><span class="o">&lt;</span><span class="n">T</span> <span class="kd">extends</span> <span class="n">Component</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;</span> <span class="o">{</span>
+    <span class="n">T</span> <span class="nf">setInterface</span><span class="o">(</span><span class="n">String</span> <span class="n">service</span><span class="o">,</span> <span class="n">Dictionary</span> <span class="n">properties</span><span class="o">)</span>
+    <span class="n">T</span> <span class="nf">setImplementation</span><span class="o">(</span><span class="n">Object</span> <span class="n">ob</span><span class="o">);</span>
+    <span class="o">...</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>As you can see the Component annotation is now using a recursive generic type which extends the Component interface.
+And now we have for example the following AdapterComponent interface which is defined like this:</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">AdapterComponent</span> <span class="kd">extends</span> <span class="n">Component</span><span class="o">&lt;</span><span class="n">AdapterComponent</span><span class="o">&gt;</span> <span class="o">{</span>
+    <span class="n">AdapterComponent</span> <span class="nf">setAdaptee</span><span class="o">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span> <span class="n">service</span><span class="o">,</span> <span class="n">String</span> <span class="n">filter</span><span class="o">);</span>
+    <span class="n">AdapterComponent</span> <span class="nf">setAdapteeCallbacks</span><span class="o">(</span><span class="n">String</span> <span class="n">add</span><span class="o">,</span> <span class="n">String</span> <span class="n">change</span><span class="o">,</span> <span class="n">String</span> <span class="n">remove</span><span class="o">,</span> <span class="n">String</span> <span class="n">swap</span><span class="o">);</span>
+    <span class="o">...</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>So, now, an adapter component can be defined like this:</p>
+<div class="codehilite"><pre><span class="n">Component</span> <span class="n">adapter</span> <span class="o">=</span> <span class="n">createAdapterComponent</span><span class="o">()</span>
+   <span class="o">.</span><span class="na">setAdaptee</span><span class="o">(</span><span class="n">Adaptee</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="s">&quot;(foo=bar)&quot;</span><span class="o">)</span>
+   <span class="o">.</span><span class="na">setAdapteeCallbacks</span><span class="o">(</span><span class="s">&quot;setAdaptee&quot;</span><span class="o">,</span> <span class="s">&quot;changeAdaptee&quot;</span><span class="o">,</span> <span class="kc">null</span><span class="o">,</span> <span class="kc">null</span><span class="o">)</span>
+   <span class="o">.</span><span class="na">setImplementation</span><span class="o">(</span><span class="n">AdapterImpl</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
+   <span class="o">.</span><span class="na">setInterface</span><span class="o">(</span><span class="n">AdapterService</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="kc">null</span><span class="o">)</span>
+   <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">createServiceDependency</span><span class="o">().</span><span class="na">setService</span><span class="o">(</span><span class="n">LogService</span><span class="o">.</span><span class="na">class</span><span class="o">));</span>
+</pre></div>
+
+
+<h3 id="support-for-multiple-configuration-types-in-callbacks">Support for multiple configuration types in callbacks<a class="headerlink" href="#support-for-multiple-configuration-types-in-callbacks" title="Permanent link">&para;</a></h3>
+<p>The ConfigurationDependency and Factory components can now support updated callbacks with multiple configuration types,
+for example, the following Activator defines a factory component (using the enhanced api) and multiple configuration
+types can now be provided:</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Activator</span> <span class="kd">extends</span> <span class="n">DependencyActivatorBase</span> <span class="o">{</span>
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">BundleContext</span> <span class="n">context</span><span class="o">,</span> <span class="n">DependencyManager</span> <span class="n">dm</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+        <span class="n">Component</span> <span class="n">factoryComponent</span> <span class="o">=</span> <span class="n">createFactoryComponent</span><span class="o">()</span>
+            <span class="o">.</span><span class="na">setFactoryPid</span><span class="o">(</span><span class="n">pid</span><span class="o">).</span>
+            <span class="o">.</span><span class="na">setConfigType</span><span class="o">(</span><span class="n">MyConfig1</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">MyConfig2</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">setImplementation</span><span class="o">(</span><span class="n">MyComponent</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
+        <span class="n">dm</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">factoryComponent</span><span class="o">);</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyComponent</span> <span class="o">{</span>
+    <span class="kt">void</span> <span class="nf">updated</span><span class="o">(</span><span class="n">MyConfig1</span> <span class="n">cnf1</span><span class="o">,</span> <span class="n">MyConfig2</span> <span class="n">cnf2</span><span class="o">)</span> <span class="o">{</span> <span class="o">...</span> <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>Moreover, you can define a Dictionary parameter as the first argument in the updated callback, because sometimes,
+it's useful to be injected with the raw dictionary configuration, as well as with the configuration types.
+Example:</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyComponent</span> <span class="o">{</span>
+    <span class="kt">void</span> <span class="nf">updated</span><span class="o">(</span><span class="n">Dictionary</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Object</span><span class="o">&gt;</span> <span class="n">rawConfig</span><span class="o">,</span> <span class="n">MyConfig1</span> <span class="n">cnf1</span><span class="o">,</span> <span class="n">MyConfig2</span> <span class="n">cnf2</span><span class="o">)</span> <span class="o">{</span> <span class="o">...</span> <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>so, the new signatures for the updated callbacks are now the following (for both ConfigurationDependency and Factory Component):</p>
+<div class="codehilite"><pre><span class="n">updated</span><span class="o">(</span><span class="n">Dictionary</span> <span class="n">cnf</span><span class="o">)</span>
+<span class="n">updated</span><span class="o">(</span><span class="n">Component</span> <span class="n">comp</span><span class="o">,</span> <span class="n">Dictionary</span> <span class="n">cnf</span><span class="o">)</span>
+<span class="n">updated</span><span class="o">(</span><span class="n">Component</span> <span class="n">comp</span><span class="o">,</span> <span class="n">Property</span> <span class="n">interfaces</span> <span class="o">...)</span>
+<span class="n">updated</span><span class="o">(</span><span class="n">Property</span> <span class="n">interfaces</span> <span class="o">...)</span>
+<span class="n">updated</span><span class="o">(</span><span class="n">Dictionary</span> <span class="n">cnf</span><span class="o">,</span> <span class="n">Property</span> <span class="n">interfaces</span> <span class="o">...)</span>
+<span class="n">updated</span><span class="o">(</span><span class="n">Component</span> <span class="n">comp</span><span class="o">,</span> <span class="n">Dictionary</span> <span class="n">cnf</span><span class="o">,</span> <span class="n">Property</span> <span class="n">interfaces</span> <span class="o">...)</span>
+</pre></div>
+
+
+<h2 id="annotations-enhancements-and-changes">Annotations enhancements and changes<a class="headerlink" href="#annotations-enhancements-and-changes" title="Permanent link">&para;</a></h2>
+<p>Essentially, the following enhancements and modifications have been done regarding annotations:</p>
+<ul>
+<li>added support for new user defined property type annotations (similar to OSGI R7).</li>
+<li>annotations using standard r7 @ComponentPropertyType are also supported. Indeed, not only declarative service is using this annotation, other r7 apis like jaxrs whiteboard are also defining some annotations that are themselves annotated with @ComponentPropertyType; so it is important to support this annotation (The dm annotation plugin has been enhanced by reusing some part of the ds annotation scanner from bndlib, which is full of reusable useful code which has been applied to dm (scanning of property types, PREFIX_, etc ...)</li>
+<li>Allow ServiceDependency to auto detect the service type when the annotation is applied on a collection class field</li>
+<li>removed FactoryComponentAdapterService (some attributes have been added in the Component annotation in order to declare factory pid components with the @Component annotation)</li>
+<li>removed some old annotations / attributes. The attributes and annotations related to metatype have been removed since you can now use the standard metatype annotations. if users need to old version, then they can simply use the previous 4.2.1 from old dm annotation api. Notice that the dm runtime is compatible with old and new annotations version, so you can use latest dm annotation runtime and old annotation api.</li>
+<li>removed "dereference" attribute in ServiceDependencyAnnotation, because we can now infer if the service dependency callbacks accepts a ServiceReference or a ServiceObjects parameter</li>
+<li>propagated configuration dependencies are now taking precedence over component service properties, meaning that a component is defined with some service properties, then the service properties which are also found from the propagated configuration will be overriden (by the configuration properties)</li>
+<li>Since some incompatible changes have been made, the major version of the annotation bundle has been bumped to 5.0.0.</li>
+</ul>
+<h3 id="not-backward-compatible-annotation-changes">Not backward compatible annotation changes<a class="headerlink" href="#not-backward-compatible-annotation-changes" title="Permanent link">&para;</a></h3>
+<p>This sections describes what has been removed in the annotation api:</p>
+<ul>
+<li>removed FactoryConfigurationAdapterService annotation, which was too verbose. when you need to define some factory pid component, just reuse the @Component annotation and declare the new factoryPid/propagate/updated attributes that have been added in the @Component annotation</li>
+<li>Removed PropertyMetadata annotation: it was related to metatypes, but as of today, osgi metatypes can be defined using standard metatype annotations. No need to support this anymore.</li>
+<li>Removed ResourceAdapterService and ResourceDependency annotations because it was needed to depend on some classes from the dependency manager API. The DM Api should be used directly.</li>
+<li>Removed the following attributes from the Component annotation: -- FACTORY_NAME -- FACTORY_INSTANCE -- factorySet -- factoryMethod These attributes were used to be able to create component instances multiple times. Now, simply use factoryPid Component attribute and use standard Configuration Admin in order to instantiate multiple instances of a given service (using factory configuration).</li>
+<li>Removed PropertyMetaData annotation, which was related to osgi metatype. Simply use standard metatype annotation.</li>
+<li>propagated configuration dependencies are now taking precedence over component service properties, meaning that a component is defined with some service properties, then the service properties which are also found from the propagated configuration will be overriden (by the configuration properties)</li>
+</ul>
+      <div class="timestamp" style="margin-top: 30px; font-size: 80%; text-align: right;">
+        Rev. 1843260 by pderop on Tue, 9 Oct 2018 13:29:52 +0000
+      </div>
+      <div class="trademarkFooter"> 
+        Apache Felix, Felix, Apache, the Apache feather logo, and the Apache Felix project
+        logo are trademarks of The Apache Software Foundation. All other marks mentioned
+        may be trademarks or registered trademarks of their respective owners.
+      </div>
+    </div>
+  </body>
+</html>