5.8 Objekt Application

Das Objekt application dient zur Anbindung von Clients an Server. Dieses Verfahren kann auch mit Modulen eingesetzt werden. Ein Problem besteht jedoch darin, dass ein und dasselbe Modul bei verschiedenen Dialogen verwendet werden kann. Dabei kann es passieren, dass diesen Dialogen verschiedene Serverprozesse zugeordnet sind. Aus diesem Grund kann bei der Verwendung eines Moduls definiert werden, wo dessen Funktionen zu suchen sind. Dies wird dem Modul über das Objekt import mitgeteilt. Dort wird definiert, welches Applikationsobjekt für die in dem Modul vorhandenen Funktionen zuständig ist.

Beispiel:

dialog Main

application MyServer

{

  ...

}

import Modul_X "modulX.if"

{

  .application MyServer;

}

...

Jede Funktion des Moduls Modul_X wird nun auf dem Server aufgerufen. Damit kann das Modul, das in der Interface-Datei "modulX.if" beschrieben ist, unabhängig von der jeweiligen Serverseite programmiert werden.

Des Weiteren können Funktionen aus Modulen exportiert werden, ohne dass die dazugehörige Applikation mit exportiert werden muss. Dies ist auch die einzige Ausnahme, bei der der Vater eines Objekts nicht mit exportiert werden muss. Diese Vorgehensweise hat den Vorteil, dass der Designer des Moduls immer weiß, auf welchem Rechner seine Funktionen ablaufen - damit verwehrt man aber auch jegliche Chance, von außen Änderungen durchführen zu können.

Beispiel

module Modul

 

application MyServer

{

  ...

  export function void Calculation();

}

...

Die Funktion "Calculation" kann von dem importierenden Modul aus aufgerufen werden, ohne dass dieses Modul über die Applikation "MyServer" Kenntnis hat. Dem Programmierer stehen durch diese beiden Mechanismen Möglichkeiten offen, unabhängig einsetzbare Module zu implementieren.

5.8.1 Applicationszuordnung von Modul-Funktionen

Ein spezieller Fall für die Benutzung von Funktionen in modularisierten Dialogen stellt die Verwendung des .application-Attribut am import-Objekt dar um alle Funktionen eines Modules von„außen“ an eine spezielle Applikation zu koppeln. Diese Vorgehensweise ist im Kapitel „Programmiertechniken“/ „Modularisierung“ / „Objekt Application“ beschrieben.

Beim Importieren von Modulen über use steht diese Vorgehensweise allerdings nicht zur Verfügung. Als Alternative bzw. Ergänzung kann jedoch die Koppelung von Funktionen über das .masterapplication-Attribut am Modul bzw. Dialog verwendet werden. Damit sind Funktionen die direkt unter einem Modul/ Dialog definiert sind einer Applikation zuordenbar. Falls keine Zuordnung am Modul vorhanden ist wird die Zuordnung vom Dialog herangezogen. Das Attribut kann auch mit einem enum-Wert indiziert werden. Dieser Index-Wert sollte aus dem Bereich lang_default…lang_java oder func_normal..func_data sein. Dadurch lassen sich Funktionen entsprechend ihrer Sprache- oder Funktionsart unterschiedlichen Applikationen zuordnen. Eine explizite Zuordnung (auch eine null-Setzung) am Modul überschreibt/ überdeckt immer die Zuordnung des Dialogs.

Beispiel

Modularisierter Dialog mit den Funktionen im Modul Functions.mod, bei dem COBOL-Funktionen der Server-Applikation ApplServer zugeordnet werden und alle anderen Funktionen der dynlib-Applikation ApplLocal.

// Dialog.dlg
dialog Dlg
{
  .masterapplication ApplLocal;
}

application ApplLocal {
  .transport "dynlib";
  .exec "libusercheck.so";
  .active true;
}

use Functions;

on dialog start
{
  variable string Username := setup.env["USER"];
  if  ValidateUser(Username) then
    print "Age = "+GetAge(Username);
  endif
  exit();
}
// Functions.mod
module Functions
{
   .masterapplication[lang_cobol] ApplServer;
}

use Server;

record RecUser
{
  string[50] FirstName;
  string[50] LastName;
  integer Age;
}

export function boolean ValidateUser(string Username);
function cobol integer GetUserProfile(string[50] Username,
                                      record RecUser output);

export rule integer GetAge(string Username)
{
  if GetUserProfile(Username, RecUser)>0 then
    return RecUser.Age;
  endif
  return 0;
}
// Server.mod
module Server

export application ApplServer {
  .connect "server:4712";
  .active true;
}

Siehe auch

Attribut .masterapplication[enum]