<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>The C++ Micro Services Blog</title>
 <link href="http://blog.cppmicroservices.org/atom.xml" rel="self"/>
 <link href="http://blog.cppmicroservices.org"/>
 <updated>2014-01-11T03:06:55-08:00</updated>
 <id>http://blog.cppmicroservices.org</id>
 <author>
   <name>Sascha Zelzer</name>
   <email>sascha.zelzer@gmail.com</email>
 </author>

 
 <entry>
   <title>C++ Micro Services 2.1.0 released</title>
   <link href="http://blog.cppmicroservices.org/2014/01/11/cppmicroservices-2.1.0"/>
   <updated>2014-01-11T00:00:00-08:00</updated>
   <id>hhttp://blog.cppmicroservices.org/2014/01/11/cppmicroservices-2.1.0</id>
   <content type="html">
&lt;p&gt;Version 2.1.0 of the C++ Micro Services library has just been released. You can get the
sources at the &lt;a href=&quot;http://cppmicroservices.org/download.html&quot;&gt;download page&lt;/a&gt; or directly
from the &lt;a href=&quot;https://github.com/saschazelzer/CppMicroServices/releases&quot;&gt;GitHub releases page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This release introduces full support for Mac OS X Mavericks and fixes a couple of bugs.
See the &lt;a href=&quot;https://github.com/saschazelzer/CppMicroServices/releases/tag/v2.1.0&quot;&gt;Release Notes&lt;/a&gt;
for details. It is a minor release and fully backwards compatible with client code written
for version 2.0.0.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>C++ Micro Services 2.0.0 released</title>
   <link href="http://blog.cppmicroservices.org/2013/12/23/cppmicroservices-2.0.0"/>
   <updated>2013-12-23T00:00:00-08:00</updated>
   <id>hhttp://blog.cppmicroservices.org/2013/12/23/cppmicroservices-2.0.0</id>
   <content type="html">
&lt;p&gt;Today, the C++ Micro Services library version 2.0.0 has been released. You can get the
sources at the &lt;a href=&quot;http://cppmicroservices.org/download.html&quot;&gt;download page&lt;/a&gt; or directly
from the &lt;a href=&quot;https://github.com/saschazelzer/CppMicroServices/releases&quot;&gt;GitHub releases page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This release marks a significant milestone in the evolution of the C++ Micro Services API.
The most notable changes and new features are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Service objects do not need to inherit from a common base class any more.&lt;/li&gt;
  &lt;li&gt;New templated service layer API leading to Improved compile time type checking.&lt;/li&gt;
  &lt;li&gt;Added module and service hooks as specified in the OSGi Core Release 5.&lt;/li&gt;
  &lt;li&gt;Implemented &lt;a href=&quot;http://www.osgi.org/Download/File?url=/download/osgi-early-draft-2013-03.pdf&quot;&gt;RFC 195 Service Scopes&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Modules can retrieve a module specific file-system path for storing persistent data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a detailed description of the new features, please read the next section.&lt;/p&gt;

&lt;h2 id=&quot;new-features&quot;&gt;New features&lt;/h2&gt;

&lt;p&gt;The following paragraphs demonstrate the usage of the main new features and changes in the 2.0.0 API.&lt;/p&gt;

&lt;h3 id=&quot;no-service-base-class&quot;&gt;No service base class&lt;/h3&gt;

&lt;p&gt;Version 1.0.0 required service implementations to inherit from a common base class. This requirement
has been removed and services now just need to inherit from the interfaces against which they will
be registered with the service registry:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;cpp&quot;&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;virtual&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  
  &lt;span class=&quot;c1&quot;&gt;// API ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;US_DECLARE_SERVICE_INTERFACE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;com.mycompany.myinterface&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyService&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// implementation ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;templated-service-layer-api&quot;&gt;Templated service layer API&lt;/h3&gt;

&lt;p&gt;The service layer API has been templated and classes like &lt;code&gt;ServiceReference&lt;/code&gt; and &lt;code&gt;ServiceRegistration&lt;/code&gt; are
now templates. This improves compile time type checking when working with (multiple) service interfaces.
Registering and retrieving services now looks like:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;cpp&quot;&gt;&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ModuleContext&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetModuleContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceRegistration&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RegisterService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceReference&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetServiceReference&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;myInterface&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;reg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Unregister&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;module-and-service-hooks&quot;&gt;Module and Service Hooks&lt;/h3&gt;

&lt;p&gt;The OSGi service layer specifies module and service hooks, which offer clients an API to closely
interact with the service registry. See the &lt;a href=&quot;http://cppmicroservices.org/doc_2_0/MicroServices_ServiceHooks.html&quot;&gt;Service Hooks&lt;/a&gt; documentation for an overview or read the original OSGi Core specifications for an
in-depth description.&lt;/p&gt;

