Applied Informatics Open Service Platform

OSP Service Registry

Contents

Service Registry

The service registry (Poco::OSP::ServiceRegistry) allows a bundle to provide services to other bundles, and allows a bundle to find the services provided by other bundles.

A bundle can provide and register arbitrary services in the form of interface classes. Every service a bundle provides must be implemented in a class that is a derived class of Poco::OSP::Service. Service objects are reference counted, therefore, the Poco::OSP::Service class is derived from Poco::RefCountedObject.

Subclasses of the Poco::OSP::Service class must implement the Poco::OSP::Service::type() and Poco::OSP::Service::isA() member functions.

A service can be implemented and registered as a singleton, meaning there exists exactly one instance of the service providing services to all bundles in the system, or it can be implemented and registered using a service factory. A service factory provides a unique instance of the service class to everyone requesting an instance of the service.

If a service is to be registered using a service factory, a corresponding service factory object for the service, derived from Poco::OSP::ServiceFactory, must be registered instead of the service object itself.

Registering Services

Services are registered with the registerService() member function of the Poco::OSP::ServiceRegistry class. Each service is registered under a unique name. To ensure uniqueness of the name, the service name should follow the same naming conventions as a bundle name. Besides a name, a service can also have an arbitrary number of service properties. The service properties are name-value pairs and can be freely defined by the service. Other bundles can use the service properties to learn about the capabilities of a service, or even search for a service by its properties.

Service Properties

The properties of a service are defined using the Poco::OSP::Properties class. There are two predefined properties, which are automatically set by the framework:

  • name contains the name of the service, and
  • type contains the type name (obtained from via std::type_info::name()) of the class implementing the service.

Updating Services

Once a service has been registered, the service properties can be updated. This is done using the Poco::OSP::ServiceRef object returned by Poco::OSP::ServiceRegistry::registerService().

Finding Services

Services can be found by name (Poco::OSP::ServiceRegistry::findByName()) or by property (Poco::OSP::ServiceRegistry::find()). A simple query language can be used for looking up a service by its properties.

Query Language

The query language is similar to C++ expressions and supports comparison (==, !=, <, <=, >, >=), regular expression matching (=~) and logical and/or operations (&&, ||). Subexpressions can be grouped with parenthesis. The data types string, integer, float and boolean are supported. The simplified syntax for the query language is given in the following.

expr          ::= andExpr ["||" andExpr]
andExpr       ::= relExpr ["&&" relExpr]
relExpr       ::= ["!"] (id [relOp value | "=~" matchExpr]) | subExpr
subExpr       ::= "(" expr ")"
relOp         ::= "==" | "!=" | "<" | "<=" | ">" | ">="
value         ::= numLiteral | boolLiteral | stringLiteral
numLiteral    ::= [sign] digit*"."digit*["E"["+" | "-"]digit*]
boolLiteral   ::= "true" | "false"
stringLiteral ::= '"' char* '"'
matchExpr     ::= stringLiteral | regExpr
regExpr       ::= delim char+ delim /* valid Perl regular expression,
                                       enclosed in delim */
delim         ::= "/" | "#"

Examples for valid queries are given in the following:

  • name == "com.appinf.osp.sample.service" — a simple string comparison for equality.
  • majorVersion > 1 && minorVersion >= 5 — numeric comparisons and logical AND.
  • name =~ "com.appinf.osp.*" && someProperty — simple pattern matching and test for existence of someProperty.
  • someProperty =~ /[0-9]+/ — regular expression matching.

Service Reference

Information about a service is delivered in Poco::OSP::ServiceRef objects. Using the Poco::OSP::ServiceRef class, an instance of the service object, its properties, or its name can be obtained.

Service Events

The Poco::OSP::ServiceRegistry class provides two events to inform interested bundles about changes in service registrations. The serviceRegistered event is fired whenever a new service is registered. The serviceUnregistered event is fired when a service is unregistered. All events use the Poco::OSP::ServiceEvent class as argument.