%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%									%
%	Fachhochschule Jena				%
%	Informatik IIB					%
%	alternative Prüfungsleistung	%
%									%
%	Jürgen Döffinger				%
%	631551							%
%									%
%	Dokumentation BibTexMaker		%
%	Stand: 23.01.2011				%
%									%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



\documentclass[a4paper,12pt]{scrartcl}


% Packete einbinden
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc} 
\usepackage[pdftex]{graphicx}
\usepackage{amsmath, amsthm, amssymb}
\usepackage{geometry}
\usepackage{fancyhdr}
\usepackage{lmodern}
\usepackage{subfigure} 
\usepackage{mdwlist}
\usepackage{listings}
\usepackage{bibentry,natbib}
\usepackage[colorlinks,pdfpagelabels,pdfstartview = FitH,bookmarksopen = true,bookmarksnumbered = true,linkcolor = black,plainpages = false,hypertexnames = false,citecolor = black]{hyperref}

\bibliographystyle{agu}

% Formatierungen festlegen
%\baselineskip20pt %Zeilenabstand
\setlength{\parindent}{0pt}
\setlength{\parskip}{\baselineskip}
\bibliographystyle{plainnat}
\geometry{
	outer=23mm,
	inner=22mm
}
%\pagestyle{fancy}



%Schriftart
\fontfamily{ptm}\selectfont %Schriftart Times



% Trennverhalten
%\hyphenpenalty=1000
\hyphenation{}
\hypersetup{
    bookmarks=true,
    unicode=false,
    pdftoolbar=true,
    pdfmenubar=true,
    pdffitwindow=false,
    pdfstartview={FitH},
    pdftitle={My title},
    pdfauthor={Author},
    pdfsubject={Subject},
    pdfcreator={Creator},
    pdfproducer={Producer},
    pdfkeywords={keyword1} {key2} {key3},
    pdfnewwindow=true,
    colorlinks=true,
    linkcolor=blue,
    citecolor=green,
    filecolor=magenta,
    urlcolor=blue
}

% BibTex - Logo über das Kommando \BibTex aufrufen
\newcommand{\BibTeX}{{\sc Bib}\TeX}

\newcommand{\changefont}[3]{\fontfamily{#1} \fontseries{#2} \fontshape{#3} \selectfont}


\begin{document} 
\changefont{cmr}{m}{n}

% Deckblatt
%\titlehead{Fachhochschule Jena}
\subject{Informatik IIB}
\title{\BibTeX -Datenbank}
\subtitle{alternative Prüfungsleistung}
\author{Jürgen Döffinger (631551), \\ Michael Goldbuch (631430), \\ Christoph Kebbel (631556)}
\date{23. Januar 2012}
%\publishers{}
%\uppertitleback{}
%\lowertitleback{}
\maketitle
\thispagestyle{empty}

\newpage
\thispagestyle{empty}
\ \ \ 

\newpage
\tableofcontents
\thispagestyle{empty}

\newpage
\listoffigures


% Kapitel 1 - Entwurf
\newpage
\setcounter{page}{1}
\setcounter{secnumdepth}{5}

\part{Analyse}

\section{Aufgabenstellung}
Wir haben uns für das Projekt \BibTeX-Datenbank entschieden. Die Aufgabenstellung beinhaltete folgende Punkte:
\begin{quote}
	Entwickeln Sie eine Software zur Bearbeitung und Verwaltung von \BibTeX -Datenbanken. \BibTeX ist eine Software, mit deren Hilfe Literaturdatenbanken aufgebaut und Literaturangaben in
	 LATEX-Dokumente eingebunden werden können. Das \BibTeX -Datenbankformat ist eine strukturierte Textdatei der Form
	\begin{quote}
		@article\{mrx05, \\
		author = \{Mr. X\}, \\ 
		title = \{Something Great\}, \\
		publisher = \{nobody\}, \\
		year = 2005, \\
		\}
	\end{quote}
	Das Format lässt viele verschiedene Einträge zu, die mit dem Dokumenttyp beginnen, z. B. \@article für einen Zeitschriftenartikel, mrx05 als Eintragschlüssel, und viele Eintragfelder 	
	besitzen, z. B. author für den Autor des Artikels. Manche dieser Felder sind optional, müssen also nicht angegeben sein, andere sind obligatorisch, müssen also vorhanden sein. Welche
	Felder obligatorisch und welche optional sind, hängt vom Eintragtyp ab. Bei der Angabe der Feldnamen, z. B. author, wird nicht zwischen Groß- und Kleinschreibung unterschieden. Eine
	Beispiel- und Testdatei mit \BibTeX -Einträgen finden Sie auf der Website der Informatik IIb-Übung: \\
	\href{http://www.fh-jena.de/~jack/Lehre/InfoIIb/Uebung/xampl.bib}{http://www.fh-jena.de/~jack/Lehre/InfoIIb/Uebung/xampl.bib}, \\
	\href{http://www.fh-jena.de/~jack/Lehre/InfoIIb/Uebung/test.bib}{http://www.fh-jena.de/~jack/Lehre/InfoIIb/Uebung/test.bib} \\
	Weitere Informationen zu \BibTeX finden sie z. B. hier: \href{http://www.bibtex.org/}{http://www.bibtex.org/} 

\newpage	
	
	Die von Ihnen zu entwickelnde Software soll eine grafische Benutzeroberfläche besitzen und soll
	\begin{itemize}
		\item mehrere \BibTeX -Dateien laden können, 
		\item die darin enthaltenen Einträge auf Korrektheit und Konsistenz prüfen, ggf. eine Bildschirm-Ausgabe erzeugen, die die unkorrekten bzw. inkonsistenten Eintrage anzeigt, 
		\item neue Literatureinträge anlegen und bestehende bearbeiten als auch löschen können, sowohl durch Tastatureingabe als auch durch Eingabe über den Copy-Paste-Puffer, bei
				 letzterem ist der Inhalt des Paste-Puffers ein Text wie oben im Beispiel @article\{mrx05,
		\item Freitextsuche in den Feldern der Eintragtypen ermöglichen d. h. die gefundenen Einträge werden mit Ihrem Schlüssel in einer Liste angezeigt in einem anderen Fenster können
				 die gefunden Einträge im Detail betrachtet und bearbeitet werden,
		\item eine Auswahl beliebiger Eintrage als neue \BibTeX -Datenbankdatei schreiben konnen, 
		\item ein zusätzliches optionales Feld für jeden Eintragtyp mit dem Bezeichner abstract beinhalten,
		\item ein weiteres zusätzliches optionales Feld für jeden Eintragtyp mit der Bezeichnung link beinhalten, das einen Hyperlink zu einem Dokument (das wird sinnvollerweise das 
				Dokument, das im Eintrag beschrieben ist, sein) enthält; bei einem Mausklick auf den Link soll dieser Link mit dem auf den Zielsystem verbundenen Programm geöffnet werden, 
				z. B. bei einem PDF-Dokument mit dem Adobe-Reader.
	\end{itemize}
\end{quote}

\newpage

\section{Entwurf}
In der Analysephase ging es darum, die Aufgabenstellung in einen Programmablauf zu bringen. Dabei mussten zunächst die grundsätzlichen Aufgaben ermittelt werden und in sinnvolle Pakete aufgeteilt werden. Wir entschieden uns für drei wesentliche Pakete. 

Das erste Paket ist die grafische Benutzeroberfläche (GUI - Graphical User Interface). Dieses hat folgende Aufgaben:
\begin{itemize}
	\item Auswahlmöglichkeiten der anzuzeigenden Daten
	\item Anzeige der Daten mit oder ohne Filterung
	\item Befehlseingabe durch den User und Weiterleitung an die entsprechenden Objekte
\end{itemize}
Dazu ist eine Kommunikations zwischen Mensch und GUI und eine Kommunikation zwischen den anderen Paketen und der GUI sicherzustellen.

Das zweite Paket ist die Datenbank (Database). Die Datenbank hat folgende Aufgaben zu realisieren:
\begin{itemize}
	\item Aufnehmen, Ändern und Löschen von Daten aus der Datenbank (sowohl Arbeitsspicher als auch Datenbankdatei)
	\item Austausch von Daten zwischen Datenbank und Bibtex
	\item Austausch von Daten zwischen Datenbank und GUI
\end{itemize}

Das dritte Paket ist das Paket \emph{BibTex}. Das Paket umfasst folgende Aufgaben:
\begin{itemize}
	\item Parsen der Daten aus \BibTeX -Datei bzw. von \BibTeX -Datensätzen aus der Zwischenablage
	\item Serialisieren der Daten aus der Datenbank in eine \BibTeX -Datei
	\item Validierung der Daten aus einer \BibTeX -Datei.
\end{itemize}

\newpage

\part{Implementierung}
In den folgenden Abschnitten wird die Umsetzung in die entsprechenden Paketen und Klassen erläutert.

\section{Package de.BibTexMaker}
Das Package \emph{de.BibTexMaker} beinhaltet das gesamte Programm \textsc{BibTexMaker}. Die darin enthaltenen Packages und Klassen werden im folgenden aufgezählt und deren Funktion erläutert.
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.5]{./Images/BibTexMaker.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker}}
	\label{fig:./Images/BibTexMaker.jpg} 
\end{figure}

\subsection{Klasse BibTexMaker}
Die Klasse \emph{BibTexMaker} beinhaltet die Methoden \emph{main, createFile} und \emph{getFile}. Die Klasse bildet den Einstieg in das Programm \textsc{BibTexMaker}

Die Methode \emph{main} ist der Einstieg in das Programm \textsc{BibTexMaker}. Sie prüft ob Argumente übergeben wurden und reagiert entsprechend. Wurde ein Dateiname mit Pfad für eine BibTexMaker-Datenbank-Datei übergeben, so veranlasst die Methode das Laden dieser. Ansonsten wird eine leere Datenbank (./library.xml) angelegt. Dabei greift die Methode \emph{main} auf die Methode \emph{getFile} zu und übergibt dieser die Argumentenliste.

Die Methode \emph{getFile} liest die dem Programm übergebenen Parameter aus und wertet den Parameter \emph{-f} aus und gibt den Dateinamen mit Pfadangabe zurück. Der Parameter \emph{-f} ist dafür gedacht eine bereits vorhanden Datenbankdatei direkt beim Programmstart zu laden. Wurde kein Parameter \emph{-f} übergeben, so wird der MEthode \emph{main} ein leerer String zurückgegeben.

Die Methode \emph{main} prüft nun ob die Datei exisitert. Existiert die Datei noch nicht wird diese erzeugt. Dazu wird die Methode \emph{createFile} aufgerufen.

Die Methode \emph{createFile} erstellt eine neue Datenbankdatei mit dem entsprechenden Format. Anschließend übergibt die Methode \emph{main} den Pfad und den Dateinahmen der Datenbank, so dass diese die Daten laden kann. 

Zum Schluss startet die Methode \emph{main} die GUI.

\subsection{Package de.BibTexMaker.GUI}
Das Package \emph{de.BibTexMaker.GUI} beinhaltet alle Packages und Klassen welche zum Graphical User Interface (GUI) gehören. 
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.5]{./Images/GUI.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.GUI}}
	\label{fig:./Images/GUI.jpg} 
\end{figure}


\subsubsection{Klasse GUI}
Die Klasse \emph{GUI} ist, wie die Abkürzung schon vermuten lässt, das Graphic Unit Interface des Programms bzw. beinhaltet alle notwendigen Methoden, um dieses darzustellen. Die Klasse ist nach dem Singleton-Pattern-Verfahren programmiert. Das heißt es kann im Programm nur eine Instanz der Klasse \emph{GUI} erzeugt werden. Dazu wurde der Konstruktor private gekennzeichnet und eine Methode \emph{getInstance} implementiert. Mithilfe der Methode \emph{getInstance} kann auf die Instanz der Klasse zugegriffen werden. Ist die Instanz noch nicht angelegt, wird Sie durch die Methode \emph{getInstance} erzeugt. 

Mithilfe der Methode \emph{run} wird die GUI zur Anzeige gebracht. Die Methode stellt dabei die Größe des Bildschirms fest und berechnet entsprechend die Größe des Hauptfensters und setzt dieses in die Mitte des Bildschirms.

Die Methode \emph{close} kann dazu genutzt werden einen Window\_Closing-Event auszulösen, um damit das Fenster oder das Programm zu beenden.

Mit der Methode \emph{RenewNorthPanel} wird veranlasst, dass das NorthPanel neu aufgebaut wird und somit aktualisiert wird. Das NorthPanel beinhaltet die Buttons, die Comboboxen zur Auswahl des Publikationstypen usw.

Die Methode \emph{drop} reagiert auf einen Drop-Event und veranlasst das Prüfen des übergebenen Elementes. Liegt hier eine BibTex-Datei vor, so wird diese an den Parser weitergeleitet, damit die enthaltenden Daten in die Datenbank aufgenommen werden. 

Die Methode updateFilter löst das aktualisieren des Filters aus.

Alle anderen Methoden haben keine Funktion, sondern sind vorhanden, da dies die Implementation der Interfaces ActionListener und DropTargetListener erfordert.

\subsubsection{Klasse WindowClosingAdapter}

Die Klasse WindowClosingAdapter dient zur Entscheidung, ob nur das Hauptfenster geschlossen werden soll oder das gesamte Programm beendet werden soll, wenn ein Window\_Closing-Event ausgelöst wird.

Dazu kann die Klasse über zwei Konstruktoren instantiiert werden. Wird ein Objekt der Klasse \emph{WindowClosingAdapter} ohne übergabe des Parameters \emph{exitSystem} übergeben, so wird bei auslösen des Window\_Closing-Events lediglich das Hauptfenster geschlossen. Wird der Parameter übergeben, dann wird bei true auch das Programm beendet und nicht nur das Hauptfenster geschlossen.

Wird nun ein Window\_Closing-Event ausgelöst, dann wird die Methode \emph{windowClosing} ausgeführt. Dabei schließt Sie das Filterfenster falls geöffnet und das Hauptfenster. Anschließend wird geprüft ob das Attribut \emph{exitSystem} auf true gesetzt wurde. Ist dies der Fall veranlasst die Methode das Beenden des Programmes.

\newpage

\subsubsection{Package MainPanel}
Das Package \emph{MainPanel} beinhaltet alle Klassen zum Aufbau des Hauptfensters.
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.4]{./Images/MainPanel.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.GUI.MainPanel}}
	\label{fig:./Images/GUI.jpg} 
