Entdecken Sie eBooks
Kategorien
Entdecken Sie Hörbücher
Kategorien
Entdecken Sie Zeitschriften
Kategorien
Entdecken Sie Dokumente
Kategorien
Christian Linde
Transformation der vorhandenen Stundenplandaten zur Inkludierung im Datenbank-Service in Haskell. Prototypische Implementierung in Spirit
Fachhochschule Schmalkalden Informatik Prof. Dr. Braun Prof. Dr. Stiefel 6 280242
05.09.2011
Inhaltsverzeichnis
1 Einleitung 1.1 Der aktuelle Stundenplan . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Grnde fr einen neuen Stundenplan . . . . . . . . . . . . . . . . . . 1.3 Ziele, die diese Bachelorarbeit erreichen soll . . . . . . . . . . . . . . 2 Grundlagen 2.1 Parser-Techniken 2.2 Haskell . . . . . . 2.3 Spirit . . . . . . . 2.4 RESTful Service 1 2 3 4 5 5 5 6 6 8 8 11 11 12 12 13 13 15 17 17 18 19 21 22 23 26 26 26 28 28 29 29 30
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
3 Vorbetrachtung 3.1 Die Stundenplan-HTML-Daten . . . . . . . . . 3.2 Verfahren zur Transformation der HTML-Daten 3.2.1 blaze-html . . . . . . . . . . . . . . . . . 3.2.2 Parsec . . . . . . . . . . . . . . . . . . . 3.2.3 HaXml . . . . . . . . . . . . . . . . . . . 3.2.4 xhtml . . . . . . . . . . . . . . . . . . . 3.2.5 TagSoup . . . . . . . . . . . . . . . . . . 3.3 Beschreibung des verwendeten Verfahrens . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
4 Transformation der HTML-Stundenplandaten 4.1 Entwicklung einer Zwischenstruktur . . . . . . . . . . . . . 4.2 Transformation der HTML-Struktur . . . . . . . . . . . . . 4.3 Der Zustandsautomat . . . . . . . . . . . . . . . . . . . . . 4.4 Implementierung des Zustandsautomaten . . . . . . . . . . 4.5 Entwicklung der internen Datenstruktur . . . . . . . . . . 4.6 Zwischenstruktur in interne Datenstruktur transformieren . 5 Erweiterung und Speicherung der internen Datenstruktur 5.1 Erweiterung der internen Datenstruktur . . . . . . . . 5.1.1 Ausung der Dozenten-Bezeichnung . . . . . . 5.1.2 Beginn und Ende einer Veranstaltung . . . . . . 5.1.3 Ablaufdatum der Veranstaltung . . . . . . . . . 5.1.4 Studiengangname und classID . . . . . . . . . . 5.2 Exportieren der interne Datenstruktur . . . . . . . . . 5.3 bertragung der JSON-Daten zum RESTful Service . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
6 Resmee
32
II
1 Einleitung
Diese Bachelorarbeit ist ein Teilprojekt des Projektes Spirit. Der Entwicklungsname dieses Teilprojektes ist Migrate. Das Projekt Spirit ist eine fakulttsweite Plattform fr Studenten, die Zugri auf den Stundenplan oder aktuelle Informationen der Fakultt ermglicht. Die Aufgabe dieser Bachelorarbeit ist es, eine Schnittstelle zum Import des aktuellen Stundenplan-Formates in das neue Datenbanksystem von Spirit zu bilden. Es muss mglich sein, sowohl die Daten aus dem vorhergehenden Stundenplanungstool als auch die Daten des neuen Stundenplanungstools, das als Teilprojekt von Spirit in Planung ist, in das neue Datenbanksystem zu importieren. Da nicht abzusehen ist, wann das neue Datenbanksystem verfgbar ist, soll nur eine prototypische Implementierung des RESTful Services, der als Verbindung zur Datenbank verwendet wird, umgesetzt werden. Des Weiteren soll es im Programm die Mglichkeit geben, die Stundenplandaten als JSON zu exportieren. Fr die Umsetzung des Teilprojektes von Spirit kann jede Programmiersprache verwendet werden, mit der es mglich ist Dateien einzulesen und zu verarbeiten, sowie jede, die die Mglichkeit bietet Dateien zu schreiben. Fr das Teilprojekt ist die Programmiersprache Haskell vorgegeben. Damit ein besseres Verstndnis von den verschiedenen Teilprojekten von Spirit entstehen kann, sind diese in Abbildung 1.1 dargestellt.
KAPITEL 1. EINLEITUNG
Mobile Apps
EmployeeWeb
PlanningWeb
MIgrate
StudWeb
RESTful Service
Database alte Stundenplanung
Prolog
LCD-Pro
CARD READER AUDIO
LINE-IN PHONE MIC
SATA
USB
EJECT
DVD-RW
POWER
SELECT MENU
libSpirit
LCD-Pro
Esc
F1
~
F2
`
!
Tab
F3
1
@
F4
2
#
F7 F8
Pause
NumLock
Break
CapsLock
Scroll Lock
Insert
Home
NumLock
PageDown
* 7
8 4
Home
PgUp
6 1
End
+ 2 0 3
PgDn Ins . Enter Del
Shift Alt Gr
Ctrl
C
LCD-Pro
CARD READER
AUDIO
LINE-IN PHONE MIC
SATA
USB
EJECT
DVD-RW
POWER
SELECT MENU
Esc
F1
~
F2
`
!
Tab
F3
1
@
F4
2
#
F7 F8
Pause
NumLock
Break
CapsLock
Scroll Lock
Insert
Home
NumLock
PageDown
* 7
8 4
Home
PgUp
6 1
End
+ 2 0 3
PgDn Ins . Enter Del
Shift Alt Gr
Ctrl
CARD READER
AUDIO
LINE-IN PHONE MIC
SATA
USB
EJECT
DVD-RW
POWER
SELECT MENU
Esc
F1
~
F2
`
!
Tab
F3
1
@
F4
2
#
F7 F8
Pause
NumLock
Break
CapsLock
Scroll Lock
Insert
Home
NumLock
PageDown
* 7
8 4
Home
PgUp
6 1
End
+ 2 0 3
PgDn Ins . Enter Del
Shift Alt Gr
Ctrl
Florian Schuhmann
Abbildung 1.1: Projektbersicht von Spirit. Quelle: Abbildung von Florian Schuhmann.
Vgl. W3C
Seite 2
KAPITEL 1. EINLEITUNG
Seite 3
KAPITEL 1. EINLEITUNG
Abbildung 1.2: Stundenplan BaI6 Ausschnitt. Quelle: http:// sund.de/ steffen/ plan/ s_bai6.html.
Seite 4
2 Grundlagen
Das Kapitel Grundlagen soll dem Leser ein Grundverstndnis ber das in der Bachelorarbeit behandelte Themengebiet geben. Dabei soll auf die Themen ParserTechniken, Haskell, Spirit und RESTful Service eingegangen werden.
2.1 Parser-Techniken
Fr einen Computer ist jede Eingabe zu Beginn nur ein Text, mit dem er nichts anfangen kann. Deshalb werden Parser-Techniken verwendet, um aus einer Eingabe eine syntaktische Struktur zu gewinnen.1 Ein Anwendungsbeispiel fr den Einsatz von Parsern, ist HTML. Mit HTML alleine kann ein Computer nichts anfangen. An dieser Stelle wird ein Parser bentigt. Dieser ermglicht dem Computer die HTMLDatei zu interpretieren und zu analysieren. Somit kann der Inhalt der HTML-Datei weiterverarbeitet und zum Beispiel durch einen Browser angezeigt werden.2
2.2 Haskell
Die Programmiersprache Haskell gehrt zu der Gruppe der funktionale Programmiersprachen. Wenn man die Einteilung der Programmiersprachen nach imperativen und deklarativen Sprachen betrachtet, so sind die funktionalen Sprachen eine Untergruppe der deklarativen Sprachen. Zu dieser Kategorie gehrt auch Lisp. Bei funktionalen Programmiersprachen handelt es sich um Programme, die ausschlielich aus Funktionen bestehen. Durch diesen Sachverhalt, ist es mglich, die aus der
1 2
KAPITEL 2. GRUNDLAGEN
imperativen Programmierung bekannten Nebenwirkungen zu vermeiden. Eine Nebenwirkung imperativer Programmierung ist zum Beispiel der Seiteneekt. Imperative Programmiersprachen sind zum Beispiel C und Java. Die Programmiersprache Haskell, als Vertreter der funktionalen Sprachen, hat folgende Vorteile: Sie ermglicht Funktionen hherer Ordnung, dadurch wird eine starke Wiederverwendung von Programmteilen ermglicht. Weiterhin fhrt die oben erwhnte Abwesenheit von Seiteneekten zur Reinheit der Sprache. Durch die Reinheit der Sprache, wird das Beweisen ber Programmeigenschaften erleichtert. Haskell bietet des Weiteren ein starkes Typsystem. Dies ist ein groer Vorteil, da dadurch viele Fehler bereits durch den Compiler erkannt werden knnen.3
2.3 Spirit
Das Projekt Spirit auch spirit@fhs genannt, stellt eine Informationsplattform fr die Studenten der Fakultt Informatik der Fachhochschule Schmalkalden bereit. Bisher bietet die Plattform Informationen ber aktuelle Mitteilungen der Fakultt Informatik, sowie die Stundenplne fr die Studenten der Fakultt. Die Informationsplattform ist im Internet unter http://spirit.fh-schmalkalden.de/ erreichbar. Das Projekt Spirit gliedert sich in verschiedene Teilprojekte die von verschiedenen Studenten und Dozenten der Fachhochschule Schmalkalden geplant und umgesetzt werden. Aktuell existieren die folgenden Teilprojekte: Core, News, StudWeb, EmployeeWeb, PlanningWeb, Data, Mobile, DistributedCalc, Migrate, LibSpirit.
4
Seite 6
KAPITEL 2. GRUNDLAGEN
im World Wide Web verwendet wird. Das REST-System gilt in seiner Konsequenz als eine Richtlinie fr die Nutzung von Web-Standards.5 REST setzt auf ein zustandsloses Client/Server-Protokoll. Dabei enthlt jede HTTPBotschaft alle Informationen, die notwendig sind, um die Nachricht zu verstehen. Deshalb muss weder der Server noch der Client Zustandsinformationen zwischen zwei Nachrichten speichern. Eine derartig strikte Trennung der Zustndigkeiten zwischen Client und Server fhrt dazu, dass ein REST-konformer Webservice als zustandslos (stateless) bezeichnet werden kann 6
5 6
Seite 7
3 Vorbetrachtung
In der Vorbetrachtung werden alle grundlegenden Entscheidungen getroen, wie die Auswahl eines geeigneten Transformationsverfahrens.
< TR align=center> < >Z e i t</TH < >Montag</TH < >D i e n s t a g</TH TH > TH > TH > < >Mittwoch</TH < >Donnerstag</TH < >F r e i t a g</TH TH > TH > TH > </TR < > TR align=center>
< >08.15 09.45</TD TD TD >< >  ;</TD < >  ;</TD > TD > < > TD < TABLE B R E =1 W D H O DR I T =100% c e l l s p a c i n g=0 b o r d e r c o l o r d a r k=# FFFFFF>
< TR align=center>< ><font color=#A52A2A> TD <img border=0 src=" b i l d e r / monitor . g i f " width=17 height=17> DBS  ; V1
10
11
12
KAPITEL 3. VORBETRACHTUNG
13
< >K n o l l e </ font> BR </TD > ... </TABLE ></TD > ... </TABLE ></TD > Listing 3.1: Tabellenaufbau des alten Stundenplans
14
15
16
17
18
Ein weiteres Problem ist, dass die Darstellungen der Informationen unterschiedlich sind. Das liegt unter anderem daran, dass Veranstaltungen wchentlich oder alle zwei Wochen angeboten werden knnen. Ein Beispiel dazu ist im Listing 3.2 abgebildet.
1
< ><font color=#A52A2A> TD <img border=0 src=" b i l d e r / monitor . g i f " width=17 height=17>DBS& nbsp ; V1
< >WKST BR   ; <B >g</B >  ; 1 < >K n o l l e </ font> BR </TD >
< ><font color=#A52A2A> TD <img border=0 src=" b i l d e r / monitor . g i f " width=17 height=17>DBS& nbsp ; V1
10
< >WKST BR   ; <B >w</B >  ; < >K n o l l e </ font> BR </TD > Listing 3.2: Unterschied wchentlich oder alle zwei Wochen
11
12
13
Seite 9
KAPITEL 3. VORBETRACHTUNG
Ein weiterer Grund fr die unterschiedlichen Darstellungen der Informationen ist, dass Vorlesungen und bungen im Stundenplan verschieden dargestellt werden. Der Unterschied besteht darin, dass bei einer bung meistens eine Gruppeneinteilung vorgenommen wird, was bei Vorlesungen selten vorkommt. Trotzdem knnen Gruppenaufteilungen fr Vorlesungen nicht ausgeschlossen werden. Ein Beispiel dazu ist im Listing 3.3 abgebildet. In Zeile 5 ist dargestellt, dass die bung in einer ungeraden Kalenderwoche fr die Gruppe Eins statt ndet. In Zeile 13 wird eine Vorlesung ohne Gruppeneinteilung angeboten.
1
< > <font color=#2D71FF> TD <img border=0 src=" b i l d e r / monitor . g i f " width=17 height=17> SWEProg  ; V3 < >PC2  ; BR <B >u</B >  ; 1 < >Braun </ font> BR </TD >
< ><font color=#A52A2A> TD <img border=0 src=" b i l d e r / buch . g i f " width=24 height=14> SWEProg  ; V2 < >H0216  ; BR <B >g</B >  ; < >Recknagel </ font> BR </TD > Listing 3.3: Unterschied bung/Vorlesung
10
11
12
13
14
15
Beim Verarbeiten der Veranstaltungen muss zustzlich beachtet werden, dass die Information, ob ein eingetragener Termin eine Vorlesung oder bung ist, anhand eines Bildverweises entschieden wird. Dies kann man im Listing 3.3 in Zeile 2 und 10 feststellen. Eine weitere Schwierigkeit beim Erstellen des Stundenplans ist, dass die Darstellungsform des HTML-Codes nicht einheitlich ist. Das heit, dass bei den HTMLTag Informationen einmal der Attribut-Name gefolgt von einem Gleichheitszeichen und dem HTML-Tag Wert dargestellt ist und ein anderes Mal ist der HTML-Tag Wert in Anfhrungsstrichen eingeschlossen. Dieser Sachverhalt muss beim Parsen
Seite 10
KAPITEL 3. VORBETRACHTUNG
der HTML-Tags bercksichtigt werden. Ein Beispiel fr die verschiedenen Darstellungen ist im Listing 3.4 zu sehen.
1
3.2.1 blaze-html
Die blaze-html Bibliothek ist eine HTML-Bibliothek fr Haskell. Diese ermglicht es HTML 4 und HTML 5 konforme Strukturen zu verarbeiten.1 Durch das blaze-fromhtml-Projekt, das auf der blaze-html-Bibliothek basiert, ist es mglich eine Umwandlung des vorhandenen HTML-Stundenplans durchzufhren. Aus dem QuellCode des blaze-from-html-Projektes ist zu entnehmen, dass das TagSoup-Projekt eingebunden wird. Im Rahmen der Bachelorarbeit war es aus Zeitgrnden nicht mglich, den Quellcode so zu analysieren, dass nachgewiesen werden kann, dass die HTML-Transformation mit dem TagSoup-Projekt umgesetzt wird oder ob es nur
1
Seite 11
KAPITEL 3. VORBETRACHTUNG
als Hilfsmittel verwendet wird. Die Transformation kann nur umgesetzt werden, da blaze-from-html die Mglichkeit bietet sehr tolerant mit den Fehlern der HTMLSeite umzugehen. Dadurch ist es mglich die HTML-Struktur in eine Haskell-Form umzuwandeln. Da die Mglichkeit der Weiterverarbeitung dieser Haskell-Daten jedoch im Rahmen der Arbeit zu umfangreich ist, wird dieses Verfahren nicht weiter betrachtet.
3.2.2 Parsec
Parsec2 bietet die Mglichkeit ber Parser-Kombinatoren eigene Parser zu entwickeln. Dadurch ist es mglich, Parser zu entwerfen, durch die ein HTML-Syntax verarbeitet werden kann. Bei der Test-Implementierung stellte sich heraus, dass der Aufwand um eine komplette HTML-Datei zu parsen, den Rahmen der Arbeit bersteigt und das Ziel verfehlt.
3.2.3 HaXml
HaXml is a collection of many utilities for parsing, ltering, transforming, and generating XML documents using Haskell. 3 HaXml liefert umfangreiche Funktionalitt um auch HTML-Dateien zu parsen. Bei einer Test-Implementierung zeigte sich jedoch, dass beim Parsen des Stundenplans ein "Lexical error"verursacht wird, wodurch eine Weiterarbeit mit diesem Verfahren nicht mglich ist. Das Problem ist beim Test mit dem Stundenplan des Informatik Studiengangs des sechsten Semesters aufgetreten http://sund.de/steffen/plan/s_bai6.html. Der Fehler ist in Zeile 6 und Spalte 108 mit der Zeichenfolge type=text/css aufgetreten. Das Problem ist, dass keine Verarbeitung stattnden kann, da keine Anfhrungsstriche um den Wert vom type sind. Daher versucht HaXml den / zu interpretieren.
2 3
Seite 12
KAPITEL 3. VORBETRACHTUNG
3.2.4 xhtml
Die xhtml-Bibliothek verarbeitet den XHTML 1.0 Standard.4 Da die StundenplanSeite HTML 4.01 Transitional ist, kann diese Bibliothek nicht verwendet werden.
3.2.5 TagSoup
TagSoup ist eine Bibliothek zum Parsen von HTML-/XML-Datenstrukturen.5 Die TagSoup-Bibliothek kann die vorliegende HTML-Datenstruktur, durch den Toleranten Parser, fehlerfrei in eine Haskell-TagSoup-Datenstruktur transformieren. Der Aufbau dieser Datenstruktur ist im Listing 3.5 dargestellt.
1
[ TagOpen "HTML" [ ] , TagText " \ r \n " , TagOpen "BODY" [ ( "BGCOLOR" , "#FFFFFF" ) , ( " s t y l e " , " background image : u r l ( b i l d e r / l o g o . jpg ) ; backgroundattachment : f i x e d ; backgroundr e p e a t : nor e p e a t ; backgroundp o s i t i o n : c e n t e r 50% " ) ] "
4 5
Seite 13
KAPITEL 3. VORBETRACHTUNG
data T name s t r i n g = Open (Name name ) [ T name s t r i n g ] | C l o s e (Name name ) | Text s t r i n g | Comment String | S p e c i a l (Name name ) String | P r o c e s s i n g (Name name ) (T name s t r i n g ) | Warning String Listing 3.6: TagSoup Datentyp
In der nachfolgenden Tabelle 3.1 bezieht sich die Ausgabe auf die Datenstruktur, die am ende von dem Verfahren generiert wird und dabei in Bezug auf die Verwendbarkeit dieser. Die Felder in denen k.A. steht, bedeuten, dass entweder keine Informationen dazu gefunden wurden oder das frhere Kriterien dazu gefhrt haben, dass dieser Punkt nicht nher betrachtet wurde. Die Ziele, die die Verfahren erfllen sollten, waren: Verarbeiten der HTML-Struktur Vollstndige Transformation der HTML-Struktur Korrekte Transformation des ttribut-value Problems Verarbeiten mit geringem Aufwand des Ausgabe-Formats Aufgrund der Tabelle kann erkannt werden, dass das TagSoup Verfahren am geeignetsten ist, da es die gestellten Ziele erfllt. Verfahren blaze-html HaXml xhtml TagSoup HTML ja ja ja ja Transformation ja nein nein ja attribut=value Ausgabe-Format ja nein nein ja nein k.A. k.A. ja
Seite 14
KAPITEL 3. VORBETRACHTUNG
7 8 9
Seite 15
KAPITEL 3. VORBETRACHTUNG
Da die lexikalische Analyse einen Eingabetext nach bestimmten Textmustern abtastet, wird sie oft auch als Scanner bezeichnet. 10 Um eine Technik zum Entwerfen von Scannern zu entwicklen, ist es notwendig, das Muster genau zu denieren, das die Menge der Lexeme zu einem Symbol beschreibt. Eine gebruchliche Notation zum Spezizieren von Mustern sind regulre Ausdrcke. Regulre Ausdrcke beschreiben die jedem Muster entsprechende Menge von Zeichenketten (Strings) im Eingabetext. 11 Der Vorteil, der bei der Nutzung von regulren Ausdrcken mit dem Stundenplan im Vordergrund steht, ist, dass bei nderungen eine rasche Anpassung vorgenommen werden kann, da nur der regulre Ausdruck angepasst werden muss. Dieser ist einfach verstndlich im Gegensatz zu dem selbst entwickelten Zustandsautomaten. Somit ergibt sich eine bessere Wartbarkeit.12 Im Rahmen der Bachelorarbeit ist die Entscheidung zur Problemlsung auf die Eigenentwicklung eines Zustandsautomaten gefallen. Der Grund, der fr eine Eigenentwicklung des Zustandsautomaten spricht ist, dass er einfach umzusetzen ist und fr die momentane Verwendung der Einsatz ber regulre Ausdrcke im Vergleich dazu unverhltnismig wre. Des Weiteren ist ein auf das Problem angepasster Zustandsautomat ezienter als ein durch regulre Ausdrcke generierter. Da der Teil des Projektes, der sich mit der Transformation der HTML-Struktur beschftigt, nur als bergangslsung verwendet wird, bis ein weiterer Teil des Spirit-Projektes abgeschlossen wird, ist keine lange Laufzeit dieses Modules zu erwarten. Daher wird nicht erwartet, dass der Aufbau der HTML-Seite bis zum Start des Spirit Teilprojektes, das die Generierung des neuen Stundenplans bernimmt, verndert wird. Das wird dadurch untersttzt, dass die Generierung der Stundenplan-HTML-Datei statisch ist und voraussichtlich nicht verndert wird. Damit ist der Einsatz eines Zustandsautomaten gerechtfertigt.
10 11 12
Seite 16
17
dargestellt. Zeile 2 soll dem Leser nur exemplarisch verdeutlichen, welche Werte an den einzelnen Stellen zu erwarten sind und ist daher nicht in der prototypischen Implementierung enthalten.
1
Da nun eine Datenstruktur vorhanden ist, in der die Stundenplandaten gespeichert werden knnen, ohne ihren Zusammenhang zu verlieren, kann nun mit der Transformation begonnen werden.
Seite 18
Seite 19
Der Zustandsautomat zwei hat sechs Zustnde. Im Zustand searchTR wird fr eine Zustandsnderung in den Zustand SearchTD1 ein nendes TR-Tag erwartet. Des Weiteren wird im Zustand SearchTD1 fr eine Zustandsnderung in den darauf folgenden Zustand SearchText1TD ein TD-Tag erwartet. Ein schlieendes TR-Tag fhrt zum Ende dieses Zustands. Das bedeutet einen Wechsel in den Zustand searchTR. Im Zustand SearchText1TD fhrt ein nendes TABLE-Tag zum Wechsel in den readSlots Zustand. Ein schlieendes
Seite 20
TD-Tag in diesem Zustand fhrt zum Ende dieses Zustandes und zum Wechsel in den Zustand SearchTD1, da dies bedeutet, dass das Zeilenende erreicht ist. Im Zustand readSlots wird fr eine Zustandsnderung in den Zustand SearchSlotTD ein nendes TR-Tag erwartet. Bei einem schlieenden TABLE-Tag ndet eine Zustandsnderung in den SearchText1TD-Zustand statt. Im Zustand SearchSlotTD wird fr eine Zustandsnderung in den Zustand SearchSlotText ein nendes TDTag erwartet. Bei einem schlieenden TR-tag wird in den Zustand readSlots zurck gewechselt. Im Zustand SearchSlotText fhrt das Auftreten eines TagText-Tags zu einer Speicherung der darin enthaltenen Daten. Bei einem schlieenden TD-Tag wird ein Zustandswechsel in den Zustand SearchSlotTD ausgelst. Wenn der Zustandsautomat beendet wird, liefert er die Zwischenstruktur als Ergebnis. In den Anhngen A.1 und A.2 sind zur Verdeutlichung der Funktionsweise des Zustandsautomaten Zustandstabellen abgebildet.
Die vollstndige Implementierung bendet sich in der Quellcode-Datei src/HtmlToListV2.hs. Diese ist im Projekt-Verzeichnis auf CD oder online unter https://github.com/spirit-fhs/ timetable2db einzusehen.
Seite 21
{ hour
: : String
, minute : : String } data TimeSlot = TimeSlot { tstart , tend } data L o c a t i o n = Location { b u i l d i n g : : String , room : : String : : TimeStamp : : TimeStamp
Seite 22
10
11
12
13
14
15
16
17
, l e c t u r e r : : String } | EmptyLecture type TimeTable = [ Lecture ] Listing 4.2: Aufbau der internen Datenstruktur
18
19
20
Im Listing 4.2 ist in Zeile 20 die Denition fr den Stundenplan-Datentypen zu erkennen. Dieser stellt sich durch eine Liste von Lecture dar und wird als TimeTable bezeichnet. Der Zeile 19 kann entnommen werden, dass der Datentype Lecture auch den Wert EmptyLecture annehmen kann. Dieser Wert wird bentigt, da fr eine Weiterentwicklung ein Vergleich mit dem Lecture Datentype mglich sein muss. Ein Anwendungsbeispiel wre, wenn der RESTful-Service keinen Stundenplan zurckliefert.
[ ( " 08.15 09.45 " , [ ( " Montag " , [ ] ) ,( " Dienstag " , [ ] )
Seite 23
, ( " Mittwoch " , [ [ " " , " Uebung " , "SWEProg V3" , "PC2 " , " u " , " 1 " , " Braun " ] , [ " " , " Uebung " , "SWEProg V3" , "PC2 " , " g " , " 2 " , " Braun " ] ] ) , ( " Donnerstag " , [ [ " " , " V o r l e s u n g " , "SWEProg V3" , " F004 w " , " Braun " ] ] ) ,( " Freitag " , [ ] ) ] ) ] Listing 4.3: Ausschnitt aus der Zwischenstruktur
Da bei der Zerlegung einer Veranstaltung nicht gesagt werden kann, an welcher Stelle in der HTML-Struktur sich ein Element bendet, muss eine Zwischenstruktur eingefhrt werden. Im Listing 4.4 ist ein Beispiel dargestellt.
1
[ " " , " V o r l e s u n g " , "SWEProg V2" , " H0216 w " , " Recknagel " ] [ " " , " Uebung " , "DBS V1" , "WKST " , " g " , " 1 " , " K n o l l e " ] Listing 4.4: Grund fr eine Zwischenstruktur
In diesem Beispiel ist zu sehen, dass eine Gruppeneinteilung die Anzahl der Elemente in der Liste verndert. Es kann nicht davon ausgegangen werden, dass immer das selbe Format auftritt, sobald eine Vorlesung oder bung vorliegt. Das bedeutet, dass die Reihenfolge der Elemente, wie im Listing 4.5 exemplarisch fr eine Vorlesung zu sehen ist, nicht bei jeder Vorlesung oder bung gleich ist. Folgendes Problem muss bedacht werden: Vorlesungen knnen nicht nur wchentlich, sondern auch alle zwei Wochen stattnden. Die Darstellung einer solchen Vorlesung ist in Listing 4.5 abgebildet.
1
[ " " , " V o r l e s u n g " , "Komm V1/V2" , " H0002 " , " u " , " " , " Dimanski " ] Listing 4.5: Zwischenstruktur Vorlesung u
Des Weiteren kann in Listing 4.4 festgestellt werden, dass es unterschiedliche Darstellungsarten fr die Wocheneinteilung gibt. In Zeile 1 kann man erkennen, dass die Veranstaltung eine Vorlesung ist und dass diese wchentlich statt ndet. Es ist auerdem zu sehen, dass die Kennzeichnung, dass die Vorlesung wchentlich stattndet, bei der Rauminformation enthalten ist. In Zeile 2 wird dieser Sachverhalt anders dargestellt. Da die aufgezeigte bung alle zwei Wochen stattndet, ist die Information dafr, also g in einem eigenem Element hinterlegt und nicht wie in Zeile 1 bei der Raum Information enthalten. Das sind Grnde, warum sich der Autor der Bachelorarbeit gegen eine direkte Transformation der TagSoup-Datenstruktur
Seite 24
in die interne Datenstruktur entschieden hat. Der Vorteil ist, dass nun an einer zentralen Stelle im Programm eine Beschreibung gemacht werden kann. In dieser Beschreibung mssen alle Sonderflle der Elemente-Reihenfolge aufgenommen werden. Dieser Sachverhalt ist zugleich ein Nachteil, da er die Pege des Programms erhht, denn jeder mgliche Aufbau einer Veranstaltung muss an dieser Stelle eingetragen sein. Anderenfalls wird der Stundenplan nicht transformiert.
Seite 25
26
Abbildung 5.1: Zusammensetzung der erweiterten internen Datenstruktur. Quelle: Eigene Darstellung.
Dateien vor. In der einen sind alle Dozenten mit einer eindeutigen FhsID enthalten. Die Datenstruktur dieses Datenbestandes ist in JSON abgebildet und stammt aus einer nicht entlichen Quelle. Deshalb musste auf eine lokale Datei zurck gegriffen werden. Die zweite Datei beinhaltet die bisher bekannten Namenskombinationen der Dozenten, damit eine Zuordnung auch dann erstellt werden kann, wenn mehr als ein Dozent eine Veranstaltung hlt. Damit ist es nun mglich die vorhandenen Pseudonamen in existierende Namen zu berfhren und somit die FhsID zu jedem Dozenten zu bestimmen. Diese wird bentigt um die Stundenplan-Daten in die Datenbank einzufgen. In Abbildung 5.2 ist die Zusammenfhrung der verschiedenen Datenbestnde dargestellt.
Seite 27
Anhand dieser Datumsinformationen und der Information, dass die Veranstaltung in einer geraden oder ungeraden Woche stattndet, knnen alle Einzel-Termine fr die Veranstaltung generiert werden. Da eine weitere Bearbeitung des Teilprojektes fr diese Bachelorarbeit zu umfangreich wre, wird an diesem Punkt aufgehrt.
Seite 28
wird. Um den Zweck des Ablaufdatums zu verdeutlichen, dient das folgende Beispiel: Wenn eine Veranstaltung vom 01.03.2011 bis zum 30.06.2011 geplant ist, diese aber aus bestimmten Grnden am 20.05.2011 nicht mehr vom RESTful Service angeboten werden soll, dann wird das Ablaufdatum auf den 20.05.2011 gesetzt. Wenn nun die Stundenplan-Daten am 22.05.2011 vom RESTful Service angefordert werden, dann wird diese Veranstaltung nicht in der Ergebnismenge enthalten sein.
Seite 29
Seite 30
Header gesetzt werden. Diese Option ist Content-Type mit dem Wert application/json. Hierbei muss des Weiteren beachtet werden, dass als Methode PUT verwendet wird.2
Vgl. Ldicke
Seite 31
6 Resmee
Zusammenfassend lsst sich sagen, dass es einen Wendepunkt bei der Erarbeitung der Bachelorarbeit gab. Dieser betrit das blaze-html-Projekt. Bei der Planung der Bachelorarbeit wurde blaze-html als Verfahren zur Transformation der HTMLDaten favorisiert. Im Laufe der Bachelorarbeit stellte sich heraus, dass die Verwendung dieses Verfahrens zu aufwendig ist. Dadurch musste nach einem anderen Verfahren gesucht werden. Um zuknftig ein eektives und exibles Werkzeug zu schaen, knnte dieses Projekt durch die angesprochene lexikalische Analyse erweitert werden. Dann knnte das Projekt so erweitert werden, dass auf Vernderungen der HTML-Seiten besser reagiert werden kann als bei der Nutzung eines Zustandsautomaten. Die Ziele, die diese Bachelorarbeit verfolgt hat, sind: die Daten aus dem alten Stundenplanungstool exportieren eine Schnittstelle fr das alte und neue Stundenplanungstool anbieten die Stundenplan-Daten aufbereiten und exportieren Der Export der Stundenplan-Daten musste auf den Export der JSON-Daten eingeschrnkt werden. Grund dafr ist, dass der RESTful Service nicht im bentigten Umfang zur Verfgung stand. Trotzdem wurde eine prototypische Implementierung des RESTful Service zu Testzwecken durchgefhrt. Die Umsetzung betrit den lesenden Zugri auf den RESTful Service. Das Ziel, das die Schnittstelle fr das neue Stundenplanungstool umsetzen sollte, konnte nicht vollstndig umgesetzt werden. Grund dafr ist, dass die Daten die von dem neuen Stundenplanungstool geliefert werden, noch nicht deniert sind. Deswegen ist die Entscheidung auf die intere Datenstruktur als Schnittstelle gefallen. Das bedeutet aber auch, dass nicht mehr Informationen eingepegt werden knnen als vorher. An dieser Stelle muss in einer spteren Arbeit angesetzt werden. Alle in der Arbeit erreichten Programmierergebnisse, sind in einem ffentlichen GIT Repository unter https://github.com/spirit-fhs/timetable2db
32
KAPITEL 6. RESMEE
einzusehen. Diese beinhalten unter anderem die prototypische Implementierung des Migrate Programms.
Seite 33
A Anhang
A.1 Implementierung des Zustandsautomaten
1
, Integer ) , ( Integer , String ) ) ] , 0 ) , (1 , " " ) ) , 1 ) , (2 , " " ) ) , 1 ) , (3 , " " ) ) , 1 ) , (0 , " " ) )
, ( ( "TEXT! " , 3 ) , ( 3 , "PUSH" ) ) , ( ( "TABLE" , 3 ) , ( 4 , " " ) ) , ( ( " /TD" , 3 ) , (1 , " " ) )
10
11
, ( ( " /TABLE" , 4 ) , ( 3 , " " ) ) , ( ( "TR" , ( ( "TD" , ( ( " /TR" , 4 ) , (5 , " " ) ) , 5 ) , (6 , " " ) ) , 5 ) , (4 , " " ) )
12
13
14
15
, ( ( "TEXT! " , 6 ) , ( 6 , "PUSH" ) ) , ( ( "IMAG! " , 6 ) , ( 6 , "PUSH" ) ) , ( ( " /TD" ] intKA : : Tag [ Char ] > ( String , String ) intKA i n p u t = case i n p u t of TagOpen TagOpen TagOpen TagOpen "TR" "TD" "TH" _ > ( "TR" , [ ] ) _ > ( "TD" , [ ] ) _ > ( "TH" , [ ] ) , 6 ) , (5 , " " ) )
16
17
18
19
20
21
22
23
24
25
34
26
27
TagOpen
" img " (_ : ( " s r c " , " b i l d e r / monitor . g i f " ) : _) > ( "IMAG! " , " Uebung " )
28
29
TagOpen
" img " (_ : ( " s r c " , " b i l d e r / buch . g i f " ) > ( "IMAG! " , " V o r l e s u n g " )
: _)
30
31
32
TagClose t a g TagText _
33
34
35
c h e c k S t a t e : : [ Tag [ Char ] ] > Integer > [ ( ( String , Integer ) , ( Integer , String ) ) ] > [ String ] > [ [ String ] ] > [ [ [ String ] ] ] > [ [ [ String ] ] ] checkState [ ] _ _ _ _ stackStockFul = stackStockFul checkState ( input : inputs ) s t a t e stateTable stackStock1 stackStock2 stackStockFul =
36
37
38
39
40
41
42
43
44
45
46
47
else case t a g of " /TD" " /TH" " /TR" > closeTDTH > closeTDTH >
48
49
50
51
52
if ( state < 4 ) then closeTR else anythingElse _ where ( tag , v a l u e ) = intKA i n p u t > a n y t h i n g E l s e
53
54
55
56
57
35
58
folgZ stateTable
= f i n d F o l l o w S t a t e ( tag , s t a t e ) v a l u e
59
closeTDTH
= c h e c k S t a t e i n p u t s ( head f o l g Z ) s t a t e T a b l e [ ]
( ( reverse s t a c k S t o c k 1 ) : s t a c k S t o c k 2 ) s t a c k S t o c k F u l
60
closeTR
= c h e c k S t a t e i n p u t s ( head f o l g Z ) s t a t e T a b l e [ ]
[ ] ( ( reverse s t a c k S t o c k 2 ) : s t a c k S t o c k F u l )
61
62
s t a c k A c t i o n : : [ String ] > ( String , Integer ) > String > [ ( ( String , Integer ) , ( Integer , String ) ) ] > [ String ] stackAction stackStock _ _ [ ] = stackStock s t a c k A c t i o n s t a c k S t o c k i n p u t F o l l o w v a l u e ( ( s t a t e I n f o , (_ , action ) ) : rest ) =
63
64
65
66
67
i f ( i n p u t F o l l o w == s t a t e I n f o ) then doAktion s t a c k S t o c k v a l u e a c t i o n else stackAction stackStock inputFollow value r e s t doAktion : : [ String ] > String > String > [ String ]
68
69
70
71
72
73
74
75
76
77
| Return t h e s t a c k when no a c t i o n a v a i l a b l e _ > s t a c k S t o c k f i n d F o l l o w S t a t e : : ( String , Integer ) > String > [ ( ( String , Integer ) , ( Integer , String ) ) ] > [ Integer ]
78
79
80
findFollowState _ _ [ ] = [ ] f i n d F o l l o w S t a t e i n p u t v a l u e ( ( s t a t e I n f o , ( f o l l o w S t a t e V a r , _) ) : rest ) =
81
82
i f ( i n p u t == s t a t e I n f o ) then [ followStateVar ]
83
84
36
85
else findFollowState input value r e s t Listing A.1: Implementierung des Tabellen gesteuerten Zustandsautomaten
86
37
Zustand
TEXT1TD /TABLE1
SearchTR
SearchTH1/TD1 1
SearchText1TH
SearchText1TD
ACCEPT
Tabelle A.1: Zustandstabelle linker Teil
ZName
Zustand
/TD1 TABLE2
SearchText1TD
ReadSlots
SearchSlotTD
SearchSlotText
PUSH/6 PUSH/6
Glossar
Krzel JSON Beschreibung JavaScript Object Notation ist ein Datenformat
Parser
Ist ein Computerprogramm fr die Zerlegung und Umwandlung einer beliebigen Eingabe in ein brauchbares Format
Regulre Ausdrcke
Rekursion REST
Slot
Ein Slot ist ein Bereich, in dem mehrere Veranstaltungen zu einem bestimmten Tag und Zeitpunkt dargestellt werden
SSL
TLS Transitional
39
Abbildungsverzeichnis
1.1 1.2 Projektbersicht von Spirit. Quelle: Abbildung von Florian Schuhmann. Stundenplan BaI6 Ausschnitt. Quelle: http://sund.de/steffen/plan/ s_bai6.html. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 4.2 4.3 5.1 4 2
Transformationsschritte. Quelle: Eigene Darstellung. . . . . . . . . . . 19 Zustnde fr den Tabellen Kopf. Quelle: Eigene Darstellung. . . . . . 20 Zustnde fr den Tabellen Krper. Quelle: Eigene Darstellung. . . . . 20 Zusammensetzung der erweiterten internen Datenstruktur. Quelle: Eigene Darstellung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2 5.3
. . . . . . . . . 28
40
Tabellenverzeichnis
3.1 Tabelle zur Verfahrensauswertung . . . . . . . . . . . . . . . . . . . . 14
41
Listings
3.1 3.2 3.3 3.4 3.5 3.6 4.1 4.2 4.3 4.4 4.5 5.1 Tabellenaufbau des alten Stundenplans . . . . . . . . . . . . . . . . . Unterschied wchentlich oder alle zwei Wochen . . . . . . . . . . . . . 8 9
Unterschied bung/Vorlesung . . . . . . . . . . . . . . . . . . . . . . 10 Darstellungsform des HTML Codes . . . . . . . . . . . . . . . . . . . 11 TagSoup Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 TagSoup Datentyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Aufbau der Zwischenstruktur . . . . . . . . . . . . . . . . . . . . . . 18 Aufbau der internen Datenstruktur . . . . . . . . . . . . . . . . . . . 22 Ausschnitt aus der Zwischenstruktur . . . . . . . . . . . . . . . . . . 23 Grund fr eine Zwischenstruktur . . . . . . . . . . . . . . . . . . . . 24 Zwischenstruktur Vorlesung u . . . . . . . . . . . . . . . . . . . . . . 24 Stundenplan Beispiel mit Zusatzinformationen . . . . . . . . . . . . . 28
42
Literatur
Braun, Prof. Dr. Oliver. PADS. 2011. url: http://pads.fh-schmalkalden. de/spirit.html (besucht am 21. 08. 2011). Bringert, Bjorn. xhtml. 2011. url: http://hackage.haskell.org/package/ xhtml (besucht am 21. 07. 2011). Herold, Helmut. UNIX und seine Werkzeuge lex und yacc. Mnchen, Paris: Addison-Wesley, 1992. Lengauer, Prof. Christian. Funktionale Programmierung(Uni-Passau). 2011. url: http://www.infosun.fim.uni- passau.de/cl/lehre/funcprog05/ wasistfp.html (besucht am 01. 09. 2011). Ldicke, Benjamin. Evaluierung und Konguration von einem NoSQL- und relationalen DBMS sowie die Konzeption und Entwicklung eines Datenbankservice auf Basis von RESTful Web Services in Scala. zur Zeit in Arbeit, Abgabe voraussichtlich September 2011. Magisterarb. Blechhammer 9, 98574 Schmalkalden: Fachhochschule Schmalkalden, 2011. Mitchell, Neil. tagsoup. 2011. url: http://hackage.haskell.org/package/ tagsoup (besucht am 21. 07. 2011). tagsoupTag. 2011. url: http://hackage.haskell.org/packages/archive/ tagsoup-ht/0.3/doc/html/Text-HTML-TagSoup-HT-Tag.html (besucht am 11. 08. 2011). Schmitt, Franz Josef. Praxis des Compilerbaus. Mnchen Wien: Carl Hanser Verlag Mnchen Wien, 1992.
43
Van der Jeugt, Jasper und Simon Meier. blaze-html. 2011. url: http:// hackage.haskell.org/package/blaze-html (besucht am 21. 07. 2011). Verfasser, ohne. Funktionale Programmierung(Wikipedia). 2011. url: http : / / de . wikipedia . org / wiki / Funktionale _ Programmierung (besucht am 31. 08. 2011). HTTPS. 2011. url: http://en.wikipedia.org/wiki/HTTPS (besucht am 09. 08. 2011). Lexikalische Analyse. 2011. url: http : / / de . wikipedia . org / wiki / Compiler#Lexikalische_Analyse (besucht am 18. 07. 2011). Parsec. 2011. url: http://www.haskell.org/haskellwiki/Parsec (besucht am 18. 07. 2011). Parser. 2011. url: http://de.wikipedia.org/wiki/Parser (besucht am 22. 08. 2011). REST. 2011. url: http://de.wikipedia.org/wiki/Representational_ State_Transfer (besucht am 13. 08. 2011). W3C. W3CValidator. 2011. url: http : / / validator . w3 . org (besucht am 21. 07. 2011). Wallace, Malcolm. HaXml. 2011. url: http://projects.haskell.org/HaXml/ (besucht am 21. 07. 2011).
44
Ehrenwrtliche Erklrung
Hiermit erklre ich an Eides Statt, dass ich die vorliegende Bachelorarbeit selbstndig und ohne Benutzung anderer, als der angegebenen Hilfsmittel, angefertigt habe. Die aus fremden Quellen direkt oder indirekt bernommenen Gedanken sind als solche kenntlich gemacht. Diese Bachelorarbeit hat in gleicher oder hnlicher Form keiner anderen Prfungsbehrde vorgelegen.
45