460 likes | 580 Views
A Rigorous Framework for Model-Driven Development. Liliana Favre Universidad Nacional del Centro de la Provincia de Buenos Aires Comisión de Investigaciones Científicas de la Provincia de Buenos Aires lfavre@exa.unicen.edu.ar Argentina. The Goal is.
E N D
A Rigorous Framework for Model-Driven Development Liliana Favre Universidad Nacional del Centro de la Provincia de Buenos Aires Comisión de Investigaciones Científicas de la Provincia de Buenos Aires lfavre@exa.unicen.edu.ar Argentina
The Goal is... • To define foundations for Model-Driven Architecture (MDA). • To integrate knowledge developed by the community of formal methods with MDA.
Model-Driven Architecture • Model-Driven Architecture (MDA) is an initiative proposed by the Object Management Group (OMG). • Models play a central role in MDA. MDA promotes the construction of abstract models that are developed independently of a particular platform and then graduallytransformedinto models for specific platforms. • Automation is key in MDA.
Models and MDA • Platform Independent Model (PIM) • Platform Specific Model (PSM) • Implementation, Code Models UML combined with OCL is the most widely used way for writing models.
MDA: PIMs and PSMs • A Platform Independent Model(PIM) is a model that contains no reference to the platforms that are used to realize it. • A Platform Specific Model(PSM) describes a system in terms of a particular implementation platform.
Model-Driven Development:Transformations PIM PIM PSM J2EE PSM dotNET PSM REL CODE CODE CODE
Model-Driven Development:Transformations One of the key challenges of the MDA is to maintain traces and relationships between different models in an automatic way Metamodeling Transformations
Metamodeling and MDA • Metamodeling plays a key role in MDA. • The UML specification is defined using a metamodeling approach that is based on an architecture with four layers: - meta-metamodel - metamodel - model - object model
Metamodeling and MDA Metamodels • UML Static Models • Classes • Binary Associations • Data Types • Package • OCL specifications
Metamodeling and MDA:A Simplified UML Metamodel nestedpackages*0..1 0..* 0..* Interface Class source Package 1 owner name:String name:String * 1 * otherEnd 1 target * owner 1 * 1 Parents Association * End Association * name:String 2 associationEnd upperbound: Int name:String association lowerbound: Int 1
A Simplified UML Metamodel:OCL Specifications context Package self.class -> forAll (e1,e2 /e1.name = e2.name implies e1 = e2) self.association->forAll(a1,a2/a1.name=a2.name implies a1=a2) self.nestedPackages-> forAll(p1,p2 /p1.name = p2.name implies p1=p2) context AssociationEnd source = self.otherEnd.target and target = otherEnd.source
Reusability and MDA • Reusable components that will be used in an MDA-based process must be described at different abstraction levels. • Developing reusable components requires a high focus on software quality. A megamodel for MDA components
Megamodels and MDA A model of which at least some elements represent and/or refer to UML based models or metamodels at different abstraction levels and structured by means of different relationships.
Megamodelsand MDA PIM METAMODEL PICM PIM MODEL PSM-J2EE METAMODEL PSM-REL METAMODEL PSM -.NET METAMODEL PSCM PSM-J2EE PSM-REL PSM-.NET ICM CODEMETAMODEL CODE METAMODEL CODE METAMODEL CODE CODE CODE
Metamodel Transformations Metamodel transformations in OCL Transformation rules • Name • Parameters • Source model element • Target model element • Precondition • Postcondition
Formal Specifications and MDA Model-Driven Development (MDD) can take advantages of: • Formal languages • Tools for prototyping, model validation, model simulation.
Rigorous Model Driven Development • NEREUS, a metamodeling notation • Bridge between UML/OCL and NEREUS • Bridges between NEREUS and formal languages • Megamodel Formalization
The NEREUS Language • NEREUS is suited for specifying UML-based metamodels. • NEREUS is an intermediate notation open to many other formal languages. • NEREUS is relation-centric.
The NEREUS Constructs • CLASS • ASSOCIATIONS • PACKAGES • DATA TYPES • Predefined types: OCL Collection, tuple, enumerated,… • Constructor types for associations
NEREUS: Class Specification CLASS className [<parameterList>] IMPORTS <importsList> INHERITS<inheritsList> IS-SUBTYPE-OF <subtypeList> ASSOCIATES<associatesList> DEFERRED TYPES <typesList> FUNCTIONS <functionList> EFFECTIVE TYPES <typesList> FUNCTIONS <functionList> AXIOMS <varList> <axiomList> END-CLASS
An Example: Collection Class includes: Collection x Elem ->BooleanincludesAll: Collection x Collection -> Boolean excludes: Collection x Elem -> Boolean forAll : CollectionX (Elem->Boolean)->Boolean exists : CollectionX(Elem->Boolean) ->Boolean select: Collection X (Elem->Boolean) -> Collection CLASS Collection [Elem:ANY] IMPORTS Boolean, Nat GENERATED-BY create, add DEFERRED TYPES Collection FUNCTIONS create : Collection add : Collection x Elem Collection count : Collection x Elem Nat iterate : Collection x (Elem x Acc: ANY) x ( -> Acc ) -> Acc EFFECTIVE FUNCTIONS isEmpty: Collection ->Boolean size: Collection Nat
An Example: Collection Class AXIOMS c: Collection; e : Elem; f: Elem->Boolean; g: Elem x Acc-> Acc; base : -> Acc isEmpty ( c ) = (size (c ) = 0 ) iterate (create, g, base ) = base iterate (add (c, e), g, base)= g (e, iterate (c, g, base)) count (c,e) = LET FUNCTIONS f1: Elem x Nat ->Nat AXIOMS e1:Elem; i:Nat f1(e1, i) = if e = e1 then i+1 else i IN iterate (c, f1, 0) END-LET includes (create , e ) = False includes (add (c, e), e1) = if e = e1 then True else includes (c, e1) forAll (create , f ) = True forAll (add(c,e), f ) = f (e) and forAll (c, f) exists (create, f ) = False exists (add (c, e)) = f (e) or exists (c, f ) select (create, f) = create select (add (c,e), f) = if f(e) then add (select(c,f ),e) else select (c, f)… END-CLASS
NEREUS: The Hierarchy Association Association Binary Association ... Aggregation Non-Shared Bidirectional Unidirectional Shared 1..1 *..*
NEREUS: Association Specification ASSOCIATION <relationName> IS <constructorTypeName>[...:Class1; ...:Class2;...:Role1;...:Role2; ...: mult1; ...: mult2; ...:visibility1; ...:visibility2] CONSTRAINED BY <constraintList> END
NEREUS: Package Specification PACKAGE packageName IMPORTS < importList> INHERITS < inheritList> <elements> END-PACKAGE
A Simplified NEREUS Metamodel PACKAGE Core CLASS C_Class ASSOCIATES<<A_parents>>, <<A-allParents>>, <<A_source>>, <<A_target>>,<<Class_Package>> … FUNCTIONS name: C_Class -> String… END-CLASS CLASS C_Package ASSOCIATES <<Association_Package>>, <<Class_Package>>, <<A_allNested>>, <<A_ownerPack>> FUNCTIONS name: C_Package -> String… END-CLASS CLASS C_Association … CLASS C_AssociationEnd … CLASS Interface ASSOCIATION A_parents IS Unidirectional-2[C_Class:class1; C_Class:class2;class:role1;parents: role2;1:mult1; *:mult2; +:visibility1; +:visibility2] END ASSOCIATION A_target… ASSOCIATION Class_Package IS Bidirectional-1 [C_Class: class1; C_Package:class2; class:role1; owner:role2; *:mult1; 1:mult2; +:visibility1;+::visibility2]… END-PACKAGE
Megamodel Formalization UML-PIM Metamodel UML PIM PICM NEREUS PIM NEREUS-PIM METAMODEL NEREUS METAMODEL NEREUS METAMODEL NEREUS METAMODEL PSCM UML-PSM-REL METAMODEL REL UML-PSM-.NET METAMODEL NEREUS PSM-REL UML-PSM METAMODEL NEREUS METAMODEL NEREUS PSM-.NET UML PSM-REL UML PSM-.NET NEREUS PSM-J2EE NEREUS METAM NEREUSMETAM NEREUS METAM UML METAMODEL UML METAMODEL UML METAMODEL CODE CODE CODE ICM
A Bridge between UML/OCL and NEREUS UML Static model/metamodelNEREUS OCLNEREUS A system of transformation rules to translate • OCL predefined Types • OCL basic expressions • Preconditions • Postconditions • Invariants • Association Constraints
From OCL to NEREUS:Transformation Rules OCL collection OPER (parameterList): Boolean post: result = collection forAll (elem: Elem boolean-expr-with-elem) NEREUS FUNCTIONS TranslateNEREUS (collection OPER (parameterList): Boolean ) AXIOMS c: Collection; e: Elem; f: Elem->Boolean… OPER (create, parameterList) = TRUE OPER (add (c,e), parameterList) = OPER (c, parameterList) AND TranslateNEREUS (boolean-expr-with-elem ) with[ elem |-> e]
Transformation Rules OCL NEREUS v. operation(v’) v->operation (v’) operation (v,v’) v.attribute attribute (v ) context A object.rolename getRolename (A, object) e.op op (Translate NEREUS (e)) collection-> op (v:Elem |b-expr-with-v) op ::=select| forAll| reject| exists LET FUNCTIONS f: Elem ->Boolean AXIOMS v : Elem f(v)= TranslateNEREUS (b-expr-with-v ) IN op (collection, f) END-LET ---------------------------------------------- opv(collection,[f(v)]) concise notation T Op (parameterList) : ReturnType post: expr AXIOMS t : T, ... TranslateNEREUS (exp)
An Example: Person&Meeting Package Meeting title:String start:String end:String isConfirmed:Boolean duration(): Time checkDate (): Bool cancel() numConfirmedParticipants():Nat Person name:String Affiliation:String Address:String numMeeting:Nat numConfirmedMeeting ():Nat Participates 2..* * participants meetings Hussmann, H. et al. Abstract Data Types and UML, Report DISI-TR-99-15
OCL Specifications: Person&Meeting context Person:: numMeeting ( ): Nat post: result = self.meetings -> size context Meeting :: isConfirmed (): Bool post: result= self.checkdate() and self.numConfirmedParticipants >= 2 context Meeting:: checkDate():Bool post: result = self.participants->collect(meetings) -> forAll(m | m<> self and m.isConfirmed implies (after(self.end,m.start) or after(m.end,self.start))) context Person :: numMeetingConfirmed ( ) : Nat post: result= self.meetings -> select (isConfirmed) -> size context Meeting :: duration ( ) : Time post: result = timeDifference (self.end, self.start) Hussmann, H. et al. Abstract Data Types and UML , Report DISI-TR-99-15
From OCL Specifications to NEREUS context Person :: numMeetingConfirmed ( ) : NatOCL post: result= self.meetings-> select (isConfirmed) -> size T Op (parameterList) : ReturnType post:result = expr AXIOMS t:T, ... Op (t, parameterList) = TranslateNEREUS (expr) T-> select (v :Type | boolean-expr-with-v) selectv (TranslateNEREUS(T), TranslateNEREUS(boolean-expr-with-v) NEREUS AXIOMS p:Person; m:Meeting;Pa:Participates;… numMeetingsConfirmed(p)= size(selectm (getMeetings(Pa,p), isConfirmed [m]) RULE 1 RULE 2 RULES 1,2,..
From NEREUS to Algebraic Languages The Common Algebraic Specification Language • CASL has been designed as a general purpose algebraic specification language. • CASL has a complete formal semantics • CASL is supported by tools. • CASL facilitates interoperability of prototyping and verification tools.
Transforming NEREUS into CASL Classes • Relations • Inheritance • Clientship • Functions • Higher-order • Visibility Associations Packages
From NEREUS to CASL: Translating Associations Step1:Regroup the operations of classes A and B distinguishing operations local to A, local to B and, local to A and B and Assoc. A B Assoc LOCAL TOOPERATIONS/ATTRIBUTES Person name Meeting tittle, start, end, duration Person, Meeting, Participates cancel,isConfirmed, numConfirmedMeetings, checkDate, numMeetings
From NEREUS to CASL:Translating Associations Step 2:Construct the specifications C and D from A and B where Cand Dinclude local operations to A and B respectively spec PERSON given STRING, NAT = then generated type Person ::= create-Person (String) ops name: Person -> String setName :Person x String -> Name end spec MEETING given STRING,DATE = then generated type Meeting ::= create-Meeting ( String; Date; Date) Ops tittle: Meeting -> String set-title: Meeting x String -> Meeting start : Meeting -> Date set-start: Meeting x Date -> Meeting isEnd: Meeting -> Date set-end: Meeting x Date -> Meeting end
From NEREUS to CASL:Translating Associations Step 3:Construct specifications Collection[C] and Collection[D] by instantiating reusable schemes spec SET-PERSON given NAT= PERSON and BAG[PERSON] and … then generated type Set[Person] :: =create | including (Set[Person]; Person) ops union : Set[Person] x Set[Person] -> Set [Person] intersection : Set[Person] x Set[Person] -> Set [Person] count: Set[Person] x Person -> Nat … spec SET-MEETING given NAT = MEETING and BAG[MEETING] and … then generated type Set [Meeting] :: =create | including (Set[Meeting]; Meeting) …
From NEREUS to CASL:Translating Associations Step 4:Construct a specification Assoc (with Collection[C] and Collection[D]) by instantiating reusable schemes in the component Association spec PARTICIPATES = SET-PERSON and SET-MEETING and BINARY-ASSOCIATION [PERSON][MEETING] with BinaryAssociation|-> Participates pred isRightLinked: Participates x Person isLeftLinked: Participates x Meeting isRelated: Participates x Person x Meeting ops addLink: Participates x Person x Meeting -> Participates getParticipants: Participates x Meeting -> Set [Person] getMeetings: Participates x Person -> Set[Meeting] remove: Participates x Person x Meeting -> Participates • a : Participates; p,p1: Person; m,m1: Meeting def addLink (a,p,m) not isRelated (a,p,m) def getParticipants (a, m) isLeftLinked (a,m) def getMeetings (a, m) isRightLinked ( a, m) def remove (a,p,m) isRelated (a, p, m) end
From NEREUS to CASL:Translating Associations Step 5:Construct the specification AssocA+B by extending Assoc with C, D and the operations local to C, D and Assoc. spec PERSON&MEETING = PARTICIPATES then ops numMeeting : Participates x Person -> Nat numConfirmedMeeting : Participates x Person -> Nat isConfirmed : Participates x Meeting -> Boolean numConfirmedParticipants: Participates x Meeting -> Nat checkDate: Participates x Meeting -> Participates select : Participates x Set[Meeting] -> Set[Meeting] collect: Participates x Set[Person] -> Bag[Meeting] pred forall: Participates x Set[Meeting] x Meeting
From NEREUS to CASL:Translating Associations Step 5: s : Set[Meeting]; m:Meeting; pa:Participates; p:Person; m:Meeting; sp:Set[Person]; bm: Bag[Meeting] forall (pa, including(s,m),m1) = isConsistent(m,m1) and forall(pa, s, m1) select(pa, create-Meeting) = create-Meeting select (pa, including (s,m)) = including(select(s,pa),m) when isConfirmed (pa, m) else select (s,pa) collect (pa, create-Person,s) = asBag (create-Person) collect (pa, including (sp, p) ) = asBag (including (collect (pa,sp), p)) numMeeting( pa, p) = size (getMeetings(pa, p)) isConfirmed (pa, m)=checkDate (pa,m) and NumConfirmedParticipants(pa,m) >2 numConfirmedMeeting (pa, p) = size (select (getMeetings (pa,p)) checkDate (pa, m) = forall (pa, collect (getParticipants(pa,m), m) isConsistent (pa, m, m1) = not (isConfirmed (pa,m1)) or (end(m) < start (m1) or end (m1) < start(m)) numParticipantsConfirmed (pa, m) = size( getParticipants (pa, m)) end
From NEREUS to CASL: Translating Associations numMeetings numConfirmedMeetings isConfirmed checkDate cancel forAll select collect Person&Meeting getMeetings getParticipates Participates SetPerson SetMeeting tittle start end duration Person name Meeting
Why NEREUS? • Interoperability with different tools in different stages of MDD. • Only one bridge between UML/OCL and formal languages is defined. • A single definition of metamodeling transformations is sufficient and the communication between the different phases in MDD is easier, since they work under a common formalization. • A common intermediate language facilitates consistency checks in model refining
Conclusions This work proposes an uniform framework for MDD that comprises: • A megamodel for defining MDA-components • NEREUS, an intermediate metamodeling notation • The definition of model/metamodel transformations.
Conclusions • Rather than requiring developers to manipulate formal specifications, we want to provide rigorous foundations for metamodeling in order to develop tools that allow developers to directly manipulate UML/OCL models they have created.
Future Work We foresee: • To validate the megamodel through • forward engineering • reverse engineering • model refactoring • To connect NEREUS with tools linked to formal methods • To integrate our results in the existing UML Case tools.