\end{figure}

\paragraph{Klasse MainPanel} \ \\ \\
Die Klasse MainPanel beinhaltet alle Methoden zum Aufbau des Hauptfensters. Dazu wird im Konstruktor das Hauptfenster initialisiert.  Dazu wird das Layout und die Border festgelegt. Als Layout wird das BorderLayout verwendet. An die Position North kommt das NorthPanel, Center das CenterPanel und an die Position South das SouthPanel. Es werden als Attribut jeweils ein Objekt des North-, Center- und SouthPanel angelegt.

Des Weiteren meldet der Konstruktor das CenterPanel und das SouthPanel am NorthPanelListener an, damit diese auf NorthPanelEvents reagieren können. 

Zum Schluss wird die Methode \emph{initFieldsPanel} des NorthPanels ausgeführt, um die Comboboxen für den Publikationstyp und der Auswhl der Publikation zu füllen.

Zur Klasse \emph{NorthPanel} gehören auch noch die Methoden \emph{RenewNorthPanel} und \emph{updateFilter}, welche das Aktualisieren des Filterfensters und des NorthPanels veranlassen.

Das MainPanel ist eine abgeleitete Klasse von JPanel.

\paragraph{Klasse NorthPanel} \ \\ \\
Die Klasse NorthPanel erzeugt das NorthPanel und kümmert sich um die Ausführung der entsprechenden Methode bei betätigen eines Buttons oder der Änderung eines Eintrages in einer der Comboboxen. Im Konstruktor werden die einzelnen Elemente der Klasse initialisiert. Dabei wird innerhalb der Klasse das Panel in zwei weitere Panels geteilt. Das obere und das untere Panel. Das obere Panel beinhaltet die Auswahlliste für Publikationstyp und Publikation, sowie die Schaltflächen \textsc{Vorheriger} , \textsc{Nächster}, \textsc{Hinzufügen}, \textsc{Bearbeiten} und \textsc{Löschen}. Das untere Panel beinhaltet die Elemente des Filters. Dazu gehören das Editierfeld für den Filtertext und die Schaltflächen \textsc{Felder} und \textsc{Anwenden} / \textsc{Abschalten}.

Wird in der Auswahlliste der Publikationstypen ein anderer Publikationstyp ausgewählt, so wird die entsprechende Methode \emph{actionPerformed} augeführt. Die Methode führt die Methode cbEntriesChanged aus. Anschließend wird wird die Auswahl in der Combobox neu festgelegt. und ein NorthPanelEvent ausgelöst, welcher veranlasst die Änderung in der Combobox zu übernehmen.

Wählt der Anwender in der Auswahlliste der Publikationen eine andere Publikation aus, so wird auch hier die zugehörige Methode \emph{actionPerformed} aufgerufen. Die Methode löst den NorthPanelEvent aus und teilt so den darauf hörenden Methoden mit, dass sich der Datensatz in der Auswahl geändert hat.  

Betätigt der Anwender eine der Schaltflächen, wird die entsprechende Methode \emph{actionPerformed} ausgeführt. Diese Methode prüft nun, welche Schaltfläche betätigt wurde.

Wurde die Schaltfläche \textsc{Hinzufügen} betätigt, so erfolgt zunächst eine Abfrage ob Datensätze aus der Zwischenablage in die Datenbank aufgenommen werden sollen oder ob von Hand ein neuer Datensatz erstellt werden soll. Dies geschieht über ein JOptionPane-Objekt. Anschließend wird die Methode InsertFromClipBoard ausgeführt, wenn der Anwender sich entschieden hat von der Zwischenablage die Daten einzulesen, ansonsten wird ein Objekt vom Typ \emph{InsertWindow} erstellt und mit der Methode \emph{run} geöffnet. Anschließend wird die Methode \emph{updateLists} ausgeführt, um die Änderungen in der Datenbank in der GUI anzuzeigen, also zu übernehmen.

