Separates Deployment von Produktdaten Cornelius Dirmeier (Dokumentversion 47)



Ähnliche Dokumente
Handbuch. timecard Connector Version: REINER SCT Kartengeräte GmbH & Co. KG Goethestr Furtwangen

Übung: Verwendung von Java-Threads

Dokumentation zum Spielserver der Software Challenge

Installationsanleitung für CashPro im Mehrbenutzerzugriff/Netzwerkbetrieb

OP-LOG

Anwendungshinweis Nr. 12. Wie konfiguriere ich redundante Serververbindungen

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

Auto-Provisionierung tiptel 30x0 mit Yeastar MyPBX

Über die Internetseite Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

BüroWARE Exchange Synchronisation Grundlagen und Voraussetzungen

Um ein solches Dokument zu erzeugen, muss eine Serienbriefvorlage in Word erstellt werden, das auf die von BüroWARE erstellte Datei zugreift.

4D Server v12 64-bit Version BETA VERSION

Installation von NetBeans inkl. Glassfish Anwendungs-Server

EasyWk DAS Schwimmwettkampfprogramm

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Konfigurationslanleitung für J2EE und Eclipse im KBS-Pool

Speicher in der Cloud

Neue Funktionen im GUI für PC-DMIS V3.x 4.x Seite 1 von 8

Task: Nmap Skripte ausführen

5.2 Neue Projekte erstellen

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Einfache und effiziente Zusammenarbeit in der Cloud. EASY-PM Office Add-Ins Handbuch

Datensicherung. Beschreibung der Datensicherung

Möglichkeiten des Parallelbetriebs der VR-NetWorld Software Parallelbetrieb VR-NetWorld Software 4.4x und Version 5.0 ab der 2. Beta!

Betriebshandbuch. MyInTouch Import Tool

Lizenzierung von System Center 2012

Tapps mit XP-Mode unter Windows 7 64 bit (V2.0)

ERSTELLEN VON INCENTIVES IM ZANOX NETZWERK

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel

Whitepaper. Produkt: address manager David XL Tobit InfoCenter AddIn für den address manager Zuordnung

Nutzung von GiS BasePac 8 im Netzwerk

Installation der SAS Foundation Software auf Windows

Synchronisations- Assistent

Version NotarNet Bürokommunikation. Bedienungsanleitung für den ZCS-Import-Assistenten für Outlook

Lizenzen auschecken. Was ist zu tun?

Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite.

ecaros-update 8.2 Update 8.2 procar informatik AG 1 Stand: DP 02/2014 Eschenweg Weiterstadt

Eigenen WSUS Server mit dem UNI WSUS Server Synchronisieren

Installation OMNIKEY 3121 USB

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser

SANDBOXIE konfigurieren

FlowFact Alle Versionen

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

Tutorial -

Windows 8 Lizenzierung in Szenarien

MailUtilities: Remote Deployment - Einführung

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Anleitung mtan (SMS-Authentisierung) mit SSLVPN.TG.CH

Verwendung des Terminalservers der MUG

Adminer: Installationsanleitung

Artikel Schnittstelle über CSV

Anwenderdokumentation AccountPlus GWUPSTAT.EXE

dpa-infocom - Datenlieferung

1 Einleitung. Lernziele. Symbolleiste für den Schnellzugriff anpassen. Notizenseiten drucken. eine Präsentation abwärtskompatibel speichern

ICS-Addin. Benutzerhandbuch. Version: 1.0

icloud nicht neu, aber doch irgendwie anders

Benutzerhandbuch. Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer.

Updatehinweise für die Version forma 5.5.5

Durchführung der Datenübernahme nach Reisekosten 2011

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Anleitung zum erstellen einer PDF-Datei aus Microsoft Word

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI

Reporting Services und SharePoint 2010 Teil 1

HOWTO Update von MRG1 auf MRG2 bei gleichzeitigem Update auf Magento CE 1.4 / Magento EE 1.8

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Visual Basic Express Debugging

Um zu prüfen welche Version auf dem betroffenen Client enthalten ist, gehen Sie bitte wie folgt vor:

