Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt...
Transcript of Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt...
Modulare Anwendungen und die Lookup API
Geertjan WielengaNetBeans Team
Deutschsprachige Überarbeitung, Aljoscha RittnerNetBeans Dream Team
Certified Engineer Course
Die Notwendigkeit modularer Anwendungen
Certified Engineer Course
Die Notwendigkeit modularer Anwendungen
Certified Engineer Course
Die Notwendigkeit modularer Anwendungen
Certified Engineer Course
Die Notwendigkeit modularer Anwendungen
• Anwendungen werden immer komplexer• Sie werden aus Einzelstücken zusammen
gesetzt> Frameworks, 3rd Party Bibliotheken, Legacy
Bibliotheken
• Entwicklung durch verteilte Teams• Komponenten mit umfangreichen
Abhängigkeiten• “Gesunde” Architektur erwartet:
> Wissen über Abhängigkeiten und> Die Verwaltung der Abhängigkeiten
Certified Engineer Course
Die Entropie von Software
• Version 1.0 ist sauber entwickelt...
Certified Engineer Course
Die Entropie von Software
• Version 1.1... einige zweckmäßige Erweiterungen und Hacks...
...wir werden das in 2.0 schon wieder richten.
Certified Engineer Course
Die Entropie von Software
• Version 2.0...nun ja...aber...es läuft!
Certified Engineer Course
Die Entropie von Software
• Version 3.0... Hilfe! Jeder reparierte Fehler erzeugt zwei weitere!
Certified Engineer Course
Die Entropie von Software
• Version 4.0 ist sauber designed. Eine komplette Neuentwicklung. Zwar ein Jahr zu spät, aber es läuft...
Certified Engineer Course
Die Entropie von Software
• Version 4.1... Das erinnert mich doch an etwas?....
Certified Engineer Course
Die Entropie von Software
• Fortsetzung folgt....
Certified Engineer Course
Modulare Anwendungen
• Wissen um ihre Komponenten zur Laufzeit• Dürfen Komponenten während der
Laufzeit hinzufügen, entfernen und neu laden
• Müssen Abhängigkeiten zwischen Komponenten erkennen
• Bieten API Vereinbarungen zwischen Komponenten
• Laufen in einem Runtime Container
Certified Engineer Course
Was macht ein Runtime Container?
• Lebenszyklus der Anwendung> Startet und beendet die Anwendung> (De)installiert Module
• Modul Verwaltung
• Classloading und Modulisolation
• Service Registry & Zugriffs API
Certified Engineer Course
Was ist der NetBeans Runtime Container?
Certified Engineer Course
Demo 1: NetBeans Runtime Container
Certified Engineer Course
Der NetBeans Runtime Container
• Fünf NetBeans Platform ModuleNur diese 5 zusammen: compile & run, mehr wird nicht benötigt.
• Ausschließlich diese Module werden von allen NetBeans Platform Anwendungen benötigt.
• NetBeans Platform Anwendungen müssen nicht (Rich) Client Applikationen sein
• Es sind auch modulare Server Anwendungen denkbar> z.B. mit dem CronJob Plugin zeitgesteuerte
Dienste ansteuern
Certified Engineer Course
Was ist ein NetBeans Module?
• Nur ein JAR File – keine Magie> Es besitzt spezielle Manifest-Einträge für das
NetBeans Modul-System, die in den Project Properties für Module Projekte bearbeitet werden können.
• Verteilt in einem NBM File> Grundsätzlich ein signiertes JAR File> Enthält Metadaten über das Modul> Darf 3rd Party JARs enthalten, oder alles
andere Notwendige für das Modul zur Installation
Certified Engineer Course
Demo 2: Ein NetBeans Modul erstellen
Certified Engineer Course
Demo 3: Verteilen eines NetBeans Moduls
Certified Engineer Course
NetBeans Modul Manifest
ManifestVersion: 1.0
AntVersion: Apache Ant 1.7.1
CreatedBy: 1.5.0_14b03 (Sun Microsystems Inc.)
OpenIDEModulePublicPackages:
OpenIDEModuleModuleDependencies: org.jdesktop.layout/1 > 1.7, org.n
etbeans.api.java/1 > 1.18, org.netbeans.api.java.classpath/1 > 1.0
OpenIDEModuleJavaDependencies: Java > 1.5
OpenIDEModuleBuildVersion: 200907230101
OpenIDEModuleSpecificationVersion: 2.16.2.5.1.1
OpenIDEModule: org.netbeans.modules.java.editor/1
OpenIDEModuleImplementationVersion: 5
OpenIDEModuleLocalizingBundle: org/netbeans/modules/java/editor/Bundle.properties
Certified Engineer Course
NetBeans Module Manifest
OpenIDEModuleLayer: org/netbeans/modules/java/editor/resources/layer.xml
OpenIDEModuleRequires: org.openide.modules.ModuleFormat1
OpenIDEModuleInstall:
org/netbeans/modules/java/editor/JavaEditorModule.class
AutoUpdateShowInClient: false
Certified Engineer Course
Runtime Container Aufgaben
• Sicherstellen, dass Abhängigkeiten aufgelöst sind> Auch mit der Notwendigkeit von
vorgegebenen Versionen• Verhindern von ungültigen
Abhängigkeiten> Falsche Version, falsches Betriebsystem (→
Token)
• Erlauben von gültigen Abhängigkeiten
• “Booten” von Komponenten während der Laufzeit
Certified Engineer Course
Modul Abhängigkeiten erzwingen
Certified Engineer Course
Demo 4: Abhängigkeits Verwaltung
Certified Engineer Course
Verwende vorhandene Runtime Container
Ruhe in Frieden, Home-made Frameworks 1995-2009
1995-2009
Home-made Home-made FrameworkFramework
Certified Engineer Course
Modul Abhängigkeiten
Certified Engineer Course
Trennung der Implementation von der API
• Die API kann in einem Modul deklariert werden, die Implementation in einem anderen Modul
• Module verwenden die API nur, wenn die Abhängigkeit dazu deklariert wurde
Certified Engineer Course
Modulare Bibliotheken
Certified Engineer Course
Abhängigkeiten ermitteln
?● Wie findet die SpellChecker API sein
Implementation?
Certified Engineer Course
Abhängigkeiten ermitteln
?Wie findet die SpellChecker API sein
Implementation?● Oder generell, wie ermöglicht es NetBeans
den Modulen sich in der Applikation zu finden?
Certified Engineer Course
Der Java Extension Mechanismus (nahezu)
• Im JDK seit 1.3• Einfach mit JDK 6's
ServiceLoader.load()• Deklarative
Registrierung• Text Datei(en) in
META-INF/services> Name ist Interface> Inhalt ist FQN der
Implementation
Certified Engineer Course
Demo 5: ServiceLoader, die Java-Lösung
• Das Interface
public interface TextFilter {
String process(String s);
}
• Die Implementation
public class UpperCaseFilter implements TextFilter{
public String process(String s) { return s.toUpperCase(); }
}
Certified Engineer Course
Demo 5: ServiceLoader, die Java-Lösung
• Registrierung der Implementation> Textdatei in METAINF/services
• Load the Interface
String s = textArea.getText();
ServiceLoader<TextFilter> filters = ServiceLoader.load(TextFilter.class);
for (TextFilter textFilter : filters) { if (filters != null) { s = textFilter.process(s); }}textArea.setText(s);
Certified Engineer Course
Demo 6: Lookup/Dependency Verwaltung
String s = textArea.getText();
Collection<? extends TextFilter> filters = Lookup.getDefault().lookupAll(TextFilter.class);
for (TextFilter textFilter : filters) {
if (!filters.isEmpty()) {
s = textFilter.process(s);
}
}
textArea.setText(s);
Certified Engineer Course
Die NetBeans Registrierung
• Vereinfachte Registrierung durch Annotationen
> Keine selbstgeschriebene Plain-Text-Dateien mit Tippfehlern
> Registrierungsinformation direkt an der annotierten Klasse
> Refactoring funktioniert
> Trotzdem Deklarativ, weil zur Compilezeit die Annotationen ausgewertet werden.
Certified Engineer Course
Die NetBeans Registrierung
• Registrierung und Implementation in einer Klasse
import org.netbeans.spi.TextFilter;
import org.openide.util.lookup.ServiceProvider;
@ServiceProvider (service=TextFilter.class)
public class UpperCaseFilter implements TextFilter{
public String process(String s) { return s.toUpperCase(); }
}
Certified Engineer Course
Lookup – Die NetBeans Lösung
• Eine kleine von NetBeans unabhängige Bibliothek> Teil des NetBeans org-openide-util.jar
>org.openide.util.Lookup
• Arbeitet mit jeder Java Version (im Gegensatz zum ServiceLoader)
• Ein Lookup ist dynamisch> Listener für Änderungen
• Lookups können beliebig instantiiert werden> Erzeuge eines und nutze es
• Lookups können kombiniert werden> ProxyLookup vereinigt Lookups und reicht Event-
Nachrichten durch.
Certified Engineer Course
Ein Lookup ist ein „Aquarium“ für Objekte
• Ein „Biotop“ in dem Objekte rein und raus „schwimmen“
• Man erkennt, welche „Arten“ von Objekte hinzukommen oder verschwinden
• Mit einem Befehl bekommt man alle Objekte einer „Art“ als Collection
Bazz.classBazz.class
Foo.classFoo.class
Bar.classBar.class
Lookup
Certified Engineer Course
Nun... Was ist so besonderes daran?
?Was wäre, wenn Objekte
Lookups besäßen?Was wäre, wenn Lookups verkettet werden könnten?
Certified Engineer Course
Objekte, die selbst Lookups besitzen!
• TopComponent
• Node
• DataObject
Certified Engineer Course
Demo 7: TopComponent Lookup
Certified Engineer Course
Demo: TopComponent Lookup
SaveAction Editor
Gib mir ein SaveCookie
ss == null ?
Ja
Deaktiviere die
Action
Nein
Aktiviere die Action
Bei Aufruf: s.save()
interface SaveCookie { void save();}
Certified Engineer Course
Demo 8: TopComponent Lookup
private InstanceContent content;
...
...
...
content = new InstanceContent();
associateLookup(new AbstractLookup(content));
...
...
content.add(s);
Certified Engineer Course
Demo 8: TopComponent Lookup
private Lookup.Result result;
...
...
result = Utilities.actionsGlobalContext().lookupResult(String.class);
result.addLookupListener(new LookupListener() { @Override
public void resultChanged(LookupEvent e) { textArea2.setText(result.allInstances().toString());
}
});
Certified Engineer Course
Zusammenfassung
• Das Lookup wird an jeder Ecke der NetBeans APIs genutzt
• Es wird verwendet für > Die deklarative Registrierung von Global Services
> „Instantiation on Demand“ – Reduziert Startzeit> Trennung von API und Implementation
− Ein Modul bietet eine API− Ein anderes Modul stellt die Implementation
> Kontextsensitivität, z.B., Action-Aktivierung
• Es ist nahezu die wichtigste API auf der NetBeans Platform
Certified Engineer Course
Die Notwendigkeit modularer Anwendungen
Certified Engineer Course
Die Konzepte im Überblick
• Anwendungsentropie• Modularität• Abhängigkeits Verwaltung• Runtime Container• NetBeans Modul• NBM Datei• API vs. Implementation• META-INF/services• ServiceLoader vs. Lookup• Listener für Lookups• Kontextsensitivität mit Lookups
Certified Engineer Course
Fragen & Antworten
http://openide.netbeans.org/lookup/
http://openide.netbeans.org/tutorial/api-design.html
http://bits.netbeans.org/dev/javadoc/org-openide-modules/overview-summary.html