Hat der Anwender die Schaltfläche \textsc{Bearbeiten} betätigt, wird zunächst geprüft, ob ein Eintrag ausgewählt bzw. überhaupt vorhanden ist, welcher bearbeitet werden kann. Ist dies der Fall so wird eine Instanz des Fensters zum Bearbeiten von Datensätzen (EditWindow) angelegt. Dabei wird dem Konstruktor der BibKey und der Publikationstyp des zu bearbeitenden Datensatzes übergeben. Anschließend wird das Fenster geöffnet. Nachdem der Anwender das Fenster geschlossen hat, wird noch das Aktualisieren der entsprechenden Panels veranlasst. 

Wenn die Schaltfläche \textsc{Löschen} betätigt wurde, wird die Methode \emph{DeletEntry} aufgerufen, welche die ausgewählte Publikation aus der Datenbank entfernt.

Bei betätigen der Schaltfläche \textsc{Vorheriger}, wird geprüft ob der selektierte Eintrag in der Combobox nicht der Erste ist. Ist dies der Fall so wird die Selektierung auf den davor liegenden Eintrag gesetzt. Die Combobbox löst somit einen Event aus der die darauf hörende Methode zu entsprechenden Änderungen veranlasst.	

Bei betätigen der Schaltfläche \textsc{Nächster}, wird geprüft ob der selektierte Eintrag in der Combobox nicht der Letzte ist. Ist dies der Fall so wird die Selektierung auf den danach liegenden Eintrag gesetzt. Die Combobbox löst somit einen Event aus der die darauf hörende Methode zu entsprechenden Änderungen veranlasst.

Wird die Schaltfläche \textsc{Felder} betätigt, so wird das Filterfenster (FilterWindow) aufgerufen.

Betätigt der Anwender die Schaltfläche \textsc{Anwenden}/\textsc{Abschalten} wird mithilfe der Methode \emph{setAnwenden} der Filter ein- oder ausgeschalten.

Die Methode \emph{setAnwenden} prüft zunächst ob der Filter bereits zugeschalten ist, wenn dem der Fall ist, wird er abgeschalten, ansonsten eingeschalten. Beim Einschalten wird der Status in \emph{isFiltered} auf true gesetzt, der Filter-Button erhält die Beschriftung \emph{Abschalten} und den ToolTipText \emph{Filter abschalten}. Wird jedoch der Filter abgeschalten, so wird der Status in \emph{isFiltered} auf false gesetzt und der Filter-Button erhält die Beschrtiftung \emph{Anwenden} und der ToolTipText \emph{Filter anwenden}. Weiterhin wird das Attribut \emph{oldtext} gelöscht und dem Editierfeld des Filters zugewiesen. Sowohl beim Ein- bzw. Ausschalten, wird zum Schluss die Methode \emph{cbEntriesChanged} ausgeführt,welche die ComboBox mit den Publikationseinträgen neu aufbaut.

Die Methode \emph{InsertFromClipBoard} veranlasst alle Maßnahmen, um aus der Zwischenablage Datensätze in die Datenbank zu übernehmen. Dabei werden zunächst die Daten aus der Zwischenablage abgeholt und an den Parser weitergeleitet. Dieser wandelt die Datensätze in Datenbankdaten um und führt die Validierung durch, wo die Daten auf Korrektheit geprüft werden. Zum Schluss wird noch die Methode \emph{Renew} aufgerufen, welche veranlasst, dass das NorthPanel neu aufgebaut wird, um damit eine Aktualisierung des Panels zu erreichen.

Die Methode \emph{DeleteEntry} kümmert sich darum das ein Datensatz aus der Datenbank entfernt wird. Zunächst erfolgt eine Sicherheitsabfrage, ob der ausgewählte Datensatz auch wirklich gelöscht werden soll. Bestätigt der Anwender dies, wird das Löschen veranlasst. Dazu wird der BibKey des zu löschenden Datensatzes ermittelt und den Methoden \emph{delFromAll} und \emph{delFile} aus der Klasse \emph{Indizes} übergeben. Diese Methoden sorgen dafür, dass aus den entsprechenden Listen, welche für die Combobox \emph{keys} verwendet wird entfernt werden. Anschließend wird die Datenbank veranlasst den Datensatz aus der Datenbank zu entfernen. Wurde der Datensatz aus der Datenbank entfernt, wird die Datenbank über den Marshaller dazu aufgefordert, die Datensätze in der entsprechenden Datenbankdatei zu überarbeiten. Das heißt die Datenbank auf der Festplatte wird gelöscht und die Datensätze neu aufgebaut. Anschließend wird die Methode \emph{Renew} der Datenbank aufgerufen und mit der Methode \emph{cbEntriesChanged} veranlasst, die Combobox \emph{keys} aktualisiert wird. 

Die Methode \emph{updateList} prüft zunächst ob eine Publikation vorhanden ist bzw. ausgewählt ist. Ist dies der Fall wird der BibKey des ausgewählten Eintrages ermittelt und das aktualisieren der Combobox \emph{keys} mithilfe der Methode \emph{cbEntriesChanged} veranlasst. War ein BibKey zu ermitteln wird zum Schluss die Selektion der Combobox \emph{keys} auf diesen Eintrag gesetzt. 

Die Methode \emph{cbEntriesChanged} dient zum Erneuern der Liste in der Combobox \emph{keys}. Die  Combobox \emph{keys} enthält die aufrufbaren Publikationen je nach Auswahl des Publikationstypen in der Combobox \emph{Entries}. 

Die Methode \emph{addNorthPanelListener} dient anderen Klassen bzw. Methoden dazu sich in den NorthPanelListener einzutragen, um bei entsprechenden Events informiert zu werden. 

Die Methode \emph{removeNorthPanelListener} dient anderen Klassen bzw. Methoden dazu sich aus dem NorthPanelListener auszutragen. 

Soll ein NorthPanelEvent ausgelöst werden, so muss die Methode \emph{notifyAdvertisment} aufgerufen werden. Diese geht dann die Liste der Klassen bzw. Methoden durch welche sich am NorthPanelListener angemeldet haben und informiert diese, dass ein NorthPanelEvent ausgelöst wurde.

Mithilfe der Methode \emph{initFieldsPanel} kann der NorthPanelEvent \emph{KeyChanged} ausgelöst werden.  Dazu wird der ausgewählte Publikationstyp und die ausgewählte Publikation ermittelt und dem Event hinzugefügt. 

Über die Methode \emph{Renew} können externe Methoden das Aktualisieren der Liste mit den Publikationen (keys) veranlassen. Dazu wird die Methode \emph{updateLists} aufgerufen.

Die Methode \emph{keyPressed} reagiert auf einen Tastendruck im Editierfeld des Filters. Dabei wird geprüft ob ein Text eingegeben ist und die Taste \textsc{Backspace} gedrückt wurde. Wurde die Taste \textsc{Backsapce} gedrückt und ist nur noch ein  Buchstabe vorhanden, so wird der Filtertext gelöscht und die Methode \emph{cbEntriesChanged} ausgeführt.

Die Methode \emph{keyReleased} reagiert auf das loslassen einer Taste im Editierfeld des Filters. Dabei wird geprüft, ob sich der Fitlertext geändert hat. Hat er sich geändert wird \emph{cbEntriesChanged} aufgerufen, um die Auswahlliste der Publikationen zu aktualisieren. Bei eingeschaltetem Filter veranlasst die Methode die Filterung der Publikationen bevor diese in die Liste eingetragen werden.

Die Methode \emph{updateFilter} kann von externen Methoden dazu verwendet werden um, bei eingeschalteten Filter einen Neuaufbau der Auswahlliste der Publikationen zu veranlassen. 

\paragraph{Interface NorthPanelListener}  \ \\ \\
Das Interface \emph{NorthPanelListener} wird von den Klassen eingebunden, welche auf NorthPanelEvents hören. Es ist von \emph{EventListener} abgeleitet und führt die Methode \emph{advertisement} ein. Diese Methode wird in den entsprechenden Klassen ausgeführt, wenn ein \emph{NorthPanelEvent} ausgelöst wurde und die Klassen sich am Listener angemeldet haben.  

\paragraph{Klasse NorthPanelEvent}  \ \\ \\
Die Klasse \emph{NorthPanelEvent}, wird dazu genutzt, um bei einem auslösen eines \emph{NorthPanelEvents} ein Objekt dieser Klasse zu erzeugen. Die Klasse ist von \emph{EventObject} abgeleitet und erweitert diese Klasse, um die Informationen des Publikationstyps und des Index der Publikation.

\paragraph{Klasse CenterPanel} \ \\ \\
Die Klasse \emph{CenterPanel} erzeugt das CenterPanel und dient zur Anzeige der Informationen zu einer ausgewählten Publikation. Die Klasse ist von \emph{JPanel} abgeleitet und implementiert den \emph{NorthPanelListener}, um auf \emph{NorthPanelEvents} reagieren zu können (z.B. Änderung der Publikationsauswahl). 

