Dotplot Service-Framework

Aus THM-Wiki
Wechseln zu: Navigation, Suche

Das Eclipse-Plugin Dotplot stellt mit einer aus der Genetik stammenden Methode Gemeinsamkeiten einer Menge von Zeichenketten, Wörtern, Wortsequenzen oder Sätzen - allgemein "Tokens" genannt - grafisch dar.

Kurze Beschreibung von Dotplot

Was ist Dotplot?

Ursprünglich stammen Dotplots aus der Genetik, um einen Vergleich von Genen durchzuführen und die Suche nach Ähnlichkeiten in den Erbinformationen zu vereinfachen. Dabei werden die Ketten der Elemente (Guanin, Cytosin, Adenin und Thymin) miteinander verglichen und die graphische Repräsentation des Vergleichs geliefert. Da die Gene oft sehr groß sind, kann eine solche Visualisierung einen besseren Überblick geben.

Man kann natürlich auch verallgemeinernd jede Art einer Anordnung von Elementen oder Tokens miteinander vergleichen, wie z.B. die Wörter einer Sprache.

Grundsätzlich erfolgt die Visualisierung so, dass die Token-Ketten zu einer 2-dimensionalen Matrix aufgespannt werden und jedes Token auf der X-Achse mit jedem auf der Y-Achse verglichen wird. Falls die Tokens gleich sind entsteht an diesem Punkt eine Markierung.

Beispiele

Das erste Beispiel verdeutlicht die Funktionsweise von Dotplot anhand eines sehr einfachen Beispiels:

Kleines Beispiel für einen Dotplot

Dieser Dotplot zeigt den Selbstvergleich (Vergleich gegen sich selbst) des Syntaxbaums von dem eStudy-Portal. Dabei wurde der Syntaxbaum mit Hilfe eines PHP-Parsers erstellt und die einzelnen Baumknoten miteinander verglichen. Der blaue Fleck in der Mitte kennzeichnet riesige String-Arrays, bei dem sehr viele String-Tokens hintereinander auftreten:

Komplexeres Beispiel für einen Dotplot

Matrix4.plot

Bei Matrix4.plot handelt es sich um ein Projekt der FH Giessen-Friedberg, welches im Jahr 2004 mit einem Schwerpunktpraktikum begann. Das Ziel dieses Projekts war das Umsetzen der Dotplot-Idee als Applikation. Bereits am Ende des damaligen Semesters konnte eine erste funktionstüchtige Version als Eclipse-Plugin angeboten werden.

Stand 05/2006:

Mittlerweile wird das DotPlot-Projekt bei sourceforge.net gehostet. Das dritte Mal versuchen Studenten innerhalb eines Schwerpunktpraktikums die Funktionalität des Programmes zu erweitern und zu verbessern. Zusätzlich gab es bereits zwei Diplomarbeiten, wobei sich eine um eine vollkommene Neustrukturierung und Etablierung eines Service-Framework als Grundlage der Applikation gekümmert hat. Das ist auch das Thema dieses Wikis.

Eclipse-Anbindung

Die Dotplot-Applikation wurde als ein sogenanntes Feature für Eclipse entwickelt. Ein Eclipse-Feature ist eine Zusammenfassung von mehreren Eclipse-Plugins, die jeweils neue Funktionalität in das Eclipse-Framework integrieren.

Zum einen bietet Eclipse das Standard Widget Toolkit (SWT), mit dem die graphische Oberfläche gestaltet werden kann. Zum anderen wurde eine neue Eclipse-Perspektive erstellt, in der die Applikation angezeigt werden kann.

Matrix4.plot wird mittlerweile als Rich Client angeboten. Seit Version 3.1 bietet Eclipse die Möglichkeit das eigene Eclipse-Feature als eigenständiges Programm zu bauen, sogenannte Rich Clients. Dabei werden nur die notwendigen Eclipsekomponenten (Eclipse-Kern, SWT, JFace) integriert und die eigene Funktionalität hinzugefügt. Man muss jetzt also nur den Rich-Client starten und nicht mehr das komplette Eclipse mit allen nötigen und unnötigen Features. Das bringt eine Ressourcenersparnis von ca. 90%.

Grundlegende Funktionsweise

