blob: 7377b73de086dff56b68bf5692565970725ddb18 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
/*******************************************************************************
* Copyright (c) 2015 protos software gmbh (http://www.protos.de).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* CONTRIBUTORS:
* Juergen Haug (initial contribution)
*
*******************************************************************************/
package org.eclipse.etrice.expressions.detailcode
import com.google.common.base.Strings
import java.util.List
import org.eclipse.core.runtime.Assert
import org.eclipse.emf.ecore.EObject
import org.eclipse.etrice.core.room.ActorClass
import org.eclipse.etrice.core.room.Attribute
import org.eclipse.etrice.core.room.DataClass
import org.eclipse.etrice.core.room.InterfaceItem
import org.eclipse.etrice.core.room.Message
import org.eclipse.etrice.core.room.Operation
import org.eclipse.etrice.core.room.Port
import org.eclipse.etrice.core.room.SAP
import org.eclipse.etrice.core.room.VarDecl
import org.eclipse.etrice.core.room.util.RoomHelpers
import org.eclipse.xtend.lib.annotations.AccessorType
import org.eclipse.xtend.lib.annotations.Accessors
import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
import org.eclipse.xtext.util.SimpleAttributeResolver
import static extension org.eclipse.xtend.lib.annotations.AccessorType.*
/**
* Defines expression for fsm guards of an ActorClass
* <ul>
* <li>attributes and operations of ActorClass</li>
* <li>data-driven incoming messages</li>
* </ul>
*/
@FinalFieldsConstructor
class GuardDetailExpressionProvider implements IDetailExpressionProvider {
// ctor
protected val ActorClass actorClass
protected val extension RoomHelpers roomHelpers = new RoomHelpers
protected val nameProvider = SimpleAttributeResolver.NAME_RESOLVER
// optional
@Accessors(AccessorType.PUBLIC_SETTER) protected VarDecl transitionEventData
override getInitialFeatures() {
val List<ExpressionFeature> scope = newArrayList
if(transitionEventData !== null) {
scope += transitionEventData.createExprFeature(IDetailExpressionProvider.ExpressionPostfix.NONE)
}
scope += actorClass.allInterfaceItems.filter[isEventDriven || !isConjugated].map[
switch it {
Port case isReplicated: createExprFeature(IDetailExpressionProvider.ExpressionPostfix.BRACKETS)
default: createExprFeature(IDetailExpressionProvider.ExpressionPostfix.NONE)
}]
scope += actorClass.latestOperations.map[createExprFeature]
scope += actorClass.allAttributes.map[createExprFeature]
return scope.filterNull.filter[id !== null].toList
}
override getContextFeatures(ExpressionFeature ctx) {
ctx.assertNotNull
val List<ExpressionFeature> scope = newArrayList
switch obj : ctx.data {
Port case obj.multiplicity == 1/* fall through */,
SAP: scope +=
obj.protocol.getAllOperations(!obj.conjugated).map[createExprFeature]
}
switch obj : ctx.data {
InterfaceItem: {
val pc = obj.protocol
switch pc.commType {
case DATA_DRIVEN:
if (!obj.conjugated) scope += pc.allIncomingMessages.map[createExprFeature]
case EVENT_DRIVEN: { /* no async message calls */}
case SYNCHRONOUS: {}
}
}
Attribute case obj.type.type instanceof DataClass: {
val dc = obj.type.type as DataClass
scope += dc.allAttributes.map[createExprFeature]
scope += dc.latestOperations.map[createExprFeature]
}
}
return scope.filterNull.filter[id !== null].toList
}
def ExpressionFeature createExprFeature(Operation it){
// assuming all operations have parenthesis
createExprFeature(IDetailExpressionProvider.ExpressionPostfix.PARENTHESES)
}
def ExpressionFeature createExprFeature(Message it){
// assuming all message have parenthesis
createExprFeature(IDetailExpressionProvider.ExpressionPostfix.PARENTHESES)
}
def ExpressionFeature createExprFeature(Attribute it){
// assuming all attributes have brackets or not depending on size
switch (size) {
case size > 1: createExprFeature(IDetailExpressionProvider.ExpressionPostfix.BRACKETS)
default: createExprFeature(IDetailExpressionProvider.ExpressionPostfix.NONE)
}
}
def protected createExprFeature(EObject eObj, ExpressionPostfix postfix) {
val feature = new ExpressionFeature(nameProvider.apply(eObj), postfix)
feature.data = eObj
return feature
}
def protected assertNotNull(ExpressionFeature feature) {
Assert.isTrue(!Strings.isNullOrEmpty(feature.id))
Assert.isNotNull(feature.postfix)
Assert.isNotNull(feature.data)
}
}
|