Die Klasse teilt das CenterPanel nochmal in zwei Panel auf. Das linke Panel (fieldsLeft) und das rechte Panel (fieldsRight). Im linken Panel werden die Labels zu den Feldern eingefügt und im rechten Panel die dazugehörigen Informationen der ausgewählten Publikation. Welcher Felder angezeigt wird entscheidet sich über den Publikationstyp der ausgewählten Publikation.

Damit immer die aktuellen Daten zur jeweilig ausgewählten Publikation angezeigt werden, hört die Klasse auf \emph{NorthPanelEvents}. Wird solch ein Event augelöst wird die Methode \emph{advertisement} aufgerufen. Dabei prüft die Methode ob der Event mit Kommando \emph{KeyChanged} ausgelöst wurde. Ist dies der Fall veranlasst die Methode das Löschen aller Elemente in den Panels \emph{fieldsLeft}, \emph{fieldsRight} und \emph{fields}. Somit ist das CenterPanel erst einmal leer. Anschließend fragt die Methode beim Event den BibKey ab. Wurde keiner mit dem Event mitgeliefert, so bleibt das CenterPanel leer. Wurde ein BibKey mitgeliefert so wird der Publikationstyp der Publikation abgefragt. Entsprechend des Publikationstyps werden die Panels \emph{fieldsRight} und \emph{fieldsLeft} über eine weitere Methode initialisiert und mit den Daten der Publikation befüllt.  Zum Schluss werden die Panels dem Panel \emph{fields} übergeben und das Panel \emph{fields} wird veranlasst sich neu aufzubauen.

\paragraph{Klasse SouthPanel} \ \\ \\
Die Klasse \emph{SouthPanel} erzeugt das SouthPanel. Es werden Methoden bereitgestellt welche die Initialisierung der Elemente des SouthPanels sicherstellen und deren Aktualität in Hinsicht auf deren Informationen zur ausgewählten Publikation. Das SouthPanel ist von \emph{JPanel} abgeleitet. 

Die Klasse hört auf \emph{NorthPanelEvents}. Wird ein solcher Event ausgelöst. wird die Methode \emph{advertisement} aufgerufen. Wurde dabei ein \emph{NorthPanelEvent} mit Kommando \emph{KeyChanged} ausgelöst, veranlasst die Methode das Löschen aller Elemente im Panel \emph{fields}. Somit ist das SouthPanel erst einmal leer. Anschließend fragt die Methode beim Event den BibKey ab. Wurde keiner mit dem Event mitgeliefert, so bleibt das SouthPanel leer. Wurde ein BibKey mitgeliefert so wird der Publikationstyp der Publikation abgefragt. Entsprechend des Publikationstyps wird das Panel fields über eine weitere Methode initialisiert und mit den BibTex-Dateinamen und Pfadangaben der Publikation befüllt. Zum Schluss wird das Panel angewiesen sich neu aufzubauen.

\subsubsection{Package MainMenu}
Das Package \emph{de.BibTex.GUI.MainMenu} enthält alle Klasse die das Hauptmenü repräsentieren.
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.7]{./Images/MainMenu.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.GUI.MainMenu}}
	\label{fig:./Images/MainMenu.jpg} 
\end{figure}

\paragraph{Klasse MainMenu} \ \\ \\
Die Klasse \emph{MainMenu} stellt das Hauptmenü des Programmes zur Verfügung. Es bindet dazu Instanzen der Klassen \emph{BibTexMenü} und \emph{DatenbankMenü} ein. 

Die Methode \emph{getMenu} übergibt der aufrufenden Methode das Hauptmenü. 

\paragraph{Klasse DatabaseMenu} \ \\ \\
Die Klasse \emph{DatabaseMenu} stellt das Untermenü für die Datenbankfunktionen dem Hauptmenü zur Verfügung. Die Klasse ist von \emph{JMenu} abgeleitet und implementiert den \emph{ActionListener}. 

Die Methode \emph{actionPerformed} wird ausgeführt, wenn ein Menüeintrag ausgewählt wurde. Je nachdem welcher Menüeintrag ausgewählt wurde wird die jeweilige Methode (\emph{newDatabaseAction}, \emph{openDatabaseAction}, \emph{closeWindow}) ausgeführt.

Die Methode \emph{newDatabaseAction} legt eine neue Datenbankdatei an. Dazu öffnet sie ein Auswahlfenster bei der das Verzeichnis gewählt werden kann, in welches die Datei erzeugt werden soll. Des Weiteren wird über das Fenster der Dateiname angegeben. Wurde ein Dateiname übergeben, so erzeugt die Methode ein File-Objekt und übergibt dieses der Database-Methode \emph{newDatabaseFile}. Diese Methode erstellt nun die Datenbankdatei.  

Die Methode \emph{openDatabaseAction} öffnet eine Datenbankdatei. Dazu öffnet sie ein Auswahlfenster mit dessen Hilfe auf einem Speichermedium eine Datenbankdatei ausgewählt werden kann. Wurde eine Datei ausgewählt, so wird diese der Datenbank übergeben, so dass die Datenbank die Daten laden kann.

Die Methode \emph{closeWindow} veranlasst über die Methode \emph{close} der Klasse \emph{GUI}, dass das Programm beendet wird.

\newpage

\paragraph{Klasse BibTexMenu} \ \\ \\
Die Klasse \emph{BibTexMenu} stellt das Untermenü für die BibTex-Funktionen dem Hauptmenü zur Verfügung. Die Klasse ist von \emph{JMenu} abgeleitet und implementiert den \emph{ActionListener}.

Die Methode \emph{actionPerformed} wird ausgeführt, wenn ein Menüeintrag ausgewählt wurde. Die Methode prüft welches Kommando übergeben wurde. Wurde das Kommando \emph{create} übergeben, so wird eine Instanz der Klasse \emph{createWindow} erzeugt und das Fenster geöffnet. Wurde jedoch das Kommando \emph{read} übergeben, so wird die Methode \emph{readBibTexFile} ausgeführt und anschließend das NorthPanel angewiesen sich neu aufzubauen, um sich dadurch zu aktualisieren. 

Die Methode \emph{readBibtexFile} öffnet ein Auswahlfenster mit der BibTex-Dateien auf einem Speichermedium ausgewählt werden können. Diese Auswahl wird dann an den Parser weitergeleitet, welcher
die Daten der BibTex-Dateien in die Datenbank aufnimmt. Vorher wird noch geprüft, ob eine der ausgewählten BibTex-Dateien schon in der Datenbank enthalten ist. Ist dies der Fall wird der gesamte Vorgang mit einer entsprechenden Meldung abgebrochen.

\subsubsection{Package Filter}
Das Package \emph{de.BibTexMaker.GUI.Filter} enthält zwei Klassen. Die Klasse \emph{Filter} und die Klasse \emph{FilterWindow}.
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.65]{./Images/Filter.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.GUI.Filter}}
	\label{fig:./Images/Filter.jpg} 
\end{figure}

\paragraph{Klasse Filter} \ \\ \\
Die Klasse Filter stellt Methoden zur Filterung bereit. Dabei werden die Publikationen gemäß den Filtereinstellungen gefiltert. Entsprechend wird die Auswahlliste der Publikationen erstellt.

Die Methode \emph{getFields} gibt die Liste der Felder zurück mit den Informationen welches Feld in den Filter einzubeziehen ist. 

Die Klasse beinhaltet zwei Methoden \emph{setFields}, welche sich in den Parametern und des beinhaltenden Algorithmus unterscheiden.

Mit der Methode \emph{setFields} kann über den Parameter \emph{fields} die komplette Liste der Felder die in den Filter einzubeziehen sind überschrieben werden.

Mit der Methode \emph{setFields} kann über den Parameter \emph{fields} Änderungen in der Liste der Felder welche in den Filter einzubeziehen sind vorgenommen werden.  

Mit der Methode \emph{getFilteredKeys} wird der aufrufenden Methode eine Liste der BibKeys übergeben, welche einen Treffer in der Datenbank  auf den Filter angewandt erzielen. Dazu ist eine Liste (allkeys) mit BibKeys der Methode zu übergeben. Des Weiteren muss mittels des Parameters filterText der entsprechende Filtertext übergeben werden, nach dem die BibKeys in der Datenbank zu filtern sind.

Mit der Methode \emph{checkEntry} wird geprüft, ob es eine Übereinstimmung mit dem Filtertext und der Publikation welche mit dem Parameter \emph{bibkey} der Methode übergeben wird. Dabei werden nur die Felder berücksichtigt, welche auch in den Filter einzubeziehen sind. 

Die Methoden \emph{checkArticle}, \emph{checkBook} usw. untersuchen die einzelnen Daten der Publikation, welche mit dem Parameter \emph{bibkey} der Methode übergeben wurde,  gemäß den Filtereinstellungen auf Übereinstimmung mit dem Filtertext.

