aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/CpsStateCoder.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/CpsStateCoder.xtend')
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/CpsStateCoder.xtend134
1 files changed, 134 insertions, 0 deletions
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/CpsStateCoder.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/CpsStateCoder.xtend
new file mode 100644
index 00000000..223cee03
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/CpsStateCoder.xtend
@@ -0,0 +1,134 @@
1package hu.bme.mit.inf.dslreasoner.domains.cps.dse
2
3import hu.bme.mit.inf.dslreasoner.domains.cps.ApplicationInstance
4import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem
5import hu.bme.mit.inf.dslreasoner.domains.cps.HostInstance
6import hu.bme.mit.inf.dslreasoner.domains.cps.HostType
7import hu.bme.mit.inf.dslreasoner.domains.cps.Request
8import hu.bme.mit.inf.dslreasoner.domains.cps.Requirement
9import org.eclipse.emf.common.notify.Notifier
10import org.eclipse.emf.ecore.resource.Resource
11import org.eclipse.emf.ecore.resource.ResourceSet
12import org.eclipse.viatra.dse.statecode.IStateCoder
13import org.eclipse.viatra.dse.statecode.IStateCoderFactory
14import org.eclipse.viatra.query.runtime.api.IPatternMatch
15import org.eclipse.xtend2.lib.StringConcatenationClient
16
17class CpsStateCoder implements IStateCoder {
18 CyberPhysicalSystem cps
19
20 protected new() {
21 }
22
23 override init(Notifier notifier) {
24 cps = switch (notifier) {
25 ResourceSet: getCpsFromResourceSet(notifier)
26 Resource: getCpsFromResource(notifier)
27 CyberPhysicalSystem: notifier
28 default: throw new IllegalArgumentException("notifier is not a CyberPhysicalSystem")
29 }
30 }
31
32 private def getCpsFromResourceSet(ResourceSet resourceSet) {
33 if (resourceSet.resources.empty) {
34 throw new IllegalArgumentException("No Resource in ResourceSet")
35 }
36 val resource = resourceSet.resources.head
37 getCpsFromResource(resource)
38 }
39
40 private def getCpsFromResource(Resource resource) {
41 if (resource.contents.empty) {
42 throw new IllegalArgumentException("No EObject in Resource")
43 }
44 val cps = resource.contents.head
45 if (cps instanceof CyberPhysicalSystem) {
46 cps
47 } else {
48 throw new IllegalArgumentException("EObject in Resource is not a CyberPhysicalSystem")
49 }
50 }
51
52 override String createStateCode() {
53 '''«createRequestsCode»«createHostTypesCode»'''
54 }
55
56 private def StringConcatenationClient createRequestsCode() {
57 '''«FOR request : cps.requests»«createRequestCode(request)»«ENDFOR»'''
58 }
59
60 private def StringConcatenationClient createRequestCode(Request request) {
61 '''[«FOR requirement : request.requirements»«createRequirementCode(requirement)»«ENDFOR»]'''
62 }
63
64 private def StringConcatenationClient createRequirementCode(Requirement requirement) {
65 '''[«FOR app : requirement.instances SEPARATOR ","»«createAppCode(app)»«ENDFOR»]'''
66 }
67
68 private def createAppCode(ApplicationInstance app) {
69 if (app.allocatedTo === null) {
70 "-"
71 } else {
72 createMatchArgumentCode(app.allocatedTo)
73 }
74 }
75
76 private def createHostTypesCode() {
77 '''(«FOR hostType : cps.hostTypes SEPARATOR ","»«hostType.instances.size»«ENDFOR»)'''
78 }
79
80 override String createActivationCode(IPatternMatch match) {
81 '''«match.specification.simpleName»(«FOR arg : match.toArray SEPARATOR ","»«createMatchArgumentCode(arg)»«ENDFOR»)'''
82 }
83
84 protected dispatch def String createMatchArgumentCode(Requirement requirement) {
85 val request = requirement.eContainer
86 if (request instanceof Request) {
87 if (request.eContainer != cps) {
88 throw new IllegalArgumentException("Request is not contained in the CPS")
89 }
90 val requestIndex = cps.requests.indexOf(request)
91 val requirementIndex = request.requirements.indexOf(requirement)
92 requestIndex + "." + requirementIndex
93 } else {
94 throw new IllegalArgumentException("Requirement is not contained in a request")
95 }
96 }
97
98 protected dispatch def String createMatchArgumentCode(ApplicationInstance app) {
99 val requirement = app.requirement
100 if (requirement === null) {
101 throw new IllegalArgumentException("Application instance is not associated with a requirement")
102 }
103 val instanceIndex = requirement.instances.indexOf(app)
104 createMatchArgumentCode(requirement) + "." + instanceIndex
105 }
106
107 protected dispatch def String createMatchArgumentCode(HostInstance host) {
108 val hostType = host.eContainer
109 if (hostType instanceof HostType) {
110 val hostIndex = hostType.instances.indexOf(host)
111 createMatchArgumentCode(hostType) + "." + hostIndex
112 } else {
113 throw new IllegalArgumentException("Host is not contained in a host type")
114 }
115 }
116
117 protected dispatch def String createMatchArgumentCode(HostType hostType) {
118 if (hostType.eContainer != cps) {
119 throw new IllegalArgumentException("Host type is not contained in the CPS")
120 }
121 val hostTypeIndex = cps.hostTypes.indexOf(hostType)
122 hostTypeIndex.toString
123 }
124
125 protected dispatch def createMatchArgumentCode(Object object) {
126 throw new IllegalArgumentException("Unknown match argument: ")
127 }
128
129 static class Factory implements IStateCoderFactory {
130 override createStateCoder() {
131 new CpsStateCoder
132 }
133 }
134}