Quality First SoftwareQuality First Software
qflib
Einführung
EinführungPackagesBeispieleAPI DokumentationProjekte
Auf dieser Seite
Beschreibung
Lizenz
Voraussetzungen
Installation
Feedback
Versionen
Todo
English version
Description
License
Requirements
Installation
Feedback
History
Todo
Beschreibung

qflib ist eine Java Bibliothek, die bei der Entwicklung von Quality First Software Projekten entstand, um wichtige Teile in wiederverwendbarer Form zu kapseln. Sie ist kompatibel zu JDK 1.1 bis JDK 1.3 und besteht aus einer bunten Mischung von Packages, die verschiedene Aspekte der Java Programmierung abdecken:

de.qfs.lib.command
Mechanismus zum Verteilen und Ausführen von Kommandos auf einer höheren Abstraktionsebene als der AWT Eventloop.
de.qfs.lib.config
Verwalten, Speichern und Wiederherstellen der persönlichen Einstellungen eines Anwenders, z.B: Fenstergrößen und -positionen, Spaltenbreiten und -anordnung in Tabellen, sonstige Optionen. Speicherung erfolgt in ASCII Dateien, damit ist die Konfiguration vom Anwender direkt editierbar.
de.qfs.lib.gui
Diverse GUI spezifische Klassen. Highlight ist eine Erweiterung der Swing JTable um Sortierung und Filterung, alles gekapselt in einer einfach einzusetzenden Hilfsklasse.
de.qfs.lib.log
Komfortables Erzeugen und Verwalten von Log Ausgaben. Klein und unabhängig vom Rest der qflib und den Collection Klassen.
de.qfs.lib.logrmi
Verbindet das de.qfs.lib.log package und den Logserver qflog. Gibt dem Anwender volle Kontrolle über die Generierung von Log Ausgaben zur Laufzeit, damit minimale Performanceeinbußen.
de.qfs.lib.option
Verbindet de.qfs.lib.gui und de.qfs.lib.config mit dem Konzept von Options, vom Anwender einzustellenden Parametern. Diese können über Property Dateien dynamisch gruppiert und schließlich in einem Dialog zusammengefaßt werden.
de.qfs.lib.transaction
Unterstützung für Transactions mit commit und rollback auf der Clientseite.
de.qfs.lib.util
Sammlung kleiner aber nützlicher Hilfen.

Die API Dokumentation der veröffentlichen Teile der qflib finden Sie hier, auf der Download Seite von Quality First Software könne Sie die aktuelle Version herunterladen.

Da sich diese Bibliothek auch in dem externen Projekt wBoard bewährt hat, haben wir uns entschlossen, sie unter einer Open Source Lizenz der Allgemeninheit frei zur Verfügung zu stellen. Wir hoffen damit insbesondere der freien Entwicklergemeinde ein wenig von dem zurückzugeben, wovon wir über viele Jahre hinweg profitiert haben.

Bitte vergessen Sie nicht, dass qflib in erster Linie zum Einsatz in Quality First Software Projekten entwickelt wurde. Dadurch sind einige Features nur so weit implementiert, wie sie für uns von Nutzen sind. Außerdem müssen wir möglicherweise Interfaces verändern, was zu Unannehmlichkeiten bei einem Update führen kann. Wir werden aber versuchen, solche Änderungen minimal zu halten und Mittel für ein möglichst einfaches Update bereitzustellen. Daneben werden wir unser Bestes tun, um Beiträge von anderen qflib Anwendern zu integrieren und selbst Lücken zu füllen wo immer möglich. In jedem Fall garantiert die freie Verfügbarkeit des Sourcecodes, dass Sie mit dem Einsatz der qflib in Ihren Projekten nicht in eine Sackgasse steuern.

Lizenz

qflib unterliegt der Mozilla Public License Version 1.1, kurz MPL. Diese Lizenz garantiert Ihnen die freie Nutzung von qflib, Zugang zum Sourcecode und das Recht, die Bibliothek zu modifizieren und weiterzugeben.

