DresdenOCL

publicité
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
Téléchargement