von Suchergebnissen ! − Upload per Drag&Drop und über Transfer-Ordner ! − Schneller Wechsel zwischen mehreren Logins ! − Offline-Verfügbarkeit von ausgewählten Sammlungen und Dokumenten ! − Lokales Öffnen und Bearbeiten von Dokumenten − Erkennen von Änderungen/Kollisionen und Upload als neue Version ! − Tray-Integration
Windows, Linux ! − Java-Kompetenz im Team stark vorhanden ! − Hohe Flexibilität durch Nutzung von FXML, CSS und Java ! − JavaFX hinreichend stabil − Erster Prototyp mit JavaFX 2.2, später dann Wechsel auf JavaFX 8
− Zugriff durch eigene Klasse ähnlich zu Spring JDBCTemplate − Connection Pooling mit Apache commons-pool ! − REST − Eigene Bibliothek basierend auf Jersey − Inklusive OAuth-Client
Injector ! − Berücksichtige Locale des Nutzers beim Laden von ResourceBundles ! − Speichere Referenzen auf alle Presenter-Instanzen − Für späteren Cleanup ! − Erlaube Angabe zusätzlicher Guice-Module bei Konstruktion − Ermöglicht verschiedene Presenter für Instanzen der gleichen View-Klasse
kennen ! − Regeln für Größenberechnung verstehen − minimum/preferred/maximum/computed size − „grow“ bei Boxes ! − Verstehen wie und wann die Anzeige aktualisiert wird − Pulse
− Bei WeakReferences: Gefahr, dass Controller plötzlich weg ist − StackPane eignet sich gut zum Verwalten austauschbarer Nodes − Aber: Vorsicht vor Klicks/Events beim falschen Empfänger − Bei Transparenz: setPickOnBounds(false) ! − Preloader − Bei nichttrivialem Startup Pflicht − Aber: Ausblenden bei Autostart
zu setzen (z.B. Accept-Language) − „Do not follow redirects“ gibt es nicht ! − ListView − Event-Flut (Selected/Focus) bei einfachen Aktionen − Manchmal keine Aktualisierung bei Änderungen (JavaFX 2.2) ! − Kein Support für System Tray − Verwendung von AWT, darin ggf. wieder JavaFX − Erheblicher Aufwand
− z.B. Rotating Icon (zählt in einer Endlos-Schleife) ! − Wenig Einstiegs-/Erweiterungspunkte im Framework − Viel Zugriff auf restricted API (com.sun.javafx) beim Bau von Custom Controls − Customizing der OS X Menüleiste erfordert Reflection − Hacks nötig um eigenen Font mit auszuliefern (JavaFX 2.2)
der Struktur einer View − FXML: Layout „einfacher“ Nodes wie Listen, Labels, Buttons − CSS: Alles was an Styling möglich ist − Java: Komposition von Views im Presenter-Code ! − Dynamische Daten (z.B. eine Zeile in einer Liste von Suchergebnissen) − FXML als Template − Customizing ggf. im Java-Code − z.B. Skalieren/Einpassen von Bildern
UI − Verwende JavaFX-Tasks und Callbacks − Falls doch blockierend, dann mit sehr kleinem Timeout ! − Keine Ereignisse ins Leere laufen lassen − EventBus: Dead Messages beachten − Thread Factories mit UncaughtExceptionHandlers für Worker-Pools ! − Resilience im Client − Rate Limiting auf der API ? − Server kann jederzeit „weg“ sein − Achte auf „Edge Cases“ wie serverseitige Löschung von Daten
des Dateisystems − Änderungen nicht erkannt (WatchService) − Datei lesbar während sie zum Schreiben geöffnet ist ? − Dateigröße 0 im laufenden Kopiervorgang ! − Proxies ! − Upload versteckter Dateien ! − Betriebssystem geht schlafen -> Netzwerkverbindung getrennt ? ! − Mac OS: Starten der Anwendung aus dem Disk Image heraus
OS-Einstellungen − Sprachauswahl in der Anwendung ! − Initialisierung − Verwende Default-Mechanismus via FXML ! ! − Aktualisierung − Handling im Java-Code bedeutet doppelte Arbeit − Und kann leicht vergessen werden − Deshalb: Neuinitialisierung des UI wie beim Mandantenwechsel
Server − Abgleich der Daten selbst ist aufwändig − Event-Timeline/-Cursor steigert Performance erheblich − Ideal: Push-Notifications ! − Stabilität − Dateien können lokal geöffnet oder geändert worden sein − Eine Datei pro Version, die Datenbank kennt die aktuelle Version − Asynchrones Aufräumen im Hintergrund ! − Abbildung von Sammlungen/Tags auf Ordner schwierig − Deshalb Ablage in einem „versteckten“ Speicher
Worker, Callback, FXCollection ! − Bei automatischem Refresh nur Änderungen einpflegen − Hashcode kann helfen ! − Endlos-Scrolling oder Paginierung ? − Endlos-Scrolling: Probleme mit Lücken, Duplikaten und Refresh − Paginierung viel stabiler ! − Gescheitertes Experiment: Mehr synchronisieren als nötig − Idee: Auch im Online-Modus möglichst gegen die lokale Datenbank − Aber: Hoher Synchronisationsaufwand, falls kein Push − Und: Manche Features nur auf dem Server (z.B. Volltextsuche)
Speichern von Aufträgen in die Datenbank − Ausführung asynchron, Events bei Abschluss von Tasks ! − Anzeigen/Öffnen offline verfügbarer Dokumente − Backend-Zugriffe hinter Facade verstecken ! − Wie erkennen ob online oder offline? − Irgendein Netzwerkcall schlägt auf bestimmte Weise fehl -> offline − Ein relevanter (!) Server ist verfügbar -> online ! − Nicht vergessen: Pausieren/Starten relevanter Services − Globaler Event bei Status-Änderung
nicht zufriedenstellend ! − Mehr Flexibilität mit eigenem Installer − JAR mit Libs, JRE, Starter-Skript − Installer bzw. Disk Image − Erstellung automatisiert auf Build-Server ! − Vorteile: Partielle Updates, Entkopplung vom System JRE ! − Nachteil: Schwierigkeiten bei einfachen Dingen (z.B. Mac OS Menü)
Aktualisiere Anwendung, JRE oder beides (nach Bedarf) − Anwendung prüft auf Updates und lädt diese ggf. herunter − Starter-Skript führt Update-Skript aus, falls vorhanden ! − Nachteile − Starter-Skript nicht unmittelbar änderbar − Ggf. korrupte Updates durch Firewall
setzen − Das meiste geht ziemlich leicht − Manche Kleinigkeiten kosten viel Zeit − Entscheidung sollte auch vom Know-how im Team abhängen ! − Empfehlungen − Evaluationsphase − Überblick über JavaFX-Frameworks verschaffen − Frühzeitig Packaging/Deployment implementieren