Die einzigen Einschränkungen bestehen darin, dass Sie das Urheberrecht von Quality First Software nicht antasten können und dass modifizierte Versionen der qflib automatisch unter die MPL fallen. Ein anderes Programm (in der Lizenz als "greater work" bezeichnet), das die qflib lediglich über die bekannten Schnittstellen anspricht, bleibt davon unberührt und kann unter jeder beliebigen Lizenz vertrieben werden.

Einer kommerziellen Nutzung oder dem kommerziellen Vertrieb der qflib, z.B. auf CD-Rom zusammen mit anderer Software, steht bei Einhaltung dieser Bedingungen nichts im Wege.

Wir haben uns für die MPL entschieden, weil sie aus unserer Sicht einen guten Kompromiß zwischen dem Schutz der Offenheit und der freien Verfügbarkeit einerseits, und des Zusammenspiels mit fremder Software unter beliebigen Lizenzen andererseits darstellt. Ihr Text ist im Vergleich zu anderen Lizenzen kurz, präzise und auch für Laien verständlich.

Voraussetzungen

Es gibt zwei Varianten von qflib, eine für JDK 1.1 mit Swing 1.1 und eine für JDK 1.2 ond höher. Diese sind im Prinzip identisch. Der einzige Unterschied besteht im Packagenamen der Collection Klassen.

Das Collection Framework ist ein Teil der Java Foundation Classes (JFC). Beim Übergang auf das JDK 1.2 wurden diese in die standard Java Klassenbibliothek integriert.

Da die Collection Klassen ihren Vorgängern Vector und Hashtable weit überlegen sind, werden sie in der qflib ausgiebig eingesetzt. SUN hat eine Version der Collection Klassen, die zum JDK 1.1 kompatibel ist, unter http://java.sun.com/beans/infobus/#DOWNLOAD_COLLECTIONS veröffentlicht. Um qflib mit dem JDK 1.1 einzusetzen, muß das collections.jar Archiv aus obigem Paket in Ihrem CLASSPATH stehen.

Installation

Sie müssen lediglich sicherstellen, dass das korrekte jar-Archiv der qflib in Ihrem CLASSPATH steht, d.h. qflib_11.jar für JDK 1.1 oder qflib_12.jar für JDK 1.2 und höher. Im Fall des JDK 1.2 ist es auch möglich, qflib_12.jar einfach in das jre/lib/ext Verzeichnis Ihrer JDK Installation zu kopieren.

Um die Installation zu testen, können Sie
java de.qfs.lib.Version
ausführen. Dies sollte eine kurze Meldung mit der Versionsnummer der installierten qflib ausgeben.

Feedback

Jede Art von Feedback ist willkommen. Bitte senden Sie Anmerkungen, Bugreports, Patches, Erweiterungswünsche etc. an qflib@qfs.de.

Versionen
20.2.2001

Da die letzte Version schon viel zu lange her ist, ergibt sich diesmal eine große Zahl von Änderungen. Neu ist auch ein Demo (Options.java) für das option Package im demo Verzeichnis.

