Le but de ce TP noté est d'implanter une classe permettant de décrire une commande comme java ou javadoc avec ses arguments. Étant donné un objet qui contient les valeurs des arguments de la commande, elle permettra de facilement transférer ceux-ci en tant qu'option de la commande.
La classe
CmdLineModel sert à décrire une ligne de commande avec sa commande et ses différentes
options. À partir d'un objet décrivant les valeurs des arguments de la commande,
CmdLineModel permet de créer une liste contenant les différentes valeurs de la ligne de commande.
Cette liste pourra ensuite être envoyée à un objet comme le
java.lang.ProcessBuilder qui permet d'exécuter une commande en Java.
Dans un premier temps, on va supposer qu'une commande ne possède que des options sans argument (pour activer des comportements). Par exemple, la commande
javadoc possède les
options
-quiet et
-html5 qui permettent respectivement de demander de ne pas faire
trop d'affichage et de générer du code HTML au format HTML 5.
On va aussi supposer qu'il existe un classe comme la classe
Javadoc ci-dessous qui représente
les arguments de la commande
javadoc
class Javadoc {
private final boolean quiet;
private final boolean html5;
public Javadoc(boolean quiet, boolean html5) {
this.quiet = quiet;
this.html5 = html5;
}
public boolean isQuiet() {
return quiet;
}
public boolean isHtml5() {
return html5;
}
}
Pour représenter ce type de commande, on va munir la classe
CmdLineModel des 3 méthodes suivantes:
-
la méthode of qui prend en paramètre le nom de la commande et créé une instance de la classe CmdLineModel.
-
la méthode option qui prend en paramètre:
- une fonction qui prend un objet en paramètre et renvoie un booléen;
- une chaîne de caractères qui correspond au nom de l'option. C'est ce nom qui sera rajouté à la liste des arguments de la commande si la fonction (le 1er paramètre de option) renvoie vrai pour l'objet dont on demande la liste des options.
La méthode option renvoie un objet de type CmdLineModel ce qui permet de chaîner les appels.
-
la méthode toList qui prend en paramètre un objet (c'est l'objet sur lequel on appellera les fonctions correspondant à chaque option) et renvoie une nouvelle liste contenant le nom de la commande suivie des noms des différentes options si elles ont été activées.
La classe
CmdLineModel est paramétrée par le type de l'objet qui contient les arguments des différentes options.
Par exemple avec le code suivant
var model = CmdLineModel.<Javadoc>of("javadoc")
.option(Javadoc::isQuiet, "-quiet")
.option(Javadoc::isHtml5, "-html5");
var javadoc = new Javadoc(/*quiet*/true, /*html5*/true);
var argumentList = model.toList(javadoc);
la liste
argumentList contient les valeurs ["javadoc", "-quiet", "-html5"].
Le nom de la commande passée en paramètre de la méthode
of est toujours le premier argument de la liste.
L'ordre des options dans
argumentList est le même que l'ordre des appels à la méthode
option.
Si l'objet
Javadoc n'active pas une des options (si la valeur est
false), alors le nom de l'option correspondante n’apparaîtra pas dans la liste.
Par exemple, toujours avec le même objet
model, si on exécute
var argumentList2 = model.toList(new Javadoc(/*quiet*/false, /*html5*/true));
alors
argumentList2 contient uniquement les valeurs ["javadoc", "-html5"].
Note: le fait d'avoir séparé l'objet qui contient les arguments (
Javadoc) de l'objet qui modélise une commande (
CmdLineModel) permet de réutiliser un même modèle avec plusieurs valeurs d'arguments différentes comme le montre l'exemple ci-dessus.
Note 2: nous verrons dans la suite du sujet comment gérer les options qui ne sont pas représentables par des variables booléennes.
Des tests unitaires correspondant à l'implantation sont ici:
CmdLineModelTest.java.