package at.favre.tools.dconvert.converters.postprocessing;
import at.favre.tools.dconvert.converters.Result;
import java.io.File;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
/**
* Shared code among {@link IPostProcessor}.
* <p>
* This helps to synchronize processors: will create a lock for each input file,
* so that only 1 processor can process a file at a time
*/
public abstract class APostProcessor implements IPostProcessor {
private static Map<File, ReentrantLock> lockMap = new ConcurrentHashMap<>();
private static ReentrantLock administrationLock = new ReentrantLock(true);
@Override
public Result process(File rawFile, boolean keepOriginal) {
try {
administrationLock.lock();
if (!lockMap.containsKey(rawFile)) {
lockMap.put(rawFile, new ReentrantLock(true));
}
administrationLock.unlock();
lockMap.get(rawFile).lock();
return synchronizedProcess(rawFile, keepOriginal);
} finally {
lockMap.get(rawFile).unlock();
}
}
/**
* This is the thread safe version of {@link #process(File, boolean)}
*
* @param rawFile
* @param keepOriginal
* @return
*/
protected abstract Result synchronizedProcess(File rawFile, boolean keepOriginal);
}