1
package dk.aau.cs.TCTL.visitors;
5
import dk.aau.cs.TCTL.*;
6
import dk.aau.cs.io.XMLFormatter;
7
import java.util.ArrayList;
9
public class CTLQueryVisitor extends VisitorBase {
11
private static final String XML_NS = "xmlns=\"http://tapaal.net/\"";
12
private static final String XML_PROPSET = "property-set";
13
private static final String XML_PROP = "property";
14
private static final String XML_PROPID = "id";
15
private static final String XML_PROPDESC = "description";
16
private static final String XML_FORMULA = "formula";
17
private static final String XML_ALLPATHS = "all-paths";
18
private static final String XML_EXISTSPATH = "exists-path";
19
private static final String XML_NEGATION = "negation";
20
private static final String XML_CONJUNCTION = "conjunction";
21
private static final String XML_DISJUNCTION = "disjunction";
22
private static final String XML_GLOBALLY = "globally";
23
private static final String XML_FINALLY = "finally";
24
private static final String XML_NEXT = "next";
25
private static final String XML_UNTIL = "until";
26
private static final String XML_BEFORE = "before";
27
private static final String XML_REACH = "reach";
28
private static final String XML_DEADLOCK = "deadlock";
29
private static final String XML_TRUE = "true";
30
private static final String XML_FALSE = "false";
31
private static final String XML_INTEGERLT = "integer-lt";
32
private static final String XML_INTEGERLE = "integer-le";
33
private static final String XML_INTEGEREQ = "integer-eq";
34
private static final String XML_INTEGERNE = "integer-ne";
35
private static final String XML_INTEGERGT = "integer-gt";
36
private static final String XML_INTEGERGE = "integer-ge";
37
private static final String XML_ISFIREABLE = "is-fireable";
38
private static final String XML_INTEGERCONSTANT = "integer-constant";
39
private static final String XML_TOKENSCOUNT = "tokens-count";
40
private static final String XML_PLACE = "place";
41
private static final String XML_TRANSITION = "transition";
42
private static final String XML_INTEGERSUM = "integer-sum";
43
private static final String XML_INTEGERPRODUCT = "integer-product";
44
private static final String XML_INTEGERDIFFERENCE = "integer-difference";
46
private StringBuffer XMLQuery;
48
public CTLQueryVisitor() {
49
this.XMLQuery = new StringBuffer();
52
public String getXMLQueryFor(TCTLAbstractProperty property, String queryName) {
53
buildXMLQuery(property, queryName);
54
return getFormatted();
57
public void buildXMLQuery(TCTLAbstractProperty property, String queryName) {
58
XMLQuery.append(startTag(XML_PROP) + queryInfo(queryName) + startTag(XML_FORMULA));
59
property.accept(this, null);
60
XMLQuery.append(endTag(XML_FORMULA) + endTag(XML_PROP));
63
public String getFormatted() {
64
XMLFormatter formatter = new XMLFormatter();
65
return formatter.format(getStartTag() + XMLQuery.toString() + getEndTag());
68
public String getStartTag(){
69
return startTag(XML_PROPSET + " " + XML_NS) + "\n";
72
public String getEndTag(){
73
return endTag(XML_PROPSET) + "\n";
76
private String queryInfo(String queryName){
77
String nameToPrint = (queryName == null) ? "Query Comment/Name Here" : queryName;
78
return wrapInTag(nameToPrint, XML_PROPID) + wrapInTag(nameToPrint, XML_PROPDESC);
81
public void visit(TCTLAFNode afNode, Object context) {
82
XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_FINALLY));
83
afNode.getProperty().accept(this, context);
84
XMLQuery.append(endTag(XML_FINALLY) + endTag(XML_ALLPATHS));
87
public void visit(TCTLAGNode agNode, Object context) {
88
XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_GLOBALLY));
89
agNode.getProperty().accept(this, context);
90
XMLQuery.append(endTag(XML_GLOBALLY) + endTag(XML_ALLPATHS));
93
public void visit(TCTLAXNode axNode, Object context) {
94
XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_NEXT));
95
axNode.getProperty().accept(this, context);
96
XMLQuery.append(endTag(XML_NEXT) + endTag(XML_ALLPATHS));
99
public void visit(TCTLAUNode auNode, Object context) {
100
XMLQuery.append(startTag(XML_ALLPATHS) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
101
auNode.getLeft().accept(this, context);
102
XMLQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
103
auNode.getRight().accept(this, context);
104
XMLQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_ALLPATHS));
107
public void visit(TCTLEFNode efNode, Object context) {
108
XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_FINALLY));
109
efNode.getProperty().accept(this, context);
110
XMLQuery.append(endTag(XML_FINALLY) + endTag(XML_EXISTSPATH));
113
public void visit(TCTLEGNode egNode, Object context) {
114
XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_GLOBALLY));
115
egNode.getProperty().accept(this, context);
116
XMLQuery.append(endTag(XML_GLOBALLY) + endTag(XML_EXISTSPATH));
119
public void visit(TCTLEXNode exNode, Object context) {
120
XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_NEXT));
121
exNode.getProperty().accept(this, context);
122
XMLQuery.append(endTag(XML_NEXT) + endTag(XML_EXISTSPATH));
125
public void visit(TCTLEUNode euNode, Object context) {
126
XMLQuery.append(startTag(XML_EXISTSPATH) + startTag(XML_UNTIL) + startTag(XML_BEFORE));
127
euNode.getLeft().accept(this, context);
128
XMLQuery.append(endTag(XML_BEFORE) + startTag(XML_REACH));
129
euNode.getRight().accept(this, context);
130
XMLQuery.append(endTag(XML_REACH) + endTag(XML_UNTIL) + endTag(XML_EXISTSPATH));
133
public void visit(TCTLPathToStateConverter pathConverter, Object context) {
134
pathConverter.getProperty().accept(this, context);
137
public void visit(TCTLAndListNode andListNode, Object context) {
138
createList(andListNode.getProperties(), context, XML_CONJUNCTION);
141
public void visit(TCTLOrListNode orListNode, Object context) {
142
createList(orListNode.getProperties(), context, XML_DISJUNCTION);
145
public void visit(TCTLTermListNode termListNode, Object context) {
146
assert termListNode.getProperties().get(1) instanceof AritmeticOperator;
147
AritmeticOperator operator = (AritmeticOperator)termListNode.getProperties().get(1);
148
String op = operator.toString();
149
if (op.equals("+")) {
150
createList(termListNode.getProperties(), context, XML_INTEGERSUM);
151
} else if (op.equals("*")) {
152
createList(termListNode.getProperties(), context, XML_INTEGERPRODUCT);
153
} else if (op.equals("-")) {
154
createList(termListNode.getProperties(), context, XML_INTEGERDIFFERENCE);
158
private void createList(List<TCTLAbstractStateProperty> properties, Object context, String seperator) {
159
XMLQuery.append(startTag(seperator));
161
for (TCTLAbstractStateProperty p : properties) {
162
p.accept(this, context);
165
XMLQuery.append(endTag(seperator));
168
public void visit(TCTLNotNode notNode, Object context) {
169
XMLQuery.append(startTag(XML_NEGATION));
170
notNode.getProperty().accept(this, context);
171
XMLQuery.append(endTag(XML_NEGATION));
174
public void visit(TCTLTrueNode tctlTrueNode, Object context) {
175
XMLQuery.append(emptyElement(XML_TRUE));
178
public void visit(TCTLFalseNode tctlFalseNode, Object context) {
179
XMLQuery.append(emptyElement(XML_FALSE));
182
public void visit(TCTLDeadlockNode tctlDeadLockNode, Object context) {
183
XMLQuery.append(emptyElement(XML_DEADLOCK));
186
public void visit(TCTLConstNode tctlConstNode, Object context){
187
XMLQuery.append(wrapInTag(String.valueOf(tctlConstNode.getConstant()) + "", XML_INTEGERCONSTANT));
190
public void visit(TCTLPlaceNode tctlPlaceNode, Object context){
191
XMLQuery.append(startTag(XML_TOKENSCOUNT));
192
XMLQuery.append(wrapInTag(tctlPlaceNode.toString() + "", XML_PLACE));
193
XMLQuery.append(endTag(XML_TOKENSCOUNT));
196
public void visit(TCTLTransitionNode tctlTransitionNode, Object context){
197
XMLQuery.append(startTag(XML_ISFIREABLE));
198
XMLQuery.append(wrapInTag(tctlTransitionNode.toString() + "", XML_TRANSITION));
199
XMLQuery.append(endTag(XML_ISFIREABLE));
203
public void visit(TCTLAtomicPropositionNode atomicPropositionNode,
205
String opTest = atomicPropositionNode.getOp();
206
String op = new String();
208
if (opTest.equals("<")){
210
} else if(opTest.equals("<=")){
212
} else if(opTest.equals("=")){
214
} else if(opTest.equals("!=")){
216
} else if(opTest.equals(">")){
218
} else if(opTest.equals(">=")){
221
op = "MISSING_OPERATOR";
224
XMLQuery.append(startTag(op));
225
atomicPropositionNode.getLeft().accept(this, context);
226
atomicPropositionNode.getRight().accept(this, context);
227
XMLQuery.append(endTag(op));
230
private String wrapInTag(String str, String tag){
231
return startTag(tag) + str + endTag(tag);
233
private String startTag(String tag){
234
return "<" + tag + ">";
236
private String endTag(String tag){
237
return "</" + tag + ">";
239
private String emptyElement(String tag){
240
return startTag(tag + "/");