Die Methode \emph{compare} vergleicht den Filtertext mit dem Text der über den Parameter \emph{content} der	Methode übergeben wird. Bei Übereinstimmung gibt die Methode true zurück, ansonsten false.

\paragraph{Klasse FilterWindow} \ \\ \\
Die Klasse \emph{FilterWindow} ist von \emph{JFrame} abgeleitet und implementiert den \emph{ActionListener} und den \emph{WindowListener}. Die Klasse stellt das Fenster bereit in dem der Anwender die Felder auswählen kann, welche in die Filterung einzubeziehen sind. 

Mit der Methode \emph{initFields} werden die Checkboxen gemäß der Liste der einzubeziehenden Felder initialisiert.

Die Methode \emph{actionPerformed} wird ausgeführt, wenn ein Klick auf eine Checkbox erfolgt. Die Methode ändert entsprechend die Liste der einzubeziehenden Felder im Filter ab. 

Mit der Methode \emph{Visible} kann eine Methode das Fenster öffnen. Die Methode stellt anhand der Bildschirmauflösung die Größe des Fensters ein und positioniert es auf dem Bildschirm. 

Die Methode \emph{windowClosing} wird ausgeführt wenn ein \emph{WindowClosingEvent} ausgelöst wird. Die Methode ruft dann die Methode \emph{initFields} auf.  

\subsubsection{Package InsertWindow}
Das Package \emph{de.BibTexMaker.GUI.InsertWindow} stellt die Klassen für das Fenster zum Hinzufügen von Publikationen zur Verfügung.
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.17]{./Images/InsertWindow.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.GUI.InsertWindow}}
	\label{fig:./Images/InsertWindow.jpg} 
\end{figure}

\paragraph{Klasse InsertWindow} \ \\ \\
Die Klasse \emph{InsertWindow} stellt der GUI ein Fenster zum Hinzufügen von Publikation zur Verfügung. Die Klasse ist von \emph{JDialog} abgeleitet und implementiert den \emph{ActionListener}. 

Mit der Methode \emph{run} wird das Fesnter aufgerufen. Die Methode stellt anhand der Bildschirmauflösung die Größe des Fensters ein und positioniert es mittig auf dem Bildschirm.

Mit der Methode initCBEntries wird die Auswahlliste der Publikationstypen initialisiert.

Die Methode \emph{actionPerformed} reagiert auf ActionEvents. Dabei prüft es ob das Kommando \emph{comboBoxChanged} übergeben wurde. Ist dies der Fall wird der Wechsel des CenterPanels ausgelöst. Das Kommando \emph{comboBoxChanged} wird ausgelöst, wenn in der Auswahlliste ein anderer Publikationstyp ausgewählt wird. Da der Publikationstyp gewechselt wurde, muss auch das entsprechende Panel in das CenterPanel geladen werden.

Mit der Methode \emph{changeCenterPanel} wird das Panel in das CenterPanel geladen, dass zu dem Publikationstyp gehört, welche in der Auswahlliste ausgewählt wurde. 

\paragraph{Klasse CenterPanel} \ \\ \\
Die Klasse \emph{CenterPanel} ist von \emph{JPanel} abgeleitet und implementiert den \emph{ActionListener}. Die Klasse wird nicht direkt von \emph{InsertWindow} verwendet, sondern dient für die jeweiligen CenterPanels (je Publikationstyp) als Oberklasse von der abgeleitet wird.  

Die Methode \emph{initRequiredPanel} initialisiert das Panel der Pflichtfelder.

Die Methode \emph{initOptionalPanel} initialisiert das Panel der optionalen Felder. 

Die Methode \emph{initFilesPanel} initialisiert das Panel mit der Liste der BibTex-Dateien. 

Die Methode \emph{initButtonsPanel} initialisiert das Panel mit den Schaltflächen. 

Die Methode \emph{actionPerformed} reagiert auf \emph{ActioneEvents}. Entsprechend des übergebenen Kommandos, wird eine entsprechende Methode ausgeführt. 

Wenn die Schaltfläche \textsc{Entfernen} betätigt wird, wird die Methode \emph{Delete} ausgeführt. Die Methode entfernt die ausgewählten BibTex-Dateien aus der Liste der der Publikation zugeordneten BibTex-Dateien.  

Die Methode \emph{Apply} ist eine abstrakte Methode und wird ausgeführt wenn die Schaltfläche \textsc{Speichern} betätigt wurde. Der eigentliche Quellcode wird durch die ableitende Klasse gestellt. 

Die Methode \emph{Browse} öffnet ein  Auswahlfenster mit denen man BibTex-Dateien der Liste hinzufügen kann. Sollte diese Datei noch nicht exisiteiren, wird Sie zwar nicht angelegt, aber trotzdem in die Liste aufgenommen. 

Mit der Methode \emph{clearFields}, wird in allen Editierfeldern der Inhalt gelöscht und alle Einträge in der Liste der BibTex-Dateien entfernt. 

\newpage

\paragraph{abgeleitete Klassen von der Klasse CenterPanel} \ \\ \\
Zu den abgeleiteten Klassen von der Klasse CenterPanel gehören folgende Klassen:
\begin{itemize*}
	\item{ArticlePanel}
	\item{BookPanel}
	\item{BookletPanel}
	\item{ConferencePanel}
	\item{InbookPanel}
	\item{IncollectionPanel}
	\item{InproceedingsPanel}
	\item{ManualPanel}
	\item{MastersthesisPanel}
	\item{MiscPanel}
	\item{PhdthesisPanel}
	\item{ProceedingsPanel}
	\item{TechreportPanel}
	\item{UnpublishedPanel}
\end{itemize*}
Alle zuvor aufgezählten Klassen besitzen den gleichen Aufbau. Sie unterscheiden sich lediglich darin, welche Pflichtfelder und optionalen Felder im Panel zur Anwendung kommen. Dies ist abhängig vom Publikationstyp der hinzuzufügenden Publikation.  In der Liste kann man erkennen, dass der Publikationstyp sich im Namen der jeweiligen Klasse wiederspiegelt. Im folgenden werden daher die Methode nicht explizieht für jede Klasse vorgestellt, sondern allgemein.

Der Konstruktor intialisiert die Panels mit den Labeln und Editierfeldern der Pflicht- und optionalen Felder sowie der BibTex-Datei-Liste. Dem Konstruktor ist die Breite des Panels zu übergeben.

Die Methode \emph{Apply} implementiert den Quellcode in die abstrakte Methode der Oberklasse \emph{CenterPanel}. Die Methode wird ausgeführt, wenn die Schaltfläche \textsc{Speichern} betätigt wurde. Die Methode liest die Daten aus den Editierfeldern aus und übergibt diese der Datenbank.   

Die Methode \emph{caretUpdate} prüft ob alle Pflichtfelder ausgefüllt sind. Ist dies der Fall so wird die Schaltfläche \textsc{Speichern} freigegeben, ansonsten gesperrt. Die Methode wird aufgerufen, wenn ein \emph{CaretEvent} ausgelöst wird. Der \emph{CaretEvent} wird ausgelöst, wenn sich die Cursor-Position in einem der Editierfelder der Pflichtfelder ändert. 

\subsubsection{Package EditWindow}
Das Package \emph{de.BibTexMaker.GUI.EditWindow} stellt die Klassen für das Fenster zum Bearbeiten einer Publikation zur Verfügung.
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.2]{./Images/EditWindow.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.GUI.EditWindow}}
	\label{fig:./Images/EditWindow.jpg} 
\end{figure}

\paragraph{Klasse EditWindow} \ \\ \\
Die Klasse \emph{EditWindow} stellt der GUI ein Fenster zur Bearbeitung der Informationen zu einer Publikation zur Verfügung. Die Klasse ist von \emph{JDialog} abgeleitet und implementiert den \emph{EditPanelListener}. 

Der Konstruktor initialisert das Bearbeitungsfenster. Dazu ist ihm über die Paramter \emph{bibkey} und \emph{type} der Index und der Typ der Publikation zu übergeben.

Mit der Methode \emph{run} wird das Bearbeitungsfenster aufgerufen. Die Methode stellt anhand der Bildschirmauflösung und des jeweiligen Publikationstypen die Größe des Fensters ein und positioniert es mittig auf dem Bildschirm. 

Die Methode \emph{initCenterPanel} intialisiert das CenterPanel (center). Zunächst entfernt die Methode alle vorhandenen Elemente aus dem CenterPanel und prüft dann den Publikationstyp und lädt das entsprechende Panel in das CenterPanel. Zum Schluss wird das Centerpanel noch aufgefordert sich neu aufzubauen, damit es die Aktualisierung zur Anzeige bringt. 

Die Mehode \emph{advertisement} reagiert auf \emph{EditPanelEvents}. Wurde ein \emph{EditPanelEvent} mit dem Kommando \emph{closeWindow} ausgelöst, veranlasst die Methode das Schließen des Bearbeitungsfensters.

\paragraph{Klasse CenterPanel} \ \\ \\
Die Klasse \emph{CenterPanel} ist von JPanel abgeleitet und implementiert den \emph{ActionListener}. Die Klasse wird nicht direkt von \emph{EditWindow} verwendet, sondern dient für die jeweiligen CenterPanels (je Publikationstyp) als Oberklasse von der abgeleitet wird. 

