1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.osgi.boot;
20
21 import java.io.File;
22 import java.net.URL;
23 import java.util.Dictionary;
24 import java.util.HashMap;
25
26 import org.eclipse.jetty.deploy.App;
27 import org.eclipse.jetty.deploy.AppProvider;
28 import org.eclipse.jetty.deploy.DeploymentManager;
29 import org.eclipse.jetty.osgi.boot.internal.serverfactory.ServerInstanceWrapper;
30 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelperFactory;
31 import org.eclipse.jetty.osgi.boot.utils.OSGiClassLoader;
32 import org.eclipse.jetty.server.handler.ContextHandler;
33 import org.eclipse.jetty.util.component.AbstractLifeCycle;
34 import org.eclipse.jetty.util.log.Log;
35 import org.eclipse.jetty.util.log.Logger;
36 import org.eclipse.jetty.util.resource.JarResource;
37 import org.eclipse.jetty.util.resource.Resource;
38 import org.eclipse.jetty.xml.XmlConfiguration;
39 import org.osgi.framework.Bundle;
40
41
42
43
44
45
46
47
48
49
50
51 public abstract class AbstractContextProvider extends AbstractLifeCycle implements AppProvider
52 {
53 private static final Logger LOG = Log.getLogger(AbstractContextProvider.class);
54
55 private DeploymentManager _deploymentManager;
56
57 private ServerInstanceWrapper _serverWrapper;
58
59
60
61
62
63
64
65
66
67
68 public class OSGiApp extends AbstractOSGiApp
69 {
70 private String _contextFile;
71 private ContextHandler _contextHandler;
72 private boolean _configured = false;
73
74 public OSGiApp(DeploymentManager manager, AppProvider provider, String originId, Bundle bundle, String contextFile)
75 {
76 super(manager, provider, bundle, originId);
77 _contextFile = contextFile;
78 }
79
80 public OSGiApp(DeploymentManager manager, AppProvider provider, Bundle bundle, Dictionary properties, String contextFile, String originId)
81 {
82 super(manager, provider, bundle, properties, originId);
83 _contextFile = contextFile;
84 }
85
86 public String getContextFile ()
87 {
88 return _contextFile;
89 }
90
91 public void setHandler(ContextHandler h)
92 {
93 _contextHandler = h;
94 }
95
96 public ContextHandler createContextHandler()
97 throws Exception
98 {
99 configureContextHandler();
100 return _contextHandler;
101 }
102
103 public void configureContextHandler()
104 throws Exception
105 {
106 if (_configured)
107 return;
108
109 _configured = true;
110
111
112 String bundleOverrideLocation = (String)_properties.get(OSGiWebappConstants.JETTY_BUNDLE_INSTALL_LOCATION_OVERRIDE);
113 if (bundleOverrideLocation == null)
114 bundleOverrideLocation = (String)_properties.get(OSGiWebappConstants.SERVICE_PROP_BUNDLE_INSTALL_LOCATION_OVERRIDE);
115
116
117 File bundleLocation = BundleFileLocatorHelperFactory.getFactory().getHelper().getBundleInstallLocation(_bundle);
118 File root = (bundleOverrideLocation==null?bundleLocation:new File(bundleOverrideLocation));
119 Resource rootResource = Resource.newResource(BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(root.toURI().toURL()));
120
121
122 if (rootResource.exists()&& !rootResource.isDirectory() && !rootResource.toString().startsWith("jar:"))
123 {
124 Resource jarResource = JarResource.newJarResource(rootResource);
125 if (jarResource.exists() && jarResource.isDirectory())
126 rootResource = jarResource;
127 }
128
129
130 if (_contextHandler != null && _contextHandler.getBaseResource() == null)
131 {
132 _contextHandler.setBaseResource(rootResource);
133 }
134
135
136 OSGiClassLoader classLoader = new OSGiClassLoader(getServerInstanceWrapper().getParentClassLoaderForWebapps(), _bundle);
137
138
139 if (_contextFile == null && _contextHandler == null)
140 throw new IllegalStateException("No context file or ContextHandler");
141
142 if (_contextFile != null)
143 {
144
145 Resource res = null;
146
147 String jettyHome = (String)getServerInstanceWrapper().getServer().getAttribute(OSGiServerConstants.JETTY_HOME);
148 if (jettyHome == null)
149 jettyHome = System.getProperty(OSGiServerConstants.JETTY_HOME);
150
151 res = findFile(_contextFile, jettyHome, bundleOverrideLocation, _bundle);
152
153
154
155 if (res != null)
156 {
157 ClassLoader cl = Thread.currentThread().getContextClassLoader();
158
159 LOG.debug("Context classloader = " + cl);
160 try
161 {
162 Thread.currentThread().setContextClassLoader(classLoader);
163
164 XmlConfiguration xmlConfiguration = new XmlConfiguration(res.getInputStream());
165 HashMap properties = new HashMap();
166
167 properties.put("Server", getServerInstanceWrapper().getServer());
168
169 properties.put(OSGiWebappConstants.JETTY_BUNDLE_ROOT, rootResource.toString());
170
171
172 xmlConfiguration.getProperties().putAll(properties);
173
174 if (_contextHandler == null)
175 _contextHandler = (ContextHandler) xmlConfiguration.configure();
176 else
177 xmlConfiguration.configure(_contextHandler);
178 }
179 finally
180 {
181 Thread.currentThread().setContextClassLoader(cl);
182 }
183 }
184 }
185
186
187 _contextHandler.setClassLoader(classLoader);
188
189
190
191 String contextPath = (String)_properties.get(OSGiWebappConstants.RFC66_WEB_CONTEXTPATH);
192 if (contextPath == null)
193 contextPath = (String)_properties.get(OSGiWebappConstants.SERVICE_PROP_CONTEXT_PATH);
194 if (contextPath != null)
195 _contextHandler.setContextPath(contextPath);
196
197
198 _contextHandler.setAttribute(OSGiWebappConstants.OSGI_BUNDLECONTEXT, _bundle.getBundleContext());
199
200
201 String[] targets = _contextHandler.getProtectedTargets();
202 int length = (targets==null?0:targets.length);
203
204 String[] updatedTargets = null;
205 if (targets != null)
206 {
207 updatedTargets = new String[length+OSGiWebappConstants.DEFAULT_PROTECTED_OSGI_TARGETS.length];
208 System.arraycopy(targets, 0, updatedTargets, 0, length);
209
210 }
211 else
212 updatedTargets = new String[OSGiWebappConstants.DEFAULT_PROTECTED_OSGI_TARGETS.length];
213 System.arraycopy(OSGiWebappConstants.DEFAULT_PROTECTED_OSGI_TARGETS, 0, updatedTargets, length, OSGiWebappConstants.DEFAULT_PROTECTED_OSGI_TARGETS.length);
214 _contextHandler.setProtectedTargets(updatedTargets);
215
216 }
217
218 }
219
220
221 public AbstractContextProvider(ServerInstanceWrapper wrapper)
222 {
223 _serverWrapper = wrapper;
224 }
225
226
227
228 public ServerInstanceWrapper getServerInstanceWrapper()
229 {
230 return _serverWrapper;
231 }
232
233
234
235
236
237 public ContextHandler createContextHandler(App app) throws Exception
238 {
239 if (app == null)
240 return null;
241 if (!(app instanceof OSGiApp))
242 throw new IllegalStateException(app+" is not a BundleApp");
243
244
245 ContextHandler h = ((OSGiApp)app).createContextHandler();
246 return h;
247 }
248
249
250 public void setDeploymentManager(DeploymentManager deploymentManager)
251 {
252 _deploymentManager = deploymentManager;
253 }
254
255
256 public DeploymentManager getDeploymentManager()
257 {
258 return _deploymentManager;
259 }
260 }