Konfigurieren der MFF-Datei

www.altova.com Dieses Kapitel drucken Vorherige Seite Eine Ebene nach oben Nächste Seite

Startseite >  Funktionen > Manuelles Referenzieren von Java, C# und C++-Bibliotheken >

Konfigurieren der MFF-Datei

Die MapForce-Funktionsdatei (MapForce Function File (.mff)) ist eine konfigurierbare Datei im XML-Format, mit deren Hilfe Sie Funktionen aus benutzerdefinierten Java-, C#- oder C++-Bibliotheken für MapForce adaptieren können, so dass sie im Fenster "Bibliotheken" angezeigt werden. Eine .mff-Datei ist praktisch die Mittlerdatei zwischen Ihren benutzerdefinierten Bibliotheken und MapForce und muss so konfiguriert sein, dass sie a) die Schnittstellen zu den benutzerdefinierten Funktionen definiert und angibt b) wo die Implementierung im generierten Code zu finden ist. In diesem Kapitel wird erklärt, wie Sie dies erreichen.

 

Anmerkung: Die *.mff-Bibliotheksdateien müssen gemäß der mff.xsd-Schema-Datei im Verzeichnis Altova\MapForce2019\MapForceExamples (relativ zu Ihrem Ordner (Meine) Dokumente) gültig sein. Das mff.xsd-Schema definiert die Konfiguration der benutzerdefinierten Bibliothek und dient nur zur internen Verwendung. Die Altova GmbH behält sich das Recht vor, dieses Dateiformat in neuen Releases zu ändern.

 

Im folgenden Codefragment sehen Sie einem .mff-Beispieldatei für C#:

 

<?xml version="1.0" encoding="UTF-8"?>
<mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="mff.xsd" version="8" library="helloworld">
  <implementations>
    <implementation language="cs">
        <setting name="namespace" value="HelloWorldLibrary"/>
        <setting name="class" value="Greetings"/>
        <setting name="reference" value="C:\HelloWorldLibrary\HelloWorldLibrary.dll"/>
    </implementation>
  </implementations>
  <group name="string functions">
    <component name="hello">
        <sources>
          <datapoint name="greeting_type" type="xs:boolean"/>
        </sources>
        <targets>
          <datapoint name="result" type="xs:string"/>
        </targets>
        <implementations>
          <implementation language="cs">
              <function name="HelloFunction"/>
          </implementation>
        </implementations>
        <description>
          <short>result = hello(greeting_type)</short>
          <long>Returns a greeting sentence according to the given greeting_type.</long>
        </description>
    </component>
  </group>
</mapping>

 

In der Abbildung unten sehen Sie, wie die .mff-Datei nach dem Import in MapForce angezeigt wird. Die benutzerdefinierte Bibliothek "helloworld" erscheint als Eintrag in der Bibliotheksliste (in alphabetischer Reihenfolge sortiert) und enthält die String-Funktion "hello".

 

mip1

Im Folgenden sind die Schritte beschrieben, mit denen Sie die mff-Datei Ihren Bedürfnisse entsprechend anpassen können.

 

Konfigurieren des Bibliotheksnamens

Der Bibliotheksname befindet sich in der unten gezeigten Zeile der .mff-Datei. Gemäß der Konvention ist der Bibliotheksname in Kleinbuchstaben geschrieben.

 

<mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="mff.xsd" version="8" library="helloworld">

 

Im obigen Beispiel hat der im Fenster "Bibliotheken" angezeigte Eintrag den Namen "helloworld".

 

Konfigurieren der Sprachimplementierungen

 

Das Element <implementations> ist ein obligatorisches Element. Es gibt an, welche Sprachen Ihre Bibliothek unterstützen soll und muss als Child von <mapping> hinzugefügt werden, z.B.:

 

...
<mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="mff.xsd" version="8" library="helloworld">
  <implementations>
    <implementation language="cs">
        <setting name="namespace" value="HelloWorldLibrary"/>
        <setting name="class" value="Greetings"/>
        <setting name="reference" value="C:\HelloWorldLibrary\HelloWorldLibrary.dll"/>
    </implementation>
  </implementations>
...

 

Über die Einstellungen in den einzelnen <implementation>-Elementen kann der generierte Code die jeweiligen in Java, C++ oder C# definierten Funktionen aufrufen.

 

Eine .mff-Datei kann so geschrieben werden, dass sie für mehrere Programmiersprachen verwendet werden kann. In diesem Fall muss jede Sprache ein weiteres <implementation>-Element enthalten. Im Folgenden werden die Einstellungen für die einzelnen Programmiersprachen erläutert.

 

Java

...
<implementation language="java">
  <setting name="package" value="com.hello.functions"/>
  <setting name="class" value="Hello"/>
</implementation>
...

 

Damit der generierte Code Ihre Hello.class Datei findet, stellen Sie sicher, dass sich Ihre Klasse im Java Classpath befindet. Der Standard-Java Classpath befindet sich in den Systemumgebungsvariablen.

 

Beachten Sie, dass Sie beim Arbeiten mit benutzerdefinierten Java-Bibliotheken nur eine einzige Klasse pro *.mff-Datei verwenden können.

 

C#

...
  <implementation language="cs">
    <setting name="namespace" value="HelloWorldLibrary"/>
    <setting name="class" value="Hello"/>
    <setting name="reference" value=" C:\HelloWorldLibrary\HelloWorldLibrary.dll"/>
  </implementation>
