Configurer le fichier .mff
Cette rubrique fournit des instructions comment configurer un fichier MapForce Function File (.mff). Un fichier .mff est un fichier de configuration de format XML qui permet d'importer des fonctions depuis les bibliothèques Java, C# ou C++ personnalisées dans MapForce pour qu'elles apparaissent dans la fenêtre Bibliothèques. Un fichier .mff est un intermédiaire entre vos bibliothèques personnalisées et MapForce. Le fichier .mff doit être configuré pour spécifier i) les interfaces pour les fonctions personnalisées et ii) pour trouver la mise en œuvre dans le code généré.
Important :
•Les fichiers *.mff doivent être valides par rapport au schéma suivant : C:\Program Files\MapForceLibraries\mff.xsd. Le schéma mff.xsd définit la configuration de bibliothèque personnalisée et est pour utilisation interne uniquement. Altova GmbH se réserve le droit de modifier ce format de fichier lors des nouvelles publications.
•Il est possible de ne définir qu'une seule classe C#, C++, ou Java par fichier .mff.
Échantillon .mff pour C#
L'extrait de code suivant illustre un fichier d'échantillon .mff pour C++ :
<?xml version="1.0" encoding="UTF-8"?>
<mapping version="9" library="mylib" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mff.xsd">
<implementations>
<implementation language="cpp">
<setting name="namespace" value="mylib"/>
<setting name="class" value="Greetings"/>
<setting name="path" value="C:\Libraries\cpp"/>
<setting name="include" value="Greetings.h"/>
<setting name="source" value="Greetings.cpp"/>
</implementation>
</implementations>
<group name="greetings">
<component name="sayhello">
<sources>
<datapoint name="ismorning" type="xs:boolean"/>
</sources>
<targets>
<datapoint name="result" type="xs:string"/>
</targets>
<implementations>
<implementation language="cpp">
<function name="SayHello"/>
</implementation>
</implementations>
<description>
<short>result = sayhello(ismorning)</short>
<long>Returns "Good morning" or "Good day", depending on the input parameter.</long>
</description>
</component>
</group>
</mapping>
Bibliothèque personnalisée importée
L'image ci-dessous montre à quoi pourrait ressembler un fichier .mff personnalisé après l'importation dans MapForce. Veuillez noter que la bibliothèque personnalisée mylib apparaît en tant qu'entrée de bibliothèque (triée par ordre alphabétique), contenant la fonction string sayhello.
Étapes de configuration
Pour configurer le fichier .mff, suivez les instructions ci-dessous.
Étape 1. Configurer le nom de bibliothèque
Vous trouverez le nom de bibliothèque du fichier .mff file (voir ci-dessous). Par convention, les noms de bibliothèque sont écrits en minuscule dans MapForce ; néanmoins, vous pouvez aussi utiliser des majuscules.
<mapping version="9" library="mylib" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mff.xsd">
Dans l'échantillon ci-dessus, l'entrée qui apparaîtra dans la fenêtre Bibliothèques sera appelée mylib.
Étape 2. Configurer les mises en œuvre du langage
L'élément <implementations> est un élément obligatoire qui spécifie quels langages votre bibliothèque doit prendre en charge et qui doit être ajoutée en tant qu'enfant de <mapping>, (voir l’exemple ci-dessous)
<!-- ... -->
<mapping version="9" library="mylib" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mff.xsd">
<implementations>
<implementation language="cpp">
<setting name="namespace" value="mylib"/>
<setting name="class" value="Greetings"/>
<setting name="path" value="C:\Libraries\cpp"/>
<setting name="include" value="Greetings.h"/>
<setting name="source" value="Greetings.cpp"/>
</implementation>
</implementations>
<!-- ... -->
Les paramètres dans le cadre de chaque élément <implementation> permettent au code généré d'appeler les fonctions spécifiques définies dans Java, C++ ou C#. Un fichier .mff peut être rédigé de manière à ce qu'il cible plus d'un langage de programmation. Dans ce cas, chaque langage supplémentaire doit contenir un élément <implementation> supplémentaire. Les paramètres spécifiques pour chaque langage de programmation sont discutés ci-dessous.
Référence de bibliothèque Java
<!-- ... -->
<implementation language="java">
<setting name="package" value="com.hello.functions"/>
<setting name="class" value="Greetings"/>
</implementation>
<!-- ... -->
Il est important que le code généré puisse trouver votre fichier Greetings.class. C'est pourquoi vous devez vous assurer que votre classe a été ajoutée au chemin de classe Java.
Référence de bibliothèque C#
<!-- ... -->
<implementation language="cs">
<setting name="namespace" value="MyLibrary" />
<setting name="class" value="Greetings" />
<setting name="reference" value="C:\Libraries\cs\MyLibrary\bin\debug\MyLibrary.dll" />
</implementation>
<!-- ... -->
Pour C#, il est important que l'espace de noms dans le code corresponde à l'espace de noms défini dans le fichier .mff (dans le listing du code ci-dessus, l'espace de noms est MyLibrary). La même chose vaut pour le nom de classe (dans l'extrait de code ci-dessus, le nom de classe est Greetings). Le troisième paramètre, reference, fournit le chemin du dll qui doit être lié au code généré.
Référence de bibliothèque C++
<!-- ... -->
<implementation language="cpp">
<setting name="namespace" value="MyLibrary"/>
<setting name="class" value="Greetings"/>
<setting name="path" value="C:\Libraries\cpp"/>
<setting name="include" value="Greetings.h"/>
<setting name="source" value="Greetings.cpp"/>
</implementation>
<!-- ... -->
En ce qui concerne C++, veuillez noter :
•namespace est l'espace de noms dans lequel votre classe Greetings sera défini. Il doit être égal à l'attribut library dans l'élément mapping.
•path est le chemin dans lequel se trouvent l'include et les fichiers de source.
•Lors de la génération de code pour un mappage, l'include et les fichiers de source seront copiés dans le répertoire targetdir/libraryname, qui est défini lors de la sélection de la commande Fichier | Générer code dans | C++, et inclus dans le fichier de projet.
Tous les fichiers include que vous fournissez seront inclus dans l'algorithme généré.
Étape 3. Ajouter un composant
Dans la fenêtre Bibliothèques, chaque fonction apparaît imbriquée sous un groupe de fonctions, par exemple des "string functions". Dans le fichier .mff, une fonction correspond à un élément <component>. En revanche chaque <component> doit être imbriqué sous un élément <group>, par exemple :
<!-- ... -->
<group name="string functions">
<component name="sayhello">
<!-- ... -->
</component>
</group>
<!-- ... -->
Le code affiché ci-dessous définit une fonction d'échantillon (composant) appelée sayhello.
<!-- ... -->
<component name="sayhello">
<sources>
<datapoint name="ismorning" type="xs:boolean"/>
</sources>
<targets>
<datapoint name="result" type="xs:string"/>
</targets>
<implementations>
<!-- ... -->
</implementations>
<description>
<short>result = sayhello(ismorning)</short>
<long>Returns "Good morning" or "Good day", depending on the input parameter.</long>
</description>
</component>
<!-- ... -->
Voici à quoi ressemblerait le composant ci-dessus dans MapForce :
Dans le listing de code ci-dessus, l’élément <datapoint> peut être librement défini en tant que paramètre d'entrée ou de sortie d'une fonction (aussi nommé connecteur d'entrée ou de sortie). L'argument type de l’élément <datapoint> spécifie le type de données du paramètre ou le type de données de la valeur de retour. Un seul point de cible est autorisé pour chaque fonction. Le nombre de points de données source que vous pouvez définir n’est pas limité.
Le type de données de chaque point de données doit être un des types de Schéma XML (par exemple, xs:string, xs:integer, etc.). Ces types de données doivent correspondre aux types de données des paramètres de fonction que vous avez défini dans votre bibliothèque Java, C++ ou C#. Pour en savoir plus sur le mappage des types de données de schéma XML dans les types de langage, voir Mappage de type de données.
Les fonctions sont accompagnées par des descriptions brèves et longues dans la fenêtre Bibliothèques. La description brève est toujours affichée à droite du nom de fonction, alors que la description longue est affichée en tant qu'infobulle lorsque vous placez le curseur de la souris sur la description brève (voir la capture d’écran ci-dessous).
Étape 4. Définir les mises en œuvre de langage
Nous pouvons désormais connecter la fonction dans la fenêtre Bibliothèques avec la fonction dans les classes personnalisées Java, C# ou C++. Cela s'effectue par le biais de l'élément <implementation>. Une fonction peut avoir plusieurs éléments <implementation> - un pour chaque langage de programmation pris en charge. Une fonction peut être appelée Hello dans Java ou SayHello dans C++. C'est pourquoi vous devez spécifier un nom de fonction séparé pour chaque langage de programmation. Une fonction pour chacun des langages de programmation pourrait ressembler à l'exemple suivant :
<!-- ... -->
<component name="sayhello">
<!-- ... -->
<implementations>
<implementation language="cs">
<function name="HelloFunction"/>
</implementation>
<implementation language="java">
<function name="Hello"/>
</implementation>
<implementation language="cpp">
<function name="SayHello"/>
</implementation>
</implementations>
<!-- ... -->
</component>
<!-- ... -->
La valeur que vous fournissez en tant que nom de fonction doit correspondre à la méthode dans la classe Java, C# ou C++.