Der Konstruktor initialisiert das CenterPanel. Dem Konstruktor ist der Index (bibkey) der zu bearbeitenden Publikation zu übergeben. 

Die Methode \emph{initRequiredPanel} intialisiert das Panel mit den Pflichtfelder. Dazu wird das Layout und die Border eingestellt.  

Die Methode \emph{initOptionalPanel} intialisiert das Panel mit den optionalen Feldern. Dazu wird das Layout und die Border eingestellt.  

Die Methode \emph{initFilesPanel} intialisiert das Panel mit den BibTex-Dateien.

Die Methode \emph{initButtonPanel} intialisiert das Panel mit den Schaltflächen. 

Die Methode \emph{actionPerformed} reagiert auf ActionEvents. Dabei prüft die Methode welche Schaltfläche betätigt wurde. Entsprechend wird eine weitere Methode aufgerufen. 

Wenn die Schaltfläche \textsc{Entfernen} betätigt wird, wird die Methode \emph{Delete} ausgeführt. Die Methode entfernt die ausgewählten BibTex-Dateien aus der Liste der der Publikation zugeordneten BibTex-Dateien.  

Die Methode \emph{Apply} ist eine abstrakte Methode und wird ausgeführt wenn die Schaltfläche \textsc{Speichern} betätigt wurde. Der eigentliche Quellcode wird durch die ableitende Klasse gestellt. 

Die Methode \emph{Browse} öffnet ein  Auswahlfenster mit denen man BibTex-Dateien der Liste hinzufügen kann. Sollte diese Datei noch nicht exisiteiren, wird Sie zwar nicht angelegt, aber trotzdem in die Liste aufgenommen. 

Die Methode \emph{addEditPanelListener} dient anderen Klassen bzw. Methoden dazu sich an den EditPanelListener einzutragen, um bei entsprechenden Events informiert zu werden. 

Die Methode \emph{removeEditPanelListener} dient anderen Klassen bzw. Methoden dazu sich aus den EditPanelListener auszutragen. 

Soll ein EditPanelEvent ausgelöst werden, so muss die Methode \emph{notifyAdvertisment} aufgerufen werden. Diese geht dann die Liste der Klassen bzw. Methoden durch welche sich am \emph{EditPanelListener} angemeldet haben und informiert diese, dass ein \emph{EditPanelEvent} ausgelöst wurde.

\paragraph{abgeleitete Klassen von der Klasse CenterPanel} \ \\ \\
Zu den abgeleiteten Klassen von der Klasse CenterPanel gehören folgende Klassen:
\begin{itemize*}
	\item ArticlePanel
	\item BookletPanel
	\item BookPanel
	\item ConferencePanel
	\item InbookPanel
	\item IncollectionPanel
	\item InproceedingsPanel
	\item ManualPanel
	\item MastersthesisPanel
	\item MiscPanel
	\item PhdthesisPanel
	\item ProceedingsPanel
	\item TechreportPanel
	\item UnpublishedPanel
\end{itemize*}
Alle zuvor aufgezählten Klassen besitzen den gleichen Aufbau. Sie unterscheiden sich lediglich darin, welche Pflichtfelder und optionalen Felder im Panel zur Anwendung kommen. Dies ist abhängig vom Publikationstyp der hinzuzufügenden Publikation.  In der Liste kann man erkennen, dass der Publikationstyp sich im Namen der jeweiligen Klasse wiederspiegelt. Im folgenden werden daher die Methode nicht explizieht für jede Klasse vorgestellt, sondern allgemein.

Der Konstruktor befüllt die in CenterPanel intialisierten Panels mit den Labeln und Editierfeldern der Pflicht- und optionalen Felder sowie der BibTex-Datei-Liste. Dem Konstruktor ist der Index der Publikation und die Breite des Panels zu übergeben.

Die Methode \emph{Apply} implementiert den Quellcode in die abstrakte Methode der Oberklasse \emph{CenterPanel}. Die Methode wird ausgeführt, wenn die Schaltfläche \textsc{Speichern} betätigt wurde. Die Methode liest die Daten aus den Editierfeldern aus und übergibt diese der Datenbank.   

Die Methode \emph{caretUpdate} prüft ob alle Pflichtfelder ausgefüllt sind. Ist dies der Fall so wird die Schaltfläche \textsc{Speichern} freigegeben, ansonsten gesperrt. Die Methode wird aufgerufen, wenn ein \emph{CaretEvent} ausgelöst wird. Der \emph{CaretEvent} wird ausgelöst, wenn sich die Cursor-Position in einem der Pflichtfelder ändert. 

\paragraph{Klasse EditPanelListener} \ \\ \\
Das Interface \emph{EditPanelListener} wird von den Klassen eingebunden, welche auf \emph{EditPanelEvents} hören. Es ist von \emph{EventListener} abgeleitet und führt die Methode \emph{advertisement} ein. Diese Methode wird in den entsprechenden Klassen ausgeführt, wenn ein \emph{EditPanelEvent} ausgelöst wurde und die Klassen sich am Listener angemeldet haben.  

\paragraph{Klasse EditPanelEvent} \ \\ \\
Die Klasse \emph{EditPanelEvent}, wird dazu genutzt, um bei einem auslösen eines \emph{EditPanelEvents} ein Objekt dieser Klasse zu erzeugen. Die Klasse ist von \emph{EventObject} abgeleitet.

Die Methode \emph{getEventCommand} gibt der aufrufenden Methode das Kommando des Events zurück.

\subsubsection{Package createWindow}
Das Package \emph{de.BibTexMaker.GUI.createWindow} stellt eine Klasse mit entsprechenden Methoden der GUI zur Verfügung, welche ein Fenster erzeuegen, dass eine Auswahl der BibTex-Dateien bereitstellt. Aus dieser Liste kann dann der Anwender eine BibTex-Datei auswählen, welche erstellt werden soll.
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.7]{./Images/createWindow.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.GUI.createWindow}}
	\label{fig:./Images/createWindow.jpg} 
\end{figure}

\paragraph{Klasse createWindow} \ \\ \\
Die Klasse \emph{createWindow} stellt einen Dialog zum erstellen einer BibTex-Datei bereit. Die Klasse ist von \emph{JDialog} abgeleitet.

Ein Objekt der Klasse kann über zwei verschiedene Konstruktoren initialisiert werden.

Dem ersten Konstruktor sind keine Parameter zu übergeben. Er führt die Methode \emph{initCreateWindow} aus, welche den Dialog initialisiert.

Dem zweiten Konstruktor ist mittels des Parameters \emph{file} der Dateiname der BibTex-Datei zu übergeben, welche nach der Initialisierung in der Auswahlliste selektiert, also vorausgewählt, sein soll. Dazu führt der Konstruktor zunächst die Methode \emph{initCreateWindow} aus, welche den Dialog initialisiert. Anschließend wird die entsprechende BibTex-Datei in der Auswahlliste selektiert.

Mit der Methode \emph{initCreateWindow} wird der Dialog initialisert.

Mit der Methode \emph{run} wird der Dialog aufgerufen. Die Methode stellt dabei die Größe des Dialogfensters ein und positioniert das Fenster auf dem Bildschirm.

Die Methode \emph{actionPerformed} reagiert auf \emph{ActionEvents}. Die Methode prüft dann ob die Schaltfläche \textsc{Erstellen} betätigt wurde. Ist dies der Fall wird der Serialisierer aufgerufen und die BibTex-Datei übergeben, welche erzeugt werden soll. Zum Schluss wird der createWindow-Dialog geschlossen.

\newpage

\subsection{Package de.BibTexMaker.Database}
Das Package \emph{de.BibTexMaker.Database} beinhaltet alle Klassen und Packages der Datenbank.
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.55]{./Images/Database.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.Database}}
	\label{fig:./Images/Database.jpg} 
\end{figure}

\subsubsection{Klasse Database}
Die Klasse \emph{Database} nutzt die Programmschnittstelle \emph{Java Architecture for XML Binding (JAXB)} in der Version 2.1. Damit wird ermöglicht Daten aus einer XML-Datei automatish an Java-Klassen zu binden und aus einem XML-Schema heraus zu generieren. Weiterhin stellt die Datenbank Methoden zum Marshallen und Unmarshallen zur Verfügung. Sowohl beim Marshallen als auch beim Unmarshallen werden die Daten validiert und auf ihre Korrektheit und Konsistenz geprüft. Es werden auch Getter und Setter Methoden bereit gestellt, um Daten in die Datenbank zu schreiben bzw. aus der Datenbank zu lesen. Für die diversen Zugriffe auf die Daten werden Indizierungen bereitgestellt. Besser gesagt die Indizierungen werden hier erstellt und über die Klasse \emph{Indizes} können diese abgefragt werden. 

