% Vorwort
\chapter{Quellcode}
\label{ch:quellcode}

Dieses Kapitel bietet einen Überblick über den Quellcode von WikiWord. Es wird beschrieben, wie das Programm strukturiert ist, welche Bibliotheken verwendet werden, wo der Quelltext erhältlich ist sowie wie er verwendet werden kann.

\section{WikiWord Packages}
\label{sec:packages}
Dieser Abschnitt bietet eine kurze Übersicht über die Java-Packages, aus denen WikiWord besteht. Zunächst seien die Packages für den Kern von WikiWord genannt:

\begin{description}
  \item[\javaid{de.brightbyte.wikiword}] definiert Klassen wie \zB \javaid{Corpus} und \javaid{Namespace}, die WikiWords Kern-Konzepte modellieren, sowie Hilfsklassen wie \javaid{CliApp} (die Basis für die Kommandozeilenschnittstelle von WikiWord, siehe \rr{sec:frameworkklassen}) und \javaid{TweakSet} (für Konfigurationsparameter, siehe \rr{sec:tweaks}). Das Package enthält außerdem Property-Dateien mit den vorgegebenen Konzepttypen (\javaid{ConceptTypes.properties}), Sprachcodes (\javaid{Languages.properties}) und Namensräumen (\javaid{Namespaces.properties}).
  \item[\javaid{de.brightbyte.wikiword.disambig}] enthält Klassen zur automatischen Sinnzuweisung an Terme im Kontext (Disambiguierung) sowie die dafür benötigten Klassen zur Bestimmung von semantischer Verwandtheit zwischen Konzepten (\rr{ch:eval:disambig}).
  \item[\javaid{de.brightbyte.wikiword.model}] enthält Modell-Klassen, die Konzepte und Ressourcen sowie Referenzen auf Terme und Konzepte repräsentieren. Instanzen dieser Klassen dienen als \nom{Transferobjekte} bei Abfrage von Thesaurusdaten aus der Datenbank (DAO-Schicht, siehe \rr{sec:DAO}).
  \item[\javaid{de.brightbyte.wikiword.query}] enthält die Kommandozeilenschnittstellen und Hilfsklassen für die Abfrage von Thesaurusdaten. Diese sind vor allem für Test und Evaluation von WikiWord nützlich.
  \item[\javaid{de.brightbyte.wikiword.rdf}] enthält die Kommandozeilenschnittstellen und Hilfsklassen für den Datenexport nach RDF/SKOS (siehe \rr{transform:export}).
  \item[\javaid{de.brightbyte.wikiword.schema}] enthält Hilfsklassen, die die Datenbank-Schemata für die einzelnen Store-Klassen der DAO-Schicht definieren: Jede Schema-Klasse stellt einen Satz von Datenbanktabellen und den zugehörigen Datenfeldern bereit (\rr{sec:datenbank-tabellen}). Sie definiert außerdem die Logik für eine Konsistenzprüfung der Daten sowie für die Erhebung einer einfachen Statistik über die enthaltenen Daten. Diese Klassen werden von den Datenzugriffsobjekten (DAOs) in \javaid{de.brightbyte.wikiword.store} und \javaid{de.brightbyte.wikiword.store.builder} benutzt.
  \item[\javaid{de.brightbyte.wikiword.store}] enthält die Definition der einzelnen Datenzugriffsobjekte (DAOs) für die Abfrage und Nutzung der Thesaurusdaten (siehe \rr{transform:import} und \rr{sec:DAO}).
\end{description}

Dieser Kern von WikiWord umfasst 134 Klassen und über 11\thinspace000 Zeilen Programmcode.

Die Logik für den Import von Daten \bzw den Aufbau des Thesaurus ist in den folgenden Packages implementiert:

\begin{description}
  \item[\javaid{de.brightbyte.wikiword.analyzer}] enthält die Klassen, die die Analyse von Wiki-Text implementieren, also zum Aufbau des Ressourcenmodells aus den Rohdaten (siehe \rr{transform:analyse}).
  \item[\javaid{de.brightbyte.wikiword.builder}] enthält die Kommandozeilenschnittstelle für den Aufbau des Thesaurus sowie Hilfsklassen der Import-Architektur (siehe \rr{sec:entrypoints} und \rr{sec:import-achitektur})
  \item[\javaid{de.brightbyte.wikiword.store.builder}] enthält die Definition der einzelnen Datenzugriffsobjekte (DAOs) für den Aufbau und die Konsolidierung der Thesaurusdaten (siehe \rr{transform:zusammenfuehren} und \rr{sec:DAO-Builder}).
  \item[\javaid{de.brightbyte.wikiword.wikis}] enthält die Konfiguration für die einzelnen Wikis, also Wissen über deren spezielle Einrichtung und Konventionen, sowie sprachspezifisches Wissen. Diese Informationen werden für die Analyse des Wiki-Textes verwendet (\rr{transform:analyse}).
