private void unzip(String file) {
		final File fSourceZip = new File(file);
		try {
			final String zipPath = file.substring(0, file.length() - 4);
			ZipFile zipFile = new ZipFile(fSourceZip);
			Enumeration<? extends ZipEntry> e = zipFile.entries();
			while (e.hasMoreElements()) {
				ZipEntry entry = e.nextElement();
				File destinationFilePath = new File(zipPath, entry.getName());
				this.fileIOOrError(destinationFilePath.getParentFile(), destinationFilePath.getParentFile().mkdirs(), true);
				if (!entry.isDirectory()) {
					final BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));
					int b;
					final byte[] buffer = new byte[Updater.BYTE_SIZE];
					final FileOutputStream fos = new FileOutputStream(destinationFilePath);
					final BufferedOutputStream bos = new BufferedOutputStream(fos, Updater.BYTE_SIZE);
					while ((b = bis.read(buffer, 0, Updater.BYTE_SIZE)) != -1) {
						bos.write(buffer, 0, b);
					}
					bos.flush();
					bos.close();
					bis.close();
					final String name = destinationFilePath.getName();
					if (name.endsWith(".jar") && this.pluginExists(name)) {
						File output = new File(this.updateFolder, name);
						this.fileIOOrError(output, destinationFilePath.renameTo(output), true);
					}
				}
			}
			zipFile.close();

			// Move any plugin data folders that were included to the right place, Bukkit won't do this for us.
			moveNewZipFiles(zipPath);

		} catch (final IOException e) {
			this.plugin.getLogger().log(Level.SEVERE, "The auto-updater tried to unzip a new update file, but was unsuccessful.", e);
			this.result = Updater.UpdateResult.FAIL_DOWNLOAD;
		} finally {
			this.fileIOOrError(fSourceZip, fSourceZip.delete(), false);
		}
	}