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