Das Erstellen von Dotplots aus Textdateien funktioniert nach folgendem Ablauf:

  • Ein Tokenizer, z.B ein Scanner, fasst die Zeichen des Textes nach bestimmten Regeln (definiert durch reguläre Ausdrücke) zu Zeichenketten, sog. Tokens zusammen. Der Scanner erzeugt also aus einer Textdatei einen Strom von Tokens. Der Scannergenerator JFlex kann verschiedene Scanner für verschiedene Programmiersprachen generieren. Mehrere Tokenströme können nun hintereinander weiterverarbeitet werden, wobei jedes Token speichert aus welcher Datei es gekommen ist.
  • Tokenströme können durch Filter laufen, welche bestimmte Tokens oder Tokenarten herausfiltert. Ein Filter nimmt als Input einen Tokenstrom und gibt als Output einen Tokenstrom zurück.
  • Die Tokens eines Tokenstroms werden dann in die sog. F-Matrix eingepflegt. Durch Aufspannen der Tokens auf einer 2-dimensionalen Matrix wird eine Matrix von Fließkommazahlen erstellt, die die Position und Gewichtung der Tokentreffer speichert. Gewichtung ermittelt sich aus der Häufigkeit von Tokens. Je öfter ein bestimmtes Token auftaucht destso geringer wird es gewichtet.
  • Aus der F-Matrix heraus wird innerhalb des Programmteils Q-Image das eigentliche Bild erstellt, wobei anhand der Gewichtung die Farbe bestimmt wird, damit selten vorkommende Tokens anders aussehen als häufig vorkommende.

Diese Vorgehensweise basiert auf dem Muster Pipes & Filters. Ein Filter hat einen Input und erzeugt daraus einen Output. Die einzelnen Filter werden durch Kanäle (Pipes) miteinander verbunden, so dass der Output eines Filters der Input eines anderen Filters darstellt. So ist es möglich, dass die Filter parallel arbeiten und die ersten Eingabedaten des ersten Filters in der Kette direkt weiter durchgereicht werden können, so dass bereits aus dem letzten Filter der Output kommt, bevor die Eingabedaten komplett eingelesen wurden.

Grundlegende konzeptionelle Änderungen an Matrix4.plot

Plotquelle

Die Quelle für einen Dotplot soll sich nicht nur auf Dateien beschränken, sondern soll auch die Möglichkeit bieten Daten aus einer Datenbank oder aus dem Internet zu beziehen.

Dazu wurde das Konzept der Plotquelle eingeführt, welches allgemein die Daten für einen Dotplot liefern kann, also ein Objekt, was neben einem Namen und der Größe auch lokalisierbar und lesbar ist.

Typisierung

Typhierarchien

Eine Plotquelle soll typisiert sein, so dass für die Eingabedaten eine typgerechte Verarbeitung stattfinden kann. Dabei werden Typhierarchien durch Vererbung aufgebaut.

z.B.:

  • Ein bestimmter Filter, der nur auf Source-Code-Dateien angewendet werden kann.
  • Ein Scanner, der nur C-Dateien bearbeiten kann.

Konfigurationsmanagement

Die Konfiguration für die Dotplotapplikation soll abgespeichert werden können, wobei sich eine Unterstützung durch die Eclipse-Konfiguration anbietet, welche es ermöglicht die Daten abzuspeichern und nach dem Neustart wieder zu laden. Um aber eine breite Abhängigkeit an die Eclipse-Plattform durch Zugriff auf die Eclipse-Konfiguration an vielen Stellen im Code zu vermeiden, wird ein eigenes Konfigurationsmanagement eingeführt, welches intern auf die Eclipse-Konfiguration zugreift. Bei einem Plattformwechsel braucht man nur das eigene Konfigurationsmanagement auf die neue Plattform anpassen.

Service-Framework

Das neue Service-Framework soll die grundlegende Funktionsweise von Matrix4.plot unterstützen, indem es möglich ist mehrere Services hintereinander zu schalten (Servicekette). Dabei übernimmt ein Service die Aufgabe eines Filters aus dem Muster Pipes & Filters. Das Service-Framework bietet außerdem einen globalen "FrameworkContext", der es jedem Service erlaubt auf allgemeine Dienste des Systems zuzugreifen.

Services