\end{description}

Die Logik für den Import von Daten umfasst 121 Klassen und über 14\thinspace000 Zeilen Programmcode.

Zusätzliche Logik für Experimente mit und für die Evaluation von WikiWord (\rr{ch:evaluation}) befindet sich in den folgenden Packages:

\begin{description}
  \item[\javaid{de.brightbyte.wikiword.eval}] enthält die Kommandozeilenschnittstelle für die Evaluation von WikiWord.
  \item[\javaid{de.brightbyte.wikiword.schema}] enthält die Schema-Definition und die DAO-Schicht für die Evaluation, also insbesondere für die Speicherung der in Experimenten erhobenen Daten und deren statistische Auswertung.
\end{description}

Die Funktionen für die Evaluation umfasst 43 Klassen und über 5\thinspace000 Zeilen Programmcode.

Der Programmcode von WikiWord steht unter der \name{GNU General Public License} \q{GPL} und kann frei genutzt werden (siehe \npr{ch:lizenz}). Für eine Aufstellung der verwendeten Programmbibliotheken siehe \rr{code:libs}. Für die URLs, unter denen WikiWord verfügbar ist, siehe \rr{code:urls}. Eine kurze Anweisung zum Kompilieren von WikiWord findet sich in \rr{code:build}.

\section{Verwendete Bibliotheken}
\label{code:libs}

WikiWord verwendet neben den von Java bereitgestellten Standardklassen eine Anzahl von Bibliotheken, die Standard-Aufgaben übernehmen. Diese sind:

