1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.jexl3;
19
20 import org.apache.commons.jexl3.internal.Script;
21
22
23
24
25
26 public class JexlInfo {
27
28
29
30
31 public interface Detail {
32
33
34
35
36 int end();
37
38
39
40
41
42 int start();
43
44
45
46
47
48 @Override
49 String toString();
50 }
51
52
53
54
55
56
57 public static JexlInfo from(final JexlScript script) {
58 return script instanceof Script? ((Script) script).getInfo() : null;
59 }
60
61
62 private final int line;
63
64
65 private final int column;
66
67
68 private final String name;
69
70
71
72
73
74
75 public JexlInfo() {
76 final StackTraceElement[] stack = new Throwable().getStackTrace();
77 String cname = getClass().getName();
78 final String pkgname = getClass().getPackage().getName();
79 StackTraceElement se = null;
80 for (int s = 1; s < stack.length; ++s) {
81 se = stack[s];
82 final String className = se.getClassName();
83 if (!className.equals(cname)) {
84
85 if (!className.startsWith(pkgname + ".internal.") && !className.startsWith(pkgname + ".Jexl")
86 && !className.startsWith(pkgname + ".parser")) {
87 break;
88 }
89 cname = className;
90 }
91 }
92 this.name = se != null ? se.getClassName() + "." + se.getMethodName() + ":" + se.getLineNumber() : "?";
93 this.line = 1;
94 this.column = 1;
95 }
96
97
98
99
100
101
102 protected JexlInfo(final JexlInfo copy) {
103 this(copy.getName(), copy.getLine(), copy.getColumn());
104 }
105
106
107
108
109
110
111
112
113 public JexlInfo(final String source, final int l, final int c) {
114 name = source;
115 line = l <= 0? 1: l;
116 column = c <= 0? 1 : c;
117 }
118
119
120
121
122
123
124
125
126 public JexlInfo at(final int l, final int c) {
127 return new JexlInfo(name, l, c);
128 }
129
130
131
132
133
134 public JexlInfo detach() {
135 return this;
136 }
137
138
139
140
141
142
143 public final int getColumn() {
144 return column;
145 }
146
147
148
149
150
151 public Detail getDetail() {
152 return null;
153 }
154
155
156
157
158
159
160 public final int getLine() {
161 return line;
162 }
163
164
165
166
167
168
169 public final String getName() {
170 return name;
171 }
172
173
174
175
176
177
178 @Override
179 public String toString() {
180 final StringBuilder sb = new StringBuilder(name != null ? name : "");
181 sb.append("@");
182 sb.append(line);
183 sb.append(":");
184 sb.append(column);
185 final JexlInfo.Detail dbg = getDetail();
186 if (dbg!= null) {
187 sb.append("![");
188 sb.append(dbg.start());
189 sb.append(",");
190 sb.append(dbg.end());
191 sb.append("]: '");
192 sb.append(dbg.toString());
193 sb.append("'");
194 }
195 return sb.toString();
196 }
197 }
198