Herzlich Willkommen bei der nfon GmbH

Internet online Update (Internet Explorer)

DOKUMENTATION VOGELZUCHT 2015 PLUS

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Erstellen einer PostScript-Datei unter Windows XP

DNS-325/-320 und FXP

Clientkonfiguration für Hosted Exchange 2010

OUTLOOK (EXPRESS) KONFIGURATION POP3

Flashfragen in ILIAS Test & Assessment. Helmut Schottmüller

Elexis-BlueEvidence-Connector

Lizenzierung von SharePoint Server 2013

Firewalls für Lexware Info Service konfigurieren

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Ablaufbeschreibung für das neu Aufsetzen von Firebird und Interbase Datenbanken mit der IBOConsole

! " # $ " % & Nicki Wruck worldwidewruck

Wissenswertes über LiveUpdate

ARAkoll 2013 Dokumentation. Datum:

Anleitung zur Installation von Thunderbird

Anleitung BFV-Widget-Generator

Whitepaper. Produkt: combit address manager / combit Relationship Manager. Datenabgleich zwischen Notebook und Desktop-PC / Server

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

virtuos Leitfaden für die virtuelle Lehre

Inhalt... 1 Einleitung... 1 Systemanforderungen... 1 Software Download... 1 Prüfdokumentation... 4 Probleme... 5 Hintergrund... 5

TECHNISCHE INFORMATION LESSOR LOHN/GEHALT BEITRAGSNACHWEIS-AUSGLEICH BUCH.-BLATT MICROSOFT DYNAMICS NAV

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Die Backup-Voreinstellungen finden Sie in M-System Server unter dem Reiter "Wartung".

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: )

Handbuch B4000+ Preset Manager

Transkript:

Separates Deployment von Produktdaten Cornelius Dirmeier (Dokumentversion 47) Einleitung Faktor-IPS verwaltet Produktdaten während der Produktentwicklung in XML Dateien. Zur Laufzeit liegen die Produktdaten in XML-Ressourcen vor, Formeln werden in Java-Klassen generiert. Die XML-Ressourcen werden meist in Bibliotheken (z.b. JAR-Dateien) zusammengefasst. Um die Produktdaten zu laden, müssen sie zur Laufzeit im Classpath der Applikation verfügbar sein. Innerhalb einer Applikation kann auf die Produktdaten über ein Runtime Repository (z.b. ClassloaderRuntimeRepository) zugegriffen werden. Diese Aufteilung wird in Abbildung 1 verdeutlicht. Abbildung 1: Bisher wurden Programmcode und Produktdaten in einer gemeinsamen Applikation ausgeliefert Da sowohl Programmcode als auch Produktdaten als Dateien vorliegen, können sie zusammen in einem Werkzeug wie CVS oder Subversion gespeichert werden. Eine fertige Version von Programmcode und Produktdaten wird dann in eine Zielumgebung transportiert. Im JavaEE Umfeld wird dazu ein Enterprise Archive (EAR) bzw. ein Web Application Archive (WAR) erzeugt. Werden die Produktdaten verändert oder erweitert muss dieses Archiv ausgetauscht werden. Da Produktdaten und Programmcode eine Einheit bilden, muss auch der Programmcode neu ausgeliefert werden. Ziel des separaten Deployments von Produktdaten ist es, bei einer Änderung der Produktdaten nur die XML-Ressourcen auszutauschen ohne den Programmcode neu ausliefern zu müssen. Die dabei auftretenden Herausforderungen und die daraus entwickelten Lösungen werden in diesem Dokument vorgestellt. Faktor Zehn AG 1

