/*
* Copyright (C) 2014 University of Washington
*
* Originally developed by Dobility, Inc. (as part of SurveyCTO)
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.odk.collect.android.utilities;
import android.util.Log;
import org.apache.commons.io.IOUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
* Author: Meletis Margaritis
* Date: 2/12/14
* Time: 1:48 PM
*/
public final class ZipUtils {
final static String t = "ZipUtils";
public static void unzip(File[] zipFiles) {
for (File zipFile : zipFiles) {
ZipInputStream zipInputStream = null;
try {
zipInputStream = new ZipInputStream(new FileInputStream(zipFile));
ZipEntry zipEntry;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
doExtractInTheSameFolder(zipFile, zipInputStream, zipEntry);
}
} catch (Exception e) {
Log.e(t, e.getMessage(), e);
} finally {
IOUtils.closeQuietly(zipInputStream);
}
}
}
public static File extractFirstZipEntry(File zipFile, boolean deleteAfterUnzip) throws IOException {
ZipInputStream zipInputStream = null;
File targetFile = null;
try {
zipInputStream = new ZipInputStream(new FileInputStream(zipFile));
ZipEntry zipEntry = zipInputStream.getNextEntry();
if (zipEntry != null) {
targetFile = doExtractInTheSameFolder(zipFile, zipInputStream, zipEntry);
}
} finally {
IOUtils.closeQuietly(zipInputStream);
}
if (deleteAfterUnzip && targetFile != null && targetFile.exists()) {
FileUtils.deleteAndReport(zipFile);
}
return targetFile;
}
private static File doExtractInTheSameFolder(File zipFile, ZipInputStream zipInputStream, ZipEntry zipEntry) throws IOException {
File targetFile;
String fileName = zipEntry.getName();
Log.w(t, "Found zipEntry with name: " + fileName);
if (fileName.contains("/") || fileName.contains("\\")) {
// that means that this is a directory of a file inside a directory, so ignore it
Log.w(t, "Ignored: " + fileName);
return null;
}
// extract the new file
targetFile = new File(zipFile.getParentFile(), fileName);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(targetFile);
IOUtils.copy(zipInputStream, fileOutputStream);
} finally {
IOUtils.closeQuietly(fileOutputStream);
}
Log.w(t, "Extracted file \"" + fileName + "\" out of " + zipFile.getName());
return targetFile;
}
}