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

341
20 Der Application Admin Service
Motivation
Eine auf der OSGi Service Platform aufbauende Anwendung besteht
aus einem oder mehreren Bundles, deren Anwendungscode mit dem
Start der jeweiligen Bundles ausgeführt wird. Daneben existieren
außerhalb der OSGi Platform ganz unterschiedliche Applikationsmo-
delle, bspw. traditionelle Java-Anwendungen, Applets, Midlets oder
auch native Anwendungen.
In diesem Kapitel stellen wir Ihnen den Application Admin Service
vor, der die Einbindung und Administration beliebiger Anwendungs-
typen über einheitliche Schnittstellen unabhängig von der zugrunde
liegenden Technologie ermöglicht. So könnten beispielsweise Anwen-
dungen in Form von Midlets und Applets in die OSGi Service Platform
eingebunden und administriert werden.
Management Agents können die vom Application Admin Service
bereitgestellte Funktionalität nutzen, um das Starten und Stoppen
sowie die Administration der eingebundenen Anwendungen zu ermög-
lichen. In Eclipse Equinox kann der Application Admin Service zudem
für die Verwaltung von Anwendungen genutzt werden, die auf dem
Equinox Application Model aufbauen, das wir Ihnen in Kapitel 23
vorstellen.
Einordnung
Der Application Admin Service ist in Kapitel 116 »Application
Admin Service Specification« des Service Compendium sowie der
Mobile Specification beschrieben.
20.1 Tutorial: Externe Anwendungen starten
Überblick
In diesem Tutorial zeigen wir Ihnen, wie Sie mit dem Application
Admin Service einen Container zur Ausführung beliebiger externer
Anwendungen, bspw. das Notepad unter Windows, implementieren.
Die Realisierung erfolgt in den folgenden Schritten:
20 Der Application Admin Service342
Implementierung des Application Descriptors: Der Application
Descriptor beschreibt eine Anwendung und ist für dessen Ausfüh-
rung verantwortlich.
Implementierung eines Application Handles: Eine Instanz der aus-
zuführenden Anwendung wird durch einen Application Handle
repräsentiert.
Implementierung eines Kommandos registerApp: Über ein neues
Kommando
registerApp können Sie externe Anwendung zunächst
registrieren, um sie dann mit den Equinox-Kommandos des Appli-
cation Admin Service zu starten und zu stoppen.
In Abb. 20–1 sind die beteiligten Bundles mit ihren Abhängigkeiten
dargestellt.
Die Plug-in-Projekte
Das fertige Plug-in-Projekt zu diesem Tutorial ist in Abb. 20–2 darge-
stellt.
Schritt 1: Anlegen des Bundles
Legen Sie zunächst ein neues Bundle mit dem Namen org.osgi-
book.application
und dem folgenden Import-Package-Header an:
Import-Package:
org.eclipse.osgi.framework.console;version="1.0.0",
org.osgi.framework;version="1.4.0",
org.osgi.service.application;version="1.0.0"
Abb. 20–1
Die beteiligten Bundles
verwendet
Klassen aus
MANIFEST.MF
META-INF
org.osgibook.application
MANIFEST
.
MF
org
.os
gib
ook.application
Bundle-SymbolicName:
org.osgibook
.application
OSGi Service Platform /
Application Admin
CommandProvider
Abb. 20–2
Das Plug-in-Projekt
34320.1 Tutorial: Externe Anwendungen starten
Schritt 2: Implementierung des ApplicationHandle
Ein Application Handle repräsentiert eine Instanz einer Anwendung,
die über den Application Admin Service gestartet wurde. Die Klasse
muss von
org.osgi.service.application.ApplicationHandle erben und
u.a. die Methode zum Beenden der Anwendung (
destroySpecific())
implementieren.
Unsere Implementierung des Application Handles startet zunächst
die im Konstruktor übergebene externe Anwendung. Auf deren Ende
wartet ein eigener Thread, der unmittelbar im Konstruktor erzeugt
wird. Die
destroySpecific()-Methode beendet dann den Thread und
damit die Anwendung.
Implementieren Sie also bitte folgende
ExternalApplicationHandle-
Klasse:
package org.osgibook.application;
[...]
import org.osgi.service.application.ApplicationHandle;
public class ExternalApplicationHandle extends ApplicationHandle
implements Runnable {
static int INSTANCE = 0;
private ServiceRegistration serviceRegistration;
private Process process;
private Thread thread;
private String state = RUNNING;
protected ExternalApplicationHandle(
ExternalApplicationDescriptor descriptor) throws IOException
{
super(descriptor.getApplicationId() + ":" +
INSTANCE++, descriptor);
String command = descriptor.getExecutable().getPath();
System.out.println("Executing command: " + command);
process = Runtime.getRuntime().exec(command);
thread = new Thread(this, getInstanceId());
thread.start();
}
protected void destroySpecific() {
state = STOPPING;
serviceRegistration.setProperties(getServiceProperties());
thread.interrupt();
}
Listing 20–1
Die Plug-in-Projekte
20 Der Application Admin Service344
public String getState() {
return state;
}
public void run() {
try {
process.waitFor();
destroy();
} catch (InterruptedException ie) {
process.destroy();
try {
process.waitFor();
} catch (InterruptedException iee) {
}
} catch (Exception e) {
}
serviceRegistration.unregister();
}
Dictionary<String, String> getServiceProperties() {
Hashtable<String, String> p =
new Hashtable<String, String>();
p.put(APPLICATION_PID, getInstanceId());
p.put(APPLICATION_STATE, getState());
p.put(APPLICATION_DESCRIPTOR,
getApplicationDescriptor().getApplicationId());
return p;
}
void setServiceRegistration(ServiceRegistration
serviceRegistration) {
this.serviceRegistration = serviceRegistration;
}
}
Schritt 3: Implementierung des Application Descriptors
Der Application Descriptor beschreibt eine Anwendung, die vom
Application Admin Service verwaltet werden kann. Die Beschreibung
besteht in unserem Beispiel lediglich aus der ausführbaren Datei, die
gestartet werden soll.
Für das Starten der Anwendung ist die
launchSpecific()-Methode
zuständig. Die Methode erzeugt einen neuen External Application
Handle mit der ausführbaren Datei, die von dem Handle dann ausge-
führt wird. Damit der Application Admin Service Zugriff auf den neuen
ApplicationHandle hat, wird er an der Service Registry angemeldet.
Legen Sie bitte die folgende Klasse
ExternalApplicationDescriptor
an:
34520.1 Tutorial: Externe Anwendungen starten
package org.osgibook.application;
[...]
import org.osgi.service.application.ApplicationDescriptor;
import org.osgi.service.application.ApplicationHandle;
public class ExternalApplicationDescriptor
extends ApplicationDescriptor {
private BundleContext bundleContext;
private ServiceRegistration descriptorServiceRegistration;
private File executable;
private boolean locked;
protected ExternalApplicationDescriptor(BundleContext
bundleContext, String applicationId, File executable) {
super(applicationId);
this.bundleContext = bundleContext;
this.executable = executable;
}
protected ApplicationHandle launchSpecific(Map arguments)
throws Exception {
ExternalApplicationHandle handle =
new ExternalApplicationHandle(this);
ServiceRegistration serviceRegistration =
bundleContext.registerService(
ApplicationHandle.class.getName(),
handle, handle.getServiceProperties());
handle.setServiceRegistration(serviceRegistration);
return handle;
}
public Map getPropertiesSpecific(String locale) {
return getServiceProperties();
}
protected boolean isLaunchableSpecific() {
return true;
}
protected void lockSpecific() {
locked = true;
refreshServiceProperties();
}
public boolean matchDNChain(String pattern) {
return false;
}
Listing 20–2
Die Klasse
ExternalApplication-
Descriptor

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