Neue Features:

  • Das Logging System wurde erweitert, um Filterung, Formatierung und Behandlung von Meldungen in darauf spezialisierte Klassen und Interfaces zu verlagern. Diesmal sind die Änderungen voll kompatibel. Allerdings sind einige Klassen und Methoden deprecated um die Umstellung zu fördern. Vielen Dank an Oliver Brandt von ATecoM GmbH, der den Hauptteil des neuen Codes beisteuerte. Basierend auf diesen Änderungen lassen sich nun Logdateien mit beschränkter Größe erzeugen, bei deren Überlauf neue Dateien angelegt werden.
  • Die LogSetup Klasse im util Package dient dazu, die verschiedenen Aspekte des Logging Systems mittels einer Vielzahl von Kommandozeilen Argumenten zu initialisieren.
  • Das option Package wurde komplett überholt:
    • Alles sieht besser aus und verhält sich konsistenter.
    • TextOptionEdits haben ihre eigene JScrollPane.
    • Die neue Klasse EditorOptionEdit unterstützt unter anderem das Anzeigen und Bearbeiten von HTML.
    • RadioOptionGroups haben jetzt einen eigenen Rahmen und Titel.
    • Die TextOption Klasse hat jetzt die statischen Methoden split und join um zwischen String Arrays und mehrzeiligen Strings zu konvertieren.
    • Die OptionGroup/OptionEdit Hierarchie ist jetzt public und kann durchlaufen werden.
    • OptionDialogs basieren jetzt auf der neuen ModalDialog Klasse. Somit sind die Buttons eines OptionDialogs frei wählbar.
    • Mnemonics für Tastaturkürzel können für Buttons und OptionEdits gesetzt werden..
  • Mit gui/ModalDialog wird eine neue gemeinsame Basisklasse für Meldungs- und Optionendialoge eingeführt, die die Konfiguration der Buttons wesentlich vereinfacht.
  • Die neue Klasse MultiMap ist eine Implementierung des Map Interfaces, die mehrere Werte für einen Schlüssel speichert. Zunächst primär als Ausgangspunkt für den MRUCache (s.u.) gedacht, hat sie sich bereits mehrfach selbst als nützlich erwiesen.
  • Basierend auf der MultiMap speichert der neue MRUCache nur eine begrenzte Anzahl von Resourcen. Ist der Platz erschöpft, werden die zuletzt benötigten Resourcen aufbewahrt und die ältesten gelöscht. Es besteht eine gewisse Ähnlichkeit zur WeakHashMap, der MRUCache funktioniert aber auch mit JDK 1.1 und hat eine andere Ausrichtung.
  • ExtensionFileFilter ist ein allgemeiner, auf der Dateiendung basierender Filter, der mit AWT und Swing Dateiauswahldialogen ebenso verwendet werden kann, wie mit File.list().
  • Die EventQueue verwendet nun einen Trick, um auch im JDK 1.1 die Events innerhalb des AWT Eventqueue Threads auswerten zu können. Damit funktioniert ein ExceptionHandler auch mit JDK 1.1, zusammen mit den anderen EventQueue Hacks. Es gibt ausserdem einen neuen Hack, der die Alt-... Tastenkombinationen für manche Motif-basierte JDKs zurechtbiegt (z.B. IBMs JDK für Linux). Damit funktionieren dann z.B. die Menüshorcuts wieder. Ein weitere Hack biegt die Delete Taste für das Blackdown JDK 1.3 zurecht.
  • Commands können nun festlegen, ob sie einen Handler benötigen, oder nicht. Dadurch kann der CommandDistributor vermeiden, UnhandledCommandExceptions für Commands zu werfen, die eher Nachrichtencharakter haben.
  • Der ArgsParser hat neue Methoden um Defaultwerte für Kommandozeilenargumente zu setzen und um das Auswerten der Ergebnisse zu vereinfachen. Ausserdem wurde der Parameterindikator '=' hinzugefügt.
  • Zu Gunsten eines einheitlichen API mit option/OptionSet und util/ArgsParser, wurde MapResourceBundle.getInteger deprecated und durch getInt ersetzt.
  • util/MessageCollector assoziiert Collectors über einen instance Mechanismus mit dem laufenden Thread.
  • Mit Hilfe der Klasse gui/EventQueueMark können künstlich erzeugte Events von echten (vom Anwender ausgelösten) unterschieden werden.
  • Die neue Klasse config/RelativeDialogConfigWrapper speichert die Position eines Dialogs relativ zu einem anderen Fenster anstatt in absoluten Werten.

