Cette page a été écrite en s'appuyant sur le tutorial «Les classes et la génération de code sous Bouml» qui est diffusé par le site de documentation de BoUML ; vous pouvez le consulter pour plus de détails.
Malgré l'envie qu'on peut en avoir, il ne suffit pas de cliquer le bouton «Generate>Java» qu'on voit apparaître dans le menu «Tools» ou dans les menus contextuels des packages et classes pour générer du code. En effet, depuis UML2, le passage du modèle UML au code se fait en passant par un modèle intermédiaire, le «modèle de déploiement» où à chaque classe on fait correspondre un artefact «source» qui va assurer entre autres la gestion du code interne et la connexion des classes avec des fichiers (on peut par exemple très bien ranger plusieurs classes dans un même fichier source).
Notes :
javadoc : menu «Project > Edit > Edit generation settings», sélectionner l'onglet «Java[1]» et cocher la case «Generate Javadoc style comment».Le projet est organisé en paquetages qui traduisent l'architecture du programme. Dans chaque paquetage une Class_view va permettre la définition des classes et relations ; un ou plsieurs diagrammes de classes peuvent être associés à ces Class_views.
Lors de l'édition des classes, attributs, méthodes et relations, la sélection de l'onglet «Java» dans le panneau d'édition permet d'avoir une prévisualisation de la génération de code qui sera obtenue :
Si, à ce stade vous essayez d'activer la génération de code (par «Generate > Java»), vous obtiendrez l'erreur : «C1 : does not have associated artifact». En UML 2 les artifacts représentent les fichiers sources, objet, librairie, exécutable, jar etc. La génération produit des fichiers source, et les artifacts sont utilisés pour dire quels sont ces fichiers sources.
Les artifacts doivent être placés dans une deployement_view que vous pouvez créer dans chaque paquetage ; habituellement, on crée une deployement_view correspondant à une class_view dans chaque paquetage (mais ça n'est pas une obligation).
Il faut alors associer les deployement_views aux class_views : ouvrez le dialogue d'édition de la class_view et sélectionnez pour le champ «deployement view» la deployement_view qui a été créée dans le même paquetage. Cette association faite, vous voyez apparaître dans le menu contextuel de chaque classe l'item «Create source artifact» qu'il vous suffit de sélectionner pour créer l'artifact «source» correspondant.
Copie du Tutoriel de Bruno Pagès :
Essayez de nouveau de générer le code, cela est possible en appelant le menu sur chaque classe, ou au niveau des class view les contenant, ou au niveau du package contenant les vues etc jusqu'au niveau du projet. En le faisant au niveau du projet vous demandez la génération de tous les artifact et des classes qui leur sont associées. Provoquer la génération via le menu Tools est une autre façon de demander la génération au niveau projet.
Cette nouvelle tentative de génération de code produira un autre message d'erreur, car BOUML ne sait pas où les fichiers sources doivent être produits : les artifacts donnent le nom des fichiers, pas leur emplacement !
Il est possible d'indiquer un répertoire de génération pour chaque package (vous pouvez également spécifier un namespace, package ou module), il est également possible de spécifier un répertoire de génération (ou un répertoire de base) pour tout le projet via les generation settings. Appelez le menu du projet dans le browser (clic droit sur foo) et choisissez generation settings, allez dans le dernier intercalaire appelé Directory et spécifiez un répertoire pour C++ et Java, par exemple /tmp pour les deux (utilisez d'autres et meilleurs répertoires dans le futur !), validez le changement (bouton Ok).
Maintenant si vous demandez la génération de code, celle-ci se fera. Demandez à générer le code une deuxième fois pour le même langage : la trace indique que rien n'est produit car c'est inutile. Notez que le générateur de code vérifie véritablement que chaque fichier présent a le bon contenu, si vous changez le contenu d'un de ces fichiers à la main et redemandez la génération de code, le fichier en cause sera réécrit. Cela signifie que même si ce n'est pas toujours approprié au niveau vitesse (surtout si seul un fichier est modifié sur 1000), vous pouvez toujours demander la génération au niveau du projet et aucune modification inutile ne sera faite, au plus grand plaisir de vos Makefile et gestionnaires de configuration.
De fait chaque template de classe, méthode, etc peut être adapté individuellement comme nous l'avons vu précédemment, mais on peut également faire des modifications de génération qui vont affecter tout le projet en éditant les generation settings.