blob: 9ac7ad4d5e10d1cd4594c9ffa2d7725ab3a76fbb [file] [log] [blame]
<!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
https://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 - Dependency Manager - Resource Dependency</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="https://felix.apache.org/">
<img border="0" alt="Apache Felix" src="/res/logo.png">
</a>
</div>
<div class="header">
<a href="https://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="/documentation/community/project-info.html">Project Info</a> <br />
<a href="/documentation/community/contributing.html">Contributing</a> <br />
<a href="/sitemap.html">Site Map</a> <br />
<a href="https://www.apache.org/">ASF</a> <br />
<a href="https://www.apache.org/security/">Security</a> <br />
<a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a> <br />
<a href="https://www.apache.org/foundation/thanks.html">Sponsors</a> </p>
<iframe
src="https://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/apache-felix-dependency-manager.html">Apache Felix Dependency Manager</a>
</div>
<h1>Dependency Manager - Resource Dependency</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>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 define a resource dependency, you need to use the <a href="http://felix.apache.org/apidocs/dependencymanager/r13/org/apache/felix/dm/ResourceDependency.html">ResourceDependecy</a> interface.
This interface can be created using DependencyActivatorBase.createResourceDependency() or DependencyManager.createResourceDependency() methods;</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="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 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="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="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>
</pre></div>
<div class="timestamp" style="margin-top: 30px; font-size: 80%; text-align: right;">
Rev. 1844579 by pderop on Mon, 22 Oct 2018 17:07:58 +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>