Lines 19-27
Link Here
|
19 |
import java.lang.reflect.Field; |
19 |
import java.lang.reflect.Field; |
20 |
import java.lang.reflect.Method; |
20 |
import java.lang.reflect.Method; |
21 |
import java.lang.reflect.Modifier; |
21 |
import java.lang.reflect.Modifier; |
22 |
import java.util.ArrayList; |
22 |
import java.util.Collections; |
23 |
import java.util.List; |
23 |
import java.util.HashMap; |
|
|
24 |
import java.util.HashSet; |
24 |
import java.util.Map; |
25 |
import java.util.Map; |
|
|
26 |
import java.util.Set; |
25 |
import java.util.concurrent.ConcurrentHashMap; |
27 |
import java.util.concurrent.ConcurrentHashMap; |
26 |
|
28 |
|
27 |
/** |
29 |
/** |
Lines 29-35
Link Here
|
29 |
*/ |
31 |
*/ |
30 |
public class ImportHandler { |
32 |
public class ImportHandler { |
31 |
|
33 |
|
32 |
private List<String> packageNames = new ArrayList<>(); |
34 |
private static final Map<String,Set<String>> standardPackages = new HashMap<>(); |
|
|
35 |
|
36 |
static { |
37 |
// Servlet 4.0 |
38 |
Set<String> servletClassNames = new HashSet<>(); |
39 |
// Interfaces |
40 |
servletClassNames.add("AsyncContext"); |
41 |
servletClassNames.add("AsyncListener"); |
42 |
servletClassNames.add("Filter"); |
43 |
servletClassNames.add("FilterChain"); |
44 |
servletClassNames.add("FilterConfig"); |
45 |
servletClassNames.add("FilterRegistration"); |
46 |
servletClassNames.add("FilterRegistration.Dynamic"); |
47 |
servletClassNames.add("ReadListener"); |
48 |
servletClassNames.add("Registration"); |
49 |
servletClassNames.add("Registration.Dynamic"); |
50 |
servletClassNames.add("RequestDispatcher"); |
51 |
servletClassNames.add("Servlet"); |
52 |
servletClassNames.add("ServletConfig"); |
53 |
servletClassNames.add("ServletContainerInitializer"); |
54 |
servletClassNames.add("ServletContext"); |
55 |
servletClassNames.add("ServletContextAttributeListener"); |
56 |
servletClassNames.add("ServletContextListener"); |
57 |
servletClassNames.add("ServletRegistration"); |
58 |
servletClassNames.add("ServletRegistration.Dynamic"); |
59 |
servletClassNames.add("ServletRequest"); |
60 |
servletClassNames.add("ServletRequestAttributeListener"); |
61 |
servletClassNames.add("ServletRequestListener"); |
62 |
servletClassNames.add("ServletResponse"); |
63 |
servletClassNames.add("SessionCookieConfig"); |
64 |
servletClassNames.add("SingleThreadModel"); |
65 |
servletClassNames.add("WriteListener"); |
66 |
// Classes |
67 |
servletClassNames.add("AsyncEvent"); |
68 |
servletClassNames.add("GenericFilter"); |
69 |
servletClassNames.add("GenericServlet"); |
70 |
servletClassNames.add("HttpConstraintElement"); |
71 |
servletClassNames.add("HttpMethodConstraintElement"); |
72 |
servletClassNames.add("MultipartConfigElement"); |
73 |
servletClassNames.add("ServletContextAttributeEvent"); |
74 |
servletClassNames.add("ServletContextEvent"); |
75 |
servletClassNames.add("ServletInputStream"); |
76 |
servletClassNames.add("ServletOutputStream"); |
77 |
servletClassNames.add("ServletRequestAttributeEvent"); |
78 |
servletClassNames.add("ServletRequestEvent"); |
79 |
servletClassNames.add("ServletRequestWrapper"); |
80 |
servletClassNames.add("ServletResponseWrapper"); |
81 |
servletClassNames.add("ServletSecurityElement"); |
82 |
// Enums |
83 |
servletClassNames.add("DispatcherType"); |
84 |
servletClassNames.add("SessionTrackingMode"); |
85 |
// Exceptions |
86 |
servletClassNames.add("ServletException"); |
87 |
servletClassNames.add("UnavailableException"); |
88 |
standardPackages.put("javax.servlet", servletClassNames); |
89 |
|
90 |
// Servlet 4.0 |
91 |
Set<String> servletHttpClassNames = new HashSet<>(); |
92 |
// Interfaces |
93 |
servletHttpClassNames.add("HttpServletMapping"); |
94 |
servletHttpClassNames.add("HttpServletRequest"); |
95 |
servletHttpClassNames.add("HttpServletResponse"); |
96 |
servletHttpClassNames.add("HttpSession"); |
97 |
servletHttpClassNames.add("HttpSessionActivationListener"); |
98 |
servletHttpClassNames.add("HttpSessionAttributeListener"); |
99 |
servletHttpClassNames.add("HttpSessionBindingListener"); |
100 |
servletHttpClassNames.add("HttpSessionContext"); |
101 |
servletHttpClassNames.add("HttpSessionIdListener"); |
102 |
servletHttpClassNames.add("HttpSessionListener"); |
103 |
servletHttpClassNames.add("HttpUpgradeHandler"); |
104 |
servletHttpClassNames.add("Part"); |
105 |
servletHttpClassNames.add("PushBuilder"); |
106 |
servletHttpClassNames.add("WebConnection"); |
107 |
// Classes |
108 |
servletHttpClassNames.add("Cookie"); |
109 |
servletHttpClassNames.add("HttpFilter"); |
110 |
servletHttpClassNames.add("HttpServlet"); |
111 |
servletHttpClassNames.add("HttpServletRequestWrapper"); |
112 |
servletHttpClassNames.add("HttpServletResponseWrapper"); |
113 |
servletHttpClassNames.add("HttpSessionBindingEvent"); |
114 |
servletHttpClassNames.add("HttpSessionEvent"); |
115 |
servletHttpClassNames.add("HttpUtils"); |
116 |
// Enums |
117 |
servletHttpClassNames.add("MappingMatch"); |
118 |
standardPackages.put("javax.servlet.http", servletHttpClassNames); |
119 |
|
120 |
// JSP 2.3 |
121 |
Set<String> servletJspClassNames = new HashSet<>(); |
122 |
//Interfaces |
123 |
servletJspClassNames.add("HttpJspPage"); |
124 |
servletJspClassNames.add("JspApplicationContext"); |
125 |
servletJspClassNames.add("JspPage"); |
126 |
// Classes |
127 |
servletJspClassNames.add("ErrorData"); |
128 |
servletJspClassNames.add("JspContext"); |
129 |
servletJspClassNames.add("JspEngineInfo"); |
130 |
servletJspClassNames.add("JspFactory"); |
131 |
servletJspClassNames.add("JspWriter"); |
132 |
servletJspClassNames.add("PageContext"); |
133 |
servletJspClassNames.add("Exceptions"); |
134 |
servletJspClassNames.add("JspException"); |
135 |
servletJspClassNames.add("JspTagException"); |
136 |
servletJspClassNames.add("SkipPageException"); |
137 |
standardPackages.put("javax.servlet.jsp", servletJspClassNames); |
138 |
|
139 |
Set<String> javaLangClassNames = new HashSet<>(); |
140 |
// Taken from Java 11 EA18 Javadoc |
141 |
// Interfaces |
142 |
javaLangClassNames.add("Appendable"); |
143 |
javaLangClassNames.add("AutoCloseable"); |
144 |
javaLangClassNames.add("CharSequence"); |
145 |
javaLangClassNames.add("Cloneable"); |
146 |
javaLangClassNames.add("Comparable"); |
147 |
javaLangClassNames.add("Iterable"); |
148 |
javaLangClassNames.add("ProcessHandle"); |
149 |
javaLangClassNames.add("ProcessHandle.Info"); |
150 |
javaLangClassNames.add("Readable"); |
151 |
javaLangClassNames.add("Runnable"); |
152 |
javaLangClassNames.add("StackWalker.StackFrame"); |
153 |
javaLangClassNames.add("System.Logger"); |
154 |
javaLangClassNames.add("Thread.UncaughtExceptionHandler"); |
155 |
//Classes |
156 |
javaLangClassNames.add("Boolean"); |
157 |
javaLangClassNames.add("Byte"); |
158 |
javaLangClassNames.add("Character"); |
159 |
javaLangClassNames.add("Character.Subset"); |
160 |
javaLangClassNames.add("Character.UnicodeBlock"); |
161 |
javaLangClassNames.add("Class"); |
162 |
javaLangClassNames.add("ClassLoader"); |
163 |
javaLangClassNames.add("ClassValue"); |
164 |
javaLangClassNames.add("Compiler"); |
165 |
javaLangClassNames.add("Double"); |
166 |
javaLangClassNames.add("Enum"); |
167 |
javaLangClassNames.add("Float"); |
168 |
javaLangClassNames.add("InheritableThreadLocal"); |
169 |
javaLangClassNames.add("Integer"); |
170 |
javaLangClassNames.add("Long"); |
171 |
javaLangClassNames.add("Math"); |
172 |
javaLangClassNames.add("Module"); |
173 |
javaLangClassNames.add("ModuleLayer"); |
174 |
javaLangClassNames.add("ModuleLayer.Controller"); |
175 |
javaLangClassNames.add("Number"); |
176 |
javaLangClassNames.add("Object"); |
177 |
javaLangClassNames.add("Package"); |
178 |
javaLangClassNames.add("Process"); |
179 |
javaLangClassNames.add("ProcessBuilder"); |
180 |
javaLangClassNames.add("ProcessBuilder.Redirect"); |
181 |
javaLangClassNames.add("Runtime"); |
182 |
javaLangClassNames.add("Runtime.Version"); |
183 |
javaLangClassNames.add("RuntimePermission"); |
184 |
javaLangClassNames.add("SecurityManager"); |
185 |
javaLangClassNames.add("Short"); |
186 |
javaLangClassNames.add("StackTraceElement"); |
187 |
javaLangClassNames.add("StackWalker"); |
188 |
javaLangClassNames.add("StrictMath"); |
189 |
javaLangClassNames.add("String"); |
190 |
javaLangClassNames.add("StringBuffer"); |
191 |
javaLangClassNames.add("StringBuilder"); |
192 |
javaLangClassNames.add("System"); |
193 |
javaLangClassNames.add("System.LoggerFinder"); |
194 |
javaLangClassNames.add("Thread"); |
195 |
javaLangClassNames.add("ThreadGroup"); |
196 |
javaLangClassNames.add("ThreadLocal"); |
197 |
javaLangClassNames.add("Throwable"); |
198 |
javaLangClassNames.add("Void"); |
199 |
//Enums |
200 |
javaLangClassNames.add("Character.UnicodeScript"); |
201 |
javaLangClassNames.add("ProcessBuilder.Redirect.Type"); |
202 |
javaLangClassNames.add("StackWalker.Option"); |
203 |
javaLangClassNames.add("System.Logger.Level"); |
204 |
javaLangClassNames.add("Thread.State"); |
205 |
//Exceptions |
206 |
javaLangClassNames.add("ArithmeticException"); |
207 |
javaLangClassNames.add("ArrayIndexOutOfBoundsException"); |
208 |
javaLangClassNames.add("ArrayStoreException"); |
209 |
javaLangClassNames.add("ClassCastException"); |
210 |
javaLangClassNames.add("ClassNotFoundException"); |
211 |
javaLangClassNames.add("CloneNotSupportedException"); |
212 |
javaLangClassNames.add("EnumConstantNotPresentException"); |
213 |
javaLangClassNames.add("Exception"); |
214 |
javaLangClassNames.add("IllegalAccessException"); |
215 |
javaLangClassNames.add("IllegalArgumentException"); |
216 |
javaLangClassNames.add("IllegalCallerException"); |
217 |
javaLangClassNames.add("IllegalMonitorStateException"); |
218 |
javaLangClassNames.add("IllegalStateException"); |
219 |
javaLangClassNames.add("IllegalThreadStateException"); |
220 |
javaLangClassNames.add("IndexOutOfBoundsException"); |
221 |
javaLangClassNames.add("InstantiationException"); |
222 |
javaLangClassNames.add("InterruptedException"); |
223 |
javaLangClassNames.add("LayerInstantiationException"); |
224 |
javaLangClassNames.add("NegativeArraySizeException"); |
225 |
javaLangClassNames.add("NoSuchFieldException"); |
226 |
javaLangClassNames.add("NoSuchMethodException"); |
227 |
javaLangClassNames.add("NullPointerException"); |
228 |
javaLangClassNames.add("NumberFormatException"); |
229 |
javaLangClassNames.add("ReflectiveOperationException"); |
230 |
javaLangClassNames.add("RuntimeException"); |
231 |
javaLangClassNames.add("SecurityException"); |
232 |
javaLangClassNames.add("StringIndexOutOfBoundsException"); |
233 |
javaLangClassNames.add("TypeNotPresentException"); |
234 |
javaLangClassNames.add("UnsupportedOperationException"); |
235 |
//Errors |
236 |
javaLangClassNames.add("AbstractMethodError"); |
237 |
javaLangClassNames.add("AssertionError"); |
238 |
javaLangClassNames.add("BootstrapMethodError"); |
239 |
javaLangClassNames.add("ClassCircularityError"); |
240 |
javaLangClassNames.add("ClassFormatError"); |
241 |
javaLangClassNames.add("Error"); |
242 |
javaLangClassNames.add("ExceptionInInitializerError"); |
243 |
javaLangClassNames.add("IllegalAccessError"); |
244 |
javaLangClassNames.add("IncompatibleClassChangeError"); |
245 |
javaLangClassNames.add("InstantiationError"); |
246 |
javaLangClassNames.add("InternalError"); |
247 |
javaLangClassNames.add("LinkageError"); |
248 |
javaLangClassNames.add("NoClassDefFoundError"); |
249 |
javaLangClassNames.add("NoSuchFieldError"); |
250 |
javaLangClassNames.add("NoSuchMethodError"); |
251 |
javaLangClassNames.add("OutOfMemoryError"); |
252 |
javaLangClassNames.add("StackOverflowError"); |
253 |
javaLangClassNames.add("ThreadDeath"); |
254 |
javaLangClassNames.add("UnknownError"); |
255 |
javaLangClassNames.add("UnsatisfiedLinkError"); |
256 |
javaLangClassNames.add("UnsupportedClassVersionError"); |
257 |
javaLangClassNames.add("VerifyError"); |
258 |
javaLangClassNames.add("VirtualMachineError"); |
259 |
//Annotation Types |
260 |
javaLangClassNames.add("Deprecated"); |
261 |
javaLangClassNames.add("FunctionalInterface"); |
262 |
javaLangClassNames.add("Override"); |
263 |
javaLangClassNames.add("SafeVarargs"); |
264 |
javaLangClassNames.add("SuppressWarnings"); |
265 |
standardPackages.put("java.lang", javaLangClassNames); |
266 |
|
267 |
} |
268 |
|
269 |
private Map<String,Set<String>> packageNames = new ConcurrentHashMap<>(); |
33 |
private Map<String,String> classNames = new ConcurrentHashMap<>(); |
270 |
private Map<String,String> classNames = new ConcurrentHashMap<>(); |
34 |
private Map<String,Class<?>> clazzes = new ConcurrentHashMap<>(); |
271 |
private Map<String,Class<?>> clazzes = new ConcurrentHashMap<>(); |
35 |
private Map<String,Class<?>> statics = new ConcurrentHashMap<>(); |
272 |
private Map<String,Class<?>> statics = new ConcurrentHashMap<>(); |
Lines 127-133
Link Here
|
127 |
// a) for sake of performance when used in JSPs (BZ 57142), |
364 |
// a) for sake of performance when used in JSPs (BZ 57142), |
128 |
// b) java.lang.Package.getPackage(name) is not reliable (BZ 57574), |
365 |
// b) java.lang.Package.getPackage(name) is not reliable (BZ 57574), |
129 |
// c) such check is not required by specification. |
366 |
// c) such check is not required by specification. |
130 |
packageNames.add(name); |
367 |
Set<String> preloaded = standardPackages.get(name); |
|
|
368 |
if (preloaded == null) { |
369 |
packageNames.put(name, Collections.emptySet()); |
370 |
} else { |
371 |
packageNames.put(name, preloaded); |
372 |
} |
131 |
} |
373 |
} |
132 |
|
374 |
|
133 |
|
375 |
|
Lines 159-166
Link Here
|
159 |
|
401 |
|
160 |
// Search the package imports - note there may be multiple matches |
402 |
// Search the package imports - note there may be multiple matches |
161 |
// (which correctly triggers an error) |
403 |
// (which correctly triggers an error) |
162 |
for (String p : packageNames) { |
404 |
for (Map.Entry<String,Set<String>> entry : packageNames.entrySet()) { |
163 |
className = p + '.' + name; |
405 |
if (!entry.getValue().isEmpty()) { |
|
|
406 |
// Standard package where we know all the class names |
407 |
if (!entry.getValue().contains(name)) { |
408 |
// Requested name isn't in the list so it isn't in this |
409 |
// package so move on to next package. This allows the |
410 |
// class loader look-up to be skipped. |
411 |
continue; |
412 |
} |
413 |
} |
414 |
className = entry.getKey() + '.' + name; |
164 |
Class<?> clazz = findClass(className, false); |
415 |
Class<?> clazz = findClass(className, false); |
165 |
if (clazz != null) { |
416 |
if (clazz != null) { |
166 |
if (result != null) { |
417 |
if (result != null) { |