Herausforderungen In diesem Kapitel werden zunächst die Herausforderungen, die sich auf dem Weg zum getrennten Deployment von Produktdaten ergeben aufgezeigt. Im darauf folgenden Kapitel werden die gewählten Lösungen im Detail vorgestellt. Runtime Repository Für den Zugriff auf die Produktdaten steht in Faktor-IPS zur Laufzeit das Interface IRuntimeRepository zur Verfügung. Wie bereits einleitend erwähnt wird meist die Implementierung ClassloaderRuntimeRepository verwendet. Dieses lädt die Produktdaten über den Klassenpfad als Ressourcen. Um die Produktdaten unabhängig vom Programmcode zu halten muss zunächst ein Repository entwickelt werden, das die Produktdaten unabhängig vom Klassenpfad der Applikation laden kann. Die später vorgestellte Lösung greift dazu auf einen Produktdaten-Service in Form eines EJB 3.0 Stateless Session Beans zu; die Verwendung einer Datenbank ist ohne großen Aufwand möglich. Ausführen von Formeln In Faktor-IPS ist es möglich Formeln in einer einfachen Formelsprache in einem Produktbaustein einzugeben. In den Modellklassen wird lediglich die Signatur der Formel festgelegt, die Berechnungsvorschriften liegen in den Produktdaten. Um diese Formeln zur Laufzeit auszuführen werden sie vom Faktor-IPS-Codegenerator in Java-Code übersetzt. Dazu wird für jede Anpassungsstufe eines Produktbausteins eine Subklasse erzeugt in der die Methode der Formel überschrieben wird. Das Runtime Repository ist so aufgebaut, dass es jeweils die korrekte Implementierung zu einem Produktbaustein lädt. Abbildung 2: Subklassen mit übersetzten Formeln am Beispiel aus dem Faktor-IPS Tutorial Teil 2 Werden nun die Produktdaten durch einen separaten Service abgerufen, muss nach diesem Ansatz auch die Implementierung über den Service abgerufen werden. Ändert sich in einer neuen Version der Produktdaten eine Formel, muss damit auch die Implementierung ausgetauscht werden. Der Classloader von Java sieht jedoch keinen Austausch von Klassen während des Betriebs vor. Das Erzeugen eigenes Classloaders ist innerhalb von EJBs gemäß Spezifikation nicht erlaubt. Eine Herausforderung beim separaten Deployment der Produktdaten ist es daher, die Formeln nicht wie bisher in Subklassen zu kompilieren sondern zur Laufzeit zu interpretieren. Die Produktdaten werden dadurch frei von Programmcode. Faktor Zehn AG 2

Konsistenter Zustand der Daten während einer Anfrage Datenkonsistenz während des Austauschs der Produktdaten Mit dem separaten Deployment von Produktdaten soll es möglich sein, ohne Unterbrechung der Anwendung neue Produktdaten auszuliefern. Bezüglich des Produktdaten-Service kann hierzu das Hot-Deployment des Applikationsservers verwendet werden. Die Konsistenz der Produktdaten innerhalb eines fachlichen Services kann alleine damit aber nicht gewährleistet werden. Nehmen wir als Beispiel einen Service zur Beitragsberechnung für eine Police. Zur Berechnung des Beitrags wird auf viele verschiedene Produktbausteinen zugegriffen (Produkt, Deckungen, Zuschläge/Nachlässe) etc. Der Berechnungsservice ruft also während seiner Durchführung diese Produktinformationen vom Repository ab. Um keine falschen Ergebnisse zu liefern, muss der Service auf konsistenten Produktdaten arbeiten. Werden während der Servicedurchführung die Produktdaten ausgetauscht, darf dies nicht dazu führen, dass der Service mit einer Mischung aus alten und neuen Daten arbeitet. Das Repository muss also entweder in der Lage sein, weiterhin die alten Daten zu liefern (z.b. wenn die Daten noch im Cache liegen) oder eine Exception zu werfen, damit die Serviceausführung abgebrochen wird. Darüber hinaus muss bei der Lösung berücksichtigt werden, dass Service-Requests (z. B. Beitragsberechnungen) gleichzeitig ausgeführt werden. Die folgenden Abbildung verdeutlicht dies. Abbildung 3: Beispiel zur Datenkonsistenz beim Austausch von Produktdaten Während der Ausführung von Client 1 1 wurden bereits die Produktbausteine P1 und D1 geladen. Dann wurde die Produktdaten ausgetauscht. Wird nun D2 angefordert, darf nicht die neue Version D2' verwendet werden. Client 2 beginnt dagegen die Ausführung erst nachdem die Produktdaten ausgetauscht wurden. Es ist also kein Problem, den Produktbaustein D2' zurückzugeben. Das Runtime Repository muss also wissen, welche seiner Clients bereits mit den neuen Daten arbeiten und welche auf dem alten Stand sind. 1 Als Client bezeichnen wir ein Programm, das Produktdaten abruft also der Client des Runtime Repositories Faktor Zehn AG 3

