blob: 192798ff26a61d1382f5943667edc6273e3866f9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/**
*
* Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tuscany.common.io.util;
import java.io.IOException;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URL;
import java.util.jar.JarFile;
/**
* <p/>
* This class is a workaround for URL stream issue as illustrated below.
* <p/>
* InputStream is=url.getInputStream();
* is.close(); // This line doesn't close the JAR file if the URL is a jar entry like "jar:file:/a.jar!/sca.module"
* <p/>
* We also need to turn off the JarFile cache.
*/
public class FixedURLInputStream extends InputStream {
private JarFile jarFile;
private InputStream is;
/**
* Constructor
*
* @param url
* @throws IOException
*/
public FixedURLInputStream(URL url) throws IOException {
String protocol = url.getProtocol();
if (protocol != null && (protocol.equals("jar") || protocol.equals("wsjar"))) {
String urlStr = url.toString();
if (urlStr.startsWith("wsjar:")) {
url = new URL("jar:" + urlStr.substring(6));
}
JarURLConnection connection = (JarURLConnection) url.openConnection();
// We cannot use cache
connection.setUseCaches(false);
try {
is = connection.getInputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
jarFile = connection.getJarFile();
} else {
is = url.openStream();
}
}
/**
* Constructor
*
* @param connection
* @throws IOException
*/
public FixedURLInputStream(JarURLConnection connection) throws IOException {
// We cannot use cache
connection.setUseCaches(false);
is = connection.getInputStream();
jarFile = connection.getJarFile();
}
public int available() throws IOException {
return is.available();
}
public void close() throws IOException {
is.close();
// We need to close the JAR file
if (jarFile != null)
jarFile.close();
}
public synchronized void mark(int readlimit) {
is.mark(readlimit);
}
public boolean markSupported() {
return is.markSupported();
}
public int read() throws IOException {
return is.read();
}
public int read(byte[] b, int off, int len) throws IOException {
return is.read(b, off, len);
}
public int read(byte[] b) throws IOException {
return is.read(b);
}
public synchronized void reset() throws IOException {
is.reset();
}
public long skip(long n) throws IOException {
return is.skip(n);
}
}
|