Ein "Service" ist eine gekapselte Ausführungseinheit, welche aus einem Input einen Output erzeugt. Die Eingabedaten werden in Form eines "WorkingContexts" angegeben und nach der Ausführung ein "ResultContext" für die Ausgabedaten erstellt.

Ein "Service" ist ein persistentes Objekt, welches in einer Service-Registry mit einer eindeutigen ID registriert ist. Die Registry ist Bestandteil des globalen "FrameworkContexts", damit alle Services von jedem Objekt gefunden werden können.

Ein Service erzeugt ein "Task"-Objekt zur Erfüllung seiner Aufgabe und instruiert die "Task" mit seinen Eingabedaten.

Tasks

Ein "Task" besteht selbst aus einzelnen "TaskParts", damit die Aufgabe in kleine Teile aufgeteilt und einzeln, möglichst parallel, bearbeitet werden kann. Der "TaskProcessor" bestimmt wie eine "Task" bzw. dessen "TaskParts" bearbeitet werden sollen (z.B. in welcher Reihenfolge, was ist parallelisierbar, ...).

Der "TaskProcessor" verwendet einen "TaskMarshaller", der aus den Einzelergebnissen der "TaskParts" ein Gesamtergebnis zusammensetzt.

Hotspots

Ein "Service" kann über einen "Hotspot" erweitert werden, indem über eine allgemeine Schnittstelle Objekte mit neuer Funktionalität in einen "Service" integriert werden können.

Die Funktionalität wird in einer Klasse vom Typ "Extension" übergeben, welche einerseits einen "ExtensionActivator" beherbergt und andererseits eine Klasse mit beliebig vielen Parametern für die neue Funktionalität .

Jobs

Um eine Aktion oder einen Ablauf im Service-Framework zu starten, also die Funktionalität eines "Services" oder mehrerer Services ("Servicekette") zu aktivieren, bietet das Framework sog. "Jobs". Damit ist es möglich, dass die grundlegende Funktionsweise von Matrix4.plot unterstützt wird, die nach dem Pipes & Filters Muster arbeitet. Ein Filter wird von einem "Service" repräsentiert, welcher den "WorkingContext" als Input und den "ResultContext" als Output hat. Der "Job" verknüpft nun mehrere "Services" hintereinander und liefert jedem Service als "WorkingContext" den "ResultContext" des vorigen Services.

Pluginmechanismus für das Service-Framework

Das Service-Framework wird mit Hilfe des Plugin-Frameworks erweitert, so dass Plugins, welche "Services", "Extentions" und "Jobs" enthalten können, zur Startzeit des Systems nachgeladen und in das System integriert werden können, damit neue Funktionalität nachträglich für das System entwickelt werden kann. Der "FrameworkContext" wird durch einen "PluginContext" erweitert und bietet:

  • Eine PluginRegistry, bei der alle Plugins registriert werden.
  • Die Festlegung eines Plugin-Verzeichnisses, wo Plugins in Form von Jar-Dateien abgelegt werden. Gleiche Plugins mit verschiedenen Versionen werden erkannt und nur das neuere benutzt.

Plugins

Ein Plugin wird durch die Klasse "Plugin" repräsentiert und kapselt "Services", "Extentions" und "Jobs". Das Plugin wird in Form eines Jar-Archives bereitgestellt, dass neben den Klassen für die neuen Funktionen ein XML-Dokument enthält. Diese Datei, dotplotplugin.xml, dient zur Konfiguration und Beschreibung des Plugins.

Elemente der Pluginbeschreibungsdatei

Das Format wird anhand der DTD festgelegt und enthält folgende Elemente:

Dotplotplugin

Das ist das Hauptelement der XML-Datei, dass die wichtigsten Metadaten, die ein Plugin ausmachen werden über die Attributliste definiert:

  • id: Identifiziert das Plugin systemweit eindeutig und sollte folgender Konvention folgen: [Domain des Providers].[Name des Plugins]
  • name: Ein gut verständlicher Name für das Plugin.
  • version: Versionsnummer
  • provider und info sind Zusatzinformationen über Hersteller und Funktionalität

Als Unterknoten werden nun Dependency-, Service-, Job- und Batchjob-Elemente spezifiziert.

Dependency

