Warning: Table './usr_web1030_3/variable' is marked as crashed and should be repaired query: SELECT * FROM variable in /var/www/web1030/html/mkernel.de/includes/database.mysql.inc on line 128

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1030/html/mkernel.de/includes/database.mysql.inc:128) in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 726

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1030/html/mkernel.de/includes/database.mysql.inc:128) in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 727

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1030/html/mkernel.de/includes/database.mysql.inc:128) in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 728

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1030/html/mkernel.de/includes/database.mysql.inc:128) in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 729
[Coder's Implementation{Objective-C}] Plugin-Architektur 1.0 | Drupal

[Coder's Implementation{Objective-C}] Plugin-Architektur 1.0

  • warning: Cannot modify header information - headers already sent by (output started at /var/www/web1030/html/mkernel.de/includes/database.mysql.inc:128) in /var/www/web1030/html/mkernel.de/includes/common.inc on line 148.
  • user warning: Table './usr_web1030_3/variable' is marked as crashed and should be repaired query: UPDATE variable SET value = 'a:17:{i:0;i:62;i:1;i:61;i:2;i:59;i:3;i:31;i:4;i:30;i:5;i:29;i:6;i:24;i:7;i:21;i:8;i:15;i:9;i:14;i:10;i:11;i:11;i:7;i:12;i:6;i:13;i:5;i:14;i:3;i:15;i:2;i:16;i:1;}' WHERE name = 'menu_masks' in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 609.
  • user warning: Table './usr_web1030_3/variable' is marked as crashed and should be repaired query: UPDATE variable SET value = 'a:0:{}' WHERE name = 'menu_expanded' in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 609.
  • user warning: Table './usr_web1030_3/variable' is marked as crashed and should be repaired query: DELETE FROM variable WHERE name = 'menu_rebuild_needed' in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 634.

Analog zu [Coder's Implementation{C#}] Plugin-Architektur 1.0 folgt jetzt die Referenzimplementierung zu [Coder's Concept] Plugin-Architektur (v 1.0), dieses mal in Objective C für Mac OS X. Am Ende des Artikels ist ein Archiv verlinkt, das den kommentierten Quellcode enthält. Das Projekt wurde mit dem aktuellsten XCode entwickelt.

Klassendesign

Das XCode Projekt enthält insgesamt 3 Projekte, analog zur C#-Lösung. Es gibt ein Framework, das den gemeinsam genutzten Code enthält, die Applikation und ein Beispielplugin als Bundle. Im Projekt sind logische Gruppen für jedes Subprojekt angelegt, um den Quellcode voneinander zu trennen.

Die Klassen im Überblick:
* MyDocument
Die Klasse MyDocument Realisiert das von Cocoa vorgeschriebene Protokoll für Dokumentbasierte Applikationen. Sie enthält eine Liste von Aufgaben (Task-Objekte)
* DocController
Der DocController verhandelt zwischen der Oberfläche und dem Dokument. Hier wird gefiltert, hinzugefügt, geändert und gelöscht.
* PluginManager
Hier ist die notwendige Logik zum Laden der Plugin-Bundles enthalten.
* DoneFilter
Dies ist die Principal-Klasse des Plugins, die gleichzeitig einen Beispielfilter implementiert.
* Unfiltered
Diese Klasse ermöglicht die ungefilterte Ansicht, indem sie keine Aufgaben herausfiltert.
* Task
Die Task-Klasse repräsentiert eine einzelne Aufgabe.
* ITaskFilter
ITaskFilter definiert die von Plugins zu implementierende Schnittstelle.

Applikation

Die Applikation (bestehend aus MyDocument, DocController, Pluginmanager und Unfiltered) bildet die Grundlage des Beispielprojekts. Der Code zum laden von Plugins ist im PluginManager enthalten. Ausserdem ist dieses Ziel so angelegt, dass das Framework in die Applikation eingebettet wird.

Framework

Das Framework als Bindeglied zwischen der Applikation und den Plugins enthält nur den für beide Seiten notwendigen Code: Die Task-Klasse. Wichtig bei der Erstellung des Frameworks: Wenn es eingebettet wird, müssen die Projekteinstellungen an einer Stelle geändert werden:

Dadurch funktioniert das Framework 'nur noch' eingebettet.

Plugin

Das Beispielplugin linkt gegen das Framework und ist in den Buildeinstellungen so konfiguriert, dass es automatisch in den ApplicationSupport Ordner kopiert wird:

Die Applikation wählt als Plugin-Klasse die Principal-Klasse der Bundles aus, deshalb muss die PrincipalClass-Eigenschaft korrekt gesetzt sein:

Nur dann wird das Bundle auch erfolgreich als Plugin geladen und als Filter angeboten.

Andere Lösungsoptionen

In Objective C ist es möglich, beim Übersetzen die Applikation anzugeben, die später das Bundle lädt. Dadurch würde das Framework überflüssig, weil die gemeinsam genutzten Klassen dann aus dem Applikationsbinary gelinkt werden können. Anstatt über die PrincipalClass zu gehen wäre es auch möglich gewesen, eine plist in den Bundles abzulegen, die die NIB-Dateien beschreibt, die Plugins enthalten. Oder die PrincipalClass kann als Controller des Bundles auftreten und eine Liste von Plugins zurückgeben. Hier wären mehrere Erweiterungsmöglichkeiten denkbar. Für die Demonstration der Architektur waren sie jedoch nicht notwendig.