package at.favre.tools.dconvert.util;
import at.favre.tools.dconvert.arg.Arguments;
import at.favre.tools.dconvert.arg.ImageType;
import at.favre.tools.dconvert.converters.Result;
import at.favre.tools.dconvert.converters.postprocessing.IPostProcessor;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;
import java.util.Collections;
import java.util.UUID;
import java.util.concurrent.locks.ReentrantLock;
/**
* Util for post processors
*/
public class PostProcessorUtil {
private static ReentrantLock lock = new ReentrantLock();
public static Result runImageOptimizer(File rawFile, ImageType processedType, String[] args, boolean keepOriginal) throws IOException {
return runImageOptimizer(rawFile, processedType, args, keepOriginal, MiscUtil.getFileExtension(rawFile));
}
public static Result runImageOptimizer(File rawFile, ImageType processedType, String[] args, boolean keepOriginal, String outExtension) throws IOException {
if (Arguments.getImageType(rawFile) == processedType && rawFile.exists() && rawFile.isFile()) {
String id = UUID.randomUUID().toString().substring(0, 8);
File outFile = getFileWithPostFix(rawFile, "_optimized_" + id, outExtension);
File copy = getFileWithPostFix(rawFile, "_copy_" + id, outExtension);
Files.copy(rawFile.toPath(), copy.toPath(), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING);
for (int i = 0; i < args.length; i++) {
if (args[i].equals("%%outFilePath%%")) {
args[i] = "\"" + outFile.getAbsolutePath() + "\"";
}
if (args[i].equals("%%sourceFilePath%%")) {
args[i] = "\"" + copy.getAbsolutePath() + "\"";
}
}
Result result = runCmd(args);
copy.delete();
boolean r1 = true, r2 = true, r3 = true;
if (outFile.exists() && outFile.isFile()) {
if (keepOriginal) {
File origFile = getFileWithPostFix(rawFile, IPostProcessor.ORIG_POSTFIX, MiscUtil.getFileExtension(rawFile));
if (origFile.exists()) {
origFile.delete();
}
r1 = rawFile.renameTo(origFile);
File outFileNew = getFileWithPostFix(rawFile, "", outExtension);
if (outFileNew.exists()) {
outFileNew.delete();
}
r2 = outFile.renameTo(outFileNew);
} else {
if (rawFile.delete()) {
File outFileNew = getFileWithPostFix(rawFile, "", outExtension);
if (outFileNew.exists()) {
outFileNew.delete();
}
r3 = outFile.renameTo(outFileNew);
}
}
}
String log = result.log;
if (!r1 || !r2 || !r3) {
log += "Could not rename all files correctly\n";
}
return new Result(log, result.exception, Collections.singletonList(rawFile));
}
return null;
}
private static File getFileWithPostFix(File src, String postfix, String extension) {
return new File(src.getParentFile(), MiscUtil.getFileNameWithoutExtension(src) + postfix + "." + extension);
}
private static Result runCmd(String[] cmdArray) {
StringBuilder logStringBuilder = new StringBuilder();
Exception exception = null;
try {
logStringBuilder.append("execute: ").append(Arrays.toString(cmdArray)).append("\n");
ProcessBuilder pb = new ProcessBuilder(cmdArray);
pb.redirectErrorStream(true);
Process process = pb.start();
try (BufferedReader inStreamReader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
String s;
while ((s = inStreamReader.readLine()) != null) {
if (!s.isEmpty()) logStringBuilder.append("\t").append(s).append("\n");
}
}
process.waitFor();
} catch (Exception e) {
exception = e;
logStringBuilder.append("error: could not run command - ").append(Arrays.toString(cmdArray)).append(" - ").append(e.getMessage()).append(" - is it set in PATH?\n");
}
return new Result(logStringBuilder.toString(), exception, Collections.emptyList());
}
public static boolean canRunCmd(String[] cmdArray) {
try {
ProcessBuilder pb = new ProcessBuilder(cmdArray);
pb.redirectErrorStream(true);
Process process = pb.start();
try (BufferedReader inStreamReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
while ((inStreamReader.readLine()) != null) {
}
}
process.waitFor();
} catch (Exception e) {
return false;
}
return true;
}
}