Ticketline RCP – Getting Started Guide Wolfgang Gruber Ticketline RCP Getting Started Guide Version 1.1 (03. April 2010) 1 / 33 Ticketline RCP – Getting Started Guide Inhaltsverzeichnis Einleitung...................................................................................................................................3 Installation.................................................................................................................................4 Voraussetzungen..........................................................................................................................4 Eclipse.........................................................................................................................................4 Subclipse.....................................................................................................................................6 ReviewClipse..............................................................................................................................7 Ticketline RCP............................................................................................................................9 Frameworks & Bibliotheken....................................................................................................11 Struktur von Ticketline RCP....................................................................................................12 Entity-Package.........................................................................................................................13 DAO-Package...........................................................................................................................14 Transaktionsmanagement..........................................................................................................15 Validierung................................................................................................................................16 Query Builder............................................................................................................................17 Log-Package.............................................................................................................................20 log4j-Wrapper...........................................................................................................................20 EclipseRcpLogAppender..........................................................................................................21 Kassa-Package.........................................................................................................................23 Anhang A: Links......................................................................................................................25 Eclipse RCP & SWT/JFace.......................................................................................................25 Java Persistence API (JPA).......................................................................................................26 Anhang B: FindBugs................................................................................................................27 Anhang C: Frequently Asked Questions.................................................................................29 Glossar.....................................................................................................................................32 2 / 33 Ticketline RCP – Getting Started Guide Einleitung Ticketline RCP bildet das Grundgerüst für die Gruppenphase von SEPM. Es handelt sich dabei um ein vorkonfiguriertes Projekt für Eclipse. Dies ermöglicht Ihnen die Entwicklung sofort mit einer vollständig lauffähigen Applikation zu beginnen, ohne sich mit dem Projektsetup beschäftigen zu müssen. Darüber hinaus wurden bereits einige Funktionen implementiert, um Ihnen das Zusammenspiel der einzelnen Komponenten zu demonstrieren. Dieser Guide soll Ihnen bei den ersten Schritten mit Ticketline RCP helfen. Er beginnt mit einer Installationsanleitung und stellt Ihnen im Anschluss die einzelnen Packages von Ticketline RCP vor, sowie deren Anwendung innerhalb der Applikation vor. Im Anhang finden Sie eine umfangreiche Linksliste, die Sie bei der Einarbeitung in die Technologien von Ticketline RCP unterstützen soll. Wir sind bemüht diesen Guide so gut wie möglich an die Bedürfnisse der Studenten anzupassen. Dazu benötigen wir jedoch Ihre Hilfe. Wenn Sie Anregungen, Fehler oder Kritikpunkte gefunden haben, so zögern Sie bitte nicht sie uns mitzuteilen. Entweder über Ihren Tutor oder per Mail an sepm (at) inso.tuwien.ac.at . Viel Spaß und gutes Gelingen mit Ticketline RCP 3 / 33 Ticketline RCP – Getting Started Guide Installation Voraussetzungen Voraussetzung für Ticketline RCP ist die Installation des Java 6 SDKs. Sie können sich das Installationspaket von der Java Website herunterladen. Eclipse Laden Sie von http://www.eclipse.org/downloads/ die Eclipse for RCP/Plug-in Developers IDE herunter und entpacken Sie sie in ein beliebiges Verzeichnis. In Eclipse müssen Sie nun EclipseLink und Dali nachinstallieren. Gehen Sie dazu in Eclipse auf Help → Install New Software... Wählen Sie unter Work with: Galileo - http://download.eclipse.org/releases/galileo 4 / 33 Ticketline RCP – Getting Started Guide Abbildung 1: Installation zusätzlicher Komponenten Wählen Sie folgende Punkte aus: EclipseRT Target Platform Components EclipseLink JPA Web, XML, and Java EE Development Dali Java Persistence Tools Dali Java Persistence Tools – EclipseLink Support (Optional) und installieren Sie die gewählten Komponenten. Nachdem bei Ticketline RCP ausschließlich mit SWT und JFace gearbeitet wird, können in der Code Completion die Packages java.awt und javax.swing ausgeblendet werden, um während der Entwicklung nicht zu stören. Dieser Schritt ist optional. Die Einstellungen finden Sie unter Window → Preferences → Java → Appearance → Type Filters. 5 / 33 Ticketline RCP – Getting Started Guide Abbildung 2: AWT- und Swing-Klassen ausblenden Fügen Sie mittels Add Packages... die Packages java.awt und javax.swing hinzu. Subclipse Gehen Sie zur Installation von Subclipse in Eclipse auf Help → Install New Software... und legen Sie über den Add...-Button eine neue Update Site mit folgenden Daten an: Name: Subclipse Location: http://subclipse.tigris.org/update_1.6.x Abbildung 3: Update Site für Subclipse 6 / 33 Ticketline RCP – Getting Started Guide Wählen Sie die drei angezeigten Punkte aus und installieren Sie Subclipse, in dem Sie den Next-Button anklicken. Abbildung 4: Subclipse Installation ReviewClipse Legen Sie in Eclipse auf Help → Install New Software... eine neue Update Site mit folgenden Daten an: Name: Location: ReviewClipse http://www.inso.tuwien.ac.at/projects/reviewclipse/update-site Abbildung 5: ReviewClipse Update Site Wählen Sie unter der Kategorie ReviewClipse die beiden Punkte aus: 7 / 33 Ticketline RCP – Getting Started Guide ReviewClipse ReviewClipse Subclipse Adapter und führen Sie die Installation durch. Abbildung 6: ReviewClipse Installation 8 / 33 Ticketline RCP – Getting Started Guide Ticketline RCP Als ersten Schritt müssen Sie Ticketline RCP unter Eclipse importieren. Wählen Sie dazu File → Import... → General → Existing Projects into Workspace. Abbildung 7: Ticketline RCP Projekt importieren Unter Select archive file wählen Sie die Ticketline RCP Zip-Datei und importieren das Projekt mit Finish. Starten Sie nun aus dem Ticketline RCP-Verzeichnis im Workspace die Ticketline Datenbank über folgenden Befehl: java -cp lib/hsqldb-1.8.1.1.jar org.hsqldb.Server -database.0 db/ticketline -dbname.0 ticketline 9 / 33 Ticketline RCP – Getting Started Guide Die Datenbank wird dabei im Unterverzeichnis db erstellt. Ticketline RCP kann nun über einen Rechtsklick auf das Projekt und Run As → Eclipse Application gestartet werden. Wenn Sie unter MacOS X entwickeln, beachten Sie bitte den zusätzlichen Konfigurationshinweis in den FAQs. Führen Sie in der „Künstler suchen“-View auf der linken Seite eine Suche durch. Dadurch werden die Tabellen in der Datenbank automatisch angelegt. Die Suche liefert zu diesem Zeitpunkt natürlich noch keine Ergebnisse zurück. Beenden Sie nun die Applikation wieder. Starten Sie den Datenbankmanager mit dem folgenden Befehl: java -cp lib/hsqldb-1.8.1.1.jar org.hsqldb.util.DatabaseManager -url jdbc:hsqldb:hsql://localhost/ticketline -user sa Im Datenbankmanager muss nun die Datei db-bugfix.sql ausgeführt werden, die eine Korrektur bei den automatisch erstellten Tabellen vornimmt. Sollten Sie die Tabellen zu einem späteren Zeitpunkt neu erstellen, so müssen Sie immer diese Datei einspielen, um Fehler in der Applikation zu vermeiden. Siehe hierzu auch die FAQ im Anhang. 10 / 33 Ticketline RCP – Getting Started Guide Frameworks & Bibliotheken Wie jedes größere Projekt in Java setzt auch Ticketline RCP eine Reihe von Frameworks und Bibliotheken ein. Die nachfolgende Tabelle stellt sie kurz vor: Eclipse RCP Framework für die Entwicklung von Desktop Applikationen Website: http://wiki.eclipse.org/index.php/Rich_Client_Platform EclipseLink Dient zur Speicherung von Entitäten in der Datenbank Website: http://www.eclipse.org/eclipselink/ Hibernate Validator Dient zur Validierung der Entitäten Website: https://www.hibernate.org/412.html Log4J Logging Bibliothek Website: http://logging.apache.org/log4j/1.2/index.html MigLayout (optional) Ein alternativer Layout-Manager Website: http://www.miglayout.com/ XStream (optional) Eine Bibliothek zur De-/Serialisierung von Objekten in bzw aus XML. Kann für den Im- und Export verwendet werden. Website: http://xstream.codehaus.org/ 11 / 33 Ticketline RCP – Getting Started Guide Struktur von Ticketline RCP Die folgende Abbildung zeigt die Packages von Ticketline RCP. Um die Darstellung zu vereinfachen wurden einige transitive Import-Beziehung weggelassen. So importiert z.B. at.ticketline.dao auch die Packages at.ticketline.dao.interfaces und at.ticketline.entity. Abbildung 8: Paket-Diagramm von Ticketline RCP In den weiteren Kapiteln werden die einzelnen Packages, sowie ihre Verwendung detailliert dargestellt. 12 / 33 Ticketline RCP – Getting Started Guide Entity-Package Das Entity-Package enthält alle Entitäten von Ticketline. Das nachfolgende UMLKlassendiagramm zeigt deren Beziehungen: Abbildung 9: Entitäten in Ticketline RCP 13 / 33 Ticketline RCP – Getting Started Guide DAO-Package Das Dao-Package, sowie alle Subpackages implementieren den Data Access Layer für Ticketline RCP. Es handelt sich dabei um eine vereinfachte Variante des DAO-Patterns wie es unter in den Core J2EE Patterns von Sun1 beschrieben ist. Das folgende vereinfachte UML-Klassendiagramm zeigt die Vererbungshierarchie innerhalb des Dao-Packages am Beispiel der Entität Artikel: Abbildung 10: Vererbung innerhalb des Dao-Package Jedes DAO besteht aus einem Interface aus dem Package at.ticketline.dao.interfaces, das die Methoden definiert, sowie der zugehörigen Implementierung im Package at.ticketline.dao.jpa. Als Persistenz-Framework wird dabei EclipseLink eingesetzt. EclipseLink ist eine die Implementierung der Java Persistence API (JPA), dem offiziellen Standard für Persistenz in der Java Enterprise Edition (Java EE). Das DAO-Package enthält außerdem eine Implementierung eines generischen DAOs (GenericDao und GenericDaoJpa) mit den wichtigsten Zugriffsmethoden. Die Beschreibung dieser Methoden befindet sich im Javadoc des Interface GenericDao. 1 DAO Pattern: http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html 14 / 33 Ticketline RCP – Getting Started Guide Um eine DAO verwenden zu können, muss sie mittels der Klasse DaoFactory erzeugt werden: ArtikelDao artikelDao = (ArtikelDao) DaoFactory.findDaoByEntityName(Artikel.class); Die DaoFactory sorgt dafür, dass das DAO instanziert und richtig initialisiert wird, in dem die mit @PostConstruct annotierte Methode aufgerufen wird. Außerdem erweitert es das DAO um Exception Wrapping, deklarative Transaktionen und das Handling des EntityManagers, so dass dieser automatisch zur Verfügung steht. DAOs sind nicht thread-safe, d.h. in jedem Thread, in dem eine DAO benötigt wird, muss diese über die DaoFactory erzeugt werden. Durch das Exception Wrapping werden von allen Methoden nur Exceptions vom Typ DaoException zurückgegeben. Dies soll verhindern, dass Exceptions aus unteren Schichten (zB SQLExceptions) in höheren Schichten auftauchen. Sollte trotzdem die ursprüngliche Exception benötigt werden, kann diese über die Methode getCause ermittelt werden. Bei der Entwicklung Ihrer Applikation werden Sie eigene Zugriffsmethoden benötigen. Diese Methoden müssen im jeweiligen Interface (zB ArtikelDao) definiert und in der Implementierung (zB ArtikelDaoJpa) implementiert werden. Transaktionsmanagement Durch die DaoFactory unterstützen die DAOs deklaratives Transaktionsmanagement. Um eine Methode der DAO in einer Transaktion auszuführen, genügt es die Annotation @Transactional auf der jeweiligen Methode im Interface zu setzen. Ein Beispiel hierfür wäre die Methode persist(E entity) im Interface GenericDao. Bevor diese Methode aufgerufen wird, wird eine Transaktion gestartet oder falls bereits eine Transaktion aktiv ist, wird diese weiterbenutzt. Nach Aufruf der Methode wird die Transaktion automatisch committed oder wenn von der Methode eine Exception geworfen wird, ein Rollback durchgeführt. Soll sich eine Transaktion über mehrere Aufrufe von DAO-Methoden erstrecken, muss das Transaktionsmanagement im Code erfolgen. Dies geschieht mit Hilfe der Klasse EntityManagerUtil, die die statischen Methoden startTransaction, commitTransaction und rollbackTransaction anbietet. In diesem Fall werden die Transactional-Annotationen 15 / 33 Ticketline RCP – Getting Started Guide ignoriert und die Transaktion erst mit commitTransaction abgeschlossen. ArtikelDao artikelDao = (ArtikelDao)DaoFactory.findDaoByEntity(Artikel.class); BestellungDao bestellungDao = (BestellungDao) DaoFactory.findDaoByEntity(Bestellung.class); EntityManagerUtil.startTransaction(); artikelDao.persist(artikel); bestellungDao.persist(bestellung); EntityManagerUtil.commitTransaction(); Validierung Die Methoden persist(Entity e) und merge(Entity e) führen vor dem Speichern eine Validierung der übergebenen Objekte durch. Der DAO-Layer von Ticketline setzt dazu Hibernate Validator2 als Bibliothek ein, die wiederum den Standard JSR-303 Bean Validation3 umsetzt. Die Constraints, die definieren, wann ein Wert als gültig anzusehen ist und wann nicht, werden in Form von Annotationen in den Entitäten gespeichert. In Ticketline werden nur die Standardannotationen des JSR-303 verwendet, die alle aus dem Package javax.validation.constraints stammen. Sollte ein Objekt ungültig sein, so werfen die Methoden persist und merge eine ConstraintViolationException. Aus dieser können die einzelnen Fehler ausgelesen werden wie der nächste Code-Abschnitt zeigt: try { artikelDao.persist(artikel); } catch (ConstraintViolationException e) { for (ConstraintViolation<?> cv : e.getConstraintViolations()) { System.out.println(cv.getPropertyPath() + " " + cv.getMessage()); 2 Hibernate Validator: https://www.hibernate.org/412.html 3 JSR-303 Bean Validation: http://www.jcp.org/en/jsr/detail?id=303 16 / 33 Ticketline RCP – Getting Started Guide } } Sollten Sie selbst ein Objekt validieren müssen, so können Sie mittels DaoFactory auf den Validator zugreifen: Validator validator = DaoFactory.getValidator(); Set<ConstraintViolation<Artikel>> violations = validator.validate(artikel); Query Builder Das Entwickeln von dynamischen Abfragen, wie sie zum Beispiel bei einer Suche nach mehreren Kriterien erforderlich ist, erweist sich in der Praxis als relativ aufwändig und gleichzeitig auch als fehleranfällig. In Ticketline RCP gibt es daher einen Query Builder, der die Entwicklung von dynamischen Abfragen in JPQL vereinfachen soll. Er bedient sich dabei eines Konzepts namens Fluent Interface4, bei dem Methodennamen an natürliche Sprache angelehnt sind und die Methodenaufrufe aneinandergekettet werden, so dass sich einfach zu lesende Statements ergeben. Das folgende Beispiel stammt aus KuenstlerJpaDao und zeigt den Aufbau einer Query: QueryBuilder qb = QueryBuilder.build() .select("k") .from("Kuenstler k") .whereAnd(nachname, vorname, geschlecht) .orderBy("k.nachname ASC"); Die Methoden select, from, groupBy und groupBy erhalten als String die jeweiligen Teile des Statements übergeben. Mit dem nachfolgenden Aufruf wird die eigentliche JPQLQuery erzeugt. Dabei werden alle Parameter automatisch gesetzt (wie weiter unten noch genauer beschrieben wird): 4 Fluent Interface: http://www.martinfowler.com/bliki/FluentInterface.html 17 / 33 Ticketline RCP – Getting Started Guide Query query = qb.createQuery(this.entityManager); List<Kuenstler> kuenstler = (List<Kuenstler>)query.getResultList(); Mittels Aufruf von qb.createQueryString() kann die erstellte Query auch als String zurückgegeben werden. Dies kann beim Debugging oder Logging genutzt werden. Der sicherlich interessanteste Teil am Query Builder sind jedoch die Expressions, mit deren Hilfe sich auf einfache Art und Weise die WHERE-Clauses erstellen lassen. Es gibt vier Expression-Typen wie das nachfolgende Klassendiagramm zeigt: Abbildung 11: Expression-Typen Die String-Expression nimmt einen einfachen String auf: Expression nachname = new StringExp("nachname = 'Leisch'"); Die Parameter-Expression kann einen Parameter enthalten, der mit einem Wert ersetzt wird. Sollte der Parameter null sein, so wird die Expression nicht angezeigt: Expression nachname = new ParameterExp("nachname = :nachname","Leisch"); Die MultiParameterExp kann mehrere Parameter enthalten, wobei die Parameter in einer Map übergeben werden müssen: 18 / 33 Ticketline RCP – Getting Started Guide Map<String,Object> parameters = new HashMap<String,Object>(); parameters.put("min",0); parameters.put("max",20); Expression mp = MultiParameterExp("k.value BETWEEN :max",parameters); :min AND Die ComplexExp stellt schliesslich eine Verknüpfung aus beliebig vielen Expressions dar. Diese können entweder mittels AND oder OR verbunden sein: Expression ce = new ComplexExpression(ComplexType.AND,nachname,vorname); Complex-Expressions lassen sich natürlich auch in anderen Complex-Expressions verwenden, so dass sich damit selbst komplizierte Ausdrücke erstellen lassen. Wie die folgende Tabelle zeigt bietet der Query Builder eine Reihe von Methoden an, mit denen die WHERE-Clause gesetzt werden kann: where(Expression e) fügt eine beliebige Expression ein where(String exp) entspricht einer StringExp where(String exp, Object parameter) entspricht einer ParameterExp where(String exp, Map<String, Object> parameters) entspricht einer MultiParameterExp whereAnd(Expression... e) entspricht einer ComplexExp, bei der die Expressions mit AND verknüpft werden whereOr(Expression... e) entspricht einer ComplexExp, bei der die Expressions mit OR verknüpft werden 19 / 33 Ticketline RCP – Getting Started Guide Log-Package Ticketline RCP enthält ein eigenes Log-Package, dass zwei Funktionen erfüllt: • einen Wrapper, um die Arbeit mit log4j zu erleichtern • einen speziellen LogAppender für log4j innerhalb von Eclipse Diese Funktionen werden in den beiden nachfolgenden Abschnitten beschrieben log4j-Wrapper Nach den best practices für log4j sollte eine Log-Ausgabe folgendermaßen aussehen: if (log.isTraceEnabled()) { log.trace("Bei Artikel " + id + " wurde der Preis von " + oldValue + " auf " + newValue + " erhöht"); } Eine Guard-Funktion checkt, ob der Log Level aktiviert ist und erst dann wird die Log Nachricht ausgegeben, da die String-Verkettung in Java relativ ineffizient ist und daher nach Möglichkeit vermieden werden sollte. Um den Source Code zu vereinfachen, bietet der von Ticketline RCP bereitgestellte Wrapper die Log-Methoden mit einer variablen Anzahl von Parametern an, so dass sich die Log Ausgabe auf folgende Zeile reduziert: log.trace("Bei Artikel #0 wurde der Preis von #1 auf #2 erhöht", id, oldValue, newValue); Es werden dabei maximal 10 Parameter unterstützt (#0 - #9). Werden mehr als 10 Parameter angegeben, so werden diese ignoriert. Ein komplettes Beispiel sieht folgendermaßen aus: 20 / 33 Ticketline RCP – Getting Started Guide public class Beispiel { protected static Logger log = LogFactory.getLogger(Beispiel.class); public void doSomething() { Beispiel.log.info("Hello #0","World"); } } Bitte achten Sie darauf, dass Sie in eigenen Klassen auch wirklich die Klasse at.ticketline.log.Logger importieren, da es im Classpath noch weitere Klassen mit dem Namen Logger geben kann. EclipseRcpLogAppender Die Rich Client Platform von Eclipse bringt bereits ein Logging-System mit. Die LogNachrichten werden dabei innerhalb des Workspace der RCP-Applikation in der Datei .log im Verzeichnis .metadata abgespeichert. Der EclipseRcpLogAppender dient als Brücke zwischen log4j und dem Logging-System von Eclipse, so dass die Log-Nachrichten, die mit log4j geloggt werden, in die Log-Datei von Eclipse geschrieben werden. Weiters können die Log-Nachrichten auch in einer eigenen Log View ausgegeben werden. In Ticketline RCP wird der EclipseRcpLogAppender bereits verwendet, so dass die nachfolgend beschriebenen Schritte nicht mehr durchgeführt werden müssen und lediglich als Referenz dienen. Die Konfiguration erfolgt über die Datei log4j.properties im Classpath der Applikation: log4j.appender.eclipse = at.ticketline.log.EclipseRcpLogAppender log4j.appender.eclipse.layout = org.apache.log4j.PatternLayout log4j.appender.eclipse.layout.ConversionPattern = %d %-5p %c - %m%n log4j.appender.eclipse.consoleView = true Der EclipeRcpLogAppender muss im Bundle-Activator mit dem Eclipse Logger initialisiert werden: 21 / 33 Ticketline RCP – Getting Started Guide EclipseRcpLogAppender.logger = Activator.getDefault().getLog(); EclipseRcpLogAppender.pluginId = Activator.PLUGIN_ID; Um die Log View anzuzeigen muss das Property consoleView in log4j.properties auf true gesetzt werden und die Console in der Perspektive angezeigt werden. Der nachfolgende Befehl fügt die Console der Perspektive hinzu: layout.addView(IConsoleConstants.ID_CONSOLE_VIEW, IPageLayout.BOTTOM, 0.70f, layout.getEditorArea()); Nachdem die Workbench nicht direkt ab Programmstart zur Verfügung steht, sondern erst erzeugt wird, werden die ersten Meldungen nur in die Log-Datei geschrieben, nicht jedoch in der Log Console ausgegeben. Abbildung 12: Log Console 22 / 33 Ticketline RCP – Getting Started Guide Kassa-Package Das Kassa-Package, sowie dessen Subpackages enthält die Klassen für die RCPAnwendung. Nachdem das Zusammenspiel der Klassen anfangs etwas verwirrend sein kann, wird in diesem Abschnitt ein kurzer Überblick über die Klassen gegeben. Activator: Diese Klasse wird als erste Klasse instanziert und ausgeführt, wenn das Plugin bzw die RCP-Anwendung gestartet wird, sowie als letzte, wenn das Plugin beendet wird. Dabei werden die Lifecycle-Methoden start(BundleContext) bzw stop(BundleContext) aufgerufen, die zum Initialisieren bzw Aufräumen verwendet werden können. Über die Klasse können auf die Preferences des Plugins, sowie Dialog-Einstellungen und die ImageRegistry zugegriffen werden. Da es vorgesehen ist diese Klasse als Singleton zu verwenden, kann mittels statischer Methode getDefault() von überall aus der Anwendung auf die aktuelle Instanz zugegriffen werden. TicketlineApplication: Die TicketlineApplication bildet die Hauptklasse der Applikation. Sie wird automatisch gestartet und die start-Methode aufgerufen. Darin wird die Workbench der RCPApplikation gestartet. ApplicationWorkbenchAdvisor: Die ApplicationWorkbenchAdvisor-Klasse dient zum Konfigurieren der Workbench. Sie definiert eine Reihe von Methoden, die zu bestimmten Zeitpunkten im Lifecycle der Workbench aufgerufen werden, zB initialize() oder preStartup(). Sie wird in der Klasse TicketlineApplication verwendet, um die Workbench zu erzeugen. ApplicationWorkbenchWindowAdvisor: Die ApplicationWorkbenchWindowAdvisor-Klasse wird vom ApplicationWorkbenchAdvisor erzeugt und dient zum Konfigurieren des Fensters der Workbench, in dem sie eine Reihe von Methoden definiert, die zu bestimmten Zeitpunkten im Lifecycle des Fensters der Workbench aufgerufen werden. ApplicationActionBarAdvisor: Die ApplicationActionBarAdvisor-Klasse wird vom ApplicationWorkbenchWindowAdvisor erzeugt und dient zum Erzeugen und Konfigurieren der Menüleiste, der Cool Bar und der Statuszeile. KassaPerspective: 23 / 33 Ticketline RCP – Getting Started Guide Die KassaPerspective wird defaultmässig von Ticketline RCP angezeigt und konfiguriert die Oberfläche der Applikation, dh welche Views und Editoren dargestellt werden. Die Subpackages sind nach ihrem Verwendungszweck eingeteilt. So sollten Views im ui.views-Package angelegt werden, Editors im ui.editors-Package, usw. Abbildung 13: Ticketline RCP Applikation Folgende Funktionen stellt die Ticketline RCP bereit: • Künstler importieren • Neuen Künstler anlegen • Künstler suchen • Künstler bearbeiten • Künstler löschen Machen Sie sich mit dem zur Verfügung gestelltem Source Code vertraut, da er bereits sehr viel der Funktionalität enthält, die Sie auch für die weitere Implementierung benötigen. 24 / 33 Ticketline RCP – Getting Started Guide Anhang A: Links Eclipse RCP & SWT/JFace Eclipse Hilfe http://help.eclipse.org/ oder direkt in Eclipse unter Help -> Help Contents -> Platform Plug-in Developer Guide Artikel auf eclipse.org http://www.eclipse.org/articles/ SWT Hauptseite http://www.eclipse.org/swt/ SWT FAQ (enthält Hinweise wie Eclipse unter verschiedenen Betriebssystemen läuft) http://www.eclipse.org/swt/faq.php SWT - Widget Übersicht http://www.eclipse.org/swt/widgets/ Understanding Layouts in SWT http://www.eclipse.org/articles/article.php?file=Article-UnderstandingLayouts/index.html Eclipse RCP FAQ http://wiki.eclipse.org/RCP_FAQ Eclipse RCP HowTos http://wiki.eclipse.org/Eclipse_RCP_How-to Plug-in development 101, Part 2: Introducing rich-client applications http://www.ibm.com/developerworks/opensource/library/os-eclipse-plugindev2/ 25 / 33 Ticketline RCP – Getting Started Guide Eclipse RCP Tutorial http://eclipse.org/articles/Article-RCP-1/tutorial1.html Sammlung von Artikeln zu Eclipe http://www.vogella.de/eclipse.html RCP Buch http://www.ralfebert.de/rcpbuch/ Eclipse Forms http://www.eclipse.org/articles/Article-Forms/article.html Java Persistence API (JPA) Introduction to the Java Persistence API (aus The Java EE 5 Tutorial) http://java.sun.com/javaee/5/docs/tutorial/doc/bnbpz.html Master the New Persistence Paradigm with JPA http://www.devx.com/Java/Article/33650/1954 Understanding JPA, Part 1: The object-oriented paradigm of data persistence http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html Java Persistence API (JPA) with EclipseLink-Tutorial http://www.vogella.de/articles/JavaPersistenceAPI/article.html EclipseLink User Guide http://wiki.eclipse.org/EclipseLink/UserGuide/Developing_JPA_Projects_%28ELUG %29 Java Persistence API Javadoc http://java.sun.com/javaee/5/docs/api/index.html?javax/persistence/packagesummary.html JPA Annotation Referenz http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpaannotations.html 26 / 33 Ticketline RCP – Getting Started Guide Anhang B: FindBugs Bei FindBugs handelt es sich ein Tool zur statischen Source Code Analyse, dh der Source Code wird auf mögliche Probleme oder Fehler untersucht, ohne ihn dabei auszuführen. Zu FindBugs gibt es ein Eclipse-Plugin, dessen Installation und Anwendung in diesem Kapitel gezeigt wird. Gehen Sie in Eclipse auf Help → Install New Software und fügen Sie mittels Add... eine neue Installationsseite hinzu. Geben Sie als Location http://findbugs.cs.umd.edu/eclipse ein. Abbildung 14: FindBugs Site Wählen Sie nun FindBugs auf der Installationsseite und setzen Sie die Installation im Wizard fort. Nach der Installation sollten Sie Eclipse wie empfohlen neu starten. Über Window → Show View → Other kann nun der Bug Explorer geöffnet werden. Nachdem mittels Rechtsklick auf das Projekt und dann Find Bugs → Find Bugs der ScanVorgang durchgeführt wurde, werden die potentiellen Probleme wie in der nachfolgenden Abbildung zu sehen im Bug Explorer angezeigt. Achtung: FindBugs findet natürlich nicht jeden Fehler und nicht jedes der angezeigten potentiellen Probleme muss auch zwangsläufig ein Fehler sein! 27 / 33 Ticketline RCP – Getting Started Guide Abbildung 15: FindBugs Explorer 28 / 33 Ticketline RCP – Getting Started Guide Anhang C: Frequently Asked Questions Wo finde ich Informationen zu SWT und RCP? Im Hilfesystem unter Help → Help Contents gibt es eine eigene Kategorie Platform Plug-in Developer Guide, der eine Einführung für RCP bietet. Im Unterpunkt Reference → API Reference befindet sich das Javadoc von RCP. Wie kann ich Subversion in Eclipse benutzen? Es gibt zwei Plugins für Eclipse: Subclipse: http://subclipse.tigris.org/ Subversive: http://www.polarion.org/index.php?page=overview&project=subversive Nach dem Import des Projekts werden in einigen Dateien fehlende Klassen angezeigt Bei unterschiedlichen Eclipse-Versionen kann es sein, dass Abhängigkeiten zu anderen Plugins nicht aufgelöst werden können, da sich die Versionsnummern der Plugins unterscheiden. Öffnen Sie mit Doppelklick die plugin.xml-Datei und wechseln Sie auf den Reiter Dependencies. Unter Required Plug-ins werden die Abhängigkeiten aufgelistet. Entfernen Sie das Plugin, aus dem die fehlende Klasse stammt, und fügen Sie es über den Add...-Button mit der richtigen Version wieder hinzu. Wie entwickle ich am Besten einen Login-Dialog? Es gibt hierfür den Extension Point org.eclipse.ui.splashHandlers, sowie die Klassen im Package org.eclipse.ui.splash für die Implementierung. Wie kann ich das Javadoc für Ticketline RCP erstellen? Unter File → Export... → Java → Javadoc können Sie das Javadoc für das aktuelle Projekt generieren lassen. Wie kann ich eine Java Bibliothek (JAR-Datei) in das Projekt hinzufügen? Kopieren Sie die JAR-Datei ins lib-Verzeichnis und aktualisieren Sie das Projekt (F5 oder Rechtsklick auf das Projekt und Refresh) Anschließend muss die Jar-Datei zum Build Path hinzugefügt werden. Rechtsklicken Sie hierzu auf das Projekt und wählen Sie Properties. Unter Java Build Path → Libraries können Sie die Datei über Add JARs... 29 / 33 Ticketline RCP – Getting Started Guide Als letzter Schritt muss die Jar-Datei in die RCP-Applikation eingebunden werden. Doppelklicken Sie die plugin.xml-Datei im Projekt und wählen Sie Runtime aus. In der rechten unteren Ecke unter Classpath können Sie die Bibliothek mit Add... hinzufügen. Speichern Sie danach plugin.xml. Was muss ich tun, um Ticketline RCP unabhängig von Eclipse starten zu können? Sie müssen dazu Ticketline RCP exportieren. Rechtsklicken Sie auf das Projekt oder öffnen Sie das Menü für File und wählen Sie jeweils den Punkt Export... Im Fenster wählen Sie nun Plug-in Development → Eclipse product, um den Export-Wizard zu starten. Was muss ich bei der Installation unter MacOS beachten? Von SWT gibt es bisher nur eine 32-Bit-Variante. Wenn ihr Computer daher einen 64-BitProzessor besitzt, müssen Sie die Java Virtual Machine so konfigurieren, dass sie im 32Bit-Modus läuft. Rechtsklicken Sie hierzu auf ihr Projekt und wählen Sie dann Run As → Run Configurations. Wählen Sie unter Eclipse Application die Konfiguration für Ticketline RCP (falls diese noch nicht vorhanden ist, starten Sie Ticketline RCP wie bei der Installation angegeben) und tragen Sie im zweiten Reiter Arguments unter VM arguments -d32 ein. Abbildung 16: Run Konfiguration für MacOS 64-Bit Warum muss die Datei db-bugfix.sql in die Datenbank eingespielt werden? Wenn Sie mittels EclipseLink eine neue Entität in die Datenbank einfügen, wird dessen ID automatisch gesetzt. Dies erfolgt in Ticketline RCP durch die IDENTITY-Definition der Datenbanktabelle. Das Problem dabei ist, dass die IDENTITY den ersten Datensatz mit der 30 / 33 Ticketline RCP – Getting Started Guide ID 0 einfügt. Die ID 0 wird von EclipseLink jedoch als null interpretiert und liefert daher die Exception EclipseLink-7197: Null primary key encountered in unit of work clone Bug-Report: https://bugs.eclipse.org/bugs/show_bug.cgi?id=297198 Wenn die Applikation beendet wird, wird eine eine SWTException (Device is disposed) angezeigt? Was läuft da schief? Gar nichts. Ab einem bestimmten Zeitpunkt kann der EclipseRcpLogAppender die Log Messages nicht mehr auf die Log Console ausgeben, da sie bereits geschlossen wurde. Daher wird eine Exception geworfen und ausgegeben. Wenn ich eine Datenbankabfrage starte, bekomme ich immer folgende Exception: Internal Exception: java.sql.SQLException: No suitable driver found for jdbc:hsqldb:hsql://localhost/ticketline Diese Exception hat nicht zwangsläufig etwas mit einem fehlenden JDBC-Treiber zu tun. Sie wird immer geworfen, wenn es Probleme mit der Datenbankverbindung gibt. Stellen Sie daher sicher, dass die Datenbank wirklich läuft und prüfen Sie, ob Sie sich mit dem DatabaseManager verbinden können. Welche Version der Java Persistence API wird verwendet? In Ticketline RCP wird JPA 1.0 verwendet. Es gibt inzwischen eine Version 2.0 von JPA, die eine Weiterentwicklung von JPA 1.0 darstellt und diese um neue Features erweitert. Zum Beispiel enthält JPA 2.0 standardmäßig die Bean Validation, die in Ticketline RCP noch manuell eingebaut wurde. 31 / 33 Ticketline RCP – Getting Started Guide Glossar Bundle Ein Modul bzw eine Komponente für OSGi Data Access Object (DAO) Design-Pattern, bei dem alle Datenbankzugriffe in einem Interface und einer Implementierung gekapselt werden. EclipseLink Implementierung der JPA-Spezifikation von Eclipse Equinox Implementierung der OSGi-Spezifikation von Eclipse, bildet den Kern von Eclipse Extension Eine Erweiterung der Funktionalität, eines bestimmten Extension Points. Erweitert zumeist eine Klasse oder ein Interface, das vom Extension Point definiert wird. Extension Point Definierter Punkt, der durch eine Extension mit zusätzlicher Funktionalität erweitert werden kann (zB einfügen eines Menüpunkts in ein Menü) Factory Design-Pattern, bei dem eine Factory-Klasse für das Erzeugen und Konfigurieren von Objekten dient. Feature Sammlung von Plugins JFace Erweiterung von SWT, um höherwertige Funktionen Java Persistence API (JPA) Offizielle Java-Spezifikation (JSR 220) für das Mapping von Objekten auf das relationale Datenmodell von Datenbanken (ORM) Lifecycle Lebenszyklus von Service-Objekte, die über einen längeren Zeitraum existieren (zB vom Starten bis zum Beenden einer Applikation). Diese bieten zumeist spezielle Methoden, die im Laufe des Lebenszyklus aufgerufen werden (zB init oder close) OSGi Ein dynamisches Modulsystem für Java 32 / 33 Ticketline RCP – Getting Started Guide Perspektive Definiert das Aussehen der Workbench, dh welche Views und Editoren angezeigt werden, sowie deren Position und Größe. Plugin Ein Modul bzw eine Komponente in Eclipse, Erweiterung von OSGi-Bundles Rich Client Platform (RCP) Framework für Applikationen. Singleton Pattern, bei dem es in einer Applikation von einem Objekt nur eine einzige Instanz gibt. Standard Widget Toolkit (SWT) Das Low-Level User Interface Toolkit von Eclipse, das die Elemente der grafischen Oberfläche beinhaltet. Alternative zu AWT/Swing Workbench Bildet die Basis für das User Interface von RCPApplikationen Workspace Verzeichnis, in welchem die Workbench Informationen ablegt. In Eclipse enthält es die Projektverzeichnisse. 33 / 33 die Entwicklung von Desktop-