Beseitigte Bugs:

  • SwingUtil.withEvents hatte in Kombination mit der qflib eigenen EventQueue Probleme unter JDK 1.2. Dies führte in qflog beim Laden von Logdateien zu einem Deadlock.
  • Der EventQueue Tabhack beschränkt sich jetzt auf Events mit gesetzter SHIFT Maske. Andernfalls konnte ein Fenterwechsel mit Alt-tab zu einem künstlichen Tab Event führen.
  • SortedTableHelper beendet jetzt automatisch das Editieren, wenn die Sortierung oder die Filtereinstellung verändert wird.
  • Das LevelTreeSelectionModel hatte einen Bug, der zu einer NullPointerException führte, wenn die Wurzel des Baums sichtbar war.
  • Ein Timing Problem in gui/MultiPane konnte manchmal das Wiederherstellen einer gespeicherten Einstellung verhindern.
  • log/TreeFilter konnte nicht ohne die JUnit Klassen kompiliert werden.
  • Die Konstante FATAL_ERROR in util/MessageCollector is jetzt 3 (sie war fälschlicherweise als 0 definiert).
  • showPopup in gui/SwingUtil hatte Probleme, wenn die parent Komponente selbst ein Fenster war. Ausserdem funktionierte die Beschränkung auf das Fenster nicht.
  • Die config/Configurator Klasse hatte einen Bug in remove, der verhinderte, dass das Configurable korrekt aus entfernt wird.
  • Beim Wiederherstellen des Zustands eines JToolBar, berücksichtigt JToolBarConfigWrapper jetzt auch die Orientierung.
22.8.2000

Version 0.97.1 dient hauptsächlich der Wartung.

Die Beispiel Seite hat jetzt einen Abschnitt zum de.qfs.lib.gui Package. Zunächst enthält dieser eine Beschreibung, wie man eine sortierte Tabelle erstellt und verwaltet.

Um zusätzlich zu den Source Code Fragmenten lauffähige Beispiele anzubieten, haben wir das demo Verzeichnis angelegt und dort zunächst SortedTable.java bereit gestellt, ein kleines Demo für eine Tabelle mit Sortierung und Filterung.

Neue Features:

  • Ein TextOptionEdit hat jetzt optional eine Scrollpane.
  • Die Methode updateUI wurde zum SortedTableHelper hinzugefügt. Sie muss aufgerufen werden, wenn sich das UI der Tabelle ändert, um einen korrekten Header Renderer für das neue UI zu erhalten.

Beseitigte Bugs:

  • Das Erhalten der Selektion einer sortierten Tabelle konnte in bestimmten Fällen eine Zeile verschlucken.
  • Die initialen Einstellungen des Trenners einer MultiPane oder eines JSplitPaneConfigWrappers funktionieren jetzt zuverlässiger.
  • Der DynamicClassLoader hat offene InputStreams nicht richtig geschlossen. Danke an Florian Rodler für den Hinweis.
  • Die Unterstützung von XEmacs Menüs in qflib.el war zwar vorhanden, wurde aber nicht aktiviert. Noch einmal danke an Oliver Brandt.
10.7.2000

Mit Version 0.97.0 wird das de.qfs.lib.transaction Package eingeführt. Ausserdem werden in dieser Version alle RMI-spezifischen Klassen aus dem de.qfs.lib.log Package entfernt und in das de.qfs.lib.logrmi Package ausgelagert. Diese Änderung war nötig, um Logging in Applets zu ermöglichen, die in Internet Explorer Versionen laufen sollen, in denen die RMI Klassen fehlen.

Erstmals ist ein Emacs lisp Paket enthalten, welches das Logging und das Schreiben von Javadoc Kommentaren stark vereinfacht.