Die Klasse ist nach dem Prinzip des Singleton-Pattern geschrieben. Dies dient dazu sicherzustellen, dass innerhalb des Programms nur eine Instanz der Klasse existiert, so dass immer auf die Richtige Instanz zugegriffen wird. Der Zugriff erfolgt über die Methode \emph{getInstance}. Diese prüft ob bereits eine Instanz der Klasse angelegt wurde und legt eine an, wenn dies nicht der Fall ist. Anschließend gibt die Methode die Instanz an die aufrufende Methode zurück.

Über die Methode \emph{init} wird der Datenbank mittels des Parameters \emph{file} die Datenbankdatei (XML-Datei) übergeben. Daraufhin wird \textsc{JAXB} initialisiert und die Daten der XML-Datei an die entsprechenden Java-Klassen aus dem Package \emph{Factories} gebunden. 

Die Methode \emph{Schema} lädt das XML-Schema für die BibTexMaker-Datenbank und gibt dies der aufrufenden Methode zurück.

Die Methode \emph{marshal} wird aufgerufen, um die Daten aus den Java Objekten in eine XML-Datei zu generieren. 

Die Methode \emph{initIndizes} legt Listen der einzelnen Publikationen zu den entsprechenden Publikationstypen an. Diese Listen werden z.B. von der GUI für die Auswahllisten der Publikationen verwendet.

Die verschiedenen Getter-Methode zu den Publikationstypen (z.B. getArticle, getBook usw.) geben die Daten zu einer über den Parameter \emph{bibkey} bestimmten Publikation an die aufrufende Methode zurück.  

Über die Methode \emph{getLibrary} kann die gesamte Datenbank abgefragt werden. 

Die Methode \emph{getEntries} übergibt der aufrufenden Methode alle Datensätze der Datenbank. 

Mit der Methode \emph{Renew} kann eine externe Methode veranlassen, dass die Indizierungen neu erstellt werden.  

Um Publikationen in die Datenbank aufzunehmen, muss die Methode \emph{addEntries} aufgerufen werden. Über den Parameter \emph{entries} sind dabei die Datensätze der Methode zu übergeben.

Soll die Datenbank gewechselt werden, dann ist die Methode \emph{setDatabaseFile} aufzurufen. Über dem Parameter \emph{file} ist die zu ladende Datenbankdatei zu übergeben.

Mithilfe der Methode \emph{newDatabaseFile} kann eine neue Datenbankdatei angelegt werden. Der Methode ist über den Parameter \emph{file} die Datenbankdatei zu übergeben.

\paragraph{Klasse Indizes} \ \\ \\
Die Klasse \emph{Indizes} beinhaltet Methode um Indizierungslisten zu erstellen und zu bearbeiten. Die Indizierungslisten werden von der GUI verwendet, um damit die Auswahlliste der Publikationen zu befüllen. Die Klasse wurde nach dem Prinzip des Singleton-Pattern geschrieben, um sicherzustellen, dass immer auf die aktuellen Indizierungslisten zugegriffen wird. 

Die Methode \emph{getInstance} übergibt die einzige Instanz der Klasse \emph{Indizes} an die aufrufende Methode. Dabei wird vorher geprüft ob die Instanz schon angelegt wurde. Ist dies nicht der Fall, so wird dies noch erledigt.

Über die Methode \emph{add} können einer Indizierungsliste eines bestimmten Publikationstypen weitere Einträge hinzugefügt werden.

Die Methode getAll gibt der aufrufenden Methode die Indizierungsliste aller Publikationstypen zurück.

Die Getter-Methode zu den Publikationstypen (z.B. getArticles, getBooks, usw.) geben der aufrufenden Methode die Indizierungsliste des entsprechenden Publikationstypen zurück.

Mit der Methode \emph{getType} kann aus der Indizierungsliste aller Publikationen der Publikationstyp extrahiert werden. Als Parameter muss der entsprechende BibKey der Publikation übergeben werden.

Die Getter-Methoden zu den Publikationen (z.B. getTechreportIndex, getUnpublishedIndex, usw.) geben der aufrufenden Methode den Index einer bestimmten Publikation zurück. Die Publikation wird über den Parameter bibkey referenziert. 

Mit der Methode \emph{addToAll} kann der Indizierungsliste aller Publikationen ein neuer Eintrag hinzugefügt werden.

Mit der Methode \emph{delFromAll} kann ein Eintrag aus der Indizierungsliste aller Publikationenen entfernt werden. 

Mit der Methode \emph{addFile} kann der Liste der Zuordnungen von BibTex-Dateien und Publikationen ein neuer Eintrag hinzugefügt werden.

Mit der Methode \emph{delFile} kann aus der Liste der Zuordnungen von BibTex-Dateien und Publikationen ein Eintrag entfernt werden.

Die Methode \emph{getFile} gibt der aufrufenden Methode eine Liste der Publikationen zurück, welche einer bestimmten BibTex-Datei zugeordnet sind. Die Bibtex-Datei wird mit dem Parameter \emph{filename} der Methode übergeben.  

Die Methode \emph{getFiles} gibt eine Liste aller in der Datenbank eingetragenen BibTex-Dateien zurück.

Mit der Methode \emph{delAll} können alle Einträge aus allen Indizierungslisten entfernt werden.

\paragraph{Packages de.BibTexMAker.Database.Factories} \ \\ \\
Das Package \emph{Factories} enthält die Klassen, welche die Java-Objekte der XML-Elemente entsprechen. Sie dienen als Schnittstelle zwischen XML und Java. 
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.31]{./Images/Factories.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.Database.Factories}}
	\label{fig:./Images/Factories.jpg} 
\end{figure}

Die Klassen sind nach dem Prinzip des Factory Pattern geschrieben und wurden über das Framework \textsc{JAXB} automatisch erstellt. Dazu wurde eine XML-Schemata-Datei erstellt und diese dem ANT  Compiler mittels einer build.xml-Datei übergeben. In der build.xml stehen die Verarbeitungsregeln für den ANT Compiler und in der XML-Schemata-Datei (library.xsd) die Regeln zu den XML-Elementen. Aus diesen Dateien und deren darin befindlichen Angaben hat der ANT Compiler die im Package \emph{de.BibTexMAker.Database.Factorie} enthaltenen Klassen erstellt. 

Aufgrund der automatischen Erzeugung der Klassen und der Nutzung des Frameworks JAXB wird hier auf eine Dokumentation der einzelnen Klassen verzichtet und auf die Kommentare in den Klassen bzw. den diversen Dokumentationen zu JAXB verwiesen.

\newpage

\subsection{Package de.BibTexMaker.BibTex}
Das Package \emph{de.BibTexMaker.Bibtex} beinhaltet die Klassen \emph{Parser}, \emph{Serializer} und \emph{Validator}. 
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.45]{./Images/BibTex.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.BibTex}}
	\label{fig:./Images/BibTex.jpg} 
\end{figure}

Diese Klassen sind dafür zuständig den Datenaustausch zwischen \BibTeX -Dateien und der \BibTeX Maker-Datenbank sicherzustellen. Dabei sind die Daten in die entsprechenden Formate zu wandeln und beim Parsen zu validieren. 

\subsubsection{Klasse Parser}
Die Klasse \emph{Parser} stellt einen Parser zur Verfügung, welcher Datensätze aus \BibTeX -Dateien in Datensätze der der Datenbank Database umwandelt. Bei dieser Umwandlung werden die Daten validiert und somit auf die Einhaltung der \BibTeX -Regeln geprüft. Findet der Parser bzw. Validator einen Fehler wird das Parsen abgebrochen und eine entsprechende Exception ausgelöst.

Mit der Methode \emph{parseFromFile} wird das Parsen einer Datei ausgelöst. Die zu parsende Datei ist über den Parameter \emph{file} zu übergeben. War das Parsen erfolgreich wird der aufrufenden Methode true zurückgegeben, ansonsten false.

Mit der Methode \emph{parseFromText} wird das Parsen eines Strings ausgelöst. Der zu parsende String ist über den Parameter \emph{text} zu übergeben. War das Parsen erfolgreich wird der aufrufenden Methode true zurückgegeben, ansonsten false.  

Die Methode \emph{parse} wandelt \BibTeX -Datensätze in Datensätze der \BibTeX Maker-Datenbank um. Die \BibTeX -Datensätze sind der Methode über den Parameter \emph{text} zu übergeben. Des Weiteren ist über den Parameter \emph{filename} die Pfad- und Dateinamenangabe zur \BibTeX -Datei zu übergeben, aus der die Daten stammen. Stammen die Daten aus keiner Datei, so ist der Parameter \emph{filename} mit einem Null-String zu übergeben. 

Die Methoden zu den jeweiligen Publikationstypen, wie z.B. \emph{parseArticle},  extrahieren aus dem String \emph{bibtex}, welcher als Parameter der Methode übergeben wurde, die Daten der Pflichtfelder und der optionalen Felder. Die Daten werden dann in ein neues Objekt zum Publikationstyp gehörenden Klasse (z.B. \emph{Article}) geschrieben. Dieses Objekt wird dann dem Validator zugeführt, welcher prüft, ob alle Pflichtfelder befüllt sind und alle Regeln für den entsprechenden Publikationstyp eingehalten wurden. Ist dies der Fall, so wird der Datensatz in das Attribut entries übernommen.    