Lösungen Architektur-Überblick Um die im folgenden vorgestellte Lösung zu verwenden, werden die Runtime Addons 2 von Faktor-IPS benötigt. Das Archiv kann über die Download-Site 3 heruntergeladen werden. Wie bereits in der Einleitung erwähnt, betrachten wir die Auslieferung in einem Java EE Umfeld. Die Applikation und der Produktdatenprovider werden als Services implementiert und in einem EAR ausgeliefert. Wie bisher wird der Programmcode mit den Modellklassen in einem Archiv gekapselt. Anstatt des ClassloaderRuntimeRepositories wird eine neue Implementierung des Interfaces IRuntimeRepository verwendet: das DerivedContentRuntimeRepository. Dieses ruft zum Laden der Produktdaten einen separaten Service auf, den Product-Data-Service. Im Klassenpfad des Product-Data-Service sind die Produktdaten weiterhin als XML-Ressourcen enthalten und können vom Service als Ressourcen geladen werden. Abbildung 4: Die Produktdaten werden in einem separaten Service ausgeliefert der vom Runtime Repository verwendet wird Der Product-Data-Service ist als Stateless Session Bean (SLSB) implementiert. Die Produktdaten werden als XML-Ressourcen geladen, der Inhalt wird an das Runtime Repository übergeben. Die Instantiierung findet weiterhin im Runtime Repository statt. Interpretation von Formeln Anstatt die Formeln als Java-Code in Subklassen zu generieren kann der Java-Code der übersetzten Formeln ab Version 3.0 auch direkt in die XML Dateien der Produktdaten geschrieben werden. Diese Option wird in den Einstellungen für den Faktor-IPS Code Generator unter der Option Formula Compiling eingestellt. Als Standard wird der Java-Code sowohl in Subklassen als auch in das XML geschrieben - zur Laufzeit kann damit sowohl das alte als auch das neue Runtime Repository verwendet werden. 2 Dateiname des Archivs: faktorips-runtime-addons-[version].zip 3 http://update.faktorzehn.org/faktorips/cgi/download.pl?subfolder=v3 Faktor Zehn AG 4

Zur Laufzeit wird der Java-Code aus den XML-Dateien gelesen und von Groovy 4 ausgeführt. Die Produktdaten enthalten dadurch keine Java Klassen und sind damit unabhängig vom Classloader der Applikation. Konsistenter Zustand der Daten während einer Anfrage Um innerhalb einer Anfrage einen konsistenten Datenstand zu gewährleisten, ist es notwendig, dass ein Client den Beginn seiner Anfrage ankündigt. Nach dem optimistischen Locking Verfahren kann die Anfrage abgearbeitet werden bis es zu einem Fehler kommt. Wenn ein Fehler auftritt muss die Anfrage verworfen und evtl. neu gestartet werden. Da der Austausch von Produktdaten nicht besonders oft auftritt, ist das optimistische Locking Verfahren völlig ausreichend. Um dieses Locking zu realisieren wird ein Runtime Repository Manager eingeführt. Jeder Client erhält zunächst anstatt des Runtime Repositories einen Manager. Möchte ein Client eine neue Anfrage starteten, ruft er die Methode getactualruntimerepository() am Manager auf. Der Manager liefert daraufhin ein Runtime Repository mit dem der Client auf den aktuell gültigen Produktdaten arbeiten kann. Vor der nächsten Anfrage holt sich der Client erneut das aktuelle Repository. Haben sich die Produktdaten nicht geändert, wird das gleiche Repository zurück gegeben. Dieser Ablauf ist im Sequenzdiagramm in Abbildung 5 abgebildet. Abbildung 5: Der Client holt sich vor Beginn einer Anfrage das aktuelle Runtime Repository; solange sich keine Daten ändern arbeitet er auf dem gleichen Repository weiter. 4 http://groovy.codehaus.org/, Version 1.6.0 Faktor Zehn AG 5

