package mandelbrot.ocamljava_maven_plugin.util; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Collection; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; import java.util.jar.Manifest; import org.apache.maven.plugin.AbstractMojo; import org.codehaus.plexus.util.FileUtils; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; public class JarEntryReader { private volatile Optional<Manifest> manifest; public Optional<Manifest> getManifest() { return manifest == null ? Optional.<Manifest> absent() : manifest; } @SuppressWarnings("unused") private final AbstractMojo abstractMojo; public JarEntryReader(final AbstractMojo abstractMojo) { this.abstractMojo = Preconditions.checkNotNull(abstractMojo); } private static final int BUFFER_SIZE = 16384; public Collection<EntryInfo> readEntries(final String archiveFile) throws IOException { return readEntries(archiveFile, null, null); } public Collection<EntryInfo> readEntries(final String archiveFile, final byte[] optionalBuffer) throws IOException { return readEntries(archiveFile, optionalBuffer, null); } public Collection<EntryInfo> readEntries(final String archiveFile, final Set<String> allowedExtensions) throws IOException { return readEntries(archiveFile, null, allowedExtensions); } public Collection<EntryInfo> readEntries(final String archiveFile, final byte[] optionalBuffer, final Set<String> allowedExtensions) throws IOException { final byte[] buffer = optionalBuffer == null ? new byte[BUFFER_SIZE] : optionalBuffer; final FileInputStream in = new FileInputStream(archiveFile); final BufferedInputStream bufferedInputStream = new BufferedInputStream( in); final JarInputStream jarInputStream = new JarInputStream( bufferedInputStream); this.manifest = Optional.fromNullable(jarInputStream.getManifest()); final ImmutableList.Builder<EntryInfo> builder = ImmutableList .builder(); JarEntry nextEntry = null; while ((nextEntry = jarInputStream.getNextJarEntry()) != null) { if (allowedExtensions == null || allowedExtensions.contains(FileUtils.getExtension(nextEntry.getName()).toLowerCase())) { builder.add(getEntryInfo(nextEntry, jarInputStream, buffer)); } } return builder.build(); } private EntryInfo getEntryInfo(final JarEntry nextEntry, final JarInputStream in, final byte[] buffer) throws IOException { final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); pipe(byteArrayOutputStream, buffer, in); return EntryInfo.builder() .setBytes(byteArrayOutputStream.toByteArray()) .setEntry(nextEntry).build(); } private void pipe(final OutputStream out, final byte[] buffer, final InputStream in) throws IOException { while (true) { final int nRead = in.read(buffer, 0, buffer.length); if (nRead <= 0) break; out.write(buffer, 0, nRead); } } }