1. 1 Plugin Konzept
Dieses Kapitel beschreibt den Aufbau der konzipierten und erstellten Plugins. Ziel
dieses Kapitels soll es sein, dem Lesenden Einblick in den Plugin-Aufbau zu geben
und die definierten Plugin-Punkte zu Erläutern und etwaige Entscheidungspunkte
beim Aufbau des Plugins herauszuarbeiten und darzustellen.
In dem ersten Punkt dieses Kapitels soll die Zielstellung eines Plugins im Hinblick
auf das Gesamtprojekt definiert werden. Die Frage die in diesem Kapitel aufkommt
lautet: „Weshalb werden Plugins verwendet und wozu dienen sie?“. Ein Plugin
stellt im Blick auf das Gesamtgefüge des Projektes „Setup Script Maker“ den
Zielanwendungscode bereit. Ein Plugin enthält somit Quellcode der Zielsprache
oder sogar der Zielsprachen. Die Struktur dieses Projektes „SetupSkriptMakr“ ist
somit in zwei Teilbereichen zu untergliedern. Der erste Teilbereich, das Frontend,
stellt die Anwendungsoberfläche dar. In dieser kann der Anwender seine
Zielsprache definieren und das Skript zusammenbauen. Der zweite Teilbereich, die
Plugins, stellen den Quellcode der Zielsprache bereit. Das Vorgehen lässt sich
somit folgend beschreiben. Die Plugins werden von dem System eingelesen und
die Struktur und die Inhalte gespeichert.
Hat der Anwender die gewünschte Struktur seines zu erstellenden und
auszugebenden Skriptes definiert und etwaige notwendig Angeben über z.B.
Pfadparameter und Zielparamater, angegeben, wird der Zielquellcode des
jeweiligen Plugins dem Anwenderanforderungen angepasst und als Gesamtskript
in Form eines Batch oder zum Beispiel Shell Files ausgegeben.
Der zweite Punkt dieses Kapitels, soll sich mit der Struktur des Plugins
beschäftigen. In unserem Projekt standen zwei Plugin-Aufbaustrukturen zur
Auswahl.
1. Ein Plugin enthält genau eine Quellzielsprache. Jedoch können in einem
Plugin mehrere Aufgaben definiert werden.
2. Ein Plugin enthält mehrere Quellzielsprache. In einem Plugin befindet sich
jedoch nur ein Aufgabentyp.
Folgendes UML Klassendiagramm soll den Aufbau eines Plugins näher
verdeutlichen.
Abbildung 1. Pluginstruktur 1
2. Abbildung 1 zeigt die oben beschriebene erste Möglichkeit zur Strukturierung eines
Plugins.
Abbildung 2. Pluginstruktur 2
In Abbildung 2 wird mit Hilfe eines UML Klassendiagramm die 2te mögliche
Strukturierung eines Plugins beschrieben.
In unserem Projekt wird ein Plugin als ein elementares Objekt betrachtet, welches
eine bestimmte Aufgabe mit mehreren Quellzielsprachen bereitstellt. Die
Entscheidung viel Aufgrund der besseren Strukturierung. Da in unserem Projekt
die Gewichtung sehr stark auf den Aufgabenteil liegt, soll diese Gewichtung
ebenfalls auf die Plugin-Struktur überführt werden.
Im weiteren Verlauf wird der Plugin-Aufbau detaillierter betrachtet. Es werden die
von uns definierten Plugin-Parameter und erläutert. Der Plugin-Aufbau wird mit der
Extensible Markup Language [XML] beschrieben. Dabei ist XML eine
Auszeichnungssprache zur Darstellung hierarchisch strukturierter Daten in Form
von Textdaten.
Eine Plugin-Hierarchie erfolgt mit dem Element [plugin] welches ein Attribut [id]
enthält. Das Attribut [id] definiert dabei die Eindeutigkeit und Identität eines Plugin.
Innerhalb des Elementes [plugin] existieren eine Vielzahl von weiteren Elementen,
welche nachfolgend beschrieben werden.
Das Element [name] beschreibt den Namen des Plugin, welcher dem Anwender im
System angezeigt wird. Das Element [description] gliedert sich in die
Unterelemente [short] und [long] auf. Das Element [description] ist für die weitere
Beschreibung eines Plugin vorgesehen.
Abbildung 3. Plugin Elemente Name und Beschreibung
3. Das Element [authors] beschreibt die Ersteller oder Autoren des Plugin. Das
Element [authors] kann Elemente vom Typ [author] enthalten
Abbildung 4. Plugin Element Autoren
Ein Autor besitzt hierbei die Element [name], [email], [homepage] und [nickname],
welche die den Plugin-Ersteller eindeutig beschreiben.
Das nachstehende Element [languagesupported] beinhaltet die vom Plugin
bereitgestellten und angebotenen Zielsprachen. Ein Element [languagesupported]
beinhaltet Elemente vom Typ [language]. Die Sprache welche durch das Element
[language] definiert wird, wird durch die Elemente [name] und [platform]
beschrieben.
Abbildung 5. Plugin Element Angebotene Zielsprachen
Das Element [dependencies] enthält mögliche Abhängigkeiten eines Plugins. Ein
[dependencies] Element kann dabei mehrere Elemente vom Typ [dependency]
enthalten. Das Attribut [typ] in dem Element [dependency] sagt aus, von welchem
Typ die Abhängigkeit ist. Ein Typ kann dabei z.B. ein anderes Plugin oder eine
Software sein. Betrifft die Abhängigkeit ein anderes Plugin, muss das Attribut [id]
des Plugin angegeben werden. Eine Abhängigkeit besitzt die Elemente
[description], welche die Abhängigkeit beschreibt, und [filename] oder
[softwarename].
4. Abbildung 6. Plugin Element Abhängigkeiten
Das Element [parameters], beschreibt die Parameter welche der Quellzielcode
erwartet. Ein Element [parameter] besitzt die Attribute [name] –
Parameterbezeichnung, [type] – Typisierungsangabe des Parameters, [id] –
Eindeutigkeitsschlüssel, [lenght] – Länge des zu übergebenden Parameters und
[description] – Parameterbeschreibung.
Abbildung 7. Plugin Element Parameter
Das Element [codesnippets] enthält den Code der Aufgabe. Ein Element
[codesnippets] kann Elemente vom Typ [codesnippet] beinhalten. Ein Element
[codesnippet] muss ein Element [script] beinhalten, in dem der Quellzielcode
eingebunden wird. Durch das Attribute [language] wird die Zielsprache angegeben
und definiert. Das Element [script] kann ein Element vom Typ [imports] beinhalten,
welches mögliche Importdateien einer Zielsprache beinhaltet.
Abbildung 8. Plugin Element Quellzielcode
5. Im folgende wird eine Tabelle dargestellt welche die verwendeten und
angebotenen Quellzielsprachen und die implementierten Aufgaben aufzeigt.
Id Aufgabe Zielsprachen Beschreibung
1. Ordner/File Löschen Windows Batch, Linux löscht einen
Shell und Ruby bestehenden
Ordner
2. Ordner/File Kopieren Windows Batch, Linux Kopiert einen
Shell und Ruby bestehenden
Ordner von A
nach B
3. Ordner/File Verschieben Windows Batch, Linux Kopiert einen
Shell und Ruby bestehenden
Ordner von A
nach B und löscht
Ordner aus A
4. Ordner erstellen Windows Batch, Linux Erstellt einen
Shell und Ruby Ordner
5. Ordnergröße ermitteln Windows Batch, Linux Ermittel die Größe
Shell und Ruby eines
bestehenden
Ordners
6. 2 XML Parser
In diesem Kapitel soll der XML Parser betrachtet werden. Analog zu dem
vorherigen Punkt, soll geklärt werden, was die Aufgabenstellung und der Zweck
des Parser darstellen.
In dem Kapitel [Plugin Konzept] wurde die Plugin-Konzeption und deren Ziel
erläutert. Das Ziel oder die Aufgabe des Parser besteht darin, die definierten
Inhalte des Plugin auszulesen und der Anwendung bereitzustellen. Da das Plugin
mit Hilfe der Extensible Markup Language (XML) beschrieben wurde, wird zum
auslesen eines bestehenden Plugin ein XML-Parser benötigt.
Die Anwendung wurde mit der Sprache Ruby umgesetzt. Somit muss auch der zu
definierende XML Parser mit Ruby entwickelt werden. Ruby stellt dem Entwickler
eine Reihe von XML Parsern zur Verfügung.
In unserem Projekt soll der XML Parser [hpricot] zum Einsatz kommen. Dieser
Ruby XML Parser kann auf der Seite [http://wiki.github.com/why/hpricot/hpricot-
xml] kostenfrei heruntergeladen werden.
Die ausgelesenen Informationen sollen, lautet interner Zielsetzung, in Hashtabellen
abgelegt werden. Folgenden Hashtabellen wurden hierbei angelegt.
PluginDescription:
In dieser Hashtabelle werden die Plugin-ID, der Plugin-Name, die Plugin-Kurz- und
die Plugin-Langbeschreibung gespeichert.
Authors:
Diese Hashtabelle beinhaltet Hashtabelle vom Typ Author.
Author:
Eine Hashtabelle Author beinhaltet die Parameter Name, E-Mail, Homepage und
Nickname des Authors.
LanguageSupported:
Diese Hashtabelle beinhaltet Hashtabelle vom Typ Language.
Language:
Diese Hashtabelle speichert die Informationen der definierten und angebotenen
Sprachen. Die hier gespeicherten Parameter sind der Sprachenname und die
Platform.
DependenciesSoftware:
Beinhaltet Hashtabellen vom Typ DependencySoftware.
DependencySoftware:
Speichert die Informationen der Abhängigkeitsbeschreibung und den Namen der
Software.
DependenciesFile:
Beinhaltet Hashtabellen vom Typ DependencyFile.
7. DependencyFile:
Beinhaltet alle Informationen einen Plugin-Abhängigkeit. Diese sind die Plugin-
Beschreibung und der Plugin-Name.
ParametersInput:
Beinhaltet Hashtabelle vom Typ ParameterInput.
ParameterInput:
Beinhaltet Parameter die den Parameterinput beschreiben. Diese sind der Name,
Typ, ID, Lenght und die Beschreibung.
ParametersOutput:
Beinhaltet Hashtabelle vom Typ ParameterOutput.
ParameterOutput:
Beinhaltet Parameter die den Parameteroutput beschreiben. Diese sind der Name,
Typ, ID, Lenght und die Beschreibung.
CodeShell:
Beinhaltet den Code der Quellzielsprache Shell.
CodeBatch:
Beinhaltet den Code der Quellzielsprache Batch.
CodeRuby:
Beinhaltet sowohl den Code der Quellzielsprache Ruby, als auch weitere
Hashtabellen vom Typ RubyRequire.
RubyRequire:
In dieser Hashtabelle werden die von Ruby benötigten Bibliotheken gespeichert.
Im nachfolgenden sollen die Schritte zum Auslesen eines Elementinhaltes
Beispielhaft aufgezeigt werden.
Um den [hpricot] XML Parser verwenden zu können, wird die Bibliothek [hpricot]
verwendet. Anschließend wird das XML File durch den Befehl
aufgerufen.
Ein Attribut kann durch den Befehl
ausgelesen werden. Mit Hilfe von [each do] Schleifen werden mehrere Elemente
vom selben Typ durchlaufen und der Inhalt ausgelesen. Das Beispiel zum
Auslesen der Unterstützten Programmiersprache soll dies verdeutlichen.
8. Ist das Gesamte XML File durchlaufen, werden Methoden bereitgestellt die zur
Verfügung stehenden Hashtabelle zu ermitteln.