Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt...

49
Modulare Anwendungen und die Lookup API Geertjan Wielenga NetBeans Team Deutschsprachige Überarbeitung, Aljoscha Rittner NetBeans Dream Team

Transcript of Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt...

Page 1: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Modulare Anwendungen und die Lookup API

Geertjan WielengaNetBeans Team

Deutschsprachige Überarbeitung, Aljoscha RittnerNetBeans Dream Team

Page 2: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Die Notwendigkeit modularer Anwendungen

Page 3: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Die Notwendigkeit modularer Anwendungen

Page 4: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Die Notwendigkeit modularer Anwendungen

Page 5: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 6: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Die Entropie von Software

• Version 1.0 ist sauber entwickelt...

Page 7: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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.

Page 8: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Die Entropie von Software

• Version 2.0...nun ja...aber...es läuft!

Page 9: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Die Entropie von Software

• Version 3.0... Hilfe! Jeder reparierte Fehler erzeugt zwei weitere!

Page 10: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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...

Page 11: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Die Entropie von Software

• Version 4.1... Das erinnert mich doch an etwas?....

Page 12: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Die Entropie von Software

• Fortsetzung folgt....

Page 13: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 14: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 15: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Was ist der NetBeans Runtime Container?

Page 16: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Demo 1: NetBeans Runtime Container

Page 17: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 18: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 19: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Demo 2: Ein NetBeans Modul erstellen

Page 20: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Demo 3: Verteilen eines NetBeans Moduls

Page 21: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

NetBeans Modul Manifest

Manifest­Version: 1.0

Ant­Version: Apache Ant 1.7.1

Created­By: 1.5.0_14­b03 (Sun Microsystems Inc.)

OpenIDE­Module­Public­Packages: ­

OpenIDE­Module­Module­Dependencies: org.jdesktop.layout/1 > 1.7, org.n

 etbeans.api.java/1 > 1.18, org.netbeans.api.java.classpath/1 > 1.0

OpenIDE­Module­Java­Dependencies: Java > 1.5

OpenIDE­Module­Build­Version: 200907230101

OpenIDE­Module­Specification­Version: 2.16.2.5.1.1

OpenIDE­Module: org.netbeans.modules.java.editor/1

OpenIDE­Module­Implementation­Version: 5

OpenIDE­Module­Localizing­Bundle: org/netbeans/modules/java/editor/Bundle.properties

Page 22: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

NetBeans Module Manifest

OpenIDE­Module­Layer: org/netbeans/modules/java/editor/resources/layer.xml

OpenIDE­Module­Requires: org.openide.modules.ModuleFormat1

OpenIDE­Module­Install:

  org/netbeans/modules/java/editor/JavaEditorModule.class

AutoUpdate­Show­In­Client: false

Page 23: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 24: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Modul Abhängigkeiten erzwingen

Page 25: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Demo 4: Abhängigkeits Verwaltung

Page 26: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Verwende vorhandene Runtime Container

Ruhe in Frieden, Home-made Frameworks 1995-2009

1995-2009

Home-made Home-made FrameworkFramework

Page 27: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Modul Abhängigkeiten

Page 28: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 29: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Modulare Bibliotheken

Page 30: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Abhängigkeiten ermitteln

?● Wie findet die SpellChecker API sein

Implementation?

Page 31: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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?

Page 32: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 33: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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();    }

}

Page 34: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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);

Page 35: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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);

Page 36: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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.

Page 37: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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();    }

}

Page 38: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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.

Page 39: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 40: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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?

Page 41: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Objekte, die selbst Lookups besitzen!

• TopComponent

• Node

• DataObject

Page 42: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Demo 7: TopComponent Lookup

Page 43: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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();}

Page 44: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Demo 8: TopComponent Lookup

private InstanceContent content;

...

...

...        

content = new InstanceContent();

associateLookup(new AbstractLookup(content));

...

...

content.add(s);

Page 45: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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());

    }

  });

Page 46: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 47: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

Certified Engineer Course

Die Notwendigkeit modularer Anwendungen

Page 48: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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

Page 49: Modulare Anwendungen und die Lookup API · • Nur ein JAR File – keine Magie > Es besitzt spezielle Manifest-Einträge für das NetBeans Modul-System, die in den Project Properties

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