-
-
Notifications
You must be signed in to change notification settings - Fork 74
/
Copy pathParseException.java
132 lines (121 loc) · 4.23 KB
/
ParseException.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package net.minidev.json.parser;
/*
* Copyright 2011-2023 JSON-SMART authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* ParseException explains why and where the error occurs in source JSON text.
*
* @author Uriel Chemouni <uchemouni@gmail.com>
*/
public class ParseException extends Exception {
private static final long serialVersionUID = 8879024178584091857L;
public static final int ERROR_UNEXPECTED_CHAR = 0;
public static final int ERROR_UNEXPECTED_TOKEN = 1;
public static final int ERROR_UNEXPECTED_EXCEPTION = 2;
public static final int ERROR_UNEXPECTED_EOF = 3;
public static final int ERROR_UNEXPECTED_UNICODE = 4;
public static final int ERROR_UNEXPECTED_DUPLICATE_KEY = 5;
public static final int ERROR_UNEXPECTED_LEADING_0 = 6;
public static final int ERROR_UNEXPECTED_JSON_DEPTH = 7;
private int errorType;
private Object unexpectedObject;
private int position;
public ParseException(int position, int errorType, Object unexpectedObject) {
super(toMessage(position, errorType, unexpectedObject));
this.position = position;
this.errorType = errorType;
this.unexpectedObject = unexpectedObject;
}
public ParseException(int position, Throwable cause) {
super(toMessage(position, ERROR_UNEXPECTED_EXCEPTION, cause), cause);
this.position = position;
this.errorType = ERROR_UNEXPECTED_EXCEPTION;
this.unexpectedObject = cause;
}
public int getErrorType() {
return errorType;
}
/**
* @return The character position (starting with 0) of the input where the
* error occurs.
*/
public int getPosition() {
return position;
}
/**
* @return One of the following base on the value of errorType:
* ERROR_UNEXPECTED_CHAR java.lang.Character ERROR_UNEXPECTED_TOKEN
* ERROR_UNEXPECTED_EXCEPTION java.lang.Exception
*/
public Object getUnexpectedObject() {
return unexpectedObject;
}
private static String toMessage(int position, int errorType, Object unexpectedObject) {
StringBuilder sb = new StringBuilder();
if (errorType == ERROR_UNEXPECTED_CHAR) {
sb.append("Unexpected character (");
sb.append(unexpectedObject);
sb.append(") at position ");
sb.append(position);
sb.append(".");
} else if (errorType == ERROR_UNEXPECTED_TOKEN) {
sb.append("Unexpected token ");
sb.append(unexpectedObject);
sb.append(" at position ");
sb.append(position);
sb.append(".");
} else if (errorType == ERROR_UNEXPECTED_EXCEPTION) {
sb.append("Unexpected exception ");
sb.append(unexpectedObject);
sb.append(" occur at position ");
sb.append(position);
sb.append(".");
} else if (errorType == ERROR_UNEXPECTED_EOF) {
sb.append("Unexpected End Of File position ");
sb.append(position);
sb.append(": ");
sb.append(unexpectedObject);
} else if (errorType == ERROR_UNEXPECTED_UNICODE) {
sb.append("Unexpected unicode escape sequence ");
sb.append(unexpectedObject);
sb.append(" at position ");
sb.append(position);
sb.append(".");
} else if (errorType == ERROR_UNEXPECTED_DUPLICATE_KEY) {
sb.append("Unexpected duplicate key:");
sb.append(unexpectedObject);
sb.append(" at position ");
sb.append(position);
sb.append(".");
} else if (errorType == ERROR_UNEXPECTED_LEADING_0) {
sb.append("Unexpected leading 0 in digit for token:");
sb.append(unexpectedObject);
sb.append(" at position ");
sb.append(position);
sb.append(".");
} else if (errorType == ERROR_UNEXPECTED_JSON_DEPTH) {
sb.append("Malicious payload, having non natural depths, parsing stoped on ");
sb.append(unexpectedObject);
sb.append(" at position ");
sb.append(position);
sb.append(".");
} else {
sb.append("Unkown error at position ");
sb.append(position);
sb.append(".");
}
return sb.toString();
}
}