Werden während der Ausführung des Clients die Produktdaten im Produktdatenservice ausgetauscht wirft das Runtime Repository beim nächsten Abruf von Produktdaten eine DataModifiedRuntimeException. Der Client muss daraufhin seine Anfrage verwerfen. Um eine neue Anfrage mit geänderten Produktdaten zu starten wird vom Manager ein neues Repository geholt. Der Manager stellt die geänderten Produktdaten fest und erzeugt ein neues Runtime Repository. Der Client arbeitet nun auf den neuen Produktdaten. Dieses Verhalten ist im Sequenzdiagramm in Abbildung 6 dargestellt. Abbildung 6: Der Manager stellt fest, dass sich die Produktdaten geändert haben und erstellt ein neues Runtime Repository Um die Performance der Abfragen zu erhöhen, enthalten Runtime Repositories einen Cache und speichern darin bereits abgefragte Produktdaten. Um die Zahl der Abbrüche beim Austausch von Produktdaten weiter zu verringern wurde das Runtime Repository so entwickelt, dass es nur beim Abruf Produktdaten, die nicht im Cache sind einen Fehler wirft - solange der Client nur auf Produktdaten im Cache zugreift, kann er dadurch seine Anfrage zu ende führen. Auch der gleichzeitige Zugriff mehrerer Client ist mit dieser Lösung kein Problem. der Abruf des aktuellen Runtime Repositories und der gemeinsam genutzte Cache sind Threadsicher implementiert. In der Client-Implementierung ist es sinnvoll, einen Manager an zentraler Stelle zu konfigurieren, damit alle Clients auf den gleichen Manager zugreifen. Zur Instantiierung des DetachedContentRuntimeRepositoryManager wird ein Builder 5 verwendet. Der Builder ist als innere Klasse des Repository Managers realisiert und erwartet eine Implementierung von IProductDataProviderFactory zum instantiieren des Product-Data-Providers. Optional kann man im Builder weitere Voreinstellungen treffen. Insbesondere eine Implementierung von IFormulaEvaluatorFactory 6 zum Ausführen der Formeln sollte gesetzt werden. Ist der Builder 5 Dieser Builder ist nach Item 2 im Buch Effective Java von Joshua Bloch [1] erstellt und weicht vom bekannten Builder Design Pattern ab. 6 z.b. GroovyFormulaEvaluatorFactory zur Ausführen der Formeln mit Groovy (in den Addons enthalten) Faktor Zehn AG 6

