package org.hive2hive.client.util.buffer; import java.io.File; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.hive2hive.core.api.interfaces.IFileManager; import org.hive2hive.core.exceptions.NoPeerConnectionException; import org.hive2hive.core.exceptions.NoSessionException; import org.hive2hive.core.file.FileUtil; import org.hive2hive.core.processes.files.list.FileNode; import org.hive2hive.processframework.exceptions.InvalidProcessStateException; import org.hive2hive.processframework.exceptions.ProcessExecutionException; import org.hive2hive.processframework.interfaces.IProcessComponent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DeleteFileBuffer extends BaseFileBuffer { private static final Logger logger = LoggerFactory.getLogger(DeleteFileBuffer.class); public DeleteFileBuffer(IFileManager fileManager) { super(fileManager); } /** * Process the files in the buffer after the buffering time exceeded. * * @param buffer */ protected void processBuffer(IFileBufferHolder buffer) { List<File> bufferedFiles = buffer.getFileBuffer(); Set<FileNode> syncFiles = buffer.getSyncFiles(); Set<File> toRemove = new HashSet<File>(); for (File file : bufferedFiles) { boolean found = false; for (FileNode fileTaste : syncFiles) { if (fileTaste.getFile().equals(file)) { found = true; break; } } if (!found) { // has already been removed, is not in UP anymore toRemove.add(file); } } bufferedFiles.removeAll(toRemove); // sort first FileUtil.sortPreorder(bufferedFiles); // reverse the sorting Collections.reverse(bufferedFiles); // execute processes synchronously IProcessComponent<?> deleteProcess; for (File toDelete : bufferedFiles) { try { deleteProcess = fileManager.createDeleteProcess(toDelete); } catch (NoPeerConnectionException | NoSessionException | IllegalArgumentException ex) { logger.error("Cannot create a process to delete '{}'.", toDelete.getName(), ex); continue; } try { deleteProcess.execute(); // synchronous } catch (InvalidProcessStateException ex) { logger.error("Cannot start the '{}' to delete '{}'.", deleteProcess, toDelete.getName(), ex); continue; } catch (ProcessExecutionException ex) { logger.error("Process execution of '{}' to delete '{}' failed.", deleteProcess, toDelete.getName(), ex); continue; } } logger.debug("Buffer with {} files processed.", bufferedFiles.size()); } }