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.eclipse.jetty.util.resource.Resource;
28 import org.osgi.service.url.AbstractURLStreamHandlerService;
29
30
31
32
33
34
35 public class WarUrlStreamHandler extends AbstractURLStreamHandlerService
36 {
37
38
39
40
41 @Override
42 public URLConnection openConnection(URL url) throws IOException
43 {
44
45 URL actual = new URL(url.toString().substring("war:".length()));
46
47
48
49 if (actual.getProtocol().equals("file"))
50 {
51 File file = new File(URIUtil.encodePath(actual.getPath()));
52 if (file.exists())
53 {
54 if (file.isDirectory())
55 {
56
57 }
58 }
59 }
60
61
62 URLConnection ori = (URLConnection) actual.openConnection();
63 ori.setDefaultUseCaches(Resource.getDefaultUseCaches());
64 JarURLConnection jarOri = null;
65 try
66 {
67 if (ori instanceof JarURLConnection)
68 {
69 jarOri = (JarURLConnection) ori;
70 }
71 else
72 {
73 jarOri = (JarURLConnection) new URL("jar:" + actual.toString() + "!/").openConnection();
74 jarOri.setDefaultUseCaches(Resource.getDefaultUseCaches());
75 }
76 Manifest mf = WarBundleManifestGenerator.createBundleManifest(jarOri.getManifest(), url, jarOri.getJarFile());
77 try
78 {
79 jarOri.getJarFile().close();
80 jarOri = null;
81 }
82 catch (Throwable t)
83 {
84 }
85 return new WarURLConnection(actual, mf);
86 }
87 finally
88 {
89 if (jarOri != null) try
90 {
91 jarOri.getJarFile().close();
92 }
93 catch (Throwable t)
94 {
95 }
96 }
97
98 }
99
100 }