Die Entwicklung einer einheitliche - sebis
Transcrição
Die Entwicklung einer einheitliche - sebis
Technische Universität München Fakultät für Informatik Lehrstuhl für Software und Systems Engineering (I 19) Diplomarbeit Entwicklung einer einheitlichen Webdienstschnittstelle für Microsoft Enterprise Systems Rumen Traykov Aufgabensteller: Prof. Dr. Florian Matthes Betreuer: Sheng Wei Abgabedatum: 15.09.2005 Erklärung Ich versichere, dass ich diese Diplom-Arbeit selbständig verfasst und nur die angegebenen Quellen und Hilfsmittel verwendet habe. München, den 15.September 2005 _________________ Rumen Traykov II Inhaltsverzeichnis 1 2 Einleitung.......................................................................................................................1 Begriffe und Konzepte..................................................................................................3 2.1 Grundlagen der Systemintegration .................................................................3 2.1.1 Datenintegration ....................................................................................5 2.1.2 Anwendungsintegration.........................................................................5 2.1.3 Prozessintegration..................................................................................6 2.2 Metadaten-Beschreibung .................................................................................6 2.3 Unternehmensanwendungen............................................................................7 2.3.1 Datenbanksystem ..................................................................................7 2.3.2 Verzeichnisdienst ..................................................................................8 2.3.3 Groupware-Server ................................................................................8 2.3.4 Informationsportale (Portal Server) ...................................................9 2.4 Systeme vom besonderen Interesse .................................................................9 2.4.1 BizTalk Server 2004 ...............................................................................9 2.4.2 Information Bridge Framework..........................................................12 2.4.3 Oracle9iBC4J .......................................................................................13 2.4.4 SharePoint Portal Server .....................................................................14 2.5 Funktionale und nichtfunktionale Anforderungen......................................14 3 Übersicht über die technischen Hilfsmittel in Microsoft Welt ...............................17 3.1 Microsoft .NET................................................................................................17 3.1.1 Xml-Unterstützung in .NET...............................................................19 3.1.2 Code-Generierung mit System.CodeDom-Namespace .....................22 3.1.3 Reflektion mit den System.Reflection- und System.Type-..................... Namespace ...........................................................................................23 3.1.4 Webdienste mit ASP.NET ....................................................................23 3.2 Kommunikationsprotokolle und Schnittstellen ...........................................25 3.2.1 Component Object Model ....................................................................25 3.2.2 Ole DB ..................................................................................................26 3.2.3 Lightweight Directory Access Protocol ...............................................28 3.2.4 Active Directory Service Interfaces .....................................................29 3.2.5 Web Distributed Authoring and Versioning(WebDAV) .....................32 3.3 Objektmodelle .................................................................................................36 3.3.1 Collaboration Data Objects .................................................................36 3.3.2 ActiveX Data Objects und ADO.NET..................................................37 4 Microsoft-Unternehmensanwendungen in Hinblick auf Daten- Schema und Porgrammierschnittstellen ....................................................................................................41 4.1 Active Directory ..............................................................................................41 4.1.1 Programmierschnittstellen...................................................................43 4.1.2 Metadatenbeschreibung.......................................................................44 4.2 Microsoft Sql Server .......................................................................................46 4.2.1 Programmierschnittstellen...................................................................46 4.2.2 Metadatenbeschreibung.......................................................................47 4.3 Exchange Server..............................................................................................47 4.3.1 Programmierschnittstellen...................................................................48 4.3.1.1 ADO/CDO und OLEDB ..................................................................49 4.3.1.2 WebDAV...........................................................................................50 4.3.2 Metadatenbeschreibung.......................................................................51 4.4 SharePoint Portal Server ...............................................................................53 4.4.1 Programmierschnittstellen...................................................................55 III 5 6 7 8 9 4.4.2 Metadatenbeschreibung.......................................................................57 Entwurf und Implementierungsdetails.....................................................................59 5.1 Architektur-Entwurf ......................................................................................59 5.2 Extrahieren der Metadaten............................................................................62 5.2.1 Microsoft Sql Server ...........................................................................63 5.2.2 Active Directory ..................................................................................66 5.2.3 Exchange Server..................................................................................68 5.2.4 Benutzerdefiniertes Modell ................................................................71 5.3 Code-Generierung...........................................................................................74 5.4 Komponenten für den Datenzugriff (Data-Access-Layers) ........................82 5.4.1 Exchange Server ..................................................................................85 5.4.2 Active Directory....................................................................................88 5.4.3 Microsoft SQL Server ..........................................................................89 5.4.4 Systeminterne Objekt-Datenzugriffsschnittstelle................................90 5.5 Dienstentwurf ..................................................................................................92 5.6 Konfigurationsschema und Dienstbeschreibung .........................................94 5.7 Deployment......................................................................................................97 Use-Cases und Szenarien .........................................................................................100 6.1 Testfälle..........................................................................................................100 6.2 Java-Client.....................................................................................................100 Zusammenfassung ....................................................................................................101 Ausblick .....................................................................................................................104 Literatur- und Quellenverzeichniss ........................................................................105 IV Abbildungsverzeichnis Abbildung 1: Systemarchitektur von BizTalk Server[BizT04]………………………………10 Abbildung 2: Systemarchitektur von Microsoft IBF[IFAP] …………………………………12 Abbildung 3: Systemgrenzen aus der Sicht eines Integrationsbrokers……………………….16 Abbildung 4: .Net-Framework Schichtendiagramm………………………………………….17 Abbildung 5: Active Directory Service Interfaces …………………………………………29 Abbildung 6: Collaboration Data Objects[CDOSDK]………………………………………..36 Abbildung 7: ADO.NET……………………………………………………………………...39 Abbildung 8: Datenzugriffs-Architektur für Exchange Server 2003 [ESDK01]……………..49 Abbildung 9: Zugriff auf dem Exchange Store über WebDAV [ESDK02] ………………….50 Abbildung 10: SharePoint Portal Server Workspace [MicSPS2]…………………………….54 Abbildung 11:Client-Interaktion mit SharePoint Information Store über WebDAV………...56 Abbildung 12: Schichtendiagram…………………………………………………………….59 Abbildung 13: Komponentendiagramm………………………………………………………62 Abbildung 14: Ausschnitt aus dem Datenbankschema der Beispielsdatenbank „Northwind“…………………………………………………………………………………..65 Abbildung 15: Ausschnitt aus Active Directory Schema…………………………………….67 Abbildung 16: Ausschnitt aus dem Exchange Server-Schema……………………………….70 Abbildung 17: Beispielsinstanz des Common-Models……………………………………….72 Abbildung 18: Transformation zwischen Metamodellen [Anhang 3]………………………..73 Abbildung 19: Zuordnung Unternehmensanwendung – XmlSchema………………………. 75 Abbildung 20: Die codeGenerator-Komponente zur Codegenerierung aus XSD………........76 Abbildung 21: Erweiterungen für das zusätzliche Anpassung des Quellcodes bei CodeGenerierung…………………………………………………………………………………...79 Abbildung 22: Attribute, die Strukturen in relationalen Datenbanken beschreiben………….80 Abbildung 23: Klassendiagramm der Datenzugriffskomponente…………………………….83 Abbildung 24: Klassendiagramm der Konfigurationskomponente…………………………..92 V Abbildung 25: Data Access Object - Pattern [BPJ2EE]……………………………………...94 Abbildung 26: Sequenzdiagramm für den Service Locator………………………………......96 Abbildung 27: Deployment-Diagramm………………………………………………………98 Tabellenverzeichnis Tabelle 1: ADSI-Provider…………………………………………………………………….31 Tabelle 2: Einschränkungen (Spaltennamen der Ergebnistabelle-DataTable) für den OleDbSchemaGuid.Tables Identifikator……………………………………………………...40 Tabelle 3: Zuordnung von Syntaxen in Active Directory und .NET-Datentypen……………45 Tabelle 4: Zuordnung von Sql Server Datentypen zu SQLOLEDB- und .Net-Datentypen….47 VI 1 Einleitung In Unternehmen werden in der Regel mehrere Enterprise Systeme für die Verwaltung der Unternehmensdatenbestände und die Koordination der Arbeitsprozesse eingesetzt. Bei der Gestaltung der innerbetrieblichen und überbetrieblichen Geschäftsprozesse können die Informationsbestände und Dienste mehrerer Unternehmensanwendungen benötigt werden, wenn das Ziel nicht mit einer einzigen Anwendung erreichbar ist. Darüber hinaus werden oft redundante, semantisch zusammengehörige Daten in unterschiedlichen und unabhängig voneinander bestehenden Informationssystemen gespeichert. Dabei ist sowohl die Einhaltung der Konsistenz problematisch, die ohne eine zentrale Verwaltung nur mit erhöhter Komplexität zu gewährleisten ist, als auch die Verwaltung und Pflege der Daten, die für jedes Informationssystem separat und nicht unbedingt zeitgleich durchzuführen sind. Eine wichtige Voraussetzung für die Lösung dieser Probleme ist die Integration der Unternehmensanwendungen. Die Zentralverwaltung von Anwendungen bringt viele Vorteile mit sich, z.B. eine vereinheitlichte Zugriffsschnittstelle für Dienste und Informationsobjekte, impliziert jedoch auch die Integration von Unternehmensanwendungen, die nicht immer in homogener Systemumgebung laufen müssen. Durch die immer wachsende Bedeutung von Internet und verteilten Anwendungen in heterogenen Systemen ist der Druck für Webdienstschnittstellen gewachsen. Die Microsoft Enterprise Systeme verfügen oft über keine XML-basierten Webdienstschnittstellen und bieten nur Kommunikationsprotokolle und Programmierschnittstellen, die nicht für das Internet konzipiert sind. Das Ziel dieser Arbeit ist, ein Konzept für ein System zu entwickeln, das einerseits die Integration von Unternehmensanwendungen, im Sinne der Offenlegung von deren Informationsobjekten und Diensten via XML-basierte Webdienste, und andererseits die Modellierung von komplexen anwendungsübergreifenden Informationsobjekten umfasst. Die Integration der Systeme impliziert sowohl die Extrahierung der Metadaten aus den Anwendungen, die die Informationsobjekte beschreiben, als auch die Entwicklung von Konnektoren für die von den Anwendungen unterstützten Kommunikationsprotokollen und Programmierschnittstellen. Bei den vorliegenden Komponenten, die die Kommunikationsprotokolle implementieren, stellen die Konnektoren nur Adapter dar, die diese Komponente an den im System vordefinierten Schnittstellen anpassen. Mit der Offenlegung dieser Schnittstellen in einer vom System zur Verfügung gestellten Programmierschnittstelle werden die Austauschbarkeit von Adaptern und die Erweiterung des Systems mit neuen Adaptern sichergestellt. Darüber hinaus muss das System eine Komponente für die Extrahierung der Metadaten aus ausgewählten Systemen anbieten und durch offen gelegte Schnittstellen erweiterbar sein. Die Integration neuer Anwendungen muss mit der Angabe der Adapter, Metadaten und Konfigurationseinstellungen erfolgen. Für die anwendungsübergreifenden Informationsobjekten ist außerdem eine Datenzugriffsschnittstelle gefordert, die die Verteilung der Anfragen an den mitwirkenden Enterprise Systemen automatisiert. Das erfolgt für alle möglichen Informationsobjekten als zyklenfreien Objektgraphen. Gliederung der Arbeit In Kapitel 2 werden Konzepte vorgestellt, aus denen sich zusätzliche Anforderungen an dem zu entwickelten System herleiten lassen. Außerdem werden Begriffe und Definitionen erklärt, die in den folgenden Kapiteln verwendet werden. Eine Übersicht über die Kommunikationsprotokolle und Programmierschnittstellen für die Enterprise Systeme, die als Beweis des Konzepts in dieser Arbeit behandelt worden sind, ist in Kapitel 3 gegeben. Die Enterprise Systeme selbst werden im Kapitel 4 auf Programmierschnittstellen und Metadatenbeschreibungen untersucht. Der Entwurf und die Implementierungsdetails werden in Kapitel 5 behandelt. Als erstes wird die Extrahierung der Metadaten in Xml Schema Definition (XSD)-Dokumente für jede in Betracht gezogene Unternehmensanwendung, dann die Generierung von Code aus den erzeugten XSD-Dokumenten und anschließend die Entwicklung der Konnektoren und der Konfigurationskomponente behandelt. Kapitel 6 beschäftigt sich mit der Qualitätssicherung. Im Kapitel 7 und 8 werden abschießend eine Zusammenfassung über die Arbeit und Ausblick auf Erweiterungsmöglichkeiten verfasst. 2 2 Begriffe und Konzepte Um die Problemstellung im fachlichen Konzept nach den theoretischen Grundlagen einordnen zu können, wird demnächst kurz auf diese eingegangen. 2.1 Grundlagen der Systemintegration Die Kernidee der Enterprise Application Integeration (EAI) ist, eine zentrale Plattform bereitzustellen, welche Applikationen über entsprechende, zum Teil vorgefertigte Adapter, anbindet. Gegenüber der Point to Point Integration lässt sich eine erheblich geringere Anzahl an Schnittstellen realisieren. Dieser Effekt verstärkt sich quadratisch bei steigender Anzahl der zu integrierenden Applikationen [SAMS04]. Wolfgang Keller [Kell02] grenzt EAI von B2B ab, da hier in der Regel mehrere Parteien beteiligt sind. Allerdings werden die Konzepte als strukturell und technisch gleich beschrieben. Laut ihm liegt der einzige Unterschied in der unternehmensübergreifenden Sichtweise des B2B-Ansatzes und des unternehmensinternen Fokus von EAI. Im Siemens online Lexikon [SiemL] ist folgende Definition eines Informationsbrokers angegeben: „Integrationsbroker, auch als Integrationsserver, Orchestrierungsserver oder Integrationsplattformen bezeichnet, liefern den Unterbau für das Zusammenwirken der einzelnen Webservices. Sie dienen der Orchestrierung von Webservices und dafür die entsprechenden Schnittstellen bereit. Des Weiteren nehmen Integrationsbroker Nachrichten aus Applikationen entgegen, prüfen und analysieren diese, wandeln die auszutauschenden Dateiformate um und übertragen sie an die Zielanwendungen. Neben der Anwendung von Sicherheitsverfahren managen Integrationsbroker auch Transaktionen…“ In dieser Definition sind zwei für diese Arbeit wichtige Anforderungen an dem Funktionsumfang eines Integrationsbrokers erwähnt. Er muss Webdienste offen legen sowie in der Lage sein, Nachrichten aus verschiedenen Anwendungen entgegenzunehmen, zu bearbeiten und anschließend an die entsprechende Anwendung weiterzuleiten. Das sind auch Anforderungen an dem Konzept, das in dieser Arbeit entwickelt wird, mit der Einschränkung, dass das zu entwickelnde System nur über Webdienste angesprochen werden kann. 3 Aus Microsoft-Sicht [MCED03] kann die Anwendungsintegration als das Zusammenführen von mehreren autonomen Anwendungen oder Teilen davon, in eine neue verteilte Anwendung, angesehen werden. Das kann auf verschiedene Weisen geschehen, wie z.B. beim direkten Zugriff auf die Funktionalitäten einer Anwendung von einer anderen, oder bei der Kommunikation von Anwendungen in heterogenen Systemen über das Versenden von Nachrichten in vordefiniertem Format. Die Anwendungsintegration ermöglicht die Zusammenarbeit der Anwendungen, um ein größeres Ziel zu erreichen, das von den einzelnen Anwendungen nicht erreicht werden kann. Diese Zusammenarbeit erfordert einen Grad an Interoperabilität zwischen den Systemen. Um Strukturen zum Konzept von Interoperabilität anbieten zu können, wurde von Microsoft die Entwicklung eines Interoperabilitätsframeworks-NDAM initiiert. NDAM ist die Abkürzung für Netzwerk, Daten, Anwendungen und Management, die nach Microsoft die vier Anforderungen für Interoperabilität unter Systemen darstellen. Die Technologien, die Anwendungsintegration ermöglichen, werden dann in zwei Bereiche eingeteilt werden: • Anwendung-Infrastruktur-Technologien verschaffen Interoperabilität in folgenden Anwendung-Infrastuktur-Ebenen: o Transaktionen o Komponente o Präsentation; • Geschäftsprozess-Integrationstechnologien. Beide schließen sich nicht einander aus, z.B. eine verteilte, zur Ausführung von Transaktionen entworfene Anwendung kann von wieder verwendbaren Komponenten aufgebaut werden. Ein anderes Beispiel ist die Kommunikation zweier Anwendungen mithilfe von XML für die Ausführung einer Transaktion, womit eine reelle Geschäftsprozessintegration erreicht wird. Das Ziel der Arbeit beschränkt sich nur in der Domäne der Komponenten- und als Ausblick in die Zukunft die Transaktions-Ebenen der Anwendungs-Infrastruktur. Die Transaktionsebene stellt die Möglichkeit Operationen von mehreren Systemen in einer Transaktion zu vereinen die Operationen einer Transaktion werden als eine atomare Operation betrachtet, die entweder mit Erfolg beendet oder fehlgeschlagen ist. Die Präsentationsebene beschäftigt sich mit der Einbettung von Benutzeroberflächen, also der Präsentationsschicht einer Anwendung. 4 Die Integrationsmethoden nach Linthicum [Lint00] werden in Interface Level, Data Level, Application Interface Level und Prozessintegration eingeteilt, die in den folgenden Punkten beschrieben werden. Das Konzept dieser Arbeit spiegelt sich in der Definition der Anwendungs- und Datenintegration wider. 2.1.1 Datenintegration Das zu integrierendem System greift bei der Data Level Integration direkt auf die Daten einer Datenbank zu. Die Business-Logik anderer Applikationen, die ebenfalls die betroffe Datenquelle nutzen, wird nicht verwendet. Die Daten werden gelesen, nach individuellen Regeln transformiert oder durch eigene Logik interpretiert, um in die gleiche Quelle zurück geschrieben bzw. auf andere Art und Weise weiterverwendet zu werden. 2.1.2 Anwendungsintegration Die integrierende Software greift auf die Daten und Businessprozesse einer Anwendung mithilfe von Application Programming Interfaces (API) unter Verwendung der Applikationslogik des Systems zu. Die Daten werden dann in ein für die Zielanwendung oder für die zentrale EAI-Instanz verständliches Format umgewandelt und übertragen. Ein Vorteil dieser Methode im Vergleich zur Data Level Integration besteht darin, dass die Geschäftslogik die Konsistenz und die Einhaltung der Datenformate garantiert. Als Nachteil werden in der Regel die API-Restriktionen bezüglich des Datenzugriffs und Funktionsumfangs sowie die Komplexität der systemübergreifenden Funktionsintegration im Fall fehlender Standard-APIs betrachtet. Eine Integrationsinstanz agiert als Bridge für die in der Kommunikation beteiligten Anwendungen. Dazu kommt noch die Prozessintegration, bei der die Geschäftsprozesse im Mittelpunkt stehen. Bei BizTalk Server ist der Integrationsbroker mit Metamodellen (intern definierte Modelle für die benutzerdefinierten Modelle) und Werkzeugen versehen, die durch einen MDA1-Ansatz das Modellieren von Geschäftsprozessen und dafür benötigten Entitäten vereinfachen. Die Entitäten sind Objekte, die in den zu integrierenden Systemen definiert sind und im 1 MDA steht für Model Driven Architecture, ein Standard von Object Management Group, der eine Vorgehensweise bei dem Softwareentwicklungsprozess unter Verwendung von UML definiert, dass Anwendungslogik von der unterliegenden Plattformtechnologie trennt. 5 Integrationsbroker durch ein Modell beschreiben werden. Dieses Modell muss mit dem festgelegten generischen Metamodell des Brokers konform sein. 2.1.3 Prozessintegration Die geschäftsprozessorientierte Anwendungsintegration hat ihren Fokus auf einer höheren Abstraktionsebene als die informationsorientierte. Die letzte richtet ihren Blick auf das Geschäftsmodell bzw. die Geschäftsprozesse mit der Geschäftslogik, den Prozessabläufen und der Hierarchisierung von Prozessen in Subprozesse. Der Ansatz ist eng mit dem der Geschäftsprozessautomatisierung verbunden. Die Prozesse werden einheitlich zentral gestaltet und definiert. Die Anwendungen werden letztendlich durch die Anbindung an die Prozesse integriert. Voraussetzung dafür sind Schnittstellen zu den Funktionen und Daten der Anwendungen, die in einer geeigneten Granularität vorhanden sein müssen. Die dienstorientierte und informationsorientierte Anwendungsintegration spielt bei der Bereitstellung der Schnittstellen eine Rolle. Die Prozesse müssen auf einer genügend abstrakten Ebene definiert werden sowie mit einer Modellierungssprache und (grafischen) Modellierungstools modellierbar sein. Durch die Trennung zwischen der Geschäftsprozessebene und den darunter liegenden Integrationsschichten können die Prozesse angepasst werden, ohne dass die darunter liegenden Implementierungen geändert werden müssen. Gleiches gilt für Änderungen in den unteren Integrationsschichten. Dafür wird ein MDA-Tool (s. Kapitel 2.1.2)empfohlen. 2.2 Metadaten-Beschreibung Damit eine sinnvolle Integration möglich ist, muss die Qualität und Struktur der Daten, die entweder schon vorhanden sind oder neu erfasst werden müssen, wie deren Meta-DatenBeschreibung, analysiert werden. Es wird versucht, allgemein gültige Informationsstrukturen zu erheben, die in einer ganzen Klasse von Problemfällen anzutreffen sind. Die so gefundenen und dokumentierten Muster können daher in verschiedenen konkreten Anwendungsfällen zum Einsatz kommen. Von den Modellen benutzte Begriffe variieren bei der konkreten Problemstellung. Daher wird das generische Modell als zusätzliche Modellierungsebene aufgefasst und dient als Modell eines konkreten Modells, oder auch Metamodell. Metamodelle ermöglichen die Definition generischer Vorgehensweisen, die später auf den konkreten Modellen (d.h. den Ausprägungen des Metamodells) angewandt werden können [SAMS04]. 6 Datenstrukturen Bei den strukturierten Datenquellen kann ein Datensatz nicht von der vorgegebenen Feldstruktur abweichen. Beispiel dafür sind die Datensätze einer Tabelle in einer relationalen Datenbank. Diese müssen die gleichen Felder besitzen. Bei semi-strukturierten Datenquellen dagegen, wie z.B. bei Verzeichnisdienste und Nachrichtenspeicher, verfügen nicht alle Datensätze über die gleichen Felder [SCHW01]. Bei einer semi-strukturierten Datenbank kann es optionale Felder geben, für die ein konkretes Objekt keinen Wert bereitzustellen braucht. 2.3 Unternehmensanwendungen Für den Beweis des Konzepts wird als Ziel dieser Arbeit gesetzt, einen Verzeichnisdienst, ein relationales Datenbanksystem und einen Groupware-Server im zu entwickelnden System zu integrieren. Im Folgenden wird die Definition sowohl für jedes dieser Systeme, als auch für einen Portal-Server angegeben, weil die Integration des in dieser Arbeit ausgewählten PortalServers analog zu der Integration des ausgewählten Groupware-Servers verläuft. 2.3.1 Datenbanksystem Die Ansammlung von Informationen, die sich auf ein bestimmtes Thema oder Zweck beziehen, wird als Datenbank bezeichnet. Die Datenbank wird normalerweise von einem Datenbankverwaltungssystem (database management system – DBMS) verwaltet. Ein Datenbanksystem besteht aus einer oder mehreren Datenbanken und dem Verwaltungssystem, das dem Benutzer ermöglicht, bestimmte Informationen zu erfassen, zu speichern, zu finden und zu aktualisieren. Es behandelt außerdem Problemfälle wie z.B. gleichzeitigen Zugriff auf Daten von mehreren Benutzern. Die Datenbank ist nach einer bestimmten Struktur aufgebaut, demnach sind in dieser Arbeit die relationale und hierarchische Datenstrukturen von Bedeutung. Die hierarchische Datenstruktur wird im Zusammenhang mit den Verzeichnisdiensten behandelt. Im Folgenden ist als Datenbank diese mit relationaler Datenstruktur gemeint. Eine relationale Datenbank basiert auf dem relationalen Datenbankmodell. Dabei werden die Daten in zweidimensionalen Tabellen verwaltet, die über Schlüssel miteinander verknüpft 7 werden können. Die Schlüssel (Primär-, Fremdschlüssel) sind ausgewählte Attribute (Spalten) in der Tabelle, die die referenzielle Integrität sicherstellen. Die referenzielle Integrität befasst sich mit der Korrektheit der Beziehungen zwischen Tabellen und der Eindeutigkeit der Schlüssel. Die Reihen stellen Datensätze in der Tabelle dar, die über den Primärschlüssel eindeutig bestimmt werden. Die Fremdschlüssel ermöglichen das Verknüpfen von Tabellen, indem Primärschlüssel referenziert werden. Das Datenbanksystem stellt sicher, dass die Primärschlüssel existieren und nur gemeinsam mit dem Fremdschlüssel geändert oder gelöscht werden können. Alle Attribute haben eine festgelegte Domäne (Wertebereich) für Attributwerte. Die Einhaltung dieser Wertebereiche wird als Wertebereichintegrität bezeichnet. Mit Sql (Structured Query Language) wird eine Abfragesprache für relationale Datenbanken definiert. Im Prinzip ist Sql standardisiert, allerdings unterstützen nicht alle Hersteller den kompletten Standard und jeder hat seine eigenen Erweiterungen [KEMP04]. 2.3.2 Verzeichnisdienst Das Verzeichnis stellt einen hierarchischen Speicher für Informationen dar. Die Verzeichniseinträge bilden einen Verzeichnisbaum, wobei es drei Typen von Einträgen gibt: Root (Wurzel), Container (Knoten) und Leaves (Blätter). Das oberste Element im Verzeichnisbaum ist die Wurzel. Ein Container kann im Gegensatz zu den Blättern andere Einträge enthalten. Wie in allen hierarchischen Datenbanken können Verknüpfungen zwischen Einträgen nur als Eltern-Kind-Beziehungen im Verzeichnisbaum realisiert werden. Jeder Eintrag enthält Attribute, die ihn beliebig genau beschreiben. In einigen Verzeichnissen, wie z.B. bei Active Direcory der Fall ist, kann ein Attribut auch mehrere Werte haben. Der Verzeichnisdienst umfasst neben der Speicherung auch den Zugriff auf die Informationen. Die Verzeichniseinträge werden als Objekte und die Definitionen der Struktur der Objekte – als Klassen bezeichnet. Die Operationen auf einem Verzeichnisdienst werden von den Zugriffsprotokollen, wie das Lightweight Directory Access Protocol (LDAP), definiert. 2.3.3 Groupware-Server Ein Groupware-Server erfüllt die Anforderungen für kooperatives Arbeiten (Computer Supported Cooperative Work – CSCW). Er unterstützt die Kommunikation, Koordination von 8 Arbeitsprozessen, sowie Informations- und Dokumentenmanagement. Im Bereich der Kommunikation agiert ein Groupware-Server als Nachrichtenserver, indem er die für die Anwender bestimmten Nachrichten annimmt und diese in das Postfach des Anwenders zustellt, sowie die gesendeten Emails des Benutzers annimmt und an den Empfänger übermittelt. Die Arbeitsprozesse werden durch gruppenübergreifende Termin- und Aufgabenplanung erleichtert. Bei Groupware-Systeme werden z.B. die Verwaltung von persönlichen und öffentlichen Kontaktinformationen als Informationsmanagement und die Strukturierung und Einreicherung der Dokumenten mit Metadaten – als Dokumentenmanagement verstanden. 2.3.4 Informationsportale (Portal Server) Ein Portal Server erfüllt den Wunsch die im Unternehmen unverbundenen Systeme unter einer einheitlichen, web-basierten Benutzungsoberfläche zu integrieren, so dass benötigte Funktionen (suchen, freigeben, veröffentlichen) und im Unternehmen vorhandenen Informationen und Dokumente unter einem einheitlichen Zugang erreicht werden können. Ein Portal stellt dabei sowohl Funktionen des Datenbank-Management-Systems (DMS), z.B. Dokumenten- und Versionsverwaltung, sowie von diesen unterstützten KollaborationsFunktionen für Dokumentaustausch und Koordination von Aufgaben, zur Verfügung. Also erfüllt ein Portal Server viele Anforderungen, die an einem Groupware-Server gestellt werden. 2.4 Systeme vom besonderen Interesse Der BizTalk Server, Mircrosoft IBF und Oracle 9iBC4J sind Systeme, die sich mit den Problemen der EAI (s. Kapitel 2.1) befassen. In Bezug auf die Projektziele werden einige Eigenschaften dieser Systeme untersucht. 2.4.1 BizTalk Server 2004 Bei vielen Integrationsprojekten kommunizieren die Anwendungen mit verschiedenen Protokollen. Die Nachrichteninfrastruktur von BizTalk Server ist so ausgelegt, dass er für jede Anwendung ihren eigenen Kommunikationsmechanismus benutzt. Um das zu ermöglichen, ist er auf Adapter angewiesen. Jeder Adapter implementiert einen Kommunikationsmechanismus wie ein bestimmtes Protokoll [BizT04]. 9 Abbildung 1: Systemarchitektur von BizTalk Server [BizT04] BizTalk Server stellt mehrere integrierte Adapter zur Verfügung. Ein Entwickler kann festlegen, welche Adapter in einer bestimmten Situation zum Einsatz kommen, oder auch benutzerdefinierte Adapter erstellen. Alle Adapter basieren auf einem Standard, der Adapterframework genannt wird. Dieses Framework bietet eine allgemeine Methode zum Erstellen und Ausführen von Adaptern und ermöglicht Ihnen, zur Verwaltung von standard- und benutzerdefinierten Adaptern dieselbe Tools zu verwenden. In BizTalk Server 2004 stehen u.a. Adapter für SOAP, HTTP und FTP zur Verfügung (s. Anhang 5). Intern arbeitet der Server nur mit XML-Dokumenten. Unabhängig in welchem Format eine Nachricht ankommt, wird sie immer in einem XML-Dokument umgewandelt. Analog, wenn die Zielanwendung die Nachricht nicht als XML-Dokument akzeptieren kann, werden sie in einem von der Zielanwendung erwarteten Format konvertiert. Das in Abbildung 1 vorgestellten Prozess könnte in folgenden Punkten erläutert werden: 1. Eine Nachricht wird mithilfe eines Empfangsadapters empfangen. Verschiedene Adapter bieten verschiedene Kommunikationsmechanismen an. 10 2. Die Nachricht wird durch eine Empfangspipeline bearbeitet. Diese Bearbeitungspipeline kann Komponenten enthalten, die Aktionen durchführen, wie die Umwandlung der Nachrichten vom ursprünglichen Format in ein XML-Dokument oder die Validierung der digitalen Signatur der Nachricht. 3. Die Nachricht wird an eine Datenbank, auch MessageBox-Datenbank genannt, die auf Microsoft SQL Server aufsetzt, geliefert. 4. Die Nachricht wird zu seiner Zielorchestrierung umgeschaltet, die für den Businessprozess benötigte Aktion durchführt. 5. Das Ergebnis von dieser Bearbeitung ist normalerweise eine andere Nachricht, erzeugt vom Businessprozess, sie wird in die MessageBox-Datenbank gespeichert. 6. Diese Nachricht, wird wiederum durch eine sendende Pipeline bearbeitet, die die Nachricht vom internen für BizTalk Server XML-Format, in ein von der Zielanwendung erfordertes Format umwandeln kann, oder z.B. eine Signatur hinzufügen kann. 7. Die Nachricht wird mithilfe eines Sendeadapters versendet, der einen entsprechenden Kommunikationsmechanismus benutzt, um die Nachricht an die Zielanwendung zu übermitteln, für die die Nachricht bestimmt ist. BizTalk Server 2004 hat außerdem noch zwei wichtige graphische Werkzeuge zur Erstellung von Orchestrierungen: • BizTalk Editor zur Erstellung von Schemata für Daten. Dafür wird XML Schema angewendet. • BizTalk Mapper für die Festlegung der Transformationen zwischen diesen Schemata, und Orchestrierungsdesigner für die einfache Festlegung des Ablaufs der Businessprozesse (s. Anhang 4). Für einen Teil der Information in den empfangenen Dokumenten ist es üblich, sie in die zu sendenden Dokumente, vielleicht auch transformiert, zu transferieren. Mit dem BizTalk Mapper können leicht sowohl die Zuordnungen von Elementen im Quell- zu Elementen im Zieldokument, sowie benötigte Transformationen, graphisch festgelegt werden. Diese werden dann in einem XSLT-Format [W31199] gespeichert. 11 2.4.2 Information Bridge Framework Microsoft Office Information Bridge Framework (IBF) ist eine Office-Komponente, die Zugang zu Informationen via Webdienste anbietet. IBF enthält ein add-in für Visual Studio .NET, das den Entwickler ermöglicht webdienstbasierten Lösungen zu entwickeln, die Zugang zu Unternehmensgeschäftsdaten wie Verkaufszahlen, Kundeninformationen usw. ermöglicht, die oft line of business (LOB) Dienste genannt werden. Diese Informationen können gleich in die 2003 Version von Word, Excel und Outlook angezeigt werden. IBFLösungen erhöht die Produktivität der Informationsbearbeiter, indem sie die Möglichkeit bereitstellen, Informationen zu bekommen und bearbeiten, ohne die bekannte OfficeApplikationen zu verlassen [IFAP]. IBF enthält ein XML Schema zur Definition von Dienstoperationen, Businessentitäten und User Interface (UI) Elementen. Der Bridge benutzt dieses Schema, um den Transfer von Daten zwischen den verschiedenen Komponenten zu ermöglichen, ohne die Metadaten zu verlieren, die für einen Update der Informationen bei der Datenquelle, wie z.B. eine LOB Applikation, notwendig sind. Die Struktur der Metadaten in IBF ist in Anhang 1 aufgeführt. Die IBF Server-Komponente ist ein Metadatendienst, basierend auf IIS-Webdienste und Microsoft SQL Server, in dem die Metadaten gespeichert sind. Der IBF Klient ist eine add-in Komponente für Microsoft Office Lösungen, die das in Metadaten festgelegte Verhalten der Lösung steuert. Abbildung 2: Systemarchitektur von Microsoft IBF [IFAP] IBF verfügt über ein Visual Studio add-in Werkzeug - „Metadata Designer“, um Metadaten zu erzeugen und sie an den Metadatendienst für die Aufbewahrung über einen Webdienst zu übergeben. 12 2.4.3 Oracle9iBC4J Das JDeveloper-Framework BC4J (Oracle9i Business Components for Java) erlaubt eine erheblich vereinfachte Entwicklung von n-Tier Anwendungen und die Entwicklung bzw. Integration unternehmensweiter Anwendungssysteme. JDeveloper führt sämtliche DML2bezogenen Datenbankoperationen über BC4J aus (Abfragen, Einfügungen, Aktualisierungen und Löschoperationen). Die BC4J-Komponenten bieten eine funktionale Schnittstelle zur Datenbank, die sich Mithilfe der eingebauten Codegeneratoren oder Assistenten aufbauen lässt. Gültigkeitsprüfungen lassen sich auch in BC4J-Klassen implementieren. BC4J-Komponenten bestehen aus einer Kombination von Java und XML. Mit XML werden die Daten beschrieben und mit Java werden die Operationen auf den Daten ausgeführt. In BC4J enthält eine XML-Datei die Metadaten mit den Definitionen, die Java-Datei die Methoden zur Implementierung der Geschäftskomponenten. Die .java-Datei umfasst get() und set() Methoden, die zur Laufzeit dynamisch insert-, update- und delete-Anweisungen generieren. Die Darstellung der statischen Informationsstrukturen, welche die Basis aller zeitlich nachgelagerten Aktivitäten in Oracle9iDS ist, stellt die Möglichkeit zur Auswahl, sich für Java-, bzw. SQL-Programmierung bei der Modellierung der Domain-Ontologie für UMLMetamodellierung oder SQL-Datenbankdesign zu entscheiden. Unter Domain-Ontologie ist die BC4J eigene virtuelle Datenbank mit den Elementen Entity Objects, Associations, Domains und Properties zu verstehen. Hinsichtlich der UML-Metamodellierung ist noch einmal auf Metadaten-Beschreibung (s. Kapitel 2.2) und MDA-Ansatz (s. Kapitel 2.1.2) zu verweisen. Insbesondere lassen sich so identische Interpretationen auf verschiedene Modelle anwenden, ohne die Prinzipien anpassen zu müssen. Das ORACLE9iDS bietet zu diesem Zweck die BC4J-Views und –Links. View-Objekte definieren und filtern Daten mithilfe von SQL-Abfragen, die in den Entitätsobjekten definiert sind. View-Links drücken die Beziehungen zwischen den View-Objekten aus. Damit können spezifische problemorientierte Sichten auf die Fach-Domain unabhängig davon definiert werden, ob sie z.B. als gewöhnliche Java-Anwendung oder Web-Client konzipiert sind. 2 Data Manipulation Language ist Teil von SQL und enthält Befehle zur Datenmanipulation [KEMP04]. 13 2.4.4 SharePoint Portal Server Mit den Webdienstschnittstelle, Konnektoren und dem Dokumentenmodell, die von SharePoint Portal Server (SPS) angeboten werden, behandelt der SPS Problemstellungen, die auch in dieser Arbeit in Betracht gezogen werden. Der SharePoint Portal Server erfüllt die Anforderung eines modernen Portals [Wegn02] Enterprise Anwendungen integrieren zu können, damit er einen strukturierten Zugang zu Informationen aus verschiedenen Quellen, sowie die Offenlegung deren Anwendungsfunktionalitäten bieten kann. Dazu gibt es Konnektoren, z.B. zu SAP R/3, mit denen SPS sich selbständig an den jeweiligen Unternehmensanwendungen anmeldet und Dienste oder Inhalte für diese offen legt. Außerdem bietet SPS die Möglichkeit Termine und Nachrichten aus Exchange Server und Benutzerdaten aus Active Directory zu importieren. Die Windows SharePoint Portal Services (WSPS) basieren auf ASP.NET zur Präsentation. Das Portal besteht aus einer oder mehreren WSPS-Webseiten mit denen der Webclient interagiert. WSPS bieten zusätzlich Webdienstschnittstellen, mit denen die internettaugliche Client-Anwendungen oder Integration von SPS in anderen Unternehmensanwendungen ermöglicht wird. Die Webdienste sind abhängig von dem im SPS aufgestellten Objektmodell realisiert. 2.5 Funktionale und nichtfunktionale Anforderungen In Bezug auf die Ziele dieser Arbeit und die in vorherigen Punkten beschriebenen Grundlagen und Systemanwendungen werden in diesem Unterkapitel funktionale und nichtfunktionale Anforderungen an dem zu entwickelnden System aufgestellt. Nichtfunktionale Anforderungen n01: Erweiterbarkeit. Das System muss dynamisch erweiterbar sein. Es muss möglich sein ohne ihre Komponenten ändern zu müssen, neue Anwendungen integrieren zu können. Das System muss mit den Unternehmensanwendungen mit Hilfe von Adaptern verbunden werden[AlMa02] sowie mit neuen Adaptern und Komponenten erweiterbar sein. In diesem Zusammenhang muss das System Schnittstellen in einer Programmierschnittstelle offen legen. n02: Benutzerfreundlichkeit. Die vom System offen gelegten Schnittstellen müssen möglichst einfach und einheitlich verwendet werden können. Die Anforderung ist mit der Aufsetzung der Schnittstellen auf XML-basierten Webdiensten erfüllt. 14 n02: Verteilung. Es soll eine möglichst schwache Kopplung der sich im System befindenden Komponenten erreicht werden. Beispielsweise sollte die Datenzugriffskomponente nicht mit den Modellen verlinkt sein. n03: Sicherheit. Es müssen Kommunikationsmechanismen gegeben werden, die die sichere Übertragung und Integrität der Daten sicherstellen. Funktionale Anforderungen f01: Metadaten. Die Informationsobjekte in den integrierten Systemen müssen in dem zu entwickelnden System beschrieben werden. Es müssen Klassen erzeugt werden, die außerdem mit Metainformationen angereichert werden müssen, falls es spezifische Eigenschaften für das Informationsobjekt gibt, die mit der Struktur der Klasse nicht wiedergegeben werden können. f02: Benutzerdefinierte Klassen. Das System muss die Möglichkeit zur Verfügung stellen, benutzerdefinierte Klassen zu erstellen, die sowohl mehrere Informationsobjekte aus den integrierten Systemen erfassen können, als auch von diesen erben können. Mit der Vererbung ist auch einen einheitlichen Zugriff über übergeordneten Klassen auf die Informationsobjekte in den Unternehmensanwendungen gegeben. f03: Komplexe Prozessabläufe - 1. Mit der Definition der benutzerdefinierten Klassen können Informationsobjekte in mehreren Unternehmensanwendungen nur mit einer Frage verändert, gelöscht oder hinzugefügt werden. Die Anforderung schließt nicht die Erfassung von einzelnen Eigenschaften von Informationsobjekten ein, sondern immer von den Objekten als Ganze. Außerdem müssen die Informationsobjekten-Klassen im System als Komponente vorliegen, die zur Entwicklung eigener komplexen Geschäftsprozesse benutzt werden kann. f04: Komplexe Prozessabläufe - 2. Die Verteilung der Anfrage an den mitwirkenden Enterpise Systemen soll für alle möglichen (s. f03) benutzerdefinierten Informationsobjekten als zyklenfreie Objektgrahpen automatisiert verlaufen. f05: Veröffentlichung der Informationsobjekte: Für jedes der Informationsobjekten muss jeweils einen entsprechenden Dienst erstellt werden. In Abbildung 3 sind die Systemgrenzen eines Integrationsbrokers in Bezug auf die in dieser Arbeit betrachteten Systeme angegeben. 15 Abbildung 3: Systemgrenzen aus der Sicht eines Integrationsbrokers Die Systemgrenzen stehen auch mit den verwendeten Programmierschnittstellen der Unternehmensanwendungen in Zusammenhang. Überbetrieblich legt der Broker Informationsobjekte und Dienste über SOAP-basierte Webdienste offen. 16 3 In Übersicht über die technischen Hilfsmittel in Microsoft Welt diesem Kapitel werden Programmierschnittstellen, Frameworks und Kommunikationsprotokolle vorgestellt, die bei der Arbeit von Bedeutung sind. Einige Technologien, wie Component Object Model sind nur indirekt eingesetzt worden, werden aber zum besseren Verständnis der Programmierschnittstellen mit ihren Hintergrundprozessen erläutert. 3.1 Microsoft .NET Die Grundidee von .NET ist, eine betriebssystemunabhängige Laufzeitumgebung als Entwicklungsplattform fürs Internet bereitzustellen. Es besteht aus einer Kombination von .NET Framework und verschiedenen .NET Diensten, wie z.B. Web Services und ASP.NET. Das Framework ist schichtweise aufgebaut, um ein strukturiertes Programmiermodell zur Verfügung zu stellen. Die Bausteine von .NET sind die Laufzeitumgebung und die Bibliotheken und Dienste (s. Abbildung 4). Abbildung 4: .Net-Framework Schichtendiagramm 17 Die Common Language Runtime (CLR) übernimmt die Verwaltung von Systemdiensten, wie die Thread- und Codeausführung, Überprüfung der Codesicherheit, Kompilierung, sowie Speicherverwaltung [MASFRE]. Durch Garbage Collection ist der Programmierer von der Aufgabe entlastet, den nicht mehr gebrauchten Speicherplatz freizugeben. Der Code, in dem .Net-Programme geschrieben sind, wird daher als verwaltet (managed) bezeichnet und der Code, der ohne das .NET Laufzeitsystem (CLR) ausgeführt werden kann, gilt als nicht verwalteter Code [MSDN11]. COM-Komponenten sind für das CLR dagegen unmanaged Code. Jedoch können unmanaged Komponenten durch COM Interop im verwalteten Code wieder verwendet werden. Mit den COM Interop-Tools werden die benötigten Typen importiert und dem managed-Code zur Verfügung gestellt. Über den so genannten Runtime Callable Wrapper (RCW) sorgt das Laufzeitsystem u.a. für das Lokalisieren, Laden und für die Zuordnung zwischen COM- und CLR-Datentypen. Zum Zeitpunkt der Programmentwicklung wird der Code in einer Zwischensprache – Intermediate Language (IL) übersetzt. Soll ein .NET Programm ausgeführt werden, sorgt der darin enthaltene Code dafür, dass die .NET Laufzeitumgebung gestartet wird, die in IL vorliegenden Programme und Komponenten geladen und diese zur Ausführung vorbereitet werden. Die Vorbereitung besteht darin, die Verweise aufzulösen und die verwendeten Typen3 zu laden. Anschließend wird der IL von einem Compiler, der sogenannte Just-In-Time (JIT) Compiler, in ausführbaren Code übersetzt und unter Kontrolle von CLR ausgeführt. An dieser Stelle werden auch Informationen vom Programm herausgefiltert, wie Herkunft und Signatur des Herstellers, die für den Sicherheitsmechanismus wichtig sind. Der .NET-Code wird auch als typensicher bezeichnet. Der Code ist typensicher, wenn er nur auf Speicher, der ihm explizit zugewiesen wurde, und auf Typen nur durch offen gelegte Schnittstellen zugreift. Die .NET-Klassenbibliothek setzt auf CLR auf, die Bibliotheken und Dienste zur Verfügung stellt, deren Klassen von jeder beliebigen .NET Sprache aus aufrufbar sind. Die Klassen werden in Namensräume strukturiert und verwaltet. Die oberste Schicht des Frameworks bilden ASP.NET und Windows Forms, die die Möglichkeit bieten Web- bzw. Windowsanwendung zu erstellen. Die folglich aufgeführten Namensräume implementieren Konzepte, die später in der Arbeit gebraucht werden. Die Klassen und Code-Beispiele sind entsprechend in C# angegeben. 3 In .NET wird zwischen Werte- und Referenztypen (Objekte) unterschieden. Bei Übergabe als Parameter einer Methode werden für die Wertetypen Kopien und für die Referenztypen Referenzen auf das gleiche Objekt verwendet. 18 Deklarationsinformationen C# ist die Programmiersprache, die bei der Entwicklung des Prototyps verwendet wird. Ein großer Teil der Sprache ermöglicht das Festlegen von Deklarationsinformationen zu den im Programm definierten Entitäten, wie z.B. die „method-modifiers“ (public, protected…) für die Zugriffsmöglichkeit einer Methode. C# ermöglicht aber auch die Einführung neuer Arten von Deklarationsinformationen, die als Attribute bezeichnet werden. Diese werden über die Deklaration von attribute-Klassen definiert. Eine attribute-Klasse wird von der abstrakten System.Attribute-Klasse abgeleitet. Attribute können für verschiedene Arten von Deklarationen verwendet werden, wie z.B. Typdeklarationen, accessor-Deklarationen für Eigenschaften, Schnittstellendeklarationen u.s.w. Die Attribute einer Deklaration werden in eckigen Klammern angegeben. Ein Attribut besteht aus einem Namen, der dem Namen der attribute-Klasse entspricht, und aus einer optionalen Liste positioneller und benannter Argumente. Die benannten Argumente legen die Werte zusätzlich über den Namen des Arguments im Konstruktor der argument-Klasse fest. Die positionellen Argumente dagegen hängen von der Position des Arguments im Konstruktor ab. In dieser Arbeit werden eigene Attribut-Klassen für die Deklarationen der aus einem relationalen Datenbanksystem gewonnenen Entitäten definiert. Beispielsweise wird mit folgender Deklaration ein Mapping einer Eigenschaft einer Klasse zu einem Xml-Element in einem Xml-Dokument definiert. Es werden zwei Properties des Attributs angegeben, der Name des Elements und den entsprechenden Namensraum im Xml. [System.Xml.Serialization.XmlElementAttribute("message", Namespace="urn:content-classes:")] public MessageCollection message{…} In dieser Arbeit werden Attribute auch Annotations genannt, wie sie bei anderen Plattformen heißen (Java). 3.1.1 Xml-Unterstützung in .NET Die Xml-Dokumente4 sind baumförmig strukturiert. Der Namensraum System.Xml enthält Klassen, die den Knoten in der Baumstruktur entsprechen [HAN02]. Die Klassen implementieren also den Xml Information Set und bilden ein Objektmodell für XmlDokumente. Es gibt zwei Programmierschnittstellen zur Verarbeitung von Xml: 4 Die Extensible Markup Language (Xml) ist ein Standard zur Erstellung strukturierter, maschinen- und menschenlesbarer, baumförmiger Dokumente. Xml definiert dabei den grundsätzlichen Aufbau der Dokumente [W32005], indem die Knoten der Baumstruktur in einem weiteren Standard – Xml Information Set [W32004] definiert werden. 19 • SAX (Simple Api for Xml) gibt den Parser vor, ein Xml-Dokument als Datenstrom anzusehen und beim Durchlauf der Knoten im Dokumentenstruktur ein Strom von Ereignissen zu produzieren. Es wird den Anwendungen überlassen, welche und wie sie Ereignisse verarbeiten. Ein Nachteil besteht darin, dass nur ein vorwärtsgerichtetes Arbeiten möglich ist. SAX ist in diesem Namensraum mit der Klasse XmlReader und ihren Nachfahren XmlTextReader, XmlNodeReader und XmlValidatingReader vertreten. • DOM (Document Object Model) stellt ein Objektmodell zur Verfügung, mit dem der gesamte Dokumentbaum im Speicher aufgebaut wird. So werden Beziehungen zwischen den Knoten, wie z.B. Eltern-, Geschwister- und Kinderknoten, beibehalten. In diesem Objektmodell entspricht jeder Knoten der Instanz einer Klasse, die von XmlNode abgeleitet wird. Das gesamte Dokument wird durch die Klasse XmlDocument repräsentiert. System.Xml.XmlSchema Ein Xml-Schema ermöglicht das Erstellen und Überprüfen von Xml-Dokumenten. Es definiert die Struktur der Xml-Dokumente durch Festlegen der Elemente, die in Dokumenten verwendet werden dürfen. Es definiert außerdem für diese Elemente die Struktur und die Typen, denen diese Elemente entsprechen müssen, um für dieses Schema gültig zu sein. Das Schema ist seinerseits auch ein Xml-Dokument, in dem beispielsweise Elemente und Attribute durch element- und attribute-Elemente deklariert werden und die Struktur mit Hilfe von complexType- und simpleType-Elemente vorgeschrieben wird. Die Struktur und gültiger Inhalt eines Xml-Schema-Dokuments wird mit der Xml Schema Definition (XSD5)–Sprache definiert [MSDN13]. Der Namensraum System.Xml.Schema besteht aus Klassen, die die Unterstützung für XSD bereitstellen. Das sind die Klassen, die zur Validierung der Xml-Dokumente auf Gültigkeit benötigt werden, sowie die Klassen, mit denen das Schema Object Model (SOM) gebildet wird. Dabei wird ähnlich wie bei DOM, die Baumstruktur eines Schemas in einem Objektmodel abgebildet. Beispielsweise enthält die XmlSchema-Klasse die Definition eines Schemas. Alle XSD-Elemente sind dem schema-Element untergeordnet, das im Objektmodel 5 Xml Schema ist eine Sprache zur Definition von Xml Dokumenten. XSD ist die Abkürzung von Xml Schema Definition, standardisiert von World Wide Web Consortium[W32001]. Dabei geht es um standardisierte Schemaüberprüfung und -zuordnung, sowie um die Definition von Datentypen für XSD. 20 von der XmlSchema-Klasse XmlSchemaComplexType und vertreten wird. Entsprechend XmlSchemaSimpleType das repräsentieren complexType- und die das simpleType-Element. Nach der programmatischen Erstellung eines Schemas kann sie mit der Methode Compile der XmlSchema-Klasse verifiziert werden. Dabei wird z.B. überprüft, ob die Struktur richtig ist und ob Typen richtig abgeleitet sind. Während der Validierung können über einen ValidationEventHandler die Fehler und Warnungen abgefangen werden. Mit der Compile-Methode wird außerdem der post-schema-validation infoset [W30304] erstellt. SOM repräsentiert das Model vor und nach dem Ausführen der Compile-Methode. Eigenschaften wie z.B. ElementType der XmlSchemaElement-Klasse werden erst nach der Validierung des Schemas gesetzt. Vor der Validierung enthält es eine Null-Referenz. System.Xml.XPath Der Namensraum enthält die Klassen, die die Abfrage von Xml-Strukturen mit Hilfe der XPath-Sprache [W31999] ermöglichen. Die wichtigsten Klassen in diesem Namespace sind die XPathDocument und die XPathNavigator. Der XPathNavigator basiert auf dem XPathDatenmodell, das auf dem Xml Information Set beruht ([W31999] - B References). Eine Instanz dieser Klasse wird durch Aufruf der Methode CreateNavigator der XmlNode- oder XPathDocument-Klasse erhalten. XPathNavigator stellt Methoden zur Verfügung, die zur Filterung von Xml-Strukturen oder zur direkten Navigation durch den Knoten eines XmlDokuments benutzt werden können. Bei der Filterung wird ein XPathNodeIterator zurückgegeben, mit dem die Ergebnisse der Anfrage durchlaufen werden können. Einmal gefiltert, gibt es keine Möglichkeit weiter mit den Klassen aus dem System.Xml-Namensraum zu arbeiten. Die Verbindung zwischen dem System.Xml.XPath-Namensraum und dem Objektmodel in System.Xml wird erst in Version 2.0 des .NET-Frameworks eingeführt. Eine Alternative dazu bieten die zwei Methoden SelectNodes und SelectSingleNode der XmlDocument-Klasse, die entsprechend eine Liste von Knoten - XmlNodeList und einen Knoten – XmlNode zurückgeben [HANI02]. System.Xml.Serialization Serialisierung bedeutet das Speichern des Zustandes von Objekten, z.B. in eine Datei, oder die Verpackung der Objekte für den Transport über Prozess- und Maschinengrenzen bei einem entfernten Aufruf. Mit dem Zustand sind die aktuellen Daten und Variableninhalte des Objekts gemeint. Xml ist innerhalb von .NET-Framework die Grundlage für die 21 Serialisierung von Klasseninstanzen. Die Namensräume System.Xml und System.Xml.Serialization sind Bestandteil von dem Framework und bieten die für diesen Zweck benötigten Funktionalitäten. Mit Deserialisierung wird das Laden einer Klasseninstanz aus einem Xml-Dokument bezeichnet. Der Prozess der Serialisierung und Deserialisierung kann über den Einsatz verschiedener Attribute gesteuert werden. Beispielsweise kann das Wurzelelement eines Xml-Dokuments mit [XmlRoot()] geändert werden, oder anstatt für ein Feld ein eigenes Xml-Element zu generieren, kann mit [XmlAttribute] ein Attribut des umgebenden Elternelements hinzugefügt werden. 3.1.2 Code-Generierung mit System.CodeDom-Namespace Für die automatische Code-Generierung wird in .NET-Framework den Namensraum System.CodeDom (Code Document Object Model) bereitgestellt. Er enthält Klassen, die viele Quellcode-Konstrukte repräsentieren, ohne sich auf die Syntax einer Programmiersprache festzulegen [CAZZ04]. Die Klassen können benutzt werden, um die Struktur eines Quellcode-Dokuments als ein Objektgraph zu modellieren. Der Graph kann danach mit Hilfe des System.CodeDom.Compiler-Namensraums als Quellcode in einer unterstützten Programmiersprache ausgegeben werden. Für die Codegenerierung aus einem Xml Schema wird der CodeDom-Namensraum in Zusammenhang mit der Serialisierungskomponente im nächsten Punkt beschrieben. Codegenerierung aus XSD Das xsd.exe-Tool generiert Code aus einer Xml Schema-Definition. Es bietet jedoch keine Möglichkeit, diesen Prozess anzupassen. Das Tool benutzt Klassen, wie XmlSchemas, XmlSchemaImporter, XmlTypeMapping, XmlCodeExporter von System.Xml.SerializationNamespace, die in .Net 1.1 nach der Dokumentation nur für internen Gebrauch gedacht sind. Diese Klassen implementieren das XSD->CLR-Datentypenzuordnung, die Vererbung von Typen in XSD, Serialisierungsattribute und weitere Problemstellungen, die bei manueller Generierung von Code durch Durchlaufen des Xml Schema-Objectmodell bestehen. Mit der XmlSchemaImporter-Klasse werden Typen einer Ansammlung von XmlSchema-Objekten nach ihrem qualifizierten Namen (Namensraum und Name) importiert. Sie werden als XmlMapping-Objekte (stellt die Zuordnung XSD->CLR-Datentypen dar) zurückgegeben und 22 durch Einsatz einer Instanz der XmlSchemaExporter-Klasse in einem CodeDom-Namensraum eingefügt. Einen Nachteil besteht darin, dass nur global definierte Elemente, die Kinder des schema-Elements in XSD sind, importiert werden können. Nachdem der Namensraum aufgefüllt ist, können aber weitere Änderungen an dem CodeDom-Objektgraph vorgenommen werden. 3.1.3 Reflektion mit den System.Reflection- und System.Type-Namespace Der System.Type stellt Typdeklarationen wie Klassentypen, Schnittstellentypen, Wertetypen etc. dar. Es stellt die Basis für die System.Reflection-Funktionalität und das Hauptverfahren für den Zugriff auf Metadaten [MSDN20]. In .NET enthalten Assemblies Module, die Module bestehen aus Typen (Klassen, Strukturen), die ihrerseits aus Member bestehen. Reflektion stellt Objekte zur Verfügung, die die genannten Konstrukte einkapseln. Mit dem System.Reflection–Objektmodell lassen sich Typinformationen über ein vorhandenes Objekt erhalten sowie Instanzen von Typen dynamisch erzeugen (System.Reflection.Emit). Mit FieldInfo und PropertyInfo lassen sich Informationen wie z.B. Name und Datentyp ermitteln, sowie Werten abfragen oder festlegen. Außerdem können auch Attributen eines Konstrukts abgerufen werden, z.B. liefern die folgenden Anweisungen alle deklarierten Attribute einer Eigenschaft und eines Typs. System.Reflection.PropertyInfo: propertyInfo.GetCustomAttributes(…) System.Type: type.GetCustomAttributes(…) 3.1.4 Webdienste mit ASP.NET Aus dem Bedarf an Anwendungen, die auf mehreren Computern ausgeführt werden, entstehen Modelle für die Verteilung und Interaktion von Computer-Programmen. Die Webdienste von Microsoft .NET stellen Dienste für andere Prozesse im Internet oder Intranet zur Verfügung. Da Webdienste auf offenen Standards wie XML, HTTP und SOAP(Simple Object Access Protocol) basieren, sind sie unter Verwendung eines URL (Uniform Ressource Locator) einfach zu adressieren, aufzurufen und konsumieren [MASFRE]. Mit SOAP wird die Möglichkeit XML-basiert Anfragen und Antworten über HTTP zu versenden. Damit können sowohl die Web-Methode als auch deren Aufruf-Parameter spezifiziert werden. Auf gleiche Weise werden die Ergebnisse eingepackt und zurückgegeben. SOAP-basierte Webdienste ermöglichen die Übergabe von komplexen Datenstrukturen in 23 Xml-Format sowie Funktionalitäten, wie z.B. Authorisierung und Athentifizierung über Webdienst-Erweiterungen (WS-Extensions). Bei einem Dienstorientierten-Ansatz wird der Dienst genau einmal implementiert und auf einem Server für Zugriffe von außen bereitgestellt. Die Webdienste mit ASP.NET müssen als Klassen-Dateien in einem Virutelen-Verzeichnis von Internet Information Server (IIS) gespeichert sein und die Endung .asmx besitzen. Die Erstellung von ASP.NET-Webdienste kann nur durch die Deklaration von Attributen für die Klasse und ausgewählte Methoden erfolgen. Die Webdienst Klasse kann aber auch von der Klasse System.Web.Services.WebService abgeleitet sein. public class ExchangeMessageDAO : System.Web.Services.WebService { … … [WebMethod] public bool deleteMessage(Message message) { return dal.deleteObject(message); } …… } Die Webdienste in ASP.NET sind WS-I Basic-Profile-konform und damit für alle WS-Ikonforme Klienten nutzbar. Mit dem Basic-Profile werden Regeln für die SOAP-Nachrichten festgelegt und alle, die diese Regeln bei der Implementierung des Protokolls befolgen, sollten Problemlos mit einander über SOAP-Nachrichten kommunizieren können. ASP.NET implementiert aber die Erweiterungen nicht, die z.B. die Authentifizierung über Webdienste ermöglichen. Diese müssen separat installiert werden. Das neue Framework von Microsoft für verteilte Anwendungen - Indigo umfasst mehrere Komponenten und Technologien, wie z.B. seinen Vorgänger .NET-Remoting und Framework zur Entwicklung von WS-I konforme Webdienste mit mehreren zur Verfügung gestellten Erweiterungen. Mit Indigo können auch Anwendungen entwickelt werden die nicht in IIS installiert sein müssen, das wird von den Microsoft Windows Activation Services (WAS) ermöglicht. Indigo garantiert nicht die Integration von Anwendungen, die die für ASP.NET entwickelten WS-* (WS-Erweiterungen)-Komponenten verwenden. using System.ServiceModel; [ServiceContract] class Calculator { [OperationContract] private int Add(int a, int b){ return a+b; }…… 24 Wie in dem Beispiel zu sehen ist, führt Indigo das Konzept von Contracts. Jede IndigoDienstklasse implementiert ein Service Contract., die die Operationen der Dienste offen legen. 3.2 Kommunikationsprotokolle und Schnittstellen 3.2.1 Component Object Model Component Object Model (COM) ist die Microsoft Technologie für die Entwicklung und Nutzung objektorientierter Softwarekomponenten [SCHW01]. COM stellt einen Binärstandard für Komponenten dar und ist daher programmiersprachunabhängig. Mit dem Binärstandard wird ein Satz von Datentypen definiert und festgelegt, wie diese in Bytefolgen umgesetzt werden. Darüber hinaus wird einen Mechanismus angegeben, wie Komponenten lokalisiert werden und wie den angehörigen Programmcode aufgerufen wird. COM basiert auf die Object Linking and Embedding (OLE)-Technologie, die heute in Form von ActiveX-Technologie6 Teil von COM ist. Der Begriff Automation entstand aus der ersten Version von OLE und diente der entfernten Steuerung von Office-Anwendungen wie Excel und Word. COM Automation steht für dynamischen Aufruf und ist eine Weiterentwicklung der OLE-Automation. COM-Objekte bilden Server, die von anderen Programmen, Clients, genutzt werden können. Im Gegensatz zu statischem Binden, wo der Client zur Entwicklungszeit die Position(offset) einer Funktion in einer virtuellen Funktionstabelle (vTable) kennt, ist bei dynamischem Binden die Position einer Methode nicht bekannt. Diese wird mit Hilfe von verschiedenen Mechanismen zur Laufzeit ermittelt. Ob eine Komponente mit oder ohne Automation entworfen ist, kann aus den implementierten Schnittstellen festgestellt werden. Alle COMKlassen implementieren die Schnittstelle IUnknown. Alle COM-Schnittstellen sind auch von IUnknown abgeleitet. Diese Schnittstelle definiert drei Methoden für die Komponentennutzung. Mit QueryInterface wird überprüft, ob die Komponente eine als Parameter übergebene Schnittstelle unterstützt und gegebenenfalls eine Referenz auf diese Schnittstelle zurückgibt. Mit den weiteren zwei wird einen Verweiszähler entsprechend hoch gezählt oder heruntergesetzt. Die Verwendung einzelner Komponenten wird von COM durch das Zählen von Verweisen registriert. Beim Aufruf einer Methode auf einer Schnittstelle wird zuerst überprüft, ob der Verweiszähler auf 0 steht. Wenn das der Fall ist, wird zuerst die Komponente, zu der die Methode gehört, geladen und initialisiert. Andernfalls wird der 6 ActiveX stellt einen COM-Dienst dar, der im Beitrag [Q154544] in der Knowledge Base genauer mit den Teiltechnologien definiert wird. 25 Zähler erhöht, bei einer Methodenrückgabe wird der Verweiszähler heruntergesetzt. Erreicht der Verweiszähler den Wert 0 wird die Komponente freigegeben. Die über dynamisches Binden benutzten Objekte implementieren die IDispatch Schnittstelle, die außer von IUnknown vererbten Funktionalitäten noch die Möglichkeit bereitstellt, eine Methode über ihren Namen in Textform aufzurufen. Die wesentlichen Probleme von wieder verwendbaren Komponenten sind die Namens- und Versionsauflösung. Beim Gebrauch von externen Komponenten muss der Code einer Anwendung immer auf dem aktuellen Stand gehalten werden, damit Inkompatibilitäten vermieden werden können. Beim Einsatz von COM-Komponenten kann das Problem umgangen werden, indem beim Aufruf von externen Schnittstellen und Komponenten GUID (Global Unique Identifier – eine 128 Bit Zahl) benutzt wird. Jede Schnittstelle in COM ist durch eigene GUID eindeutig definiert. Da viele Microsoft Unternehmensanwendungen über COM-Schnittstellen verfügen, ist die Idee entstanden, die einheitliche Webdienstschnittstelle über die von den COM-Komponenten bereitgestellten Schnittstellen zu bilden. Im Ablauf des Arbeitsprozesses ist diese Absicht verworfen, weil gleichzeitig das Ziel bestand, eine Modelgetriebene Architektur zu schaffen. Das bedeutet, sich nicht auf die Funktionalitäten der COM-Komponenten, sondern auf die Modelle in den Unternehmensanwendungen zu konzentrieren. Für diese Modelle werden universelle Datenzugriffsfunktionen als Webdienste ausgesetzt, indem internettaugliche Programmierschnittstellen der Unternehmensanwendungen bevorzugt werden. 3.2.2 Ole DB OLE DB definiert eine umfassende Menge von COM-Schnittstellen, die verschiedene Datenbank-Verwaltungsdienste (DBMS7) einschließen und bildet somit die Programmierschnittstelle, die die Microsoft-Strategie für Universal Data Access[MSDN05] umsetzt. Die Strategie stellt Anforderungen für einen einheitlichen Zugriff und für die Fähigkeit in Datenquellen, die nicht Teil eines DBMS sind, zugreifen zu können. Einheitlich bedeutet in diesem Zusammenhang, dass es grundsätzlich möglich ist, die gleiche Abfrage in allen Datenquellen durchzuführen. Im Gegensatz zu ODBC8 ermöglicht OLE DB den Zugriff sowohl auf relationale (strukturierte), als auch auf nichtrelationale und hierarchische (semi- 7 Eine Datenbank wird überlicherweise von einem Datenbank-Managementsystem(DBMS) verwaltet[KEMP04]. Open Database Connectivity ist der Vorgänger von OLE DB, der sich auf strukturierte(relationale) Datenquellen und SQL-Befehle beschränkt. [MSDN02] 8 26 strukturierte) Datenstrukturen (s. Kapitel 2.2). Darüber hinaus können OLE DB-Befehle nicht nur SQL-Anweisungen sein. Sie müssen nur im verständlichen für den Zielprovider Syntax geschrieben sein. Weiterhin führt OLE DB das Konzept von Datenprovider und Datenkonsumenten ein und stellt eine Relation zwischen diesen. Die Datenkonsumenten sind die Clientkomponenten, die Daten anfordern und transportieren. Die Datenprovider enthalten die Daten und legen diese offen. OLE DB-Datenprovider können viele Datenquellen unterstützen – von einer SQL DBMS bis zu Textdateien und Datenströme [ESPO01]. Eine Liste mit OLE DBDatenprovidern für relationale Datenbanken, Dateisysteme und andere Datenquellen sowohl von Microsoft, als auch von anderen Herstellern ist in [SCHW01] angegeben. Sowohl Konsumenten als auch Provider sind COM-Objekte. Über abstrakten Schnittstellen, wie DataSource, Command, Rowset, implementiert von einem Datenprovider, können die Konsumenten z.B. eine Verbindung mit einer beliebigen Datenquelle (Datasource) anfordern, über diese Command ausführen lassen und Rowset abrufen. OLE DB beinhaltet, außer Konsumenten und Provider, eine dritte COM-Komponente, die OLE DB-Dienste. Diese erweitern die Funktionalitäten von OLE DB. Sie verarbeiten, die von der Datenquelle erhaltenen Daten (Rowset) und geben diese anschließend an den Datenkonsument weiter. OLE DB stellt ein Interaktionsmodel, bei dem die Verbindung zwischen Datenkonsumenten und Datenprovider nicht die ganze Zeit aufrechterhalten werden muss. Nachdem die Verbindung hergestellt ist, die Abfrage abgeschickt ist und das Ergebnis vorliegt, wird die Verbindung wieder getrennt. Mit dem Ergebnis wird offline gearbeitet und bei Änderungen an den Datensätzen die Verbindung wieder hergestellt [ESPO01]. Damit der Zugriff auf unterschiedlichen Datenquellen überhaupt möglich ist, definiert OLE DB Datentypen, die aus OLE- und Microsoft Windows-Datentypen zusammengesetzt sind. Der Datenprovider übernimmt die Zuordnung von OLE DB-Datentypen und nativen für die Datenquelle Datentypen, sowie die Durchführung benötigter Transformation. Die OLE DBDatentypen werden durch Indikatoren eindeutig festgelegt. Der Indikator ist eine Variable von dem enumerierten Typ DBTYPE und wird den Metadaten hinzugefügt, um den Datentyp eines Parameters oder einer Spalte zu spezifizieren [MSDN09]. enum DBTYPEENUM { // The following values exactly match VARENUM // in Automation and may be used in VARIANT. DBTYPE_EMPTY = 0, DBTYPE_NULL = 1, 27 DBTYPE_I2 = 2, DBTYPE_I4 = 3, ………… } Der Typ DBTYPE_I4 einer Spalte wird also in den Metadaten durch einen Wert von 2, der die Position in der Enumerierung entspricht, angegeben und stellt beispielsweise in .NET einen 4-Byte Integer dar. Schemainformationen werden bei OLE DB über den vordefinierten „schema rowsets“ mit IDBSchemaRowset::GetRowset erhalten [MSDN10]. Die „schema rowset“ legen das Format, wie Spaltennamen und Spaltendatentypen, der zurückgegebenen System.Data.DataTableSchemainformationen fest. Alle „schema rowsets“ enthalten außerdem einen eindeutigen Identifikator GUID, der als Parameter an GetRowset übergeben wird. Der TABLES-Rowset (TABLES ist der Wert von GUID) z.B. identifiziert die Tabellen, inklusive Sichten, die in einem Datenbank-Katalog definiert und für einen gegebenen Benutzer zugreifbar sind. Der FOREIGN_KEYS-Rowset dagegen spezifiziert die Fremdschlüsselspalten. Weiterhin ist beispielsweise festgelegt, das die dritte Spalte der zurückgegebene Tabelle für den FOREIGN_KEYS-Rowset den Namen PK_TABLE_NAME hat, vom Typ DBTYPE_WSTR ist und somit als Wert den Namen der Tabelle hat, die vom Fremdschlüssel referenzierten Primärschlüssel enthält. 3.2.3 Lightweight Directory Access Protocol Das Protokoll ist entworfen, um den Zugriff auf Verzeichnisse9 zu ermöglichen, die die X.500-Modelle [RFC2256] unterstützen. Im Gegensatz zu X.500 Data Access Protocol (DAP) definiert LDAP den Aufbau des Verzeichnisses nicht, sondern nur ein Teil der X.500DAP Funktionen (die search-, compare-, add-, delete-, modify-, modifyRDN-Funktion [SCHW01]), die aber durch Emulation den vollständigen Zugriff auf X.500-Verzeichnisse ermöglichen. Es wurde von der Internet Engineering Task Force (IETF) standardisiert [RFC2251] und basiert auf dem TCP/IP-Stack mit der Portnummer 389. Ein LDAP-Verzeichnis enthält Einträge, die ihrerseits aus Attributen bestehen. Die Attribute besitzen Typen, die durch ihren Namen eindeutig identifizierbar sind und auf Grundlage von X.500-Benutzerschema [RFC2256] definiert werden. Jeder Eintrag besitzt ein Attribut des Typs „objectClass“, das den Typ des Eintrags spezifiziert. Die Attribute können einen oder 9 Ein Verzeichnis dient dem Verwalten, Finden und Nutzen von entfernten Resourcen (s. Kapitel 2.3.2). 28 mehrere Werte enthalten. Beispielsweise enthält ein Eintrag für das Attribut „objectClass“ den Wert „person“, für das Attribut „Name“ (oder der LDAP-Name CN, für Common Name) - „Doe“ und für das Attribut „Hobby“- „Kino, Malen, Theater“. Die LDAP-Namen für die Attribute „Country“ und „Organization“ sind entsprechend C und O. Darüber hinaus besitzt jeder Eintrag das Attribut „distinguishedName“ (DN) in X.500-Notation, das ihn eindeutig bezeichnet. Er besteht aus Attribut-Wert-Paare (RDN für Relative DN), wie im Folgenden Beispiel erläutert: „cn=Doe, o=tum, c=de“ bezeichnet einen DN, bestehend aus mehreren durch Komma getrennte RDNs. Daraus ergibt sich die Anordnung der Einträge in einer Baumstruktur. Diese wird Directory Information Tree genannt und wird weiter im nächsten Kapitel in Zusammenhang mit Active Directory Services behandelt. 3.2.4 Active Directory Service Interfaces Mit Active Directory Service (ADS) bietet Microsoft eine homogene Sicht auf eine Vielzahl von Verzeichnisdiensten (z.B. Active Directory, Exchange Server und Internet Information Server), indem für jeden Verzeichnisdienst einen Provider zur Verfügung gestellt wird und ein allgemeines ADS-Meta-Objektmodell auf den Providern aufgesetzt wird. Die Provider (s. Abbildung 5) realisieren den eigentlichen Zugriff auf die Verzeichnisobjekte und stellen COM/DCOM-Schnittstellen für die ADS-Interfaces (ADSI) bereit, die ihrerseits von den Benutzern verwendet werden, um Verzeichnisobjekte in Form von COM/DCOM-Objekten zu erhalten. Abbildung 5: Active Directory Service Interfaces 29 Die in der Abbildung dargestellten Provider werden mit Windows 2000 und Windows 2003 installiert. Einen ADSI-Dienstprovider für den Microsoft Internet Information Server Metabase wird mit dem Internet Information Server installiert. ADSI macht es viel einfacher Anwendungen Verzeichnisdiensttauglich zu machen. Es wird nur mit einem einzigen Set von Verzeichnisdienstschnittstellen gehandelt, ohne Rücksicht darauf zu nehmen, welche Verzeichnisdienste installiert sind. Die Verzeichnisdienstschnittstellen sind COM-Schnittstellen, die für den Zugriff auf die Funktionen und Eigenschaften von Verzeichnisdiensten über die Dienstprovider benutzt werden. Die Entwickler und Administratoren spezifizieren und verwalten Ressourcen in einem Verzeichnisdienst, unabhängig von der Netzwerkumgebung, die die entsprechende Ressource beinhaltet. ADSI ermöglicht allgemeine Administrativaufgaben zu bewältigen, wie z.B. Einfügen eines neuen Benutzers, Druckerverwaltung, sowie Lokalisierung von Ressourcen in einer verteilten Computerumgebung. Das Meta-Objektmodel ist mit dem von LDAP eng verwandt [BEIG97]. Die Attribute heißen bei ADSI „Properties“ und beschreiben beliebig genau ein Verzeichnisobjekt (einen Eintrag im Verzeichnis). Der Kern des MetaObjektmodels unterscheidet zwischen Container-Objekte und Directory-Leaf-Objekte, welche die persistenten Objekte des darunter liegenden Verzeichnisdienstes repräsentieren. Ein Container kann sowohl andere Einträge, als auch Container beinhalten. Die Schnittstellen im Meta-Objektmodell, die diese abstrakten Objekte vertreten, werden von den Dienstprovidern spezifisch für den entsprechenden Verzeichnisdienst implementiert. Die Methoden und Eigenschaften, die von den ADSI-Schnittstellen offen gelegt werden, werden nicht von allen Dienstprovidern unterstützt. Je nach Verzeichnisdienst können verschiedene Objekttypen und Eigenschaften gespeichert werden und verschiedene Netzwerkprotokolle und Authentifizierung verwendet werden. Also gibt es Schnittstellen und Methoden, die z.B. mit LDAP funktionieren, aber nicht mit WinNT. Damit definiert jeder Provider eine eigene Hierarchie von Objekten. Jedes Objekt besitzt innerhalb der Hierarchie einen eindeutigen Pfad (ADsPath), der auch als URL angegeben werden kann und im Allgemeinen folgendermaßen aussieht: Namensraum(Providername)://Host(Domäne)/provider_spezifischen_ressource_identifikator In Tabelle 1 sind die Provider aufgelistet, die für diese Arbeit von Bedeutung sind. 30 Provider Beschreibung LDAP Namensraum-Implementierung kompatibel mit Lightweight Directory Access Protocol WinNT WinNT Namensraum-Implementierung kompatibel mit Windows NT/Windows 2000. IIS ADSI Der ADSI-Dienstannbieter, genau wie WMI-Dienstanbieter, stellt mithilfe von IISAdminobjekte eine einheitliche Syntax für den Zugriff auf IIS-Konfigurationsdaten zur Verfügung. Tabelle 1: ADSI-Provider Mit dem LDAP-Provider wird der Zugriff auf LDAP-fähige Verzeichnisdienste ermöglicht, wie z.B. Windows 2000/2003 Active Directory und Microsoft Exchange Server. Mit dem WinNT-Provider ist der Zugriff auf das Windows-NT4-Verzeichnis und Windows 2000/2003-System ohne installiertes Active Directory möglich. Der WinNT-Provider kann auch das Active Directory ansprechen, jedoch nur eingeschränkt. Die Dienstprovider werden in Zusammenhang mit den entsprechenden Unternehmensanwendungen im Kapitel 4 behandelt. Die ADSI-Komponente definiert primären, unmanaged Datentypen [MSDN19], die sie in ihrer Strukturen und Schnittstellen benutzt. In der Struktur ADSTYPEENUM [MSDN17] definiert sie weitere Datentypen, die für die Identifikation des Typs eines Attributs im ADSI benutzt wird. Der Dienstprovider ist dafür zuständig, die ADSI Datentypen den für das Kommunikationsprotokoll spezifischen Datentypen zuzuweisen. .NET-Framework-Directory Services-Komponente Die in diesem Namensraum implementierte Komponente ermöglicht den einfachen Zugriff auf Verzeichnisdienste aus verwaltetem Code. Namensraum Mit dem System.DirectoryServices- kann die Struktur eines Verzeichnisdienstes durchlaufen, durchsucht und geändert werden, sowie die Eigenschaften eines Knotens gelesen oder überschrieben werden. Die wichtigsten Komponenten-Klassen sind DirectoryEntry und DirectorySearcher, die die ADSI-Technologie verwenden. Die DirectoryEntry-Klasse repräsentiert einen Knoten oder Objekt in der Verzeichnisdienst-Hierarchie. Sie ermöglicht das Anbinden von Objekten, das Lesen und Aktualisieren von Eigenschaften und, mit Hilfe von anderen Klassen in diesem Namensraum, die Navigation im Verzeichnisdienst. Untergeordnete Knoten können somit gelöscht, umbenannt, erstellt oder verschoben werden. Beim Anbinden wird das Objekt mit 31 dem ADsPath-String eindeutig identifiziert. Von hier aus können weitere Objekte angebunden werden, indem nach diesen gesucht oder navigiert wird. Die Properties-Eigenschaft der DirectroryEntry-Klasse enthält die Attribute eines gebundenen Objektes. Die DirectoryServices-Komponente ist für das Mapping zwischen .NETDatentypen und ADSI-Datentypen verantwortlich. Der System.Boolean Datentyp wird heißt in ADSI ADSTYPE_ENUM (s. Kapitel 3.2.4). Um ein date/time-Attribut (property) eines Objekts (entry) im Verzeichnisdienst zu setzen wird ein .NET-System.DateTime-Objekt gebraucht. DateTime dt = new DateTime(2005, 5, 5, 11, 4, 5, 0); entry.Properties["myDateTimeProperty"].Value = dt; entry.CommitChanges(); Der Typ für date/time heißt im ADSI ADSTYPE_UTC_TIME. Um die Änderungen in Verzeichnisdienst zu speichern wird die CommintChanges-Methode aufgerufen. Einige Datentypen im ADSI haben keine Äquivalente im .NET-Framework. Wenn der Verzeichnisdienst z.B. einen COM-Objekt zurückgibt muss das Objekt über COM Interop (s. Kapitel 3.1) mit einer ADSI-Schnittstelle gecastet werden. So einen Typ ist z.B. „DN with Binary“. Er stellt eine Folge von Bytes dar, die einen binären Wert und eindeutigen Namen enthält. Die Datentypen im Zusammenhang mit DirectoryService und Active Directory werden noch im Kapitel 5.2 behandelt. Mit der DirectorySearcher-Klasse kann das Verzeichnis durchsucht werden. Der einzige ADSI-Provider, der das unterstützt, ist der LDAP-Provider, also ist das Durchsuchen eines Verzeichnisses mit der DirectoryServices-Komponente nur bei Active Directory möglich. Die Klasse enthält zwei Eigenschaften, die für diese Arbeit von Bedeutung sind. Die SizeLimitEigenschaft beschränkt die Anzahl zurückgegebener Objekten. Der Standartwert von 0 bedeutet, dass die von Active Directory-Server vorgegebene Einschränkung von 1000 Einträgen verwendet wird. Die PageSize-Eigenschaft beschränkt bei einer Anfrage die Höchstanzahl von Objekten, die der Active Directory-Server auf einmal (Seitengröße) zurückgeben soll. Im Gegensatz zu SizeLimit, wenn die Client-Anwendung mehr Daten anfordert, startet der Server die Suche an der Stelle, wo er durch die PageSize-Einschränkung unterbrochen wurde. 3.2.5 Web Distributed Authoring and Versioning(WebDAV) Das WebDAV-Protokoll [RFC2518] erweitert das HTTP-Protokoll um neue Methoden, Header, Xml-Anfragen und Antworten, die einen WebDAV-Client die Erzeugung, Änderung 32 und Verschiebung von Dateien und Verzeichnisse auf dem Server erlaubt. Der Client kann sowohl auf die Metadaten einer Ressource zugreifen, wie z.B. den Autor und das Erstellungsdatum eines Dokuments ändern, als auch die Ressourcen für das Lesen von anderen Benutzern sperren. WebDAV definiert die Methodenparameter sowohl als HTTPHeaders, als auch im Xml-Dokument im Inhalt der HTTP-Anfrage. Xml wird aber auch für die Ergebnisse der Anfrage verwendet. Die Definition der Elemente und der Struktur der Xml-Dokumente wird von WebDAV vorgegeben [RFC2518]. WebDAV erweitert außerdem die Status-Codes von HTTP/1.1. Einige Methoden können gleichzeitig mehrere Ressourcen bearbeiten. Der Multi-Status-Antwort wird eingeführt, um Status-Informationen über mehrere Ressourcen zurückzugeben. Darüber hinaus muss WebDAV wegen der HTTP-Integration nicht auf Fähigkeiten verzichten, wie z.B. die verschlüsselte Kommunikation mit SSL, die auf Zertifikate basierende Authentifikation, „HTTP basic“-Authentifikation usw. HEADERS In diesem Abschnitt werden einige Headers vorgestellt, die von den Methoden verwendet werden. Der Destination-Header bestimmt die URI, die eine Zielressource für Methoden wie COPY und MOVE identifiziert, die zwei URIs als Paramter erwarten. Der Depth-Header wird mit Methoden verwendet, die auf potentiell geschachtelten Ressourcen zugreifen. Der Header legt fest, ob die Methode nur auf die Ressource ausgeführt wird („Depth:0“), auf die Ressource und seine unmittelbaren Kinder („Depth:1“), oder auf die Ressource und alle seine Nachfahren („Depth:infinity“). Der Header wird nur dann unterstützt, wenn die Definition der Methode es ausdrücklich angibt. Der Overwrite-Header legt für einige Methoden fest, ob die Zielressourcen überschrieben werden müssen. Wenn er den Wert „T“ enthält, wird vor dem Kopieren eine DELETEOperation mit einem Wert von „infinity“ des Depth-Headers auf die Zielressource ausgeführt. Mit dem Wert „F“ des Headers wird die Operation fehlschlagen. Das WebDAV-Protokoll definiert u.a. folgende neue HTTP-Methoden: COPY Die Methode erstellt ein Duplikat der Quellressource, identifiziert durch die Anfrage-URI, in der Zielressource, identifiziert durch den Destination-Header. Bei Collections wird das Duplikat abhängig vom Depth-Header erstellt. Mit einem Wert von „infinity“ werden die Nachfolger-Ressourcen rekursiv und relativ zum Zielpfad angelegt. Wenn die Zielressource 33 existiert, wird sie abhängig vom Overwrite-Header überschrieben oder die Operation unterbrochen. Im folgenden Beispiel wird die Datei datei.jpg des Benutzer user2 mit der vom Benutzer user1 überschrieben, was vom Statuscode (204) hervorgeht. >>Anfrage COPY /webordner/user1/datei.jpg HTTP/1.1 Host: www.example.com Destination: http://www.example.com/webordner/user2/datei.jpg Overwrite: F >>Antwort HTTP/1.1 204 No Content Der Statuscode 201 (Created) bezeichnet ein erfolgreicher Kopierungsvorgang ohne Vorkommnisse, wie z.B. das Überschreiben der Zielressource. Es können außerdem im HTTP-Rumpf mit XML Einschränkungen angegeben werden, die den Prozess des Kopierens von Properties vom Quell- nach Zielressource steuern. MOVE Ressourcen werden von einem URI zu einem anderen verschoben. Die MOVE Anfrage kopiert die Ressourcen analog zu der COPY-Methode, indem sie aber auf die Konsistenzhaltung achtet und anschließend die Delete-Methode ausführt. Die Konsistenzhaltung besteht in der Aktualisierung der URI, z.B. beim Kopieren von mehreren Ressourcen. MKCOL Mit der Methode eine neue Collection (Verzeichnis) an der durch den Ziel-URI definierte Stelle erstellt. Wenn bereits eine Ressource an dieser Stelle existiert, wird ein FehlerStatuscode (405- Method Not Allowed) zurückgegeben. Um ein Verzeichnis im /webordner zu erstellen, können die Anfrage und Antwort folgendermaßen aussehen: >>Anfrage MKCOL /webordner/files/ HTTP/1.1 Host: www.example.org >>Antwort HTTP/1.1 201 Created Weitere Fehler-Statuscodes weisen auf Problemfälle wie fehlender Speicherplatz, oder nicht ausreichende Rechte hin. 34 PROPFIND Wie bereits erwähnt, können WebDAV-Ressourcen über Metadateninformationen verfügen. Die PROPFIND-Methode ermöglicht es die Metainformation für eine durch den Anfrage-URI festgelegte Ressource abzufragen. Wenn die Ressource ein Verzeichnis ist, enthält sie auch die URI der Unterressourcen. Alle Werte des Depth-Headers sind erlaubt. Wenn der Header nicht angegeben ist, ist das Verhalten der Methode wie beim „Depth: infinity“. Mit einem propfind-Xml-Element kann eine Beschreibung der angeforderten Informationen zugeschickt werden. Die Angabe eines Rumpfes der HTTP-Anfrage ist nicht obligatorisch. LOCK und UNLOCK Das Sperren verhindert die gleichzeitige Bearbeitung eines Dokuments von mehreren Personen, indem eine Eigenschaft der Ressource (Dokument) gesetzt wird. Auf diese Weise wird das „lost update“-Problem gelöst, bei dem die Änderungen einer Person an einem Dokument, von einer anderen Person nicht beachtet und überschrieben werden. DELETE Mit dieser Methode wird die Ressource, bestimmt durch den Anfrage-URI, gelöscht. Wenn der URI auf ein Verzeichnis verweist, kann für den Depth-Header nur den Standardwert „infinity“ angegeben werden, um den Löschvorgang rekursiv auf alle Unterressourcen auszuführen. Wenn die Ressource kein Verzeichnis ist, wird der Ressource-URI von allen Kollektionen gelöscht, die ihn als Unterressource referenzieren. DELETE /webordner/ HTTP/1.1 Host: www.example.com >>Response HTTP/1.1 207 Multi-Status Content-Type: text/xml; charset="utf-8" Content-Length: xxxx <?xml version="1.0" encoding="utf-8" ?> <d:multistatus xmlns:d="DAV:"> <d:response> <d:href>http://www.example.com/webordner/resource</d:href> <d:status>HTTP/1.1 423 Locked</d:status> </d:response> </d:multistatus> Eine Unterressource des Verzeichnisses webordner im obigen Beispiel wurde für die Bearbeitung von anderen Benutzern gesperrt, also ist die Operation fehlgeschlagen und der Status mit genaueren Informationen als Xml im HTTP-Rumpf zurückgegeben. 35 Beispielsweise werden im Kapitel 4.1 einige Methoden im Zusammenhang mit der entsprechenden Unternehmensanwendung vorgestellt. 3.3 Objektmodelle Ein Objektmodel stellt eine Hierarchie von Objekten dar, die sowohl eine semantische Sicht auf das bestehende Datenmodell einer Domäne darstellt, als auch die allgemeine Modellierung des Verhaltens beschreibt. Es besteht aus Objekten und Beziehungen zwischen ihnen. Ein Objektmodell beschreibt aus einem Objekt als Einstiegspunkt, die Positionen der verbundenen Objekte. 3.3.1 Collaboration Data Objects CDO für Windows 2000 (CDO 2.0) ist das Objektmodell, das Datenobjekte für die Zusammenarbeit auf Dokumente bereitstellt und die Standard-API unter Windows 2000 zur Entwicklung webbasierten Messaging-Anwendungen darstellt. Als Systemkomponente(CDOSYS.DLL) ist das Objektmodell (s. Abbildung 6) mit den Microsoft Windows 2000/2003 Server-Installationen verfügbar. Abbildung 6: Collaboration Data Objects[CDOSDK] 36 Ein Message-Objekt enthält die Informationen einer Nachricht, die in einem Ordner gespeichert ist. Das Konfigurations-Objekt dient zum festlegen von Konfigurationsparameter wie Mailserver, Benutzername und Passwort etc. Mit den anderen dem Message-Objekt untergeordneten Objekten werden nachrichtenbezogene Attribute festgelegt, wie z.B. Absender, Empfänger, Inhalt etc. In einem Messaging-System (s. Kapitel 4.3) werden alle Arten von Einträgen, wie z.B. Kontakte, Termine u.s.w. als Nachricht bezeichnet, da diese genauso wie eine Email abgelegt sind. CDO 3.0 erweitert das Objektmodel von CDO 2.0 (CalendarMessage, Appointment, Person etc.), um die Inhalte eines Informationsspeichers besser widerspiegeln zu können. Die CDO 3.0 (CDOEX)-Komponente wird mit dem Exchange Server installiert. Sie verwendet ADO zur Bindung an Objekte. Mit CDOEX können im Exchange Store Items verwaltet werden, neue Nachrichten erstellt, gelöscht oder geändert werden, alle mögliche Nachrichten für den Kalender oder die Termine (inklusive Terminanfragen) erstellt werden. Weiterhin können Kontaktinformationen in Active Directory oder in öffentlichen Verzeichnissen verwaltet werden. Eine weitere Erweiterung von CDO bildet die CDO for Exchange Management-Komponente. Die Komponente setzt auf ADSI auf und vereinfacht durch ihr Objektmodel die Verwaltung des Exchange Servers. Unter anderem sind administrative Aufgaben wie das Anlegen und Verwalten sowohl von Postfächern und Empfängern, als auch der Hierarchien von öffentlichen Ordnern. Die Komponente CDO Workflow Objects for Microsoft Exchange (CDOWF) wird zur Entwicklung und Verwaltung von Arbeitsprozessen verwendet. 3.3.2 ActiveX Data Objects und ADO.NET Die Programmierschnittstellen von ODBC und OLE DB sind kompliziert und systemnahe. Mit ActiveX Data Objects (ADO) ist der Wunsch nach einer einfachen, objektorientierten, auf Basis der komplexen OLE DB-Schnittstelle Programmierschnittstelle erfüllt. Als eine automationsfähige (s. Kapitel 3.2.1) COM-Komponente ist ADO programmiersprachenunabhängig. Die COM-Schnittstellen von OLE DB dagegen sind nicht automationsfähig und können nur von C++ aus komplett genutzt werden [SCHW01]. Als Nachteil von ADO wird die eingeschränkte Flexibilität und Funktionalität vom ADORecordSet gesehen [SCHW03]. Dabei stellt der RecordSet eine Ergebnis-Tabelle dar, die zwar den OLE DB-Rowset als vielfältigere und skriptfähige Objekte abstrahiert, aber nur sequentielle Navigation ermöglicht. Außerdem muss eine Verbindung mit der Datenquelle 37 während der gesamten Zeit, in der mit den Daten gearbeitet wird, bestehen. Da aber OLE DB als Interaktionsmodel nicht auf eine dauerhafte Verbindung mit der Datenquelle setzt [s. Kapitel 3.2.2], wird ADO über einen OLE DB-Dienst erweitert. ADO.NET Wie bei ADO dient ADO.NET zum Trennen des Datenzugriffs von der Datenbearbeitung. Weiterhin beseitigt ADO.NET als Nachfolger von ADO die im vorherigen Abschnitt beschriebenen Nachteile. Die neue Datenbanktechnologie ist mit seinen Namespaces und Klassen Bestandteil von .NET Framework und löst ADO und OLE DB ab. Sie bietet ein Zugriffsmodell, das zusammen mit dem Xml-Namespace die einheitliche Arbeit mit Daten aus unterschiedlichen Datenquellen definiert und dabei die Interaktionsmodelle von OLE DB und ADO beibehält. Das bedeutet, dass mit den Daten entweder offline, anhand eines Objektgeflechts im Speicher, gearbeitet oder eine Verbindung während der gesamten Arbeitszeit mit den Daten aufrechterhalten werden kann. Das ADO.NET Objektmodell besteht aus Klassen, unterteilt in den System.Data-Namespace und Unternamespaces. Zum Zweck dieser Arbeit dienen die Namensräume System.Data und System.Data.OleDb. ADO.NET besteht aus zwei wesentlichen Komponenten (s. Abbildung 7) - .NET FrameworkDatenprovider und das DataSet. Mit dem .Net Framework werden zwei verwaltete Provider geliefert. Der erste ist der SQL Provider. Verborgen hinter Klassen wie SQLDataReader, SQLDataSetCommand und SQLCommand im System.Data.Sql-Namespace bietet er einen hoch optimierten Datenaustausch mit Sql Server 7.0 (oder höher). Beim verwalteten OLE DB-Provider handelt es sich um .Net-Klassen, die über die COM-Interoperabilitätsbrücke die zugrunde liegenden OLE DB-Provider (COM-Objekte) integrieren. Für Microsoft SQL Server ist der verwaltete OLE DB-Provider auf die Dienste (s. Kapitel 3.2.2) des OLE DBProviders SQLOLEDB angewiesen. Die zwei grundlegenden Ansätze für Datenzugriff definieren in diesem Objektmodell die Klassen DataReader und DataSet. Der DataReader basiert auf einem Hochleistungsstream, verzichtet dabei auf eine große Anzahl von Objekten im Speicher und setzt eine explizite Trennung der Verbindung voraus; dagegen stellen die DataSets eine relationale Abbildung der Daten im Speicher dar, in dem einer relationale Navigation möglich ist und wegen des offline-Arbeitsprinzips für das Internet besser geeignet ist. 38 Abbildung 7: ADO.NET Das DataSet ist so entworfen, von den Datenquellen unabhängig zu sein. Es enthält eine Auflistung von Datentabellen, die ihrerseits aus Datenspalten, -zeilen, Primärschlüssel, Fremdschlüssel und Einschränkungen besteht. Das DataSet legt außerdem die Beziehungsinformationen für die enthaltenen Tabellen mit einem DataRelationCollectionObjekt fest [MSDN07]. Es benötigt ein DataAdapter-Objekt, um die Verbindung zur Datenquelle, ausgenommen Xml-Dateien oder -Objekten, herzustellen. Der DataAdapter ist seinerseits auf dem DataReader zum Ausfüllen des DataSets angewiesen. Die Daten werden dabei standardmäßig per XML an das DataSet übertragen. Die restlichen in der Abbildung angegebenen Elemente, nämlich das Verbindung(Connection)- und das Befehl(Command)-Objekt, ermöglichen entsprechend die Verbindung mit der Datenquelle und den Zugriff auf Datenbankbefehle oder Ausführung von gespeicherten Prozeduren. Das Verbindungsobjekt wird für den verwalteten OLE DBProvider von der Klasse OleDbConnection instanziiert. Bei der Initialisierung wird eine Verbindungszeichenfolge benötigt, die den Namen der Datenquelle und weitere für das Herstellen der Anfangsverbindung erforderlichen Parameter enthält. Für den verwalteten OLE DB-Provider kann die Verbindungszeichenfolge wie folgt aussehen: Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind; Integrated Security=SSPI; 39 Um Schemainformationen aus einer Datenquelle zu erhalten, steht die Methode OleDbConnection.GetOleDbSchemaTable zur Verfügung. Die allgemeine Funktionsweise ist ähnlich wie bei OLE DB (Kapitel 3.2.2). Die Schemainformationen werden als eine System.Data.DataTable-Ergebnistabelle zurückgegeben. Als Parameter der Methode werden ein OleDbSchemaGuid-Feld und die gewünschten Einschränkungen übergeben. OLEDbSchemaGuid ist eine Klasse, die aus öffentlichen Feldern vom Typ System.Guid besteht. Der Einschränkungsparameter ist ein Objekt-Array. Er filtert die in der DataTable zurückgegebenen Zeilen, beispielsweise durch Angabe von Tabellenname, Typ usw. Tabelle 2 gibt die möglichen Einschränkungsparameter für den OleDbSchemaGuid.TablesIdentifikator an. Diese Parameter entsprechen den Spalten der zurückgegebenen Ergebnistabelle-DataTable mit den Schemainformationen. schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, new Object[] {"Northwind", "dbo", "Employees"}); Im Einschränkungsparameter bedeuten die NULL-Werte im Array, dass es kein Filter eingesetzt wird[309681]. Spaltenname CLR-Datentyp Beschreibung TABLE_CATALOG String Katalogname, enthält einen NULL-Wert, wenn der Provider Kataloge nicht unterstützt. TABLE_SCHEMA String Schemaname, enthält einen NULL-Wert, wenn der Provider Schemas nicht unterstützt. TABLE_NAME String Tabellenname, die zurückgegebene Spalte darf keinen NULL-Wert enthalten. TABLE_TYPE String Tabellentyp, wie z.B. "TABLE", "SYSTEM TABLE", "VIEW", oder "SYSTEM VIEW". Tabelle 2: Einschränkungen (Spaltennamen der Ergebnistabelle-DataTable) für den OleDbSchemaGuid.Tables Identifikator. Für den GUID-Identifikator Columns ist der Wert der Spalte „Spaltenamen“ der letzten Zeile mit COLUMN_NAME auszutauschen. Für die Identifikatoren OleDbSchemaGuid.Primary_Keys und OleDbSchemaGuid.Foreign_Keys fehlt bei den Einschränkungen die letzte Zeile der Tabelle 2. 40 4 Microsoft-Unternehmensanwendungen in Hinblick auf DatenSchema und Porgrammierschnittstellen Die Unternehmensanwendungen, die in dieser Arbeit in Betracht gezogen wurden, sind Microsoft Sql Server, Exchange Server und Active Directory. Sie werden im Folgenden in Bezug auf Programmierschnittstellen und Metadaten-Beschreibung untersucht, die ihrerseits so ausgewählt werden müssen, um der nichtfunktionalen Anforderung gerecht zu werden, .NET Framework als Programmierplattform für die Entwicklung zu benutzen. 4.1 Active Directory Active Directory (AD) stellt die Verzeichnisdienste dar, mit denen das Netzwerk von einem Ort aus verwaltet wird. Benutzer und Ressourcen können auf einfache Weise hinzugefügt, entfernt und verschoben werden. AD trennt die logische Struktur der Domänenhierarchie von der physischen Struktur des Netzwerks. Dadurch lassen sich Änderungen an der physikalischen Struktur für den Benutzer transparent durchführen. AD ist außerdem die größte Änderung in Microsoft Exchange 2000/2003 Server, weil es den ExchangeVerzeichnisdienst ersetzt. Acive Directory ist eine Datenbank, die ein spezielles Ziel erfüllt und kein Ersatz für die Windows Registry darstellt. Das Verzeichnis ist entworfen, um große Mengen an Lese- und Schreiboperationen und wesentlich kleinere Anzahl von Änderungen durchzuführen. ADDaten sind hierarchisch, repliziert und erweiterbar. Weil sie repliziert werden, sind sie nicht dazu konzipiert, dynamische Daten zu speichern, wie z.B. Prozessorauslastung. Wenn die Daten spezifisch für den Host sind, sind sie in die Registry zu speichern. Typische Beispiele für im Verzeichnis gespeicherte Daten sind diese der Druckerwarteschlange, Benutzerkontakten und Netzwerk/Computer-Konfiguration. AD-Datenbank besteht aus Objekten und Attributen. Objekt- und Attributdefinitionen sind im AD-Schema gespeichert [MSDN12]. Mit Active Directory ändert sich der gesamte NT-Namensraum, indem das flache Domänenkonzept durch einen hierarchisch gegliederten Domänenbaum ersetzt wird. Die NTHierarchie besteht aus Containern und Directory-Leaf-Objekte, wie z.B. der Container Namespaces, der den WinNT-Namensraum enthält, der seinerseits aus Domänen besteht. Die Domänen können sowohl Leaf-Objekte, wie Benutzer und Gruppen, als auch Container wie 41 Schema und Computer enthalten. Der ADsPath (s. Kapitel 3.2.4) kann folgende Formen annehmen: WinNT: WinNT://<domain name> WinNT://<domain name>/<server> WinNT://<domain name>/<path> WinNT://<domain name>/<object name> …… WinNT://<server>/<object name>,<object class> Der Domänename kann entweder NETBIOS- oder DNS-Name sein [MSDN14]. Der server bezeichnet einen Server innerhalb des Domains. Mit path wird der Pfad eines Objekts gekennzeichnet wie z.B. „server/printer“. Mit object class wird zu dem Objektnamen auch den Objekttyp angegeben, damit die Leistung des Servers gesteigert wird. Bei Active Directory (NT-5.0) dagegen besteht der Namensraum aus Domänen, die in einem Baum gegliedert sind. Jede Domäne selbst stellt einen Baum dar, indem alle Objekte der Domäne (Benutzer, Computer, Printer usw.) als Einträge in einem Verzeichnis betrachtet werden. Es wird außerdem zwischen einer Domänenstruktur (Tree) und der Gesamtstruktur (Forest) unterschieden. In einer Domänenstruktur haben alle Domänen einen fortlaufenden DNS-Namensraum. Die Domäne erster.example.com und zweiter.example.com sind der Domäne example.com untergeordnet und alle drei bilden eine Domänenstruktur. Die Gesamtstruktur kann eine oder mehrere unabhängigen Domänenstrukturen beinhalten. Innerhalb der Domäne einer Gesamtstruktur werden dasselbe Active Directory-Schema und dieselben Replikationsinformationen10 verwendet. Ein globaler Katalog ist für die Suche von Objekten im Verzeichnis zuständig. Er ist an einer zentralen Stelle in der Gesamtstruktur installiert und hat wegen der Replikation alle benötigten Informationen, um die gesuchten Objekte zu finden. Neben den Domänen sind auch die Organisationseinheiten (OU) für die logische Gruppierung von Netzwerkressourcen zuständig. Die OU kann Mitglieder der Domäne beinhalten. In einer OU werden Objekte in Gruppen eingeteilt. Sie kann außerdem weitere OUs als Objekte beinhalten. Die Angabe einer OU kann als eine weitere Einschränkung die Suche nach Objekten in Active Directory beschleunigen. 10 Die Domänenverwalter, so genannten Domänencontroller (DC), in einer Domäne tauschen Verzeichnisinformationen unter sich aus, damit die Änderungen an einem DC schnellstmöglich den anderen DC verfügbar gemacht werden. Die Replikationsinformationen steuern diesen Prozess. 42 4.1.1 Programmierschnittstellen Die Programmierschnittstelle für Active Directory ist entweder die ADSI-Komponente oder die darauf basierende verwaltete .NET-Komponente, implementiert im System.DirectoryServices Namensraum. Beide sind im Kapitel 3.2.4 beschrieben. Der ADsPath benötigt beim LDAP-Provider folgendes Format: LDAP://HostName[:PortNumber][/DistinguishedName] Die in eckigen Klammern angegebenen Elemente sind optional. Wenn der Port nicht angegeben ist, wird der Standard-LDAP-Port 389 verwendet. Der HostName kann ähnlich wie bei dem WinNT-Provider einen Domänennamen, einen Computernamen oder eine IPAdresse sein. DistinguischedName (DN) identifiziert eindeutig ein Objekt im Active Directory (s. Kapitel 3.2.3). Wenn der Hostname nicht bekannt ist, kann das von dem entsprechenden Domaincontroller mit Hilfe des so genannten Locator Service abgefragt werden. In LDAP 3.0 ist rootDSE der obersten Knoten im DIT (s. Kapitel LDAP). Sein Ziel ist Informationen über das Verzeichnisdienst zur Verfügung zu stellen. Es ist also möglich sich an eine „default“ Domäne zu binden, ohne den Namen des Domaincontrollers zu spezifizieren. Der Wert des ADsPath ist in diesem Fall LDAP://rootDSE. Active Directory teilt sich darunter in drei Partitionen: der DefaultNamingContext, ConfigurationNameingContext und SchemaNamingContext. Das rootDSE-Objekt enthält als Eigenschaften (Properties) sowohl die DNs für die drei Partitionen, als auch andere Konfigurationseigenschaften von Active Directory, u.a. die DNS-Addresse des Servers – dnsHostName. Wenn der DN fehlt, wird der DefaultNamingContext in der aktuellen Domäne angesprochen. Mit DirectoryServices können die angebundenen Objekte gelöscht oder ihre Eigenschaften geändert werden. Wenn sie Container repräsentieren, enthalten sie durch die Eigenschaft Children einen Verweis auf alle Kinderknoten. Über diese Eigenschaft können neue Kinder mit Hilfe der Add-Methode hinzugefügt werden oder mit der Find-Methode wird nach einem untergeordneten Objekt gesucht. Die LDAP-Attribute sind in der Eigenschaft Properties gespeichert. Die DirectoryEntry-Komponente bietet die Möglichkeit, Objekte aus der Hierarchie zu entfernen. Um einen untergeordneten Eintrag aus einer untergeordneten Auflistung des aktuellen übergeordneten Verzeichnisses zu entfernen, kann die Remove-Methode aufgerufen werden. Die Remove-Methode enthält als einziges Argument den zu entfernenden 43 Eintragsnamen und darf nur für einen leeren Container oder ein Objekt verwendet werden, das z.B. als Container einen Drucker oder Computerknoten enthält. entry.Children.Remove(entryZuEntfernen) Um einen Eintrag und alle untergeordneten Einträge zu löschen, kann die DeleteTreeMethode aufgerufen werden. Durch die DeleteTree-Methode werden der aktuelle Eintrag und alle in der Teilstruktur enthaltenen Einträge aus der Hierarchie gelöscht. entry.DeleteTree() Um anschließend die Änderungen im Active Directory zu speichern, muss die CommitChanges-Methode aufgerufen werden. Bei der Suche können Filter am Ende des ADsPath gefolgt von einem Semikolon angegeben werden. Die Filter werden in Postfix-Notation definiert, dabei stehen die Operationen am Anfang, vor den Termen: LDAP://host/dc=example,dc=com;(&(objectclass=user)(name=r*)) Mit dem obigen Beispiel wird im Unterverzeichnis des angebundenen Knotens nach allen Benutzern gesucht, deren Namen mit „r“ anfangen. Weiterhin kann einen Scope für die Suche definiert werden: BASE, ONELEVEL und SUBTREE, die entsprechend den Eintrag selbst, die unmittelbar untergeordneten Einträge und alle darunter liegenden Einträge durchsucht. Ein komplexeres Beispiel für ein Filter ist bei der Suche aller Benutzer, die sich nie angemeldet haben, mit dem folgenden Zeischenfolge angegeben: (&(objectCategory=person)(objectClass=user))(|(lastLogon=0)(!(lastLogon=*))) Wenn ein Objekt mit der Klasse User beschrieben wird und gleichzeitig sich in der Kategorie der person befindet, dann aber auch sein Attribut lastLogon 0 oder gar keinen Wert hat wird das Objekt in die Ergebnismenge hinzugefügt. 4.1.2 Metadatenbeschreibung AD hat drei Partitionen. Diese, auch „naming-contexts“ genannt, sind die Domäne-, die Schema- und die Konfigurationspartition. Die Domänepartition enthält Benutzer, Gruppen, Kontakte, Computer, Organisationseinheiten (OU) und viele andere Objekttypen. Die Konfigurationspartition erfasst die Konfigurationsdaten für Dienste und Partitionen. Die Schemapartition enthält die Klassen- und Attributdefinitionen. AD ist erweiterbar und bietet die Möglichkeit, benutzerdefinierte Klassen und Attributdefinitionen hinzuzufügen. Die 44 Attributdefinitionen und Klassen sind wiederum Objekte in der SchemaNamingContextPartition. Die Attributdefinitionen sind Objekte vom Typ attributeSchema und die Klassen vom Typ classSchema. Also enthält eine Attributdefinition auch Attribute, die zusammengenommen die eigentliche Definition des Attributs darstellen. Die Attribute attributeSyntax, oMSyntax und oMObjectClass definieren zusammen den Datentyp (Syntax) der Instanzen dieser Attributdefinition. Mehrere Attribute werden benötigt, weil mehrere Standarten involviert sind. Das attributeSyntax-Attribut repräsentiert die X.500 Syntax (OIDSyntaxwerten) und das oMSyntax die XOM-Syntax (XOM steht für XAPIA X/Open Object Management). Weil AD Syntaxen benötigt hat, die der X.500-Standard nicht definiert, enthalten einige Datentypen für attributeSyntax die gleichen Werte. Um sie unterscheiden zu können, wird noch der XOM-Syntax gebraucht. Active Directory unterstützt 23 Syntaxen [MSDN15]. Sie sind im AD integriert und durch keine Objekte im Schema repräsentiert. Also ist es nicht möglich neue Syntaxen hinzuzufügen. Für die einfachen Datentypen stehen insgesamt vier Syntaxen zur Verfügung (die ersten drei Reihen in Tabelle 3). Der Datentyp mit attributeSyntax 2.5.5.9 und oMSyntax 10 stellt beispielsweise eine 32-bit Zahl dar. Weitere zehn Syntaxen definieren das Format von Zeichenfolgen. Zwei beschreiben Zeitdatentypen, die wiederum Zeichenfolgen sind. Sieben Verweisdatentypen stellen verschiedene Objektreferenzen dar [KOSE01]. Attribute-Syntax oMSyntax oMObjectClass DotNet-Typ 2.5.5.8 1 Boolean 2.5.5.9 10 Int32 2.5.5.16 65 Int64 2.5.5.1 127 2B0C0287731C00854A System.__ComObject (DN) Tabelle 3: Zuordnung von Syntaxen in Active Directory und .NET-Datentypen Für die Objektreferenzen enthält der oMSyntax immer den Wert 127. Außerdem definiert AD ein Mapping zwischen seine Datentypen und diese von LDAP [MSDN18], um Objekte über LDAP offenlegen zu können. Die LDAP-Datentypen sind eindeutig durch ihren Objektidentifikator (OID) definiert. Jede Attributdefinition in AD enthält auch ein obligatorisches Attribut attributeID mit einem OID-Wert. 45 Einige Attribute können mehrere Werte enthalten. Das wird mit dem Attribut isSingleValued in der Attributdefinition festgelegt. Ein Attribut wird durch die Attribute lDAPDisplayName, cn (Common- Name) und distinguishedName in der Definition eindeutig bestimmt, wobei die erste zwei für die Definition obligatorisch sind. Der LDAP-Display-Name wird von LDAPClienten für das Lesen und Schreiben in einem Attribut. Sein Wert kann aus dem CommonName durch Streichen der Bindestriche und durch das Kleinschreiben der erste Buchstabe erzeugt werden [LOWE99]. Klassen und Attributdefinitionen können Attribute entsprechend von anderen Klassen und Attributdefinitionen erben. Diese Beziehungen werden durch das Attribut subClassOf angegeben. Ganz oben in der Hierarchie steht die Klasse top. Beispielsweise erbt die attributeSchema-Klasse 73 Attribute von der top-Klasse. 4.2 Microsoft Sql Server Microsoft Sql Server 2000 ist die SQL-basierte, relationale Datenbank, die in dieser Arbeit eingesetzt wird. Darüber hinaus wird die Northwind-Beispieldatenbank verwendet, die mit der Serverinstallation mitgeliefert wird. Sie enthält die Daten für das frei erfundene Unternehmen Northwind Traders, das mit Spezialitäten aus aller Welt handelt. 4.2.1 Programmierschnittstellen Sql Server 2000 verfügt über eine integrierte XML-Unterstützung für Internetanwendungen. Die Xml-Unterstützung wird aber in Bezug auf Version 7.0 aus Rückkompatibilitätsgründen nicht in Betracht gezogen. Vielmehr ist im Konzept das Ziel festegelegt, über den verwalteten OLE DB-Provider (s. Kapitel 3.2.2) eine breitere Unterstützung von Datenquellen zu gewährleisten und sich nur für den Prototyp auf den Microsoft Sql Server(MsSQL) zu beschränken. ADO.NET (s. Kapitel 3.3.2) ist das Objektmodel für die Entwicklung von Datenbankanwendungen in .NET und wird in dieser Arbeit zusammen mit dem OLE DBDatenprovider als Programmierschnittstelle für den Zugriff auf Microsoft Sql Server eingesetzt. 46 4.2.2 Metadatenbeschreibung Der SQLOLEDB-Datenprovider repräsentiert die Daten, gespeichert in Microsoft Sql Server 2000, indem er die in [MSSQL1] angegebene Zuordnung von OLE DB-Datentypen zu nativen Sql Server-Datentypen definiert. Die Relation ist dabei nicht bijektiv. Es können durchaus mehrere SQLOLEDB-Datentypen einem SQL Server-Datentyp zugewiesen werden. Es ist zu beachten, dass nur bei einer Zuweisung mit keinen Verlusten von Daten zu rechnen ist. Das Mapping zwischen einigen SQL Server- und SQLOLEDB-Datentypen ist in Tabelle 4 angegeben. SQL Server Datentypen SQLOLEDB Datentypen .Net Datentypen Bigint DBTYPE_I8 Int64 Binary DBTYPE_BYTES Byte[ ] ….. ….. Int DBTYPE_I4 Int32 Tabelle 4: Zuordnung von Sql Server Datentypen zu SQLOLEDB- und .Net-Datentypen Darüber hinaus wird mit der zweiten und dritten Spalte der Tabelle eine Zuordnung von OLE DB zu .NET-Datentypen angegeben [MSDN08]. Um die zugewiesenen Datentypen der Spalten einer Tabelle zu erhalten (s. Kapitel 3.2.2), wird die OleDbConnection.GetOleDbSchemaTable-Methode zum Extrahieren von Metainformationen verwendet. 4.3 Exchange Server Microsoft Exchange ist ein Groupware-Server für Microsoft Windows, der u.a. Funktionalitäten zur E-Mail-Kommunikation, zur zentralen Verwaltung und Nutzung von Informationen oder zum Instant-Messaging bietet. Ein Groupware-Server dient u.a. dem Austausch von Kontakten und Terminen. Neben der spezialisierten Client-Anwendung Microsoft Outlook können auch Web-Browser und Instant-Messaging-Anwendungen zum Zugriff verwendet werden. Die folgenden Betrachtungen beziehen sich auf die Produktversionen Microsoft Exchange 2000 und Microsoft Exchange 2003. Exchange besitzt in den erwähnten Versionen keinen Verzeichnisdienst mehr, sondern benutzt das Active Directory. Bei der Installation wird das Active Directory Schema mit zahlreichen Klassen und Attributen erweitert. Die Klassen user, contact und group bilden die Grundlage 47 für Postfächer, benutzerdefinierte Empfänger und Verteilerlisten. Als Erweiterung der Active Directory-Benutzer-Klassen sind die Exchange-Empfänger im DefaultNamingContext abgelegt. Ein Postfach stellt die Erweiterung der user-Klasse dar, eine Verteilerliste erweitert die group-Klasse und ein benutzerdefinierter Empfänger ist die Erweiterung der contactKlasse. Im ConfigurationNamingContext werden die Konfigurationsinformationen von Exchange gespeichert. Die eigentlichen Daten werden in dem so genannten Webstore (Web Storage System) gespeichert. Der Webstore ist eine semi-strukturierte Datenbank (s. Kapitel 2.2), in der unterschiedliche Nachrichtentypen gespeichert werden können, wie z.B. Emails oder Dateien beliebigen Typs. Der Webstore besteht aus Ordnern, die in öffentliche und private eingeteilt werden. Ein privater Ordner bildet das Postfach eines Benutzers und ist ausschließlich dem Benutzer zugeteilt. Die öffentlichen Ordner stehen in der Regel allen Benutzern zur Verfügung und sind Teil einer öffentlichen Ordnerhierarchie. Der WebStore wird damit in mailbox store und public store aufgeteilt. Für jeden öffentlichen Ordner gibt es außerdem einen Eintrag im DefaultNamingContext von Active Directory unterhalb des Containers „CN=Microsoft Exchange System Objects“. Im Exchange Server können Ordner und auch einzelne Nachrichten über URLs angesprochen werden. Microsoft Exchange 2000 SDK legt für die Konstruktion eines URLs die gleiche Vorgehensweise fest, wie bei der Identifizierung einer über HTTP zugreifbaren Ressource. Die URL hat folgende Struktur: http://servername/virtual-directory/virtual-path Servername ist der Name des Webservers, der in die IP-Adresse des Hosts aufgelöst wird. Virtual-directory ist das virtuelle Verzeichnis von Microsoft Exchange HTTP Virtual Server, das auf dem öffentlichen Verzeichnis abgebildet ist. Virtual-path ist der virtuelle Weg zum Item. Die URLs in der Tabelle im Anhang 2 sind typische HTTP:URLs für ein MailboxVerzeichnis eines Benutzers bei einer englischen Installationsversion des Exchange Servers. Die konkrete URLs können ermittelt werden, indem die Eigenschaften, wie inbox-Feld oder calendar-Feld, von dem Mailbox-Grundverzeichnis abgefragt werden. 4.3.1 Programmierschnittstellen Die Programmierschnittstellen, die für den Zugriff auf dem Exchange Webstore verwendet werden können, erfüllen bestimmte Zwecke und bringen auch Nachteile mit sich, so dass sie 48 sich gegenseitig nicht ausschließen können. Exchange Server bietet u.a. in den folgenden Punkten ausgeführten Programmierschnittstellen. 4.3.1.1 ADO/CDO und OLEDB Für ADO (ADO.NET) und CDO gibt es zwei OLEDB-Provider, die den Zugriff auf dem WebStore ermöglichen: der Microsoft Internet Publishing-Provider (MSDAIP) und der ExOLEDB-Provider (s. Abb. 8). Der MSDAIP-Provider greift über im IIS konfigurierte virtuelle Verzeichnisse via HTTP und WebDAV auf dem Exchange Server zu. Bei der Version 2003 kann er nicht zusammen an einem Computer mit Exchange Server installiert werden. Der ExOLEDB-Provider verwendet direkt das Exchange Server-API und darf nur auf dem Server selbst verwendet werden. Die Clientanwendungen müssen auf dem gleichen Computer laufen. Er unterstützt außerdem keine Impersonifizierung, bei der der Prozess mit den Rechten des aufrufenden Benutzers laufen kann. Abbildung 8: Datenzugriffs-Architektur für Exchange Server 2003 [ESDK01] Mit der Version 3.0 von CDO (CDOEX) wird nicht via MAPI11 auf dem Exchange Server zugegriffen, sondern werden die ADSI-Komponente für den Zugriff auf den Verzeichnisdienst und ADO/OLEDB für den Zugriff auf den Webstore verwendet. Wie im Kapitel 3.3.1 erwähnt besteht der Nachteil bei der CDOEX-Komponente, genauso wie bei ADO und dem ExOLEDB-Provider, das sie nur zusammen mit Exchange Server auf dem gleichen Computer laufen können. Nur mit CDOEXM kann entfernt zugegriffen werden, um 11 MAPI umfasst ein Protokoll zur Kommunikation zwischen Messaging-Client und Server. Ähnlich wie bei OLEDB basiert MAPI auf dem Provider-Konzept. 49 Verwaltungsaufgaben im Exchange Server über das Active Directory lösen zu können. Das ist möglich, weil CDOEXM für Verwaltungszwecke auf ADSI und den LDAP-Provider aufsetzt. Beispielsweise ist sowohl mit ADSI, als auch mit CDOEXM möglich, ein Postfach anzulegen. 4.3.1.2 WebDAV Es wird auch die Möglichkeit geboten, Exchange Store über WebDAV anzusprechen (s. Abb. 9). Wie in Kapitel 3.2.5 bereits erwähnt, werden die Informationen in den WebDAVAnfragen und Antworten in Form von Xml-Dokumenten übermittelt. Abbildung 9: Zugriff auf dem Exchange Store über WebDAV [ESDK02] Im Folgenden wird anhand eines Beispiels den Ablauf eines Zugriffs über WebDAV erläutert. Das Erstellen eines Verzeichnisses mit WebDAV kann in folgenden Schritten zusammengefasst werden: 1. Einen MKCOL-Methodenaufruf erstellen. Der URI für die Methode ist der URI zur Kollektion, die erstellt werden muss. 2. Optional können Eigenschaften von dem neuen Verzeichnis gesetzt werden, indem ein XML Body im Aufruf mitgeschickt wird. Diese Eigenschaften können entweder in diesem MKCOL-Methodenaufruf gesetzt werden, oder durch einen separaten PROPPATCHMethodenaufruf, wenn das Verzeichnis bereits angelegt ist. Das XML-Format ist wie ein üblicher PROPPATCH-Methodenaufruf: <d:propertyupdate xmlns:d="DAV:"> <d:set> <d:prop> <d:displayname>Folder 1</d:displayname> </d:prop> </d:set> </d:propertyupdate> 50 Beim Zuschicken eines XML-Bodys mit der MKCOL-Methodenaufruf muss der ContentType-Header auf „text/xml“ und Content-Length-Header auf den entsprechenden Wert gesetzt werden. 3. Nachricht senden. 4. Wenn die Aktion erfolgreich war, ist der Antwortstatus „201 Created“. Im Folgenden ist ein typischer MKCOL-Methodenaufruf angegeben, bei dem mit der Erzeugung des Ordners zusätzlich zwei Eigenschaften gesetzt werden [MicExc2]. Der zu erstellenden Ordner hat den Namen testname und wird im öffentlichen Verzeichnis /pub/folder1/folder2 auf dem Host „hostname“ angelegt. MKCOL /pub/folder1/folder2/ HTTP/1.1 Host: hostname Content-Type: text/xml Content-Length: XXX <?xml version="1.0"?> <g:propertyupdate xmlns:g="DAV:" > <g:set> <g:prop> <g:displayname>testname</g:displayname> </g:prop> <g:prop> <f:myprop xmlns:f="urn:schemas-mydomain-tld:">Test</f:myprop> </g:prop> </g:set> </g:propertyupdate> Die Namensräume in diesem Beispiel werden im nächsten Abschnitt besprochen werden. 4.3.2 Metadatenbeschreibung Das Exchange Store-Schema besteht aus Eigenschaften, die alle Ressourcen im Store, einschließlich Email-Nachrichten, Termine, Verzeichnisse und Kontakte, definieren. Der Exchange Store enthält zahlreiche vordefinierte Eigenschaften. Das Schema kann aber auch mit benutzerdefinierten Eigenschaften erweitert werden. Jede Eigenschaft wird über einen hierarchischen, global eindeutigen Identifikator (URI) und den Eigenschaftsnamen definiert. Der URI ist entweder in der Form eines URLs oder eines Uniform Resource Names (URN). Ein URN hat im Gegensatz zu einem URL keine Protokollangabe. Im Exchange Server werden auf diese Weise auch Klassennamen gebildet. Die Elemente im Exchange-Webstore sind Instanzen dieser Klassen, die auch Content Classes genannt werden [SCHW01]. 51 Das Webstore-Schema umfasst Attribute aus mehreren Namensräumen, die sich in drei Gruppen einteilen lassen. Die im WebDAV-definierte Attribute werden mit dem „DAV:“Namensraum festgelegt, wie z.B. das „DAV:displayName“-Attribut. In diesem Namensraum sind auch Elemente für die WebDAV-Anfrage- und WebDAV-Antwort-Syntax enthalten. Es muss also ein Unterschied gemacht werden, zwischen Elemente in diesem Namensraum, die ausschließlich für das WebDAV-Protokoll verwendet werden und solche die als Eigenschaften in den Einträgen im WebStore benutzt werden können. Im vorhin ausgeführten Beispiel über WebDAV-Anfragen werden mehrere Attribute, wie propertyupdate, set, prop und displayname aus diesem Namensraum verwendet, aber nur displayname wird auch als Eigenschaft eines Elements im WebStore benutzt. Die mit einem URN benannten Namensräume definieren Eigenschaften, die auf anderen Internet-Standards basieren, wie z.B. das Attribut urn:schemas:mailheader:sender. Die letzte Gruppe besteht aus Eigenschaften, deren Namensräume mit einem URL benannt werden. Die Microsoft Exchange-spezifischen Eigenschaften werden entweder in dem Namensraum http://schemas.microsoft.com/exchange oder in seinen untergeordneten Namensräumen definiert. Die Klassen werden im Namensraum urn:content-classes definiert. Jedes Attribut gehört zu einer Content Class. Durch Vererbung der Content Classes kann ein Attribut zu mehreren Klassen gehören. Die oberste Klasse ist die Content Class urn:content-classes:object. Oft benutzte Content Classes sind z.B. urn:content-classes:folder, urn:content- classes:appointment, urn:content-classes:message, die entsprechend als Schablone für die gespeicherten in Webstore Ordner, Termine und Nachrichten dienen. Wenn der Namensraum mit den Zeichen „:“ oder „/“ endet, wird die Eigenschaft über den URI, konkateniert mit dem Eigenschaftsnamen, refernziert. Andernfalls wird dazwischen ein „#“-Zeichen eingefügt, wie z.B. bei der Eigenschaft urn:schemas-microsoft- com:office:office#Author. Für das ganze WebStore wird ein globales Schema definiert, das aus den Namensräumen und aus den darin definierten Eigenschaften- und Content Class-Definitionen besteht. In jedem Verzeichnis können weitere für das Verzeichnis spezifischen Attribut- und Klassendefinitionen angegeben werden, die das globale Schema erweitern. Das erste gefundene Attribut in der Verzeichnishierarchie wird genommen und die predefinierten in den untergeordneten Ordnern auf dem Pfad zu einem Item werden ignoriert. Das globale Schema 52 befindet sich im schema-Verzeichnis, untergeordnet von dem Installationsverzechnis des Servers - Exchsrvr. Das Schema kann aber auch über HTTP mit dem URL http://server/public/##SCHEMAURI##/microsoft/ExchangeV1 ausgelesen werden. Seit Version Exchange 2000 Server SP1 wird der Zugriff auf das globale Schema über den „##SCHEMAURI##“-Macro ermöglicht. Benutzerdefiniertes globales Schema ist über den folgenden URI erreichbar: http://server/<vroot>/##SCHEMAURI##/ In dem schema-Ordner sind außerdem die Dateien enthalten, die die XDR-Elemente und die Struktur eines XDR-konformen Dokuments definieren. Für jedes Attribut oder Content Class im Schema ist eine Datei angelegt, die das Attribut oder Content Class beschreibt. Der Inhalt der Dateien ist im Xml-Format. Für die Deklaration der Elemente wird das Xml Schema Reduce (XDR), die von Microsoft entwickelte Schemasprache, verwendet. Für primären Datentypen werden die Microsoft primären Datentypen genommen, die im Namensraum urn:schemas-microsoft-com:datatypes definiert und über das type-Feld im Schema referenzierbar sind [ESDK03]. 4.4 SharePoint Portal Server SharePoint Portal Server ermöglicht es Mitarbeitern, über ein web-basiertes Portal Informationen freizugeben, zu veröffentlichen oder Informationen in verschiedenen Quellen zu suchen. Ein Portal fasst an einer zentralen Stelle Informationen und Dokumenten aus verschiedenen Quellen zusammen. SPS baut den Exchange Information Store (Webstore) mit zusätzlichen Datenbankfunktionen und Anwendungsmethoden aus, wie z.B. Steuer für Datenspeicherung und Versionsverwaltung. Mit dem SharePoint Store wird die Microsoft Digital Dashboard Technologie erweitert, mit dem Ziel ohne eigenes Code zu entwickeln, Arbeitsdomänen und kollaborativen Anwendungen erstellen zu können [WeiGan]. SharePoint Portal Server 2003 basiert auf die Windows SharePoint Services und besitzt entsprechend alle ihren Fähigkeiten, dabei sind alle SharePoint Sites, Informationen und Anwendungen in ein einziges Portal enthalten. SharePoint Services ist eine Kollektion von Diensten für Microsoft Windows Server 2003, die eingesetzt werden kann, um die Zusammenarbeit von Benutzer bei der Bearbeitung von Dokumenten zu ermöglichen, sowie gemeinsame Listen von Kontakten, Ankündigungen und Aufgaben bereitzustellen. 53 Wie in Abbildung. 10 zu sehen ist, bildet der Workspace die höchste Ebene in der Struktur von SPS. Abbildung 10: SharePoint Portal Server Workspace [MicSPS2] Microsoft legt u.a. folgende Konzepte für die Struktur von SPS fest [MicSPS1]: • Workspaces Ein SharePoint Portal Server Workspace bietet durch Webfolder Zugriff auf Dokumentenbibliotheken, Informationsquellen, Kategorien u.s.w. auf dem Server. Der in der Abbildung abgebildeten Workspace enthält folgende Verzeichnisse: Categories, Dashboards, Documents, Management und Portal Content. • Web Folders Ein Web-Verzeichnis bietet eine Schnittstelle für die Verwaltung von Dateien auf dem entfernten Web Server. Web-Verzeichnisse bieten Dokumentenspeicherung und Funktionalitäten zur Veröffentlichung. Damit freier Zugang auf die Dateien ermöglicht wird, muss der Web Server Web-Verzeichnisse unterstützen und entsprechende Zugriffsrechte müssen den Benutzern für den Webserver vergeben werden. • Categories Eine Kategorie ist eine Dokumenteigenschaft, die programmatisch gesetzt wird und in Hierarchien von Themen und Unterthemen definiert wird, um Dokumente in Gruppen 54 mit verwandtem Inhalt zu organisieren. Dokumente können in verschiedenen Kategorien klassifiziert werden. Benutzer können ihre Dokumente kategorisieren, indem sie die Kategorieeigenschaft in Dokumentenprofil hinzufügen. • Best Bets Best Bet ist eine Dokumenteigenschaft, die programmatisch gesetzt wird, um den Rank bei Suchanfragen zu manipulieren. • Document Profiles Ein Dokumentprofil enthält eine Kollektion von Dokumenteigenschaften. Jedes Dokument im Workspace ist mit einem Dokumentprofil assoziiert. Dokumenteigenschaften enthalten Kategorien, „best-bets“ und Schlagwörter. Diese klassifizieren die Dokumenteninhalte und Attribute in einem Format. Dieses Format ermöglicht das Hinzufügen des Dokumentes in einem Index und das Finden von diesem nach einer Suche, wenn es veröffentlicht wird. Alle SharePoint Portal Server Dokumente sind in hierarchischen Verzeichnissen gespeichert, die ähnlich der Verzeichnisse im Dateisystem operieren. Darüber hinaus enthalten einige Verzeichnisse, wie z.B. das Workspace-Schema-Verzeichnis, Items als Metadaten, wie z.B. Property, Definition, Dokumentenprofil und Dictionaries, die für die Kategorisierung und für die Suche von Informationsobjekten nach bestimmten Aspekten, wie z.B. Autor oder Schlagwort, herangezogen werden. 4.4.1 Programmierschnittstellen Abbildung.3 veranschaulicht wie Clientanwendungen die Microsoft Server XMLHTTP COM-Komponente und WebDAV benutzen können, um nach Elementen in SharePoint Portal Server Store zu suchen. Die Anfrage enthält eine in XML verkapselte SharePoint Portal Server SQL query. Damit eine Anfrage gesendet wird, muss ein Stream-Objekt oder eine Zeichenkette erzeugt werden, die die XML-Anfragedaten enthält. Der SharePoint Portal Server antwortet auf die Suchanfrage mit einer Nachricht in text/XML-Format, das dem DAV:PROPFIND-Antwortformat entspricht [MicSPS]. Das XMLHTTP COM-Objekt ist Teil von Microsoft XML (MSXML) 2.0 oder späteren COM-Komponente. Das XML body einer erfolgreichen PROPFIND-Methode kann unmittelbar von dem XMLHTTP-Objekt als ein DOM-Dokumentobjekt erfasst werden [MicExc1]. Die Komponente erleichtert die Erzeugung der Anfrage und Bearbeitung der Antworten, diese können aber auch durch eine eigene auf 55 System.Web basierende und somit verwaltete Komponente geparst und in Objekten gepackt werden. Abbildung 11: Client-Interaktion mit SharePoint Information Store über WebDAV [MicSPS] Im Folgenden wird beispielsweise eine Suchanfrage angegeben, die das von SharePoint vorgeschriebene Format einhalten muss. SEARCH /myworkspace HTTP1.1 Host: example.com Content-Type: text/xml Content-Language: en Connection: Close Range: rows=0-99 ……… Content-Length: 457 <?xml version="1.0"?> <D:searchrequest xmlns:D = "DAV:" > <D:sql> SELECT "DAV:getcontentlength", "urn:schemas-microsoft-com:office:office#Title", "urn:schemas.microsoft.com:fulltextqueryinfo:rank" FROM SCOPE ('DEEP TRAVERSAL OF "/myworkspace/documents"') WHERE ("DAV:getcontentlength" > 10000) RANK BY COERCION ( Absolute, 1000 ) ORDER BY "DAV:getcontentlength" DESC </D:sql> </D:searchrequest> 56 In dieser SQL-Anfrage werden drei Spalten angefordert: Dokumentgröße, Titel und Rank. Ein Datensatz wird für jedes Dokument zurückgegeben, das größer als 10000 Bytes ist und sich auf dem Server im Verzeichnis /documents oder dessen Unterverzeichnisse befindet. Die Antworten haben alle den Rankwert 1000 und sind in absteigender Reihenfolge bezüglich der Dokumentengröße geordnet. Weil es noch eine Einschränkung „Range“ in den Headers vorliegt, werden nur die ersten 100 Dokumente zurückgegeben. Weil die Namensräume Sonderzeichen enthalten können, müssen sie werden hier bei einer WebDAV-Anfrage in Anführungszeichen gesetzt werden. Zum Zweck der Vollständigkeit auch die anderen wesentlichen Programmierschnittstellen erwähnt, die vom Server offen gelegt werden. Neben einer Erweiterung für CDO – Publishing and Knowledge Management Collaboration Data Objects (PKMCDO), die das Objektmodell von SharePoint Portal Server repräsentiert, wird mit SharePoint Portal Services auch eine Webdienst-Schnittstelle geliefert. Über Webdienste können u.a. sowohl Dokumente, Sites etc. als auch der SPS-Server verwaltet werden. In dem Namensraum Microsoft.SharePoint sind die Klassenbibliothek und die Programmierschnittstelle der Microsoft SharePoint Diensten implementiert. Die Webdienste befinden sich in der Microsoft.SharePoint.SoapServer-Komponente und basieren auf dem ASP.NET-Framework. Um beispielsweise ein Verzeichnis im Dokumenten-Workspace (s.Abb. 10) zu erzeugen, wird der Document Workspace-Dienst verwendet, der via folgenden URL ansprechbar ist: http://Server_Name/_vti_bin/Dws.asmx Die Web-Methode heißt in diesem Fall CreateFolder (String) und erwartet als Parameter einen Namen für das Verzeichnis. 4.4.2 Metadatenbeschreibung Der ScharePoint Server basiert auf dem Exchange Webstore (in den älteren Versionen wird er Information Store genannt) und erweitert den Webstore mit eigenen Attribut- und Klassendefinitionen zum Zweck seiner Bestimmung als Kollaborationssoftware. Sowohl Exchange, als auch SharePoint Portal Server bieten über Internet Information Services und WebDAV einen Zugriff auf die Funktionalitäten und Daten, gespeichert in dem WebStore. Im Folgenden werden nur einige Besonderheiten der Attribut- und Klassendefinition von SPS erwähnt, ansonsten ist auf die Metadatenbeschreibung von Exchange Server im Kapitel 4.3.2 hinzuweisen. 57 Das globale Schema kann ähnlich wie bei Exchange Server programmatisch mit dem folgenden URI erhalten werden: http://<server>/<workspace>/##SchemaURI##/microsoft/tahoev1 Das Schare Point-Schema unterscheidet zwischen Eigenschaften, die bei einer Suche einbezogen werden können und solche, bei denen das nicht möglich ist. Die suchbaren Dokumenteigenschaften stellen Dokumenten-Attribute dar, die der Server mit den Dokumenten im Workspace assoziiert, wie z.B. letzter Änderungsstempel oder Erstellungsdatum, die zum Dokumentenprofil gehören. Weitere Eigenschaften werden vom Suchdienst benötigt, um die Items im Webstore zu indexieren. Der Suchdienst ermöglicht auch Volltextsuche, indem die Anfragen auf Sql aufbauen und ein Full Text Index verwendet wird. Das Ergebnis der Volltextsuche kann nach bestimmten Kriterien (z.B. Kategorie, Autor) sortiert werden. 58 5 Entwurf und Implementierungsdetails 5.1 Architektur-Entwurf Angesichts der Ziele dieser Arbeit ergibt sich eine 3-Schichten Client/Server Architektur. Die Datenzugriffskomponenten sorgen für die Persistenz der Daten (ähnlich wie bei CMP-Entity Beans12 in J2EE [SUN05]), sie laufen aber nicht in einem eigenen Container, was die Verteilung der Komponenten ermöglichen würde und bieten auf dieser Ebene keine Möglichkeit an, Geschäftsprozesse zu implementieren, was von einem Business-Tier erwartet wird. In diesem Zusammenhang weisen die Schichten in Abbildung 12 nur auf die Funktionsbestimmung der mitwirkenden Komponenten hin. • Java-Client • WS-I & WS-* • Autorisierung, Authentifizierung • Data Access Objects/Service Facade • Adapter/DAL/ Modelle • APIs und eigene DALs(DataAccess Helper [SET04]) • Enterprise Systeme Abbildung 12: Schichtendiagram 12 Entity Beans repräsentieren Business-Objekte (Customers, Order…) aus einer Datenbank. Bei Container Managed Persistence (CMP) wird die Persistenz der Daten von dem EJB-Container mit Hilfe des Deployment Descriptors, wo ein abstraktes Schema für die Daten vorgegeben ist, bereitgestellt. 59 Auf der Datenebene befinden sich die zu integrierenden Unternehmensanwendungen. Diese beinhalten die Daten und bieten Zugriffspunkte für die höher liegende Ebene, die die in Kapitel 4 beschriebenen Programmierschnittstellen erfasst. Die Ebene der Dienste bildet den Kern des Systems. Sie wird in weitere drei Ebenen unterteilt: die DataAccess-Helper (s. Kapitel 3), die Datenzugriffsschnittstellen und Datenabstraktion sowie die Dienstebene. Die Datenzugriffsebene abstrahiert die DataAccess-Helper-Ebene [SET04], indem sie Aktionen wie Initialisierung, Datenvorbereitung und Authentifizierung an den Unternehmensanwendungen übernehmen. Bei Bedarf, wie z.B. bei der fehlenden Unterstützung in .NET für WebDAV (die XMLHTTP-COM-Komponente ist in .NET nur durch COM Interop einsetzbar), werden hier auch die ganzen Kommunikationsmechanismen, anhand der zugrunde liegenden Programmierschnittstellen, implementiert. Somit ist es möglich z.B. mehrere auf System.Web-Namespace Datenzugriffskomponenten zu entwickeln, wobei jede von diesen spezifischen Eigenschaften für den Kommunikationsmechanismus berücksichtigt. Darüber hinaus enthält diese Komponente auch die objektorientierten Adapter, die die von den DataAccess-Helper definierten Schnittstellen an den intern für das System vorgelegte Schnittstelle anpassen. Die Adapter sorgen außerdem durch Reflektion für das Ein/Auspacken der Daten entsprechend in/aus den Objekten. Insofern werden auch die Datentypen und Befehlssyntax beachtet, die für die unterliegenden Datenzugriffskomponenten von Bedeutung sind. Damit ist ein weiteres Abstraktionsniveau für die höher liegenden Komponenten vorgegeben, das immer noch nicht von der Existenz der Modelle weiß und mit keinen Metainformationen über die Daten, mit Ausnahme von der primären Schnittstellen-/Systemtypen, verfügt. Die Data Abstraction Komponente besteht aus den extrahierten Modellen. In Form von C#Klassen, die zusätzlich mit Metadaten angereichert werden, legen diese die Struktur und gegebenenfalls weitere Eigenschaften der Daten fest. Diese Metadaten sind im Code durch Annotationen realisiert und bilden eine Metamodell-Ebene für die zu integrierendem Unternehmensanwendungsschema. Mit den Diensten wird die Lücke zwischen dem abstrakten Datenzugriff und den MetadatenBeschreibungen gefüllt. Die Dienste greifen mit Hilfe der Datenzugriffschnittstellen auf die Daten zu. Mit den vorliegenden Modellen kennen sie auch die Struktur der Daten. In Bezug auf die transferierenden Objekte und Datenzugriffskomponenten als Schnittstellen zu den 60 Datenquellen erweist sich der Data Access Object (DAO)-Pattern als geeignet für den Entwurf. Diese Überlegung wird im Kapitel 5.5 näher betrachtet. In Abbildung 13 sind die Systemkomponenten und die Relationen zwischen diesen angegeben. Die SchemaExtractor-Komponente extrahiert die Metadaten aus den Unternehmensanwendungen und erzeugt ein System.Xml.Serialization.XmlSchemas-Objekt, das bei Bedarf auch die Serialisierung in Xsd-Dateien vornimmt. Wie im Diagramm zu sehen ist, wird dieses Objekt von der CodeGenerator-Komponente zum Erzeugen von C#-Code verwendet. Abhängig von den Anpassungen, definiert durch annotations in einem Xml Schema, kommt auch die Extensions-Komponente zum Einsatz. Anschließend wird der Code kompiliert und daraus entsteht die de.tu._in_.ib.models Komponente. In der letztgenannten Komponente fließen außerdem Metadaten in Form von .Net-Attributen ein. Ein Beispiel für solche Attribute ist der PrimaryKey-Constraint für eine Tabelle in einer relationalen Datenbank. Die Attribute werden in der de.tu-Komponente definiert. Der gesamte Prozess ist in de.tu._in_.ib.engine implementiert und wird abhängig vom Zustand der instanziierten Konfigurationskomponente gesteuert. 61 Abbildung 13: Komponentendiagram Die Konfigurationskomponente wird auch dazu verwendet, den Diensten (de.tum._in_.ib.dao) Datenzugriffskomponenten und Metadatenbeschreibungen zur Verfügung zu stellen. Insofern die Datenzugriffskomponente die Schnittstelle IDAL implementieren und anhand von Reflektion mit abstrakten Objekten arbeiten, ist die dynamische Erzeugung der Data Access Objects, abhängig von den Entitäten in der models-Komponente, möglich. Für jede Entität wird der Quellcode einer Klasse generiert, der die IDAL-Schnittstelle implementiert. 5.2 Extrahieren der Metadaten Wie im vorherigen Kapitel erwähnt, braucht das System die Metadaten, um Zugriffe auf unterschiedliche Datenquellen automatisch durchführen zu können und die darin enthaltenen Entitäten offen zu legen. Solche Metadaten sind auch die primären Datentypen, die in jeder Unternehmensanwendung unterschiedlich sein können. Alle Modelle befinden sich in der 62 de.tum._in_.ib.models Namespace. Sie werden dann weiter in exchange, ad, mssql Namespaces unterteilt. Der de.tum._in_.ib.annotations-Namensraum bildet eine MetamodellEbene für das Schema in den Unternehmensanwendungen und kann nicht automatisch generiert oder aus den Anwendungen extrahiert werden. Sie wird in Zusammenhang mit den in den Anwendungen realisierten Konzepten für die Persistenz von Datenbeständen entwickelt. Für jede der Unternehmensanwendungen implementiert eine Klasse den Mechanismus zum Extrahieren der Metadaten, vorgegeben durch die ISchemaExtractor-Schnittstelle (s. Abb.13). Im Allgemeinen werden folgende Schritte befolgt: • Angabe von den systemeigenen, primären Datentypen; • Zuordnung zu Xml Schema-Datentypen erstellen; • aus den extrahierten Metainformationen, Xml Schema-Elemente generieren, dabei Namensräume, Vererbung und Einschränkungen der Daten beachten und die vorliegenden primären Datentypen einsetzen; • aus den Xml-Schemas C#-Code generieren. Die primären Datentypen können entweder in Xml Schema-Format angegeben werden, oder fest im Code programmiert sein. Die erste Variante ist wegen der Versionierung besser geeignet. Für neue Versionen der Unternehmensanwendungen können bei Bedarf die primären Datentypen geändert oder erweitert werden. Im Folgenden werden die Vorgehensweisen beim Extrahieren der Metadaten für jede Unternehmensanwendung detaillierter vorgestellt. 5.2.1 Microsoft Sql Server Als Programmierschnittstelle werden das ADO.NET-Framework zusammen mit dem OLE DB-Datenprovider eingesetzt. Die primären Datentypen ergeben sich also aus den OLE DBProvider-Datentypen. Die Zuordnung von OLE DB-Provider-Datentypen zu Sql ServerDatentypen ist dabei uninteressant, weil die benötigten Relationen und gegebenenfalls Transformationen von dem Provider übernommen werden. Es bleibt also den OLE DBDatentypen Xml Schema-Datentypen zuzuweisen. In der Herstellerdokumentation von Microsoft Sql Server, .Net-Framework und OLE DB-Referenzbuch (s. Kapitel 3.2.2) sind sowohl die benötigten Informationen über die primären Datentypen vorhanden, als auch die 63 Zuordnung von OLE DB-Datentypen zu .Net-Datentypen angegeben. Daraus wird nun jeweils ein Xml Schema-Element für jede der SQLOLEDB-Datentypen generiert. Das Xml Schema-Element13 BigInt ist simpleType. <xs:simpleType name="BigInt"> <xs:annotation> <xs:appinfo> <c:dotNetType xmlns:c="http://da.matthes.in.tum.de/oleDBTypes"> System.Int64</c:dotNetType> </xs:appinfo> </xs:annotation> <xs:restriction base="xs:long"/> </xs:simpleType> Dem Element werden aus dem XML Schema-Namensraum ein Attribut name und die restriction und annotation Unterelemente eingefügt. Das Attribut „name“ enthält als Wert den OLE DB-Datentyp und das restriction-Element legt den basis Xml Schema-Datentyp an. Das annotation-Element gibt weitere benutzerdefinierten Informationen, die bei der Entwicklung der SchemaExtractor-Komponente von Hilfe sein können. In diesem Fall ist das der .NetDatentyp, der dem OLE DB-Datentyp entspricht. Nun werden die eigentlichen Daten, die in der Datenbank gespeichert sind, beschrieben. Zuerst werden mit Hilfe der Methode OleDbConnection.GetOleDbSchemaTable alle Tabellen aufgelistet und jeweils ein Xml Schema-element-Element erzeugt. Die Methode gibt bei jedem Aufruf eine Tabelle mit Metainformationen, abhängig von den GUID- und Einschränkungswerten (s. Kapitel 4.2). Mit einem GUID-Wert „COLUMNS“ legt die zurückgegebene DataTable die Struktur jeder Tabelle fest. Es wird ein complexTypeUnterelement mit einer Sequenz von Unterelementen eingefügt, die der Tabellenspalten entsprechen. Als Beispiel wird die Tabelle „Categories“ in der Nortwind-Datenbank ausgesucht. Mit sql ist der Zielnamensraum des Dokuments referenziert. <xs:element name="Categories"> <xs:complexType> <xs:sequence> <xs:element name="CategoryID" type="xs:int" /> <xs:element minOccurs="0" name="CategoryName" type="xs:string" /> <xs:element minOccurs="0" name="Description" type="xs:string" /> <xs:element minOccurs="0" name="Picture" type="xs:base64Binary" /> </xs:sequence> </xs:complexType> <xs:key name="CategoryID_pk"> <xs:selector xpath=".//Categories" /> <xs:field xpath="CategoryID" /> 13 Xml Schema-Namensraum ist mit dem Unified Resource Identifier „http://www.w3.org/2001/XMLSchema“ eindeutig festgelegt. Aus diesem Namensraum stammen die oben erwähnten Elemente, die in der XSD Spezifikation [W32001] definiert werden. 64 </xs:key> <xs:keyref name="CategoryID_fk_Products_CategoryID" refer="sql:Products_Constraint1"> <xs:selector xpath=".//Categories" /> <xs:field xpath="CategoryID" /> </xs:keyref> </xs:element> Die Einschränkungsinformationen, wie Primär- und Fremdschlüssel, werden durch keyElemente ausgedrückt. Diese referenzieren entsprechend Primärschlüssel-Unterelemente im gleichen Tabellenelement oder als Fremdschlüssel-Einschränkungselemente in einem anderen Tabellenelement. Das keyref-Element referenziert für einen Primärschlüssel in der Tabelle die Fremdschlüssel-Einschränkung, die auf diesem Primärschlüssel zeigt. Das keyref-Element kann dann über annotation-Elemente mit den Optionen für Lösch- oder Änderungsweitergabe (cascading) erweitert werden (s. Kapitel 4.2). In Abbildung 14 wird ein Ausschnitt aus dem Datenbankschema mit Tabellen und die Beziehungen zwischen diesen angegeben. Abbildung 14: Ausschnitt aus dem Datenbankschema der Beispielsdatenbank „Northwind“ Wie in der Abbildung zu sehen ist, werden die Produkte in Kategorien eingeteilt. Wenn z.B. eine Kategorie gelöscht wird, wirkt sich das auf die Produkte aus. Entweder werden alle Produkte in dieser Kategorie mitgelöscht oder der Löschvorgang schlägt fehl. Eine andere Möglichkeit besteht darin, anstatt gleich Xml-Elemente zu produzieren, die integrierte Xml-Unterstützung von dem ADO.NET-DataSet zu nutzen. Aus den erhaltenen Metainformationen wird ein DataSet gebildet. Wie im vorherigen Abschnitt beschrieben, 65 werden alle Tabellen, Spalten und Einschränkungseigenschaften durchlaufen. Dabei werden aber nicht XSD-Elemente, sondern die entsprechenden Tabellenobjekte, Spaltenobjekte und Einschränkungsobjekte erzeugt. Bei der Initialisierung der Spalten werden die .NetDatentypen benötigt, also wird die Zuordnung von OLE DB-Datentypen zu .NET-Datentypen eingesetzt. Das DataSet benutzt für Ein- und Ausgabe Xml-Ströme (s. Kapitel 3.3.2), daher kann aus dem DataSet ein Xml Schema-Objekt nur mit den folgenden zwei Zeilen erzeugt werden. DataSet ds = new DataSet(); ……… System.IO.StringReader sr = new System.IO.StringReader(ds.GetXmlSchema()); System.Xml.Schema.XmlSchema schema= System.Xml.Schema.XmlSchema.Read(sr,…); Nachdem das DataSet mit den Tabellen und den Beziehungen zwischen diesen aufgefüllt ist, wird das SOM-Model über einen Datenstrom in einer XmlSchema-Instanz eingelesen. Diese wird zurückgegeben, um sie später entweder als in Textform zu bringen oder Quellcode daraus zu erzeugen. 5.2.2 Active Directory Die primären Datentypen sind in Active Directory fest programmiert und können nicht als Objekte ausgelesen werden. Die Informationen für das Mapping zwischen AD-Datentypen und XmlSchema-Datentypen müssen also aus der Herstellerdokumentation [MSDN15] gewonnen werden. In der Dokumentation wird ein Mapping zwischen .NET-Datentypen, die primäre ADSI-Datentypen (COM Automation-Datentypen), sowie die ADSI-Strukturen und AD-Datentypen definiert. Jeder Eintrag in diesem Mapping wird durch den attributeSyntaxund oMSyntax-Wert eindeutig festgelegt, mit Ausnahme der Objekttypen, die zusätzlich durch einen oMObjectClass-Wert definiert werden (s. Kapitel 4.1). Daraus wird ein Xml-Schema erzeugt, dessen Elemente einen eindeutigen Identifikator haben. Wenn der Typ kein COMObjekt darstellt (oMSyntax-Wert ist gleich 127), besteht der Identifikator nur aus den zusammengefügten Werten von attributSyntax und oMSyntax, andernfalls wird dazu auch den Wert von oMObjectClass genommen. Für jede Kombination ist ein simpleType-Element mit einem restriction-Unterelement im Schema definiert. Das restriction-Element enthält den XSD-Typ als Wert eines base-Attributs. Für die Objekttypen muss der Wert xs:any sein, damit bei der Codegenerierung die Serialisierungskomponente ein Feld vom Typ System.Xml.XmlElement erzeugt. Dieser Typ kann dann mit einer Code- Anpassungserweiterung mit System.Object ausgetauscht werden. Dann kann dieses Feld eine 66 COM-Objekt-Eigenschaft aufnehmen. Für die Nutzung dieser Eigenschaft ist entweder eine Typumwandlung auf eine ADSI-Schnittstelle oder Reflektion nötig. Wie im Kapitel 4.1.2 beschreiben, sind die Metainformationen von Active Directory in der Schemapartition gespeichert. Die Metainformationen sind auch Objekte mit Eigenschaften, die mit Hilfe von ADSI und der verwalteten Komponente DirectoryServices ausgelesen werden können. Als erstes muss eine Bindung zum Schema-Naming-Context hergestellt werden. Wenn der Hostname und der „Distinguished Name“ (DN) nicht bekannt sind, werden diese über rootDSE ermittelt. Aus der Position des Schema-Containers wird die Suche nach den Objekten für die Xml-Schema-Erstellung gestartet. Das objectClass-Attribut legt die Klasse eines Objekts fest, die die Verwendung eines Objekts bestimmt. Die Einträge in der Schemapartition enthalten als Objekte auch dieses obligatorische Attribut. Die Werte die es annehmen kann, sind attributeSchema und classSchema. Die Attributdefinitionen beschreiben die Attribute und die Klassen – die Struktur der Objekte. In der Abbildung 15 sind einige vordefinierten Klassen in Active Directory dargestellt. Die Klassen sind hierarchisch angeordnet und können von weiteren Klassen abgeleitet sein. <xs:complexType name="user"> <xs:complexContent mixed="false"> <xs:extension base="lt:organizationalPerson"> <xs:sequence> <xs:element ref="lt:businessCategory" /> <xs:element ref="lt:userCertificate" /> ……… <xs:element ref="lt:accountExpires" /> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> Abbildung 15: Ausschnitt aus Active Directory Schema Die Klasse User erbt die Attribute von OrganizationalPerson und Person und alle Klassen erben die Attribute der top-Klasse. Ein Attribut kann von mehreren Klassen benutzt werden, also ist es sinnvoll, genauso wie bei AD, die Attribute global zu definieren und aus den Xml67 Schema-Elementen, die die Klassen repräsentieren, zu referenzieren. Für die Attribute werden simpleType-Elemente erzeugt, deren Datentypen von den drei typspezifizierenden Attributen und in Xml-Schema definiertem Mapping festgelegt wird. Die Attribute werden mit Hilfe der DirectorySearcher-Klasse mit dem Filter „objectClass=attributeSchema“ erhalten. Die Attributnamen werden dann zwischengespeichert, weil sie bei der Erzeugung der KlassenElemente gebraucht werden. Die Namen sowohl der Attributen, als auch der Klassen werden eindeutig durch das Attribut lDAPDisplayName bestimmt. Für die Klassen werden complexType-Elemente erzeugt. Dabei wird in der Definition auf das Attribut subClassOf geachtet. Es enthält die Klasse, von deren Xml-Schema-Repräsentant der Xml-Schema-Typ abgeleitet werden muss. Das Attribut für die top-Klasse enthält den Wert top und wird beim Durchlauf ignoriert. Die Vererbung wird durch ein extensionElement definiert, das mit dem base-Attribut auf den vererbenden Typ zeigt. Beispielsweise ist in der Abbildung die XSD-Definition von der User-Klasse angegeben. Mit “lt” wird der Prefix eines Namensraums bezeichnet, der auch Zielnamensraum in diesem XSD-Dokument ist. Weil die User-Klasse von OrganizationalPerson erbt, enthält sie als Wert für das baseAttribut den qualifizierten Namen des organizationalPerson-Typs. 5.2.3 Exchange Server Wie in Kapitel 4.3 erwähnt, befindet sich die Metadatenbeschreibung der Items im Webstore in Xml-Dateien in einem schema-Ordner. Sie sind auch über HTTP/WebDAV zugänglich. Die Xml-Dokumente in diesen Dateien sind in XDR-Format, wobei für jedes Attribut und für jedes Element eine eigene Datei angelegt worden ist. Die primären Datentypen befinden sich im urn:schemas-microsoft-com:datatypes-Namensraum und werden im Exchange Server SDK definiert [ESDK03]. Von der Dokumentation kann also ein Mapping zwischen den Microsoft-Datentypen und den XSD-Datentypen erstellt werden. Eine andere Möglichkeit bietet der World Wide Web Consortium, indem sie die Microsoft-Datentypen als Data Type Definition (DTD)-Notation-Deklarationen deklarieren [W30100]. Diese können dann über den festgelegten Namen referenziert werden. Mit der System.Xml.Schema-Komponente ist es möglich, aus diesen Dokumenten ein SOM14 zu bilden. Der Nachteil dabei ist, dass der XDR-Prozessor in dieser Komponente die Namensräume nicht beibehält und diese bei der Generierung von z.B. SQL-Anfragen benötigt werden. Also muss ein XDR-Prozessor für die Exchange-Schemadokumente entwickelt 14 Schema Object Model (s. Kapitel 3.1.1) 68 werden. Weil die Definitionen der XDR-Elemente und Attribute auch in Dateien in diesem Ordner deklariert werden, müssen sie bei der Umwandlung übersprungen werden. Das ist mit der Ignorierung aller Elementen und Attributen aus dem urn:schemas-microsoft-com:xmldata-Namensraum gleichgesetzt, der die XDR-Definition für XDR-konforme Dokumente repräsentiert. Die Dokumente werden mit der System.Xml-Komponente ausgelesen. Die Frage nach der Wahl zwischen SAX und DOM bedeutet für die Entwicklung der Extrahierungskomponente, ob mehr Effizienz oder weniger Komplexität gewünscht ist. Es kann ohne weiteres angenommen werden, dass die Extrahierung der Metadaten aus Exchange Server sehr selten, wenn nicht nur bei jeder Installation ausgeführt wird. Also fällt die Entscheidung wegen der Komplexität der Aufgabe auf DOM. Bei der Erzeugung der XSD-Dokumente müssen die Namensräume beibehalten werden und da es mehrere gibt, muss für jeden ein separates XSD-Dokument mit dem entsprechenden Zielnamensraum erzeugt werden. Am Ende sind genauso viele Dateien, wie es Namensräume in den XDR-Deklarationen gibt, mit Ausnahme der zwei oben genannten Namensräume. Im Folgenden ist die Deklaration der folder-Content Klasse angegeben. Mit ElementType wird ein Typ definiert, unabhängig davon, ob er im Vergleich zu XSD einen komplexen Typ mit Unterelementen darstellt. <?xml version="1.0"?> <Schema name='ExchangeSchema' xmlns="urn:schemas-microsoft-com:xml-data" xmlns:d="DAV:" xmlns:ex="http://schemas.microsoft.com/exchange/" xmlns:cc="urn:content-classes:" xmlns:dt="urn:schemas-microsoftcom:datatypes" xmlns:s="urn:schemas-microsoft-com:exch-data:" xmlns:m="urn:schemas:httpmail:"> <ElementType name="cc:folder" d:contentclass="cc:contentclassdef" s:comclassid="CD00010E-8B95-11D1-82DB-00C04FB1625D" s:comprogid="CDO.Folder" s:closedexpectedcontentclasses="0" > <extends type="cc:item"/> <s:expected-content-class type="cc:item"/> <s:expected-content-class type="cc:folder"/> <element type="ex:adminfolderdescription"/> <element type="s:baseschema"/> …… <element type="s:expected-content-class"/> …… <element type="ex:foldersize"/> …… </ElementType> </Schema> 69 Im urn:schemas-microsoft-com:exch-data-Namensraum werden Elemente definiert, die spezifische für den Exchange Server oder für die Anwendungsprogrammierer Metadaten darstellen. Mit der „urn:schemas-microsoft-com:exch-data:expected-content-class“- Eigenschaft z.B. kann eine Einschränkung für die enthaltenen Items für dieses Verzeichnis festgelegt werden. Mit s:commclassid-Eigenschaft und s:comprogid-Eigenschaft können Items dynamisch auf die allokierte und instanziirte Klasse der CDO-Komponente (s. Kapitel 3.2.1) gecastet werden. Der Exchange Webstore besitzt eine hierarchische Struktur, in der Items Eigenschaften von anderen Items erben können. Ein ElementType-Element in XDR besitzt dafür ein extendsUnterelement, der auf die übergeordnete Itemdefinition zeigt. In Abb.16 sind einige für den Exchange Server wesentlichen Itemdefinitionen und die Beziehungen zwischen diesen angegeben. Alle Elemente im Webstore sind Items, daher übernimmt die Itemdefinition die oberste Stelle in der Hierarchie der Metadaten. Sowohl Message als auch Folder erben von Item. Ein Mailverzeichnis ist auch ein Verzeichnis und erbt die Attribute sowohl von Folder als auch von Item. Nun kann die eigentliche Umwandlung von XDR- nach XSD-Dokumenten erfolgen. Abbildung 16: Ausschnitt aus dem Exchange Server-Schema Die ElementType-Elemente aus allen XDR-Dokumenten werden in einer DOM-Struktur auf gleiches Niveau als Kinder eines XDR-Schema-Elementes abgebildet. Bei der Arbeit muss auf die XPath-Komponente verzichtet werden, weil in XDR in den name-Attributen 70 Referenzen über die definierten Präfixe für die Namensräume erlaubt sind. Das „:“-Zeichen ist also in den Werten dieser Attribute enthalten und obwohl Attribute in Xml als Werte nicht geparste Zeichenketten (CDATA) annehmen können, schlägt die Komponente fehl. Als erstes werden alle Namensräume des XDR-Schema-Elements in einem neuen XmlSchema-Objekt geladen. Dann werden alle ElementType-Elemente im DOM durchgelaufen. Für diese, die primäre Datentypen haben, also das urn:schemas-microsoftcom:datatypes:type-Attribut enthalten, werden im XOM XSD-simpleType-Elemente erstellt und für alle anderen - complexType-Elemente, jeweils mit den entsprechenden Präfixen für die Namensräume in den Name-Attributen. Für die simpleType-Elemente werden noch resctriction-Elemente mit den entsprechenden Typen aus dem vordefinierten Mapping hinzugefügt. Damit sind die simpleType-Elemente, die die Definitionen der Eigenschaften in Exchange Webstore-Schema repräsentieren, vollständig deklariert. Bei den komplexen Typen werden noch die Unterelemente betrachtet. Für das extend-Element werden für die Modellierung der Vererbung die Elemente complexContent und extension aus XSD eingesetzt (s. Abb. 16). Für jedes element-Element wird in XOM ein Element in die vom complexType enthaltene Sequenz mit Kindelementen (XSD-sequence) hinzugefügt. Die expected-content-class-Eigenschaften stellen Sammlungen (Collections) von Objekten von bestimmten Typen dar, die ein Verzeichnis aufnehmen können. Für die Collections können komplexe Typen erstellt werden, die mit den Attributen minOccurs und maxOccurs im untergeordneten sequence-Element die Häufigkeit der im sequence-Element enthaltenen Unterelemente festlegen. Auf diese Weise können Arrays vom entsprechenden Typ für jedes XDR-expected-content-class-Element modelliert werden. Die Xml-Schema-Dokumente befinden sich nun in mehreren XOM-Instanzen. Damit sie einzeln validiert und kompiliert werden können, werden import-Anweisungen deklariert, die die Xml-Schema-Dokumenten referenzieren, die externen für das Dokument Xml-SchemaDeklarationen enthalten. 5.2.4 Benutzerdefiniertes Modell Das Benutzerdefiniertes Modell (Common-Model) bildet das Kernkonzept des Systems und zwar das Assemblieren von Entitäten die in unterschiedlichen Anwendungen definiert sind. In der Abbildung 17 ist u.a. die Entität IBUser (information bridge - User) definiert. Ein IBUser in diesem System enthält Nachrichten, Daten über ihn als Angestellter in einer 71 Datenbank, die für ihn enthaltenen Daten im Verzeichnisdienst, sowie ein Verzeichnis mit Dokumenten und Nachrichten. Abbildung 17: Beispielsinstanz des Common-Models Die Entitäten IBUser, CustomFolder, DocumentCollection, Messages und MessageCollection sind Entitäten, die im Common-Model definiert werden. Die restlichen stellen Entitäten aus den integrierten Anwendungen dar. Um Daten persistent zu halten, müssen die deklarierenden Entitäten auf Entitäten in den Unternehmensanwendungen verweisen. Verständlicherweise müssen die Modelle für die Unternehmensanwendungen vorliegen, um das Common-Model modellieren zu können. Die in den vorherigen Punkten beschriebenen Modelle werden in Dateien als XSD-konforme Dokumente gespeichert. Das Common-Model ist selbst ein XSDDokument und importiert Typen von den anderen Modellen. Im Folgenden wird ein Ausschnitt für die IBUser-Entität aus dem Common-Model (s. Anhang 1) angegeben. <xs:element name="IBUser"> <xs:complexType> <xs:sequence> <xs:element ref="lt:user"/> <xs:element ref="sql:Employees"/> <xs:element ref="cm:messages"/> <xs:element ref="cm:CustomFolder"/> </xs:sequence> </xs:complexType></xs:element> 72 Bei der Deklaration von IBUser müssen nur die importierten und selbst definierten Typen aufgelistet werden. Alternativ kann die messages-Entität gleich im IBUser deklariert werden, um im Code ein Array vom Typ Exchange-message zu erhalten, anstatt einer Referenz auf den Typ Messages, der seinerseits ein Array vom Typ Exchange-message enthält: <xs:element ref="cm:message" minOccurs="0" maxOccurs="unbounded"/> Die CustomFolder-Entität (s. Anhang 1) assembliert Nachrichten und Dokumente und stellt gleichzeitig ein Verzeichnis dar, indem er die Eigenschaften der Exchange-mailfolder-Entität erbt. Als Angestellte und Benutzer im Active Directory enthält möglicherweise der IBUser redundante Daten (s. Abbildung 18), wie z.B. Familiennamen. Die Lösung des Problems ist eine bijektive Transformation zwischen den Common-Model-Entitäten und den Entitäten in den Unternehmensanwendungen zu definieren. Dafür müssen Regeln aufgestellt werden, die Fragmente des Common-Model-Modells (die benutzerdefinierten Entitäten - Quellmodell) auf solche in den Unternehmensanwendung-Modellen (extrahierten Metadaten - Zielmodell) zuweisen. Exch.Employee fname:John IBUser sname:Doe fname=John height:174cm sname=Doe height=174cm AD.User name=Doe,John height=5,7ft Transformation Abbildung 18: Transformation zwischen Metamodellen [Anhang 3] Weil Metamodelltransformationen außerhalb der Rahmen dieser Arbeit sind, werden im Folgenden nur kurz zwei dafür geeignete Ansätze erwähnt. Hierfür werden als Metamodelle die im System enthaltenen Modelle bezeichnet, wie z.B. die im Kapitel 5.2 extrahierten Modelle und die eigentlichen Daten (Modell-Instanzen als Informationsobjekte) Modelle genannt. 73 BizTalk Server behandelt dieses Problem (s. Kapitel 2.4.1), indem er mit dem BizTalkMapper ein graphisches Werkzeug für die Zuordnung von Elementen im Quellschema zu Elementen im Zielschema zur Verfügung stellt. Die Zuordnungen werden im XSLT-Format [W31199] gespeichert und bei ankommenden Daten eingesetzt (s. Anhang 4). Der Nachteil dabei ist, dass die Transformation nicht bidirektional verlaufen kann und somit für beide Richtungen die Zuordnungen erstellt werden müssen. Außerdem kann mit XSLT nicht sichergestellt oder überprüft werden, ob das Ergebnis (Zielmetamodell-Instanz oder Zielmodel) konform zum Zielmetamodell ist. Mit der Bidirectional Object-oriented Transformation Language-Sprache (BOTL) [BRM03] können Regeln in Xml-Format aufgestellt werden, die mit Hilfe einer Transformationskomponente auf Objektgeflechten angewendet werden können. Weil sie eine UML-basierte MOF15-Instanz darstellt, können die Regeln und Metamodelle in einem graphischen Werkzeug erstellt werden. Bei der Entwicklung sorgen Heuristiken dafür, dass die Regeln auf die konkreten Daten (Objektmodelle), die konform zum Quellmetamodell sind, mit immer dem gleichen Ergebnis angewendet werden können, unabhängig von der Reihenfolge der transformierten Fragmente. Außerdem überprüfen sie, ob das Zielmodell der Transformation immer konform zum Zielmetamodell sein wird. Die Transformationskomponente überführt zur Laufzeit abhängig von den definierten Regeln das Quellmetamodell in das Zielmetamodell. Im Anhang 3 ist ein anschauliches Beispiel angegeben, das nicht BOTL-konform ist und nur die grobe Vorgehensweise darstellt. 5.3 Code-Generierung Die folgende Abbildung zeigt eine Zuordnung von den Elementen eines Xml-Schemas zu den in UML dargestellten Klassen. Es wird darauf hingewiesen, dass es Elemente mit dem gleichen Namen aus verschiedenen Namensräumen geben kann. Diese Elemente müssen bei der Codegenerierung gegebenenfalls umbenannt und mit den Namensräumen über .NETAttribute gekennzeichnet werden. Die Vererbung zwischen den Entitäten muss beibehalten werden. 15 Meta-Object Facility (MOF) von Object Management Group ist ein Metamodell für alle OMG-Metamodelle. 74 <xs:complexType name="message“…> <xs:complexContent mixed="false"> <xs:extension base="cc:item"> <xs:sequence> <xs:element ref="h:approved"/> <xs:element ref="h:bcc"/> <xs:element ref="m:bcc"/> …. <xs:element ref="m:date"/> …. </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:simpleType name="date"> <xs:restriction base=„dt:dateTime"/> </xs:simpleType> Abbildung 19: Zuordnung Unternehmensanwendung - XmlSchema Für die Code-Generierung wird die CodeDom .NET-Framework-Komponente verwendet. Die Komponente CodeGenerator (s. Abb. 19) setzt auf diese auf, um aus Xml-Schema strikte .NET-Datentypen implementierten zu erstellen. Objektmodel, Es um benutzt also das XSD-Dokumente im in CodeDom-Namensraum .NET-Quellcodedokumente umzuwandeln. Die Metadaten müssen also bereits in XSD-Format definiert sein und außerdem im Schema Objektmodel, abgekürzt SOM, geladen sein, was von der SchemaExtractor-Komponente (s. Kapitel 5.2) übernommen wird. Die Process-Methode der CodeGenerator-Klasse ist der Einstiegspunkt für die CodeGenerierung. Sie erwartet als Parameter ein XmlSchemas-Objekt, das eine Sammlung von SOM-Instanzen – XmlSchema darstellt, die der geladenen und kompilierten Schemas entsprechen. Als Rückgabe wird das Objektmodel des Quellcodes als ein CodeNamespaceObjekt zurückgegeben. 75 Abbildung 20: Die codeGenerator-Komponente zur Codegenerierung aus XSD. Der Prozess der Code-Generierung aus XSD wird grob im Kapitel 3.1.2 beschrieben. Er kann, wie bereits erwähnt, nicht beliebig gesteuert werden. Es ergeben sich zwei Möglichkeiten: entweder wird für jedes Element im SOM ein Objekt aus dem CodeDom-Objektmodel anhand von switch-Anweisungen und Fallunterscheidung instanziiert, oder wird mit Hilfe der Serialisierungs-Komponente in .NET-Framework das CodeDom-Objektmodel aufgebaut und später angepasst. Bei der zweiten Variante können beliebige Anpassungen hinzugefügt werden, ohne den bestehenden Code in der codeGenerator-Komponente zu ändern. Das wird über die ICodeGeneratorExtension-Schnittstelle ermöglicht. Jede Erweiterungs-Klasse im Extensions-Namensraum muss diese Schnittstelle implementieren. Im übergebenen SOMModell wird nach einem <annotation>-Element gesucht, der die Anpassungen des Codes durch Angabe der Klassen, die die genannte Schnittstelle implementieren und die Assembly in dem sie sich befinden festlegt. Die Anpassungserweiterungen werden später in diesem Kapitel für die Modellen für die einzelnen Unternehmensanwendungen beschrieben. Die Erweiterungen können auch in einer externen Datei oder in einem XmlSchema-Objekt definiert werden, im Folgenden Beispiel sind zwei Erweiterungen definiert. <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:annotation> <xs:appinfo> <Code xmlns="http://de.tum.in.ib/codeGenerator/extensions"> <Extension Type="de.tum._in_.ib.codeGenerator.extensions.ArraysToCollectionsExtension, ModelSerializer"/> <Extension Type="de.tum._in_.ib.codeGenerator.extensions.AddAnnotationNodeName, ModelSerializer"/> 76 ……… </xs:schema> Beide befinden sich im ModelSerializer-Assembly und geben die Namen der Klassen an, die die Schnittstelle implementieren. Nach dem Instanziieren der aufgelisteten Klassen wird für jede Instanz für die XmlSchemas-Sammlung die Methode Process aufgerufen. In dieser Arbeit wird diese zweite Variante ausgearbeitet. Für alle im SOM definierten Elemente wird eine Zuordnung auf .NET-Konstrukte mit Hilfe der XmlTypeMapping-Klasse und der XmlSchemaImporter-Klasse erstellt. Die .NET-Konstrukte werden dann unter Verwendung der XmlCodeExporter-Klasse in dem CodeDom-Objektgraph eingefügt, der von der CodeNamespace-Klasse repräsentiert wird. Der Name des neu erstellten .NETNamensraums wird als Parameter der Process-Methode übergeben. Für jede übergebene XmlSchemas-Ansammlung wird ein separater .NET-Namensraum im Quellcode erstellt. Beispielsweise befinden sich alle Klassen, die die im Active Direcory und Exchange Server Entitäten beschreiben, in den Namensräume de.tum._in_.ib.models.ad und de.tum._in_.ib.models.exchange. Die definierten in den XSD-Dokumenten Elemente kommen aus verschiedenen Xml-Namensräume, die beibehalten werden müssen (s. Abb. 19). Sie werden später von den Datenzugriffskomponenten gebraucht, um die qualifizierten Namen der Entitäten in den Unternehmensanwendungen wiederherstellen zu können. Das geschieht, indem weitere Meta-Informationen den .NET-Deklarationen in Form von Attributen hinzugefügt werden. Diese Aufgabe wird teilweise von der Serialisierungskomponente übernommen. Für jede Klasse, Feld oder Eigenschaft werden der Name und der Namensraum aus dem Xml-Schema-Dokument mit Hilfe eines Serializierungsattributs angegeben. Das Attribut entspricht einem Konstrukt aus dem Infoset von Document Object Model (DOM). Im Folgenden ist beispielsweise die Klasse IBUser im Namensraum de.tum._in_.ib.models.common mit dem XmlRootAttribute-Attribut angegeben. namespace using using using de.tum._in_.ib.models.common { de.tum._in_.ib.models.exchange; de.tum._in_.ib.models.ad; de.tum._in_.ib.models.mssql; using System.Xml.Serialization; [System.Xml.Serialization.XmlRootAttribute("IBUser", Namespace="http://da.matthes.in.tum.de/commonModel", IsNullable=false)] public class IBUser { [System.Xml.Serialization.XmlElementAttribute(Namespace="http://da.m atthes.in.tum.de/ldapSchema")] public de.tum._in_.ib.models.ad.User user{…} [System.Xml.Serialization.XmlElementAttribute(Namespace="http://da.m atthes.in.tum.de/sqlDBSchema")] 77 public de.tum._in_.ib.models.mssql.Employees employees{…} [System.Xml.Serialization.XmlElementAttribute("message", Namespace="urn:content-classes:")] public MessageCollection message{…} public CustomFolder customFolder{…} } ……… } Die Serialisierungskomponente fügt im Attribut des Quellcode-Konstrukts in CodeDomObjektgraph jedoch den Namen des Elements nicht hinzu, wenn der Name des Tags im XmlDokument mit dem Namen des Konstrukts im Quellcode übereinstimmt. Bei Serialisierung und Deserialisierung kann der qualifizierte Name, der auf eine Entität oder eine Entitätseigenschaft in der Unternehmensanwendung verweist, trotzdem wiederhergestellt werden. Keine Übereinstimmung entsteht, wenn z.B. der Name in der Programmiersprache belegt ist (es wird ein „@“ vor dem ersten Zeichen eingefügt) oder er unerlaubte Zeichen enthält (diese werden entfernt), oder wenn zwei Eigenschaften aus verschiedenen XmlNamensräume kommen, die gleichen Namen haben und in der gleichen Klasse definiert werden müssen (hier wird wiederum ein „_“ vor dem ersten Zeichen eingefügt). Solche Fälle müssen berücksichtigt werden, wenn Erweiterungen für das Anpassen des Codes entwickelt werden. In dem angegebenen Beispiel wird der Name der Klasse IBUser, obwohl es mit dem Parameter des Attributs übereinstimmt, angegeben. Der Parameter wird z.B. wegen der Erweiterung SetCapitalClassFirstLetterExtension (s.Abb. 21) gebraucht, die die erste Buchstabe aller Klassennamen großschreibt. Nun um den qualifizierten Namen wiederherstellen zu können, wird die Erweiterung AddAnnotationNodeName eingesetzt. Diese fügt den ursprünglichen Namen, falls nicht vorhanden, als Parameter des Attributs hinzu. Diese Attribute werden außerdem von den Erweiterungskomponenten bei der Anpassung des Codes verwendet, die dafür den Objektgraph reflektieren. 78 Abbildung 21: Erweiterungen für die zusätzliche Anpassung des Quellcodes bei CodeGenerierung Die Serialisierungskomponente in .NET 1.1 exportiert nur Felder und Arrays, wo Eigenschaften und Collections den automatisierten Zugriff auf die erstellten Klassen erleichtern. Die ArraysToCollectionsExtension übernimmt die Aufgabe, für jede generierte Array-Deklaration eine Wrapper-Klasse zu erstellen, die von System.Collections.CollectionBase abgeleitet wird. Die Wrapper-Klasse implementiert für die Sammlung von Objekten den Zugriff über die Position des Objektes und eine Add-Methode, mit der neue Objekte von dem Array-Typ eingefügt werden können. An dem Namen dieser Wrapper-Klasse wird außerdem „Collection“ angehängt. Anschließend wird anstelle der Array-Deklaration einen Verweis auf der neu erstellten Klasse eingefügt. Es wird darauf geachtet, dass in einem Namensraum nur eine Wrapper-Klasse für einen Array-Typ generiert wird und alle Array-Deklarationen von diesem Typ mit Verweisen auf diese Klasse ersetzt werden. Mit der FieldsToPropertiesExtension werden für alle Felder Eigenschaften mit AccessorMethoden erstellt. Dabei werden die Namen mit einem Unterstrich als erstes Zeichen erweitert. Die Kommentare und Attribute werden den Eigenschaften zugewiesen. In der getund set-Accessor-Methode werden keine Einschränkungen der Datentypen berücksichtigt. 79 Die letzte in der Abbildung 21 dargestellte Erweiterung ist die AddDBConstraintAnnotationsKlasse. Mit dieser Erweiterung wird der Quellcode mit Metadaten angereichert, die die Elemente des relationalen Datenbankmodels (s. Kapitel 4.2) beschreiben. Die Attribute sind im de.tum._in_.ib.annotations Namensraum deklariert. Abbildung 22: Attribute, die Strukturen in relationalen Datenbanken beschreiben. Diese Attribute können dazu benutzt werden, um komplexe Datenstrukturen über die Datenzugriffskomponente anzufordern, oder Methoden automatisch zu generieren, die als Parameter die Primärschlüssel einer Tabelle erhalten, damit z.B. bei Suchanfrage gewährleistet wird, dass nur einen Datensatz gefunden und zurückgegeben wird. Es ist ersichtlich, dass die Reihenfolge, in der die Erweiterungen ausgeführt werden, von großer Bedeutung ist. Für das „common model“, das Model vom Exchange Server und das von Active Directory hat sich folgende Reihenfolge bewährt: ArraysToCollectionsExtension AddAnnotationNodeName SetCapitalClassFirstLetterExtension FieldsToPropertiesExtension Nachdem die Wrapper-Klassen für die Collections erstellt werden und der Name jeder Klasse in ihrem Attribut eingefügt wird, können nun die ersten Buchstaben aller Klassen großgeschrieben werden. Die FieldToPropertiesExtension wird als letzte ausgeführt, weil ansonsten die anderen Erweiterungen, die die Felder im CodeDom-Objektgraph durchlaufen und modifizieren, dann auch die Eigenschaften berücksichtigen müssen. Bei dem Microsoft Sql Server bleibt die Reihenfolge dasselbe, hinzu kommt nur die Erweiterung für die Attribute des relationalen Datenbankmodels. Sie wird zuletzt ausgeführt. Im Abschluss dieses Kapitels werden die Problemfälle beim Verweis auf externe Datentypen behandelt. Hier geht es darum, dass XSD-Dokumente von einander abhängen können, indem 80 sie externe Typen referenzieren (s. Kapitel 5.2). Wenn für alle Schemas den gleichen CodeNamespace-Namensraum benutzt wird, besteht kein Bedarf die qualifizierten Namen der Code-Konstrukte anzugeben, wie z.B. bei Exchange Server: obwohl die Elemente in den Xml-Schema-Dokumenten aus verschiedenen Xml-Namensraümen stammen und in verschiedenen Xml-Schemas deklariert sind, werden für diese Klassen im gleichen .NETNamensraum - de.tum._in_.ib.models.exchange deklariert. Wie bereits erwähnt, werden die Xml-Namensräume als zusätzliche Metainformationen in den Attributen angegeben. Der qualifizierte Name für IBUser im vorherigen Beispiel ist de.tum._in_.ib.models.common.IBUser. Die Klasse enthält aber Eigenschaften, die außerhalb dieses .NET-Namensraums (CodeNamespace im CodeDom-Objektgraph) deklariert werden, wie z.B. die Eigenschaft user, die im .NET-Namensraum de.tum._in_.ib.models.ad deklariert wird. Das Common-Model besteht nur deswegen, um benutzerdefinierten Entitäten (Systementitäten) zu definieren, die Entitäten aus verschiedenen Unternehmensanwendungen zusammenführen. Die Systementitäten bieten auf diese Weise eine einheitliche Zugriffsmöglichkeit auf komplexe Datenstrukturen, die im Einzelnen aus verschiedenen Unternehmensanwendungen stammen können. Die Datenzugriffsebene übernimmt die Verteilung der Anfragen an den verschiedenen Unternehmensanwendungen abhängig von der Struktur und Eigenschaften der Systementitäten. Der oben beschriebene Problemfall mit den .NET-Namensräumen entsteht also ausschließlich bei der Codegenerierung für das CommonModel. Hier ist noch einmal darauf hinzuweisen (s. Kapitel 5.2.4), das es dabei um Verweise geht und nur auf ganze Entitäten. Der Verweis auf Eigenschaften einer Entität ist nicht möglich. Damit werden die Problemstellungen bei Metamodelltransformationen vermieden, die sicherlich nicht in dieser Arbeit überwindbar wären. Beim Exportieren der Elementen aus den Schemas in den CodeNamespace durch die Serialisierungskomponente werden nur die Referenzen auf Typen des gleichen CodeNamensraums oder die intern definierten Zuordnungen auf .NET-Framewrok-Typen aufgelöst. Externe für den Code-Namensraum Datentypen müssen also besonders behandelt werden. Die Klasse CodeGenerator enthält drei Felder: eine Referenz auf CodeNamespaceCollection, der Target-Namensraum des Xml-Schemas; eine Zeichenfolge als Bezeichnung des zu erstellenden .NET-Namensraums, der ab jetzt als Zielnamensraum genannt wird; und einen Verweis auf einem XPath-Ausdruck, der bei Bedarf extern für das Schema definierte Erweiterungen enthält. 81 Die erste und zweite Variable sind für die Lösung der Problemstellung vorgesehen und enthalten entsprechend die CodeDom-Namensräume, auf die referenziert wird und das Target-Namensraum eines XmlSchemas, falls nur Elemente aus diesem Target-Namensraum in Code umgewandelt werden müssen. Wenn beide gesetzt sind, werden die qualifizierten Namen der extern definierten Typen über die CodeDom-Namensräume ermittelt und entsprechende CodeDom-Deklarationen mit diesen angelegt. Anschließend werden die import-Anweisungen für die externe Namensräume im CodeDom-Objektgraph eingefügt. Mit Hilfe der CodeDomProvider-Klasse und der Microsoft.CSharp.CSharpCodeProviderKlasse ist der CodeDom-Objektgraph in Textform serialisierbar. Es bleibt nur übrig, den Quellcode zu kompilieren und die .NET-Assembly den Datenzugriffsschnittstellen zur Verfügung zu stellen. Für das Kompilieren des Quellcodes gibt es zwei Möglichkeiten. Die erste basiert auf dem .NET-Compiler csc.exe. Der Compiler wird in einer Konsole gestartet, die Quellcode-Dateien erhält er als Parameter. Die zweite Möglichkeit beruht auf dem Einsatz des CodeCompileUnit im CodeDom, dem gleich die erstellten CodeDom-Objektgraphen übergeben werden. Über Parameter kann der Prozess des Kompilierens gesteuert werden, wie z.B. Verlinken mit anderen Assemblies, oder den Namen des Assembly festlegen. Die Prozesse der Serialisierung in Textform und das Kompilieren werden in der Klasse ModelSerialiser implementiert. Eine weitere Komponente – de.tum._in_.ib.engine übernimmt die Steuerung des gesamten Prozesses, der außerdem von den Konfigurationseinstellungen abhängt. Mit der Erzeugung des Assembly ist die Aufgabe dieser Komponente abgeschlossen. 5.4 Komponenten für den Datenzugriff (Data-Access-Layers) Der Datenzugriff wird in drei Schichten eingeteilt. Die unterste Ebene bilden alle Komponenten, die Zugriff auf die Unternehmensanwendungen anbieten, einschlißlich die selbst implementierten Kommunikationsprotokolle. Sie werden in der .NET-Architektur DataAccess-Helper [SET04] genannt. Die selbst implementierten Kommunikationsprotokolle erfüllen in dieser Arbeit gleichzeitig die Rolle der mittleren Schicht, die die Datenzugriffskomponenten repräsentiert. Sie führen Aufgaben wie Initialisierung der DataAccess-Helper, die Authentifizierung an den Unternehmensanwendungen etc. durch. Damit bieten sie den überliegenden Komponenten einen einfachen und strukturierten Zugriff auf die Unternehmensanwendungen. Die Object-Datenzugriffsebene sorgt für die Serialisierung der Objekte in den von den Unternehmensanwendungen geforderten Formaten und vereinheitlicht die Arbeit mit den Datenzugriffskomponenten über vorgegebene 82 Schnittstelle. Die Struktur der erhaltenen über diese Schnittstelle Objekte ist wegen fehlender Verlinkung mit der Model-Komponente nicht bekannt. Die Objekte müssen dann nach systemspezifischen Regeln dynamisch verarbeitet werden. Somit wäre die nichtfunktionale Anforderung für eine möglichst lose Kopplung erfüllt (s. Kapitel 2.5). In Abbildung 23 sind die Klassen und Schnittstellen der Datenzugriffskomponente angegeben. Dabei wurde versucht, die Schichten übereinander zu ordnen. Alle Klassen, deren Namen mit „DAL“ enden, bilden die Datenzugriffsebene und alle, deren Namen mit „Generic“ enden – die Object-DAL-Ebene. Die DataAccess-Helper-Ebene ist in diesem Diagramm nur mit der ExchangeDAL-Klasse vertreten, die zusätzlich zu den Aufgaben in der mittleren Ebene die WebDAV Kommunikationsprotokolle teilweise implementiert. Die restlichen in der Abbildung angegebenen Klassen helfen den ObjectDALs mit der Reflektion der Objekte, indem sie dabei behilfliche Strukturen aufstellen. Abbildung 23: Klassendiagramm der Datenzugriffskomponente Eine ObjectDAL-Klasse erfüllt die Rolle eines Objektadapters, indem sie die DAL-Klassen (Adaptee-Objekte) an der vordefinierten Schnittstelle (Target-IDAL) anpasst. Die ObjectDALs erhalten von den überliegenden Komponenten (Diensten) Objekte, die sie 83 untersuchen. Abhängig von den in den Objekten gesetzten Eigenschaften und der aufgerufenen Methoden bilden die ObjektDALs Nachrichten, die sie an den darunter liegenden Datenzugriffsschnittstellen weiterleiten. Beispielsweise werden bei der Suche nach Informationsobjekten gesetzte Eigenschaften zusammen mit den Werten als Suchattributen und die nicht-gesetzten – als angeforderten Attributen in der Suchanfrage eingefügt. Reflektion mit den Util-Klassen Die in der Abbildung dargestellten Util-Klassen können als Parser von Objekten aufgefasst werden. Mit Hilfe der Reflektions-Komponente System.Reflection laufen sie die Struktur des Objekts durch und abhängig davon erfüllen Sie verschiedene, für Unternehemensanwendungen spezifischen Aufgaben, um die Arbeit der ObjectDAL-Klassen zu erleichtern. Die DALGenericUtil-Klasse übernimmt allgemeine Aufgaben, wie z.B. die Ermittlung des qualifizierten Namens vom Typ eines Informationsobjekts in der Unternehemensanwendung, oder des Namens einer von seinen Eigenschaften. Solche Art von Informationen wurden in den Modellen in Form von Attributen hinzugefügt. Die Ausprägungen dieser Klassen, wie DALGenericExchangeUtil, DALGenericADUtil etc. übernehmen für die Systeme spezifische Aufgaben, wie z.B. die Ermittlung der Schlüsseleigenschaft eines Objekts, um ihn in den Systemen eindeutig indetifizieren zu können. Bei Microsoft Sql Server ist diese Eigenschaft durch einen selbst definierten Attribut PrimaryKey (s. Kapitel 5.3.) angegeben. Bei Exchange Server ist sie die href-Eigenschaft der Item-Klasse, die die Wurzel der im Modell aufgestellten Hierarchie darstellt. Im Active Directory sind das mehrere Eigenschaften. Weil die Attributdefinitionen für Einschränkungseigenschaften in dieser Arbeit nur für relationale Datenbanken erstellt worden sind, wurden diese Informationen in den Util-Klassen fest codiert. Die Hauptaufgabe der UtilKlassen ist, beim Durchlaufen des Instanz-Objektmodells die gesetzten und nicht-gesetzten Eigenschaften zu sammeln und zusammen mit den weiteren benötigten Informationen wie Schlüsselattributen und qualifizierten Namen an den ObjektDALs zur Verfügung zu stellen. Die Eigenschaften werden außerdem abhängig vom Typ in einem für das Zugriffsprotokoll bestimmten Format überführt, z.B. der Wert einer Eigenschaft vom Typ String, die als Suchattribut in einer Sql-Suchanfrage benutzt wird, wird in Anführungszeichen gesetzt. Die DALCommonModelUtil-Klasse enthält weitere Funktionen, die Objekte mit bestimmten Typ-Eigenschaften über Reflektion kopieren. Beispielsweise, wenn die Klasse B von A erbt, können für alle in A definierten Eigenschaften den Werten für diese Eigenschaften von einer A-Instanz einer B-Instanz zugewiesen werden. Die Laufzeitumgebungen moderner 84 objektorientierten Sprachen (Java RE, .NET CLR) erlauben nicht, einer B-Instanz eine AInstanz zuzuweisen. Der Bedarf für diese Funktionen wird bei der Beschreibung des internen ObjektDAL für die anwendungsübergreifenden Anfragen erklärt. Im Folgenden werden die Eigenschaften und Funktionsumfang der Schichten in Bezug auf die für den Beweis des Konzepts ausgesuchten Anwendung genauer betrachtet. 5.4.1 Exchange Server Data Access Layer (DAL) Für die Kommunikation mit Exchange Server (s. Kapitel 4.3) wird WebDAV (s. Kapitel 3.2.5) verwendet. System.Web wird als Hilfskomponente eingesetzt, die die HTTP/HTTPSProtokolle implementiert. Die ExchangeDAL-Klasse benutzt die System.Web-Komponente, für den Verbindungsaufbau und für die Autorisierung an Exchange Server. Im Fall von HTTPS müssen die Zertifikate überprüft und angenommen werden. Die Überprüfung der Zertifikate ist außer der Rahmen dieser Arbeit, es wird aber eine Methode zur Verfügung gestellt, die alle Zertifikate als gültig einstuft, um die Verbindung herstellen zu können, die bei der Weiterentwicklung entsprechend erweitert werden kann. Nachdem die Verbindung aufgebaut ist, werden die Header und den Inhalt der HTTP-Anfrage aufgefüllt. Der Content-Type-Header wird bei allen auf text/xml gesetzt. Wie im Kapitel 4.3 erklärt wird, können die Items im Webstore über URI eindeutig identifiziert werden. Der Host-URI oder der kompletten URI des Items muss beim Aufbau der Verbindung angegeben werden. Falls nur der Host-URI angegeben wird, kann der relative Pfad vom Host-URI zum Item als Header übergeben werden. Die Klasse ExchangeDAL implementiert vier WebDAV-Methoden, auf die im Folgenden eingegangen wird. Alle dieser Methoden fordern eine HTTP-Verbindung an, mit dem sie dann weiter arbeiten. propFind Mit der propFind-WebDAV-Methode werden Eigenschaften von Items abgefragt. Bei der Anbindung an Verzeichnisse können die Items des Verzeichnisses und ihren Eigenschaften aufgelistet. Mit dem DEPTH-Header sind bei Verzeichnissen auch rekursive Anfragen möglich. Bei Items wird mit diesem Header festgelegt, ob einige bestimmte Eigenschaften angezeigt werden sollen. Als Erweiterung dieser Methode kann der Inhalt-Teil der HTTP- 85 Anfrage mit einem Xml-Dokument aufgefüllt werden, mit dem Eigenschaften gefiltert werden können und somit der Netzwerk-Trafik entlastet wird. ... request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = "PROPFIND"; request.Headers.Add("DEPTH:"+depth); … reqStream.Write(bytes, 0, bytes.Length); Die Methode erhält als Ergebnis ein Xml-Dokument, das sie als Ergebnis an der ObjectDAL weiterleitet. mkcol Mit der mkcol-WebDAV-Methode können Verzeichnisse (Collections) erstellt werden. Diese Methode setzt die HTTP-Methode auf MKCOL, den als Parameter übergebenen URI, und schickt die Anfrage ab. Als Ergebnis erhält die Methode einen Statuscode im Textformat. Für die Methoden müssen noch die Exceptions für die entsprechenden Antwortstatus-Codes entwickelt werden. Der ObjectDAL behandelt nur den „201-Created“-Code. delete Genau so wie bei mkcol und propFind, wird nur der URI angegeben, der das zu löschendem Item im Webstore definiert. Bei gesperrten Items oder fehlenden Rechten werden entsprechende Statuscodes zurückgegeben. search Die Methode wird dafür Benutzt, um mittels Exchange SQL nach Items im Webstore zu suchen. Die Methode setzt den DEPTH-Header auf den als Parameter übergebenen Wert. Das Xml-Dokument, das die Sql-Anfrage enthält, wurde in einem String-Parameter übergeben und muss vor dem Abschicken der Anfrage in einem Bytearray umgewandelt werden. Mit dem Bytearray in HTTP-Content wird die Anfrage abgeschickt, dazu wird noch der ContentLength Header mit der Anzahl der übergebenen im Content Bytes aufgefüllt. reqStream.Write(bytes, 0, bytes.Length); Die Antwort ist ein Xml-Dokument, der als Ergebnis weitergeleitet wird. ObjectDAL In Exchange Server werden die Informationsobjekte über den URI adressiert. Die Dienste setzten die „href“-Eigenschaft des Item-Typs auf den URI, der jedes Item im Webstore 86 eindeutig identifiziert. Das ist deshalb möglich, weil alle Informationsobjekte im Webstore vom Item abgeleitet sind. Sie übergeben die so initialisierten Objekte an der ExchangeObjectDAL, die die DALGenericExchangeUtil-Klasse benutzt, um den URI, gesetzte Eigenschaften und andere systemspezifischen Eigenschaften aus dem Objekt herauszufiltern. Diese Klasse übernimmt abhängig von dem Typ der Eigenschaften ihre Formatierung, damit die resultierende Nachricht konform zum von der Anwendung geforderten Syntax ist. Die ObjektDAL-Komponente braucht bei den get- und delete-Methoden nur den URI, um die Anfragen über die Datenzugriffsschnittstelle abzuschicken. Dafür extrahieren sie nur den Wert der „href“-Eigenschaft vom von den Diensten übergebenen Informationsobjekt. Die Antwort ist in Form eines Xml-Dokuments, das von dem ObjectDAL geparst wird, um es in solcher Form zu bringen, damit es über die .NET-Serialisierungs-Komponente in das gleiche, von dem Dienst erhaltene Informationsobjekt deserialisiert werden kann. Das so gewonnene Informationsobjekt wird an den Dienst zurückgegeben. Bei einem insert wird der Typ des Objekts untersucht. Wenn es ein Verzeichnisobjekt darstellt, wird mit der „href“-Eigenschaft als URI die mkcol-Methode der Datenzugriffsschnittstelle aufgerufen. Andernfalls wird vorausgesetzt, dass das Objekt eine Nachricht darstellt, und eine Email-Nachricht mit Hilfe der .NET-System.Web.MailKomponente erzeugt. Dabei werden die System.Web.Mail.MailMessage-Eigenschaften Exchange-Message-Eigenschaften zugeordnet. Bei der search-Methode werden die gesetzten und nicht gesetzten Eigenschaften bei der Generierung der Sql-Anfrage gebraucht. Die Util-Klasse füllt bei der Reflektion drei Haschtabellen aus. Die ersten zwei enthalten entsprechend für die gesetzten und nicht gesetzten Eigenschaften eine Zuordnung von einer Instanz der Reflektions-Klasse PropertyInfo zu dem qualifizierten Namen der Eigenschaft. Die qualifizierten Namen extrahiert die Util-Klasse aus den benutzerdefinierten Attributen der Klassen, die bei der Code-Generierung erzeugt wurden. Die dritte Haschtabelle enthält eine Zuordnung von den qualifizierten Namen der gesetzten Eigenschaften zu den Werten der Eigenschaften. Die Werte der Eigenschaften müssen abhängig von ihren Typen formatiert werden, damit die Suchanfrage konform zu der vom Exchange geforderten Syntax ist. Die Werte der Eigenschaften vom Typ String werden beispielsweise in die Haschtabelle in Anführungszeichen hinzugefügt. Die ObjectDAL-Komponente muss nun das Xml-Dokument (s. Kapitel 4.3) generieren, das zusammen mit dem URI an die Datenzugriffsschnittstelle als Parameter übergeben wird. Es 87 wird ein DOM-Objektmodell gebildet, indem zuerst die Grundlegendestruktur angelegt wird. Das sind die Xml-Deklaration, das searchrequest-Element und das sql-Element. Im sqlElement muss die eigentliche Sql-Anfrage angegeben werden. Es werden alle Eigenschaften des Informationsobjekts durchlaufen. Für jede Eigenschaft, die als PropertyInfo in der Haschtabelle für nicht-gesetzte Eigenschaften gefunden wird, wird der qualifizierte Name (der eindeutigen Namen des Typs im Webstore-Schema) der Eigenschaft im Select-Teil der Sql-Anfrage hinzugefügt. Diese werden mit Komma getrennt. In den „From“-Teil wird der Wert der „href“-Eigenschaft angegeben. Für die Where-Klausel werden die gesetzten Eigenschaften gebraucht. Die Zeichenketten „qualifizierter Name“, „=“, Wert der Eigenschaft werden zusammengefügt und die einzelnen Bedingungen mit „AND“ getrennt. Da qualifizierte Namen unerlaubte Zeichen enthalten können, werden sie auch in Anführungszeichen gesetzt. Die Werte falls nötig sind bereits von der Util-Klasse formatiert. Anschließend wird diese Nachricht mit Hilfe der Datenzugriffschnittstelle abgeschickt. Die Antwort wird als Xml-Dokument zurückgegeben. Nun werden alle prop-Elemente im Dokument durchlaufen. Diese Elemente stellen die zurückgegebenen Datensätze dar. Da der Typ der zurückgegebenen Informationsobjekte mit dem Typ des untersuchten, von den Diensten übergebenen Informationsobjekts übereinstimmt, kann das Xml-Dokument mit Hilfe der Util-Klasse überarbeitet und deserialisiert werden. Das geschieht folgendermaßen: sb.Append("<cc:"+util.systemEntityName+" xmlns=\"DAV:\" xmlns:cc=\"urn:content-classes:\">"); sb.Append(nodeVal); sb.Append("</cc:"+util.systemEntityName+">"); Die Util-Klasse enthält immer noch den Namen der Entität im Exchange-Server und nodeVal ist der Inhalt eines prop-Elements. Auf diese Weise kann die Serialisierungskomponente entweder ein Objekt oder ein Array aus Objekten eines bestimmten Typs erzeugen. 5.4.2 Active Directory Für LDAP wurde eine Datenzugriffsschnittstelle entwickelt, die mit Hilfe von System.DirectoryServices die grundlegenden Funktionalitäten für die Arbeit mit einem Verzeichnisdienst implementiert. Sie übernimmt den Verbindungsaufbau, die Authentifizierung etc., indem nur die Initialisierung der Klasse und Angabe von wenigen Parametern an den Methoden gefordert werden. Die Initialisierung wird von der ObjektDAL (ADSIDALGeneric und Hilfsklassen) übernommen, indem von der Konfigurationskomponente festgelegten Eigenschaften an die Datenzugriffsschnittstelle 88 weitergeleitet werden. Um einen Eintrag zu erstellen, werden z.B. die Properties, die contentclass (s. Kapitel 4.1) und der Name des Eintrags gebraucht. Der Eintrag wird, wenn nicht anders angegeben, im DefaultNamingContext erzeugt. Die ObjectDAL-Klasse operiert genauso wie die Exchange-ObjectDAL. Die Util-Klasse trennt gesetzte und nicht-gesetzte Eigenschaften in Haschtabellen. Der eindeutige Identifikator in dem gebundenen Container stellt hier das name-Attribut. Das Einfügen eines Eintrags kann nach der Initialisierung der Util-Klasse in den folgenden zwei Zeilen durchgeführt werden: objName = util.objName.StartsWith("cn=")?util.objName:"cn="+util.objName; dal.addObject(objName, util.systemEntityName, util.sysNameToValue, null); Dabei repräsentiert die util.sysNameToValue die gesetzten Eigenschaften. Die Datenzugriffsschnittstelle muss diese durchlaufen und die Properties des neu erstellten Eintrags setzen. foreach (string key in util.sysNameToValue.Keys) newObj.Properties[key].Value = util.sysNameToValue[key]; util.systemEntityName stellt das objectClass-Attribut des zu erzeugenden Eintrags dar, mit dem die content-class und somit die Struktur des Eintrags festgelegt wird. Bei der Angabe der Properties muss außerdem auf die Typen geachtet werden. Properties können auch mehrere Werte besitzen, die entsprechend aufgelistet werden müssen. 5.4.3 Microsoft SQL Server Der Zugriff auf die Microsoft Sql Datenbank verläuft analog zu diesem bei Exchange und Active Directory. Die Ausnahme ist, dass die ObjectDAL-Klassen mit Hilfe von den benutzerdefinierten Attributen für Datenbank-Constraints den Ablaufprozess zusätzlich steuern können. Beispielsweise kann ein einziger Datensatz mit getObject zurückgegeben werden, indem aus den Attributen der Eigenschaften festgelegt wird, welche Eigenschaft als Primärschlüssel dienen kann. Es wird außerdem durch dem Herausfiltern der FremdschlüsselAttribute ermöglicht, komplexen Strukturen von der Datenbank anzufordern. Dafür muss aber die Komponente erweitert werden, um die Tabellennamen bei der Angabe der Eigenschaften in den Sql-Anfragen einzubeziehen. 89 Die Datenzugriffsschnittstelle benutzt die IDataReader-Schnittstelle von ADO.NET, um Anfragen an den Server zu schicken. Sie sorgt für den Auf- und Abbau der Verbindung sowie für die Übergabe der in der Konfiguration definierten Verbindungseigenschaften. Die Sql-ObjectDAL-Klassen sorgen wie bei diesen für Exchange Server für den Aufbau der Sql-Anfragen und für das richtige Format der Werten und Eigenschaftsnamen bei ihrer Angabe in die Sql-Anweisungen. Im Gegensatz zu dem Exchange-Sql ist es hier möglich auch Insert, Delete und Update Anweisungen durchzuführen. Diese werden auf die gleiche Art und Weise wie die Search-Anweisung aufgebaut, indem die Anweisung in Teilen zerlegt wird und jeder Teil mit den entsprechend formatierten Eigenschaftsnamen und Werten aufgefüllt wird. Analog werden die Ergebnisse über Reflektion in Objekten gepackt, indem bei dem Sql-Server für das Casting eine Fallunterscheidung nach dem OLEDB-DBNull Typ erfolgen muss. 5.4.4 Systeminterne Objekt-Datenzugriffsschnittstelle Das Common-Model (s. Kapitel 5.2.4) wird für das Zusammenfassen von Entitäten, die in unterschiedlichsten Systemen definiert sein können, verwendet. Die Common-Modell Entitäten können außerdem von anderen Entitäten abgeleitet werden und auch andere benutzerdefinierten Entitäten erfassen. Die einzige Einschränkung ist, dass die Instanzen dieser Entitäten zyklenfreie Objektgraphen darstellen müssen. Um die nichtfunktionale Anforderung für einen automatisierten Prozessablauf zu erfüllen, muss sowohl eine Fallunterscheidung nach den erfassten Entitäten in Betracht gezogen werden, als auch eine Zuordnung von den Modellen zu den ObjektDALs existieren. Die Klasse CommonGenericDAL enthält eine Eigenschaft, die den Namen der Modell-Namensräume ObjectDALs zuweist. Damit wird folgende Anfrage ermöglich: ((IDAL)_nsToDAL[ns]).updateObject(searchObject, updateObject); Dabei stellt nsToDAL das vorhin genannte Mapping. Diese Eigenschaft wird von dem Dienst über die Konfigurationskomponente gesetzt, der mit der Modell-Komponente verlinkt ist und die Namensräume der Modelle kennt. Der Prozessablauf wird über ein Beispiel für eine Update-Anfrage an das Integrationssystem, mit der in Abbildung 17 definierten Common-Model-Entität erläutert wird. Eine DALCommonModelUtil-Instanz liefert die gesetzten und nicht-gesetzten Eigenschaften des benutzerdefinierten Informationsobjekts IBUser. Angenommen alle Eigenschaften in 90 diesem Objekt sind gesetzt. Das System muss also die Update-Anfrage an allen Enterprise Systemen verteilen. Sie erhält als Parameter zwei IBUser-Objekten: der erste Parameter ist mit den Daten für die Suchanfrage aufgefüllt (seachObject); der zweite enthält die Änderungsdaten (updateObject). Es wird ohne weiteres angenommen, dass beide Objekte über die gleichen gesetzten und nicht-gesetzten Eigenschaften verfügen. Für den Typ des Informationsobjekts in dem searchObjekt wird über Reflektion geprüft, ob er von einem unterschiedlichen von System.Object Typ abgeleitet ist und falls ja, ob ein von seinen Basistypen in der Hierarchie eine Kollektion ist. Im Fall einer Kollektion muss die Update-Anfrage an alle Teilnehmer dieser Kollektion rekursiv geschickt werden. Dieser Fall tritt beim rekursiven Durchlauf des IBUser-Objektgraphs ein, wenn das Objekt MessageCollection erreicht wird. Nun muss jede Nachricht in dieser Kollektion geändert werden, also wird für jeden Teilnehmer der Kollektion in der searchObjekt rekursiv die Update-Methode mit den searchObjekt- und updateObjekt-Teilnehmer der entsprechenden Kollektionen aufgerufen. Wenn keiner der Basistypen eine Kollektion darstellt, wird überprüft ob der Typ und der Basistyp im gleichen Namensraum definiert sind, mit anderen Worten, ob der Basistyp im CommonModel definiert ist. In diesem Fall wird eine Instanz des Basistyps des searchObjects erzeugt und die Werte der Typ-Instanz für die gemeinsamen Eigenschaften werden in der erzeugten Basistyp-Instanz gesetzt: object parent = Activator.CreateInstance(type.BaseType); DALCommonModelUtil.copyObjValAccordingTargetObjProps(searchObject ,parent); Das gleiche wird für den updateObject gemacht und beide Objekte als Parameter des rekursiven Aufrufs übergeben. Der Fall tritt bei CustomFolder ein, wo zwei Objekte vom Typ Folder mit entsprechend Such- und Update-Eigenschaften an der update-Methode der Exchange ObjectDAL übergeben werden. Falls der Typ von keinem verschiedenen als System.Object Basistyp abgeleitet ist, wird die Klasse DALCommonModelUtil instanziert, um die gesetzten und nicht-gesetzten Eigenschaften des searchObjekts zu erhalten. Für jede der gesetzten Eigenschaften wird die update-Methode mit den Werten der Eigenschaft in searchObject und updateObject der jenigen ObjectDAL, die in der Zuordnung dem Namensraum des Eigenschafts-Typs zugewiesen wird. Diese Anfrage kann auch rekursiv erfolgen, wenn der Typ der Eigenschaft im Common-Model definiert ist, also aus dem Common-Model-Namensraum de.tum._in_.ib.common stammt. 91 5.5 Dienstentwurf Die Dienste, die das Integrationssystems zur Verfügung stellen, werden abhängig von den extrahierten Modellen entwickelt. Jeder Entität in diesen Modellen wird ein Dienst zugeordnet. Er muss die Informationsobjekte in den integrierten Unternehmensanwendungen übers Internet (s. Kapitel 2.1) zur Verfügung stellen können, also muss er die Datenzugriffsschnittstellen verwenden, um auf die Systeme zugreifen zu können. Aus diesen Überlegungen erweist sich der Data Access Object (DAO)-Pattern als angebracht, obwohl er in den BluePrints [BPJEE] von J2EE in den unteren Ebenen der System-Architektur eingestufft wird. Das wird ersichtlich nachdem im Folgenden der Pattern beschrieben wird (s. Abbildung 24). Abbildung 24: Data Access Object - Pattern [BPJ2EE] Ein DAO-Objekt interagiert mit dem Client (BusinessObject), indem sie Informationsobjekte (TransferObject) austauschen. Er greift auf die Informationssysteme zu, um die Infromationsobjekte zur Verfügung stellen zu können und kapselt in dieser Hinsicht die Funktionalitäten der Informationssysteme. Die DAOs müssen auf die Informationsobjekte verweisen können, um sie mit den aus den Informationssystemen erhaltenen Daten in diesen Objekten zu kapseln. Die Dienste werden nun als DAOs betrachtet. Sie müssen also mit der Modell-Komponente verlinkt sein und auf die Informationssysteme zufgreifen können. Von DAOs werden standard Methoden erwartet, wie insertTO (insertTransferObject), deleteTO, updateTO etc. die im konkreten Fall als Webmethoden offen gelegt werden müssen. In den BluePrints ist außerdem auf die Möglichkeit hingewiesen, die DAOs mit entsprechenden Tools automatisch zu erzeugen. Sie müssen Referenzen auf die TransferObjekte sowie in den Standardmethoden Anweisungen für die Weitergabe der Aufrufe an den entsprechenden 92 Datenzugriffsschnittstellen beinhalten. Die Deklaration der get-Methode für die Entität User sieht folgendermassen aus: public User getUser(int userId){…} Der User muss eindeutig über seine Id identifizierbar sein. Schlüsselattribute können wie in Kapitel 5.4 beschrieben, in den Attribut-Deklarationen der Entitäten angegeben werden. Für eine relationale Datenbank wurden diese Attribute erstellt und mit diesen die Entitäten der Beispielsdatenbank Nortwind (s. Kapitel 5.3) ergänzt. In Active Directory ist der ldapDisplayName auch ein Schlüsselattribut. Das Attribut in Exchange Server heißt href. Die Erstellung der Anweisungen für die Weitergabe der Aufrufe in den DAOs-Methoden ist insofern trivial, weil alle Datenzugriffskomponenten die vom System definierten Schnittstelle IDAL implementieren müssen. Es bleibt nur die Zuweisung von Datenzugriffskomponenten zu DAOs übrig das von im übernächsten Unterkapitel aufgeführten Service Locator übernommen wird. Um ein DAO als Webdienst offen zu legen, muss seine Klasse von der ASP.NET-Klasse System.Web.Services.WebService abgeleitet sein. Die DAO-Methoden werden mit ASP.NETAttribute versehen, die sie als Webmethoden kennzeichnen. Weil hier ein so genannter Contract-First-Ansatz stattgefunden hat, indem zuerst die Entitäten in XSD beschrieben wurden und ihren Eigenschaften Serialisierungs-Elemente versehen sind, erfolgt die Serialisierung der Modell-Entitäten im Schema-Teil der SOAP-Nachrichten problemlos. Wenn nicht anders in den Webdienst-Attributen angegeben wird, erfolgt die Kommunikation über document/literal Einstellungen, mit denen die ASP.NET-Dienste WS-I-konform sind und somit in heterogener Systemumgebung verwendet werden können. Mit diesem Pattern wird auch ermöglicht die DAOs in einem anderen Framework zu integrieren, indem sie mit anderen Attributen angereichert werden. Deswegen ist auch wichtig die Trennung zwischen DAOs als Dienste und der Object-Datenzugriffsschnittstellen festzulegen. Darüber hinaus enthalten alle DAOs eine Referenz auf die IDAL-Schnittstelle. Es wird außerdem ermöglicht über die Konfiguration ein einziges DAO beispielsweise für eine redundante, in mehreren Datenbanken enthaltene Entität zur Verfügung zu stellen. Es müssen nur die entsprechenden Datenzugriffsschnittstellen zugewiesen werden. DAOs bieten als Pattern die Möglichkeit, mehrere DAOs semantisch in einem so genannten Factory zusammenzuführen. Das Factory-Pattern kann über einen zentralen Dienst abgefragt werden und als Lokator für die anderen Dienste dienen kann. 93 Die benutzerdefinierten Entitäten im Common-Model repräsentieren die so genannten CompositeObjects und stellen damit eine Facade für die einzelnen Dienste zur Verfügung. Die Dienste und Modelle sind außerdem als Komponenten verfügbar und können über die festgelegten Schnittstellen zur Entwicklung von komplexeren Orechestrierungen und Geschäftsprozesse verwendet werden. 5.6 Konfigurationsschema und Dienstbeschreibung Die Konfigurationskomponente dient der Auslagerung von Einstellungsinformationen aus den Komponenten sowie die dynamische Anbindung von Komponenten, um eine möglichst lose Kopplung zu erreichen. Dafür ist in dieser Arbeit ein Modell entworfen, das die Komponenten im Integrationssystem widerspiegelt und diese in Beziehung setzt. Die Komponente wird sowohl während der Extrahierung der Modelle aus den Unternehmensanwendungen benötigt, als auch von den Diensten, um Datenzugriffsschnittstellen und Modell-Namensräume zuzuweisen. In Abbildung 24 wird deutlich wie die Komponente die Struktur des Systems festlegt. Es wird eine Konfigurationsdatei ausgelesen und daraus ein Objektmodell erzeugt. Abbildung 25: Klassendigramm der Konfigurationskomponente Die Dienste benutzen in diesem System die Konfigurationsdatei der Webanwendung Web.config. Als Anwendung, z.B. für die Extrahierung der Metamodelle wird standartmäßig 94 die App.config-Datei von .NET verwendet. Beide stellen Xml-Dokumente dar. Das Laden des Objektmodells wird automatisch ausgeführt, indem sich die Komponente in diesen Dateien registriert. Das geschieht, indem in dem configSections-Element folgendes Unterelement hinzugefügt wird: <section name="ibconfig" type="de.tum._in_.ib.config.ConfigSectionHandler, ConfigUtil, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> Über einen Callback wird beim Ausführen der Anwendung die Create-Methode der ConfigSectionHandler-Klasse aufgerufen. Das wird von der .NET-System.ConfigurationKomponente ermöglicht. Ein Ausschnitt aus der Konfiguration ist in Anhang 8 angegeben. Die Klassen in diesem Objektmodell sind mit Annotationen versehen, damit die automatische Deserialisierung ermöglich wird. Die Create-Methode erhält als Parameter einen Verweis auf das in section definierte Element als XmlNode in DOM-Modell der Konfigurationsdatei. Das ibconfig-Element enthält als typeAttribut der Name der EntSystemLocator Klasse, die über diesen Wert dynamisch instanziirt wird und anschließend mit dem Inhalt des ibconfig-Elements deserialisiert wird. Mit folgender Definition eines Adapters in der Konfigurartion, die entsprechend in einem EntSystemAdapter-Objekt deserialisiert wird ist die dynamische Instanziierung der ObjectDALs ermöglicht. (s. auch Anhang 8). <adapter location="de.tum._in_.ib.dal.ADSIDALGeneric, DALFactory"> <args> <arg name="provider">LDAP</arg> <arg name="dnsHostName">laptop.rumpi.homelinux.net</arg> <arg name="container">CN=Users,DC=rumpi,DC=homelinux,DC=net</arg> </args> </adapter> Die Argumente entsprechen dabei den Parametern einer Konstruktor, definiert in diesem Fall in der de.tum._in_.ib.dal.ADSIDALGeneric-Klasse. In Anhang 8 sind auch die Einstellungen für das Integrationssystems selbst angegeben. Wie aus dem Ausschnitt zu erkenen ist, wird das Integrationssystem als jedes andere integrierte Enterprise System angesehen, mit der Ausnahme, dass für die Datenzugriffsschnittstelle keine Angaben gemacht werden. Diese Datenzugriffsschnittstelle muss über eine Zuordnung von Modell-Namensräumen zu Datenzugriffsschnittstellen verfügen und wird daher vom ServiceLocator besonders behandelt. Der Service-Locator (s. Abbildung 26) stellt eine Singleton-Registry dar, mit dem er so genannte lookups für die Suche nach Diensten über einen bestimmten Identifikator durchführt. Im Gegensatz zu einem Dependency Injection-Ansatz, bei dem die Referenz auf 95 die IDAL-Schnittstelle im DAO von dem Framework gesetzt wird, müssen die DAOs beim Service Locator bei der Initialisierung das selbst machen. EntSystemLocator systems = EntSystemLocator.getInstance(); EntSystem sys = systems.lookup("MsSql"); dal = (IDAL)sys.adapter.getDALInstance(); Der Lokator stellt für alle ihrer Aufrufer nur eine Instanz zur Verfügung. Mit dieser Instanz erhält er bei der Initialisierung die gesuchte EnterpriseSystem-Instanz, die die Unternehmensanwendung repräsentiert. Die EntSystemAdapter-Klasse ermöglicht dann eine Instanz von dem entsprechenden ObjectDAL zu erhalten. Dabei führt das EntSystemAdapterObject die Instanziierung der ObjectDAL-Klasse mit den in der Konfiguration angegebenen Parametern durch: Type type = Type.GetType(this._location, true); return Activator.CreateInstance(type, this.args); Dabei ist die _location-Variable bei der Initialisierung der EnterpriseSystem-Klasse gesetzt worden. Abbildung 26: Sequenzdiagramm für den Service Locator Die Weitergabe des Aufrufs in der DAO-Methode kann dann sehr einfach erfolgen: 96 [WebMethod] public bool insertMessage(Message message) { return dal.insertObject(message); } 5.7 Deployment Im Deployment Diagramm in Abb. 27 werden die Abhängigkeiten und die Anforderungen an die Komponenten deutlich, um eine erfolgreiche Integration und Deployment gewährleisten zu können. Es müssen folgende Informationen und Komponenten gegeben sein, damit das Deployment erfolgreich durchgeführt wird: • falls nicht vorhanden, eine Datenzugriffskomponente entwickeln, die die Schnittstelle IDAL implementiert; • Es muss eine SchemaExtractor-Komponente entwickelt werden, die die Schnittstelle ISchemaExtractor implementiert oder o das Model als eine .xsd-Datei(Xml Schema-Format) angeben oder o das Model als eine .xs-Datei(C#-Code) angeben; • Erweiterung der Konfigurationsdatei mit den Eigenschaften, benötigt für die Initialisierung der Datenzugriffskomponente und der Diensten; • die Metamodell-Komponente de.tum._in_.ib.annotations mit den gemeinsamen für die Modell-Instanzen (Informationsobjekten) Metadaten erweitern. 97 Abbildung 27: Deployment-Diagramm Anschließend muss das System neu gestartet werden, damit die Konfigurationsänderungen aufgenommen werden. Wie in der Abbildung zu sehen ist, ist die einzige Systemanforderung, das Integrationssystem auf dem Betriebssystem Win2000/2003 zu installieren. Das ist empfehlenswert, damit keine zusätzlichen Schnittstellen (ADSI) installiert werden müssen oder IIS 6.0 installiert werden muss und dann .NET neu installiert werden muss. Die engine-Komponente stellt eine ausführbare Komponente dar, die den DeploymentProzess realisiert. Für die erfolgreiche Integration eines Systems müssen die oben aufgelisteten Anforderungen erfüllt sein. Abhängig von der Konfiguration werden die Modelle entweder generiert oder von dem angegebenen Pfad ausgelesen. Dann werden sie von der Code-Generator-Komponente in Code umgewandelt, mit den angegebenen Erweiterungen angepasst, entsprechend auch mit den Annotations-Metadaten angereichert und anschließend kompiliert. Die resultierende Assembly wird über die Konfiguration den Diensten zur Verfügung gestellt. Die Dienste benutzen außerdem die DatenzugriffsebeneKomponenten die als Konnektoren für die zu integrierenden Systemen dienen. Wie im Kapitel 98 5.5 beschrieben stellen die Dienste Datenzugriffsobjekten dar und sie müssen für jede beschriebene Entität in den Modellen erstellt werden. Der Prozess der Entwicklung ist nach den in diesem Kapitel beschriebenen Bedingungen automatisierbar und kann im DeploymentProzessablauf integriert werden. Mit Hilfe von dem entwickelten Active DirectoryObjectDAL und einem IIS-Modell mit Entitäten wie z.B. VirtualFolder kann ein VirtualFolder als Webanwendung in IIS erstellt und anschließend die generierten Assemblies in diesem kopiert werden. Dabei muss die Datenzugriffskomponente mit dem IIS-Provider (s. Kapitel 3.2.4) initialisiert werden. 99 6 Use-Cases und Szenarien 6.1 Testfälle Während der gesamten Entwicklungszeit wurden regression Tests durchgeführt. Diese wurden in dem NUnit-Framework für .NET entwickelt, der ähnliche Struktur von den Testklassen erfordert, wie das JUnit-Framework. Er verfügt außerdem über ein graphisches Tool zur Verwaltung und Durchführung von Tests. Wegen der Größe und Komplexität der Arbeit wurden weniger funktionale Tests, sondern viel mehr komponente Tests entwickelt. Die Tests wurden nach den Diensten der Komponenten strukturiert und mit Hilfe des Testreibers verwaltet. Alle sind mit den lokal installierten Exchange, AD und Microsoft SQL Server durchgeführt. Dabei sind zuvor selbst preparierten Daten oder solche die mit der Installation der Systemen zur Verfügung standen, z.B. die Northwind-Beispielsdatenbank, verwendet. Das System wurde für Exchange Server im Lehrstuhl SEBIS in realen Bedingungen getestet, wobei anzumerken ist, dass alle geforderten Certifikate ohne Überprüfung anngenommen worden sind. Die Beispiele in dieser Arbeit stammen aus den entwickelten Szenarien und Testfällen. Alle Tests wurden sind beibehalten worden und über den Verlauf der Arbeit regelmäßig ausgeführt. 6.2 Java-Client Der Java-Client dient für die Valiedierung der Konzepte in Bezug auf die Webdienste. Das Axis WSDL-to-Java-Tool (org.apache.axis.wsdl.WSDL2Java) wurde eingesetzt, um die JavaBeans-Klassen und entsprechende Proxies zu erzeugen. Es wurden eine Web- und eine Konsole-Testanwendung entwickelt, mit denen einfache Testfälle wie die Erzeugung eines Benutzers in Active Directory oder die Abfrage nach den Daten eines Employees in Microsoft Sql durchgeführt worden sind. 100 7 Im Zusammenfassung Rahmen dieser Arbeit wurde ein Konzept für die Integration von Unternehmensanwendungen entwickelt, mit dem ein Komponentenmodell von MetadatenModell-, Konnektoren-, Code-Generierung- und Dienst-Komponenten aufgestellt wird. Das Konzept dient als Basis für den Entwurf und Implementierung des konkreten Falls der Integration von Microsoft Exchange Server, Active Directory und Microsoft Sql Server. Zunächst wurden die theoretischen Grundlagen in Zusammenhang mit dem fachlichen Konzept analysiert und somit weitere spezifische Anforderungen an das System gestellt. Danach wurden die Unternehmensanwendungen in Bezug auf den Einsatz von .NET als Entwicklungsplattform auf Metadaten-Beschreibung und Programmierschnittstellen untersucht. Dabei wurden die internettauglichen Zugriffsschnittstellen ausgesucht, damit keine Annahmen über die Verteilung der Anwendungen festgelegt werden. Für jede der ausgesuchten Anwendungen wurden konforme zum Modell Komponenten entwickelt. Für alle Anwendungen wurden entsprechende Komponenten für die Extrahierung der Metadaten in XSD-Dokumenten realisiert. Die implementierte Code-GenerierungsKomponente wird für alle Metadaten-Beschreibungen eingesetzt und der generierte Quellcode-Objektgraph mit Anpassungserweiterungen anwendungsspezifisch adaptiert. Einige Erweiterungen stellen anwendungsunabhängige Anpassungen dar und werden bei der Codegenerierung aus den Metadaten aller Anwendungen eingesetzt. Die so erstellten C#Klassen werden mit der Code-Generierungs-Komponente kompiliert und als Komponente dem Integrationssystem zur Verfügung gestellt. Die Anpassungserweiterungen sind in diesem Konzept austauschbar und die Komponente über vordefinierten Schnittstellen erweiterbar. Des Weiteren wurden die Programmierschnittstellen und Kommunikationsprotokolle behandelt. Dabei wurde das Konzept für Integrationsbroker umgesetzt, bei dem sie Nachrichten aus Anwendungen entgegennehmen, diese prüfen und analysieren, wandeln die auszutauschenden Dateiformate um und übertragen die resultierenden Nachrichten an die Zielanwendungen. Für jedes System wurde eine Datenzugriffsebene erstellt, die Zugriffpunkte für die darauf aufbauenden Komponenten bietet und dabei eine einheitliche und benutzerfreundliche Abstraktion der von ihnen adaptierten Programmierschnittstellen bildet. Für Exchange Server wurde zusätzlich die Protokollimplementierung entwickelt. 101 Die auf diese Datenzugriffsebene aufbauenden Komponenten implementieren obligatorisch die vom Integrationssystem vorgegebene Schnittstelle. Diese Komponenten wurden abhängig von der von den Anwendungen definierten Syntax der Nachrichten entwickelt. Sie führen die Serialisierung (Deserialisierung) von .NET-Typen (Nachrichten) in Nachrichten (.NETTypen) durch, die das für die Zielanwendung spezifische Format haben müssen. Die .NETTypen repräsentieren dabei die Informationsobjekte in den integrierten Anwendungen. Für diese Komponenten sind sie aber nur .NET-Objekte, die sie reflektieren müssen, weil sie nicht mit der Modell-Komponente verlinkt sind. Die Modell-Objekte sind mit benötigten systemspezifischen Metadaten in Form von Annotationen angereichert. Teil davon bilden die Metadaten in der Annotations-Komponente, welche als Metamodelle der extrahierten Modelle aufgefasst werden. Die anderen werden über Reflektion ausgelesen und dienen der ObjektDatenzugriffskomponente für die Steuerung des Datenzugriffsprozesses. Beispielsweise erhalten die ObjektDALs Objekte von den Diensten entgegen und reflektieren sie. Abhängig von den gesetzten und nicht-gesetzten Eigenschaften eines Objekts und die aufgerufene Methode generiert die ObjektDAL eine Nachricht, die an die darunter liegende Datenzugriffschnittstelle übergeben wird. Eine weitere, für das System interne Komponente behandelt die anwendungsübergreifenden Informationsobjekte, um über Reflektion und abhängig von der Konfiguration automatisch die Anfragen an den für sie entwickelten ObjektDatenzugriffskomponenten weiterzuleiten und dann die Antworten zurück in den ursprünglichen .NET-Objektmodel zu packen und an die Dienstkomponente zurückzugeben. Als nächstes wurde ein Modell für die Klassen der Dienst-Komponente erstellt. Die Dienste verwenden Objekt-Datenzugriffsschnittstellen und die Modell-Komponente, um Informationsobjekte einheitlich und an einer zentralen Stelle als Webdienste offen zu legen. Sie stellen dabei die in der Schnittstelle der Objekt-Datenzugriffskomponente definierten Funktionalitäten dar und wurden für ausgewählte Entitäten realisiert. Die automatisierte Erzeugung der Dienste ist bis auf zusätzliche Anreicherung mit Metadaten der AnnotationsMetamodell-Komponente, mit Ausnahme für die Dienste für Microsoft Sql Server, nicht gegeben (s. Kapitel 5.5). Abschließend ist die Konfigurationskomponente entwickelt, von deren Zustand das Verhalten aller anderen Komponenten betroffen wird. Sie bestimmen, welche Dienste mit welcher Modell-Komponente und Objekt-Datenzugriffsschnittstelle interagieren müssen, welche Objekt-Datenzugriffsschnittstelle welche Datenzugriffsebenen und mit welchen Einstellungen verwenden sollen. 102 Für alle Komponenten während der gesamten Entwicklungszeit wurden Regression Tests durchgeführt, die ihrerseits auch eine eigene Komponente bilden und nach dem Konzept von Test-Units strukturiert sind. Zusätzlich wurde eine Java-Anwendung implementiert, die über AXIS als Client in vordefinierten Use Cases teilgenommen hat. Aus den von den Webdiensten offen gelegten Modellen wurden die Java-Beans-Klassen und die entsprechenden Proxy-Klassen über das AXIS-Wsdl2Java-Tool erzeugt. 103 8 Ausblick Das entwickelte System realisiert weitgehend das in dieser Arbeit aufgestellten Konzept. Ein Integrationsbroker im Sinne von BizTalk Server verfügt aber über eine sehr große Menge von Funktionalitäten, die als Vorgabe für die Erweiterung des entwickelten Systems dienen können. Im Folgenden werden aber nur Konzepte und Vorstellungen erläutert, die beim Entwurf des Systems als machbar kwalifiziert worden sind. Dem System fehlt an Sicherheits- und Benutzerverwaltung, das aber als nichfunktionale Anforderung verfasst wurde. Das Thema wurde nur wenig behandelt, weil dafür der Einsatz von WS-Extensions nötig ist, die separat von ASP.NET installiert werden müssen und nach Angaben von Microsoft in dem neuen Framework für verteilte Anwendungen - Indigo nicht integrierbar sind. Es findet auch keine Impersonisierung statt, damit die Benutzer die Dienste mit ihren rechten ausführen können. Die Impersonisierung ist wegen des Kontextwechsels zeitaufwendig und wird mit der Verwendung von Internetbasierten-Protkolle für den Zugriff auf die Unternehmensanwendungen überflüssig. Für die zukünftige Weiterentwicklung des Systems wird die Erweiterung der AnnotationsKomponente mit großem Vorrang eingestufft. Das Metamodell, das diese Komponente repräsentiert, wird für die automatische Erzeugung der Dienste verwendet (s. Kapitel 5.5). Der Vorgehensweise wird dabei mit dem bereits entwickelten Metamodell für realtionale Datenbanken festgelegt. Die Metamodelle können außerdem zur Erweiterung der von den Diensten unterstützten Schnittstellen dienen. Beispiel dafür ist z.B. Microsoft Sql Server nach einer komplexen, zusammenhängenden Struktur anzufragen. Die Methode GetDependants würde die vom System vorgegebenen Schnittstelle erweitern oder in einer spezifischen für den Sql-Server deklariert sein, was zum nächsten Punkt führt. Es ist nur eine Datenzugriffsschnittstelle den Diensten überlassen – IDAL, wobei weiteren Schnittstellen diese erweitern können. Die Dienste werden dann abhängig von zugewiesen Datenzugriffskompomonente auf die entsprechenden Schnittstellen verweisen und deren Methoden implementieren. 104 9 Literatur- und Quellenverzeichniss Gedruckte Literatur [SAMS04] Aier, Stephan; Shönherr, Marten: Enterprise Application Integration- Flexibilisierung komplexer Unternehmensarchitekturen. Berlin: Gito Verlag, 2003. [Ramm02] Rammer, Ingo: Advanced .NET Remoting. Berkely, CA.: Apress, 2002. [FreJon] Freeman, Adam; Jones, Allen: Microsoft-.NET-XML-Webdienste Schritt für Schritt. Unterschleißheim: Microsoft Press, 2003. [WeiGan] Weisbrod, Markus; Ganser, Reiner: Microsoft Office SharePoint Portal Server 2003 - Das Handbuch. Unterschleißheim: Microsoft Press, 2004. [Nath02] Nathan, Adam: .NET and COM. The complete interoperability guide. Indianapolis, Ind: SAMS, 2002. [SCHW01] Schwichtenberg, Holger: COM-Komponenten-Handbuch. München: AddisonWesley Verlag, 2001. [SCHW03] Schwichtenberg, Holger: Das Active Directory im Windows Server. Kissing: INTEREST Verlag, 2003. [MASFRE] Maslo, Andreas; Freiberger, Jörg M.: .NET-Framework Developer’s Guide. München: Markt+Technik Verlag, 2002. [KEMP04] Kemper, Alfons, Eickler, Andre: Datenbanksysteme. München: Oldenbourg, 2004. [Lint00] Linthicum, D.S.: Enterprise Application Integration. Boston: Addison-Wesley Professional, 2000. [Kell02] Keller, W.: Enterprise Application Integration, Heidelberg: Dpunkt Verlag, 2002. [BEIG97] Beigl, Michael; Segor, Christian: Unter einem Hut. In: iX 8/1997. S. 122. [HANI02] Hanisch, Armin: Xml mit .Net. Addison-Wesley Verlag, 2002. 105 [STK02] Snell, James; Tidwell Doug, Kulchenko, Pavel: Webservice-Programmierung mit SOAP. O’Reilly Verlag, Juli, 2002. [THUR05] Knecht-Thurmann, Stephanie: Small Business Server 2003. München: AddisonWesley Verlag, 2005. [KOSE01] Kouti, Sakari; Seitsonen, Mika: Inside Active Directory: A System Administrator's Guide. Addison Wesley Professional, Dezember 2001. [CAMA04] Carius, Frank; Mantke Ingrid: MS Exchange Server 2003. München Wien: Carl Hanser Verlag. 2004. [SSRB00] Schmidt, D.; Stal, M.; Rohnert, Hans; Buschmann, Frank: Pattern-oriented Software Architecure. New York: John Wiley & Sons, Inc. 04, 2000. [RUMBE] Rumpe, Bernhard: Softaretechnik. Vorlesung. Internetquellen / MSDN-, Anwendungsdokumentation [MSDN01] Microsoft Corporation: MSDN Library, System.DirectoryServices-Namespace, .Net-Klassenbibliothek, 2003: ms-help:// MS.MSDNQTR.2003FEB.1031/cpref/html/frlrfSystemDirectoryServices.htm. [ESPO01] Esposito, Dino: Überlegungen zu OLE DB und .NET, MSDN Portal, 2004: http://www.microsoft.com/germany/msdn/library/data/UeberlegungenZuOLED BUndNET.mspx. [MSDN02] Microsoft Corporation: MSDN Library, Programming ODBC SQL Server Applications, 2002: http://msdn.microsoft.com/library/default.asp?url=/library /en-us/odbcsql/od_6_0oview_8sc3.asp. [MSDN03] Microsoft Corporation: MSDN Library, Microsoft SQL Server 7.0 Data Warehousing Framework, 2003, Microsoft Artikel-Nr.: 098-80704: ms-help://MS.MSDNQTR.2003FEB.1031/dntaloc/html/ datawarefmwk.htm#datawarefmwk_oledb. [MSDN04] Microsoft Corporation: MSDN Library, Visual C++- Konzepte: Hinzufügen von Funktionalität, Grundlagen zu ODBC ms-help://MS.MSDNQTR.2003FEB.1031/vccore/html/_core_odbc.htm 106 [MSDN05] Microsoft Corporation: MSDN Library, Übersicht über die OLE DBProgrammierung, 2003: ms-help://MS.MSDNQTR.2003FEB.1031/vccore/html/ vcconOverviewOLEDBProgramming.htm. [MSDN06] Microsoft Corporation: MSDN Library, Win32 and COM Development, Data Access and Storage, OLE DB Minimum Levels of Consumer and Provider Functionality, 2005: http://msdn.microsoft.com/library/default.asp?url=/library/ en-us/dnoledb/html/oledbleveling2.asp. [MSDN07] Microsoft Corporation: MSDN Library, .NET Framework, Programmieren mit .NET Framework, Zugreifen auf Daten mit ADO.NET, Übersicht über ADO.NET. 2005: http://msdn.microsoft.com/library/deu/default.asp?url=/library /DEU/cpguide/html/cpconadonetarchitecture.asp. [MSDN08] Microsoft Corporation: MSDN Library, .NET Framework, OleDbTypeEnumeration: ms-help://MS.MSDNQTR.2003FEB.1031/cpref/html/ frlrfSystemDataOleDbOleDbTypeClassTopic.htm. [MSDN09] Microsoft Corporation: MSDN Library, Win32 and COM Development, Data Access and Storage, Microsoft OLE DB, OLE DB Programmer’s Reference, Introduction to OLE DB, Chapter 13: Data Types in OLE DB. 1998-2004: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/oledb/htm/ oledbdata_types_in_ole_db.asp [MSDN10] Microsoft Corporation: MSDN Library, OLE DB Programmer's Reference, Appendix B: Schema Rowsets. 1998-2004: http://msdn.microsoft.com/library /default.asp?url=/library/en-us/oledb/htm/oledbschema_rowsets.asp [MSDN11] Microsoft Corporation: MSDN Library, Übersicht über .NET Framework. 20012002: ms-help://MS.MSDNQTR.2003FEB.1031/cpguide/html/ cpovrintroductiontonetframeworksdk.htm [MSDN12] Platform SDK: Active Directory Service Interfaces, So What Is Active Directory?: http://msdn.microsoft.com/library/default.asp?url=/library/en- us/adsi/adsi/so_what_is_active_directory.asp [MSDN13] Microsoft Corporation: .NET Framework Developer's Guide, XML Schema Object Model (SOM). 2005: http://winfx.msdn.microsoft.com/library/default.asp ?url=/library/en-us/wd_xml/html/a897a599-ffd1-43f9-8807-e58c8a7194cd.asp 107 [MSDN14] Platform SDK: Active Directory Service Interfaces: ADSI Service Providers. 06. 2005: http://msdn.microsoft.com/library/en-us/adsi/adsi/ adsi_system_providers.asp [MSDN15] Platform SDK: Active Directory Schema: Syntaxes. July, 2005: http://msdn.microsoft.com/library/en-us/adschema/adschema/syntaxes.asp [MSDN16] Platform SDK: Active Directory Service Interfaces: LDAP Syntax Object. July, 2005: http://msdn.microsoft.com/library/en-us/adsi/adsi/ldap_syntax_object.asp [MSDN17] Platform SDK: Active Directory Service Interfaces: ADSTYPEENUM. July, 2005: http://msdn.microsoft.com/library/en-us/adsi/adsi/adstypeenum.asp [MSDN18] Platform SDK: Active Directory Service Interfaces: Data Type Mapping between Active Directory and LDAP. July, 2005: http://msdn.microsoft.com/library/en-us/adsi/adsi/ data_type_mapping_between_active_directory_and_ldap.asp [MSDN19] Platform SDK: Active Directory Service Interfaces: ADSI Simple Data Types. July, 2005: http://msdn.microsoft.com/library/en-us/adsi/adsi/ adsi_simple_data_types.asp [MSDN20] .NET Framework-Klassenbibliothek: Type-Klasse. 11, 2002: ms- help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1031/cpref/html/frlrfsystemty peclasstopic.htm [MSSQL1] Microsoft Corporation: Sql Server-Onlinedokumentation, Building SQL Server Applications, OLE DB and Sql Server, Programming OLE DB SQL Server Applications, Data Types(OLE DB). 1998-2000. [309681] Microsoft Corporation: Microsoft Knowledge Base, How To Retrieve Schema Information by Using GetOleDbSchemaTable and Visual C# .NET. Article-ID: Q309681, Juli 2004. [154544] Microsoft Corporation: Microsoft Knowledge Base, Article-ID: Q154544, 2004. [SUNM02] Sun Microsystems: Core J2EE Patterns - Data Access Object, 2001-2002 http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html. 108 [CDOSDK] Platform SDK: CDO for Windows 2000, CDO for Windows 2000 Object Model. 2000-2001: ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1031 /cdosys/html/_cdosys_cdo_for_windows_2000_object_model.htm. [W32001] World Wide Web Consortium: Xml Schema. 02.2001: http://www.w3.org/2001/XMLSchema [W32005] World Wide Web Consortium: Extensible Markup Language (XML). 08.2005: http://www.w3.org/XML/ [W32004] World Wide Web Consortium: XML Information Set (Second Edition). 04.2004: http://www.w3.org/TR/xml-infoset/ [W31999] World Wide Web Consortium: XML Path Language (XPath). November, 1999: http://www.w3.org/TR/xpath [W30304] World Wide Web Consortium: XML Schema API. 03.2004: http://www.w3.org/Submission/2004/SUBM-xmlschema-api-20040309/xmlschema-api.html [W30603] World Wide Web Consortium: SOAP Version 1.2 Part 0: Primer. June, 2003: http://www.w3.org/TR/soap12-part0/ [W30100] World Wide Web Consortium: Datatypes for DTDs (DT4DTD) 1.0. Januar, 2000: http://www.w3.org/TR/dt4dtd [W31199] World Wide Web Consortium: XSL Transformations (XSLT) Version 1.0. November, 1999. http://www.w3.org/TR/xslt [CAZZ04] Cazzulino, Daniel: Code Generation in the .NET Framework Using XML Schema. May 2004: http://msdn.microsoft.com/library/default.asp?url= /library/en-us/dnxmlnet/html/xsdcodegen.asp [SUN05] Sun Microsystems: The J2EE 1.4 Tutorial. Juni ,2005 http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html [LOWE99] Lowe-Norris, Alistair G.: An ADSI Primer, Part 12: Extending the Schema. 12.1999:http://www.windowsitpro.com/Article/ArticleID/7666/7666.html?Ad=1 [ESDK01] Microsoft Exchange Server 2003 SDK: Architecture->Programming Technologies->CDO: ExOLEDB. März, 2004. 109 [ESDK02] Microsoft Exchange Server 2003 SDK: Architecture->Programming SDK: Architecture->Programming Technologies: WebDAV. März, 2004. [ESDK03] Microsoft Exchange Server 2003 Technologies: Schema. März, 2004. [MicSPS1] Microsoft SharePoint Portal Server 2001 SDK: Share Point Portal Server Concepts. 2001: http://msdn.microsoft.com/library/default.asp?url=/library/enus/ spssdk/html/_introduction_to_basic_concepts.asp [MicSPS2] Microsoft SharePoint Portal Server 2001 SDK: Document Management Object Model Overview. 2001: http://msdn.microsoft.com/library/en-us/spssdk/html /dmx_functional.gif [MicSPS] Microsoft SharePoint Portal Server SDK:Searching with XMLHTTP and WebDAV. 2001: http://msdn.microsoft.com/library/default.asp?url=/library/enus/spssdk/html/_searching_with_xmlhttp_and_webdav.asp [MicExc2] Microsoft Exchange 2000 SDK: Creating Folders (WebDAV). 12, 2004: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wss/wss /_exch2k_creating_folders_http.asp [BRM03] Braun, Peter; Marschall, Frank: Transforming Object Oriented Models with BOTL. 2003: http://www4.in.tum.de/~marschal/pub/entcs-bm02.pdf [WEGN02] Wegner, Holm: Analyse und objektorientierter Entwurf eines integrierten Portalsystems für das Wissensmanagement. Technische Universität HamburgHarburg, Dissertation, 2002. [MCED03] Microsoft Corporation: Application Enterprise Development (General) Technical Articles: Integration. August, 1999: ms-help://MS.VSCC.2003/ MS.MSDNQTR.2003FEB.1031/dnentdevgen/html/appint.htm [AlMa02] Altomare, C.; Malanowski, M.: Content Management Lösungen für KMU. Fachhoch-schule beider Basel (FHBB), Departement Wirtschaft, Seminararbeit, 05.2002. [SET04] Software Engineering Today Conferences: Aktuell zur Software Engineering Today 2004, Software Architecture Today Poster. 2004: http://www.zuehlke.com/set-conference/ 110 [BPJ2EE] Core J2EE Patterns: Blue Prints: Data Access Object: http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html [BizT04] Microsoft Corporation: White paper “Understanding BizTalk Server 2004”. 2004: http://go.microsoft.com/fwlink/?LinkId=21313 [IFAP] © Microsoft Corporation: Microsoft Office Information Bridge Framework 1.0 Planning and Architecture Guide: http://www.microsoft.com/technet/ itsolutions/cits/iwp/ibf/pa/p_a_chap1.mspx Requests for Comment (RFCs) [RFC2251] Howes, T; Kille, S: Lightweight Directory Access Protocol: Dezember, 1997. [RFC2256] Wahl, M.: A summary of the X.500(96) User Schema for use with LDAPv3: Dezember, 1997. [RFC2518] IETF WEBDAV Working Group: HTTP Extensions for Distributed Authoring – WEBDAV. February 1999. 111 Anhang 1. Common Model <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cm="http://da.matthes.in.tum.de/commonModel" xmlns:cc="urn:content-classes:" xmlns:lt="http://da.matthes.in.tum.de/ldapSchema" xmlns:sql="http://da.matthes.in.tum.de/sqlDBSchema" targetNamespace="http://da.matthes.in.tum.de/commonModel" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:import namespace="ttp://da.matthes.in.tum.de/sqlDBSchema" schemaLocation="./mssqlSchema.xsd"/> <xs:import namespace="ttp://da.matthes.in.tum.de/ldapSchema" schemaLocation="./ adSchema.xsd"/> <xs:import namespace="urn:content-classes:" schemaLocation="./xmlns_cc.xsd"/> <xs:complexType name="messages"> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element ref="cc:message"/> </xs:sequence> </xs:complexType> <xs:element name="messages" type="cm:messages"/> <xs:element name="IBUser"> <xs:complexType> <xs:sequence> <xs:element ref="lt:user"/> <xs:element ref="sql:Employees"/> <xs:element ref="cm:messages"/> <xs:element ref="cm:CustomFolder"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="CustomFolder"> <xs:complexType> <xs:complexContent> <xs:extension base="cc:mailfolder"> <xs:sequence> <xs:element ref="cc:message" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="cc:document" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> </xs:schema> 112 2. Vordefinierte Ordner im Postfach eines Exchange Empfängers Verzeichnis URL Calendar http://server.example.com/exchange/UserAlias/Calendar Contacts http://server.example.com/exchange/UserAlias/Contacts Drafts http://server.example.com/exchange/UserAlias/Drafts Inbox http://server.example.com/exchange/UserAlias/Inbox Journal http://server.example.com/exchange/UserAlias/Journal Notes http://server.example.com/exchange/UserAlias/Notes SentItems http://server.example.com/exchange/UserAlias/Sent%20Items Outbox http://server.example.com/exchange/UserAlias/Outbox Tasks http://server.example.com/exchange/UserAlias/Tasks 3. Metamodell-Transformationen IBUser Exch.Employee fname:string fname:string sname:string sname:string height:int height:int AD.User name:string height:float Information Bridge: Common-Model Metamodelle der Unternehmensanwendungen Exch.Employee fname:f sname:s IBUser height=h fname=f sname:s height:h AD.User name:s°“,“°f height:h*3,3 Transformationsregel 113 Exch.Employee fname:John IBUser sname:Doe fname=John height:174cm sname=Doe height=174cm AD.User name=Doe,John height=5,7ft Transformation 4. BizTalk Mapper 5. BizTalk Adapter SOAP-Adapter: Ermöglicht das Senden und Empfangen von Nachrichten mithilfe von SOAP über HTTP. Da SOAP das wichtigste Protokoll für Webdienste ist, verleiht dieser Adapter BizTalk Server 2004 die Fähigkeit, mit Webdiensten zu interagieren. Zur Identifizierung der Sende- und Empfangssysteme werden URLs verwendet. Adapter für BizTalk-Message Queuing: Ermöglicht das Senden und Empfangen von Nachrichten mithilfe von BizTalk-Message Queuing (MSMQT). BizTalk-Message Queuing ist eine Implementierung des Microsoft Message Queuing-Protokolls (MSMQ). Damit ist es möglich, MSMQ-Nachrichten aus der MessageBox-Datenbank zu empfangen bzw. an diese zu senden. Es stellt zwar keinen Ersatz für MSMQ dar, bildet jedoch eine effiziente Möglichkeit zur Verwendung des Transports für MSMQ mit BizTalk Server. 114 Dateiadapter: Ermöglicht das Lesen von und das Schreiben in Dateien im Microsoft Windows®-Dateisystem. Da die Anwendungen in einem Geschäftsprozess oft lokal oder über ein Netzwerk auf das gleiche Dateisystem zugreifen, kann der Austausch von Nachrichten über Dateien eine zweckmäßige Option sein. HTTP-Adapter. Ermöglicht das Senden und Empfangen von Daten mithilfe von HTTP. Das BizTalk Server 2004-Modul macht einen oder mehrere URLs zugänglich, damit andere Anwendungen Daten dorthin senden können, und kann diesen Adapter zum Senden von Daten an andere URLs verwenden. SMTP-Adapter. Ermöglicht das Senden von Nachrichten mithilfe von Simple Mail Transfer Protocol (SMTP). Zur Identifizierung der Teilnehmer werden Standard-EMail-Adressen verwendet. SQL-Adapter. Ermöglicht das Lesen und Schreiben von Daten aus einer bzw. in eine Datenbank von Microsoft SQL Server™. Basis-EDI-Adapter. Ermöglicht das Senden und Empfangen von Nachrichten mithilfe der Standards des American National Standards Institute (ANSI) X-12 und Electronic Data Interchange for Administration, Commerce, and Trade (EDIFACT). FTP-Adapter. Ermöglicht den Dateiaustausch zwischen BizTalk- und FTP-Servern. 6. Model-Namensräume 115 7. System-Namensräume 8. Konfigurations-Ausschnitt <configuration> <ibconfig type="de.tum._in_.ib.config.EntSystemLocator, ConfigUtil" metamodelAssembly="ib.metamodel.dll"> <ibsystems> <entSystem name="Exchange" location="RUMPI"> <!--schemaLocation="../../../schemes/exchange/xmlns_*.xsd"--> <schema targetPath="../../../../schemes/exchange/" schemaExtractor="de.tum._in_.ib.schemaExtractor.SchemaExtractorExchan ge, schemaExtractor"> <args> <arg name="locationOfExchangeSchemaFolder"> ../../../../../schemes/exchange/schema/</arg> <arg>../../../../schemes/exchange/xdrExchangeAllInOne.xdr</arg> <arg name="simpleTypesSchemaLocation"> ../../../../schemes/exchange/xdr2xsd.xml</arg> </args> </schema> <codeGenerator classNamespace="de.tum._in_.ib.metamodels.exchange" codeGeneratorDefExt="../../../../schemes/codeGeneratorExtensions.xsd" targetPath="../../../../schemes/exchange/"/> 116 <adapter location="de.tum._in_.ib.dal.ExchangeDALGeneric, DALFactory"> <args> <arg name="dnsHostName">http://laptop/</arg> </args> </adapter> </entSystem> ……… ……… <entSystem name="IB"> <schema schemaLocation="../../../../schemes/commonModel.xsd"/> <codeGenerator classNamespace="de.tum._in_.ib.metamodels.common" codeGeneratorDefExt="../../../../schemes/codeGeneratorExtensions.xsd " targetPath="../../../../schemes/"/> </entSystem> </ibsystems> </ibconfig> </configuration> 117