1 | /* |
2 | * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. |
8 | * |
9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
12 | * version 2 for more details (a copy is included in the LICENSE file that |
13 | * accompanied this code). |
14 | * |
15 | * You should have received a copy of the GNU General Public License version |
16 | * 2 along with this work; if not, write to the Free Software Foundation, |
17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
18 | * |
19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
20 | * or visit www.oracle.com if you need additional information or have any |
21 | * questions. |
22 | * |
23 | */ |
24 | |
25 | #ifndef SHARE_CLASSFILE_CLASSLOADEREXT_HPP |
26 | #define SHARE_CLASSFILE_CLASSLOADEREXT_HPP |
27 | |
28 | #include "classfile/classLoader.hpp" |
29 | #include "classfile/moduleEntry.hpp" |
30 | #include "utilities/macros.hpp" |
31 | |
32 | class ClassListParser; |
33 | |
34 | class ClassLoaderExt: public ClassLoader { // AllStatic |
35 | public: |
36 | static bool should_verify(int classpath_index) { |
37 | CDS_ONLY(return (classpath_index >= _app_class_paths_start_index);) |
38 | NOT_CDS(return false;) |
39 | } |
40 | |
41 | #if INCLUDE_CDS |
42 | private: |
43 | enum SomeConstants { |
44 | max_classpath_index = 0x7fff |
45 | }; |
46 | |
47 | static char* get_class_path_attr(const char* jar_path, char* manifest, jint manifest_size); |
48 | static void setup_app_search_path(); // Only when -Xshare:dump |
49 | static void process_module_table(ModuleEntryTable* met, TRAPS); |
50 | static SharedPathsMiscInfo* shared_paths_misc_info() { |
51 | return (SharedPathsMiscInfo*)_shared_paths_misc_info; |
52 | } |
53 | // index of first app JAR in shared classpath entry table |
54 | static jshort _app_class_paths_start_index; |
55 | // index of first modular JAR in shared modulepath entry table |
56 | static jshort _app_module_paths_start_index; |
57 | // the largest path index being used during CDS dump time |
58 | static jshort _max_used_path_index; |
59 | |
60 | static bool _has_app_classes; |
61 | static bool _has_platform_classes; |
62 | |
63 | static char* read_manifest(ClassPathEntry* entry, jint *manifest_size, bool clean_text, TRAPS); |
64 | static ClassPathEntry* find_classpath_entry_from_cache(const char* path, TRAPS); |
65 | |
66 | public: |
67 | static void process_jar_manifest(ClassPathEntry* entry, bool check_for_duplicates); |
68 | |
69 | // Called by JVMTI code to add boot classpath |
70 | static void append_boot_classpath(ClassPathEntry* new_entry); |
71 | |
72 | static void setup_search_paths(); |
73 | static void setup_module_paths(TRAPS); |
74 | |
75 | static char* read_manifest(ClassPathEntry* entry, jint *manifest_size, TRAPS) { |
76 | // Remove all the new-line continuations (which wrap long lines at 72 characters, see |
77 | // http://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#JAR%20Manifest), so |
78 | // that the manifest is easier to parse. |
79 | return read_manifest(entry, manifest_size, true, THREAD); |
80 | } |
81 | static char* read_raw_manifest(ClassPathEntry* entry, jint *manifest_size, TRAPS) { |
82 | // Do not remove new-line continuations, so we can easily pass it as an argument to |
83 | // java.util.jar.Manifest.getManifest() at run-time. |
84 | return read_manifest(entry, manifest_size, false, THREAD); |
85 | } |
86 | |
87 | static void finalize_shared_paths_misc_info(); |
88 | |
89 | static jshort app_class_paths_start_index() { return _app_class_paths_start_index; } |
90 | |
91 | static jshort app_module_paths_start_index() { return _app_module_paths_start_index; } |
92 | |
93 | static jshort max_used_path_index() { return _max_used_path_index; } |
94 | |
95 | static void set_max_used_path_index(jshort used_index) { |
96 | _max_used_path_index = used_index; |
97 | } |
98 | |
99 | static void init_paths_start_index(jshort app_start) { |
100 | _app_class_paths_start_index = app_start; |
101 | } |
102 | |
103 | static void init_app_module_paths_start_index(jshort module_start) { |
104 | _app_module_paths_start_index = module_start; |
105 | } |
106 | |
107 | static bool is_boot_classpath(int classpath_index) { |
108 | return classpath_index < _app_class_paths_start_index; |
109 | } |
110 | |
111 | static bool has_platform_or_app_classes() { |
112 | return _has_app_classes || _has_platform_classes; |
113 | } |
114 | |
115 | static void record_result(const s2 classpath_index, |
116 | InstanceKlass* result, TRAPS); |
117 | static InstanceKlass* load_class(Symbol* h_name, const char* path, TRAPS); |
118 | static void set_has_app_classes() { |
119 | _has_app_classes = true; |
120 | } |
121 | static void set_has_platform_classes() { |
122 | _has_platform_classes = true; |
123 | } |
124 | #endif |
125 | }; |
126 | |
127 | #endif // SHARE_CLASSFILE_CLASSLOADEREXT_HPP |
128 | |