com.intuit.karate.job.JobUtils Maven / Gradle / Ivy
The newest version!
/*
* The MIT License
*
* Copyright 2022 Karate Labs Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.intuit.karate.job;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.function.Predicate;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
*
* @author pthomas3
*/
public class JobUtils {
public static void zip(File src, File dest) {
try {
src = src.getCanonicalFile();
FileOutputStream fos = new FileOutputStream(dest);
ZipOutputStream zipOut = new ZipOutputStream(fos);
zip(src, "", zipOut, 0);
zipOut.close();
fos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static void zip(File fileToZip, String fileName, ZipOutputStream zipOut, int level) throws IOException {
if (fileToZip.isHidden()) {
return;
}
if (fileToZip.isDirectory()) {
String entryName = fileName;
zipOut.putNextEntry(new ZipEntry(entryName + "/"));
zipOut.closeEntry();
File[] children = fileToZip.listFiles();
for (File childFile : children) {
String childFileName = childFile.getName();
// TODO improve ?
if (childFileName.equals("target") || childFileName.equals("build")) {
continue;
}
if (level != 0) {
childFileName = entryName + "/" + childFileName;
}
zip(childFile, childFileName, zipOut, level + 1);
}
return;
}
ZipEntry zipEntry = new ZipEntry(fileName);
zipOut.putNextEntry(zipEntry);
FileInputStream fis = new FileInputStream(fileToZip);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
fis.close();
}
public static void unzip(File src, File dest) {
try {
byte[] buffer = new byte[1024];
ZipInputStream zis = new ZipInputStream(new FileInputStream(src));
ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
File newFile = createFile(dest, zipEntry);
if (zipEntry.isDirectory()) {
newFile.mkdirs();
} else {
File parentFile = newFile.getParentFile();
if (parentFile != null && !parentFile.exists()) {
parentFile.mkdirs();
}
FileOutputStream fos = new FileOutputStream(newFile);
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
}
zipEntry = zis.getNextEntry();
}
zis.closeEntry();
zis.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static File createFile(File destinationDir, ZipEntry zipEntry) throws IOException {
File destFile = new File(destinationDir, zipEntry.getName());
String destDirPath = destinationDir.getCanonicalPath();
String destFilePath = destFile.getCanonicalPath();
if (!destFilePath.startsWith(destDirPath)) {
throw new IOException("entry outside target dir: " + zipEntry.getName());
}
return destFile;
}
public static File getFirstFileMatching(File parent, Predicate predicate) {
File[] files = parent.listFiles((f, n) -> predicate.test(n));
return files == null || files.length == 0 ? null : files[0];
}
}