package bytecode;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class SortZipEntries {
public static void main(String[] args) {
if(args.length != 1 && args.length != 2) {
System.err.println("Usage: java SortZipEntries infile.zip [[!]filterfile.zip] > outfile.zip");
System.exit(1);
}
try {
Set<String> filter = null;
boolean filterOut = false;
if(args.length >= 2) {
if(args[1].startsWith("!")) {
filterOut = true;
args[1] = args[1].substring(1);
}
filter = new HashSet<>();
try (ZipFile zf = new ZipFile(new File(args[1]))) {
for(Enumeration<? extends ZipEntry> entries_enum = zf.entries(); entries_enum.hasMoreElements();)
filter.add(entries_enum.nextElement().getName());
}
}
sort(new File(args[0]), filter, filterOut, System.out);
} catch(Throwable t) {
t.printStackTrace();
System.exit(1);
}
}
public static void sort(File inFile, Set<String> filter, boolean filterOut, OutputStream out) throws Exception {
try (ZipFile zf = new ZipFile(inFile)) {
List<ZipEntry> entries = new ArrayList<>();
for(Enumeration<? extends ZipEntry> entries_enum = zf.entries(); entries_enum.hasMoreElements();)
entries.add(entries_enum.nextElement());
Collections.sort(entries, new Comparator<ZipEntry>() {
@Override
public int compare(ZipEntry o1, ZipEntry o2) {
return o1.getName().compareTo(o2.getName());
}
});
try (ZipOutputStream zipOut = new ZipOutputStream(out)) {
for(ZipEntry ze : entries) {
if(filter != null && filterOut == filter.contains(ze.getName()))
continue;
try (InputStream in = zf.getInputStream(ze)) {
zipOut.putNextEntry(new ZipEntry(ze.getName()));
BaseStreamingZipProcessor.copyResource(in, zipOut);
zipOut.closeEntry();
}
}
}
}
}
}