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.internal.serverfactory;
20
21 import java.io.File;
22 import java.net.MalformedURLException;
23 import java.net.URL;
24 import java.util.Dictionary;
25 import java.util.Enumeration;
26 import java.util.Hashtable;
27 import java.util.StringTokenizer;
28
29 import org.eclipse.jetty.osgi.boot.JettyBootstrapActivator;
30 import org.eclipse.jetty.osgi.boot.OSGiServerConstants;
31 import org.eclipse.jetty.osgi.boot.internal.webapp.BundleFileLocatorHelperFactory;
32 import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelper;
33 import org.eclipse.jetty.server.Server;
34 import org.eclipse.jetty.util.log.Log;
35 import org.eclipse.jetty.util.log.Logger;
36 import org.osgi.framework.Bundle;
37 import org.osgi.framework.BundleContext;
38
39
40
41
42
43
44
45
46
47 public class DefaultJettyAtJettyHomeHelper
48 {
49 private static final Logger LOG = Log.getLogger(DefaultJettyAtJettyHomeHelper.class);
50
51
52
53
54 public static final String JETTY_ETC_FILES = OSGiServerConstants.MANAGED_JETTY_XML_CONFIG_URLS;
55
56
57
58
59 public static final String DEFAULT_JETTY_ETC_FILES = "etc/jetty.xml,etc/jetty-selector.xml,etc/jetty-deployer.xml";
60
61
62
63
64 public static final String DEFAULT_JETTYHOME = "/jettyhome/";
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 public static void startJettyAtJettyHome(BundleContext bundleContext) throws Exception
91 {
92 String jettyHomeSysProp = System.getProperty(OSGiServerConstants.JETTY_HOME);
93 String jettyHomeBundleSysProp = System.getProperty(OSGiServerConstants.JETTY_HOME_BUNDLE);
94 File jettyHome = null;
95 Bundle jettyHomeBundle = null;
96 if (jettyHomeSysProp != null)
97 {
98 jettyHomeSysProp = resolvePropertyValue(jettyHomeSysProp);
99
100 if (jettyHomeSysProp.startsWith("\"") && jettyHomeSysProp.endsWith("\"") || (jettyHomeSysProp.startsWith("'") && jettyHomeSysProp.endsWith("'")))
101 {
102 jettyHomeSysProp = jettyHomeSysProp.substring(1, jettyHomeSysProp.length() - 1);
103 }
104 if (jettyHomeBundleSysProp != null)
105 {
106 LOG.warn("Both jetty.home and jetty.home.bundle property defined: jetty.home.bundle ignored.");
107 }
108 jettyHome = new File(jettyHomeSysProp);
109 if (!jettyHome.exists() || !jettyHome.isDirectory())
110 {
111 LOG.warn("Unable to locate the jetty.home folder " + jettyHomeSysProp);
112 return;
113 }
114 }
115 else if (jettyHomeBundleSysProp != null)
116 {
117 jettyHomeBundleSysProp = resolvePropertyValue(jettyHomeBundleSysProp);
118 for (Bundle b : bundleContext.getBundles())
119 {
120 if (b.getSymbolicName().equals(jettyHomeBundleSysProp))
121 {
122 jettyHomeBundle = b;
123 break;
124 }
125 }
126 if (jettyHomeBundle == null)
127 {
128 LOG.warn("Unable to find the jetty.home.bundle named " + jettyHomeSysProp);
129 return;
130 }
131
132 }
133 if (jettyHome == null && jettyHomeBundle == null)
134 {
135 LOG.warn("No default jetty created.");
136 return;
137 }
138
139 Server server = new Server();
140 Dictionary<String,String> properties = new Hashtable<String,String>();
141 properties.put(OSGiServerConstants.MANAGED_JETTY_SERVER_NAME, OSGiServerConstants.MANAGED_JETTY_SERVER_DEFAULT_NAME);
142
143 String configURLs = jettyHome != null ? getJettyConfigurationURLs(jettyHome) : getJettyConfigurationURLs(jettyHomeBundle);
144 properties.put(OSGiServerConstants.MANAGED_JETTY_XML_CONFIG_URLS, configURLs);
145
146 LOG.info("Configuring the default jetty server with " + configURLs);
147
148
149
150 setProperty(properties, OSGiServerConstants.JETTY_HOME, System.getProperty(OSGiServerConstants.JETTY_HOME));
151 setProperty(properties, OSGiServerConstants.JETTY_HOST, System.getProperty(OSGiServerConstants.JETTY_HOST));
152 setProperty(properties, OSGiServerConstants.JETTY_PORT, System.getProperty(OSGiServerConstants.JETTY_PORT));
153 setProperty(properties, OSGiServerConstants.JETTY_PORT_SSL, System.getProperty(OSGiServerConstants.JETTY_PORT_SSL));
154
155
156 bundleContext.registerService(Server.class.getName(), server, properties);
157 }
158
159
160
161
162
163
164
165
166
167
168
169
170
171 private static String getJettyConfigurationURLs(File jettyhome)
172 {
173 String jettyetc = System.getProperty(JETTY_ETC_FILES, DEFAULT_JETTY_ETC_FILES);
174 StringTokenizer tokenizer = new StringTokenizer(jettyetc, ";,", false);
175 StringBuilder res = new StringBuilder();
176 while (tokenizer.hasMoreTokens())
177 {
178 String next = tokenizer.nextToken().trim();
179 if (!next.startsWith("/") && next.indexOf(':') == -1)
180 {
181 try
182 {
183 next = new File(jettyhome, next).toURI().toURL().toString();
184 }
185 catch (MalformedURLException e)
186 {
187 LOG.warn(e);
188 continue;
189 }
190 }
191 appendToCommaSeparatedList(res, next);
192 }
193 return res.toString();
194 }
195
196
197
198
199
200
201
202
203
204
205
206
207 private static String getJettyConfigurationURLs(Bundle configurationBundle)
208 {
209 String files = System.getProperty(JETTY_ETC_FILES, DEFAULT_JETTY_ETC_FILES);
210
211 StringTokenizer tokenizer = new StringTokenizer(files, ";,", false);
212 StringBuilder res = new StringBuilder();
213
214 while (tokenizer.hasMoreTokens())
215 {
216 String etcFile = tokenizer.nextToken().trim();
217 if (etcFile.startsWith("/") || etcFile.indexOf(":") != -1)
218 {
219
220 appendToCommaSeparatedList(res, etcFile);
221 }
222 else
223 {
224
225 Enumeration<URL> enUrls = BundleFileLocatorHelperFactory.getFactory().getHelper().findEntries(configurationBundle, etcFile);
226
227
228
229
230
231 if ((enUrls == null || !enUrls.hasMoreElements()))
232 {
233 String tmp = DEFAULT_JETTYHOME+etcFile;
234 enUrls = BundleFileLocatorHelperFactory.getFactory().getHelper().findEntries(configurationBundle, tmp);
235 LOG.info("Configuring jetty from bundle: "
236 + configurationBundle.getSymbolicName()
237 + " with "+tmp);
238 }
239 if (enUrls == null || !enUrls.hasMoreElements())
240 {
241 throw new IllegalStateException ("Unable to locate a jetty configuration file for " + etcFile);
242 }
243 if (enUrls != null)
244 {
245 while (enUrls.hasMoreElements())
246 {
247 URL url = BundleFileLocatorHelperFactory.getFactory().getHelper().getFileURL(enUrls.nextElement());
248 appendToCommaSeparatedList(res, url.toString());
249 }
250 }
251 }
252 }
253 return res.toString();
254 }
255
256
257
258 private static void appendToCommaSeparatedList(StringBuilder buffer, String value)
259 {
260 if (buffer.length() != 0)
261 {
262 buffer.append(",");
263 }
264 buffer.append(value);
265 }
266
267
268
269 private static void setProperty(Dictionary<String,String> properties, String key, String value)
270 {
271 if (value != null)
272 {
273 properties.put(key, value);
274 }
275 }
276
277
278
279
280
281
282
283
284
285
286
287
288 public static String resolvePropertyValue(String value)
289 {
290 int ind = value.indexOf("${");
291 if (ind == -1) { return value; }
292 int ind2 = value.indexOf('}', ind);
293 if (ind2 == -1) { return value; }
294 String sysprop = value.substring(ind + 2, ind2);
295 String defaultValue = null;
296 int comma = sysprop.indexOf(',');
297 if (comma != -1 && comma + 1 != sysprop.length())
298 {
299 defaultValue = sysprop.substring(comma + 1);
300 defaultValue = resolvePropertyValue(defaultValue);
301 sysprop = sysprop.substring(0, comma);
302 }
303 else
304 {
305 defaultValue = "${" + sysprop + "}";
306 }
307
308 String v = System.getProperty(sysprop);
309
310 String reminder = value.length() > ind2 + 1 ? value.substring(ind2 + 1) : "";
311 reminder = resolvePropertyValue(reminder);
312 if (v != null)
313 {
314 return value.substring(0, ind) + v + reminder;
315 }
316 else
317 {
318 return value.substring(0, ind) + defaultValue + reminder;
319 }
320 }
321 }