package rtt.core.loader; import java.io.InputStream; import java.io.OutputStream; import de.schlichtherle.io.ArchiveException; import de.schlichtherle.io.DefaultArchiveDetector; import de.schlichtherle.io.File; import de.schlichtherle.io.FileInputStream; import de.schlichtherle.io.FileOutputStream; import de.schlichtherle.io.archive.zip.ZipDriver; public class ZipArchiveLoader extends ArchiveLoader { String archivePath; public ZipArchiveLoader() { File.setDefaultArchiveDetector(new DefaultArchiveDetector("zip", new ZipDriver())); } @Override public void setBasePath(java.io.File baseFile) { File archiveFile = new File(baseFile); if (archiveFile.isArchive() == false) { throw new IllegalArgumentException( "The base file must be an zip archive"); } super.setBasePath(archiveFile); } @Override protected InputStream doGetInput(java.io.File file) throws Exception { File entryFile = new File(file); File.umount(entryFile.getTopLevelArchive(), true, false, true, false); if (entryFile.exists()) { return new FileInputStream(entryFile); } return null; } @Override protected OutputStream doGetOutput(java.io.File file) throws Exception { File entryFile = new File(file); entryFile.getParentFile().mkdirs(); File archiveFile = entryFile.getTopLevelArchive(); if (archiveFile.exists() == false) { archiveFile.mkdirs(); } if (entryFile.exists() == false) { entryFile.createNewFile(); } File.umount(archiveFile, true, false, true, false); return new FileOutputStream(entryFile); } @Override public void close() { try { File.umount(true, true, true, true); } catch (ArchiveException e) { throw new RuntimeException(e); } } }