...

 

Es ist in C# wichtig, dass der Namespace im Code dem in der .mff-Datei definierten Namespace entspricht (im Codefragment oben ist der Namespace HelloWorldLIbrary). Dasselbe gilt für den Klassennamen (im Codefragment oben ist der Klassenname Hello). Die dritte Einstellung, reference, gibt den Pfad der mit dem generierten Code zu verknüpfenden dll-Datei an.

 

C++

...
  <implementation language="cpp">
        <setting name="namespace" value="helloworld"/>
        <setting name="class" value="Greetings"/>
        <setting name="path" value="C:\HelloWorldLibrary"/>
        <setting name="include" value="Greetings.h"/>
        <setting name="source" value="Greetings.cpp"/>
  </implementation>
...

 

Beachten Sie folgende Punkte zum obigen C++-Beispielcodefragment:

 

namespace ist der Namespace, in dem Ihre Klasse Greetings definiert wird. Er muss mit dem Bibliotheksnamen übereinstimmen.
path ist der Pfad, unter dem die include- und die Quelldatei zu finden sind.
Wenn Code für ein Mapping generiert wird, werden die include- und die Quelldatei in das Verzeichnis targetdir/libraryname kopiert (das durch Auswahl der Menüoption Datei |XXX-Code generieren und anschließender Auswahl des Verzeichnisses definiert wird) und in die Projektdatei inkludiert.

 

Alle bereitgestellten include-Dateien werden in den generierten Algorithmus inkludiert.

 

Hinzufügen einer Komponente

Im Bibliotheksfenster der grafischen MapForce-Benutzeroberfläche wird jede Funktion unter

einer Funktionsgruppe angezeigt, z.B. "string functions". In der .mff-Datei entspricht eine Funktion einem <component>-Element. Umgekehrt muss sich jedes <component>-Element unter einem <group>-Element befinden, z.B.:

 

...
<group name="string functions">
  <component name="hello">
     …
  </component>
</group>
...

 

Im unten stehenden Code ist eine Beispielfunktion (component) namens hello definiert.

 

...
<component name="hello">
  <sources>
    <datapoint name="greeting_type" type="xs:boolean"/>
  </sources>
  <targets>
    <datapoint name="result" type="xs:string"/>
  </targets>
  <implementations>
  …
  </implementations>
  <description>
    <short>result = hello(greeting_type)</short>
    <long>Returns a greeting sentence according to the given greeting_type.</long>
  </description>
</component>
...

 

So würde die Komponente in MapForce angezeigt werden:

mip2

Ein <datapoint> im obigen Codefragment ist sozusagen der Eingabe- oder Ausgabeparameter einer Funktion (auch als Input- oder Output-Konnektor bezeichnet). Das Argument type des <datapoint> definiert den Datentyp des Parameters (oder den Datentyp des Rückgabewerts).

 

Für jede Funktion kann nur ein Ziel-Datenpunkt definiert werden. Sie können jedoch mehrere Quell-Datenpunkte definieren.

 

Beim Datentyp für die einzelnen Datenpunkte muss es sich um einen der XML-Schematypen handeln (z.B. xs:string, xs:integer, usw.). Diese Datentypen müssen den Datentypen der Funktionsparameter, die Sie in Ihrer Java-, C++- oder C#-Bibliothek definiert haben, entsprechen. Eine Zuordnung der XML-Schema-Datentypen zu Sprachtypen finden Sie unter Datentyp-Zuordnung.

 

Funktionen sind im Bibliotheksfenster durch kurze und lange Beschreibungen ergänzt. Die Kurzbeschreibung wird immer rechts neben dem Funktionsnamen angezeigt, während die lange Beschreibung als Tooltipp zu sehen ist, wenn Sie den Mauszeiger über die Kurzbeschreibung halten.

 

Kurzbeschreibung:

 

mip3

 

Lange Beschreibung:

mip4

 

Definieren von Sprachimplementierungen

Wir sind nun soweit, dass wir eine Verbindung zwischen der Funktion im Fenster "Bibliotheken" und der Funktion in der benutzerdefinierten Java-, C#- oder C++-Klasse herstellen. Dies wird über das Element <implementation> bewerkstelligt.

 

Wie bereits erwähnt, kann eine Funktion mehrere implementation-Elemente haben - eines für jede unterstützte Programmiersprache. Eine Funktion kann in Java den Namen "helloFunction" oder in C++ den Namen "HelloFunctionResponse" haben. Aus diesem Grund müssen Sie für jede Programmiersprache einen eigenen Funktionsnamen definieren. Eine Funktion für jede einzelne der drei Programmiersprachen kann folgendermaßen aussehen.

 

...
<component name="hello">
...
  <implementations>
    <implementation language="cs">
        <function name="HelloFunction"/>
    </implementation>
    <implementation language="java">
        <function name="helloFunction"/>
    </implementation>
    <implementation language="cpp">
        <function name="HelloFunctionResponse"/>
    </implementation>
  </implementations>
...
</component>
...

 

Der als Funktionsname bereitgestellte Wert muss genau mit dem Namen der Methode in der Java-, C#- oder C++-Klasse übereinstimmen.


© 2019 Altova GmbH