1
2
3
4
5
6
7
8
9
10
11
12
13 package org.eclipse.jetty.osgi.boot.jasper;
14
15 import java.io.File;
16 import java.io.InputStream;
17 import java.net.URL;
18 import java.util.ArrayList;
19 import java.util.HashSet;
20
21 import javax.servlet.Servlet;
22 import javax.servlet.jsp.JspContext;
23 import javax.servlet.jsp.JspFactory;
24
25 import org.apache.jasper.Constants;
26 import org.apache.jasper.compiler.Localizer;
27 import org.apache.jasper.xmlparser.ParserUtils;
28 import org.eclipse.jetty.osgi.boot.JettyBootstrapActivator;
29 import org.eclipse.jetty.osgi.boot.OSGiAppProvider;
30 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelper;
31 import org.eclipse.jetty.osgi.boot.utils.WebappRegistrationCustomizer;
32 import org.osgi.framework.Bundle;
33 import org.osgi.framework.FrameworkUtil;
34 import org.xml.sax.EntityResolver;
35 import org.xml.sax.InputSource;
36 import org.xml.sax.SAXException;
37
38
39
40
41
42
43 public class WebappRegistrationCustomizerImpl implements WebappRegistrationCustomizer
44 {
45
46
47
48
49
50
51 private static String DEFAULT_JSTL_BUNDLE_CLASS = "org.apache.taglibs.standard.tag.el.core.WhenTag";
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 private static String DEFAULT_JSP_FACTORY_IMPL_CLASS = "org.apache.jasper.runtime.JspFactoryImpl";
69
70 public WebappRegistrationCustomizerImpl()
71 {
72 fixupDtdResolution();
73
74 try
75 {
76
77 Class cl = getClass().getClassLoader().loadClass("org.apache.jasper.servlet.JspServlet");
78
79 }
80 catch (Exception e)
81 {
82 System.err.println("Unable to locate the JspServlet: jsp support unavailable.");
83 e.printStackTrace();
84 return;
85 }
86 try
87 {
88
89 JspFactory fact = JspFactory.getDefaultFactory();
90 if (fact == null)
91 {
92
93
94
95 fact = (JspFactory)JettyBootstrapActivator.class.getClassLoader()
96 .loadClass(DEFAULT_JSP_FACTORY_IMPL_CLASS).newInstance();
97 JspFactory.setDefaultFactory(fact);
98 }
99
100 }
101 catch (Exception e)
102 {
103 System.err.println("Unable to set the JspFactory: jsp support incomplete.");
104 e.printStackTrace();
105 }
106 }
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 public URL[] getJarsWithTlds(OSGiAppProvider provider, BundleFileLocatorHelper locatorHelper) throws Exception
124 {
125
126 HashSet<Class<?>> classesToAddToTheTldBundles = new HashSet<Class<?>>();
127
128
129
130
131
132 Class<?> jstlClass = WebappRegistrationCustomizerImpl.class.getClassLoader().loadClass(DEFAULT_JSTL_BUNDLE_CLASS);
133
134 classesToAddToTheTldBundles.add(jstlClass);
135
136
137
138
139
140
141
142
143
144
145
146 ArrayList<URL> urls = new ArrayList<URL>();
147 for (Class<?> cl : classesToAddToTheTldBundles)
148 {
149 Bundle tldBundle = FrameworkUtil.getBundle(cl);
150 File tldBundleLocation = locatorHelper.getBundleInstallLocation(tldBundle);
151 if (tldBundleLocation.isDirectory())
152 {
153
154 for (File f : tldBundleLocation.listFiles())
155 {
156 if (f.getName().endsWith(".jar") && f.isFile())
157 {
158 urls.add(f.toURI().toURL());
159 }
160 else if (f.isDirectory() && f.getName().equals("lib"))
161 {
162 for (File f2 : tldBundleLocation.listFiles())
163 {
164 if (f2.getName().endsWith(".jar") && f2.isFile())
165 {
166 urls.add(f2.toURI().toURL());
167 }
168 }
169 }
170 }
171
172 }
173 else
174 {
175 urls.add(tldBundleLocation.toURI().toURL());
176 }
177 }
178 return urls.toArray(new URL[urls.size()]);
179 }
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195 void fixupDtdResolution()
196 {
197 try
198 {
199 ParserUtils.setEntityResolver(new MyFixedupEntityResolver());
200
201 }
202 catch (Exception e)
203 {
204 e.printStackTrace();
205 }
206
207 }
208
209
210
211
212 static class MyFixedupEntityResolver implements EntityResolver
213 {
214
215
216
217 static final String[] CACHED_DTD_PUBLIC_IDS =
218 { Constants.TAGLIB_DTD_PUBLIC_ID_11, Constants.TAGLIB_DTD_PUBLIC_ID_12,
219 Constants.WEBAPP_DTD_PUBLIC_ID_22, Constants.WEBAPP_DTD_PUBLIC_ID_23, };
220
221 static final String[] CACHED_DTD_RESOURCE_PATHS =
222 { Constants.TAGLIB_DTD_RESOURCE_PATH_11,
223 Constants.TAGLIB_DTD_RESOURCE_PATH_12,
224 Constants.WEBAPP_DTD_RESOURCE_PATH_22,
225 Constants.WEBAPP_DTD_RESOURCE_PATH_23, };
226
227
228
229
230
231
232
233 public InputSource resolveEntity(String publicId, String systemId) throws SAXException
234 {
235 for (int i = 0; i < CACHED_DTD_PUBLIC_IDS.length; i++)
236 {
237 String cachedDtdPublicId = CACHED_DTD_PUBLIC_IDS[i];
238 if (cachedDtdPublicId.equals(publicId))
239 {
240 String resourcePath = CACHED_DTD_RESOURCE_PATHS[i];
241 InputStream input = null;
242 input = Servlet.class.getResourceAsStream(resourcePath);
243 if (input == null)
244 {
245 input = JspContext.class.getResourceAsStream(resourcePath);
246 if (input == null)
247 {
248
249
250 input = this.getClass().getResourceAsStream(resourcePath);
251 }
252 }
253 if (input == null)
254 {
255 throw new SAXException(Localizer.getMessage("jsp.error.internal.filenotfound",resourcePath));
256 }
257 InputSource isrc = new InputSource(input);
258 return isrc;
259 }
260 }
261
262 return null;
263 }
264 }
265
266 }