Inkompatible Änderungen:

  • Von den Klassen, die in das de.qfs.lib.logrmi Package ausgelagert wurden sollte den Anwender nur RemoteLogFilter betreffen.
  • Stärker betroffen von dieser Änderung ist der Logserver qflog, der zeitgleich in einer neuen Version veröffentlicht wird.
  • Die Klasse ValueEdit und davon abgeleitete Klassen wurden aus dem de.qfs.lib.gui Package entfernt, da sie eigentlich nicht zur qflib gehören und nur durch einen Bug in der Konfiguration dorthin gelangt sind. Sie sind immer noch in den alten qflib Versionen verfügbar, sollten aber durch Optionen aus dem de.qfs.lib.option Package ersetzt werden.

Neue Features:

  • Das de.qfs.lib.transaction Package unterstützt Transaktionen auf der Clientseite. Einfache Aktionen können in einer Transaction gesammelt und zu einer komplexen Aktion zusammengefasst werden. Diese werden dann gemeinsam beim Commit ausgeführt, oder beim Rollback zurückgenommen.
  • Die Klasse FocusFixer im de.qfs.lib.gui Package ist ein Workaround für einen lästigen Bug im JDK 1.1 mit dem Motif Toolkit. In dieser Konstellation vergessen Fenster bei jeder De- und Reaktivierung welche Komponente gerade den Fokus hat.
  • Verschachtelte OptionSets sind jetzt dank des direkten Zugriffs auf die Optionen wesentlich besser nutzbar.
  • Der ArgsParser für Argumente der Kommandozeile wirft genauere Exceptions mit Informationen über die fehlerhaften Optionen. Zu diesem Zweck werden die Exceptions MissingParameterException, UnexpectedParameterException und UnknownOptionException eingeführt.
  • Ein einfacher Mechanismus zum Sammlen von Warn- und Fehlermeldungen ist in der MessageCollector Klasse implementiert.
  • Ein Emacs lisp Paket namens qflib.el befindet sich im Verzeichnis misc. Es vereinfacht die Verwendung des de.qfs.lib.log Packages wesentlich und bietet einige nützliche Funktionen darüber hinaus.

Beseitigte Bugs:

  • Die relative Angabe der Ausgangsposition des Dividers einer MultiPane funktioniert jetzt auch mit JDK 1.3.
  • Die Pfeil Icons in den qflib Resourcen hatten einen kleinen Fehler, der zu Anzeigeproblemen mit sortierten Tabellen in JDK 1.3 geführt hat.
7.6.2000

Version 0.96.0 beseitigt einige Bugs und wurde um neue Features bereichert.

Neue Features:

  • Die Klassen InputStreamAdapter, CountingInputStream, CountEvent und CountListener sind neu zum de.qfs.lib.util Package hinzugekommen, um Zugriff auf die Zahl der gelesenen Bytes eines InputStreams zu bekommen. Darauf aufbauend wurde StatusLine um eine Fortschrittsanzeige erweitert.
  • Eine neue Methode in DynamicClassLoader erlaubt das bequeme Erzeugen von Objekten, deren Konstruktor Argumente erwartet.
  • EventNames bietet jetzt auch die umgekehrte Abbildung von Eventnamen auf Ids und SwingUtil erhielt eine Methode zum Zentrieren von Fenstern auf dem Bildschirm.

Beseitigte Bugs:

4.5.2000 Version 0.95.0 ist die erste öffentlich freigegebene Version.
Todo
Folgende Bugs sind in der aktuellen Version bekannt:
  • Keine Bugs bekannt.
Weitere Pläne für die Zukunft:
  • Die Message Klasse soll analog zu OptionDialog auf ModalDialog umgestellt werden, um mehr Kontrolle über die Buttons zu erhalten.
  • Mehr Beispiele, einführende Dokumentation und Demos. Insbesondere die umgestellte Message Klasse sollte gleich mit einem Demo daherkommen.
  • Alternative Protokolle zur Kommunikation zwischen dem de.qfs.lib.log Package und dem Logserver qflog, die von Applets besser genutzt werden können und den Weg zur Kommunikation mit nicht Java Programmen ebnen.

Letzte Änderung: 17.02.2001, Copyright © 2000 Quality First Software, Gregor Schmid