% ------------------------------------------------------------------ % % % % Datei: anbindg.tex % % Autor: Oliver Nietsch % % % % Universitaet Hamburg % % Fachbereich Informatik % % Arbeitsbereich DBIS % % % % Thema: Studienarbeit: "Gateway zwischen dem StP-Repository % % und Tycoon" % % % % Inhalt: LaTeX-Dokument: Studienarbeit, % % Kapitel 5: Anbindung des Tycoon-Systems % % an die StP Umgebung, Teil 1 % % % % Version vom 11. 1.1996 % % ------------------------------------------------------------------ % \chapter{Anbindung des Tycoon-Systems an die StP Umgebung} \label{Chap:Anbindung} \section{Das Tycoon-System als integrierte Entwicklungsumgebung} \label{Sec:Umgebg} Wird eine {\sf StP} CASE-Umgebung der Firma {\sf Interactive Development Environments} gestartet, erscheint der {\sf StP} Desktop, welcher das Aufrufen von Editoren, des {\sf Repository Browsers}, des {\sf Script Managers}, des {\sf Print Servers} und sonstiger Administrationswerkzeuge erm"oglicht. Der {\sf StP} Desktop ist an die ben"otigte Funktionalit"at der installierten {\sf StP} Produkte anpa"sbar. Sogar {\sf StP} fremde Befehle, Startskripte oder Programme k"onnen in den {\sf StP} Desktop integriert und von dort aus aufgerufen werden -- so auch das Tycoon-System. \subsection{Benutzeranpassung des StP Desktop} \label{SubSec:Anpassung} Das Aussehen und Verhalten des {\sf StP} Desktops kann auf verschiedene Weise modifiziert werden \cite{StPcust94}. Zur Vollst"andigkeit werden hier einige dieser M"oglichkeiten erw"ahnt, ohne da"s auf alle von ihnen detailliert eingegangen wird: \begin{itemize} \item Ver"anderung der Men"uregeln \item Benutzung von {\sf ToolInfo}-Variablen \item Setzen von {\sf X}-Ressourcen \item Modifikation der Klassenregeln \end{itemize} Meine Vorgehensweise zur Desktopindividualisierung bezieht sich auf die den {\sf StP} Desktop beschreibenden Klassenregeln und einige ihrer Attribute. Diese Regeln der h"ochsten Ebene definieren alle vorhandenen Desktopklassen und ihr Verhalten. Jede Klasse mu"s durch eine Klassenregel spezifiziert werden.\\ \begin{figure}[hbt] \begin{center} \ \epsfig{figure=omt.eps,width=7cm} \end{center} \caption{\label{Fig:OMT} {\sf Software through Pictures} Desktop} \end{figure} In der Abbildung~\ref{Fig:OMT} sind beispielsweise 26 Klassen im {\sf StP} Desktop enthalten. Jede aufrufbare Klasse wird dabei durch ein eigenes Piktogramm dargestellt. Die Spezifizierung der grundlegenden Klassen erfolgt durch Wertzuweisung ihrer Attribute in der Datei {\tt ../StP/templates/IDE/ct/rules/stp.rules}. Die entsprechenden Piktogrammdateien dieser Klassen befinden sich im Verzeichnis {\tt ../StP/templates/IDE/ct/icon}. Modifikationen des {\sf StP} Desktop k"onnen vom Anwender in der daf"ur vorgesehenen Spezifikationsdatei neuer Klassen vorgenommen werden: \begin{quote} {\tt ../StP/templates/IDE/user/ct/rules/user\_stp.rules} \end{quote} Die Piktogramme der hinzugef"ugten Klassen k"onnen unter einem beliebigen Pfad hinzugef"ugt werden. Der "Ubersichtlichkeit wegen sollten sie aber im Verzeichnis {\tt ../StP/templates/IDE/user/ct/icon} gespeichert werden. Dort befindet sich auch die, das Piktogramm des Tycoon-Systemaufrufs spezifizierende Datei {\tt user\_tycoon\_32.xbm}. \subsection{Voraussetzungen der Desktop-Individualisierung} \label{SubSec:Voraus} Um den {\sf StP} Desktop um das Piktogramm der Klasse {\sf DBIS-Tycoon} zu erg"anzen und somit den Aufruf des Tycoon-Systems zu realisieren, sind einige Voraussetzungen zu beachten: \begin{enumerate} \item Die Datei des in der Abbildung~\ref{Fig:OMT} dargestellten Tycoon-Piktogramms mu"s in dem im Abschnitt~\ref{SubSec:Anpassung} wiedergegebenen Piktogrammverzeichnis enthalten bzw. "uber eine g"ultige Pfadangabe zugreifbar sein. \item Die Klasse {\sf DBIS-Tycoon} ist, wie im Abschnitt~\ref{SubSec:Umsetz} angegeben, in der Datei {\tt user\_stp.rules} spezifiziert. \item Das Tycoon-System ist "uber das Skript {\tt start $<$workspace\_name$>$} aufrufbar. Hierbei handelt es sich um ein Startskript, welches einen separaten Tycoon-Proze"s in einem eigenen {\tt cmdtool}-Fenster initiiert. {\tt start} basiert auf dem Startskript {\tt tw $<$workspace\_name$>$}. Das komplette Skript {\tt start} wird an dieser Stelle nicht detailliert behandelt, ist aber im Anhang~\ref{Ann:Start} wiedergegeben. \end{enumerate} Grundvoraussetzung f"ur den Aufruf von {\sf StP/OMT} und des Tycoon-Systems sind g"ultige Zugriffsrechte auf die ben"otigten Dateien, g"ultige Pfadangaben und die sonstigen allgemeinen Zugriffsbedingungen (Gruppenzugeh"origkeiten, etc.) in Mehrbenutzersystemen. \subsection{Umsetzung der Desktop-Modifikation} \label{SubSec:Umsetz} Um die Klasse {\sf DBIS-Tycoon} dem {\sf StP} Desktop hinzuzuf"ugen, wurden die folgenden Anweisungen in der im Abschnitt~\ref{SubSec:Anpassung} erw"ahnten Klassen-Spezifikationsdatei eingef"ugt: % \newpage {\tt Class Tycoon\\ \{ \begin{quote} \{ Label "{}DBIS-Tycoon"{} \}\\ \{ Image "{}user/ct/icon/user\_tycoon\_32.xbm"{} \}\\ \{ ShowOnDesktop True \}\\ \{ ClassCommand\\ \\ ... \newpage ... \begin{quote} \{ SpaceAfter True \}\\ \{ Name "{}tycoon"{} \}\\ \{ Label "{}Start Tycoon..."{} \}\\ \{ Command "{}/local/dbis11/software/StP/scripts/start tycoon"{} \}\\ \{ Type Nowin \} \end{quote} \} \end{quote} \}}\\ Der Effekt dieser Anweisungen ist der, da"s der {\sf StP} Desktop um das spezifizierte Tycoon-Piktogramm erg"anzt wird und ein Aufruf von Tycoon so erm"oglicht wird. Eine tiefgreifende Erkl"arung aller dargestellten Klassenattribute ist in \cite{StPcust94} enthalten. \subsection{Aufruf des Tycoon-Systems} \label{SubSec:Aufruf} Das Tycoon-System wird auf der {\sf StP} Desktopebene durch Anklicken des in der Abbildung~\ref{Fig:TYCOON} dargestellten Piktogramms erreicht.\\ \begin{figure}[hbt] \begin{center} \ \epsfig{figure=tycoon.eps,width=3cm} \end{center} \caption{\label{Fig:TYCOON} {\sf DBIS-Tycoon} Piktogramm {\tt user\_tycoon\_32.xbm}} \end{figure} Das so ge"offnete Tycoon-Fenster kann auf der Tycoon-Ebene zum Beispiel mit dem Befehl {\tt do exit} wieder terminiert werden. \section{Architekturmerkmale} \label{Sec:TycArchi} Die Anbindung des Tycoon-Systems an die {\sf StP} Umgebung erscheint dem Benutzer wie in der Abbildung~\ref{Fig:TycAnbindg} dargestellt. \begin{figure}[hbt] \begin{center} \ \epsfig{figure=anbindg.eps,width=12cm} \end{center} \caption{\label{Fig:TycAnbindg} Anbindung des Tycoon-Systems an die {\sf StP} Umgebung} \end{figure} Dabei verh"alt sich das Tycoon-System als integrierte Entwicklungsumgebung hinsichtlich ihres Aufrufs und Repositoryzugriffs wie sonstige, in die {\sf StP} Umgebung integrierte {\sf StP} Werkzeuge. Der Aufruf des Tycoon-Systems erfolgt "uber das im Abschnitt~\ref{SubSec:Aufruf} dargestellte Piktogramm innerhalb des {\sf StP} Desktops, der Zugriff des Tycoon-Systems auf die {\sf StP} Repositoryobjekte wird "uber die vom {\sf StP Application Program Interface} als einem generischen, externen Diensterbringer, zur Verf"ugung gestellten Funktionen realisiert. Somit kann das Tycoon-System f"ur den Zugriff auf Objekte des {\sf StP} Repositorys die Funktionalit"at des {\sf StP Object Management Systems} benutzen. Als Resultat dieser Anbindung des Tycoon-Systems an die {\sf StP} Umgebung entsteht innerhalb des Tycoon-Systems eine generische Bibliothek, die dem Tycoon-Anwender innerhalb des unifizierenden sprachlichen Raums der Tycoon-Umgebung die gesamte, im Abschnitt~\ref{Sec:Umfang} dargestellte, {\sf StP} Funktionalit"at f"ur den Repositoryzugriff bietet. \section{Abzubildende Funktionalit"at der StP Umgebung} \label{Sec:Umfang} Die Tycoon-Bibliothek f"ur den {\sf StP} Repositoryzugriff mu"s mindestens die folgenden an sie gestellten Anforderungen befriedigen, welche sich an der Funktionalit"at des {\sf StP Application Program Interface} orientieren \cite{StPoms94}: \begin{itemize} \item Generieren und Auffinden von Repositoryobjekten \item Auffinden, Manipulieren und Ausgeben von Attributwerten der spezifizierten Repositoryobjekte \item Verwalten des Hauptspeichers \item Repositorymanagement \item Durchf"uhren von Operationen auf zu einer Einheit zusammengefa"sten Objekten innerhalb des {\sf StP} Repositorys im Rahmen von \engl{Collection-} und \engl{Big Collection} Typen \item Interpretieren von {\sf OMS} Anfragen \item Verwalten und Manipulieren von "`Zeit-Variablen"' \item Initiieren, "Uberwachen und Terminieren von {\sf StP} Repositorytransaktionen \item Generieren und Verwalten von ID Listen \item Durchf"uhren der Fehlerbehandlung bei nicht erfolgreich abgeschlossenen Repositoryoperationen \end{itemize} \section{Transfer der StP Repositoryfunktionalit"at auf die Tycoon-Ebene} \label{Sec:Transfer} Die gesamte Funktionalit"at f"ur den Repositoryzugriff wird vom {\sf StP Application Program Interface} zur Verf"ugung gestellt, welches eine C-basierte Bibliothek von Funktionen und Datentypen darstellt. Auf der Tycoon-Ebene sollen beim Zugriff auf Repositoryobjekte im Rahmen der im Abschnitt~\ref{Sec:Modellierg} vorgestellten {\sf StP} Umgebung, der Tycoon-Bibliothek {\sl stpenv}, ausschlie"slich Funktionen und Datentypen auf der Basis von TL, der Programmiersprache des Tycoon-Systems, benutzt werden. Somit wird der Tycoon-Anwender unabh"angig von {\sf StP API} C-Funktionsaufrufen auf das {\sf StP Repository} zugreifen k"onnen. Diese Vorgehensweise macht es erforderlich, da"s innerhalb der Tycoon-Umgebung eine geeignete Abbildung der C-basierten {\sf API} Funktionen auf ad"aquate TL-Funktionsdeklarationen erfolgt. In diesem Abschnitt wird die Abbildung der {\sf StP API} Funktionalit"at auf Tycoon-Funktionalit"at exemplarisch am Beispiel einiger Funktionen des PDM-Typen {\tt node} dargestellt. Diese Vorgehensweise ist auch f"ur alle "ubrigen PDM-Typen und sonstige innerhalb des {\sf Application Program Interface} verwendeten Datentypen und Funktionen g"ultig. Au"ser einer blo"sen Spiegelung der {\sf StP API} Funktionalit"at wird die M"achtigkeit der {\sf StP} Umgebung auf der Tycoon-Seite durch zus"atzliche, den Umfang der eigentlichen {\sf API} Funktionalit"at erweiternde n"utzliche Charakteristika erg"anzt (siehe Abschnitt~\ref{Sec:Modellierg}). \subsection{Tycoon C-Calls f"ur den StP API-Funktionsaufruf} \label{SubSec:CCall} Das Tycoon-System bietet einen generischen Mechanismus um auf, in externen Programmiersprachen implementierte Funktionalit"at zugreifen zu k"onnen \cite{MMM93}. Eine aufzurufende externe C-Funktion kann mit Hilfe der Tycoon-Funktion {\sl bind} an einen Tycoon-Bezeichner gebunden werden: \begin{xple} \k{let} cCall = \k{bind}(:Fun (:Int) :Int "{}bsp\_bibliothek.so"{} "{}bsp\_funktion"{} "{}ii"{}); \end{xple} Hierbei wird die in der dynamischen C-Bibliothek {\tt bsp\_bibliothek.so} vorgesehene C-Funktion {\tt bsp\_funktion} an den Tycoon-Bezeichner {\sl cCall} statisch gebunden. Der Wert dieses Bezeichners ist vom Typ {\sl \k{Fun} (:Int) :Int}. Innerhalb der Tycoon-Umgebung kann die C-Funktion {\tt bsp\_funktion} daraufhin wie folgt indirekt aufgerufen werden: \begin{xple} \k{let} ergebnis :Int = cCall(20); \end{xple} Welche C-Funktion sich hinter der Tycoon-Funktion {\sl cCall} verbirgt ist f"ur den Tycoon-Benutzer nicht mehr ersichtlich. Diese Vorgehensweise wird im Rahmen des Aufrufs der {\sf StP Application Program Interface} Funktionen von der Tycoon-Ebene aus im weiteren Verlauf dieser Arbeit verfolgt. Weitere Informationen "uber die Benutzung externer C-Bibliotheken aus dem Tycoon-System heraus sind in \cite{MMM93} enthalten. \subsection{Abbildung von StP API-Funktionen auf Tycoon-Funktionen} \label{SubSec:APIFunk} Die Abbildung der StP API-Funktionen auf Tycoon-Funktionen erfolgt unter Verwendung der im Abschnitt~\ref{SubSec:CCall} dargestellten Vorgehensweise in vier Schritten: \begin{enumerate} \item Auf der C-Ebene mu"s eine Abbildungsdatei (hier: {\tt stp.c}) erstellt werden, welche die Funktionsdeklarationen der in der {\sl bind}-Funktion auf der Tycoon-Ebene aufgerufenen C-Funktionen enth"alt: \begin{verbatim} #include #include "oms_stdinc.h" #include "stp.h" oms_node_tp *stp_get_oms_node(char *name, oms_app_type_tp type, oms_object_id_tp scope, char sig) { oms_node_tp *node: node = oms_node_find(name, type, scope, sig); return (node); } long stp_get_oms_node_tp_pdm_type(oms_node_tp *node) { return (node -> pdm_type); } ... \end{verbatim} Inhalt dieser Datei ist, den Aufruf der {\sf StP API} Funktionen unter Ber"ucksichtigung der zugrundeliegenden {\sf StP API} Datentypen zu realisieren und die R"uckgabe des Funktionswerts an die Tycoon {\sl bind}-Funktion zu erreichen. \item Ebenfalls auf der C-Ebene mu"s als Grundlage f"ur die Tycoon-Funktion {\sl bind} aus der erstellten Abbildungsdatei und den vorhandenen dynamischen {\sf StP} Bibliotheken eine einzige dynamische Bibliothek erstellt werden, welche die ben"otigte {\sf StP} Funktionalit"at umfa"st. Diese dynamische Bibliothek kann daraufhin der Tycoon-Funktion {\sl bind} als Parameter "ubergeben werden. Ein entsprechendes \engl{Makefile} umfa"st: \begin{verbatim} libstp.so: stp.o cc -g -KPIC -G -o ${TYCOON_ROOT}/lib/${TYCOON_HOST}/libstp.so ${TYCOON_ROOT}/lib/${TYCOON_HOST}/stp.o -L ../StP/libsparc -L ../StP/sybase_10.0.1/sparc/lib -L /usr/lib -lideoms -lideparse -lideeditor -lideoms -lidetools -lsybdb -lm -lidestub -lnsl stp.o: stp.c cc -o ${TYCOON_ROOT}/lib/${TYCOON_HOST}/stp.o -c stp.c -I ${TYCOON_ROOT}/bootlib/stpenv/Include \end{verbatim} \item Auf der Tycoon-Ebene k"onnen jetzt die {\sl bind}-Funktionen an die entsprechenden Bezeichner gebunden und anschlie"send wie "ubliche Tycoon-Funktionen benutzt werden (hier: Tycoon-Modul {\sl node.tm}): \begin{xple} \k{Let} T = word.T; \k{let} lib = runtimeCore.dynamicLibraryName("{}stpenv"{} "{}libstp"{}); \k{let} getOmsNodeCCall = \k{bind}(:Fun (:String :Int :Int :String) :T lib "{}stp\_get\_oms\_node"{} "{}siisw"{}); \k{let} getPdmTypeCCall = \k{bind}(:Fun (:T) :Int lib "{}stp\_get\_oms\_node\_tp\_pdm\_type"{} "{}wi"{}); \k{let} find(rep :repository.T name :String type :Int scopeNodeId :Int sig :String) :T = \k{if not} (repository.isOpen(rep)) \k{then} \k{raise} repository.fail end \k{else} getOmsNodeCCall(name type scopeNodeId sig) \k{end}; ... \end{xple} Als Rückgabewert des Aufrufs der C-Funktion {\tt stp\_get\_oms\_node} erh"alt die Tycoon-Funktion {\sl find} die im Abschnitt~\ref{SubSec:APITypen} dargestellte C-Struktur {\tt oms\_node\_tp}, welche auf einen ad"aquaten Tycoon-Datentypen umgewandelt werden mu"s, um "uberhaupt auf die einzelnen Komponenten dieser Struktur auf der Tycoon-Ebene zugreifen zu k"onnen. \item Der Tycoon-Anwender kann den Zugriff auf das StP Repository nach einem Import der entsprechenden Module der im Abschnitt~\ref{Sec:Modellierg} wiedergegebenen {\sf StP} Umgebung {\sl stpenv} "uber die dort deklarierten Tycoon-Funktionen durchf"uhren: \begin{xple} \k{import} node repository; \k{let} rep = repository.connect(projdir system); \k{let} node = node.find(rep "{}Nodename"{} 701576 0 "{}Signatur"{}); ... \end{xple} \end{enumerate} \input{anbindg2.tex}