&lt;h3 id=&quot;service-scopes&quot;&gt;Service Scopes&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://www.osgi.org/Download/File?url=/download/osgi-early-draft-2013-03.pdf&quot;&gt;RFC 195 Service Scopes&lt;/a&gt;
has been implemented in the C++ Micro Services library. In version 1.0.0, services essentially had
two &lt;em&gt;scopes&lt;/em&gt; - singleton and module scope - although they weren’t named as such. Service objects were
either shared among all clients or module-specific service instances were provided by the service
registry if the service inherited the
&lt;a href=&quot;http://cppmicroservices.org/doc_2_0/classServiceFactory.html&quot;&gt;us::ServiceFactory&lt;/a&gt; class. The same
mechanism is still supported, but the additional &lt;em&gt;prototype&lt;/em&gt; scope was added. Services can now support
three kind of scopes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Singleton - One service instance for all clients&lt;/li&gt;
  &lt;li&gt;Module - One service instance per module (constructed via &lt;a href=&quot;http://cppmicroservices.org/doc_2_0/classServiceFactory.html&quot;&gt;us::ServiceFactory&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Prototype (new) - As many instances as requested (constructed via &lt;a href=&quot;http://cppmicroservices.org/doc_2_0/structPrototypeServiceFactory.html&quot;&gt;us::PrototypeServiceFactory&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The newly introduced service property &lt;a href=&quot;http://cppmicroservices.org/doc_2_0/namespaceServiceConstants.html#a7745368b1cb8eafeafb0259822302b9b&quot;&gt;SERVICE_SOPE&lt;/a&gt; allows clients to look up the supported scope of a ServiceReference object.&lt;/p&gt;

&lt;p&gt;Here is an example how to provide and consume services with prototype scope:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;cpp&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyServicePrototypeFactory&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PrototypeServiceFactory&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;nl&quot;&gt;public:&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InterfaceMap&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GetService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Module&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/*caller*/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                              &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceRegistrationBase&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/*reg*/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;MyService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MakeInterfaceMap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;UngetService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Module&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/*caller*/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceRegistrationBase&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/*reg*/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InterfaceMap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ExtractInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Register the prototype factory&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ModuleContext&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetModuleContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceFactory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;myPrototypeFactory&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyServicePrototypeFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceRegistration&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RegisterService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;myPrototypeFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Get new service instances based on the prototype&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceReference&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetServiceReference&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetProperty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SERVICE_SCOPE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceConstants&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SCOPE_PROTOTYPE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Not a prototype scope service. Keep going or bail out ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceObjects&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;svcObjects&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetServiceObjects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MyInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;myServiceInstance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;svcObjects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Do something ...&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// The us::ServiceObjects class &amp;quot;ungets&amp;quot; all instances automatically on destruction&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// and all pointers to MyInterface instances become invalid. &lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;reg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Unregister&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;myPrototypeFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&quot;breaking-changes&quot;&gt;Breaking changes&lt;/h2&gt;

&lt;p&gt;Version 2.0.0 introduces a couple of &lt;a href=&quot;https://github.com/saschazelzer/CppMicroServices/wiki/API-changes-in-version-2.0.0&quot;&gt;breaking API changes&lt;/a&gt;
compared to version 1.0.0. Please ask for support in the &lt;a href=&quot;http://forum.cppmicroservices.org/&quot;&gt;CppMicroservices Forum&lt;/a&gt;
if you have trouble with migrating to version 2.0.0.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;The C++ Micro Services library API will continue to evolve as new OSGi features are specified and fit into
the scope of this library. However, the evolution will probably be at a much slower pace when compared
to the changes between version 1.0.0 and 2.0.0. Instead, the future development focus will be on
implementing OSGi Core and Compendium specifications in separate repositories,  based on the C++ Micro
Services library. Most likely, the Config Admin and Declarative Services specifications will be
worked on first.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>C++ Micro Services 1.0.0 released</title>
   <link href="http://blog.cppmicroservices.org/2013/07/19/cppmicroservices-1.0.0"/>
   <updated>2013-07-19T00:00:00-07:00</updated>
   <id>hhttp://blog.cppmicroservices.org/2013/07/19/cppmicroservices-1.0.0</id>
   <content type="html">
&lt;p&gt;As of today, the C++ Micro Services library version 1.0.0 is available. You can get the
sources at the &lt;a href=&quot;http://cppmicroservices.org/download.html&quot;&gt;download page&lt;/a&gt; or directly
from the &lt;a href=&quot;https://github.com/saschazelzer/CppMicroServices/releases&quot;&gt;GitHub releases page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;During the last months a few notable improvements and additions took place. Among these are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A &lt;a href=&quot;http://cppmicroservices.org/doc_1_0/MicroServices_Resources.html&quot;&gt;resources system&lt;/a&gt;
for embedding arbitrary files into a module.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Install&lt;/em&gt; support on all supported platforms, including installation of API documentation.&lt;/li&gt;
  &lt;li&gt;Performance improvements in the service registry&lt;/li&gt;
  &lt;li&gt;Added new public class &lt;a href=&quot;http://cppmicroservices.org/doc_1_0/classSharedLibrary.html&quot;&gt;us::SharedLibrary&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;General overhaul of the high-level documentation, adding an exhaustive
&lt;a href=&quot;http://cppmicroservices.org/doc_1_0/MicroServices_Tutorials.html&quot;&gt;tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, the usual bug fixing and maintenance took place. Please report any issues you
have with this release.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;The 1.0.0 release will be maintained for quite some time, but will likely not receive any more
feature additions. Work on version 2 has already started and there will be a couple of important
changes and improvements. The goal for version 2 is to get rid of the &lt;em&gt;base class requirement&lt;/em&gt;,
meaning the service implementations won’t need to inherit from a common base class anymore.
Further, the handling of type information of services is going to be improved, similar to the
introduction of the generics-based API in OSGi 4.3. Compare the current code for retrieving
a service&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;cpp&quot;&gt;&lt;span class=&quot;n&quot;&gt;ServiceReference&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetServiceReference&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDictionaryService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;IDictionaryService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dict&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDictionaryService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;with the version 2 way:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;cpp&quot;&gt;&lt;span class=&quot;n&quot;&gt;ServiceReference&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDictionaryService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetServiceReference&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IDictionaryService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;IDictionaryService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dict&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There will be no need for dynamic casts anymore (which has been hidden in the templated
GetService method.&lt;/p&gt;

&lt;p&gt;Another planned feature for version 2 is the implementation of &lt;em&gt;Servivce Scopes&lt;/em&gt; (RFC 195)
as specified in the &lt;a href=&quot;http://www.osgi.org/Download/File?url=/download/osgi-early-draft-2013-03.pdf&quot;&gt;OSGi Early Draft 2013.03&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>RFP 156 Native OSGi available</title>
   <link href="http://blog.cppmicroservices.org/2013/06/14/native-osgi-rfp"/>
   <updated>2013-06-14T00:00:00-07:00</updated>
   <id>hhttp://blog.cppmicroservices.org/2013/06/14/native-osgi-rfp</id>
   <content type="html">
&lt;p&gt;&lt;a href=&quot;https://www.osgi.org/bugzilla/show_bug.cgi?id=165&quot;&gt;RFP 156&lt;/a&gt; entitled &lt;em&gt;Native OSGi&lt;/em&gt; has been
published on the OSGi bug tracker a month ago. It aims at reviving parts of RFP 89 (Universal OSGi)
with a focus on providing an OSGi Core specification for the C and C++ programming languages.&lt;/p&gt;

&lt;p&gt;The joined efforts of different people interested in creating a native OSGi specification and
implementation started back in May last year during a
&lt;a href=&quot;http://blog.cppmicroservices.org/2012/05/26/native-osgi-meeting-hengelo&quot;&gt;Native OSGi Developers Meeting&lt;/a&gt;
in Hengelo.
Since then there have been presentations about the idea of Native OSGi at the OSGi Community
Event 2012 (&lt;a href=&quot;http://blog.cppmicroservices.org/2012/09/09/native-osgi-at-osgi-con&quot;&gt;link&lt;/a&gt;)
and at ApacheCon Europe 2012 (&lt;a href=&quot;http://www.apachecon.eu/schedule/presentation/102/&quot;&gt;link&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;With the help and feedback from people involved in the OSGi specifications, RFP 156 finally was published.
I encourage interested parties to contribute to it by adding comments, use cases, requirements, etc. to
the &lt;a href=&quot;https://www.osgi.org/bugzilla/show_bug.cgi?id=165&quot;&gt;Bugzilla ticket&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Native OSGi at the OSGi Community Event 2012</title>
   <link href="http://blog.cppmicroservices.org/2012/09/09/native-osgi-at-osgi-con"/>
   <updated>2012-09-09T00:00:00-07:00</updated>
   <id>hhttp://blog.cppmicroservices.org/2012/09/09/native-osgi-at-osgi-con</id>
   <content type="html">
&lt;p&gt;Together with Alexander Broekhuis, I will be talking at the &lt;a href=&quot;http://www.osgi.org/CommunityEvent2012/HomePage&quot;&gt;OSGi Community Event 2012&lt;/a&gt;
in Ludwigsburg (Germany) about Native OSGi. The talk will be a 55 minutes extended talk, organized as two
25 minutes talks (plus discussion). Here is the &lt;a href=&quot;http://www.eclipsecon.org/europe2012/sessions/native-osgi-modular-software-development-native-world&quot;&gt;talk abstract&lt;/a&gt;
and the &lt;a href=&quot;http://www.eclipsecon.org/europe2012/sessions/native-osgi-modular-software-development-native-world-part-2&quot;&gt;second part&lt;/a&gt;. There will also be another talk related to Native OSGi, called &lt;a href=&quot;http://www.eclipsecon.org/europe2012/sessions/universal-declarative-services&quot;&gt;Universal Declarative Services&lt;/a&gt;,
at which you should definitely have a look at.&lt;/p&gt;

&lt;p&gt;This year, the OSGi Community Event is co-located with &lt;a href=&quot;http://www.eclipsecon.org/europe2012/&quot;&gt;EclipseCon Europe 2012&lt;/a&gt; and
there is a nice &lt;a href=&quot;http://www.eclipsecon.org/europe2012/program/session-schedule&quot;&gt;Session Schedule&lt;/a&gt; overview available.
I am looking forward to many interesting discussions about Native OSGi and to meet some of the community members in
real life (again). If you are interested in Native OSGi, you should definitely consider to register for the OSGi Community Event!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.eclipsecon.org/europe2012&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.eclipsecon.org/europe2012/sites/eclipsecon.org.europe2012/files/480x60_0.png?1332285272&quot; height=&quot;60&quot; width=&quot;480&quot; alt=&quot;EclipseCon Europe 2012&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>First Native OSGi Developers Meeting</title>
   <link href="http://blog.cppmicroservices.org/2012/05/26/native-osgi-meeting-hengelo"/>
   <updated>2012-05-26T00:00:00-07:00</updated>
   <id>hhttp://blog.cppmicroservices.org/2012/05/26/native-osgi-meeting-hengelo</id>
   <content type="html">
&lt;p&gt;On the 22nd of May 2012 the first Native OSGi developers meeting was hosted by &lt;a href=&quot;http://www.thalesgroup.com/NLHome/&quot;&gt;Thales&lt;/a&gt;
(Hengelo, Netherlands). Detailed notes about the meeting can be found &lt;a href=&quot;https://github.com/abroekhuis/NativeOSGi/wiki/Meeting-20120522-Hengelo&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After a general introduction round, we discussed the current state of the available open-source frameworks
(&lt;a href=&quot;http://incubator.apache.org/celix/&quot;&gt;Celix&lt;/a&gt;, &lt;a href=&quot;http://sof.tiddlyspot.com/&quot;&gt;SOF&lt;/a&gt;, &lt;a href=&quot;http://www-vs.informatik.uni-ulm.de/proj/nosgi/&quot;&gt;nOSGi&lt;/a&gt;, and &lt;a href=&quot;http://www.commontk.org/index.php/Documentation/Plugin_Framework&quot;&gt;CTK&lt;/a&gt;) and tried to identify common needs and goals.
The projects had a lot in common, but also differed in some interesting ways.&lt;/p&gt;

&lt;p&gt;Another very important discussion was centered about two questions which pop up frequently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is a native (C or C++) OSGi framework needed?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;C and C++ as programming languages are here to stay (whether you like it or not).&lt;/li&gt;
  &lt;li&gt;Traditional application domains (for example in medical imaging, embedded devices, sensor networks, etc.) often use native languages
and possibly rely on a large native (legacy) code-base.&lt;/li&gt;
  &lt;li&gt;Native developers designing scalable, modular platforms for a dynamically reconfigurable (embedded) environment
need a light-weight yet powerful module system (just like Java developers).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What are the benefits of a native (C or C++) OSGi framework?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Builds upon a mature API design for a dynamic environment, supporting native developers in creating modular platforms.&lt;/li&gt;
  &lt;li&gt;Allows the creation of a hybrid Java and C/C++ architecture (via remote services) as an alternative to JNI.&lt;/li&gt;
  &lt;li&gt;Maximizes the performance per watt ratio for (embedded) devices.&lt;/li&gt;
  &lt;li&gt;Eases future software migrations of native components to a Java OSGi-based system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We strongly believe that there is a market (community) for &lt;em&gt;Native OSGi&lt;/em&gt; and quickly agreed on trying to draft a C and C++ API in the
near future and have it reviewed by the community.&lt;/p&gt;

&lt;p&gt;Having a common API would allow us to re-use bundles originating from different projects,
as it is common in the Java OSGi community. Additionally, it would hopefully help us in growing a community and to foster collaboration
between the existing native OSGi framework implementations.&lt;/p&gt;

&lt;p&gt;A large part of the afternoon discussions focused on the &lt;a href=&quot;https://github.com/abroekhuis/NativeOSGi/wiki/Draft-Module-Layer&quot;&gt;meaning of a &lt;em&gt;Module Layer&lt;/em&gt;&lt;/a&gt;
in a native setting and about &lt;a href=&quot;https://github.com/abroekhuis/NativeOSGi/wiki/Draft-C-Cpp-Interoperability&quot;&gt;C and C++ interoperability&lt;/a&gt;.
I think we are heading in the right directions but there are still many details to work out.&lt;/p&gt;

&lt;p&gt;You can follow our collaborative efforts on our &lt;a href=&quot;https://github.com/abroekhuis/NativeOSGi&quot;&gt;NativeOSGi GitHub project&lt;/a&gt; and on the
&lt;a href=&quot;http://incubator.apache.org/celix/support/mailinglist.html&quot;&gt;Celix Mailinglist&lt;/a&gt;.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>OSGi Lite for C++</title>
   <link href="http://blog.cppmicroservices.org/2012/04/15/osgi-lite-for-c%2B%2B"/>
   <updated>2012-04-15T00:00:00-07:00</updated>
   <id>hhttp://blog.cppmicroservices.org/2012/04/15/osgi-lite-for-c++</id>
   <content type="html">
&lt;p&gt;OSGi solves the Java modularity problem. This is the major feat of OSGi, as it is claimed by its advocates.
While I am definitely pro OSGi, I can also see the difficulties when trying to migrate an existing code base
with complex dependencies to an OSGi based system. This applies both to Java projects as well as C/C++ projects
trying to migrate to one of the &lt;a href=&quot;http://blog.cppmicroservices.org/2012/03/29/osgi-and-c++/&quot;&gt;C/C++ OSGi frameworks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this blog post, I will discuss the idea of &lt;em&gt;OSGi Lite&lt;/em&gt; and how it may be translated to the &lt;em&gt;Native OSGi&lt;/em&gt; world
of C/C++ OSGi frameworks.&lt;/p&gt;

&lt;h2 id=&quot;the-osgi-migration-problem&quot;&gt;The OSGi Migration Problem&lt;/h2&gt;

&lt;p&gt;Large software systems usually consist of multiple components (in whatever form) having non trivial dependencies.
Modularization promises better encapsulation and re-use of components as well as cleaner dependency management. Using an established
framework like OSGi which is especially designed for enabling the creation of modularized applications seems like a no-brainer.&lt;/p&gt;

&lt;p&gt;However, modularization itself is hard and the transition of an existing code base to OSGi is a complex task. This has been
discussed a lot in the past, for example here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://techdistrict.kirkk.com/2009/03/25/osgi-discontent-no-migration-path/&quot;&gt;OSGi Discontent - No Migration Path!&lt;/a&gt; (25/3/09)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://java.dzone.com/articles/osgi-feast-or-famine&quot;&gt;OSGi - Feast or Famine?&lt;/a&gt; (13/4/10)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://techdistrict.kirkk.com/2010/04/15/osgi-complexity-is-not-the-problem/&quot;&gt;OSGi: Complexity is NOT the Problem&lt;/a&gt; (15/4/10)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blogs.mulesoft.org/osgi-no-thanks/&quot;&gt;OSGi? No Thanks&lt;/a&gt; (9/11/10)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Arguably the biggest obstacle when transitioning an existing Java application to OSGi is the (possible) existence of class loader hacks.
Another one is the fact that OSGi tends to expose the inherent complexity of a code base, leading to the false impression
that OSGi increases complexity instead of helping to manage it.&lt;/p&gt;

&lt;p&gt;Usually, the reason for a project to move to OSGi is to achieve cleaner modularity by controlling the
visibility of Java packages between bundles. This is where OSGi excels with its module layer specification.
A second typical reason is the desire to use the OSGi service layer to realize a service oriented architecture. Unfortunately,
the service layer is tightly coupled to the module layer. This means that in order to benefit from OSGi principles, you
have to completely migrate your project to OSGi. While this might pay off in the long run, it is not a smooth migration
path and might even be a show-stopper because of possible large refactoring requirements.&lt;/p&gt;

&lt;h2 id=&quot;osgi-lite-to-the-rescue&quot;&gt;OSGi Lite to the Rescue?&lt;/h2&gt;

&lt;p&gt;People like the OSGi service layer so much that recently (in the year 2011) the idea of
&lt;a href=&quot;http://www.osgi.org/blog/2011/04/osgi-lite.html&quot;&gt;&lt;em&gt;OSGi Lite&lt;/em&gt;&lt;/a&gt; started coming up again (here is
&lt;a href=&quot;http://www.osgi.org/blog/2011/04/osgi-lite_05.html&quot; title=&quot;OSGi Lite&quot;&gt;another blog post&lt;/a&gt; from Peter Kriens about it). It essentially
is a service registry (like specified in the OSGi specs) without an OSGi framework, especially without the module layer. A Java
project based on this idea has been created by Karl Pauls, called &lt;a href=&quot;http://code.google.com/p/pojosr/&quot;&gt;PojoSR&lt;/a&gt; (Pojo Service Registry).
You might also be interested in these slides: &lt;a href=&quot;http://www.slideshare.net/OSGiUsers/pojosr-or-osgi-services-for-the-rest-of-us&quot;&gt;PojoSR or (OSGi) uServices for the rest of us&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;By not requireing a running (OSGi) framework, the OSGi service layer can now be put to good use in existing projects step-by-step.
After having converted direct method calls between Jar files to a service model, the migration to a full
blown OSGi framework should be much smoother.&lt;/p&gt;

&lt;p&gt;In my previous post about existing &lt;a href=&quot;http://blog.cppmicroservices.org/2012/03/29/osgi-and-c++/&quot;&gt;C/C++ OSGi frameworks&lt;/a&gt; I ranted about the
lack of a C/C++ OSGi community. There are certainly many reasons for that: Most frameworks are still rather young and the
target audience is not the average Joe programmer. Another reason I can think of is that C/C++ programmers tend to be more
conservative in a sense that introducing a new framework (requiring &lt;a href=&quot;http://stackoverflow.com/questions/3057526/framework-vs-toolkit-vs-library&quot; title=&quot;Framework vs. Toolkit vs. Library&quot;&gt;Inversion of Control&lt;/a&gt;) needs much more convincing. However, the OSGi module layer solves a
Java specific problem which does not directly map to C/C++. In C/C++, the visibility of symbols defined in shared libraries
can be effectively controlled by various means (for example on Windows, all symbols are hidden by default anyway). The symbol search
path for each library is determined by the link-time dependencies (in reality, it may be a bit more complicated),
as opposed to the global class path in Java. Symbol versioning is still
a problem, but many projects have full control over the set of deployed libraries and may not need that level of complexity. Let alone the
need for a dynamic module system or updates at runtime. These projects would probably benefit the most from a C/C++ OSGi framework without
the module layer. This is what the &lt;a href=&quot;http://cppmicroservices.org/&quot;&gt;C++ Micro Services&lt;/a&gt; library aims to provide.&lt;/p&gt;

&lt;h2 id=&quot;c-micro-services&quot;&gt;C++ Micro Services&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;http://cppmicroservices.org/&quot;&gt;C++ Micro Services&lt;/a&gt; library is to C++ roughly what &lt;a href=&quot;http://code.google.com/p/pojosr/&quot;&gt;PojoSR&lt;/a&gt; is to Java. It provides a full implementation
of the OSGi service layer and just enough of the module layer to be able to create a &lt;em&gt;module context&lt;/em&gt; for each shared or static
library. It leaves the handling of library/symbol dependencies and loading of libraries at runtime completely to the dynamic linker
of the operating system.&lt;/p&gt;

&lt;p&gt;Originally, the main motivation for creating the C++ Micro Services library was the need to gain control over the life-cycle
and dependencies of singletons in an existing large code base I was working on. Over the years, the number of singletons grew and dependencies
between them were introduced, which lead to a static (de-)initialization order fiasco. Migrating the whole code base
to a OSGi-like C++ framework to replace singletons with services was not an option (due to several reasons) but the power of
the OSGi service model was still intriguing. After realizing that a complete OSGi framework would probably be overkill for now anyway,
we decided that having just the service layer available would be a perfect match for our needs. Building upon our experience in
developing the &lt;a href=&quot;http://www.commontk.org/index.php/Documentation/Plugin_Framework&quot;&gt;CTK Plugin Framework&lt;/a&gt; (a Qt-based C++ OSGi framework),
creating the C++ Micro Services library took just a couple of weeks.&lt;/p&gt;

&lt;p&gt;Using the library is as simple as using any other C++ library. There is no need to call certain methods to start a framework or
to think about deployment issues. Here is a simple code snippet demonstrating how to register and query service objects:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;cpp&quot;&gt;&lt;span class=&quot;cp&quot;&gt;#include &amp;lt;SomeInterface.h&amp;gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#include &amp;lt;usGetModuleContext.h&amp;gt;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyService&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SomeInterface&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DoSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;My service implementation&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;RegisterService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MyService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;myService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ModuleContext&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetModuleContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RegisterService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SomeInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;myService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;UseService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ModuleContext&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetModuleContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  
  &lt;span class=&quot;c1&quot;&gt;// Get the highest ranking service, if any&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServiceReference&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;serviceRef&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetServiceReference&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SomeInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;serviceRef&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;SomeInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetService&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SomeInterface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;serviceRef&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DoSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that the service implementations base class &lt;code&gt;us::Base&lt;/code&gt; can actually be any class, specified during the configuration of the C++ Micro
Services library. For details, please see the &lt;a href=&quot;http://cppmicroservices.org/doc_latest/BuildInstructions.html&quot;&gt;Build Instructions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hopefully, the C++ Micro Services library will lower the adoption barrier for a OSGi service model. If a project later on realizes that
it needs a full blown C++ OSGi framework, the migration should be more straight-forward.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>OSGi and C++</title>
   <link href="http://blog.cppmicroservices.org/2012/03/29/osgi-and-c%2B%2B"/>
   <updated>2012-03-29T00:00:00-07:00</updated>
   <id>hhttp://blog.cppmicroservices.org/2012/03/29/osgi-and-c++</id>
   <content type="html">
&lt;p&gt;&lt;strong&gt;Updated on 10/04/2012:&lt;/strong&gt; Poco OSP facts corrected (source: private mail with the developer)&lt;/p&gt;

&lt;p&gt;In September 2011 I attended the &lt;a href=&quot;http://www.osgi.org/CommunityEvent2011&quot;&gt;OSGi Community Event&lt;/a&gt; in Darmstadt and had the opportunity to shortly discuss the state of native C++ implementations of the &lt;a href=&quot;http://www.osgi.org&quot;&gt;OSGi&lt;/a&gt; specifications with other attendees. Already before this event, I wanted to
write a blog post about the current state of projects trying to implement a OSGi - like framework in C/C++. Finally, this blog post gives you a
high-level overview of the &lt;em&gt;Native OSGi&lt;/em&gt; landscape.&lt;/p&gt;

&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#introduction&quot;&gt;Introduction&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#native-and-universal-osgi&quot;&gt;Native and Universal OSGi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#cc-projects&quot;&gt;C/C++ Projects&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#poco-osp&quot;&gt;Poco OSP&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#sof&quot;&gt;SOF&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#ctk-plugin-framework&quot;&gt;CTK Plugin Framework&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#nosgi&quot;&gt;nOSGi&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#celix&quot;&gt;Celix&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#comparison&quot;&gt;Comparison&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;I learned about the OSGi component model about seven years ago by creating an Eclipse RCP application.
Nowadays, I program mostly in C++ but I am still trying to follow the developments and trends in OSGi and Java in general. Although there are many high-quality C++ libraries which help to create complex systems, the options for a C++ library/framework enabling component (and/or service) oriented designs are limited. Depending on your requirements, this set of options might be reduced substantially. I will try to give a review of active projects which try to 
implement the OSGi API in C or C++. Complex &lt;a href=&quot;http://en.wikipedia.org/wiki/Middleware&quot;&gt;middleware&lt;/a&gt; frameworks
(like &lt;a href=&quot;http://en.wikipedia.org/wiki/Corba&quot;&gt;CORBA&lt;/a&gt;) or &lt;a href=&quot;http://en.wikipedia.org/wiki/Service_component_architecture&quot;&gt;SCA&lt;/a&gt; implementations which allow a service oriented design but which either are not available for C++ or lack development activity (the last &lt;a href=&quot;http://tuscany.apache.org/sca-native.html&quot;&gt;Apache Tuscany C++&lt;/a&gt; release is from 2007) will not be discussed.&lt;/p&gt;

&lt;p&gt;As you will see below, there is a growing interest in a C++ OSGi framework since a couple of years. Several independent projects picked up the OSGi design principles and try to translate them to C or C++. The biggest drawback of these efforts - in my opinion - is the lack of a C++ OSGi community (if you know of one, please let me know). Although a couple of projects exist, they live pretty much isolated from each other and yet lack a large user base.&lt;/p&gt;

&lt;h2 id=&quot;native-and-universal-osgi&quot;&gt;Native and Universal OSGi&lt;/h2&gt;

&lt;p&gt;In 2007, RFP-89 (Request for Proposal) was filed for specifying a system dubbed &lt;em&gt;Universal OSGi&lt;/em&gt;. A short discussion on the
&lt;a href=&quot;http://www.osgi.org/MailLists/Universal&quot;&gt;Universal OSGi mailing-list&lt;/a&gt; followed and Peter Kriens blogged about the idea
&lt;a href=&quot;http://www.osgi.org/blog/2007/10/universal-osgi.html&quot; title=&quot;Universal OSGi&quot;&gt;here&lt;/a&gt;. In short, the idea was to be able to access service objects
written in other languages (not Java) via the OSGi service registry (possibly using some kind if IPC mechanisms under the hood).
The central orchestration unit would still be a Java OSGi implementation with additional capabilities for managing &lt;em&gt;native bundles&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The term &lt;em&gt;Native OSGi&lt;/em&gt; seems to appear more often in the context of translating OSGi principles to a native OSGi framework implementation
(for example implemented in C or C++). Such native frameworks which can be used on their own are the focus of this post. Of course a
native OSGi framework will have a much bigger impact if it provides Java interoperability in the sense of Universal OSGi (hence being
a super set in terms of provided functionality). You can find a short discussion about
the &lt;a href=&quot;https://mail.osgi.org/pipermail/osgi-dev/2008-September/001450.html&quot;&gt;state of Universal OSGi dating from September 2008 here&lt;/a&gt;.
The mentioned paper &lt;a href=&quot;http://systems.ethz.pubzone.org/servlet/Attachment?attachmentId=43&amp;amp;versionId=716259&quot;&gt;&lt;em&gt;The Software Fabric for the Internet of Things&lt;/em&gt;&lt;/a&gt;
(&lt;a href=&quot;http://dx.doi.org/10.1007/978-3-540-78731-0_6&quot;&gt;doi&lt;/a&gt;) written by Jan Rellermeyer et.al. describes a light-weight JNI based approach
for handling interoperability between native (C++) and Java services. Unfortunately, I could not find the native code anywhere (the
Java implementation for remote OSGi services can be found &lt;a href=&quot;http://r-osgi.sourceforge.net/&quot; title=&quot;R-OSGi&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The interest in a Native OSGi solution does not seem to vanish (see 
&lt;a href=&quot;http://stackoverflow.com/questions/2627114/c-modularization-framework-like-osgi&quot; title=&quot;C++ modularization framework (like OSGI)?&quot;&gt;1&lt;/a&gt;,
&lt;a href=&quot;http://stackoverflow.com/questions/7069144/how-to-compose-osgi-based-project-with-c-based-project&quot; title=&quot;How to Compose OSGi Based project with C++ based project?&quot;&gt;2&lt;/a&gt;,
&lt;a href=&quot;http://stackoverflow.com/questions/9249708/is-there-a-non-java-alternative-to-osgi&quot; title=&quot;Is there a non Java alternative to OSGi?&quot;&gt;3&lt;/a&gt;, and
&lt;a href=&quot;http://stackoverflow.com/questions/5127981/portable-c-component-design&quot; title=&quot;Portable C++ Component Design&quot;&gt;4&lt;/a&gt;) but it surely is not (yet?) mainstream.
Another &lt;a href=&quot;http://www.osgi.org/blog/2010/10/minimal-osgi-systems.html&quot; title=&quot;Minimal OSGi systems&quot;&gt;blog post by Peter Kriens from October 2010&lt;/a&gt;
picks up the Universal OSGi idea again and points to a &lt;a href=&quot;http://wiki.apache.org/incubator/CelixProposal&quot; title=&quot;Celix Proposal&quot;&gt;proposal for an Apache Incubator project&lt;/a&gt;
providing a C implementation of OSGi. I will provide some details about the current state of art concerning Native OSGi implementations
in the next section.&lt;/p&gt;

&lt;h2 id=&quot;cc-projects&quot;&gt;C/C++ Projects&lt;/h2&gt;

&lt;p&gt;Although the term Native OSGi is not tied to a specific platform or native programming language, people seem to be mostly interested in C and
C++ implementations (see links in the previous section). One of the earliest projects is &lt;a href=&quot;http://sourceforge.net/projects/osgi4cpp/&quot;&gt;OSGI for C++&lt;/a&gt;
which was registered on July 2007 on SourceForge. The project does not have released any source code or binaries and seems to be abandoned.
I will describe the currently active C or C++ projects which I know of below, trying to approximately maintain the chronological order of their
public appearance (to the best of my knowledge).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: I am the main developer of the CTK Plugin Framework. My information about the other projects is compiled from various sources
from the Internet (which I will link to) but is likely to be incomplete. Unfortunately, I do not have time to test and play with all the
frameworks, so most of my knowledge about these projects stems from reading the docs and the source code.
If you are one of the developers of the mentioned projects and would like to correct/add some information, please contact me.&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&quot;poco-osp&quot;&gt;Poco OSP&lt;/h4&gt;

&lt;p&gt;In Autumn 2007, the &lt;a href=&quot;http://www.appinf.com/en/products/osp.html&quot;&gt;Poco Open Service Platform&lt;/a&gt; was the first OSGi-like project written in C++ I
stumbled on. The copyright in the &lt;a href=&quot;http://www.appinf.com/download/OpenServicePlatform.pdf&quot;&gt;white-paper&lt;/a&gt; suggests that the project was created sometime in 2007.
It differentiates itself from the other C/C++ projects by two facts. First, it is a commercial
product and second, it exhibits the least similarities to the OSGi specifications in its API. The concept of &lt;em&gt;bundles&lt;/em&gt; and a &lt;em&gt;service registry&lt;/em&gt; is,
however, modeled after the OSGi principles.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://www.appinf.com/docs/poco/index.html&quot;&gt;Poco OSP API&lt;/a&gt; documentation lists a couple of services (like &lt;em&gt;Preferences&lt;/em&gt; and &lt;em&gt;User Admin&lt;/em&gt;),
which seem to be related to the corresponding OSGi service specifications, but they have a different API. Further, the platform supports
remote services and provides the ability to sign bundles and to interact with the framework via a command shell.&lt;/p&gt;

&lt;h4 id=&quot;sof&quot;&gt;SOF&lt;/h4&gt;

&lt;p&gt;The &lt;a href=&quot;http://sof.tiddlyspot.com/&quot;&gt;Service Oriented Framework (SOF)&lt;/a&gt; was registered at &lt;a href=&quot;http://sourceforge.net/projects/sof/&quot; title=&quot;SOF on SourceForge&quot;&gt;SourceForge&lt;/a&gt;
in early 2008 and seems to be one of the earliest usable open-source C++ OSGi implementations. It implements a subset of the
OSGi Framework API and provides an OSGi console, an Eclipse RCP based Admin UI, and support for remote services.&lt;/p&gt;

&lt;p&gt;The remote service capabilities of SOF are based on &lt;a href=&quot;http://www.mico.org&quot;&gt;MICO&lt;/a&gt;, a C++ CORBA implementation. &lt;/p&gt;

&lt;h4 id=&quot;ctk-plugin-framework&quot;&gt;CTK Plugin Framework&lt;/h4&gt;

&lt;p&gt;The &lt;a href=&quot;http://www.commontk.org/index.php/Documentation/Plugin_Framework&quot;&gt;CTK Plugin Framework&lt;/a&gt; is the third rewrite of a C++ OSGi-like dynamic component framework, developed in the &lt;a href=&quot;http://www.dkfz.de/en/mbi/&quot;&gt;Division of
Medical and Biological Informatics&lt;/a&gt; at the German Cancer Research Center. The first iteration was part of
a larger framework called &lt;em&gt;openCherry&lt;/em&gt; which has been developed during 2007/2008 and focused on providing a C++ implementation of the
&lt;a href=&quot;http://wiki.eclipse.org/index.php/Rich_Client_Platform&quot;&gt;Eclipse RCP&lt;/a&gt; based on a C++ component model
(similar to &lt;a href=&quot;http://www.eclipse.org/equinox/&quot;&gt;Equinox&lt;/a&gt;). The project was later renamed to &lt;a href=&quot;http://www.mitk.org/wiki/BlueBerry&quot;&gt;BlueBerry&lt;/a&gt;
which is the foundation for the &lt;a href=&quot;http://www.dkfz.de/en/mbi/projects/mitk.html&quot;&gt;MITK Application Framework&lt;/a&gt; (BlueBerry itself is a
generic application platform, not tied to specific use cases). The OSGi related C++ code in BlueBerry has been rewritten in 2009 and is
known as the &lt;a href=&quot;http://www.commontk.org/index.php/Documentation/Plugin_Framework&quot;&gt;CTK Plugin Framework&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The CTK Plugin Framework is based on the &lt;a href=&quot;http://qt-project.org/doc/qt-4.8/qtcore.html&quot;&gt;Qt Core&lt;/a&gt; library and implements almost
the complete OSGi Framework API. It makes use of the Qt plugin system, the resource system, and signal/slots to support all OSGi Framework
functionalities. Additionally, it provides a couple of optional OSGi service specification implementations.&lt;/p&gt;

&lt;h4 id=&quot;nosgi&quot;&gt;nOSGi&lt;/h4&gt;

&lt;p&gt;The &lt;a href=&quot;http://www-vs.informatik.uni-ulm.de/proj/nosgi/&quot;&gt;nOSGi&lt;/a&gt; project is another C++ OSGi implementation tailored for POSIX systems, which was developed in 2009 according to a comment
in &lt;a href=&quot;http://www.osgi.org/blog/2010/10/minimal-osgi-systems.html&quot;&gt;this&lt;/a&gt; blog post. Its developer wrote a very nice
&lt;a href=&quot;http://dl.acm.org/authorize?6553100&quot;&gt;paper&lt;/a&gt; investigating the feasibility of translating OSGi concepts to a native system (POSIX).&lt;/p&gt;

&lt;p&gt;nOSGi especially focuses on modelling inter-bundle package dependencies (see the above paper for the definition of a C++ &lt;em&gt;package&lt;/em&gt;)
by patching the ELF headers of DSOs at runtime. It also provides an OSGi Console to interact with the running framework.&lt;/p&gt;

&lt;h4 id=&quot;celix&quot;&gt;Celix&lt;/h4&gt;

&lt;p&gt;In 2010, &lt;a href=&quot;http://incubator.apache.org/celix/&quot;&gt;Celix&lt;/a&gt; was created as an Apache Incubator project (&lt;a href=&quot;http://wiki.apache.org/incubator/CelixProposal&quot;&gt;proposal&lt;/a&gt;). It
is a OSGi like implementation in C initially developed by &lt;a href=&quot;http://www.luminis.eu/en&quot;&gt;Luminis&lt;/a&gt;. Celix focuses on following the
OSGi API as close as possible and on enabling interoperability between Java OSGi bundles and native C bundles written with Celix.&lt;/p&gt;

&lt;p&gt;Celix also provides a OSGi Shell and a Log Service implementation. Additionaly, the Celix team actively tries to stimulate the
growth of a C/C++ OSGi community and to raise the open-source communities awareness of such projects (see the
mailing list discussion &lt;a href=&quot;http://incubator.markmail.org/search/+list:org.apache.incubator.celix-dev#query:%20list%3Aorg.apache.incubator.celix-dev+page:2+mid:a3qltqhsocmrnerd+state:results&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;h2 id=&quot;comparison&quot;&gt;Comparison&lt;/h2&gt;

&lt;p&gt;I will provide a high-level comparison of the mentioned native OSGi projects below. Please note that although I tried
to collect accurate data, it might still be incomplete or wrong. The sources of information were:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Poco OSP: Official API documentation (from 29/03/2012) and the evaluation package 2011_2.&lt;/li&gt;
  &lt;li&gt;SOF: Source code version 1.3 (revision 11090) and documentation on the website.&lt;/li&gt;
  &lt;li&gt;CTK: Source code (Git hash 233893) and website documentation (from 29/03/2012).&lt;/li&gt;
  &lt;li&gt;nOSGi: Source code (SVN revision 8).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following table lists the supported platforms, the license, the implementation language, and the creation date
(as far as it could be determined).&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;Supported Platforms&lt;/th&gt;
      &lt;th&gt;License&lt;/th&gt;
      &lt;th&gt;Language&lt;/th&gt;
      &lt;th&gt;Created&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.appinf.com/en/products/osp.html&quot;&gt;Poco OSP&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Linux, Windows, Mac OS, QNX&lt;/td&gt;
      &lt;td&gt;Commercial&lt;/td&gt;
      &lt;td&gt;C++&lt;/td&gt;
      &lt;td&gt;2007 (?)&lt;sup&gt;1&lt;/sup&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://sof.tiddlyspot.com/&quot;&gt;SOF&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Linux, Windows&lt;/td&gt;
      &lt;td&gt;BSD (?)&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt;
      &lt;td&gt;C++&lt;/td&gt;
      &lt;td&gt;2008&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.commontk.org/index.php/Documentation/Plugin_Framework&quot;&gt;CTK&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Linux, Windows, Mac OS&lt;/td&gt;
      &lt;td&gt;Apache License 2.0&lt;/td&gt;
      &lt;td&gt;C++&lt;/td&gt;
      &lt;td&gt;2009&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www-vs.informatik.uni-ulm.de/proj/nosgi/&quot;&gt;nOSGi&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;POSIX&lt;/td&gt;
      &lt;td&gt;GPLv3&lt;/td&gt;
      &lt;td&gt;C++&lt;/td&gt;
      &lt;td&gt;2009&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://incubator.apache.org/celix/&quot;&gt;Celix&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Linux&lt;sup&gt;3&lt;/sup&gt;&lt;/td&gt;
      &lt;td&gt;Apache License 2.0&lt;/td&gt;
      &lt;td&gt;C&lt;/td&gt;
      &lt;td&gt;2010&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;1&lt;/sup&gt; The earliest copyright year in the white-paper.&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;sup&gt;2&lt;/sup&gt; From SourceForge project details, but there is no license information in the sources.&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;sup&gt;3&lt;/sup&gt; Basically, the project is cross-platform but seems to concentrate on Linux only.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;The OSGi Framework implementations of the five projects differ in various aspects. The table below will highlight the
following implementation details:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Service Query Language&lt;/strong&gt; Query the bundle context for services and allow adding service listeners using filter
expressions (on the service properties).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Service/Bundle Tracker&lt;/strong&gt; Provide utility classes to track services and bundles (basically, providing an
implementation of the &lt;em&gt;Tracker&lt;/em&gt; specifications).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Bundle Updates&lt;/strong&gt; Ability to update bundles at runtime.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Type-safe Services&lt;/strong&gt; A mechanism to safely cast a service instance to an implemented interface.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Thread safety&lt;/strong&gt; Thread safe OSGi Framework API.&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;Service Query Language&lt;/th&gt;
      &lt;th&gt;Service/Bundle Tracker&lt;/th&gt;
      &lt;th&gt;Bundle Updates&lt;/th&gt;
      &lt;th&gt;Type-safe Services&lt;/th&gt;
      &lt;th&gt;Thread-safe&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.appinf.com/en/products/osp.html&quot;&gt;Poco OSP&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;No/No&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://sof.tiddlyspot.com/&quot;&gt;SOF&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;Yes/No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;(Yes)&lt;sup&gt;1&lt;/sup&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.commontk.org/index.php/Documentation/Plugin_Framework&quot;&gt;CTK&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes (RFC1960)&lt;/td&gt;
      &lt;td&gt;Yes/Yes&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www-vs.informatik.uni-ulm.de/proj/nosgi/&quot;&gt;nOSGi&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;(Yes)&lt;sup&gt;2&lt;/sup&gt; (RFC1960)&lt;/td&gt;
      &lt;td&gt;No/No&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://incubator.apache.org/celix/&quot;&gt;Celix&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Yes (RFC1960)&lt;/td&gt;
      &lt;td&gt;Yes/No&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;1&lt;/sup&gt; Thread safety must be enabled by the user by supplying a custom threading policy class as a template argument
to the launcher.&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;sup&gt;2&lt;/sup&gt; Only supported when registering service listeners&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Here is a (possibly incomplete) list of implemented OSGi specifications. The level of API similarity to the original OSGi
specifications can vary a lot from project to project.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;Implemented OSGi Specifications&lt;/th&gt;
      &lt;th&gt;Planned&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.appinf.com/en/products/osp.html&quot;&gt;Poco OSP&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;(Preferences, User Admin, Http, Remote Services)&lt;sup&gt;1&lt;/sup&gt;&lt;/td&gt;
      &lt;td&gt;?&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://sof.tiddlyspot.com/&quot;&gt;SOF&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Remote Services&lt;/td&gt;
      &lt;td&gt;?&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.commontk.org/index.php/Documentation/Plugin_Framework&quot;&gt;CTK&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Event Admin, Configuration Admin, Metatype Service, Log Service&lt;/td&gt;
      &lt;td&gt;Remote Services&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www-vs.informatik.uni-ulm.de/proj/nosgi/&quot;&gt;nOSGi&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;?&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://incubator.apache.org/celix/&quot;&gt;Celix&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Log Service, (Deployment Admin, Remote Services)&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt;
      &lt;td&gt;?&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;1&lt;/sup&gt; While the Poco OSP provides these functionalities in terms of &lt;em&gt;services&lt;/em&gt;, they do not seem to comply
with the OSGi specifications.&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;sup&gt;2&lt;/sup&gt; There is some code and examples in the SVN repository, but no documentation on
the website yet. Status unclear.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Finally, the last table summarizes a few code metrics for the open-source projects, using the source code versions as stated
at the beginning of this section.
The development costs are based on a basic COCOMO model as used by &lt;em&gt;sloccount&lt;/em&gt;. The line counts have been extracted with &lt;em&gt;cloc&lt;/em&gt;.
Both tools have been applied to the framework code only (no examples, tests, service implementations, etc.).&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;Lines of Code&lt;/th&gt;
      &lt;th&gt;Lines of Comments&lt;/th&gt;
      &lt;th&gt;Costs&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://sof.tiddlyspot.com/&quot;&gt;SOF&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;3559&lt;/td&gt;
      &lt;td&gt;2801&lt;/td&gt;
      &lt;td&gt;$ 102k&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www.commontk.org/index.php/Documentation/Plugin_Framework&quot;&gt;CTK&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;8770&lt;/td&gt;
      &lt;td&gt;10024&lt;/td&gt;
      &lt;td&gt;$ 264k&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://www-vs.informatik.uni-ulm.de/proj/nosgi/&quot;&gt;nOSGi&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;2208&lt;/td&gt;
      &lt;td&gt;2284&lt;/td&gt;
      &lt;td&gt;$ 62k&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;http://incubator.apache.org/celix/&quot;&gt;Celix&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;8923&lt;/td&gt;
      &lt;td&gt;2450&lt;/td&gt;
      &lt;td&gt;$ 269k&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;The good news is that native OSGi solutions exist and that there is ongoing development activity.
The bad news is that the native OSGi landscape is fragmented. There is not yet a large community or sufficient
interest in the industry. I believe in the &lt;a href=&quot;http://channel9.msdn.com/Shows/Going+Deep/Craig-Symonds-and-Mohsen-Agsen-C-Renaissance&quot;&gt;C++ Renaissance&lt;/a&gt;
and that for embedded systems as well as for large-scale component-based applications, a native OSGi
solution will be very beneficial (also think about the increased
&lt;a href=&quot;http://channel9.msdn.com/posts/C-and-Beyond-2011-Herb-Sutter-Why-C&quot;&gt;performance per dollar&lt;/a&gt; ratio).&lt;/p&gt;

&lt;p&gt;On the technical side, I did not discuss many important details in the OSGi specifications and how they are implemented
in the existing projects. I might do a more in-depth comparison about how the projects handle bundle meta-data, dependencies, versioning, resources,
dynamic loading and RTTI problems for example.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Introduction</title>
   <link href="http://blog.cppmicroservices.org/2012/03/19/introduction"/>
   <updated>2012-03-19T00:00:00-07:00</updated>
   <id>hhttp://blog.cppmicroservices.org/2012/03/19/introduction</id>
   <content type="html">
&lt;p&gt;The C++ micro Services Blog will contain posts about my current technological interests and research.&lt;/p&gt;

&lt;p&gt;This includes, but is not limited to, programming languages, software design, and component and service oriented architectures.&lt;/p&gt;

&lt;p&gt;Stay tuned for the next post, which will try to give an overview about the state of current efforts of implementing the OSGi specifications (which were written specifically for Java) in C++.&lt;/p&gt;
</content>
 </entry>
 
 
</feed>