Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
On the Challenges of Composing Multi-View Models
Matthias Schöttle and Jörg Kienzle
2
Multi-View Modelling
[ Image credit: http://www.accesscontrolsales.com/mighty-cord-rv-cad.htm ]
2
Multi-View Modelling
[ Image credit: http://www.accesscontrolsales.com/mighty-cord-rv-cad.htm ]
Consistent Views
[ Image credit: http://www.empowernetwork.com/msycks/blog/how-to-get-consistent-in-your/ ]
2
Multi-View Modelling
[ Image credit: http://www.wired.com/dangerroom/2010/09/revealed-pentagons-craziest-powerpoint-slide-ever/ ]
Complex Systems[ Image credit: http://www.accesscontrolsales.com/mighty-cord-rv-cad.htm ]
Consistent Views
[ Image credit: http://www.empowernetwork.com/msycks/blog/how-to-get-consistent-in-your/ ]
2
Multi-View Modelling
[ Image credit: http://www.wired.com/dangerroom/2010/09/revealed-pentagons-craziest-powerpoint-slide-ever/ ]
Complex Systems Composition
[ Image credit: http://www.accesscontrolsales.com/mighty-cord-rv-power-cords.htm ]
[ Image credit: http://www.accesscontrolsales.com/mighty-cord-rv-cad.htm ]
Consistent Views
[ Image credit: http://www.empowernetwork.com/msycks/blog/how-to-get-consistent-in-your/ ]
Overview
• Two independent modelling notations (I and D)
• Metamodels and composers exist
• Integration to multi-view modelling notation
• Ensure consistency between views
• Ensure compatibility of composers
• Focus on technical side: Reuse
3
VD
VI
VI VD
Contents
• General strategy for integrating two notations
• Integration of metamodels
• Composition of multi-view models
• Practical application of strategy to RAM
• Challenges faced
• Demo
4
metamodel Dmetamodel I
Integration Strategy: Metamodels
5
metamodel Dmetamodel I
Integration Strategy: Metamodels
metamodel I/D
5
metamodel Dmetamodel I
Integration Strategy: Metamodels
metamodel I/D
5
metamodel Dmetamodel I
Integration Strategy: Metamodels
metamodel I/D
5
metamodel Dmetamodel I
Integration Strategy: Metamodels
metamodel I/D
5
metamodel Dmetamodel I
Integration Strategy: Metamodels
metamodel I/D
5
Integration Strategy: Composing
ComposerI ComposerD
MI,1 MI,2 MD,1 MD,1
6
Integration Strategy: Composing
ComposerI ComposerD
MI,1 MI,2
MI,C
MD,1 MD,1
6
Integration Strategy: Composing
ComposerI ComposerD
MI,1 MI,2
MI,C
MD,1 MD,1
6
Integration Strategy: Composing
ComposerI ComposerD
MI,1 MI,2
MI,C
E1MI,2
E1MI,1
E2MI,1
E1MC
E2MC
MD,1 MD,1
6
Integration Strategy: Composing
ComposerI ComposerD
MI,1 MI,2
MI,C
E1MI,2
E1MI,1
E2MI,1
E1MC
E2MC
MD,1 MD,1
MD,C
6
Integration Strategy: Process
I1 D1M1 I2 D2M2
7
Integration Strategy: Process
Step 1:compose I
I1 D1M1 I2 D2M2
IC MC 7
Integration Strategy: Process
Step 1:compose I
I1 D1M1 I2 D2M2
IC MC 7
Integration Strategy: Process
Step 1:compose I
I1 D1M1 I2 D2M2
IC MC 7
E1MI,2
E1MI,1
E2MI,1
E1MC
E2MC
IC MC
Integration Strategy: Process
Step 2:copy
I1 D1M1 I2 D2M2
8
IC MC
Integration Strategy: Process
Step 2:copy
I1 D1M1 I2 D2M2
DC,1
DC,2 8
IC MC
Integration Strategy: Process
Step 2:copy
I1 D1M1 I2 D2M2
DC,1
DC,2 8
IC MC
Integration Strategy: Process
I1 D1M1 I2 D2M2
DC,1
DC,2
Step 3:update references
9
IC MC
Integration Strategy: Process
I1 D1M1 I2 D2M2
DC,1
DC,2
Step 3:update references
9
E1MI,2
E1MI,1
E2MI,1
E1MC
E2MC
IC MC
Integration Strategy: Process
DC,1
DC,2
Step 3:update references
9
IC MC
Integration Strategy: Process
DC,1
DC,2
Step 4:compose DC
10
IC MC
Integration Strategy: Process
Step 4:compose DC
DC 10
Practical Application to Reusable Aspect Models (RAM)
structural viewaspect StockExchange depends on Observer
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
11
Practical Application to Reusable Aspect Models (RAM)
structural viewaspect StockExchange depends on Observer
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
message view createWindow target: StockGUIcreateWindow(stock)
window: StockWindowwindow := create(stock)startObserving(stock)
11
Practical Application to Reusable Aspect Models (RAM)
structural viewaspect StockExchange depends on Observer
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
message view createWindow target: StockGUIcreateWindow(stock)
window: StockWindowwindow := create(stock)startObserving(stock)
11
RAM: Metamodel
Aspect
AbstractMessageView
Interaction
OperationmessageViews 0..*
specifies1
specificationadvice 0..11
MessageViewAspectMessageView references1
affectedBy 0..*
pointcut
1
0..* properties
lifelines
1..*interaction
11..*
Reference
messagesLifeline
TypedElement
represents1
signature1
- messageSort: MessageSortMessage
ParameterValueMapping StructuralFeature
Parameter
arguments0..*assignTo
0..1
parameter 1
synchCallcreateMessagedeleteMessagereply
<<enum>>MessageSort
MessageViewReference
StructuralViewClassifier
operations 0..*
classes
1..*
structuralView
1
parameters0..*
12
RAM: Metamodel
Aspect
AbstractMessageView
Interaction
OperationmessageViews 0..*
specifies1
specificationadvice 0..11
MessageViewAspectMessageView references1
affectedBy 0..*
pointcut
1
0..* properties
lifelines
1..*interaction
11..*
Reference
messagesLifeline
TypedElement
represents1
signature1
- messageSort: MessageSortMessage
ParameterValueMapping StructuralFeature
Parameter
arguments0..*assignTo
0..1
parameter 1
synchCallcreateMessagedeleteMessagereply
<<enum>>MessageSort
MessageViewReference
StructuralViewClassifier
operations 0..*
classes
1..*
structuralView
1
parameters0..*
12
structural viewaspect StockExchange depends on Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
RAM: Concern Reuse
13
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject 1
mySet~ add(|Observer )int size
<<impl>>Set
|Observer
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
structural viewaspect StockExchange depends on Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
RAM: Concern Reuse
13
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject 1
mySet~ add(|Observer )int size
<<impl>>Set
|Observer
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
Instantiation Observer: |Subject → Stock; |Observer → StockWindow; |modify → setPrice; |update → updateWindow;
structural viewaspect StockExchange depends on Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
RAM: Concern Reuse
13
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject 1
mySet~ add(|Observer )int size
<<impl>>Set
|Observer
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
Instantiation Observer: |Subject → Stock; |Observer → StockWindow; |modify → setPrice; |update → updateWindow;
structural viewaspect StockExchange depends on Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
RAM: Concern Reuse
13
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject 1
mySet~ add(|Observer )int size
<<impl>>Set
|Observer
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
Instantiation Observer: |Subject → Stock; |Observer → StockWindow; |modify → setPrice; |update → updateWindow;
structural viewaspect StockExchange depends on Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
RAM: Concern Reuse
13
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject 1
mySet~ add(|Observer )int size
<<impl>>Set
|Observer
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
Instantiation Observer: |Subject → Stock; |Observer → StockWindow; |modify → setPrice; |update → updateWindow;
structural viewaspect StockExchange depends on Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
RAM: Concern Reuse
13
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject 1
mySet~ add(|Observer )int size
<<impl>>Set
|Observer
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
Instantiation Observer: |Subject → Stock; |Observer → StockWindow; |modify → setPrice; |update → updateWindow;
structural viewaspect StockExchange depends on Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
RAM: Concern Reuse
13
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject
~ add(|Observer )int size
<<impl>>Set
|Observer1
mySet
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
structural viewaspect StockExchange depends on Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
Instantiation Observer: |Subject → Stock; |Observer → StockWindow; |modify → setPrice; |update → updateWindow;
RAM: Weaving
14
mySubject0..10..1mySubject
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject
~ add(|Observer )int size
<<impl>>Set
|Observer1
mySet
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
RAM: Weaving
14
mySubject0..10..1mySubject
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject
~ add(|Observer )int size
<<impl>>Set
|Observer1
mySet
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)
StockWindow
RAM: Weaving
14
~ add(|Observer )int size
<<impl>>Set
|Observer1
mySet
0..*0..1mySubject~ Set<|Observer> getObservers()
+ * |modify(..)+ addObserver(|Observer)
|Subject
+ startObserving(|Subject)~ |update(|Subject)
|Observer
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject
~ add(|Observer )int size
<<impl>>Set
|Observer1
mySet
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI + StockWindow create(Stock stock)
~ updateWindow(Stock stock)
StockWindow
RAM: Weaving
14
~ add(|Observer )int size
<<impl>>Set
|Observer1
mySet
0..*0..1mySubject
+ startObserving(|Subject)~ |update(|Subject)
|Observer
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)~ Set<StockWindow> getObservers()~ addObserver(StockWindow sw)
- String name- int price
Stock
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject
~ add(|Observer )int size
<<impl>>Set
|Observer1
mySet
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
RAM: Weaving
14
~ add(|Observer )int size
<<impl>>Set
|Observer1
mySet
0..*0..1mySubject
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)~ Set<StockWindow> getObservers()~ addObserver(StockWindow sw)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)~ startObserving(Stock s)
StockWindow
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject
~ add(|Observer )int size
<<impl>>Set
|Observer1
mySet
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
RAM: Weaving
14
1mySet
0..*0..1mySubject
~ add(StockWindow)int size
<<impl>>Set
StockWindow
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)~ Set<StockWindow> getObservers()~ addObserver(StockWindow sw)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)~ startObserving(Stock s)
StockWindow
structural viewaspect Observer |Subject
|Observer|modify|update
~ Set<|Observer> getObservers()+ * |modify(..)+ addObserver(|Observer)
|Subject
~ add(|Observer )int size
<<impl>>Set
|Observer1
mySet
mySubject0..1
0..*+ startObserving(|Subject)~ |update(|Subject)
|Observer
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
RAM: Weaving
14
1mySet
0..*0..1mySubject
message view startObservingstartObserving(s) addObserver(target)
target: |Observer s: |Subject mySet: Set
add(target)
message view createWindowcreateWindow(stock)
target: StockGUIwindow := create(stock)startObserving(stock)
window: StockWindow
~ add(StockWindow)int size
<<impl>>Set
StockWindow
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)~ Set<StockWindow> getObservers()~ addObserver(StockWindow sw)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)~ startObserving(Stock s)
StockWindow
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
RAM: Weaving
14
1mySet
0..*0..1mySubject
message view startObservingstartObserving(s) addObserver(target)
target: |Observer s: |Subject mySet: Set
add(target)
message view createWindowcreateWindow(stock)
target: StockGUIwindow := create(stock)startObserving(stock)
window: StockWindow
~ add(StockWindow)int size
<<impl>>Set
StockWindow
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)~ Set<StockWindow> getObservers()~ addObserver(StockWindow sw)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)~ startObserving(Stock s)
StockWindow
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
RAM: Weaving
14
1mySet
0..*0..1mySubject
|Subject
|Observer
Set
startOb..
StockWindow
Stock
Set
startObs..
message view startObservingstartObserving(s) addObserver(target)
target: |Observer s: |Subject mySet: Set
add(target)
message view createWindowcreateWindow(stock)
target: StockGUIwindow := create(stock)startObserving(stock)
window: StockWindow
~ add(StockWindow)int size
<<impl>>Set
StockWindow
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)~ Set<StockWindow> getObservers()~ addObserver(StockWindow sw)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)~ startObserving(Stock s)
StockWindow
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
RAM: Weaving
14
1mySet
0..*0..1mySubject
|Subject
|Observer
Set
startOb..
StockWindow
Stock
Set
startObs..
message view startObservingstartObserving(s) addObserver(target)
target: |Observer s: |Subject mySet: Set
add(target)
message view createWindowcreateWindow(stock)
target: StockGUIwindow := create(stock)startObserving(stock)
window: StockWindow
target: StockWindow s: Stock
~ add(StockWindow)int size
<<impl>>Set
StockWindow
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)~ Set<StockWindow> getObservers()~ addObserver(StockWindow sw)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)~ startObserving(Stock s)
StockWindow
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
RAM: Weaving
14
1mySet
0..*0..1mySubject
message view startObservingstartObserving(s) addObserver(target)
target: |Observer s: |Subject mySet: Set
add(target)
message view createWindowcreateWindow(stock)
target: StockGUIwindow := create(stock)startObserving(stock)
window: StockWindow
target: StockWindow s: Stock
~ add(StockWindow)int size
<<impl>>Set
StockWindow
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)~ Set<StockWindow> getObservers()~ addObserver(StockWindow sw)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)~ startObserving(Stock s)
StockWindow
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
RAM: Weaving
14
1mySet
0..*0..1mySubject
message view startObservingstartObserving(s) addObserver(target)
target: |Observer s: |Subject mySet: Set
add(target)
message view createWindowcreateWindow(stock)
target: StockGUIwindow := create(stock)startObserving(stock)
window: StockWindow
target: StockWindow s: Stock
~ add(StockWindow)int size
<<impl>>Set
StockWindow
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)~ Set<StockWindow> getObservers()~ addObserver(StockWindow sw)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)~ startObserving(Stock s)
StockWindow
message view createWindowcreateWindow(stock)
target: StockGUIwindow := create(stock)startObserving(stock)
window: StockWindow
stock: Stock
addObserver(window)
mySet: Set
add(window)
+ StockGUI create()+ createWindow(Stock stock)
StockGUI
RAM: Weaving
14
1mySet
0..*0..1mySubject
message view startObservingstartObserving(s) addObserver(target)
target: |Observer s: |Subject mySet: Set
add(target)
message view createWindowcreateWindow(stock)
target: StockGUIwindow := create(stock)startObserving(stock)
window: StockWindow
target: StockWindow s: Stock
~ add(StockWindow)int size
<<impl>>Set
StockWindow
+ Stock create(String name, int price)+ int getPrice()+ setPrice(int price)~ Set<StockWindow> getObservers()~ addObserver(StockWindow sw)
- String name- int price
Stock
+ StockWindow create(Stock stock)~ updateWindow(Stock stock)~ startObserving(Stock s)
StockWindow
message view createWindowcreateWindow(stock)
target: StockGUIwindow := create(stock)startObserving(stock)
window: StockWindow
stock: Stock
addObserver(window)
mySet: Set
add(window)
Challenges
15
• Complexity of integration depending on shared concepts
• MMI might have to be modified
• High dependencies
• Testing very important
Demo
16
17
Step 1: compose
Step 2: copy
I1 D1 I2 D2
Ic
I1 D1 I2 D2
Ic Dc
Ic D2,c
D1,c
Ic D2,c
D1,c
Step 3: update references
Step 4: compose
M1 M2 M1 M2
Mc Mc
Mc Mc
copy
copy
17
Step 1: compose
Step 2: copy
I1 D1 I2 D2
Ic
I1 D1 I2 D2
Ic Dc
Ic D2,c
D1,c
Ic D2,c
D1,c
Step 3: update references
Step 4: compose
M1 M2 M1 M2
Mc Mc
Mc Mc
copy
copy
Aspect
AbstractMessageView
Interaction
OperationmessageViews 0..*
specifies1
specificationadvice 0..11
MessageViewAspectMessageView references1
affectedBy 0..*
pointcut
1
0..* properties
lifelines
1..*interaction
11..*
Reference
messagesLifeline
TypedElement
represents1
signature1
- messageSort: MessageSortMessage
ParameterValueMapping StructuralFeature
Parameter
arguments0..*assignTo
0..1
parameter 1
synchCallcreateMessagedeleteMessagereply
<<enum>>MessageSort
MessageViewReference
StructuralViewClassifier
operations 0..*
classes
1..*
structuralView
1
parameters0..*
17
Step 1: compose
Step 2: copy
I1 D1 I2 D2
Ic
I1 D1 I2 D2
Ic Dc
Ic D2,c
D1,c
Ic D2,c
D1,c
Step 3: update references
Step 4: compose
M1 M2 M1 M2
Mc Mc
Mc Mc
copy
copy
Aspect
AbstractMessageView
Interaction
OperationmessageViews 0..*
specifies1
specificationadvice 0..11
MessageViewAspectMessageView references1
affectedBy 0..*
pointcut
1
0..* properties
lifelines
1..*interaction
11..*
Reference
messagesLifeline
TypedElement
represents1
signature1
- messageSort: MessageSortMessage
ParameterValueMapping StructuralFeature
Parameter
arguments0..*assignTo
0..1
parameter 1
synchCallcreateMessagedeleteMessagereply
<<enum>>MessageSort
MessageViewReference
StructuralViewClassifier
operations 0..*
classes
1..*
structuralView
1
parameters0..*