Die Methode \emph{getStrings} sucht nach Abkürzungen in dem mit dem Paramter \emph{text} übergebenen String. Die Methode baut aus den gefundenen Abkürzungen über eine HashMap ein Abkürzungsverzeichnis auf, welches die Methode am Ende zurückgibt.   

Die Methode \emph{getBibkey} extrahiert aus dem mit dem Parameter \emph{bibtex} übergebenen String den BibKey der entsprechenden Publikation und gibt ihn der aufrufenden Methode zurück. 

Mit der Methode \emph{getField} kann aus dem String, der mit dem Parameter \emph{bibtex} übergeben wurde, das Datum zum jeweiligen Feld, welches über den Parameter \emph{field} übergeben wurde, ermittelt werden.

Die Methode \emph{getBrace} wird von der Methode \emph{parse} eingesetzt, um Daten eines Feldes zu ermitteln welche in geschweifte Klammern gesetzt ist.  

Die Methode \emph{getApostropheItem} wird von der Methode \emph{parse} eingesetzt, um Daten eines Feldes zu ermitteln, welches in Anführungszeichen gesetzt wurde.

Die Methode \emph{getCombinedString} wird von der Methode \emph{getApostropheItem} eingesetzt, um die Daten eines Feldes zu ermitteln, welche aus Kombinationen von Abkürzungen und in Anführungszeichen gesetzte Daten bestehen.

Die Methode \emph{getStringItem} wird dazu eingesetzt, um aus dem String \emph{tmp} der als Parameter übergeben wurde die Abkürzung zu extrahieren und mittels des erstellten Abkürzungsverzeichnisses (strings) 
zu übersetzen.

\subsubsection{Klasse ParserException}
Die Klasse \emph{ParserException} stellt Methoden bereit, um auf Exception zu reagieren, welche vom Parser ausgelöst werden. Die Klasse ist von \emph{Exception} abgeleitet.

Die Klasse kann über zwei Konstruktoren aufgerufen werden. 	Dem ersten Konstruktor ist lediglich die Fehlernummer zu übergeben und dem zweiten Konstruktor ist zusätzlich zur Fehlernummer noch eine Fehlermeldung zu übergeben.

Die Methode \emph{getMsg} gibt die Fehlermeldung zur mit dem Parameter \emph{errno} übergebenen Fehlermeldung zurück. 

Die Methode \emph{getMsg} gibt die Fehlermeldung zur mit dem Parameter \emph{errno} übergebenen Fehlermeldung zurück. Konnte zur Fehlermeldung keine Fehlermeldung gefunden werden, so wird die über den Parameter \emph{msg} übergebene Meldung zurückgegeben. 

Die Methode \emph{getEntryNotValidOptionalField} gibt entsprechend der Message, welche mit dem Parameter \emph{msg} übergeben wird, eine Fehlermeldung zurück.

Die Methode \emph{getEntryNotValidInRequiredField} gibt entsprechend der Message, welche mit dem Parameter \emph{msg} übergeben wird, eine Fehlermeldung zurück.

Die Methode \emph{getEntryNotValid} gibt entsprechend der Message, welche mit dem Parameter \emph{msg} übergeben wird, eine Fehlermeldung zurück.

Die Methode \emph{getFieldNotKnownMsg} gibt entsprechend der Message, welche mit dem Parameter \emph{msg} übergeben wird, eine Fehlermeldung zurück.

Die Methode \emph{getFieldNotFoundMsg} gibt entsprechend der Message, welche mit dem Parameter \emph{msg} übergeben wird, eine Fehlermeldung zurück.

Die Methode \emph{getKeyNotFoundMsg} gibt entsprechend der Message, welche mit dem Parameter \emph{msg} übergeben wird, eine Fehlermeldung zurück.

\subsubsection{Klasse Serializer}
Die Klasse \emph{Serializer} stellt Methoden zur Verfügung, um Datensätze aus der \BibTeX Maker-Datenbank in \BibTeX -Daten zu konvertieren und diese Regelkonform in einer \BibTeX -Datei abzulegen.

Mit der Methode \emph{serialize} wird das Serialisieren gestartet. Dazu ist der Methode über den Parameter \emph{filename} der absolute Pfad zur zu erstellenden \BibTeX -Datei zu übergeben. Die Methode gibt true zurück, wenn das Serialisieren ohne Fehler abgeschlossen werden konnte, ansonsten wird false zurückgegeben.   

Die Methode \emph{getEntries} gibt einen vollständigen Datensatz im \BibTeX -Format zurück. Dazu ist der Methode der entsprechende BibKey des Datensatzes zu übergeben.

Die jeweiligen Methoden zu den Publikationstypen, wie z.B. \emph{getArticle}, wandeln einen Datensatz des entsprechenden Publikationstyps vom \BibTeX Maker-Datenbank-Format in das \BibTeX -Format um und giben diesen zurück. Dazu ist der Methode der Bibkey des entsprechenden Datensatzes zu übergeben.

\subsubsection{Klasse Validator}
Die Klasse \emph{Validator} dient dem Parser zur Validierung der zu parsenden Daten. Der Validierer prüft allerdings lediglich das zu einem Datensatz alle Pflichfelder vorhanden sind, also es zu den entsprechenden Pflichtfelder Daten exisitieren und diese Regelkonform vorliegen. Dabei werden auch optionale Felder bei denen es eine Regel gibt in die Prüfung einbezogen.

Die Methoden \emph{validate} validieren eine Publikation je nach Publikationstyp. Dabei wird die ID-Nummer des Feldes zurückgegeben welches nicht valide ist. Sind alle Felder valide, so wird eine 0 zurückgegeben.

\subsection{Package de.BibTexMaker.Utiles}
Das Package \emph{de.BibTexMaker.Utiles} beinhaltet Hilfsklassen deren Methode meist statisch sind, da Sie zur Unterstützung der anderen Klassen dienen.
\begin{figure} [!ht] 
	\centering 
	\includegraphics[scale=0.45]{./Images/Utiles.jpg}
	\caption{Klassendiagramm Package \emph{de.BibTexMaker.Utiles}}
	\label{fig:./Images/Utiles.jpg} 
\end{figure}

\subsubsection{Klasse EntryTypes}
Die Klasse \emph{EntryTypes} stellt statische Methoden zur Verfügung, um über die ID-Nummer eines Publikationstypen den Titel von diesem abzufragen und umgekehrt.

Es gibt zwei Methode \emph{getEntryType}. Die Eine erwartet als Parameter die ID-Nummer des Publikationstyps dessen Bezeichnung zurückgeliefert werden soll. Bei der zweiten Methode \emph{getEntryType} ist es genau umgekehrt. Diese erwartet als Parameter die Bezeichnung des Publikationstyps dessen ID-Nummer zurückgegebene werden soll.

\subsubsection{Klasse Fields}
Die Klasse \emph{Fields} stellt statische Methoden zur Verfügung, um über die ID-Nummer eines Feldes den Titel von diesem abzufragen und umgekehrt.

Es gibt zwei Methode \emph{getType}. Die Eine erwartet als Parameter die ID-Nummer des Feldes dessen Bezeichnung zurückgeliefert werden soll. Bei der zweiten Methode \emph{getType} ist es genau umgekehrt. Diese erwartet als Parameter die Bezeichnung des Feldes dessen ID-Nummer zurückgegebene werden soll.

\subsubsection{Klasse BibTexFileFilter}
Die Klasse \emph{BibtexFileFilter} wird hier hauptsächlich von der GUI eingesetzt. Die Klasse stammt in der Ursprünglichen Version von \emph{Jeff Dinkins}\footnote{Jeff Dinkins has been working on the Swing GUI Tookit since it's start
in 1996, and is currently the engineering manager of the Swing \& AWT teams at Sun. \\ Quelle: \href{http://www.java.net/pub/au/219}{http://www.java.net/pub/au/219}} und wurde hier nicht weiter verändert, daher werde ich hier den Originalkommentar\footnote{Jeff Dinkins; Version 1.16 07/26/04} zur Klasse wiedergeben. 
\begin{quote}
	A convenience implementation of FileFilter that filters out \\
	all files except for those type extensions that it knows about. \\ \\
	Extensions are of the type ".foo", which is typically found on \\
	Windows and Unix boxes, but not on Macinthosh. Case is ignored. \\ \\
	Example - create a new filter that filerts out all files \\
	but gif and jpg image files: \\
	\begin{lstlisting}[language=Java]
JFileChooser chooser = new JFileChooser(); 
ExampleFileFilter filter = new ExampleFileFilter( 
	new String{"gif", "jpg"}, "JPEG & GIF Images");
chooser.addChoosableFileFilter(filter); 
chooser.showOpenDialog(this);
	\end{lstlisting}	
\end{quote}

\newpage

\bibliography{Dokumentation}
\bibentry{Krueger2009}
\bibentry{Ullenboom2009}
\bibentry{Kecher2006}
\bibentry{Mittelbach2005}
\bibentry{Michaelis2007}
\bibentry{Grechenig2010}


\end{document} 
  
