blob: ae3c449355283e3ab0875e97abc10a63571cebc1 [file] [log] [blame]
package aQute.bnd.osgi;
import java.io.*;
import java.util.zip.*;
import aQute.lib.io.*;
public class EmbeddedResource implements Resource {
byte data[];
long lastModified;
String extra;
public EmbeddedResource(byte data[], long lastModified) {
this.data = data;
this.lastModified = lastModified;
}
public InputStream openInputStream() throws FileNotFoundException {
return new ByteArrayInputStream(data);
}
public void write(OutputStream out) throws IOException {
out.write(data);
}
@Override
public String toString() {
return ":" + data.length + ":";
}
public static void build(Jar jar, InputStream in, long lastModified) throws IOException {
ZipInputStream jin = new ZipInputStream(in);
ZipEntry entry = jin.getNextEntry();
while (entry != null) {
if (!entry.isDirectory()) {
byte data[] = collect(jin);
jar.putResource(entry.getName(), new EmbeddedResource(data, lastModified), true);
}
entry = jin.getNextEntry();
}
IO.drain(in);
jin.close();
}
/**
* Convenience method to turn an inputstream into a byte array. The method
* uses a recursive algorithm to minimize memory usage.
*
* @param in
* stream with data
* @param offset
* where we are in the stream
* @returns byte array filled with data
*/
static byte[] collect(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
copy(in, out);
return out.toByteArray();
}
static void copy(InputStream in, OutputStream out) throws IOException {
int available = in.available();
if (available <= 10000)
available = 64000;
byte[] buffer = new byte[available];
int size;
while ((size = in.read(buffer)) > 0)
out.write(buffer, 0, size);
}
public long lastModified() {
return lastModified;
}
public static void build(Jar sub, Resource resource) throws Exception {
InputStream in = resource.openInputStream();
try {
build(sub, in, resource.lastModified());
}
catch (Exception e) {
e.printStackTrace();
}
finally {
in.close();
}
}
public String getExtra() {
return extra;
}
public void setExtra(String extra) {
this.extra = extra;
}
public long size() {
return data.length;
}
}