INF3143 Modélisation et spécification formelles des logiciels Hiver 2017 Alexandre Terrasa Département d’informatique, UQÀM OCL Avec Java et DresdenOCL 2 DresdenOCL http://www.dresden-ocl.org/ Une suite d’outils pour OCL / Java ● ● ● ● Éditeur OCL Parseur et interpréteur de contraintes Visualisation des contraintes Génération de code Basé sur Eclipse EMF https://eclipse.org/modeling/emf 3 Pré-requis ● JDK 1.7 ● Eclipse Luna + Eclipse Modeling Tools ○ https://eclipse.org/downloads/packages/eclipse-mod eling-tools/lunasr2 ● EMF Text ○ https://marketplace.eclipse.org/content/emftext ● Eclipse AspectJ Development Tools (AJDT) ○ http://www.eclipse.org/ajdt/ 4 Installation via Eclipse Marketplace ● Via le Eclipse Marketplace ○ https://marketplace.eclipse.org/content/dresden-ocl 5 Eclipse Marketplace Il est possible que l’installation automatisée ne fonctionne pas… Voir diapos suivantes 6 Install New Software 7 Install New Software Installer les dépendances manuellement AJDT ● http://download.eclipse.org/tools/ajdt/42/update/ EMFText ● http://www.emftext.org/update/ DresdenOCL ● http://www.dresden-ocl.org/update/luna/ 8 Perspective DresdenOCL 9 Représentation du modèle DresdenOCL accepte des modèles ● EMF Ecore (*.ecore) ○ https://eclipse.org/modeling/emf ● MDT UML (*.uml) ○ http://www.eclipse.org/modeling/mdt/ ● Classes Java (*.class) 10 Modèles Java Possibilité de charger un modèle depuis des fichiers .class compilés. Obtenir les .class: ● Écrire les classes soi-même ● Utiliser le code source existant ● Générer le code source depuis UML ○ ArgoUML, Eclipse UMLGen... 11 ModelProvider Pour lister les classes faisant partie du modèle package inf3143.collections.exemples.universite; public class ModelProvider { public Universite universite; public Professeur professeur; public Cours cours; public Etudiant etudiant; } 12 Charger un modèle Java 13 Charger un modèle Java 14 Charger un modèle Java 15 Instance de modèle Passer à DresdenOCL une liste d’objets sur lesquels appliquer les contraintes OCL Objets ● Issus du programme à vérifier ● Représentant un certain état du programme, une situation 16 ModelInstsanceProvider package inf3143.collections.exemples.universite; import java.util.ArrayList; import java.util.List; public class ModelInstanceProvider { public static List<Object> getModelObjects() { List<Object> result = new ArrayList<Object>(); result.add( new Universite() ); return result; } } 17 Charger une instance 18 Charger une instance 19 Charger une instance 20 Écrire des contraintes OCL 21 Écrire des contraintes OCL 22 Écrire des contraintes OCL 23 Vérifier des contraintes 24 Filtrer les contraintes 25 Tracer une contrainte 26 Tracer une contrainte 27 DresdenOCL Pour vérifier des contraintes dans du code existant 28 Valider du code Java Idée: ● valider des bibliothèques Java ● ajouter les contrats à du code Java existant Test 1 .ocl contrats .jar .jar bibliothèque + contrats bibliothèque à valider + cas de tests ✓ validation ✓ validation validation Test n 29 Programmation par Aspects Programmation orientée aspect: ● paradigme de programmation ● pour améliorer la modularité Objectifs ● séparer les préoccupations transversales (cross-cutting concerns) ● séparer le code métier et le code “technique” 30 Préoccupations transversales Définition: Aspects d’un programme qui affecte plusieurs modules indépendamment de la logique métier Exemples: ● journalisation (logging) ● authentification ● internationalisation 31 Tissage Compiler ensemble ● du code aspect ● du code métier Tissage aspect exe (weaving) code métier 32 AOP et langages La programmation orientée aspect (AOP) est ● indépendante des langages ● un outil supplémentaire AOP et langages ● ● ● ● Java AspectJ Python Spring Aspect.NET ... 33 Avec AspectJ Extension AOP pour Java ● ● ● ● Depuis 2001 Eclipse Foundation Compatible Java 1.3 > 1.8 www.eclipse.org/aspectj/ Le compilateur ajc permet de tisser du code aspect avec du Java 34 Exemple public class Compte { public Integer solde = 0; public void crediter(Integer montant) { solde += montant; } public void debiter(Integer montant) { solde -= montant; } } 35 Exemple (suite) On souhaite journaliser (logger) tous les appels sur les méthodes de Compte: Compte c1 = new Compte(); c1.crediter(10); c1.debiter(10); System.out.println(c1.solde); 36 Exemple avec AspectJ Fichier Logging.aj: aspect Logging { pointcut publicCall(): call(public * Compte.* (..)); after(): publicCall(){ System.out.println("Méthode de Compte appelée"); } } 37 Points de coupe Endroits où “couper” l’exécution du programme pour introduire le code aspect Par exemple: call(Integer Compte.getSolde()) call(void Compte.setSolde(Integer)) call(void Compte.get*(..)) call(public * Compte.* (..)) 38 Conseil (Advice) Morceau de code à exécuter en rapport avec la préoccupation transversale before(): publicCall(){ System.out.println("Avant l’appel"); } after() returning (Object o): publicCall() { System.out.println("A retourné la valeur " + o); } after() throwing (Exception e): publicCall() { System.out.println("A levé l’exception: " + e); } 39 Tisser avec AspectJ Utiliser le compilateur ajc ajc Logging.aj -cp Compte.class -d out/ Génère les .class contenant Compte et les aspects compilés vers Java dans le répertoire out/. 40 Vérifier des contraintes OCL avec des Aspects? aspect ComptePreCrediter { pointcut crediterCaller(Integer montant): call(void Compte.crediter(Integer)) && args(montant); before(Integer montant): crediterCaller(montant) { if (montant < 0) { throw new RuntimeException( "PreconditionError: montant < 0)"); } } } 41 Générer les aspects depuis DesdrenOCL Idée: ● générer le code AspectJ depuis un modèle et un fichier de contraintes OCL Possible avec DresdenOCL et DresdenOCL Standalone Interface https://github.com/Morriar/INF3143-AspectJGenerator 42 Conclusion DresdenOCL ● Outil Eclipse / Java ● Permet de visualiser le résultat de contraintes OCL sur une instance d’un modèle ● Permet de valider des programmes Java avec OCL via la version standalone 43 Ressources ● http://www.dresden-ocl.org/ ● http://info.uqam.ca/~terrasa/cours/INF3143/re ssources/dresden_manual.pdf ● https://marketplace.eclipse.org/content/dresde n-ocl ● https://github.com/dresden-ocl/dresdenocl 44