1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package it.jnrpe.server.plugins;
17
18 import java.io.File;
19 import java.io.IOException;
20 import java.net.URL;
21 import java.net.URLClassLoader;
22 import java.security.AccessController;
23 import java.security.PrivilegedAction;
24 import java.util.List;
25 import java.util.jar.JarFile;
26
27
28
29
30
31
32
33
34 class JNRPEClassLoader extends ClassLoader {
35
36
37
38 private List<URL> classLoaderUrlList;
39
40
41
42
43 private ChildURLClassLoader childClassLoader;
44
45
46
47
48 private static class FindClassClassLoader extends ClassLoader {
49
50
51
52
53
54
55
56 public FindClassClassLoader(final ClassLoader parent) {
57 super(parent);
58 }
59
60 @Override
61 public Class<?> findClass(final String name)
62 throws ClassNotFoundException {
63 return super.findClass(name);
64 }
65 }
66
67
68
69
70
71
72 private static class ChildURLClassLoader extends URLClassLoader {
73
74
75
76 private final FindClassClassLoader realParent;
77
78
79
80
81
82
83
84
85
86 public ChildURLClassLoader(final URL[] urls,
87 final FindClassClassLoader parent) {
88 super(urls, null);
89
90 this.realParent = parent;
91 }
92
93 @Override
94 public Class<?> findClass(final String name)
95 throws ClassNotFoundException {
96 try {
97
98 return super.findClass(name);
99 } catch (ClassNotFoundException e) {
100
101
102 return realParent.loadClass(name);
103 }
104 }
105 }
106
107
108
109
110
111
112
113 public JNRPEClassLoader(final List<URL> classpath) {
114 super(Thread.currentThread().getContextClassLoader());
115 classLoaderUrlList = classpath;
116
117 final URL[] urls = classpath.toArray(new URL[classpath.size()]);
118
119 final ClassLoader parent = getParent();
120
121 childClassLoader = AccessController
122 .doPrivileged(new PrivilegedAction<ChildURLClassLoader>() {
123 public ChildURLClassLoader run() {
124 return new ChildURLClassLoader(urls,
125 new FindClassClassLoader(parent));
126 }
127
128 });
129
130
131 }
132
133 @Override
134 protected synchronized Class<?> loadClass(final String name,
135 final boolean resolve) throws ClassNotFoundException {
136 try {
137
138 return childClassLoader.findClass(name);
139 } catch (ClassNotFoundException e) {
140
141 return super.loadClass(name, resolve);
142 }
143 }
144
145 @Override
146 protected URL findResource(final String name) {
147
148 JarFile jf = null;
149 try {
150 for (URL u : classLoaderUrlList) {
151 jf = new JarFile(u.getFile());
152 String resourceUrl = "jar:" + new File(u.getFile()).toURI()
153 + "!/" + name;
154 if (jf.getEntry("jnrpe_plugins.xml") != null) {
155 return new URL(resourceUrl);
156 }
157
158 if (jf.getEntry("plugin.xml") != null) {
159 return new URL(resourceUrl);
160 }
161 }
162 return null;
163 } catch (IOException e) {
164 throw new RuntimeException(e.getMessage(), e);
165 } finally {
166 if (jf != null) {
167 try {
168 jf.close();
169 } catch (IOException e) {
170 e.printStackTrace();
171 }
172 }
173 }
174 }
175 }