/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2011 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ package com.db4o.instrumentation.util; import java.io.*; import com.db4o.foundation.io.*; /** * Creates a zip from the contents of a directory. * * The operation is performed as a side effect of the * constructor execution. */ public class ZipFileCreation { private final ZipFileWriter _zipFile; private final File _baseDir; public ZipFileCreation(File sourceDir, File outputFile) throws IOException { _baseDir = sourceDir.getCanonicalFile(); _zipFile = new ZipFileWriter(outputFile); try { writeEntries(_baseDir.listFiles()); } finally { _zipFile.close(); } } private void writeEntries(File[] files) throws IOException { for (int i = 0; i < files.length; i++) { writeEntry(files[i]); } } private void writeEntry(File file) throws IOException { if (file.isDirectory()) { writeEntries(file.listFiles()); return; } writeFileEntry(file); } private void writeFileEntry(File file) throws IOException { _zipFile.writeEntry(relativePath(file).replace('\\', '/'), readAllBytes(file)); } private byte[] readAllBytes(File file) throws IOException { return File4.readAllBytes(file.getAbsolutePath()); } private String relativePath(File file) throws IOException { final String basePath = _baseDir.getAbsolutePath(); final String filePath = file.getCanonicalPath(); assertPathPrefix(basePath, filePath); return filePath.substring(basePath.length() + 1); } private void assertPathPrefix(final String expectedPrefix, final String actualPath) { if (!actualPath.startsWith(expectedPrefix)) { // how come? throw new IllegalStateException(); } } }