fertig konfiguriert, wird die Methode build() aufgerufen - als Ergebnis erhält man einen DetachedContentRuntimeRepositoryManager. Ein Beispiel zur Instantiierung des Managers wird im Kapitel 5.2 gegeben. Verknüpfen mehrerer Repositories In den meisten Fällen werden Modell- und Produktdaten in mehrere Projekte untergliedert. Für den Zugriff auf die Daten muss zur Laufzeit für jedes dieser Projekte ein eigenes Runtime Repository instantiiert werden. Analog zu den Referenzen zwischen den Projekten müssen auch die Runtime Repositories miteinander verbunden werden, um mit einer Abfrage an alle relevanten Daten zu gelangen. Mit der Einführung des Runtime Repository Managers ist es nun Aufgabe des Managers neue Repositories zu erstellen. Es muss damit ebenfalls sichergestellt werden, dass in einem neuen Repository alle notwendigen Verknüpfungen gesetzt sind. Da sich auch in verknüpften Repositories Produktdaten ändern können, muss der Manager außerdem überprüfen, ob sich in einem referenzierten Repository die Daten geändert haben. Um diese Aufgaben zu bewältigen werden die Manager analog zu den Runtime Repositories miteinander verknüpft. Ein Manager kann dadurch alle verbundenen Manager nach dem aktuellen Repository fragen und entsprechend das eigene Repository zusammen bauen. Beispiel einer Applikation Das folgende Beispiel baut auf den Tutorial Projekten auf. Der Programmcode der Tutorial Projekte kann von http://faktorzehn.org/fips:tutorial runtergeladen werden. Der Sourcecode des hier vorgestellten Beispiels kann ebenfall von der Tutorial Seite runter geladen werden. Der Product Data Service sowie der EJB Product Data Provider liegen auch im Runtime Addons Archiv im Faktor IPS Downloadbereich 7 bereit. Beispiel für den ProductDataService Um das neue Runtime Repository zu testen benötigen wir zunächst einen Application Server, in dem der ProductDataService laufen kann. Im Projekt ProductDataServiceDemo wird dazu der Apache OpenEJB 8 Server verwendet. Der Server wird über die Launch-Konfiguration ProductDataServiceDemo (OpenEJBServer) gestartet. Die Konfiguration liegt im Projekt org.faktorips.tutorial.de.productdataservicedemo. Der OpenEJB Server packt automatisch alle Bibliotheken im Classpath und deployed darin enthaltene Services. Im Klassenpfad sind neben dem ProductDataService auch die Produktdaten des Tutorialprojekts Hausratprodukt enthalten. Konfiguriert wird der Service im Deployment Descriptor in der Datei ejb-jar.xml. Im Listing 1 ist die Konfiguration aus dem Beispiel abgebildet. Darin wird der Service org.faktorips.tutorial.de.productdataservice.productdataservicedemo eingestellt, mit dem Element mapped-name wird der JNDI Name angegeben (siehe Abschnitt 5.2). Das TOC-File wird über den Classpath geladen und muss daher im Bundle vorliegen; der Pfad wird im Deployment Descriptor per Injection in die Variable tocfilename gesetzt. 7 http://update.faktorzehn.org/faktorips/cgi/download.pl?subfolder=v3 8 http://openejb.apache.org Faktor Zehn AG 7

<ejb-jar> <enterprise-beans> <session> <ejb-name> org.faktorips.tutorial.de.productdataservice.productdataservicedemo </ejb-name> <mapped-name>hausratproductdataproviderdemo</mapped-name> <ejb-class> org.faktorips.productdataservice.productdataservice </ejb-class> <session-type>stateless</session-type> <env-entry> <env-entry-name>tocfilename</env-entry-name> <env-entry-type>java.lang.string</env-entry-type> <env-entry-value> org/faktorips/tutorial/produktdaten/internal/faktorips-repository-toc.xml </env-entry-value> <injection-target> <injection-target-class> org.faktorips.productdataservice.productdataservice </injection-target-class> <injection-target-name>tocfilename</injection-target-name> </injection-target> </env-entry> </session> </enterprise-beans> </ejb-jar> Listing 1: Beispiel einer ejb-jar.xml Wenn weitere Produktdatenprojekte ausgeliefert werden, muss für jedes Projekt ein eigener Service konfiguriert werden - ejb-name und mapped-name müssen sich unterscheiden. Um den Service in einem anderen Application Server auszuliefern, muss der Service zusammen mit den Produktdaten in ein EAR bzw. WAR gepackt werden. Dazu müssen folgende Bibliotheken eingebunden werden: faktorips-runtime.productdataservice.jar faktorips-runtime.productdataservice.common.jar faktorips-runtime.java5.jar Bibliothek mit Produktdaten Beispiel für eine Abfrage Im Projekt org.faktorips.tutorial.de.productdataproviderdemo wird eine Abfrage auf den Service im vorherigen Kapitel gestartet. Um das Demoprogramm auszuführen muss der Server ProductDataServiceDemo gestartet sein. Wie in Listing 2 dargestellt wird zunächst der Repository Manager erstellt. In den Properties im InitialContext werden spezifische Einstellungen für den Application Server gesetzt. Dem Konstruktor von EjbProductDataProviderFactory wird neben dem InitialContext der JNDI Name des Service mitgegeben. Der JNDI Name wurde im Deployment Descriptor im Listing 1 mit dem XML Element mapped - name gesetzt. InitialContext initialcontext = new InitialContext(properties); EjbProductDataProviderFactory pdpfactory = new EjbProductDataProviderFactory( "HausratProductDataProviderDemo", initialcontext); repositorymanager = new DetachedContentRuntimeRepositoryManager.Builder( pdpfactory).setformulaevaluatorfactory( new GroovyFormulaEvaluatorFactory()).build(); Listing 2: Initialisierung des Repository Managers Faktor Zehn AG 8

