/
Expr2SpELListener.java
86 lines (69 loc) · 2.03 KB
/
Expr2SpELListener.java
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
package eu.objectivum.so59078288;
import org.antlr.v4.runtime.tree.TerminalNode;
import static eu.objectivum.so59078288.ExprParser.*;
/**
* @author <a href="mailto:Octavian.NITA@ext.ec.europa.eu">Octavian NITA</a>
* @version $Id$
*/
public class Expr2SpELListener extends ExprBaseListener {
private StringBuilder output;
public Expr2SpELListener() {
setOutput(null);
}
public Expr2SpELListener(StringBuilder output) {
setOutput(output);
}
public Expr2SpELListener setOutput(StringBuilder output) {
this.output = output == null ? new StringBuilder() : output;
return this;
}
public String getOutput() {
return output.toString();
}
@Override
public String toString() {
return getOutput();
}
@Override
public void enterRelExpr(RelExprContext ctx) {
if (ctx.EQ() == null) {
return; // currently, handle only '='
}
var stringCmp = false;
final var leftTk = ctx.getStart();
var leftOp = leftTk.getText();
if (leftTk.getType() == STRING) {
stringCmp = true;
leftOp = exprToSpELQuotes(leftOp);
}
final var rightTk = ctx.getStop();
var rightOp = rightTk.getText();
if (rightTk.getType() == STRING) {
stringCmp = true;
rightOp = exprToSpELQuotes(rightOp);
}
// Don't generate string comparison when an operator is INT
stringCmp &= leftTk.getType() != INT && rightTk.getType() != INT;
if (stringCmp) {
output.append(leftOp).append(".equalsIgnoreCase(").append(rightOp).append(")");
} else {
output.append(leftOp).append(" eq ").append(rightOp);
}
}
private static String exprToSpELQuotes(String quotedExprStr) {
return quotedExprStr == null ? null : '"' + quotedExprStr.substring(1, quotedExprStr.length() - 1) + '"';
}
@Override
public void visitTerminal(TerminalNode node) {
final var tk = node.getSymbol();
switch (tk.getType()) {
case LPAREN:
case RPAREN:
output.append(tk.getText());
break;
case AND:
output.append(" and ");
break;
}
}
}