Dieses Element bestimmt welche Abhängigkeiten ein Plugin zu anderen Plugins hat. Die Attribute:

  • plugin: ID des Plugins, welches vorhanden sein muss.
  • version: Version des Plugins

Dieses Element kann mehrfach auftreten, um mehrere Abhängigkeiten darzustellen.

Service

Mit diesem Element werden neue Services und/oder neue Extentions integriert. Wenn nur eine neue Extention zu einem bestehenden Service eingefügt wird, kann das Attribut „class“ weggelassen werden.

  • id: ID unter der der Service registriert werden soll bzw. registriert ist.
  • class: Name der Klasse vom Typ „IService“, die einen neuen Service bereitstellt.

Auch dieses Element kann mehrfach auftreten, um mehrere Services oder Extentions (als optionaler Unterknoten von Service) einzufügen.

Extention

Extention beschreibt eine Erweiterung für einen Service an einem bestimmten Hotspot:

  • hotspot: ID des Hotspots an dem die Erweiterung eingefügt wird.
  • class: Name der Klasse vom Typ „Extention“, die die Erweiterung enthält.
  • factory: Ist optional und bestimmt die Factory vom Typ „IExtentionFactory“, mit der die Erweiterung erzeugt werden kann. Falls die Factory nicht angegeben ist, wird die Extention direkt über die Methode newInstance() erzeugt.

Zusätzliche Parameter der Extention werden über den Unterknoten „Parameter“ definiert.

Parameter

Die Parameter bestimmen die genauere Verwendung der Erweiterung. Man kann über die Erweiterung auf die Parameter zugreifen. Ein Parameter hat folgende Attribute:

  • name: Name des Parameters, der eindeutig für die Erweiterung ist.
  • value: Wert des Parameters

Jobs

Über dieses Element wird dem System ein Job hinzugefügt. Attribute:

  • id: ID unter der der Job registriert wird.
  • class: Name der Klasse vom Typ „IJob“, die den Job enthält.

Batchjob

Dieses Element beschreibt das Abarbeiten einer Servicekette. Jeder Service wird mit einem Unterknoten Task angegeben.

  • id: ID unter der der Batchjob registriert wird.

Task

Die Element bestimmt einen Service innerhalb eines Batchjobs.

  • serviceid: ID des Services innerhalb eines Batchjobs.

Services für das Plugin-Framework

Das Plugin-Framework bietet 3 Services zum Laden, Initialisieren und Integrieren von Plugins in das System während des Programmstarts.

PluginLoadingService

Der PluginLoadingService kümmert sich um das Laden der Plugin-Klassen und erledigt die Auflösung der Abhängigkeiten zwischen verschiedenen Plugins (z.B.: Ein Plugin bietet eine Extention für einen Service, welcher selbst durch ein anderes Plugin bereitgestellt wird). Dabei werden die „dotplotplugin.xml“-Dateien aller Plugins eingelesen und eine Lade-Reihenfolge bestimmt.

PluginIntegrationService

Anhand einer Liste aller Plugins, die der PluginLoadingService liefert, werden die Plugins vom PluginIntegrationService in den „PluginContext“ integriert.

InitializerService

Danach werden die neuen integrierten Services durch den InitializerService initialisiert. Der InitializerService bietet außerdem noch 2 Hotspots „Startup“ und „Shutdown“, die es dem Systementwickler durch Erweiterungen der Hotspots ermöglichen beim Aufstarten und Herunterfahren benutzerdefinierte Funktionen zu aktivieren.

Services/Plugins innerhalb Matrix4.plot

Damit die Dotplotapplikation „Matrix4.plot“ mit dem neuen Service-Framework bzw. Plugin-Framework zusammen arbeitet wird das Kernsystem angepasst und u.a. das Core-Plugin integriert.

Das Core-Plugin

Mit dem Core-Plugin verhält es sich anders als mit normalen Plugins, weil es fest im Framework implementiert ist und automatisch geladen wird. Es enthält die drei bereits vorgestellten Services für das Plugin-Framework (PluginLoadingService, PluginIntegrationService, InitializerService) und drei Systemjobs: „PluginLoadingJob“, „StartupJob“, „ShutdownJob“. Der PluginLoadingJob bildet eine Servicekette der drei Services des Plugin-Framework und lädt somit die übrigen Plugins. Der StartupJob führt die Erweiterungen des Hotspots „StartUp“ des Services „InitializerService“ aus und der ShutdownJob arbeitet äquivalent dazu am Hotspot „Shutdown“.

