The white board pattern handler
The objective of this handler is to simplify the development of white-board architecture. This architecture-style is based is very close to the extender architecture style but use services instead of bundles.
UPDATE: the 1.1.0-SNAPSHOT has a new namespace org.apache.felix.ipojo.whiteboard
instead of org.apache.felix.ipojo.white-board-pattern
The whiteboard pattern
A whiteboard is based on two different roles:
- A consumer looking to special services or a services published with a special mark
- Looked services
More information on this pattern is available in this document
Implementing a white board pattern could be complex as the extender needs to track these services dynamically. Indeed looked services can be highly dynamic; they can arrive, leave or be modified at runtime.
Several services specified in the OSGi specification use white board pattern such as the Device Access Manager.
Using the handler
First of all, you need to configure the component type to use the handler such as:
<ipojo xmlns:wbp="org.apache.felix.ipojo.whiteboard"> <component className="org.apache.felix.ipojo.test.FooWhiteBoardPattern" > <wbp:wbp filter="(my.property=1)" onArrival="onArrival" onDeparture="onDeparture" onModification="onModification" /> <provides/> </component>
Notice that, this handler is an external handler. So, it uses the "org.apache.felix.ipojo.whiteboard" namespace.
Once described, you can implement your component. The methods specified methods will be called when a matching services arrives or leaves or are modified. The modification callback is optional. A matching service is detected by confronting the service reference against the specified filter.
The filter can target specific service interface (with the objectclass property) or property values.
In the previous example, these methods could be:
public class FooWhiteBoardPattern implements Observable { List list = new ArrayList(); int modifications = 0; public synchronized void onArrival(ServiceReference ref) { list.add(ref); } public synchronized void onDeparture(ServiceReference ref) { list.remove(ref); } public synchronized void onModification(ServiceReference ref) { modifications = modifications + 1; } public synchronized Map getObservations() { Map map = new HashMap(); map.put("list", list); map.put("modifications", new Integer(modifications)); return map; }
All method received the arriving, leaving or modified service reference.
Configuration
The handler has only three mandatory attributes:
- Filter: filter use to discover matching filter.
- onArrival: declaring the method to invoke when a matching service arrives
- onDeparture: declaring the method to invoke when a matching service leaves
The onModification attribute is optional. This method is called when an injected service reference is modified but stills valid against the filter.
The implementation will be notified of arrivals, modifications and departures, despite the instance is invalid. Indeed, the implementation must release all objects created from another bundle as soon it leaves.
Configuring the handler with annotations [New in 1.1.0-SNAPSHOT]
It is possible to configure the handler with a simple annotation available in the annotation pack ('annotation' project in the iPOJO trunk). Here is an example of usage:
import org.apache.felix.ipojo.annotations.Component; import org.osgi.framework.ServiceReference; @Component @org.apache.felix.ipojo.whiteboard.Wbp(filter="(foo=true)", onArrival="onArrival", onDeparture="onDeparture", onModification="onModification") public class WhiteBoardExemple { public void onArrival(ServiceReference ref) { // do something } public void onDeparture(ServiceReference ref) { // do something } public void onModification(ServiceReference ref) { // do something } }
The onModification
attribute is optional.The filter
attribute allows setting the service filter.
Download
The handler is available on the download page.
Sources are available on the Felix trunk at the following location: http://svn.apache.org/repos/asf/felix/trunk/ipojo/handler/whiteboard
Overview
Getting Started
- iPOJO in 10 minutes
- How to use iPOJO Annotations
- iPOJO Hello Word (Maven-Based) tutorial
- iPOJO Advanced Tutorial
- iPOJO Composition Tutorial
User Guide
- Describing components (handler list)
- Using XML Schemas
- Describing components with the iPOJO-API
- Testing components
- Advanced Topics
- Eclipse Integration
- FAQ
- iPOJO Reference Card
Tools
- iPOJO Eclipse Plug-in
- iPOJO Ant Task
- iPOJO Maven Plug-in
- Online-Manipulator
- iPOJO Arch Command
- iPOJO Webconsole plugin
- Junit4OSGi
Developer Guide
- Javadoc: 1.2
- How to write your own handler
- How to use iPOJO Manipulation Metadata
- Dive into the iPOJO Manipulation depths
Misc & Contact
- Issues Tracker
- Supported JVMs
- Supported OSGi Implementations
- iPOJO's Dark Side Blog
- Future Ideas
- Article & Presentations
Experimentation