Retour sur l'intégration d'Enterprise Architect au sein d'un grand compte

Publié
Commentaires Aucun

Enterprise Architect est un outil propriétaire de modélisation et de gestion de projet édité par SPARX, une société australienne. C’est un outil à l’interface graphique est assez intuitive proposant une pléthore de fonctionnalités.

ea screenshot

Citons parmi celles-ci de la modélisation UML, de la rétro-documentation de code et de base de données, de la gestion de travail collaboratif et bien entendu, de la gestion d’équipe et de projet.

Là où l’utilisation d’EA ne pose aucun souci particulier pour les petites structures, l’intégration de l’outil de SPARX aux processus de modélisation et de conduite de projet de grands groupes peut devenir problématique.
Il deviens en effet nécessaire d’échanger des données entre les outils logiciels dont dispose la structure et EA afin de prémâcher le travail des concepteurs et autres architectes de solution.

Dans notre cas il s’agissait, entre autre choses, d’importer des fichiers générés par PowerAMC (MPD, MCD et autre joyeusetés) vers des diagrammes utilisant le langage UML2 sous EA.

Pour traiter ce type de problème, EA dispose d’une API permettant d’effectuer des manipulations automatisées dans le modèle objet d’un projet Enterprise Architect.

Ces travaux ont été effectués en utilisant l’API JAVA fournie par SPARX.

Dès l’exécution du premier “Hello World” en utilisant cette API, on constate que celle-ci n’est pas compatible avec les JVMs 64 bits. Particulièrement ennuyeux pour les milliers de postes de l’entreprise équipés par défaut d’une JVM 64 bits. Pas le choix, l’utilisateur de l’API est alors obligé d’embarquer une VM 32 bits avec son programme.

Ce petit problème surmonté, un autre souci fait alors surface: On constate avec effroi que l’utilisation de certaines fonctions de l’API provoquent une segfault dans la JVM. Encore une fois, pas beaucoup de solutions, il faut y aller à tâtons et chercher les méthodes boguées une à une… Après passage en revue de l’API, le problème reste circonscrit à quelques fonctions. (Prions pour que le prochain patch corrige le problème ! – ici EA11 1113).

Pour finir, un dernier problème de taille… La documentation incomplète du modèle objet d’EA et de l’API elle-même.
Après quelques essais, on s’aperçoit vite que les petites mains de SPARX ont fait le choix d’utiliser des noms de méthodes absolument contre-intuitives, pire, le même attribut est parfois pour faire des choses différentes… Juste un exemple: la méthode SetIsCollection( true ); peut servir, suivant le stéréotype de la classe, à créer une collection, ou à définir une clé étagère (stéréotype table). Et ceci n’est absolument pas décris dans la documentation. Sans le support de SPARX, heureusement fort réactif, effectuer des opérations complexes sur le modèle objet sans connaître la méthode à utiliser devient rapidement un casse tête.

Pour terminer sur une note positive, passé la lenteur d’exécution des programmes utilisant l’API d’EA, les fonctions utilisables marchent plutôt bien.

Ci dessous un petit cadeau à tous les développeurs qui auront à utiliser l’API de EA pour générer du data model, un bout de code fourni par l’éditeur permettant de setter des clés étrangères dans une table. Enjoy !


private void DefineForeignKey(org.sparx.Attribute fkField, org.sparx.Attribute pkField){ String pkOpName, fkOpName; org.sparx.Element fkTable; org.sparx.Element keyTable; org.sparx.Connector fkConnector; org.sparx.Method fkOperation; org.sparx.Method op; org.sparx.Parameter param; fkTable = repository.GetElementByID(fkField.GetParentID()); keyTable = repository.GetElementByID(pkField.GetParentID()); pkOpName = “”; fkOpName = “”;

// get target Primary Key name for (short i=0; i < keyTable.GetMethods().GetCount(); i++){ op = keyTable.GetMethods().GetAt(i); if (op.GetStereotype().compareTo(“PK”) 0){ for (short p=0; p < op.GetParameters().GetCount(); p++){ param = op.GetParameters().GetAt(p); if (param.GetName().compareTo( pkField.GetName() ) 0){ pkOpName = op.GetName(); break; } } } }

// define Foreign Key Name fkOpName = “FK_” + fkTable.GetName() + “_” + keyTable.GetName(); // define connector fkConnector = fkTable.GetConnectors().AddNew(”“, “Association”); fkConnector.SetSupplierID( pkField.GetParentID() ); fkConnector.SetStyleEx( “FKINFO=SRC=” + fkOpName + “:DST=” + pkOpName + “:;” ); fkConnector.SetStereotype( “FK” ); fkConnector.GetClientEnd().SetRole( fkOpName ); fkConnector.GetClientEnd().SetCardinality ( “0..*” ); fkConnector.GetSupplierEnd().SetRole ( pkOpName ); fkConnector.GetSupplierEnd().SetCardinality ( “1” ); fkConnector.Update(); // define fk operation fkOperation = fkTable.GetMethods().AddNew(fkOpName, “”); fkOperation.SetStereotype( “FK” ); fkOperation.Update(); param = fkOperation.GetParameters().AddNew(fkField.GetName(), fkField.GetType()); param.Update(); // update attribute details fkField.SetIsCollection( true ); fkField.Update(); }

Auteur

Commentaires

Commentaires fermés pour cet article.

← Plus anciens Plus récents →