blob: e12e3caa16e05bb595e52e920d7a77baa7964d62 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<title>README.md / Apache Celix</title>
<link rel="icon" href="/assets/img/favicon.ico">
<link href="/assets/css/bootstrap.min.css" rel="stylesheet">
<link href="/assets/css/style.css" rel="stylesheet">
<style>
.card-body img {
max-width: 100%;
width: 100%;
height: auto;
}
.card-body img + em {
text-decoration: underline;
}
</style>
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '9']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
</head>
<body class="light-grey">
<a href="https://github.com/apache/celix" class="github-ribbon">
<img src="/assets/img/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
</a>
<nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top">
<div class="container">
<a class="navbar-brand" href="/">
<img src="/assets/img/celix-white.svg" height="40" class="d-inline-block align-top" alt="Celix Logo">
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="/">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/download.cgi">Download</a>
</li>
<li class="nav-item dropdown active">
<a class="nav-link dropdown-toggle" href="#" id="ddDocs" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Docs
</a>
<div class="dropdown-menu" aria-labelledby="ddDocs">
<a class="dropdown-item" href="/docs/2.4.0/docs.html">2.4.0 (latest)</a>
<a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0</a>
<a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
<a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="ddContributing" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Contributing
</a>
<div class="dropdown-menu" aria-labelledby="ddContributing">
<a class="dropdown-item" href="/contributing/youatcelix.html">You at Celix</a>
<a class="dropdown-item" href="/contributing/submitting-patches.html">Submitting patches</a>
<a class="dropdown-item" href="/contributing/source-and-builds.html">Source code and builds</a>
<hr>
<a class="dropdown-item" href="/contributing/releasing.html">Releasing</a>
<a class="dropdown-item" href="/contributing/volunteers.html">Volunteers</a>
<a class="dropdown-item" href="https://whimsy.apache.org/board/minutes/Celix.html">Board Reports</a>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="ddSupport" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Support
</a>
<div class="dropdown-menu" aria-labelledby="ddSupport">
<a class="dropdown-item" href="/support/mailing-list.html">Mailing Lists</a>
<a class="dropdown-item" href="/support/issue-tracking.html">Issue Tracking</a>
</div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="ddFoundation" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
ASF
</a>
<div class="dropdown-menu" aria-labelledby="ddFoundation">
<a class="dropdown-item" href="https://www.apache.org/">ASF Home</a>
<a class="dropdown-item" href="https://www.apache.org/foundation/how-it-works.html">How it works</a>
<a class="dropdown-item" href="https://www.apache.org/licenses/">License</a>
<a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
<a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
<a class="dropdown-item" href="https://www.apache.org/security/">Security</a>
<a class="dropdown-item" href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a>
</div>
</li>
</ul>
</div>
</div>
</nav>
<div class="section">
<div class="container">
<div class="row py-4">
<div class="col-sm-12 card">
<div class="card-body pt-5">
<a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
<!--
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.
-->
<h1 id="apache-celix">Apache Celix</h1>
<p><a href="https://opensource.org/licenses/Apache-2.0"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License"></a>
<img src="https://github.com/apache/celix/workflows/Celix%20Ubuntu/badge.svg" alt="Celix Ubuntu">
<img src="https://github.com/apache/celix/workflows/Celix%20MacOS/badge.svg" alt="Celix MacOS">
<a href="https://codecov.io/gh/apache/celix"><img src="https://codecov.io/gh/apache/celix/branch/master/graph/badge.svg" alt="codecov"></a>
<a href="https://scan.coverity.com/projects/6685"><img src="https://scan.coverity.com/projects/6685/badge.svg" alt="Coverity Scan Build Status"></a></p>
<p>Apache Celix is an implementation of a dynamic service framework inspired by the OSGi specification and adapted to C
and C++ (C++17).
It is a framework to develop dynamic modular software applications using component and in-process service-oriented
programming.</p>
<h2 id="documentation">Documentation</h2>
<ul>
<li><a href="documents/building/README.html">Building Apache Celix</a></li>
<li><a href="documents/README.html">Apache Celix Intro</a></li>
</ul>
<h2 id="c-usage">C++ Usage</h2>
<h3 id="hello-world-bundle">Hello World Bundle</h3>
<p>Modularity in Celix is achieved by runtime installable bundles and dynamic - in process - services.<br>
A Celix bundle is set of resources packed in a zip containing at least a manifest and almost always
some shared library containing the bundle functionality.
A Celix bundle can be created using the Celix CMake function <code>add_celix_bundle</code>.
A Celix bundle is activated by executing the bundle entry points. For C++ bundles these bundle entry points are generated using the <code>CELIX_GEN_CXX_BUNDLE_ACTIVATOR</code> macro.</p>
<p>Celix applications (Celix containers) can be created with the Celix CMake function <code>add_celix_container</code>.
This function generates a C++ main function and is also used to configure default installed bundles.
This can be bundles provided by Celix, an other project or build by the project self.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-C++" data-lang="C++"><span style="display:flex;"><span><span style="color:#080;font-style:italic">//src/MyBundleActivator.cc
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#080">#include</span> <span style="color:#080">&lt;iostream&gt;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080">#include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080"></span>
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">MyBundleActivator</span> {
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">explicit</span> MyBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">::</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>BundleContext<span style="color:#666">&gt;&amp;</span> ctx) {
</span></span><span style="display:flex;"><span> std<span style="color:#666">::</span>cout <span style="color:#666">&lt;&lt;</span> <span style="color:#b44">&#34;Hello world from bundle with id &#34;</span> <span style="color:#666">&lt;&lt;</span> ctx<span style="color:#666">-&gt;</span>getBundleId() <span style="color:#666">&lt;&lt;</span> std<span style="color:#666">::</span>endl;
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#666">~</span>MyBundleActivator() <span style="color:#a2f;font-weight:bold">noexcept</span> {
</span></span><span style="display:flex;"><span> std<span style="color:#666">::</span>cout <span style="color:#666">&lt;&lt;</span> <span style="color:#b44">&#34;Goodbye world&#34;</span> <span style="color:#666">&lt;&lt;</span> std<span style="color:#666">::</span>endl;
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>CELIX_GEN_CXX_BUNDLE_ACTIVATOR(MyBundleActivator)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-CMake" data-lang="CMake"><span style="display:flex;"><span><span style="color:#080;font-style:italic">#CMakeLists.txt
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">MyBundle</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/MyBundleActivator.cc</span>
</span></span><span style="display:flex;"><span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">MyContainer</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">BUNDLES</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">Celix::ShellCxx</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">Celix::shell_tui</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">MyBundle</span>
</span></span><span style="display:flex;"><span>)<span style="">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#080;font-style:italic">#bash</span>
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#goto project dir</span>
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> cmake-build-debug <span style="color:#080;font-style:italic">#assuming clion cmake-build-debug dir</span>
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> deploy/MyContainer
</span></span><span style="display:flex;"><span>./MyContainer
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#Celix shell</span>
</span></span><span style="display:flex;"><span>-&gt; lb -a
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#list of all installed bundles</span>
</span></span><span style="display:flex;"><span>-&gt; <span style="color:#a2f">help</span>
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#list of all available Celix shell commands</span>
</span></span><span style="display:flex;"><span>-&gt; <span style="color:#a2f">help</span> celix::lb
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#Help info about the shell command `celix::lb`</span>
</span></span><span style="display:flex;"><span>-&gt; stop <span style="color:#666">3</span>
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#stops MyBundle</span>
</span></span><span style="display:flex;"><span>-&gt; start <span style="color:#666">3</span>
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#starts MyBundle</span>
</span></span><span style="display:flex;"><span>-&gt; stop <span style="color:#666">0</span>
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#stops the Celix framework</span>
</span></span></code></pre></div><h3 id="register-a-service">Register a service</h3>
<p>In the Celix framework, a service is a C++ object or C struct registered in the Celix framework service registry under one interface together with properties (meta information). Services can be discovered and used by bundles.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-C++" data-lang="C++"><span style="display:flex;"><span><span style="color:#080;font-style:italic">//include/ICalc.h
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#080">#pragma once
</span></span></span><span style="display:flex;"><span><span style="color:#080"></span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">ICalc</span> {
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#666">~</span>ICalc() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">add</span>(<span style="color:#0b0;font-weight:bold">int</span> a, <span style="color:#0b0;font-weight:bold">int</span> b) <span style="color:#666">=</span> <span style="color:#666">0</span>;
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-C++" data-lang="C++"><span style="display:flex;"><span><span style="color:#080;font-style:italic">//src/CalcProviderBundleActivator.cc
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#080">#include</span> <span style="color:#080">&#34;ICalc.h&#34;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080">#include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080"></span>
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">CalcProvider</span> <span style="color:#666">:</span> <span style="color:#a2f;font-weight:bold">public</span> ICalc {
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> <span style="color:#666">~</span>CalcProvider() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#a2f;font-weight:bold">override</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
</span></span><span style="display:flex;"><span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">add</span>(<span style="color:#0b0;font-weight:bold">int</span> a, <span style="color:#0b0;font-weight:bold">int</span> b) <span style="color:#a2f;font-weight:bold">override</span> { <span style="color:#a2f;font-weight:bold">return</span> a <span style="color:#666">+</span> b; }
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">CalcProviderBundleActivator</span> {
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">explicit</span> CalcProviderBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">::</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>BundleContext<span style="color:#666">&gt;&amp;</span> ctx) {
</span></span><span style="display:flex;"><span> reg <span style="color:#666">=</span> ctx<span style="color:#666">-&gt;</span>registerService<span style="color:#666">&lt;</span>ICalc<span style="color:#666">&gt;</span>(std<span style="color:#666">::</span>make_shared<span style="color:#666">&lt;</span>CalcProvider<span style="color:#666">&gt;</span>())
</span></span><span style="display:flex;"><span> .build();
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> std<span style="color:#666">::</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>ServiceRegistration<span style="color:#666">&gt;</span> reg{};
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>CELIX_GEN_CXX_BUNDLE_ACTIVATOR(CalcProviderBundleActivator)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-CMake" data-lang="CMake"><span style="display:flex;"><span><span style="color:#080;font-style:italic">#CMakeLists.txt
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">CalcProviderBundle</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/CalcProviderBundleActivator.cc</span>
</span></span><span style="display:flex;"><span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">target_include_directories</span>(<span style="color:#b44">CalcProviderBundle</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">include</span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">CalcProviderContainer</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">BUNDLES</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">Celix::ShellCxx</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">Celix::shell_tui</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">CalcProviderBundle</span>
</span></span><span style="display:flex;"><span>)<span style="">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#080;font-style:italic">#bash</span>
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#goto project dir</span>
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> cmake-build-debug <span style="color:#080;font-style:italic">#assuming clion cmake-build-debug dir</span>
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> deploy/CalcProviderBundle
</span></span><span style="display:flex;"><span>./CalcProviderBundle
</span></span></code></pre></div><h3 id="use-a-service-ad-hoc">Use a service (ad hoc)</h3>
<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-C++" data-lang="C++"><span style="display:flex;"><span><span style="color:#080;font-style:italic">//include/ICalc.h
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#080">#pragma once
</span></span></span><span style="display:flex;"><span><span style="color:#080"></span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">ICalc</span> {
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#666">~</span>ICalc() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">add</span>(<span style="color:#0b0;font-weight:bold">int</span> a, <span style="color:#0b0;font-weight:bold">int</span> b) <span style="color:#666">=</span> <span style="color:#666">0</span>;
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-C++" data-lang="C++"><span style="display:flex;"><span><span style="color:#080;font-style:italic">//src/CalcUserBundleActivator.cc
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#080">#include</span> <span style="color:#080">&lt;iostream&gt;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080">#include</span> <span style="color:#080">&#34;ICalc.h&#34;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080">#include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080"></span>
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">CalcUserBundleActivator</span> {
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">explicit</span> CalcUserBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">::</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>BundleContext<span style="color:#666">&gt;&amp;</span> ctx) {
</span></span><span style="display:flex;"><span> ctx<span style="color:#666">-&gt;</span>useService<span style="color:#666">&lt;</span>ICalc<span style="color:#666">&gt;</span>()
</span></span><span style="display:flex;"><span> .addUseCallback([](ICalc<span style="color:#666">&amp;</span> calc) {
</span></span><span style="display:flex;"><span> std<span style="color:#666">::</span>cout <span style="color:#666">&lt;&lt;</span> <span style="color:#b44">&#34;result is &#34;</span> <span style="color:#666">&lt;&lt;</span> calc.add(<span style="color:#666">2</span>, <span style="color:#666">3</span>) <span style="color:#666">&lt;&lt;</span> std<span style="color:#666">::</span>endl;
</span></span><span style="display:flex;"><span> })
</span></span><span style="display:flex;"><span> .setTimeout(std<span style="color:#666">::</span>chrono<span style="color:#666">::</span>seconds{<span style="color:#666">1</span>}) <span style="color:#080;font-style:italic">//wait for 1 second if a service is not directly found
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span> .build();
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>CELIX_GEN_CXX_BUNDLE_ACTIVATOR(CalcUserBundleActivator)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-CMake" data-lang="CMake"><span style="display:flex;"><span><span style="color:#080;font-style:italic">#CMakeLists.txt
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">CalcUserBundle</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/CalcUserBundleActivator.cc</span>
</span></span><span style="display:flex;"><span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">target_include_directories</span>(<span style="color:#b44">CalcUserBundle</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">include</span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">CalcUserContainer</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">BUNDLES</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">Celix::ShellCxx</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">Celix::shell_tui</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">CalcProviderBundle</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">CalcUserBundle</span>
</span></span><span style="display:flex;"><span>)<span style="">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#080;font-style:italic">#bash</span>
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#goto project dir</span>
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> cmake-build-debug <span style="color:#080;font-style:italic">#assuming clion cmake-build-debug dir</span>
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> deploy/CalcUserContainer
</span></span><span style="display:flex;"><span>./CalcUserContainer
</span></span></code></pre></div><h3 id="track-services">Track services</h3>
<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-C++" data-lang="C++"><span style="display:flex;"><span><span style="color:#080;font-style:italic">//include/ICalc.h
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#080">#pragma once
</span></span></span><span style="display:flex;"><span><span style="color:#080"></span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">ICalc</span> {
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#666">~</span>ICalc() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">add</span>(<span style="color:#0b0;font-weight:bold">int</span> a, <span style="color:#0b0;font-weight:bold">int</span> b) <span style="color:#666">=</span> <span style="color:#666">0</span>;
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-C++" data-lang="C++"><span style="display:flex;"><span><span style="color:#080;font-style:italic">//src/CalcTrackerBundleActivator.cc
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#080">#include</span> <span style="color:#080">&lt;mutex&gt;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080">#include</span> <span style="color:#080">&#34;ICalc.h&#34;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080">#include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080"></span>
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">CalcTrackerBundleActivator</span> {
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">explicit</span> CalcTrackerBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">::</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>BundleContext<span style="color:#666">&gt;&amp;</span> ctx) {
</span></span><span style="display:flex;"><span> tracker <span style="color:#666">=</span> ctx<span style="color:#666">-&gt;</span>trackServices<span style="color:#666">&lt;</span>ICalc<span style="color:#666">&gt;</span>()
</span></span><span style="display:flex;"><span> .build();
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">for</span> (<span style="color:#a2f;font-weight:bold">auto</span> <span style="color:#a0a000">calc</span> : tracker<span style="color:#666">-&gt;</span>getServices()) {
</span></span><span style="display:flex;"><span> std<span style="color:#666">::</span>cout <span style="color:#666">&lt;&lt;</span> <span style="color:#b44">&#34;result is &#34;</span> <span style="color:#666">&lt;&lt;</span> std<span style="color:#666">::</span>to_string(calc<span style="color:#666">-&gt;</span>add(<span style="color:#666">2</span>, <span style="color:#666">3</span>)) <span style="color:#666">&lt;&lt;</span> std<span style="color:#666">::</span>endl;
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> std<span style="color:#666">::</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>ServiceTracker<span style="color:#666">&lt;</span>ICalc<span style="color:#666">&gt;&gt;</span> tracker{};
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>CELIX_GEN_CXX_BUNDLE_ACTIVATOR(CalcTrackerBundleActivator)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-CMake" data-lang="CMake"><span style="display:flex;"><span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">CalcTrackerBundle</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/CalcTrackerBundleActivator.cc</span>
</span></span><span style="display:flex;"><span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">target_include_directories</span>(<span style="color:#b44">CalcTrackerBundle</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">include</span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">CalcTrackerContainer</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">BUNDLES</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">Celix::ShellCxx</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">Celix::shell_tui</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">CalcProviderBundle</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">CalcTrackerBundle</span>
</span></span><span style="display:flex;"><span>)<span style="">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#080;font-style:italic">#bash</span>
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#goto project dir</span>
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> cmake-build-debug <span style="color:#080;font-style:italic">#assuming clion cmake-build-debug dir</span>
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> deploy/CalcTrackerContainer
</span></span><span style="display:flex;"><span>./CalcTrackerContainer
</span></span></code></pre></div><h3 id="service-properties-and-filters">Service properties and filters</h3>
<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-C++" data-lang="C++"><span style="display:flex;"><span><span style="color:#080;font-style:italic">//src/FilterExampleBundleActivator.cc
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#080">#include</span> <span style="color:#080">&lt;iostream&gt;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080">#include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080">#include</span> <span style="color:#080">&#34;celix/IShellCommand.h&#34;</span><span style="color:#080">
</span></span></span><span style="display:flex;"><span><span style="color:#080"></span>
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">HelloWorldShellCommand</span> <span style="color:#666">:</span> <span style="color:#a2f;font-weight:bold">public</span> celix<span style="color:#666">::</span>IShellCommand {
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> <span style="color:#0b0;font-weight:bold">void</span> executeCommand(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">::</span>string<span style="color:#666">&amp;</span> <span style="color:#080;font-style:italic">/*commandLine*/</span>, <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">::</span>vector<span style="color:#666">&lt;</span>std<span style="color:#666">::</span>string<span style="color:#666">&gt;&amp;</span> <span style="color:#080;font-style:italic">/*commandArgs*/</span>, FILE<span style="color:#666">*</span> outStream, FILE<span style="color:#666">*</span> <span style="color:#080;font-style:italic">/*errorStream*/</span>) {
</span></span><span style="display:flex;"><span> fprintf(outStream, <span style="color:#b44">&#34;Hello World</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>);
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">FilterExampleBundleActivator</span> {
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">explicit</span> FilterExampleBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">::</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>BundleContext<span style="color:#666">&gt;&amp;</span> ctx) {
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">auto</span> reg1 <span style="color:#666">=</span> ctx<span style="color:#666">-&gt;</span>registerService<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>IShellCommand<span style="color:#666">&gt;</span>(std<span style="color:#666">::</span>make_shared<span style="color:#666">&lt;</span>HelloWorldShellCommand<span style="color:#666">&gt;</span>())
</span></span><span style="display:flex;"><span> .addProperty(celix<span style="color:#666">::</span>IShellCommand<span style="color:#666">::</span>COMMAND_NAME, <span style="color:#b44">&#34;command1&#34;</span>)
</span></span><span style="display:flex;"><span> .build();
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">auto</span> reg2 <span style="color:#666">=</span> ctx<span style="color:#666">-&gt;</span>registerService<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>IShellCommand<span style="color:#666">&gt;</span>(std<span style="color:#666">::</span>make_shared<span style="color:#666">&lt;</span>HelloWorldShellCommand<span style="color:#666">&gt;</span>())
</span></span><span style="display:flex;"><span> .addProperty(celix<span style="color:#666">::</span>IShellCommand<span style="color:#666">::</span>COMMAND_NAME, <span style="color:#b44">&#34;command2&#34;</span>)
</span></span><span style="display:flex;"><span> .build();
</span></span><span style="display:flex;"><span> regs.push_back(reg1);
</span></span><span style="display:flex;"><span> regs.push_back(reg2);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">auto</span> serviceIdsNoFilter <span style="color:#666">=</span> ctx<span style="color:#666">-&gt;</span>findServices<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>IShellCommand<span style="color:#666">&gt;</span>();
</span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">auto</span> serviceIdsWithFilter <span style="color:#666">=</span> ctx<span style="color:#666">-&gt;</span>findServices<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>IShellCommand<span style="color:#666">&gt;</span>(std<span style="color:#666">::</span>string{<span style="color:#b44">&#34;(&#34;</span>} <span style="color:#666">+</span> celix<span style="color:#666">::</span>IShellCommand<span style="color:#666">::</span>COMMAND_NAME <span style="color:#666">+</span> <span style="color:#b44">&#34;=&#34;</span> <span style="color:#666">+</span> <span style="color:#b44">&#34;command1)&#34;</span>);
</span></span><span style="display:flex;"><span> std<span style="color:#666">::</span>cout <span style="color:#666">&lt;&lt;</span> <span style="color:#b44">&#34;Found &#34;</span> <span style="color:#666">&lt;&lt;</span> std<span style="color:#666">::</span>to_string(serviceIdsNoFilter.size()) <span style="color:#666">&lt;&lt;</span> <span style="color:#b44">&#34; IShelLCommand services and found &#34;</span>;
</span></span><span style="display:flex;"><span> std<span style="color:#666">::</span>cout <span style="color:#666">&lt;&lt;</span> std<span style="color:#666">::</span>to_string(serviceIdsWithFilter.size()) <span style="color:#666">&lt;&lt;</span> <span style="color:#b44">&#34; IShellCommand service with name command1&#34;</span> <span style="color:#666">&lt;&lt;</span> std<span style="color:#666">::</span>endl;
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
</span></span><span style="display:flex;"><span> std<span style="color:#666">::</span>vector<span style="color:#666">&lt;</span>std<span style="color:#666">::</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">::</span>ServiceRegistration<span style="color:#666">&gt;&gt;</span> regs{};
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>CELIX_GEN_CXX_BUNDLE_ACTIVATOR(FilterExampleBundleActivator)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-CMake" data-lang="CMake"><span style="display:flex;"><span><span style="color:#080;font-style:italic">#CMakeLists.txt
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">FilterExampleBundle</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/FilterExampleBundleActivator.cc</span>
</span></span><span style="display:flex;"><span>)<span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">target_link_libraries</span>(<span style="color:#b44">FilterExampleBundle</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">Celix::shell_api</span>) <span style="color:#080;font-style:italic">#adds celix/IShellCommand.h to the include path
</span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="">
</span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">FilterExampleContainer</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">BUNDLES</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">Celix::ShellCxx</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">Celix::shell_tui</span>
</span></span><span style="display:flex;"><span> <span style="color:#b44">FilterExampleBundle</span>
</span></span><span style="display:flex;"><span>)<span style="">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#080;font-style:italic">#bash</span>
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#goto project dir</span>
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> cmake-build-debug <span style="color:#080;font-style:italic">#assuming clion cmake-build-debug dir</span>
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> deploy/FilterExampleContainer
</span></span><span style="display:flex;"><span>./FilterExampleContainer
</span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">#Celix shell</span>
</span></span><span style="display:flex;"><span>-&gt; command1
</span></span><span style="display:flex;"><span>-&gt; command2
</span></span><span style="display:flex;"><span>-&gt; <span style="color:#a2f">help</span>
</span></span></code></pre></div>
</div>
</div>
</div>
</div>
</div>
<footer class="py-3 bg-secondary">
<div class="container">
<div class="row">
<div class="col-md-8 text-center">
<p class="m-0 text-white">
Copyright &copy; 2024 The Apache Software Foundation, Licensed under
the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
<br>
Apache Celix, Celix, Apache, the Apache feather logo and the Apache Celix logo are trademarks of The Apache Software Foundation.
</p>
</div>
<div class="col-md-4 text-center">
<a href="https://www.apache.org/events/current-event.html" target="_blank">
<img src="https://www.apache.org/events/current-event-234x60.png" title="Apache Event" width="234" height="60" border="0">
</a>
</div>
</div>
</div>
</footer>
<script src="/assets/js/jquery.min.js"></script>
<script src="/assets/js/bootstrap.bundle.min.js"></script>
</body>
</html>