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:36:21 UTC

svn commit: r1036193 - in /websites/staging/felix/trunk/content: ./ documentation/subprojects/apache-felix-dependency-manager/reference/dependency-resource.html

Author: buildbot
Date: Tue Oct  9 13:36:21 2018
New Revision: 1036193

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/reference/dependency-resource.html

Propchange: websites/staging/felix/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Tue Oct  9 13:36:21 2018
@@ -1 +1 @@
-1843271
+1843272

Modified: websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/reference/dependency-resource.html
==============================================================================
--- websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/reference/dependency-resource.html (original)
+++ websites/staging/felix/trunk/content/documentation/subprojects/apache-felix-dependency-manager/reference/dependency-resource.html Tue Oct  9 13:36:21 2018
@@ -88,87 +88,94 @@ h2:hover > .headerlink, h3:hover > .head
   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 resource dependency allows you to depend on a resource. A resource is a URL and you can use a filter condition based on protocol, host, port, path and URL.</p>
-<h2 id="resourcedependency">@ResourceDependency<a class="headerlink" href="#resourcedependency" title="Permanent link">&para;</a></h2>
-<p>Annotates a method of field as a Resource Dependency. A resource dependency allows you to depend on a resource. Resources are an abstraction that is introduced by the dependency manager, represented as a URL. They can be implemented to serve resources embedded in bundles, somewhere on a file system or in an http content repository server, or database.
-A resource is a URL and you can use a filter condition based on protocol, host, port, and path.</p>
-<p>Attributes:</p>
-<ul>
-<li><em>added</em>: Returns the callback method to be invoked when the service is available. This attribute is only meaningful when the annotation is applied on a class field.</li>
-<li><em>changed</em>: Returns the callback method to be invoked when the service properties have changed.</li>
-<li><em>removed</em>: Returns the callback method to invoke when the service is lost.</li>
-<li><em>required</em>: Returns whether the Service dependency is required or not.</li>
-<li><em>filter</em>: Returns the Service dependency OSGi filter.</li>
-<li><em>propagate</em>: Specifies if the resource URL properties must be propagated. If set to true, then the URL properties ("protocol"/"host"/"port"/"path") will be propagated to the service properties of the component which is using this dependency.</li>
-<li><em>name</em>: The name used when dynamically configuring this dependency from the init method. Specifying this attribute allows to dynamically configure the dependency filter and required flag from the Service's init method. All unnamed dependencies will be injected before the init() method; so from the init() method, you can then pick up whatever information needed from already injected (unnamed) dependencies, and configure dynamically your named dependencies, which will then be calculated once the init() method returns. Please refer to <a href="">Here</a>.</li>
-</ul>
-<h2 id="usage-examples">Usage Examples<a class="headerlink" href="#usage-examples" title="Permanent link">&para;</a></h2>
-<p>Here, the "VideoPlayer" component plays any provided MKV video resources</p>
-<div class="codehilite"><pre><span class="nd">@Component</span>
+<p>A resource dependency allows you to depend on a resource. A resource is a URL and you can use a filter 
+condition based on protocol, host, port, path and URL.</p>
+<p>To depend on a resource URL, you can use the createResourceDependency method from the <a href="http://felix.staging.apache.org/apidocs/dependencymanager/r12/org/apache/felix/dm/Component.html">Component interface</a>.</p>
+<p>Here is an example where a bundle activation declares a VideoPlayer component which depends on a resource URL.
+The component uses an optional dependency callback, which is invoked each time an URL is registered.</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">ctx</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">videoPlayer</span> <span class="o">=</span> <span class="n">createComponent</span><span class="o">()</span>
+                <span class="o">.</span><span class="na">setImplementation</span><span class="o">(</span><span class="n">VideoPlayer</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">createResourceDependency</span><span class="o">().</span><span class="na">setFilter</span><span class="o">(</span><span class="s">&quot;(&amp;(path=/path/to/*.txt)(host=localhost))&quot;</span><span class="o">).</span><span class="na">setCallbacks</span><span class="o">(</span><span class="s">&quot;play&quot;</span><span class="o">,</span> <span class="kc">null</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">videoPlayer</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">VideoPlayer</span> <span class="o">{</span>
-    <span class="nd">@ResourceDependency</span><span class="o">(</span><span class="n">required</span><span class="o">=</span><span class="kc">false</span><span class="o">,</span> <span class="n">filter</span><span class="o">=</span><span class="s">&quot;(path=/videos/*.mkv)&quot;</span><span class="o">)</span>
-    <span class="kt">void</span> <span class="nf">playResource</span><span class="o">(</span><span class="n">URL</span> <span class="n">video</span><span class="o">)</span> <span class="o">{</span> <span class="o">...</span> <span class="o">}</span>
+    <span class="kt">void</span> <span class="nf">play</span><span class="o">(</span><span class="n">URL</span> <span class="n">url</span><span class="o">)</span> <span class="o">{</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;play: &quot;</span> <span class="o">+</span> <span class="n">url</span><span class="o">);</span>
+
+    <span class="o">}</span>
 <span class="o">}</span>
 </pre></div>
 
 
-<p>And here is an example of a VideoProvider, which provides some videos using a web URL. Notice that Resource providers need to depend on the DependencyManager API:</p>
-<div class="codehilite"><pre><span class="kn">import</span> <span class="nn">java.net.MalformedURLException</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">java.net.URL</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">java.util.HashMap</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">java.util.Map</span><span class="o">;</span>
-
-<span class="kn">import</span> <span class="nn">org.apache.felix.dm.ResourceHandler</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.felix.dm.ResourceUtil</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.felix.dm.annotation.api.Component</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.felix.dm.annotation.api.Init</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.osgi.framework.BundleContext</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.osgi.framework.Filter</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.osgi.framework.InvalidSyntaxException</span><span class="o">;</span>
-
-<span class="nd">@Component</span>
-<span class="kd">public</span> <span class="kd">class</span> <span class="nc">VideoProvider</span>
-<span class="o">{</span>
-    <span class="c1">// Injected by reflection</span>
-    <span class="kd">private</span> <span class="kd">volatile</span> <span class="n">BundleContext</span> <span class="n">context</span><span class="o">;</span>
-    <span class="c1">// List of known resource handlers</span>
-    <span class="kd">private</span> <span class="n">Map</span><span class="o">&lt;</span><span class="n">ResourceHandler</span><span class="o">,</span> <span class="n">Filter</span><span class="o">&gt;</span> <span class="n">m_handlers</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">ResourceHandler</span><span class="o">,</span> <span class="n">Filter</span><span class="o">&gt;();</span>
-    <span class="c1">// List of known video resources</span>
-    <span class="kd">private</span> <span class="n">URL</span><span class="o">[]</span> <span class="n">m_videos</span><span class="o">;</span>
-
-    <span class="nd">@Init</span>
-    <span class="kt">void</span> <span class="nf">init</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">MalformedURLException</span>
-    <span class="o">{</span>
-       <span class="n">m_videos</span> <span class="o">=</span> <span class="k">new</span> <span class="n">URL</span><span class="o">[]</span> <span class="o">{</span>
-               <span class="k">new</span> <span class="nf">URL</span><span class="o">(</span><span class="s">&quot;http://localhost:8080/videos/video1.mkv&quot;</span><span class="o">),</span>
-               <span class="k">new</span> <span class="nf">URL</span><span class="o">(</span><span class="s">&quot;http://localhost:8080/videos/video2.mkv&quot;</span><span class="o">),</span>
+<p>And here is a component which registers some URL resources:</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">ctx</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="c1">// add resource provider</span>
+        <span class="n">URL</span><span class="o">[]</span> <span class="n">resourceURLs</span> <span class="o">=</span> <span class="k">new</span> <span class="n">URL</span><span class="o">[]</span> <span class="o">{</span>
+                <span class="k">new</span> <span class="nf">URL</span><span class="o">(</span><span class="s">&quot;file://localhost/path/to/file1.txt&quot;</span><span class="o">),</span>
+                <span class="k">new</span> <span class="nf">URL</span><span class="o">(</span><span class="s">&quot;file://localhost/path/to/file2.txt&quot;</span><span class="o">)</span>
         <span class="o">};</span>
+
+        <span class="n">Component</span> <span class="n">resourceProvider</span> <span class="o">=</span> <span class="n">createComponent</span><span class="o">()</span>
+                <span class="o">.</span><span class="na">setImplementation</span><span class="o">(</span><span class="k">new</span> <span class="n">ResourceProvider</span><span class="o">(</span><span class="n">ctx</span><span class="o">,</span> <span class="n">resourceURLs</span><span class="o">))</span>
+                <span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">dm</span><span class="o">.</span><span class="na">createServiceDependency</span><span class="o">().</span><span class="na">setService</span><span class="o">(</span><span class="n">ResourceHandler</span><span class="o">.</span><span class="na">class</span><span class="o">).</span><span class="na">setCallbacks</span><span class="o">(</span><span class="s">&quot;add&quot;</span><span class="o">,</span> <span class="s">&quot;remove&quot;</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">resourceProvider</span><span class="o">);</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+
+<span class="kd">class</span> <span class="nc">ResourceProvider</span> <span class="o">{</span>
+    <span class="kd">final</span> <span class="n">URL</span><span class="o">[]</span> <span class="n">m_resources</span><span class="o">;</span>
+    <span class="kd">final</span> <span class="n">BundleContext</span> <span class="n">m_context</span><span class="o">;</span>
+    <span class="kd">final</span> <span class="n">Map</span><span class="o">&lt;</span><span class="n">ResourceHandler</span><span class="o">,</span> <span class="n">Filter</span><span class="o">&gt;</span> <span class="n">m_handlers</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;&gt;();</span>
+
+    <span class="n">ResourceProvider</span><span class="o">(</span><span class="n">BundleContext</span> <span class="n">ctx</span><span class="o">,</span> <span class="n">URL</span> <span class="o">...</span> <span class="n">resources</span><span class="o">)</span> <span class="o">{</span>
+        <span class="n">m_context</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">;</span>
+        <span class="n">m_resources</span> <span class="o">=</span> <span class="n">resources</span><span class="o">;</span>
     <span class="o">}</span>
 
-    <span class="c1">// Track resource handlers</span>
-    <span class="nd">@ServiceDependency</span><span class="o">(</span><span class="n">required</span> <span class="o">=</span> <span class="kc">false</span><span class="o">)</span>
-    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">add</span><span class="o">(</span><span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">String</span><span class="o">&gt;</span> <span class="n">serviceProperties</span><span class="o">,</span> <span class="n">ResourceHandler</span> <span class="n">handler</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">InvalidSyntaxException</span>
-    <span class="o">{</span>
-        <span class="n">String</span> <span class="n">filterString</span> <span class="o">=</span> <span class="n">serviceProperties</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s">&quot;filter&quot;</span><span class="o">);</span>
-        <span class="n">filterString</span> <span class="o">=</span> <span class="o">(</span><span class="n">filterString</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">?</span> <span class="n">filterString</span> <span class="o">:</span> <span class="s">&quot;(path=*)&quot;</span><span class="o">;</span>
-        <span class="n">Filter</span> <span class="n">filter</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">createFilter</span><span class="o">(</span><span class="n">filterString</span><span class="o">);</span>
-        <span class="kd">synchronized</span> <span class="o">(</span><span class="k">this</span><span class="o">)</span>
-        <span class="o">{</span>
-            <span class="n">m_handlers</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">handler</span><span class="o">,</span> <span class="n">filter</span><span class="o">);</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">add</span><span class="o">(</span><span class="n">ServiceReference</span><span class="o">&lt;?&gt;</span> <span class="n">ref</span><span class="o">,</span> <span class="n">ResourceHandler</span> <span class="n">handler</span><span class="o">)</span> <span class="o">{</span>
+        <span class="n">String</span> <span class="n">filterString</span> <span class="o">=</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span> <span class="n">ref</span><span class="o">.</span><span class="na">getProperty</span><span class="o">(</span><span class="s">&quot;filter&quot;</span><span class="o">);</span>
+        <span class="n">Filter</span> <span class="n">filter</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+        <span class="k">if</span> <span class="o">(</span><span class="n">filterString</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+            <span class="k">try</span> <span class="o">{</span>
+                <span class="n">filter</span> <span class="o">=</span> <span class="n">m_context</span><span class="o">.</span><span class="na">createFilter</span><span class="o">(</span><span class="n">filterString</span><span class="o">);</span>
+            <span class="o">}</span>
+            <span class="k">catch</span> <span class="o">(</span><span class="n">InvalidSyntaxException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
+                <span class="k">return</span><span class="o">;</span>
+            <span class="o">}</span>
         <span class="o">}</span>
-        <span class="k">for</span> <span class="o">(</span><span class="n">URL</span> <span class="n">video</span> <span class="o">:</span> <span class="n">m_videos</span><span class="o">)</span>
-        <span class="o">{</span>
-            <span class="k">if</span> <span class="o">(</span><span class="n">filter</span><span class="o">.</span><span class="na">match</span><span class="o">(</span><span class="n">ResourceUtil</span><span class="o">.</span><span class="na">createProperties</span><span class="o">(</span><span class="n">video</span><span class="o">)))</span>
-            <span class="o">{</span>
-                <span class="n">handler</span><span class="o">.</span><span class="na">added</span><span class="o">(</span><span class="n">video</span><span class="o">);</span>
+        <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m_resources</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
+            <span class="k">if</span> <span class="o">(</span><span class="n">filter</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">||</span> <span class="n">filter</span><span class="o">.</span><span class="na">match</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="o">?&gt;)</span> <span class="n">ResourceUtil</span><span class="o">.</span><span class="na">createProperties</span><span class="o">(</span><span class="n">m_resources</span><span class="o">[</span><span class="n">i</span><span class="o">])))</span> <span class="o">{</span>
+                <span class="kd">synchronized</span> <span class="o">(</span><span class="n">m_handlers</span><span class="o">)</span> <span class="o">{</span>
+                    <span class="n">m_handlers</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">handler</span><span class="o">,</span> <span class="n">filter</span><span class="o">);</span>
+                <span class="o">}</span>
+                <span class="n">handler</span><span class="o">.</span><span class="na">added</span><span class="o">(</span><span class="n">m_resources</span><span class="o">[</span><span class="n">i</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">void</span> <span class="nf">remove</span><span class="o">(</span><span class="n">ServiceReference</span><span class="o">&lt;?&gt;</span> <span class="n">ref</span><span class="o">,</span> <span class="n">ResourceHandler</span> <span class="n">handler</span><span class="o">)</span> <span class="o">{</span>
+        <span class="n">Filter</span> <span class="n">filter</span><span class="o">;</span>
+        <span class="kd">synchronized</span> <span class="o">(</span><span class="n">m_handlers</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">filter</span> <span class="o">=</span> <span class="o">(</span><span class="n">Filter</span><span class="o">)</span> <span class="n">m_handlers</span><span class="o">.</span><span class="na">remove</span><span class="o">(</span><span class="n">handler</span><span class="o">);</span>
+        <span class="o">}</span>
+        <span class="k">if</span> <span class="o">(</span><span class="n">filter</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+            <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m_resources</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
+                <span class="k">if</span> <span class="o">(</span><span class="n">filter</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">||</span> <span class="n">filter</span><span class="o">.</span><span class="na">match</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="o">?&gt;)</span> <span class="n">ResourceUtil</span><span class="o">.</span><span class="na">createProperties</span><span class="o">(</span><span class="n">m_resources</span><span class="o">[</span><span class="n">i</span><span class="o">])))</span> <span class="o">{</span>
+                    <span class="n">handler</span><span class="o">.</span><span class="na">removed</span><span class="o">(</span><span class="n">m_resources</span><span class="o">[</span><span class="n">i</span><span class="o">]);</span>
+                <span class="o">}</span>
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
-<span class="o">}</span>
 </pre></div>
       <div class="timestamp" style="margin-top: 30px; font-size: 80%; text-align: right;">
-        Rev. 1665812 by marrs on Wed, 11 Mar 2015 09:02:04 +0000
+        Rev. 1843272 by pderop on Tue, 9 Oct 2018 13:35:58 +0000
       </div>
       <div class="trademarkFooter"> 
         Apache Felix, Felix, Apache, the Apache feather logo, and the Apache Felix project