1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.eclipse.jetty.osgi.boot.warurl;
16
17 import java.io.File;
18 import java.io.IOException;
19 import java.net.JarURLConnection;
20 import java.net.URL;
21 import java.net.URLConnection;
22 import java.util.jar.Manifest;
23
24 import org.eclipse.jetty.osgi.boot.warurl.internal.WarBundleManifestGenerator;
25 import org.eclipse.jetty.osgi.boot.warurl.internal.WarURLConnection;
26 import org.eclipse.jetty.util.URIUtil;
27 import org.osgi.service.url.AbstractURLStreamHandlerService;
28
29
30
31
32
33
34 public class WarUrlStreamHandler extends AbstractURLStreamHandlerService
35 {
36
37
38
39
40 @Override
41 public URLConnection openConnection(URL url) throws IOException
42 {
43
44 URL actual = new URL(url.toString().substring("war:".length()));
45
46
47
48 if (actual.getProtocol().equals("file"))
49 {
50 File file = new File(URIUtil.encodePath(actual.getPath()));
51 if (file.exists())
52 {
53 if (file.isDirectory())
54 {
55
56 }
57 }
58 }
59
60
61 URLConnection ori = (URLConnection) actual.openConnection();
62 JarURLConnection jarOri = null;
63 try {
64 if (ori instanceof JarURLConnection)
65 {
66 jarOri = (JarURLConnection)ori;
67 }
68 else
69 {
70 jarOri = (JarURLConnection) new URL("jar:"+actual.toString() + "!/").openConnection();
71 }
72 Manifest mf = WarBundleManifestGenerator.createBundleManifest(
73 jarOri.getManifest(), url, jarOri.getJarFile());
74 try { jarOri.getJarFile().close(); jarOri = null; } catch (Throwable t) {}
75 return new WarURLConnection(actual,mf);
76 }
77 finally
78 {
79 if (jarOri != null) try { jarOri.getJarFile().close(); } catch (Throwable t) {}
80 }
81
82 }
83
84
85 }