diff options
author | jfrijters <jfrijters> | 2013-02-17 13:35:25 +0400 |
---|---|---|
committer | jfrijters <jfrijters> | 2013-02-17 13:35:25 +0400 |
commit | 25881c98c11517a738d41402a0d7cad997479dd8 (patch) | |
tree | bd446a358e6747fa2466640f228e0a8f24e4e247 /openjdk/java | |
parent | 39ad0c5b68c777be287eca374dfb5c1ad767cc08 (diff) |
Project stub classes into the jar the classes originated from.
Diffstat (limited to 'openjdk/java')
-rw-r--r-- | openjdk/java/util/zip/ClassStubZipEntry.java | 98 | ||||
-rw-r--r-- | openjdk/java/util/zip/ZipFile.java | 4 |
2 files changed, 102 insertions, 0 deletions
diff --git a/openjdk/java/util/zip/ClassStubZipEntry.java b/openjdk/java/util/zip/ClassStubZipEntry.java new file mode 100644 index 00000000..6a2a6df5 --- /dev/null +++ b/openjdk/java/util/zip/ClassStubZipEntry.java @@ -0,0 +1,98 @@ +/* + Copyright (C) 2013 Jeroen Frijters + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jeroen Frijters + jeroen@frijters.net + +*/ +package java.util.zip; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.IOException; +import java.util.LinkedHashMap; + +final class ClassStubZipEntry extends ZipEntry +{ + private final String zipFilePath; + + ClassStubZipEntry(String zipFilePath, String name) + { + super(name); + this.zipFilePath = zipFilePath; + } + + private File getFile() + { + return new File(new File(zipFilePath).getParentFile().getParentFile(), "classes" + File.separator + name); + } + + public long getSize() + { + if (size == -1) + { + size = getFile().length(); + } + return size; + } + + public long getCompressedSize() + { + if (csize == -1) + { + csize = getSize(); + } + return csize; + } + + public long getCrc() + { + if (crc == -1) + { + crc = computeCrc(); + } + return crc; + } + + private long computeCrc() + { + try (InputStream in = getInputStream()) + { + CRC32 crc = new CRC32(); + int b; + while ((b = in.read()) != -1) + { + crc.update(b); + } + return crc.getValue(); + } + catch (IOException _) + { + return 0; + } + } + + final InputStream getInputStream() throws IOException + { + return new FileInputStream(getFile()); + } + + static native void expandIkvmClasses(ZipFile zipFile, LinkedHashMap<String, ZipEntry> entries); +} diff --git a/openjdk/java/util/zip/ZipFile.java b/openjdk/java/util/zip/ZipFile.java index b22c7978..35fbc665 100644 --- a/openjdk/java/util/zip/ZipFile.java +++ b/openjdk/java/util/zip/ZipFile.java @@ -195,6 +195,7 @@ public class ZipFile implements ZipConstants, Closeable try { readEntries(); + ClassStubZipEntry.expandIkvmClasses(this, entries); valid = true; } catch (EOFException _) @@ -457,6 +458,9 @@ public class ZipFile implements ZipConstants, Closeable if (zipEntry == null) return null; + if (zipEntry instanceof ClassStubZipEntry) + return ((ClassStubZipEntry)zipEntry).getInputStream(); + PartialInputStream inp = new PartialInputStream(1024) { void lazyInitialSeek() throws IOException { seek(zipEntry.offset); |