Tool zur Softwarekomponentensuche
Transcription
Tool zur Softwarekomponentensuche
Leopold-Franzens-Universität Innsbruck Institut für Informatik Datenbanken und Informationssysteme Tool zur Softwarekomponentensuche Bachelor-Arbeit Georg Bader betreut von Dipl.-Ing. Dominic Pacher Univ.Prof. Dr.rer.nat Günther Specht Innsbruck, 9. November 2010 Zusammenfassung Im Internet gibt es viele strukturähnliche Seiten mit interessanten Metainformationen. Informationen einer bestimmten Informationsquelle können mit Wrappern extrahiert werden. Diese lassen sich von automatischen Wrappergeneratoren auf Basis einer Trainingsphase generieren. Ein Prototyp eines automatischen Wrappergenerators mit Spezialisierung auf die Extraktion von Opensourceprojekten auf Sourcecodeportalen wurde im Zuge dieser Arbeit implementiert. Hierbei wurde das Webcrawlerframework namens Websphinx verwendet, um Webseiten zu crawlen, sowie die Versionierungstools SVN, CVS und Git um Downloadunterstützung für die entsprechenden Repositories zu bieten. Abstract On the Internet there are many pages with interesting meta informations. Information from one single source can be extracted by Wrappers. They can be generated by automatic Wrapper generators based on a phase of training. A prototype of an automatic Wrapper generator, which is specialised on the extraction of open source projects found on source code portals, has been implemented in the course of this work. To do so, the webcrawler framework named Websphinx was used for crawling web pages and the version control systems SVN, CVS and Git were used for giving the possibility of downloading repositories. Inhaltsverzeichnis 1 Einführung und Motivation 1.1 Sourcecodeportale . . . . 1.1.1 Sourceforge . . . . 1.1.2 Java.net . . . . . . 1.2 Aufbau Arbeit . . . . . . . . . . . . . . . . . . . . . . 2 Related Work 2.1 Definition Informationsextraktion 2.2 Wrapper . . . . . . . . . . . . . . 2.3 Wrappergeneratoren . . . . . . . 2.4 Lixto . . . . . . . . . . . . . . . . 2.5 GATE . . . . . . . . . . . . . . . 3 Technologien 3.1 Webcrawler . . . . . . . . . 3.2 Websphinx . . . . . . . . . 3.2.1 Architektur . . . . . 3.2.2 Bugfixes . . . . . . . 3.2.3 Erweiterungen . . . 3.3 Versionsverwaltungssysteme 3.3.1 CVS . . . . . . . . . 3.3.2 SVN . . . . . . . . . 3.3.3 Git . . . . . . . . . . 3.4 Standard Widget Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 3 . . . . . 5 5 5 5 6 7 . . . . . . . . . . 9 9 10 10 12 13 14 14 15 15 16 4 Spezifikation 19 4.1 Use Case Digramm . . . . . . . . . . . . . . . . . . . . . . 20 4.2 Fachliches Klassendiagramm . . . . . . . . . . . . . . . . . 21 4.3 Oberflächenprototyp . . . . . . . . . . . . . . . . . . . . . 22 5 Implementierung 23 5.1 Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5.2 Kontrollinstanz . . . . . . . . . . . . . . . . . . . . . . . . 25 5.3 Grafische Benutzeroberfläche . . . . . . . . . . . . . . . . 27 III INHALTSVERZEICHNIS 5.4 5.5 5.6 5.7 . . . . 27 33 34 35 6 Handbuch 6.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Beispiel Sourceforge . . . . . . . . . . . . . . . . . . . . . 6.3 Beispiel java.net . . . . . . . . . . . . . . . . . . . . . . . 37 40 40 42 7 Schlusswort und Ausblick 45 Literaturverzeichnis 48 IV Datenverarbeitung WebCrawler . . . . Download . . . . . Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Georg Bader Kapitel 1 Einführung und Motivation Oft bestehen Webseiten aus vielen Teilseiten mit gleicher Struktur. Diese zeichnen sich darin aus, dass sich an allen Seiten an gleichen Positionen genau die gleiche Art von Information befindet. Auch Sourcecodeportale wie zum Beispiel Sourceforge und Java.net verwenden strukturgleiche Teilseiten um Opensourceprojekte zu hosten. Im speziellen Fall befindet sich auf verschiedenen Projektseiten eines Sourcecodeportals der Titel, der Autor, der Downloadlink, die Beschreibung und sonstige Metadaten des jeweiligen Projekts an der selben Stelle innerhalb eines HTML-Dokuments. Diese Tatsache ermöglicht es, Programme zu entwickeln, welche automatisiert gewünschte Informationen extrahieren können. Wird dieser Ansatz um eine Instanz erweitert, welche diese Projektseiten aufspürt, so können automatisiert sämtliche Projekte eines Portals erfasst werden. Durch einmalige Zuordnung von Semantik zu den einzelnen Elementen ist es möglich, diese strukturiert zu speichern. Wird ein solches Programm noch um die Möglichkeit des automatisierten Downloads von Repositories erweitert, so kann sämtlicher Quellcode aller Projekte eines Sourcecodeportals inklusive der zugehörigen Metadaten automatisiert heruntergeladen werden. Im Zuge dieser Arbeit wurde ein Prototyp eines solches Programms entwickelt, welcher es ermöglicht, Opensourceprojekte auf Sourcecodeportalen im Internet ausfindig zu machen, dessen Metadaten zu erfassen sowie Unterstüzung für das automatisierte Downloaden von Repositories bietet. 1.1 Sourcecodeportale In diesem Kapitel sollen einige wichtige Vertreter jener Webseiten aufgezeigt werden, welche Opensourcesoftwareprojekte in strukturgleichen Teilseiten präsentieren und somit dem Prototypen als Ziel dienen können. 1 KAPITEL 1. EINFÜHRUNG UND MOTIVATION 1.1.1 Sourceforge Die Webseite Sourceforge1 ist ein Hoster für Opensourcesoftwareprojekte. Eigenen Angaben zu Folge ist sie die größte Entwicklungswebseite der Welt mit 230.000 Software Projekten (Februar 2009) und über 2 Millionen registrierten Benutzern. Entwicklern wird damit eine Plattform geboten, ihre Software-Repositories zu verwalten und zu veröffentlichen. Betrieben wird die Webseite Sourceforge von der kalifornischen Firma Geeknet, Inc. Die Seite kann mit dem Prototypen des Repositoryextraktionstools durchforstet werden. Dieser Vorgang wird beispielhaft in Kapitel 6.2 beschrieben. Die Repositories verwenden die Versionierungstools CVS, SVN oder Git, welche durch den Prototypen unterstützt werden. Die Seite hostet viele große Opensourcesoftwareprojekte wie: • Gate [Soue] • eMule [Soud] • Azureus / Vuze [Soub] • 7-Zip [Soua] • BitTorrent [Souc] 1.1.2 Java.net Ebenso wie das Portal Sourceforge stellt auch Java.net2 seinen Anwendern eine Umgebung zur Verfügung, um Software-Projekte auf deren Servern weiter zu entwickeln und diese der Öffentlichkeit zugänglich zu machen. Sämtliche Projekte beschäftigen sich mit den Java Technologien mit dem Ziel diese weiterzuentwickeln. Die Community besteht aus industriellen Organisationen, Universitäten und individuellen Entwicklern. Der Prototyp des Repositoryextraktionstools wurde mit dem Portal Java.net getestet und kann verwendet werden um Software-Projekte herunterzuladen. Eine Anleitung speziell zu Java.net findet sich in Kapitel 6.3. Einige bekannte Projekte, die auf Java.net gehostet werden, sind: • glassfish [Java] • jdk [Javb] • jini [Javc] 1 2 2 http://sourceforge.net/ http://www.java.net/ Georg Bader KAPITEL 1. EINFÜHRUNG UND MOTIVATION 1.2 Aufbau Arbeit Die Arbeit ist wie folgt strukturiert. Im nachfolgenden Kapitel 2 wird auf bereits vorhandene artverwandte Arbeiten eingegangen und die Terminologie erklärt. Des weiteren werden in Kapitel 3 die verwendeten Technologien kurz beschrieben. Insbesondere wird auf das Webcrawlerframework namens WebSphinx eingegangen. Anschließend wird in Kapitel 4 eine Spezifikation des Programms gegeben. Kapitel 5 beschreibt die Implementierung des Prototypen, welcher im Zug dieser Arbeit erstellt wurde. Eingegangen wird auf die Architektur anhand von Diagrammen und auf die Aufgabenbereiche der einzelnen Pakete und Klassen. Hinweise zur Installation des Prototypen sowie Hinweise zum erfolgreichen Durchforsten beliebter Sourcecodeportale finden sich im Handbuch (Kapitel 6). Abschließend wird in Kapitel 7 eine Zusammenfassung mit anschließendem Ausblick gegeben. Georg Bader 3 Kapitel 2 Related Work 2.1 Definition Informationsextraktion Unter Informationsextraktion versteht man ein automatisiertes Verfahren zur Filterung von relevanten Informationen aus unstrukturierten oder semistrukturierten Datenquellen (wie zum Beispiel HTML-Dokumenten), um strukturiertes Wissen daraus zu extrahieren [Voß06]. 2.2 Wrapper Ein Wrapper ist ein Programm, welches von einer bestimmten Datenquelle relevante Information extrahiert und diese in einer geeigneten Form ausgibt [Eik99]. Die Extraktion erfolgt nach bestimmten Mustern. Zum Beispiel kann ein Wrapper auf Basis von Präfixen und Suffixen definiert werden, um den Bereich dazwischen zu extrahieren. Die Fertigkeiten von Wrappern umfassen die Anfrage der Datenquelle (Herunterladen der Webseite), die Extraktion der gewünschten Information und die Generierung von Antwortobjekten für die Weiterverarbeitung durch andere Anwendungen [GRVB98]. Allerdings ist es hierzu notwendig, dass die URL einer Datenquelle, welche die Antwort enthält, dem Wrapper übergeben wird. Diese Aufgabe kann von einem anderen geeigneten Programm erledigt werden, wie zum Beispiel von einem Crawler (Kapitel 3.1). 2.3 Wrappergeneratoren Da ein Wrapper nur für eine bestimmte Informationsquelle verwendet werden kann, und diese sich schnell ändern kann, besonders wenn es sich dabei um eine Webseite handelt, besteht großer Bedarf an einer automatisierten Generierung von Wrappern. Diese Aufgabe übernehmen so 5 KAPITEL 2. RELATED WORK genannte Wrappergeneratoren. Unterschieden wird zwischen drei verschiedenen Arten der Wrappererzeugung. manuell Die Programmierung wird von Hand vorgenommen. Diese Methode ist sehr zeitaufwendig sowie fehleranfällig. Auf Grund der raschen Weiterentwicklung von Webseiten besteht erhöhtes Risiko für einen Funktionsausfall des Wrappers wegen statischer Regeln im Quellcode. Es entstehen erhebliche Wartungskosten. semi-automatisch Es kommen Wrappergeneratoren zum Einsatz. Diese ersparen dem Benutzer die Programmierarbeit, jedoch wird Expertenwissen zum jeweiligen Gebiet der Extraktion benötigt. Für jede Datenquelle müssen separat Regeln definiert werden nach welchen Informationen gefiltert werden. Diese Methode ist weniger fehleranfällig als das direkte Programmieren, jedoch abhängig von Flexibilität und Funktionsumfang des Wrappergenerators. automatisch Der Benutzer muss dem Wrappergenerator in einer Trainingsphase relevante Informationen deklarieren. Die Möglichkeiten der Auswahl dieser Daten variieren mit der Qualität des Wrappergenerators. Diese reichen von einer Baumansicht der HTML-Seite, in welcher einzelne Blätter ausgewählt werden können, bis zu einer komplett grafischen Präsentation der Datenquelle mit visueller Markierungsunterstützung. Es kommen teilweise einfache bis hoch komplexe Lernalgorithmen zum Einsatz um Informationen klassifizieren zu können [KT02]. 2.4 Lixto Ein Vertreter aus der Familie der Wrappergeneratoren ist Lixto. Es handelt sich hierbei um ein kommerzielles Tool, welches speziell Unternehmen, welche automatisiert und regelmäßig relevante Daten aus dem Internet kostensparend beziehen wollen, anspricht. Lixto ist ein voll visueller Wrappergenerator, das heißt der Benutzer muss sich nicht mit HTML-Code oder Ähnlichem befassen, um einen Extraktionsvorgang zu starten [BFG01]. Die Architektur wird in Abbildung 2.1 beschrieben. Der Interactive Pattern Builder stellt die grafische Oberfläche zur Verfügung. Dort kann der Benutzer die gewünschten Extraktionsmuster und einen Basisalgorithmus für die Erstellung des eigentlichen Extraktionsprogramms, genannt Elog Wrapper spezifizieren. Elog selbst ist eine deklarative Extraktionssprache, welche eine ähnliche Logik Syntax und Semantik hat wie die Datenbankprogrammiersprache namens Datalog. Der Extractor ist der Interpreter für das Elogprogramm, welches die eigentliche Extraktion durchführt. Dieser benötigt als Input das generierte Elogprogramm 6 Georg Bader KAPITEL 2. RELATED WORK Abbildung 2.1: Lixto Architektur [BFG01] und eine HTML-Seite, auf welcher die Extraktion stattfinden soll. Als Output wird eine pattern instance base, eine Datenstruktur, welche die extrahierten Informationen hierarchisch geordnet enthält, generiert. Der XML-Generator bietet dem Benutzer die Möglichkeit zu bestimmen, wie die gefilterten Informationen zugeordnet werden sollen. Auf Basis dieses Mappings wird als Ausgabe eine XML-Datei erstellt. 2.5 GATE Die Programmfamilie mit dem Titel General Architecture for Text Engineering, kurz GATE, ermöglicht die Verarbeitung natürlicher Sprache inklusive Informationsextraktion für viele Sprachen [BTMC04]. Die Entwicklung begann 1995 durch die Universität von Sheffield. Heute wird GATE von einer weltweiten Community bestehend aus Wissenschaftlern, Unternehmen, Lehrenden und Studenten betreut. Der Kern von GATE wird im Rahmen eines Opensourceprojekts entwickelt und ist auf Sourceforge verfügbar. Die gesamte GATE-Familie besteht aus den folgenden Programmen. GATE Developer: eine integrierte Entwicklungsumgebung zum Erstellen und Bearbeiten von Softwarekomponenten, mit welchen die Verarbeitung von menschlicher Sprache kontrolliert wird GATE Embedded: eine Objektbibliothek optimiert für die Einbettung der Funktionalität von GATE Developer in eigene Applikationen Georg Bader 7 KAPITEL 2. RELATED WORK GATE Teamware: eine Webapplikation zum gemeinschaftlichen Erstellen von Textanmerkungen GATE Cloud: eine parallele und verteilte Verarbeitungseinheit, welche GATE Embedded mit einer stark optimierten Serviceinfrastruktur verbindet 8 Georg Bader Kapitel 3 Technologien 3.1 Webcrawler Diese Programme sind auch bekannt unter den Begriffen Spider oder Searchbot. Es handelt sich hierbei um Anwendungen, welche das World Wide Web Seite um Seite durchforsten. Eingesetzt werden diese etwa von Suchmaschinen, um besuchte Seiten einer Indizierung zu unterziehen. Die Arbeitsweise eines Webcrawlers lässt sich in folgende Schritte einteilen [Cot04]: 1. Ein Link wird aus einer Liste ausgewählt. 2. Wenn dieser noch nicht besucht wurde, dann wird das Ziel heruntergeladen. 3. Handelt es sich dabei um eine HTML-Seite, werden alle weiterführenden Links der Liste hinzugefügt. 4. Wiederholen der Schritte 1 bis 3 bis keine unbesuchten Links mehr in der Liste vorhanden sind. Abbildung 3.1: WebCrawler Architektur [Cot04] 9 KAPITEL 3. TECHNOLOGIEN Die Basis Architektur eines Crawlers wird in Abbildung 3.1 illustriert. Der Fetcher lädt Dateien aus dem World Wide Web herunter. Welche Seite geladen werden soll, kontrolliert der Controller mittels Weiterleitung eines Links aus dem Workload. Eine geladene Seite wird an den Link extractor überreicht, welcher Hyperlinks aufspürt und diese dem Workload hinzufügt. Somit ist gewährleistet, dass in den folgenden Schritten die Seiten, welche die Ziele der Links darstellen ebenfalls gecrawlt werden. Anschließend wird die Seite dem Summarizer übergeben, um diese je nach Aufgabe des Crawlers zu verarbeiten. Die erhaltenen Ergebnisse werden entsprechend im Information store gespeichert. Die Unterscheidung, ob es sich bei einem Crawler um einen einfachen oder fortgeschrittenen handelt, ist abhängig von der Leistungsfähigkeit des Link extractors. Beherrscht dieser lediglich die Extraktion von Links aus HTML-Seiten, spricht man von einem einfachen Crawler. Kann dieser jedoch auch aus Dateien mit anderen Formaten wie txt, doc, zip, oder pdf Links erkennen, handelt es sich um einen fortgeschrittenem Crawler [NH02, CGM02]. 3.2 Websphinx WebSphinx (Website-Specific Processors for HTML INformation eXtraction) ist ein Webcrawlerframework für die Entwicklung von Javaprogrammen. Es verfügt über eine grafische Oberfläche, genannt crawler workbench, welche die Personalisierung, Ausführung und Visualisierung von Crawlern unterstützt. Einfache Crawler lassen sich damit ohne Programmierarbeit in kurzer Zeit spezifizieren und ausführen. Das Framework dient dem Prototypen, welcher im Zuge dieser Arbeit erstellt wurde, als Basis eines Crawlers. Im nächsten Kapitel wird auf die Architektur von WebSphinx sowie auf die zahlreichen Erweiterungen und Bugfixes eingegangen. 3.2.1 Architektur WebSphinx betrachtet das Internet als einen gerichteten Grafen bestehend aus Seiten und Links. Diese werden in den Objekten Page und Link abgebildet. Ein Page-Objekt repräsentiert eine geparste Webseite und verfügt über Methoden, um zum Beispiel die URL, den Titel, oder den Parsetree der Seite zurückzugeben. Des weiteren findet sich unter den Attributen eine Sammlung von Link-Objekten, welche auf dieser Seite als weiterführende Hyperlinks entdeckt wurden. Ein LinkObjekt beschreibt nicht nur das Ziel, eine URL, sondern auch ein HTMLElement auf der Seite, auf welcher es gefunden wurde. Der Parsetree einer Seite setzt sich aus einer Vielzahl von HTML-Elementen zusammen, welche in Element-Objekten abgebildet werden. Elemente bestehen 10 Georg Bader KAPITEL 3. TECHNOLOGIEN Abbildung 3.2: Vererbung Region aus je einem Start- und Endtag. Diese wiederum werden mit Hilfe von Tag-Objekten realisiert. Ein HTML-Dokument wird abgebildet in einem Page-Objekt. Dieses enthält eine Referenz auf das Root-Element des Parsetrees. Der Parsetree beseht aus einem Baum von ElementObjekten. Jedes Element verfügt über eine Referenz auf seinen Vorfahren im Baum (parent), seinem ersten Nachfahren (child), sowie zu seinem ersten Geschwisterknoten (sibling). Abbildung 3.3 zeigt die Assoziationen zwischen den Klassen Page, Element, Tag und Text. Alle diese Klassen erben von der Klasse Region. Die Klasse Link ist eine Spezialisierung der Klasse Element. Die Vererbungsstruktur wird verdeutlicht durch Abbildung 3.2. Die Klasse Region implementiert eine gemeinsame Basis aller Bestandteile einer Webseite. Jede Region verfügt über zwei Integer-Variablen, welche die Start- und Endposition innerhalb des Quelltextes seines zugehörigen Page-Objektes anzeigt. Weiters werden Methoden zur Verfügung gestellt, wie zum Beispiel toText():String. Diese Methode ruft auf das zugehörige Page-Objekt die Funktion substringText(start, end):String auf. Ein Page-Objekt verfügt über eine Sammlung aller auf der Seite vorkommenden Bestandteile, also Objekte der Klassen Element, Link, Tag, Text und Region. Die Klasse Text wird als Container für einzelne Wörter (keine Tags), separiert durch Leerzeichen, verwendet. Die Methode substring Text(start, end):String returniert einen String bestehend aus den Text-Objekten, welche sich innerhalb der Grenzen start und end befinden. Um auf den Parsetree der Seiten zugreifen zu können, müssen diese zuerst heruntergeladen werden. Diesen Vorgang steuert die Klasse Crawler. Ein Crawler-Objekt verfügt über mehrere Threads, welche sich um das Herunterladen der Webseiten kümmern. Diese entnehmen LinkObjekte aus einer Prioritäten-Warteschlange und generieren aus dem empfangenen Quelltext mit Hilfe der Klasse HTMLParser Page-Objekte. Die entstandenen Page-Objekte werden nacheinander den Methoden classify(Page) eines jeden registrierten Classifiers übergeben. Georg Bader 11 KAPITEL 3. TECHNOLOGIEN Abbildung 3.3: Page, Element, Tag, Text Assoziation Diese versehen die auf den Seiten enthaltenen Links mit Markierungen. Auf Basis dieser Markierungen werden die Links in die PrioritätenWarteschlange eingeordnet oder verworfen. Der Crawlvorgang wird beendet, sobald die Warteschlange abgearbeitet wurde oder durch eine entsprechende Interaktion des Benutzers. Für den Prototypen des Repositoryextraktionsprogramms stellt der Crawlvorgang das Kernstück der Suche dar. Umso wichtiger ist es daher, sich auf das korrekte Arbeiten des Crawlers verlassen zu können. Leider war dies auf Grund der raschen Weiterentwicklung des World Wide Webs und des beträchtlichen Alters der WebSphinx-Routinen nicht ohne programmiertechnische Erweiterungen möglich. 3.2.2 Bugfixes In diesem Kapitel werden einige der benötigten Bugfixes und Erweiterungen der Routinen von WebSphinx aufgezeigt. Auf Grund der verschiedenen Methoden der Anfrage beziehungsweise des Parsens einer Webseite durch den SWT-Browser und den Webcrawler entstehen zwei verschiedene Page-Objekte. Für die weitere Behandlung müssen diese jedoch auf eine gemeinsame Basis gebracht werden. Hierfür wurde ein Verfahren entwickelt, welches die Textbausteine einer Webseite vergleicht und für diese ein Mapping findet, welches jedem Text-Element des einen Page-Objektes ein Text-Element des anderen Page-Objektes zuordnet. Für die Umsetzung dieses Algorithmus werden die Methoden toText():String aller Objekte des Parsetrees benötigt. Probleme traten hierbei bei Link-Objekten auf, da diese die Implementierung der Methode toText():String der Klasse Region überschreiben, um ausschließlich den Anchortext des Links zurückzugeben. Bei der Methode toTags():String ist den Entwicklern von WebSphinx folgender Fehler unterlaufen: public String toTags () { return source.substringText (start, end); 12 Georg Bader KAPITEL 3. TECHNOLOGIEN } Dies hat zur Folge, dass anstatt des erwarteten Strings, bestehend aus Tags, ein String bestehend aus Tag-freiem Text zurückgegeben wird. Richtig ist diese Version: public String toTags () { return source.substringTags(start, end); } 3.2.3 Erweiterungen In diesem Kapitel sollen kurz kleinere und größere, jedoch notwendige, Erweiterungen beschrieben werden, welche es verhindern sollen, dass das Extraktionsprogramm mit gleichen oder nutzlosen Webseiten überlastet wird und um sinnvolle Links aus dem Crawlvorgang nicht auszuschließen. IP-Vergleich Der Crawlvorgang wurde um Zeit zu sparen auf Links, welche auf Webseiten desselben Webservers verweisen, eingeschränkt. Die Überprüfung dieser Bedingung basiert im originalen WebSphinx auf URL-Vergleich. Zum Beispiel findet sich unter https://www.dev.java.net/servlets/ ProjectList eine Liste aller Projekte auf Java.net. Die Details zu einem einzelnen Projekt allerdings haben einen anderen Aufbau der URL. Diese lautet zum Beispiel für das Projekt cnmonitoring auf https:// cnmonitoring.dev.java.net/. Die Ursprüngliche Implementierung erkennt hier nicht, dass beide Seiten zur selben Webseite gehören. Die Folge daraus ist, dass dieser Link nicht gecrawlt werden wird. Um dieses Problem zu beheben wurde eine Variante implementiert, welche die IP-Adressen der Seiten vergleicht, um sicher gehen zu können keine Teilseiten einer Webseite ungewollt auszuschließen. Session-ID Manche Webseiten verwenden um mehrere Anfragen eines Benutzers einer Sitzung zuordnen zu können in den URLs eigene Session-IDs. Diese Einführung ist eine Möglichkeit im an sich zustandslosen Protokoll HTTP einen Zustand zu codieren. Adressen mit angehängten SessionIDs können bei der Überprüfung, ob eine Seite schon gecrawlt wurde, zu Problemen führen. Daher erfolgt die Überprüfung auf Basis der URL ohne die Session-ID. Georg Bader 13 KAPITEL 3. TECHNOLOGIEN https Bei der originalen Klassifizierung durch die Klasse StandardClassifier von gefundenen Links werden diese eingeteilt in die Kategorien resource, form oder hyperlink. Die Implementierung des Prototypen folgt ausschließlich Links der Kategorie hyperlink. Links werden als Hyperlinks klassifiziert auf Basis der einleitenden HTML-Tags, der verwendeten Anfrage Methode und dem verwendetem Protokoll. Die Menge der gültigen Protokolle wurde ergänzt um https, da zum Beispiel Projekte auf java.net ausschließlich über dieses Protokoll erreichbar sind. Zeichencodierung Diese Erweiterung war nötig, um bei der Darstellung von gecrawlten Webseiten auf unerwartete Zeichen im Text verzichten zu können. Das Problem tritt zum Beispiel auf, wenn eine Webseite mit Umlauten im Text, codiert mit ISO 8859-1 dargestellt wird als UTF-8 Dokument. Der Grund hierfür liegt darin, dass zum Beispiel das Zeichen ä mit ISO 8859-1 codiert dem hexadezimalen String 0xE4 entspricht und mit UTF-8 codiert dem hexadezimalen String 0xC3 0xA4. Um dieses Problem zu lösen, wurde der verwendete Zeichensatz bereits beim Herunterladen der Webseite ausgelesen, um anschließend die erhaltenen Bytes dementsprechend decodieren zu können. 3.3 Versionsverwaltungssysteme Ein Repository (engl. für Lager, Depot), auch Repositorium, ist ein verwaltetes Verzeichnis zur Speicherung und Beschreibung von digitalen Objekten sowie deren Metadaten [Wik10]. Bei den verwalteten Objekten handelt es sich in diesem Kontext um Quellcode von freien Programmen also Softwarerepositories. Diese werden mittels Versionierungs-Tools wie CVS, SVN oder Git verwaltet (Versionsverwaltungssysteme). Mit Hilfe dieser Programme können Softwareentwickler komfortabel Quellcodedateien verwalten. Bekannte Sourcecodeportale, wie Sourceforge und Java.net setzen auf diese Technologien. In den nächsten Kapiteln werden die einzelnen durch den Prototypen unterstützten Versionierungs-Tools beleuchtet. 3.3.1 CVS Das Concurrent Versions System oder kurz CVS ist ein zentralisiertes Versionsverwaltungssystem. Das heißt, die Quellcodedateien werden in einem Repository oder Programmarchiv gehalten. Das Herunterladen von Dateien wird auschecken“ genannt. Dieses System ermöglicht ” 14 Georg Bader KAPITEL 3. TECHNOLOGIEN mehreren Benutzern gleichzeitig an einem Projekt zu arbeiten. CVS ermöglicht die Aufzeichnung der Geschichte der einzelnen Dateien. Dies ist sehr nützlich, falls auf Grund einer fehlerhaften Programmierung die Datei zu einem früheren Zeitpunkt wiederhergestellt werden soll. Wurde eine Quelldatei verändert, kann diese in das Repository eingecheckt“ ” werden. Das gleichzeitige Arbeiten von verschiedenen Entwicklern an der selben Datei kann zu Problemen führen. Diese können entweder durch den merge“-Befehl oder durch manuelles Anpassen der Datei [Gru86] ” gelöst werden. Um den Prototypen mit CVS-Unterstützung verwenden zu können, ist es nötig, ein CVS-Programm zu installieren, welches sich über den Kommandozeilenaufruf cvs starten lässt. 3.3.2 SVN Subversion oder kurz SVN ist ebenso wie CVS ein zentralisiertes Versionsverwaltungssystem. Entwickelt wurde es von CollabNet, welche es als freie Software unter der Apache-Lizenz veröffentlichten. SVN wird allgemein als die Weiterentwicklung von CVS verstanden. Entstanden ist es durch die weit verbreitete Kritik an CVS. Bei der Entwicklung wurden einfache Ziele definiert, welche ein verbessertes Versionierungs-Tool mit dem selben Funktionsumfang wie CVS zum Ergebnis haben sollte, jedoch ohne dessen offensichtlichen Fehlern. Eine wesentliche Verbesserung stellt zum Beispiel die Möglichkeit des Verschiebens und Umbenennens von Dateien und Verzeichnissen dar, ohne dabei die Versionsgeschichte zu verlieren. Die Bedienung von SVN entspricht im Großen und Ganzen derer von CVS. Nicht zuletzt um Benutzern von CVS den Umstieg zu erleichtern [PCSF08]. Um den Prototypen mit SVN-Unterstützung verwenden zu können, ist es nötig, ein SVN-Programm zu installieren, welches sich über den Kommandozeilenaufruf svn starten lässt. 3.3.3 Git Git ist im Gegensatz zu CVS und SVN ein verteiltes Versionsverwaltungssystem. Es wurde ursprünglich von Linus Torvalds zur Verwaltung des Linux-Kernel-Quellcodes entwickelt. Wichtiges Merkmal von Git ist, dass kein zentraler Server benötigt wird. Jeder Benutzer besitzt eine lokale Kopie des gesamten Repositories inklusive der Versionsgeschichte. Für die meisten Arbeiten ist daher keine Verbindung zum Internet nötig. Sollen die lokalen Änderungen in das offizielle Repository übertragen werden, muss eine Verbindung dorthin bestehen. Die Übertragung erfolgt über ein eigenes Protokoll, welches den Port 9418 verwendet. Andere Protokolle werden ebenfalls unterstützt wie zum Beispiel ssh, http oder ftp. Um den Prototypen mit Git-Unterstützung verwenden zu können, ist es nötig ein Git-Programm zu installieren, welches Georg Bader 15 KAPITEL 3. TECHNOLOGIEN Abbildung 3.4: SWT: Look and Feel sich über den Kommandozeilenaufruf git starten lässt. 3.4 Standard Widget Toolkit Das Standard Widget Toolkit, kurz SWT, ist ein Framework zur Gestaltung von GUIs1 für die Programmiersprache Java. Das Toolkit wurde 2001 von IBM für die Oberflächengestaltung der bekannten Entwicklungsumgebung Eclipse entwickelt. Neben SWT gibt es noch zwei andere bekannte Toolkits zur Java Oberflächenprogrammierung, nämlich AWT2 und Swing. SWT setzt, sowie AWT, auf die Verwendung von nativen Grafikelementen des jeweiligen Betriebssystems. Dies zeigt sich bei einem Vergleich der Optik von SWT- und Betriebssystemoberflächen. Somit entsprechen SWT-Applikationen, wie Abbildung 3.4 illustriert, einem nativen Look and Feel. Dem Programmierer wird zur Einbindung von SWT-Widgets eine Java API3 zur Verfügung gestellt. Intern verwendet SWT JNI-Aufrufe4 , um Funktionalität aus nativen Systembibliotheken zu nutzen. Java Programme verlieren durch Plattformen, auf welchen die nötigen Programmbibliotheken nicht verfügbar sind, den Vorteil gänzlich plattformunabhängig zu sein. Allerdings werden die wichtigsten Betriebssysteme wie Windows, Linux, Mac OS X und Solaris unterstützt. SWT besteht aus einer Vielzahl von Grafikelementen genannt Widgets, welche sich in GUIs einbinden lassen. Mit den folgenden Codezeilen wird ein Knopf mit dem Text Hallo Welt!“ eingebettet. ” Button t e s t B t n = new Button ( parentComposite , SWT. PUSH) ; t e s t B t n . s e t T e x t ( " Hallo Welt ! " ) ; SWT ist so aufgebaut, dass jedes Widget genau ein Vaterelement benötigt, in welchem es dargestellt werden soll. In diesem Fall wird der Knopf dem Widget parentComposite zugeteilt. Neben den eher einfacheren 1 Graphical User Interface. Abstract Window Toolkit. 3 Application Programming Interface. 4 Java Native Interface. 2 16 Georg Bader KAPITEL 3. TECHNOLOGIEN Elementen wie Knöpfen, Texten, Listen, Bäumen, usw. gibt es noch anspruchsvollere wie zum Beispiel Dialoge oder aber das Browser-Widget. Dieses funktioniert wie alle anderen Elemente auch über die Einbindung von nativer Funktionalität, im speziellen Fall die Einbindung von HTML-Renderingengines zur visuellen Repräsentation von HTML. Bei Windows etwa wird auf den Internet Explorer zurückgegriffen. Unter Linux findet die Renderingengine gecko von Mozilla Verwendung. Der Vorteil liegt darin, dass diese Browser-erprobten Engines Webseiten mit sehr guter Qualität rendern. Des weiteren haben diese auch keine Probleme mit CSS5 oder JavaScript, welche sich immer größerer Beliebtheit erfreuen. Die Möglichkeit der einfachen und guten Darstellung von Browserfenstern in einer Java GUI war das Schlüsselkriterium für die Auswahl von SWT als Oberflächenprogrammierungsframework [NW04]. 5 Cascading Style Sheets Georg Bader 17 Kapitel 4 Spezifikation Im Zuge dieser Arbeit wurde ein Prototyp eines Informationsextraktionsprogramms entwickelt. Der Prototyp soll folgende Funktionalität zur Verfügung stellen: • Suche von Opensourceprojekten, • Erfassung von Metadaten, • Downloadunterstützung für Repositories, • Speicherung gewonnener Daten und • Automatisierung genannter Schritte. Um die aufgeführte Funktionalität bereitstellen zu können, werden mehrere verschiedene Technologien in die Entwicklung des Prototypen miteinbezogen. Für die Gestaltung einer grafischen Oberfläche wird das Oberflächenprogrammierframework SWT (Kapitel 3.4) verwendet, um Browserfenster einfach einbetten zu können. Die Realisierung der automatisierten Suche basiert auf dem Webcrawlerframework namens WebSphinx (Kapitel 3.2). Die Downloadunterstützung für Repositories wird erreicht durch die Miteinbeziehung der Versionierungstools (Kapitel 3.3) SVN, CVS und Git. Die Implementierung des Prototypen erfolgte mittels der Programmiersprache Java. Details der Implementierung, wie die einzelnen verwendeten Komponenten, werden im Kapitel 5 erläutert. In den nächsten Unterkapiteln werden Anwendungsfälle identifiziert, ein grober Überblick über die benötigten Komponenten gegeben sowie der Prototyp der grafischen Oberfläche präsentiert. 19 KAPITEL 4. SPEZIFIKATION 4.1 Use Case Digramm In diesem Unterkapitel werden die wichtigsten Interaktionen des Benutzers mit dem System identifiziert. Diese werden in einem Use Case Diagramm (Abbildung 4.1) vereinfacht dargestellt. Zunächst kann der Benutzer durch die Angabe einer URL eine Webseite anzeigen lassen. Auf den angezeigten Webseiten können Zielelemente markiert werden. Diese können als Bedingung für die automatisierte Suche festgelegt werden. Neue Bedingungen lassen sich hinzufügen sowie bereits vorhandene löschen. Der HTML-Pfad von Elementen kann bearbeitet werden. Elemente können einzeln dargestellt werden, um eine Auswahl überprüfen zu können. Ist der Benutzer mit den getroffenen Bedingungen zufrieden, kann der Suchvorgang gestartet werden. Die Suche lässt sich durch die Anzeige des Suchgraphen visualisieren. Nach Beendigung der Suche durch den Benutzer können die Ergebnisse gespeichert werden. Der Download gefundener Repositories kann gestartet werden. Abbildung 4.1: Use Case Diagramm 20 Georg Bader KAPITEL 4. SPEZIFIKATION 4.2 Fachliches Klassendiagramm Um die identifizierten Anwendungsfälle aus Kapitel 4.1 verwirklichen zu können, wird eine Struktur benötigt, welche die gewünschte Funktionalität zur Verfügung stellt. Die geplante Architektur wird in Abbildung 4.2 dargestellt. Eine Klasse Controller soll die Komponeten Gui, Crawler, Extraktion und Data kontrollieren und für entsprechenden Datenaustausch sorgen. Die Suche von Webseiten soll durch eine Klasse Crawler realisiert werden. Webseiten sollen in einem Browserfenster, einem Teilbereich der Gui, dargestellt werden. Webseiten sollen aus mehreren Elementen bestehen. Bestimmte Elemente können durch die Klasse Extraktion selektiert und mit Hilfe der Klasse Data zwischengespeichert werden. Abbildung 4.2: Fachliches Klassendiagramm Georg Bader 21 KAPITEL 4. SPEZIFIKATION 4.3 Oberflächenprototyp Um dem Benutzer eine komfortable Bedienung ermöglichen zu können, wurde eine grafische Bedienungsoberfläche entwickelt. Diese besteht aus verschiedenen Teilbereichen, wie in Abbildung 4.3 zu sehen ist. Der größte Bereich besteht aus einem Browserfenster für Navigation zwischen Webseiten und der Darstellung auch von einzelnen HTML-Elementen. Die Reiter Input, Output und Download wurden so gewählt, dass je nach Arbeitsfortschritt von einem in den nächsten gewechselt werden kann. Die Steuerung des Crawlers wird im linken oberen Teil der Oberfläche ermöglicht. Abbildung 4.3: Oberflächenprototyp 22 Georg Bader Kapitel 5 Implementierung In diesem Kapitel wird die Implementierung des Informationsextraktionsprogramms beschrieben, welches im Zuge dieser Arbeit entwickelt wurde. Der Prototyp verwirklicht die Arbeitsschritte, welche in Abbildung 5.1 grob zusammengefasst zu sehen sind. Abbildung 5.1: Arbeitsschritte Prototyp 1. Der Benutzer ruft im SWT-Browser einen beliebigen Vertreter der strukturgleichen Webseite seiner Wahl auf. 23 KAPITEL 5. IMPLEMENTIERUNG 2. Das gewünschte Element wird auf der angezeigten Seite markiert. 3. Der HTML-Pfad des markierten Elements wird ausgelesen. 4. Sobald der Suchvorgang gestartet wird, beginnt der Crawler auf Basis der aktuellen Seite andere Seiten mit der selben Struktur zu suchen. 5. Gefundene Seiten werden dem PathClassifier übergeben. 6. Der PathClassifier überprüft die gecrawlte Seite auf ein Vorkommen des Zielelements durch einen Vergleich der HTML-Pfade. 7. Wird ein Element mit identischem Pfad gefunden, wird es als Treffer gespeichert. Um die gesamte Funktionalität des Prototypen zu erzielen, werden zahlreiche Pakete und Klassen benötigt. In den nächsten Abschnitten werden diese dem Leser näher erklärt. 5.1 Architektur Abbildung 5.2: Übersicht Pakete Der Prototyp des Repositoryextraktionsprogrammes, welcher im Zuge dieser Arbeit entwickelt wurde, besteht aus zwei Java Projekten. Das Webcrawlerframework namens WebSphinx bildet zusammen mit etlichen Erweiterungen und Bugfixes das Basis-Projekt, siehe Kapitel 3.2. Auf diesem Projekt aufbauend wurde das eigentliche Extraktionsprojekt entwickelt. Dieses stellt zusammengefasst die Funktionalität für das visuelle Markieren des Pfades im Browser, die Klassifizierung gefundener Seiten und die Download-Steuerung zur Verfügung. Das Projekt besteht aus den Paketen: 24 Georg Bader KAPITEL 5. IMPLEMENTIERUNG • controller • crawler • data • download • gui Das Zusammenspiel der einzelnen Pakete wird in Abbildung 5.2 veranschaulicht. Die Beziehungen der einzelnen Pakete zueinander wird durch Pfeile beschrieben. Die Schlagwörter Call bzw. Access bzw. Instantiate bzw. Import stehen für eine Aufruf- bzw. Zugriffs- bzw. Erzeugungs- bzw. Importbeziehung. Die Pakete werden in je einem Kapitel genauer erläutert. 5.2 Kontrollinstanz Das Paket controller, Abbildung 5.3, stellt das zentrale Element des Repositoryextraktionsprogramms dar. Es übernimmt die Dialogkontrolle, die Ablaufsteuerung und die Verbindung zu den anderen Paketen, siehe Abbildung 5.2. Die wichtigste Klasse darin stellt die Klasse Controller dar. Die main Methode zum Starten des Programms befindet sich in dieser Klasse. Beim Start wird ein Gui Objekt erzeugt, welches als Ansprechpartner für Methodenaufrufe eine Referenz auf den Controller erhält. Die public Methoden werden von der Klasse Gui angesprochen und stoßen damit einen Geschäftsprozess entsprechend dem MVC1 Architekturmuster an. Der Controller im MVC-Muster entspricht der Klasse Controller, die View der Klasse Gui und das Model dem WebCrawler, wessen Daten durch das Paket data abgebildet werden. Die Klasse Controller implementiert die Interfaces LinkViewListener, LinkListener, CrawlListener und Observer, um auf Ereignisse des Crawlers, der Crawler-Visualisierung beziehungsweise dem Datenmodell reagieren zu können. Die Klasse BrowserHelper kümmert sich um das Auslesen des HTMLPfades eines markierten Elements im Browserfenster und um das Angeleichen der HTML-Seiten des SWT-Browsers an den Webcrawler. Dies ist nötig, da der Browser und der Crawler jeweils eine eigene Anfrage und Download Routine, sowie einen eigenen HTML-Parser implementiert haben, welche den Quellcode von HTML-Seiten nicht identisch wiedergeben. Um dieses Problem zu lösen, wurde ein Verfahren, basierend auf Textvergleichen entwickelt, welches ein Mapping zwischen den Elementen der Seiten definiert. 1 Model View Controller Georg Bader 25 KAPITEL 5. IMPLEMENTIERUNG Abbildung 5.3: Paket controller Der BrowserHelper wird aktiv, sobald in der Oberfläche der Befehl zum Auslesen des HTML-Pfades eines Elements aus dem Browser gegeben wurde. Daraufhin wird im Browser JavaScript ausgeführt, welches den Quellcode des markierten Elementes mit zusätzlichen Tags umrahmt. Hier kommt die Klasse Target ins Spiel, welche einen eindeutigen String zur Verwendung als Identifikations-Tag zur Verfügung stellt. Der nächste Schritt ist das Auslesen des Ziel-Elements aus dem HTML-Code. Um den HTML-Pfad richtig bestimmen zu können, wird die Webseite mit den Methoden des Crawlers heruntergeladen. Die Textbausteine der beiden Seiten werden verglichen, bis ein Mapping gefunden wurde, welches die SWT-Browser-Seite auf eine Crawler-Seite abbildet. Anschließend wird der HTML-Pfad des Zielelements mit Hilfe der statischen Klasse HtmlPathHelper (Kapitel 5.4) auf der Crawler-Seite ausgelesen. 26 Georg Bader KAPITEL 5. IMPLEMENTIERUNG 5.3 Grafische Benutzeroberfläche Abbildung 5.4: Gui mit SWT-Browserfenster Das Paket gui enthält jene Klassen, welche für die grafische Oberfläche benötigt werden. Abbildung 5.5 zeigt ein detailiertes Klassendiagramm aller im Paket gui enthaltener Klassen und Interfaces. Die Hauptkomponente stellt die Klasse Gui dar. Diese implementiert das Interface myProcessListener, welches eine Spezialierung des Interfaces ErrorReceiver darstellt. Mit Hilfe des Interfaces ErrorReceiver werden etwaige Fehlermeldungen, welche in anderen Klassen ihren Ursprung haben, an die Klasse Gui und somit an Benutzer weitergegeben. Das Interface myProcessListener gewährleistet, dass die implementierende Klasse auf Ereignisse eines externen Prozesses reagieren kann. Verwendet wird diese Funktionalität bei den Klassen ErrorStreamHandler und InputStreamHandler aus dem download Paket (Kapitel 5.6). Diese lesen die Standardströme der externen Prozesse, wie zu Beispiel CVS, SVN oder Git. Die Klasse BrowserFrame erweitert den SWT-Browser [NW04] um die klassischen Browserbedien- und Anzeigeelemente wie Vor-/Zurückknopf, Adressleiste, Aktualisieren, Statusleiste, usw. Abbildung 5.4 zeigt die grafische Oberfläche mit integriertem SWT-Browserfenster. 5.4 Datenverarbeitung Das Paket data enthält die Klassen, welche verwendet werden um aus den gewonnen Daten Objekte zu erzeugen, sowie statische Helfer-Klassen. Abbildung 5.6 zeigt eine Übersicht über das Zusammenwirken der Klassen. Georg Bader 27 KAPITEL 5. IMPLEMENTIERUNG Abbildung 5.5: Paket gui 28 Georg Bader KAPITEL 5. IMPLEMENTIERUNG HTML-Pfad Die Klasse HtmlPath ist die Datenstruktur zur Speicherung eines Pfades zu einem HTML-Element innerhalb eines HTML-Dokuments. Wie bereits im einführenden Kapitel besprochen, beruht das Programm auf Basis der Erkenntnis, dass sich auf strukturgleichen Webseiten die gleiche Art von Information an der gleichen Stelle befindet. Anders ausgedrückt haben gleiche Arten von Informationen auf unterschiedlichen Webseiten, wenn diese strukturgleich sind, den selben HTML-Pfad. Und dieser wiederum wird abgebildet in HtmlPath-Objekten. Diese bestehen aus einer Sequenz von HTML-Tags realisiert als Stack von Strings und der Position, welche die Anzahl des wiederholten Auftretens eines Pfades wiederspiegelt. Die Reihenfolge der Tags ist von entscheidender Bedeutung, da immer nur das oberste Element des Stacks verglichen werden kann. Aufgebaut wird der Stack durch die statische Helfer-Klasse HtmlPathHelper, welche für ein Ziel-HTML-Element jeweils den StartTag des Vaterelements auf den Stack legt. Anschließend muss durch Umkehrung dieses Vorganges ermittelt werden, wieviele Elemente sich den selben Stack-Pfad teilen. Die Position des richtigen Elements plus der Pfad-Stack reichen aus um den HTML-Pfad eindeutig in Form eines HtmlPath-Objektes bestimmen zu können. Pointer und Match Die Klasse Pointer wird als Datenstruktur verwendet, um die einzelnen Zeilen der Seitenbedingungsanzeige, siehe Kapitel 6.1, abzubilden. Eine Zeile beinhaltet folgende Informationen: • HTML-Pfad • optional oder obligatorisch • regulärer Ausdruck • Repository-Technologie • Titel Alle diese Werte finden sich als entsprechende Attribute in der Klasse Pointer wieder. Da auch der Zusammenhang zwischen den einzelnen Zeilen zueinander von Bedeutung ist, wurde eine Baumstruktur für diese Klasse gewählt. Dies erweitert die Pointer-Objekte jeweils um einen Verweis auf ihre Vaterknoten bzw um ein Array von Verweisen auf ihre Kindknoten. Durch die Klassifizierung der gefunden Seiten (siehe Kapitel 5.5) werden Match-Objekte angelegt, vorausgesetzt alle obligatorischen Pointer-Bedingungen konnten erfüllt werden. Ein Match-Objekt stellt die Datenstruktur für einen kompletten Treffer dar. Ein Treffer Georg Bader 29 KAPITEL 5. IMPLEMENTIERUNG beinhaltet alle HTML-Elemente, welche durch die Seitenbedingungsanzeige spezifiziert wurden, sowie die Webseiten, auf welchen diese zu finden waren. In Kapitel 5 wurde bereits die Output-Anzeige aus Abbildung 6.2 erklärt, welche alle Treffer, also Match-Objekte, darstellt. Ein Match-Objekt besteht aus einer Sammlung von Paaren bestehend aus dem HTML-Element und dem zugehörigen Pointer, sowie einem Vektor aus Page-Objekten. Die Klasse Pointer spielt eine Doppelrolle, da sie erstens eine Zeile der Seitenbedingung widerspiegelt und zweitens die Referenzen über alle Match-Objekte verwaltet werden. Diese zweite Rolle kommt allerdings nur einer speziellen Instanz der Pointer Klasse zu, nämlich dem Wurzelknoten des Baumes. Die Beziehung zwischen den Klassen Pointer und Match, wie unter Abbildung 5.6 zu sehen ist, trifft also nicht auf alle Instanzen der Klasse Pointer zu. Der Wurzelknoten Pointer verwaltet einerseits einen Vector von Match-Objekten und andererseits eine Hashmap, welche URL-Objekte auf Match-Objekte abbildet. Die Hashmap wird benötigt um Match-Objekte zu speichern, welche bereits HTML-Elemente mit zugehörigen Pointern einer Tiefe ungleich 1 beinhalten, jedoch noch Einträge zu Pointern weiter oben im Baum vermissen. Hier wird deshalb von Waisen-Machtes gesprochen. Dieses Problem tritt auf, wenn Seiten, welche sich tiefer im Baum befinden, zuerst gecrawlt werden. Sobald die Vater-Seite gefunden wurde, wird auch das Link-Element entdeckt, welches auf eine Waisen-Seite zeigt. Mit Hilfe der URL des Links-Elements kann das Waisen-Match-Objekt aus der Hashmap ausgelesen werden. DownloadItem In der Phase des Herunterladens werden aus den Match-Objekten DownloadItems generiert. Diese bestehen aus einem ID-Objekt und einem Vector aus Repo-Objekten. Aus einem vollständigem Match-Objekt wird genau ein DownloadItem-Objekt erzeugt. Die Klasse DownloadItem wird zur Generierung der Kommandosequenz, siehe Abbildung 6.3 herangezogen. Die Sequenz beginnt immer mit einem cd-Befehl2 , um die Repositories der verschiedenen Matches je in einen anderen Ordner ablegen zu können. Die Wahl des Ordners wird bestimmt durch die Klasse ID. Die ID-Objekte werden unter Heranziehung des HTML-Elements des ersten Pointers der Tiefe 1 im Baum konstruiert, anders ausgedrückt, dem HTML-Element, welches zur ersten Zeile der Seitenbedingungsanzeige gefunden wurde. Standardmäßig handelt es sich hierbei um den Titeleintrag, siehe Abbildung 6.1. Da unter einigen Betriebssystemen nicht alle Zeichen als Dateinamen erlaubt sind, werden nur die Zeichen a-z, A-Z und 0-9 verwendet, sowie statt dem Leerzeichen. Dies wird 2 30 change directory Georg Bader KAPITEL 5. IMPLEMENTIERUNG Abbildung 5.6: Paket data Georg Bader 31 KAPITEL 5. IMPLEMENTIERUNG realisiert durch folgende Zeilen Code: String s = id.replace(" ", "_"); s=s.replaceAll("\\W", ""); Die Zeichenfolge \\W steht für eine vordefinierte Zeichenklasse der regulären Ausdrücke in Java. Die Länge des Ordnernamens wird außerdem beschränkt auf 40 Zeichen. Die relevanteren Befehle werden durch die Klasse Repo bereitgestellt. Ein Repo-Objekt besteht aus dem String für das Kommando und einem Element der Enumeration Technology. Diese bestimmen sich durch die Wahl des HTML-Pfades und durch die Art des Repositories. Je nach Technologie können mehrere Befehle nötig sein um ein Repository vollständig herunterladen zu können. Bei CVS zum Beispiel werden zwei Befehle verwendet. Der erste wird verwendet für den Login und der zweite für das Auschecken. Beim Auscheck-Befehl kann der Name eines gewünschten Modules übergeben werden. Das Programm ersetzt hier den Platzhalter modulename“ durch einen Punkt, ” um statt einem bestimmten Modul alle herunterzuladen. PrintHelper Die statische Helfer-Klasse PrintHelper stellt die Funktionalität für die diversen Schreib- und Leseoperationen auf Dateien zur Verfügung. In Kapitel 5 wurde bereits über Methoden gesprochen, welche durch die grafische Oberfläche angesprochen werden können, um gewonnene Daten zu speichern und zu laden. Diese Methoden sind in der Klasse PrintHelper implementiert. Um die Ergebnisse des Crawlvorganges zu Serialisieren, wurde die Möglichkeit geschaffen, die gewonnen MatchObjekte in einer XML-Datei zu speichern. Eine damit generierte Datei entspricht folgender Struktur: <?xml version="1.0" ?> <Match META1="meta1" META2="meta2" META3="meta3"> <pages page0="http://..." page1="http://..."></pages> </Match> Wobei META1 bis META3 als Platzhalter für die Titel der einzelnen Zeilen der Seitenbedingungsanzeige zu verstehen sind. Ebenso sollen die Werte der Attribute, welche sich zwischen den Anführungszeichen befinden, als Beispiel-Metadaten verstanden werden. Die Metadaten entsprechen den Funden der zugehörigen HTML-Pfade, welche, falls gesetzt, den regulären Ausdrücken genügen. Die Auswertung der regulären Ausdrücke übernimmt die ebenfalls statische Helferklasse RegExpHelper. Das XML-Element mit dem Namen pages beinhaltet ein Attribut mit dem Titel page kombiniert mit einer fortlaufenden Zahl beginnend bei 0 für jede zum Match-Objekt gehörenden Webseite. Der Wert des Attributs entspricht der URL der Webseite. 32 Georg Bader KAPITEL 5. IMPLEMENTIERUNG 5.5 WebCrawler Das Paket crawler besteht aus nur einer Klasse, da der gesamte WebCrawler als ein eigenes Java-Projekt behandelt wurde, mehr dazu im Kapitel 3.2. Die Klasse PathClassifier stellt eine Erweiterung von WebSphinx dar, welche ihren Nutzen ausschließlich in Kombination mit dem Extraktionsprojekt zur Schau stellen kann. Es handelt sich hierbei um eine Implementierung des Interfaces Classifier aus dem Paket websphinx. Das Interface garantiert die Implementierung der Methoden classify(Page):void und getPriority():float. Diese Methoden werden vom Crawler aufgerufen, sobald eine Seite fertig heruntergeladen wurde. Die Methode getPriority() dient lediglich dazu, eine Reihenfolge der Ausführung der einzelnen Cassifier-Implementierungen festzulegen. Die eigentliche Klassifizierung einer heruntergeladenen Webseite wird durch den Aufruf classify(Page) eingeleitet. Der Übergabeparameter ist vom Typ Page, welcher den Quellcode der Webseite sowie andere Seiten-spezifische Daten enthält. Die Idee hinter der Klasse PathClassifier ist es, eine übergebene Seite zu testen, ob diese die Benutzer-spezifizierten HTML-Pfade enthält. Ist dies der Fall, soll dafür ein Match-Objekt angelegt oder ein bestehendes ergänzt werden. Die technische Umsetzung soll nun genauer erläutert werden. Jedes Page-Objekt besitzt ein zugehöriges Link-Objekt, welches die URL zu der Seite enthält, um diese herunterladen zu können. Zu Beginn der classify Methode wird überprüft, ob dem Link der Seite, Match und/oder Pointer Objekte angehängt wurden. Dies ist der Fall, wenn die Seite, auf welcher der Link zu der aktuellen Seite zu finden war, bereits als Match klassifiziert wurde. Ein angehängtes Pointer-Objekt zeigt an, auf welchen Pointer, genauer auf welchen HTML-Pfad die Seite überprüft werden soll. Konnte der Pfad gefunden werden, wird das zugehörige Element dem angehängtem Match-Objekt hinzugefügt. Andernfalls wird das Match-Objekt als nicht vervollständigbar markiert, vorausgesetzt, der zu überprüfende Pointer war obligatorisch. Bei nicht auffindbaren optionalen Pointern bedarf es keiner weiteren Behandlung. Falls Pointer einer anderen Ebene im Baum noch nicht überprüft wurden, muss eine entsprechende Suche eingeleitet werden. Hier werden grob zwei Fälle unterschieden. Fall 1: Die Pointer einer tieferen Ebene konnten noch nicht gefunden werden. Fall 2: Pointer-Objekte oberhalb bereits gefundener Elemente wurden noch nicht gefunden. Bei Fall 1 werden ausgehend von der aktuellen Seite, die HTML-Pfade der Pointer, welche Referenzen auf Kindknoten enthalten, herangezogen, Georg Bader 33 KAPITEL 5. IMPLEMENTIERUNG um ihre Zielelemente speziell zu markieren. Es handelt sich bei diesen Elementen um Links, welche auf andere Webseiten zeigen, welche wiederum die HTML-Pfade der Kind-Pointer befriedigen sollen. Um bei einer Klassifizierung dieser Seiten den Zusammenhang zum aktuellen Match nicht zu verlieren, werden den Links die jeweils zu überprüfenden Pointer angehängt sowie eine Referenz auf das Match-Objekt. Weiters wird, um den Download der Seite zu beschleunigen, der Link mit dem Label im” portant“ versehen. Dies bewirkt auf Grund einer Erweiterung im Crawler eine Einreihung an vorderster Stelle der Download-Warteschlange. Bei Fall 2 gestaltet sich die Suche nach den Seiten, welche auf die VaterPointer matchen, nicht so einfach. Dies liegt daran, dass in der Seitenbedingungsanzeige keine Links zu Vater-Elementen vorgesehen sind. Dies ist auch nicht möglich, da nicht alle Webseiten über Links zu den Seiten verfügen, auf welche sie selbst verlinkt wurden. Ein einfaches Markieren eines weiterführenden Links wie unter Fall 1 ist also nicht möglich. Stattdessen muss gewährleistet werden, dass wenn die VaterSeite durch den Crawler der Klassifizierung übergeben wird, der Zusammenhang zum aktuellen Match-Objekt nicht verloren geht. Hierzu wird die URL der Seite, welche die Bedingungen des Pointers erfüllt, dessen Vaterknoten noch nicht gefunden wurde, mit dem zugehörigen MatchObjekt verknüpft. Dies geschieht in Form eines Eintrags in der Hashmap für Waisen-Matches in der Klasse Pointer (siehe Kapitel 5.4). Bei Klassifizierung einer Seite, welche den Vater-Pointer erfüllt, muss auch ein weiterführender Link-Objekt gefunden werden. Dieser Link zeigt auf die Seite, welche bereits im Match enthaltenen ist. Eine Suche in der Waisen-Matches-Hashmap mit der URL des Links wird als Ergebnis das Match-Objekt zurückliefern. Anschließend müssen nur noch die Funde der aktuellen Seite zu diesem Match-Objekt hinzugefügt werden. 5.6 Download Das Paket download enthält jene Klassen, welche verwendet werden, um das Herunterladen der Repositories zu ermöglichen. Die Klasse Konsole startet und überwacht externe Programme. Damit der Download mit sämtlichen unterstützten Repository-Technologien funktioniert, müssen auf dem System die Programme cvs, svn und git installiert sein (siehe Kapitel 6.1). Ein Konsolen-Objekt wird erzeugt, indem der Konstruktor mit einem String, bestehend aus einer Sequenz von Befehlen und einer Referenz, auf ein myProcessListener-Objekt gestartet wird. Die Klasse Konsole erbt von der Klasse Thread, damit der Ausführungsstrang nicht durch die Downloadüberwachung blockiert wird. Die Ausführung des Konsolenthreads startet mit dem Aufsplitten der Befehle. Diese sind 34 Georg Bader KAPITEL 5. IMPLEMENTIERUNG durch einen Zeilenumbruch voneinander getrennt. Eine Besonderheit stellt der Befehl cd zum Wechseln des Verzeichnisses dar, da dieser im Gegensatz zu allen anderen Befehlen nur intern ausgeführt wird. Er bewirkt das Setzen des Pfad-Attributs auf den als Parameter übergebenen Pfad. Alle weiteren Befehle werden mittels der Funktion exec des Runtime-Objekts in diesem Verzeichnis ausgeführt. Pro Befehl werden zwei weitere Threads gestartet, nämlich der InputStreamHandler und der ErrorStreamHandler. Diese horchen auf dem entsprechenden Stream. Sendet der extern ausgeführte Prozess Informationen oder Fehlermeldungen, werden diese an das myProcessListener-Objekt weitergeleitet. Die Klasse Gui implementiert das Interface myProcessListener. Der InputStreamHandler und der ErrorStreamHandler verfügen über eine Referenz auf das Gui-Objekt jedoch nur in Gestalt des myProcessListeners. Mit diesen Klassen wurde die Funktionalität geschaffen, über welche der Benutzer im Register Download, siehe Abbildung 6.3, verfügen kann. 5.7 Zusammenfassung Zusammengefasst folgt die Ausführung des Programms dem folgenden groben Arbeitsablauf: Der Benutzer markiert im Browserfenster einen gewünschten Bereich. Mit Hilfe der Klassen BrowserHelper und HtmlPathHelper wird das markierte Element sowie dessen HTML-Pfad bestimmt. In der Seitenbedingungsanzeige können komplexe Anforderungen an die Suche gestellt werden. Diese können aus einer beliebig tiefen Verschachtelung von HTML-Pfaden bestehen. In der Baumdarstellung lässt sich ablesen, welche HTML-Pfade sich auf einer Seite befinden müssen um als Treffer gewertet werden zu können, nämlich alle Geschwisterknoten. Hat ein Knoten Kinder, muss der zugehörige HTMLPfad einen Link als Ziel haben. Die konstruierten Bedingungen werden der Klasse PathClassifier in Form eines Baumes aus Pointern übergeben. Diese unterzieht alle Seiten, welche durch den Crawler gefunden wurden, einer Klassifizierung. Enthält eine Seite alle gewünschten Elemente, werden diese in einem Match-Objekt gespeichert. Der WebCrawler startet seine Suche auf der, durch den Benutzer ausgewählten Webseite. Ausgehend von dieser Seite werden alle weiterführenden Links in eine Warteschlange eingereiht. Diese Aufgabe wird dem WebCrawlerFramework namens WebSphinx übertragen, welches im nächsten Kapitel beschrieben wird. Georg Bader 35 Kapitel 6 Handbuch In diesem Kapitel soll zunächst auf die Funktionalität des Prototypen des Informationsextraktionsprogramms eingegangen werden, um im Anschluss die Installation sowie die Bedienung anhand konkreter Beispiele zu beschreiben. Das Programm bietet dem Benutzer eine grafische Oberfläche, in welche ein Browserfenster eingebettet ist. In diesem kann in gewohnter Mannier zwischen den einzelen Webseiten navigiert werden. Im linken Teil der Oberfläche befindet sich eine Steuerungseinheit. Dort kann sich der Benutzer den HTML-Pfad (Kapitel 5.4) zu einem im Browserfenster markiertem Element als Text anzeigen lassen. Dem HTML-kundigen Anwender steht hier die Möglichkeit offen, den Pfad entsprechend seiner Wünsche zu manipulieren. Nach einem Klick auf den Knopf Show Path wird im Browserfenster nur noch der Bereich, welcher sich innerhalb des Pfades befindet, dargestellt. Entspricht das angezeigte Element den Vorstellungen des Benutzers, kann der Pfad einem Element der hierarchisch aufgebauten Seiten-Bedingungs-Anzeige hinzugefügt werden. Diese An- Abbildung 6.1: Prototyp Seiten-Bedingungs-Anzeige 37 KAPITEL 6. HANDBUCH zeige, wie unter Abbildung 6.1 zu sehen ist, zeigt die Bedingungen, welche an eine Seite gestellt werden, um als Treffer gewertet werden zu können. Es gilt: Alle Einträge der selben Ebene gehören zu einer Seite. Werden einem Eintrag Sub-Einträge hinzugefügt, wird dieser Eintrag als Link auf einer Webseite gewertet. Der zugehörige HTML-Pfad sollte ebenfalls auf einen Link matchen. Die Bedingungen, die in Abbildung 6.1 zu sehen sind, beziehen sich auf zwei verschiedene Seiten. Die erste Seite muss die Elemente beinhalten, welche durch die HTML-Pfade der Einträge mit den Titeln titel“ und ” link“ beschrieben werden. Die zweite Seite benötigt jedoch nur das ” Element, welches durch den Eintrag repo“ beschrieben wird, um als ” Treffer gewertet werden zu können. Die Suche nach den Treffern startet, sobald der Crawlvorgang durch einen Klick auf den Knopf start eingeleitet wird. Die gefundenen Seiten, welche den gestellten Bedingungen entsprechen, können im Register output eingesehen werden. Abbildung 6.2 zeigt die einzelnen Treffer durchnummeriert an Match0“ bis Match6“. Ein Treffer besteht bei ” ” diesem Beispiel aus den zwei Seiten, welche durch die Bedingungen in Abbildung 6.1 bestimmt wurden. Bei jedem Treffer lassen sich die Links zu den zugehörigen Seiten anzeigen, sowie die gefundenen Elemente. Mit einem Doppelklick lassen sich diese im Browserfenster darstellen. Bei einem Klick auf save lassen sich die Ergebnisse in Form einer XML-Datei speichern. Der Knopf writeRepo bewirkt die Generierung der Dateien SVN, CVS, Git und unknown im aktuellen Verzeichnis. Achtung: Bestehende Dateien gleichen Namens werden überschrieben! Diese Dateien enthalten jene Elemente, welche im Input-Register als Repositories markiert wurden, sortiert nach Technologien. In der Datei unknown werden jene Repository-Pfade abgelegt, welche weder durch den Benutzer noch durch das Programm einer Technologie zugeordnet wurden. Das Register Download (Abbildung 6.3) beinhaltet die Steuerung für das automatisierte Herunterladen der Repositories. In das obere Textfeld lassen sich System-Befehle eintragen, welche sequenziell abgearbeitet werden, sobald auf download geklickt wurde. Eine Zeile beginnt mit einem Kommando gefolgt von optionalen Parametern separiert durch je ein Leerzeichen. Bei einem Klick auf generate wird das Textfeld mit Befehlen zum automatisierten Herunterladen entsprechend der gefundenen Repositories gefüllt. Das Textfeld unterhalb zeigt, sobald der Downloadvorgang gestartet wurde, die Datemströme Standardausgabe und Standardfehlerausgabe des aktuell exekutierten Programms an. Weiters wird der Erfolg eines terminierten Prozesses durch Ausgabe des ExitValues angezeigt. Die Anzeige in Abbildung 6.3 zeigt die Beendigung der erfolgreichen Ausführung des Befehls cvs -z3 -d:pserver:[email protected]: 38 Georg Bader KAPITEL 6. HANDBUCH Abbildung 6.2: Output Anzeige Abbildung 6.3: Register Download Georg Bader 39 KAPITEL 6. HANDBUCH /cvsroot/emulemorph co -P . mit Exit-Value 0 an. Der nächste Befehl erfordert die Eingabe eines CVS Passwortes. Die Kommunikation erfolgt mittels dem untersten Textfeldes und dem Knopf Send. Bei einem Klick darauf wird der Inhalt des Textfeldes dem aktuell exekutierendem Prozess als Standardeingabe übergeben. Um das wiederholte Eingeben von Passwörtern dem Benutzer ersparen zu können, besteht die Möglichkeit automatisiert ein Passwort an den Prozess zu senden, sobald dieser nach einem solchen verlangt. Diese Option wird aktiviert durch Anhaken des Feldes auto Psw. Der Vorgang des Herunterladens kann einige Zeit in Anspruch nehmen. Der Fortschritt lässt sich auf dem veränderten download Knopf ablesen, welcher die Anzahl abgearbeiteter Befehle vor der Gesamtanzahl anzeigt. Sobald die gesamte Kommandosequenz durchlaufen wurde, kann ein neuer Downloadvorgang gestartet werden. 6.1 Installation Um das Java Programm prototyp.jar starten zu können wird die Verfügbarkeit von Java-Bibliotheken in dem Verzeichnis prototyp lib vorausgesetzt. Benötigt werden die Dateien 3rdPartyClass.jar und swt.jar. Erstere wird benötigt für die Visualisierung des Crawlvorganges, welche bereits im WebCrawler Framework WebSphinx als Bibliothek genutzt wurde. Die Datei swt.jar ist erforderlich für den Start der grafischen Oberfläche und insbesondere des Browserfensters. Wie bereits in Kapitel 3.4 aufgezeigt wurde, verwendet SWT zur Darstellung von Oberflächenkomponenten native Funktionalität. Der Zugriff auf native Funktionalität erfolgt mit Hilfe der Bibliothek swt.jar. Diese muss kompatibel mit der Architektur des ausführenden Rechners sein. Auf der SWT-Webseite unter http://www.eclipse.org/swt/ werden Bibliotheken für alle gängigen Systemarchitekturen bereitgestellt. Um den Prototypen inklusive der Download-Funktionalität nutzen zu können werden die Kommandozeilenprogramme cvs, svn und git benötigt, da diese durch das Programm aufgerufen werden. 6.2 Beispiel Sourceforge Um die Entwicklungswebseite Sourceforge mit dem Prototypen erfolgreich zu Durchforsten kann wie folgt verfahren werden: 1. Öffnen der Webseite http://sourceforge.net/ im Browserfenster. 40 Georg Bader KAPITEL 6. HANDBUCH 2. Öffnen eines Beispielprojekts. 3. Markierung des Projekttitels im Browserfenster. Hinweis: Die Markierung weniger Zeichen innerhalb des Elements reicht, um den HTML-Pfad für das ganze Element auszuwählen. 4. Den HTML-Pfad durch Klicken der Schaltfläche Path from Selection berechnen und anzeigen lassen. Hinweis: Zur Überprüfung des HTML-Pfades stehen folgende Möglichkeiten zur Verfügung: • Durchschauen des HTML-Pfades im Textfeld • Durch Klicken der Schaltfläche Show Path wird der Inhalt des Pfades auf der aktuellen Seite angezeigt. Mit der Schaltfläche Back im Browserfenster kann zur vorherigen Seite zurückgekehrt werden. 5. Auswahl einer Zeile in der Seitenbedingungsanzeige. Hinweis: Durch einen Doppelklick lassen sich die einzelnen Felder einer Zeile bearbeiten. Das Feld für den HTML-Pfad lässt sich durch das separate Textfeld editieren. Um Änderungen zu übernehmen muss dies mit der Schaltfläche set Path bestätigt werden. 6. Den angezeigten Pfad hinzufügen durch Klicken der Schaltfläche set Path 7. Markierung des Links zum Repository im Browserfenster + Klicken der Schaltfläche Path from Selection 8. Kontrolle des HTML-Pfades: Die letzte Zeile des HTML-Pfades muss auf <a> lauten, da das darauf passende Element ein Link sein soll. 9. Hinzufügen des HTML-Pfades zu einem Eintrag in der Seitenbedingungsanzeige, welcher Subeinträge beinhalten soll. Georg Bader 41 KAPITEL 6. HANDBUCH 10. Durch Anklicken des Links die Seite mit dem Pfad zum Repository öffnen. 11. Den Pfad zum Repository auswählen und den Pfad berechnen lassen. 12. Einen Subeintrag zum Eintrag, welcher den Link symbolisiert auswählen oder durch Klicken der Schaltfläche add Item generieren. 13. Die Klassifizierung dieses Eintrages auf SVN or CVS or GIT setzen. Den HTML-Pfad zu diesem Subeintrag hinzufügen. 14. Auswahl der Startseite des Crawlvorganges: Im Browserfenster eine Webseite auswählen (Webserver muss selbe IP-Adresse haben), von welcher aus viele Soll-Seiten mit möglichst wenigen Klicks erreicht werden können. 15. Mit einem Klick auf die Schaltfläche start beginnt die Suche. 16. Der Crawlvorgang lässt mit einem Klick auf die Schaltfläche graph visuell verfolgen. Durch einen Doppelklicken auf Seiten-Icons öffnen sich diese im Browserfenster. Im Register Output erscheinen die gefundenen Treffer. 6.3 Beispiel java.net Eine Suche auf der Webseite java.net (http://java.net/) kann größtenteils analog zum Beispiel Soureforge, siehe Kapitel 6.2, erfolgen. Einige Anpassungen sind jedoch noch nötig, da die benötigten Kommandos zum Herunterladen von CVS-Repositories sich nicht ausschließlich in einem HTML-Element befinden, wie Abbildung 6.4 veranschaulicht. Der Trick lautet hierbei einen optionalen Eintrag zu erstellen, welcher das zweite CVS-Kommando finden soll. 42 Georg Bader KAPITEL 6. HANDBUCH Abbildung 6.4: Die CVS-Kommandos befinden sich in zwei HTML-Elementen. Abbildung 6.5: Ein zusätzlicher optionaler Eintrag Optionale Einträge unterscheiden sich von obligatorischen durch einen fehlenden Hacken vor dem Titel. Der optionale Eintrag soll als Subeintrag zum Link-Eintrag gewählt werden. Eine Suche mit dem Ziel Titel und Repository auf java.net zu extrahieren, wird durch Bedingungen, wie unter Abbildung 6.5 zu sehen ist bestimmt. Georg Bader 43 Kapitel 7 Schlusswort und Ausblick Ziel der Arbeit war es, ein Verfahren zu entwickeln, welches es ermöglicht, Opensourcesoftwareprojekte auf Sourcecodeportalen im Internet ausfindig zu machen, dessen Metadaten zu erfassen sowie Funktionalität für das automatisiere Downloaden zur Verfügung zu stellen. Mit der ersten Implementierung des Repositoryextraktionsprogramms wurde ein funktionsfähiger Prototyp geschaffen, welcher die angestrebten Ziele verwirklicht. Der Prototyp ermöglicht dem Benutzer die grafische Markierung von HTML-Elementen in einem Browserfenster. Mit Hilfe der Seitenbedingungsanzeige kann eine baumartige Struktur von verknüpften Bedingungen für einen Treffer gestaltet werden. Die Suche basiert auf einem WebCrawler, welcher mit dem WebSphinx-Webcrawlerframework entworfen wurde. Jede gecrawlte Seite wird einer Klassifizierung unterzogen, welche diese auf das Auftreten bestimmter HTML-Pfade untersucht. Wurden alle benötigten Elemente gefunden, wird die Seite als Treffer gewertet. Ein Treffer setzt sich je nach Komplexität der Bedingungen aus vielen HTML-Elementen zusammen, welche auf verschiedenen Webseiten ihren Ursprung haben können. Die erzielten Treffer lassen sich in Form einer XML-Datei speichern. Die aufgespürten Repositories können anschließend heruntergeladen beziehungsweise auf den neuesten Stand gebracht werden. Dieser Vorgang setzt auf die Verfügbarkeit von Versionsverwaltungssystemen. Benötigt werden die Kommandozeilenprogramme cvs, svn und git. Um die grafische Oberfläche und insbesondere das integrierte Browserfenster starten zu können, wird das Oberflächenwerkzeug SWT verwendet. Aufgrund der Verwendung von nativer Funktionalität durch SWT kann die Darstellung von Webseiten im Browserfenster von System zu System variieren. Dies kann unter Umständen zu Problemen bei der korrekten Bestimmung des HTML-Pfades eines markierten Elements im Browserfenster führen. Fehlerquellen für die korrekte HTML-Pfad-Bestimmung sind außerdem die unterschiedlichen Stile der Quellcodepräsentation von 45 KAPITEL 7. SCHLUSSWORT UND AUSBLICK Webseiten durch die verwendeten HTML-Parser sowie die browserspezifischen Eigenheiten der HTML-Requests zum Anfragen von Webseiten. Ein möglicher Ansatz zur Verbesserung dieser Problematik wäre die Schaffung einer gemeinsamen Instanz zum Anfragen, Herunterladen und Parsen von Webseiten, da die aktuelle Implementierung einerseits für die Darstellung im Browserfenster native Funktionalität verwendet und andererseits die Routinen von WebSphinx für alle Belange des WebCrawlers. Außerdem möglich wäre das automatisierte Einspeisen der Ergebnisse in eine Datenbank, welche beim Start des Programms alle bekannten Repositories auf Änderungen überprüft und diese gegebenenfalls auf den neuesten Stand bringt, sowie Funktionen, welche den aufgespürten Quellcode analysieren und klassifizieren, um bei gezielten Suchen in der Datenbank den entsprechenden Programmcode zurückliefern zu können. Mit diesen Erweiterungen wäre es ebenfalls möglich mehrere Instanzen des Extraktionsprogramms auf verschiedenen Rechnern laufen zu lassen, um in kürzerer Zeit größere Mengen an Daten gewinnen zu können. 46 Georg Bader Literaturverzeichnis [BFG01] R. Baumgartner, S. Flesca and G. Gottlob: Visual Web Information Extraction with Lixto, VLDB ’01: Proceedings of the 27th International Conference on Very Large Data Bases, Morgan Kaufmann Publishers Inc., San Francisco, CA, USA, 2001, pages 119–128. [BTMC04] K. Bontcheva, V. Tablan, D. Maynard and H. Cunningham: Evolving GATE to meet new challenges in language engineering, Nat. Lang. Eng., volume 10(3-4), (2004), pages 349– 373. [CGM02] J. Cho and H. Garcia-Molina: Parallel crawlers, WWW ’02: Proceedings of the 11th international conference on World Wide Web, ACM, New York, NY, USA, 2002, pages 124– 135. [Cot04] V. Cothey: Web-crawling reliability, Journal of the American Society for Information Science and Technology, volume 55, (2004), pages 1228–1238. [Eik99] L. Eikvil: Information Extraction from World Wide Web A Survey, Technical report, Norwegian Computing Center, P.B. 114 Blindern, N-0314 Oslo, Norway, 1999. [Gru86] D. Grune: Concurrent Versions System, A Method for Independent Cooperation, Technical report, IR 113, Vrije Universiteit, 1986. [GRVB98] J.-R. Gruser, L. Raschid, M. E. Vidal and L. Bright: Wrapper Generation for Web Accessible Data Sources, COOPIS ’98: Proceedings of the 3rd IFCIS International Conference on Cooperative Information Systems, IEEE Computer Society, Washington, DC, USA, 1998, pages 14–23. [Java] Java.net: Glassfish, URL https://glassfish.dev.java. net/, [Online; Stand 9. Nov 2010]. 47 LITERATURVERZEICHNIS [Javb] Java.net: jdk, URL https://jdk.dev.java.net/, [Online; Stand 9. Nov 2010]. [Javc] Java.net: jini, URL https://jini.dev.java.net/, [Online; Stand 9. Nov 2010]. [KRW10] A. King, A. Ruder and A. Waterland: Git Community Book, Git Community, 2010. [KT02] S. Kuhlins and R. Tredwell: Toolkits for Generating Wrappers, NODe ’02: Revised Papers from the International Conference NetObjectDays on Objects, Components, Architectures, Services, and Applications for a Networked World, Springer-Verlag, London, UK, 2002, pages 184–198. [MB98] R. C. Miller and K. Bharat: SPHINX: a framework for creating personal, site-specific Web crawlers, Comput. Netw. ISDN Syst., volume 30(1-7), (1998), pages 119–130. [NH02] M. Najork and A. Heydon: High-performance web crawling, (2002), pages 25–45. [NW04] S. Northover and M. Wilson: Swt: the standard widget toolkit, volume 1, Addison-Wesley Professional, 2004. [PCSF08] C. Pilato, B. Collins-Sussman and B. Fitzpatrick: Version Control with Subversion, O’Reilly Media, Inc., 2008. [Soua] Sourceforge: 7-Zip, URL http://sourceforge.net/ projects/sevenzip/, [Online; Stand 9. Nov 2010]. [Soub] Sourceforge: Azureus / Vuze, URL http://sourceforge. net/projects/azureus/, [Online; Stand 9. Nov 2010]. [Souc] Sourceforge: bitTorrent, URL http://sourceforge.net/ projects/bittorrent/, [Online; Stand 9. Nov 2010]. [Soud] Sourceforge: eMule, URL http://sourceforge.net/ projects/emule/, [Online; Stand 9. Nov 2010]. [Soue] Sourceforge: gate, URL http://sourceforge.net/ projects/gate/, [Online; Stand 9. Nov 2010]. [Voß06] S. Voß: Extraktion semantischer Informationen aus WIKISystemen, Master’s thesis, Frankfurt am Main, 2006. [Wik10] Wikipedia: Repository — Wikipedia, Die freie Enzyklopädie, 2010, URL http://de.wikipedia.org/w/index. php?title=Repository&oldid=75614998, [Online; Stand 9. Juli 2010]. 48 Georg Bader