1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j.chainsaw.help;
19
20 import org.apache.log4j.LogManager;
21 import org.apache.log4j.Logger;
22 import org.apache.log4j.chainsaw.messages.MessageCenter;
23
24 import java.net.MalformedURLException;
25 import java.net.URL;
26 import java.net.URLClassLoader;
27 import java.util.ArrayList;
28 import java.util.Arrays;
29 import java.util.List;
30
31
32
33
34
35
36
37
38 class HelpLocator {
39 private List<ClassLoader> classLoaders = new ArrayList<>();
40 private static Logger logger = LogManager.getLogger(HelpLocator.class);
41
42 HelpLocator() {
43 }
44
45
46
47
48 void installClassloaderLocator(ClassLoader cl) {
49 classLoaders.add(cl);
50 }
51
52
53
54
55
56
57 void installLocator(URL url) {
58 try {
59 classLoaders.add(new HelpResourceLoader(url));
60 } catch (Exception e) {
61 MessageCenter.getInstance().getLogger().error(
62 "Failed to setup the resoure loaders for the Help Subsystem");
63 }
64 }
65
66
67
68
69
70
71 URL findResource(String name) {
72 URL url = null;
73
74 for (Object classLoader : classLoaders) {
75 ClassLoader loader = (ClassLoader) classLoader;
76 url = loader.getResource(name);
77
78 if (url != null) {
79 break;
80 }
81 }
82
83 return url;
84 }
85
86 private static class HelpResourceLoader extends ClassLoader {
87 private URL root;
88
89 private HelpResourceLoader(URL root) {
90 this.root = root;
91 }
92
93
94
95
96
97
98 protected URL findResource(String name) {
99 URL url = super.findResource(name);
100
101 if (url != null) {
102 return url;
103 }
104
105 try {
106 URL resourceURL = new URL(root, name);
107 URL[] urlArray = new URL[]{root, resourceURL};
108 logger.debug("Looking for Help resource at:" + resourceURL.toExternalForm());
109 logger.debug("urlArray=" + Arrays.asList(urlArray));
110 return new URLClassLoader(
111 urlArray).findResource(
112 name);
113 } catch (MalformedURLException e) {
114 e.printStackTrace();
115 }
116
117 return null;
118 }
119 }
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 }