Arcane  v3.14.11.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Exemple n°2

L'exemple 2 est presque identique à l'exemple 1, mise à part la définition du nom du tableau (et du fichier) et du nom du sous-répertoire.

En tant que singleton, notre service n'a pas accès au jeu de données, donc il faut passer par l'un des modules pour transférer les informations.

L'exemple 2 montre comment faire ça simplement.

Fichier .axl – Partie <options>

Pour commencer, voyons les options du fichier axl :

SimpleTableOutputExample2.axl

<options>
<simple name="tableName" type="string" default="">
<description>
Name for table file (example: Results ).
</description>
</simple>
<simple name="tableDir" type="string" default="">
<description>
Directory for table file (example: example2 ).
</description>
</simple>
</options>

Si vous jetez un oeil dans le .axl du service (ici : Service 'SimpleCsvOutput'), vous pourrez constater que c'est identique. En effet, dans le cas du singleton, on utilise notre module principal pour récupérer les informations dont a besoin notre service.

Autre chose à noter : la valeur par défaut default="". Mettre une valeur par défaut vide nous permet de déterminer si l'utilisateur a spécifié une valeur ou non dans le .arc. Plus tard, dans le module, on pourrait dire que s'il n'y a pas de valeurs sur les deux options, alors c'est que l'utilisateur ne veut simplement pas de sortie csv. (c'est la méthode utilisée dans QAMA).

Fichier .arc – Partie option du module

Voici le .arc correspondant :

SimpleTableOutputExample2.arc

<simple-table-output-example2>
<!-- Le nom du répertoire à créer/utiliser. -->
<tableDir>example2</tableDir>
<!-- Le nom du fichier à créer/écraser. -->
<tableName>Results_Example2</tableName>
<!-- Au final, on aura un fichier ayant comme chemin : ./example2/Results_Example2.csv -->
</simple-table-output-example2>

Comme expliqué au-dessus, c'est le module qui gère les deux options, donc on se retrouve dans la partie "option du module".

Point d'entrée initial

Voyons le point d'entrée start-init :

SimpleTableOutputExample2Module.cc

void SimpleTableOutputExample2Module::
initModule()
{
// On utilise des valeurs (pseudo-)aléatoires.
srand(1234);
// Initialisation du service.
// On récupère un pointeur vers le singleton créé par Arcane.
ISimpleTableOutput* table = ServiceBuilder<ISimpleTableOutput>(subDomain()).getSingleton();
// On initialise le tableau grâce à un des initialisateurs.
// Le nom du tableau sera par défaut "Results_Example2_default" ou le nom choisi dans
// le .arc et le nom du fichier sortant sera "Results_Example2_default.X" (ou Y.X avec
// Y le nom choisi dans le .arc).
// X étant selon le format choisi (.csv par exemple).
if(options()->getTableName() != "")
table->init(options()->getTableName());
else
table->init("Results_Example2_default");
// On print le tableau dans son état actuel (vide, avec un titre).
table->print();
}

C'est le module qui gère les deux options du service, y compris les valeurs par défaut. Si l'utilisateur ne spécifie pas de valeur pour l'option tableName dans le .arc, on définit un nom par défaut (sachant que le service le fait aussi si l'on appelle table->init() sans paramètres).

Avertissement
Un appel à init comme ceci : table->init() est différent d'un appel à init comme cela : table->init("") ! L'un prendra une valeur par défaut, l'autre aura un nom vide et le fichier de sortie n'aura simplement pas de noms (juste l'extension).

Point d'entrée loop

Ce point d'entrée est identique à celui de l'exemple 1.

Point d'entrée exit

Enfin, voyons le point d'entrée exit :

SimpleTableOutputExample2Module.cc

void SimpleTableOutputExample2Module::
endModule()
{
// On récupère un pointeur vers le singleton créé par Arcane.
ISimpleTableOutput* table = ServiceBuilder<ISimpleTableOutput>(subDomain()).getSingleton();
// On print le tableau dans son état actuel.
table->print();
// On enregistre le résultat dans le dossier par défaut "example2_default" ou le dossier
// choisi par l'utilisateur dans le .arc.
// Si l'utilisateur n'a mis ni tableName, ni tableDir dans le .arc,
// il n'y aura aucune sortie.
if(options()->getTableName() != "" || options()->getTableDir() != "") {
if(options()->getTableDir() != "")
table->setOutputDirectory(options()->getTableDir());
else
table->setOutputDirectory("example2_default");
table->writeFile();
}
}

La ligne

if(options()->getTableName() != "" || options()->getTableDir() != "")

permet de savoir si l'utilisateur a entré au moins une des options. Si c'est le cas, alors on vérifie la valeur par défaut et on écrit le fichier.
Si ce n'est pas le cas, alors on n'écrit pas de fichier.