Wenn der Manager initialisiert ist, kann eine Abfrage beginnen. Im Beispiel wird ein neuer HausratVertrag in der Methode createhausratvertrag erstellt. Dazu wird, wie in Listing 3 gezeigt zunächst das aktuelle Runtime Repository vom Manager abgefragt. IRuntimeRepository repository = repositorymanager.getactualruntimerepository(); Listing 3: Aktuelles Repository vom Manager abrufen Alle weiteren Operationen werden auf diesem Repository ausgeführt. Dabei ist zu beachten, dass in den Produktobjekten und damit indirekt auch in den Vertragsobjekten eine Referenz auf das Repository gehalten wird. Solange wir mit diesen Instanzen arbeiten, wird dieses Repository immer wieder abgefragt. Der Anwendungsentwickler muss daher darauf achten, dass über die gesamte Abfrage - im Beispiel: solange das Objekt Vertrag verwendet wird - auf die Exception DataModifiedRuntimeException geachtet wird. Um den EjbProductDataProvider zu verwenden muss die Applikation neben den Faktor-IPS Runtimeabhängigkeiten und dem Modellklassen folgende Bibliotheken referenzieren: faktorips-runtime.productdataprovider.ejbclient faktorips-runtime.productdataservice.common.jar faktorips-runtime.groovy.jar (wenn die Formeln mit Groovy ausgeführt Groovy-All 9 (Version 1.6.0) werden sollen) Implementierung eigener Product-Data-Providers Ziel des Separaten Deployments von Produktdaten ist es, die Produktdaten unabhängig von der Applikation ausliefern zu können. Dabei ist es nicht nur möglich, die Daten von einem Service abzurufen. Auch die Abfrage einer Datenbank ist mit geringem Aufwand möglich. Die eigentliche Abfrage der Daten ist dazu unabhängig von der Implementierung von DerivedContentRuntimeRepository. Das Repository ruft über das Interface IproductDataProvider die Methoden zur Abfrage der Produktdaten auf. Zur Instantiierung des konkreten Product-Data-Providers erhält das Runtime Repository eine ProductDataProviderFactory. Das Interface IProductDataProvider beinhaltet Methoden um die unterschiedlichen Produktdaten (Product Component, Table Content, Enum Value, ) abzufragen. Außerdem kann das Repository das aktuelle Inhaltverzeichnis (Table-Of-Content, TOC) die aktuelle Table-Of-Content laden und die Version der Produktdaten abfragen. Um festzustellen, ob zwei Versionen kompatibel sind, wird in der abstrakten Implementierung AbstractProductDataProvider ein IVersionChecker verwendet. Die Überprüfung der Kompatibilität wird dadurch ausgelagert und kann je nach Umfeld verändert werden. Denkbar wäre beispielsweise, dass zwei Versionen kompatibel sind, wenn Major- und Minor-Version gleich sind, jedoch die Micro-Version abweicht. Zusammenfassend müssen zur Implementierung eigener Product-Data-Providers folgende Interfaces implementiert werden: IProductDataProvider zur Abfrage der Daten und der Version - optional kann die Abstrakte Klasse AbstractProductDataProvider verwendet werden IProductDataProviderFactory zum Erstellen des eigenen Product-Data-Providers Optional eine eigene Implementierung von IVersionChecker Weitere Dokumentation zur Implementierung der einzelnen Interfaces befindet sich im JavaDoc. 9 http://groovy.codehaus.org/ Faktor Zehn AG 9

Literatur [1] Joshua Bloch, Effective Java (2nd edition) (the java series), Prentice Hall PTR, Upper Saddle River, NJ, USA, 2008. Faktor Zehn AG 10