O'Reilly logo

Die OSGi Service Platform: Eine Einführung mit Eclipse Equinox by Matthias Lübken, Bernd Kolb, Nils Hartmann, Gerd Wütherich

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

22 Extension Points und Extensions384
zusätzlich das Interface org.eclipse.core.runtime.dynamichelpers.IEx-
tensionChangeHandler
, das an einem ExtensionTracker registriert wird.
package org.osgibook.helloworld.swing;
[...]
public class ActionDialog extends JDialog
implements IExtensionChangeHandler {
public static final String EXTENSION_POINT_ID =
"org.osgibook.helloworld.swing.action";
private ExtensionTracker tracker;
public ActionDialog() {
setTitle("Extension Point Example");
getContentPane().setLayout(
new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
initializeExtensions();
}
public Dimension getPreferredSize() {
return new Dimension(500, 200);
}
public void dispose() {
tracker.unregisterHandler(this);
super.dispose();
}
public void addExtension(IExtensionTracker tracker,
IExtension extension) {
Action action;
try {
action = createActionFromExtension(extension);
} catch (CoreException ex) {
ex.printStackTrace();
return;
}
JButton button = new JButton(action);
tracker.registerObject(extension, button,
IExtensionTracker.REF_STRONG);
getContentPane().add(button);
pack();
repaint();
}
public void removeExtension(IExtension extension,
Object[] objects) {
Listing 22–2
Die Klasse
ActionDialog
38522.1 Tutorial: Ein erweiterbarer Dialog
for (Object handle : objects) {
JButton button = (JButton) handle;
getContentPane().remove(button);
pack();
repaint();
}
}
private void initializeExtensions() {
IExtensionRegistry registry = RegistryFactory.getRegistry();
IExtensionPoint extensionPoint = registry
.getExtensionPoint(EXTENSION_POINT_ID);
IExtensionTracker tracker = new ExtensionTracker(registry);
for (IExtension extension : extensionPoint.getExtensions()) {
addExtension(tracker, extension);
}
tracker.registerHandler(this, ExtensionTracker
.createExtensionPointFilter(extensionPoint));
}
private Action createActionFromExtension(IExtension extension)
throws CoreException {
IConfigurationElement actionElement =
extension.getConfigurationElements()[0];
Action action = (Action)
actionElement.createExecutableExtension("class");
String title = actionElement.getAttribute("title");
action.putValue(Action.NAME, title);
return action;
}
}
Schritt 1e: Anlegen der Aktivator-Klasse
Die Aktivator-Klasse des Bundles ist lediglich dafür verantwortlich,
beim Starten des Bundles den Dialog zu erzeugen und ihn beim Stop-
pen des Bundles wieder zu schließen:
package org.osgibook.helloworld.swing;
[...]
public class Activator implements BundleActivator {
private ActionDialog mainDialog;
public void start(BundleContext context) throws Exception {
mainDialog = new ActionDialog();
mainDialog.setVisible(true);
mainDialog.toFront();
}
Listing 22–3
Die Klasse Activator
22 Extension Points und Extensions386
public void stop(BundleContext context) throws Exception {
mainDialog.dispose();
}
}
Schritt 2a: Anlegen des Bundles org.osgibook.helloaction
Legen Sie nun ein zweites Bundle mit dem Namen org.osgibook.hel-
loaction
an. Dieses Bundle importiert keine weiteren Packages. Beach-
ten Sie, dass auch für dieses Bundle das
singleton-Attribut gesetzt wer-
den muss:
Bundle-SymbolicName: org.osgibook.helloaction;singleton:=true
Schritt 2b: Eine Action für den Dialog anbieten
Jetzt fehlt uns noch eine Action, die wir für den Dialog bereitstellen
können. Dazu legen Sie das Bundle
org.osgibook.helloaction an, in
dem Sie die Klasse
org.osgibook.helloaction.HelloAction erstellen.
Diese Action öffnet bei ihrer Ausführung einen einfachen Dialog mit
einer Grußbotschaft:
package org.osgibook.helloaction;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
public class HelloAction extends AbstractAction {
public HelloAction() {
}
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Hallo Welt!");
}
}
Schritt 2c: Die Extension definieren
Im letzten Schritt müssen wir eine Extension definieren, die die Hello-
Action für den Extension Point
action zur Verfügung stellt. Die Defini-
tion von Extensions kann ebenfalls mit dem grafischen Manifest-Editor
erfolgen. Wählen Sie dazu auf der Overview-Registerkarte des Mani-
fest-Editors den Link Extensions aus. Eclipse legt dann eine
plugin.xml-
Datei innerhalb der Plug-in-Projekte an und öffnet die Extensions-Re-
gisterkarte (vgl. Abb. 22–5). Die Funktionsweise des Extension-Point-
Editors (vgl. Abb. 22–3) ist detailliert unter [ECHEME] beschrieben.
Listing 22–4
Die Klasse HelloAction
38722.1 Tutorial: Ein erweiterbarer Dialog
Der New Extension Dialog
Um eine neue Extension zu definieren, klicken Sie auf Add... oder wäh-
len Sie im Kontextmenü New -> Extension... . Im sich öffnenden New
Extension-Dialog wählen Sie den Extension Point, für den Sie eine
Extension anbieten möchten. Standardmäßig zeigt Eclipse nur die
Extension Points an, die in einem Bundle definiert sind, auf das Ihr
Bundle eine Package-Abhängigkeit hat. Da das Bundle
org.osgibook.
helloaction
keine Package-Abhängigkeit auf das Bundle org.osgibook.
helloworld.swing
besitzt, müssen Sie die Markierung Show only exten-
sion points from the required plug-ins entfernen, so dass alle bekann-
ten Extension Points angezeigt werden. Wählen Sie aus der Liste den
Extension Point
org.osgibook.helloworld.swing.action und schließen
Sie den Dialog. Die Nachfrage, ob Sie das Bundle
org.osgibook.
helloworld.swing
zu Ihren Abhängigkeiten hinzufügen möchten, vernei-
nen Sie bitte.
Definition der Extension
Im grafischen Editor wird nun die Extension zum ausgewählten
Extension Point angezeigt. Wählen Sie bitte das Unterelement
(action)
aus, so dass auf der rechten Dialogseite unter Extension Element
Details die beiden Attribute der Extension angezeigt werden. Tragen
Sie im Feld class die Klasse
org.osgibook.helloaction.HelloAction und
im Feld title den String »Gruß ausgeben« ein. Damit ist Ihre Extension
definiert. Die Definition der Extension wird in der Datei
plugin.xml
gespeichert.
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
<extension
point="org.osgibook.helloworld.swing.action">
<action
Abb. 22–5
Der Extension Editor
Listing 22–5
Die Datei plugin.xml
22 Extension Points und Extensions388
class="org.osgibook.helloaction.HelloAction"
title="Gruß ausgeben">
</action>
</extension>
</plugin>
Schritt 3: Ausführen des Beispiels
Anlegen der
Launch-Konfiguration
Legen Sie nun eine neue Launch-Konfiguration an, in der Sie neben
den beiden Bundles aus Ihrem Workspace auch die folgenden Bundles
starten:
org.eclipse.equinox.common
org.eclipse.equinox.registry
org.eclipse.osgi
Starten der
Anwendung
Wenn Sie die Launch-Konfiguration ausführen, sehen Sie, wie sich der
Dialog öffnet und sich darauf eine Schaltfläche für Ihre Action befin-
det. Wenn Sie die Schaltfläche anklicken, wird die Action ausgeführt,
und der Dialog mit der Grußbotschaft erscheint:
Wenn Sie das »helloaction«-Bundle mit dem
uninstall-Kommando
deinstallieren, sehen Sie, dass der Button aus dem Dialog verschwin-
det:
uninstall org.osgibook.helloaction
Bitte beachten Sie, dass es nicht ausreicht, das Bundle zu stoppen, da
Extension Points und Extensions auch dann verfügbar sind, wenn ein
Bundle nicht gestartet, sondern lediglich installiert ist.
Damit haben Sie Ihren ersten Extension Point sowie eine dazu pas-
sende Extension entwickelt. In den folgenden Kapiteln werden wir
Ihnen nun die Details dazu genauer vorstellen.
Abb. 22–6
Der Action-Dialog

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required