Start von Matrix4.plot

Die Methode getContext() der Klasse "ContextFactory" erzeugt ein "DotplotContext"-Objekt, welches den "PluginContext" des Plugin-Frameworks auf dotplotspezifische Weise erweitert. In diesem DotplotContext wird das Core-Plugin integriert und der "PluginLoadingJob" und danach der "StartupJob" ausgeführt (beim Herunterfahren des Systems wird der ShutdownJob aktiviert). Der DotplotContext dient jetzt als FrameworkContext für das Dotplot-System. Das bedeutet der DotplotContext ist zentrale Anlaufstelle des Systems, wo alle wichtigen Parameter z.B. Services, Plugins, Jobs, usw. gespeichert werden. Dotplotspezifische Daten innerhalb des DotplotContexts sind:

  • ConfigurationRegistry: Hier werden Configuration-Objekte von Services registriert und beim Herunterfahren der Dotplot-Applikation in der Eclipse-Konfiguration gespeichert.
  • TypeRegistry: Verwaltet alle Typen für Plotquellen.
  • TypeBindingRegistry: Verbindet Quelltypen mit einer Dateiendung.

DotplotService

Alle neuen Services und die meisten der bestehenden Services haben die Klasse „DotplotService“ als Oberklasse, damit die Services bestimmte Dienste des Systems nutzen können. Einerseits wird automatisch ein „Configuration“-Objekt für einen solchen Service angelegt, damit ein solcher Service Konfigurationsdaten automatisch abspeichern lassen kann. Andererseits hat ein DotplotService zwei Hotspots: „Before“ und „After“, an denen Funktionen eingefügt werden können, die vor bzw. nach Bearbeitung des Services aufgerufen werden.

Services zur Realisierung der Dotplot-Applikation

Converter

Dieser Service konvertiert Quelldaten von einem Typ in den anderen (z.B.: PDF zu Text). Auch können neue Quell-Typen eingefügt werden und an Dateiendungen gebunden werden. Zwei Hotspots werden angeboten:

  • newConverter: Zum Einfügen eines neuen Converters.
  • newType: Einfügen eines neuen Types und binden an eine Dateiendung. Parameter:
    • name: Name des Types
    • suffix: Dateiendung

Tokenizer

Der Service Tokenizer verwandelt eine Liste von Plotquellen in einen Tokenstream. Dabei wird je nach Typ der Plotquelle der entsprechende Tokenizer (z.B.: Scanner) zugewiesen. Hotspot:

  • newTokenizer: Einfügen eines Tokenizers. Parameter:
    • id: ID des Tokenizers
    • name: Name des Tokenizers

Filter

Der Service Filter bietet die Möglichkeit mehrere Filter hintereinander zu schalten und den Tokenstrom, der vom TokenizerService kommt, zu filtern. Dabei hängt es auch vom Quelltyp ab, welcher Filter aktiv ist. Hotspot:

  • newFilter: Einfügen eines neuen Filters. Parameter:
    • name: Name des Filters
    • ui: Eine Klasse, mit der die Einstellungen des Filters eingestellt werden können.

F-Matrix

Dieser Service erzeugt aus dem Tokenstrom die F-Matrix.

Q-Image

Dieser Service generiert aus der F-Matrix das fertige Bild, den Dotplot.

GUI

Der Service der GUI ermöglicht das Einfügen von Konfigurationsansichten und Menüs. Hotspots:

  • View: Einfügen von neuen Konfigurationsansichten. Parameter:
    • id: ID der Konfigurationsansicht
  • Menu: Einfügen eines Menü- bzw. Submenu-Eintrags. Parameter:
    • id: ID des Menüs
    • name: Name des Menus in der Menüleiste
    • menu: ID des Eltern-Menüs
  • Entry: Erstellen eines Eintrags in einem Menü zum Aktivieren eines Jobs. Parameter:
    • name: Name des Eintrags in der Menüleiste
    • menu: ID des Elternmenüs
    • job: Klassenname des auszuführenden Jobs


Quellen