Integrating OSGi Framework Editor parts in a WTP server adapter
The OSGi Framework Editor feature provides three editor parts that can be integrated in an adopter's WTP server adapter:
- Bundle Information - lists all of the bundle in the OSGi framework, their state and dependencies.
- Bundle Dependency Graph - displays the bundle dependencies as a graph.
- Server Console - allows users to execute commands on the running server and see the result.
Adding the editor parts in the adopter's server editor
Each of the editor parts can be added as an additional tab to the server editor of the adopter's WTP server adapter. Adopters can choose to either add all three of them, or just the ones they would like.
This can be done by using the
org.eclipse.wst.server.ui.editorPages extension point.
Below are given example usages of this extension point for Libra Launchers.
- for the Bundle Information editor part:
<extension point="org.eclipse.wst.server.ui.editorPages"> <page class="org.eclipse.libra.framework.editor.ui.overview.BundleInformationEditorPage" id="org.eclipse.libra.framework.editor.integration.bundleInformation" name="Bundle Overview" order="30" typeIds="org.eclipse.libra.framework.*"> </page> </extension>
- for the Bundle Dependency Graph editor part:
<extension point="org.eclipse.wst.server.ui.editorPages"> <page class="org.eclipse.libra.framework.editor.ui.dependencies.BundleDependencyEditorPage" id="org.eclipse.libra.framework.editor.integration.bundleDependency" name="Bundle Dependency Graph" order="40" typeIds="org.eclipse.libra.framework.*"> </page> </extension>
- for the Server Console editor part:
<extension point="org.eclipse.wst.server.ui.editorPages"> <page class="org.eclipse.libra.framework.editor.ui.console.ServerConsoleEditorPage" id="org.eclipse.libra.framework.editor.integration.serverConsole" name="Console" order="50" typeIds="org.eclipse.libra.framework.*"> </page> </extension>
In the above examples only the
class attribute is mandatory to point to the given value. The
typeIds must match the server type id of the adopter's WTP server. All other attribute can be customized to values that best fit the adopter's needs. For detailed description of available attributes and their usage consult the description of the extension point.
The described contributions to the org.eclipse.wst.server.ui.editorPages extension point will only work if the respective packages are imported as dependencies to the contributing plug-in. Here are the necessary imports in the META-INF/MANIFEST.MF:
Import-Package: org.eclipse.libra.framework.editor.ui.console;version="[0.1.0,2.0.0)", org.eclipse.libra.framework.editor.ui.dependencies;version="[0.1.0,2.0.0)", org.eclipse.libra.framework.editor.ui.overview;version="[0.1.0,2.0.0)"
Connecting the editor parts with the server runtime
Adding the editor parts to the server editor is just the UI part of the story. The more important (and complex) one is connecting the UI of the editor parts with the state and behavior of the underlying server runtime.
The editor parts try to adapt the
IServer object to a suitable interface that can feed them with the required data and capabilities.
The Bundle Information and the Bundle Dependency Graph editor parts adapt the
IServer object to the
org.eclipse.libra.framework.editor.core.IOSGiFrameworkAdmin interface, using a code similar to the one below:
IOSGiFrameworkAdmin admin = (IOSGiFrameworkAdmin) getServer().getOriginal() .loadAdapter(IOSGiFrameworkAdmin.class, null);
The Server Console editor parts adapts the
IServer object to the
org.eclipse.libra.framework.editor.core.IOSGiFrameworkConsole interface, using a code similar to the one below:
IOSGiFrameworkConsole admin = (IOSGiFrameworkConsole) getServer().getOriginal() .loadAdapter(IOSGiFrameworkConsole.class, null);
The easiest way to make your adopter's WTP server adaptable to the above interfaces is to implement them in the subclass of either the
ServerDelegate or the
ServerBehaviourDelegate classes. There is an excellent example how to do this in the
OSGIFrameworkInstanceBehaviorDelegate of Libra Launchers.
The most tricky part is the implementation of the
IOSGiFrameworkAdmin.getBundles() method. It returns a
Map<Long, IBundle> that is a collections of
IBundle objects that represents the OSGi bundles with their state and dependencies. The
IBundle interface references several other interfaces for package and service dependencies. All these interfaces from the
org.eclipse.libra.framework.editor.core/model must be also implemented by the adopter.
Using the standard OSGi JMX implementation for integration
Fortunately, the OSGi Framework Editor feature contains a plugin - org.eclipse.libra.framework.editor.integration - that provides a basic, yet fully functional, implementation for integrating the editor parts with an OSGi runtime.