\begin{description}
  \item[\name{JUnit}] ist ein \lingo{Unit-Testing}-Framework für Java (\uref{http://www.junit.org/}). Es wird nur zur Kompilierung und Ausführung der Testklassen von WikiWord benötigt. \name{JUnit} steht unter der \name{Common Public License} \q{CPL}.
  \item[\name{Connector/J}] ist der offizielle JDBC-Treiber für MySQL (\uref{http://www.mysql.com/products/connector/j/}). Er wird nur zur Laufzeit für den Zugriff auf MySQL-Datenbanken benötigt. \name{Connector/J} steht unter der \name{GNU General Public License} \q{GPL}.
  \item[\name{MWDumper}] ist ein Programm \bzw eine Bibliothek zum Lesen und Schreiben von MediaWiki-Dumps \qq{MW:DUMPER}{MW:XML}. Er wird für den Import von MediaWiki-Dumps in WikiWord benötigt. \name{MWDumper} wird von der \name{Wikimedia Foundation} entwickelt und steht unter der \name{GNU General Public License} \q{GPL}.
\end{description}

\name{MWDumper} benötigt seinerseits einige zusätzliche Bibliotheken:

\begin{description}
  \item[\name{swing-layout}] ist eine Erweiterung der Layout-Klassen \name{Swing}, Javas Bibliothek für grafische Benutzeroberflächen (\uref{https://swing-layout.dev.java.net/}). Diese Bibliothek wird für die Kompilierung von \name{MWDumper} benötigt und im interaktiven Modus von \name{MWDumper} eingesetzt. Dieser wird jedoch im Kontext von WikiWord nicht verwendet, so dass diese Bibliothek zur Laufzeit nicht unbedingt benötigt wird. \name{Swing-layout} steht unter der \name{GNU Lesser General Public License} \q{LGPL}.
  \item[Der \name{PostgreSQL JDBC Driver}] ist der offizielle JDBC-Treiber für PostgreSQL (\uref{http://jdbc.postgresql.org/}). Er wird von \name{MWDumper} lediglich zur Laufzeit benötigt, um auf \name{PostgreSQL}-Datenbanken zuzugreifen -- was im Kontext von WikiWord nicht notwendig ist. Der \name{PostgreSQL JDBC Driver} steht unter der \name{BSD License} \q{BSDL}.
  \item[\name{Xerces}] ist eine Bibliothek für die Verarbeitung von XML (\uref{http://xerces.apache.org/xerces2-j/}). Sie wird von \name{MWDumper} zur Laufzeit zur schnelleren Verarbeitung der MediaWiki-Dumps verwendet. Fehlt diese Bibliothek, so wird Javas integrierter XML-Parser verwendet, der etwas langsamer ist. \name{Xerces} wird von der \name{Apache Software Foundation} entwickelt und steht unter der \name{Apache Software License} \q{ASL}.
  \item[\name{XML-Commons}] ist eine Hilfsbibliothek zur Verarbeitung von XML (\uref{http://xml.apache.org/commons/}). Wie \name{Apache Xerces} wird sie von \name{MWDumper} zur Laufzeit zur Verarbeitung von XML verwendet, wird aber nicht unbedingt benötigt. \name{XML-Commons} wird von der \name{Apache Software Foundation} entwickelt und steht unter der \name{Apache Software License} \q{ASL}.
\end{description}

WikiWord verwendet einige Bibliotheken, die ebenfalls vom Autor entwickelt wurden, aber unabhängig von und zeitlich vor dieser Diplomarbeit. Sie dienen allgemeinen Aufgaben und enthalten keinen Code, der sich auf die Verarbeitung von Wiki-Text oder den Aufbau eines Thesaurus bezieht.

\begin{description}
  \item[\name{BrightByteUtil}] enthält diverse Hilfsklassen, unter Anderem zur Arbeit mit Strings, \nospell{Collections}, XML, HTML sowie für die Verarbeitung von dünnbesetzten Matrizen und Vektoren.
  \item[\name{BrightByteDB}] enthält Hilfsklassen für die Arbeit mit relationalen Datenbanken, insbesondere MySQL.
  \item[\name{BrightByteRDF}] enthält ein Framework zur Erzeugung und Verarbeitung von RDF-Dateien.
\end{description}

Diese Bibliotheken stehen unter der \name{GNU Lesser General Public License} \q{LGPL}. Der Quellcode sowie verschiedene Archivdateien stehen unter \uref{http://brightbyte.de/TK/DA/} bereit.

Diese Abhängigkeiten sind über die Datei \cli{pom.xml} in jedem Projekt definiert und können so mit Hilfe von \name{Apache Maven} \q{MVN} automatisch aufgelöst werden (siehe auch \rr{code:build}).

\section{Bündel}
\label{code:urls}

Der Quellcode von WikiWord steht an den folgenden Orten zur Verfügung:

\begin{itemize}
  \item Das Verzeichnis \reporef{WikiWord/WikiWord/} enthält die Quellen für den Kern von WikiWord. Diese Dateien befinden sich auch in einem Archiv unter \reporef{WikiWord-0.1-src.tar.gz}.
  \item Das Verzeichnis \reporef{WikiWord/WikiWordBuilder/} enthält die Quellen für das System zum Aufbau von Thesauri. Diese Dateien befinden sich auch in einem Archiv unter \reporef{WikiWordBuilder-0.1-src.tar.gz}.
  \item Das Verzeichnis \reporef{WikiWord/WikiWordEval/} enthält die Quellen für die Logik zur Evaluation von WikiWord. Diese Dateien befinden sich auch in einem Archiv unter \reporef{WikiWordEval-0.1-src.tar.gz}.
\end{itemize}

Dabei ist zu beachten, dass \someid{WikiWordBuilder} und \someid{WikiWordEval} beide vom Kern \someid{WikiWord}, aber nicht voneinander abhängig sind.

Die drei Komponenten von WikiWord stehen auch in bereits kompilierter Form zur Verfügung:

\begin{itemize}
  \item Die Datei \reporef{bin/WikiWord-0.1/lib/WikiWord-0.1.jar} enthält den Kern von WikiWord als Programmbibliothek. Ein Archiv, das alle benötigten Bibliotheken und Hilfsdateien enthält, befindet sich unter \reporef{WikiWord-0.1-bin-dep.tar.gz}.
  \item Die Datei \reporef{bin/WikiWordBuilder-0.1/lib/WikiWordBuilder-0.1.jar} enthält das System zum Aufbau von Thesauri als Programmbibliothek. Ein Archiv, das alle benötigten Bibliotheken und Hilfsdateien enthält, befindet sich unter \reporef{WikiWordBuilder-0.1-bin-dep.tar.gz}.
  \item Die Datei \reporef{bin/WikiWordEval-0.1/lib/WikiWordEval-0.1.jar} enthält die Logik zur Evaluation von WikiWord als Programmbibliothek. Ein Archiv, das alle benötigten Bibliotheken und Hilfsdateien enthält, befindet sich unter \reporef{WikiWordEval-0.1-bin-dep.tar.gz}.
\end{itemize}

\section{Kompilieren}
\label{code:build}

WikiWord ist in Java implementiert. Als Build-System, um aus dem Quellcode Programme und Bibliotheken zur erzeugen, wurde \name{Apache Maven} \q{MVN} verwendet. Dieses System hat insbesondere den Vorzug, dass es automatisch Abhängigkeiten zwischen Programmbibliotheken verwaltet und auflöst. Allerdings ist das nur möglich, wenn alle benötigten Bibliotheken in einem \lingo{Repository} verfügbar sind, entweder lokal oder online. Die BrightByte- und WikiWord-Bibliotheken sind in keinem Online-Repository abgelegt und müssen daher explizit lokal installiert werden, um mit Maven genutzt werden zu können. Um eine Komponente von WikiWord (oder ein anderes Maven-Projekt) zu kompilieren, zu testen und lokal zu installieren, dient der folgende Befehl, auszuführen im Basisverzeichnis des Projektes, das auch die Datei \cli{pom.xml} enthält:

\begin{quote}
\cli{mvn install}
\end{quote}

Damit steht die entsprechende Bibliothek (\lingo{JAR-Datei}) für die Benutzung durch andere Programme im Maven-Repository bereit. Des Weiteren stehen die folgenden Kommandos zur Verfügung:

\begin{description}
  \item[\someid{clean}] löscht alle temporären Daten und erzwingt eine vollständige Neukompilierung aller Dateien.
  \item[\someid{compile}] kompiliert die Programmdateien.
  \item[\someid{test}] führt alle \lingo{Uni-Tests} aus.
\end{description}

Um für die einzelnen Module \bzw Bibliotheken Bündel zu erzeugen, eignet sich das folgende Kommando:

\begin{quote}
\cli{mvn assembly:assembly}
\end{quote}

Dieser Befehl ist ebenfalls im Basisverzeichnis des betreffenden Projektes auszuführen. Die erzeugten Bündel werden im Verzeichnis \cli{target} abgelegt. Die Bündel mit der Endung \cli{*-bin-dep.tar.gz} enthalten vollständige Installationen mit allen benötigten Bibliotheken und Hilfsdateien.  

\section{TeX-Quellen}
\label{code:tex}

Die vorliegende Diplomarbeit wurde mit Hilfe des Textsatzsystems \LaTeX\ geschrieben, der Quelltext ist unter \reporef{WikiWord/WikiWordThesis/Diplomarbeit/} oder als Archiv unter \reporef{WikiWordThesis-tex.tar.gz} verfügbar.

Als Build-System für die Erzeugung einer druckfertigen PDF-Datei aus den TeX-Dateien und anderen Quellen wurde \name{Apache Ant} \q{ANT} verwendet. Das Build-Skript für Ant, \cli{build.xml}, definiert insbesondere die folgenden Kommandos (\lingo{targets}):

\begin{description}
  \item[\someid{clean}] löscht alle temporären Daten und erzwingt eine vollständige Neuerzeugung aller Dateien.
  \item[\someid{build}] erzeugt aus den Quelldateien eine druckfertige PDF-Datei. Diese wird unter \cli{target/WikiWord.pdf} abgelegt.
\end{description}

Für den Build-Prozess werden diverse externe Programme sowie zusätzliche Module für TeX und MetaPost benötigt. Eine Aufstellung befindet sich in der Datei \cli{BUILDING}, auch zu finden unter \reporef{WikiWord/WikiWordThesis/BUILDING}. 

Das Build-Skript wurde für die Verwendung unter Linux entwickelt, für eine Ausführung unter Windows sind vermutlich diverse Anpassungen notwendig. Die Version von \LaTeX, die für die Erstellung dieser Arbeit verwendet wurde, ist \name{LaTeX2e} \bzw \name{pdfeTeX 3.141592}, wie von \name{tetex} bereitgestellt. Soll eine andere Implementation verwendet werden, können unter Umständen kleine Anpassungen notwendig sein.

Der Text dieser Diplomarbeit steht unter der \name{GNU Free Documentation License} \q{GFDL} und kann frei genutzt werden (siehe \npr{ch:lizenz}). 
