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 package info.magnolia.freemarker;
35
36 import info.magnolia.cms.util.ClasspathResourcesUtil;
37
38 import java.beans.PropertyDescriptor;
39 import java.io.File;
40 import java.io.FileInputStream;
41 import java.io.FileNotFoundException;
42 import java.io.InputStream;
43 import java.net.MalformedURLException;
44 import java.net.URL;
45 import java.net.URLClassLoader;
46 import java.util.Enumeration;
47 import java.util.HashSet;
48 import java.util.List;
49 import java.util.Set;
50
51 import javax.servlet.RequestDispatcher;
52 import javax.servlet.Servlet;
53 import javax.servlet.ServletContext;
54 import javax.servlet.ServletException;
55
56 import org.apache.commons.io.FileUtils;
57 import org.apache.commons.lang.StringUtils;
58 import org.slf4j.Logger;
59 import org.slf4j.LoggerFactory;
60
61
62
63
64
65
66
67 public class FreemarkerServletContextWrapper implements ServletContext {
68
69 private final ServletContext parentContext;
70
71
72
73
74 private static Logger log = LoggerFactory.getLogger(FreemarkerServletContextWrapper.class);
75
76 public FreemarkerServletContextWrapper(ServletContext parentServletContext) {
77
78 this.parentContext = parentServletContext;
79 }
80
81 @Override
82 public URL getResource(String path) throws MalformedURLException {
83
84 URL result = parentContext.getResource(path);
85 if (result == null) {
86
87 File file = new File(path);
88 if ((file.exists()) && (file.isFile())) {
89 result = file.toURI().toURL();
90 }
91 }
92 return result;
93 }
94
95 @Override
96 public InputStream getResourceAsStream(String path) {
97 InputStream is = parentContext.getResourceAsStream(path);
98 if (is == null) {
99
100 File file = new File(path);
101 if ((file.exists()) && (file.isFile())) {
102 try {
103 return new FileInputStream(file);
104 }
105 catch (FileNotFoundException e) {
106
107 }
108 }
109 }
110 return is;
111 }
112
113 @Override
114 @SuppressWarnings({"unchecked", "rawtypes"})
115 public Set getResourcePaths(String path) {
116 if (StringUtils.equals(path, "/WEB-INF/lib")) {
117 log.debug("returning resources from classpath");
118
119 final Set<String> resources = new HashSet<String>();
120 final ClassLoader cl = Thread.currentThread().getContextClassLoader();
121
122
123 if (cl instanceof URLClassLoader) {
124 final URLClassLoader urlClassLoader = (URLClassLoader) cl;
125 final URL[] urls = urlClassLoader.getURLs();
126 for (int j = 0; j < urls.length; j++) {
127 final File tofile = ClasspathResourcesUtil.sanitizeToFile(urls[j]);
128 if (tofile.isDirectory()) {
129 for (File file : ((List<File>) FileUtils.listFiles(tofile, null, true))) {
130 resources.add(file.getAbsolutePath());
131 }
132 }
133 else {
134 resources.add(tofile.getAbsolutePath());
135 }
136 }
137
138 return resources;
139 }
140 try {
141
142
143
144
145
146
147 PropertyDescriptor pd = new PropertyDescriptor("classPath", cl.getClass());
148 if (pd != null && pd.getReadMethod() != null) {
149 String classpath = (String) pd.getReadMethod().invoke(cl, new Object[]{});
150 if (StringUtils.isNotBlank(classpath)) {
151 String[] paths = StringUtils.split(classpath, File.pathSeparator);
152 for (int j = 0; j < paths.length; j++) {
153 final File tofile = new File(paths[j]);
154
155 if (tofile.exists()) {
156 if (tofile.isDirectory()) {
157 for (File file : ((List<File>) FileUtils.listFiles(tofile, null, true))) {
158 resources.add(file.getAbsolutePath());
159 }
160 }
161 else {
162 resources.add(tofile.getAbsolutePath());
163 }
164 }
165 }
166 return resources;
167 }
168 }
169 }
170 catch (Throwable e) {
171
172 }
173
174
175 }
176 return parentContext.getResourcePaths(path);
177 }
178
179
180 @Override
181 public Object getAttribute(String name) {
182 return parentContext.getAttribute(name);
183 }
184
185 @SuppressWarnings("rawtypes")
186 @Override
187 public Enumeration getAttributeNames() {
188 return parentContext.getAttributeNames();
189 }
190
191 @Override
192 public ServletContext getContext(String uripath) {
193 return parentContext.getContext(uripath);
194 }
195
196 @Override
197 public String getContextPath() {
198 return parentContext.getContextPath();
199 }
200
201 @Override
202 public String getInitParameter(String name) {
203 return parentContext.getInitParameter(name);
204 }
205
206 @SuppressWarnings("rawtypes")
207 @Override
208 public Enumeration getInitParameterNames() {
209 return parentContext.getInitParameterNames();
210 }
211
212 @Override
213 public int getMajorVersion() {
214 return parentContext.getMajorVersion();
215 }
216
217 @Override
218 public String getMimeType(String file) {
219 return parentContext.getMimeType(file);
220 }
221
222 @Override
223 public int getMinorVersion() {
224 return parentContext.getMinorVersion();
225 }
226
227 @Override
228 public RequestDispatcher getNamedDispatcher(String name) {
229 return parentContext.getNamedDispatcher(name);
230 }
231
232 @Override
233 public String getRealPath(String path) {
234 return parentContext.getRealPath(path);
235 }
236
237 @Override
238 public RequestDispatcher getRequestDispatcher(String path) {
239 return parentContext.getRequestDispatcher(path);
240 }
241
242 @Override
243 public String getServerInfo() {
244 return parentContext.getServerInfo();
245 }
246
247 @SuppressWarnings("deprecation")
248 @Override
249 public Servlet getServlet(String name) throws ServletException {
250 return parentContext.getServlet(name);
251 }
252
253 @Override
254 public String getServletContextName() {
255 return parentContext.getServletContextName();
256 }
257
258 @SuppressWarnings({"rawtypes", "deprecation"})
259 @Override
260 public Enumeration getServletNames() {
261 return parentContext.getServletNames();
262 }
263
264 @SuppressWarnings({"rawtypes", "deprecation"})
265 @Override
266 public Enumeration getServlets() {
267 return parentContext.getServlets();
268 }
269
270 @Override
271 public void log(String msg) {
272 parentContext.log(msg);
273 }
274
275 @SuppressWarnings("deprecation")
276 @Override
277 public void log(Exception exception, String msg) {
278 parentContext.log(exception, msg);
279 }
280
281 @Override
282 public void log(String message, Throwable throwable) {
283 parentContext.log(message, throwable);
284 }
285
286 @Override
287 public void removeAttribute(String name) {
288 parentContext.removeAttribute(name);
289 }
290
291 @Override
292 public void setAttribute(String name, Object object) {
293 parentContext.setAttribute(name, object);
294 }
295 }