diff options
Diffstat (limited to 'org.jacoco.core/src/org/jacoco/core')
-rw-r--r-- | org.jacoco.core/src/org/jacoco/core/internal/Pack200Streams.java | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/Pack200Streams.java b/org.jacoco.core/src/org/jacoco/core/internal/Pack200Streams.java index 96b05960..57505706 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/Pack200Streams.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/Pack200Streams.java @@ -18,9 +18,9 @@ import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; import java.util.jar.JarInputStream; import java.util.jar.JarOutputStream; -import java.util.jar.Pack200; /** * Internal wrapper for the weird Pack200 Java API to allow usage with streams. @@ -36,11 +36,27 @@ public final class Pack200Streams { * @throws IOException * in case of errors with the streams */ + @SuppressWarnings("resource") public static InputStream unpack(final InputStream input) throws IOException { final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); final JarOutputStream jar = new JarOutputStream(buffer); - Pack200.newUnpacker().unpack(new NoCloseInput(input), jar); + try { + final Object unpacker = Class.forName("java.util.jar.Pack200") + .getMethod("newUnpacker").invoke(null); + Class.forName("java.util.jar.Pack200$Unpacker") + .getMethod("unpack", InputStream.class, + JarOutputStream.class) + .invoke(unpacker, new NoCloseInput(input), jar); + } catch (ClassNotFoundException e) { + throw newIOException(e); + } catch (NoSuchMethodException e) { + throw newIOException(e); + } catch (IllegalAccessException e) { + throw newIOException(e); + } catch (InvocationTargetException e) { + throw newIOException(e.getCause()); + } jar.finish(); return new ByteArrayInputStream(buffer.toByteArray()); } @@ -55,11 +71,32 @@ public final class Pack200Streams { * @throws IOException * in case of errors with the streams */ + @SuppressWarnings("resource") public static void pack(final byte[] source, final OutputStream output) throws IOException { final JarInputStream jar = new JarInputStream( new ByteArrayInputStream(source)); - Pack200.newPacker().pack(jar, output); + try { + final Object packer = Class.forName("java.util.jar.Pack200") + .getMethod("newPacker").invoke(null); + Class.forName("java.util.jar.Pack200$Packer") + .getMethod("pack", JarInputStream.class, OutputStream.class) + .invoke(packer, jar, output); + } catch (ClassNotFoundException e) { + throw newIOException(e); + } catch (NoSuchMethodException e) { + throw newIOException(e); + } catch (IllegalAccessException e) { + throw newIOException(e); + } catch (InvocationTargetException e) { + throw newIOException(e.getCause()); + } + } + + private static IOException newIOException(final Throwable cause) { + final IOException exception = new IOException(); + exception.initCause(cause); + return exception; } private static class NoCloseInput extends FilterInputStream { |