package org.springframework.roo.file.undo; import java.io.File; import java.io.IOException; import java.util.logging.Logger; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.springframework.roo.support.logging.HandlerUtils; /** * {@link UndoableOperation} to delete a file. * * @author Ben Alex * @since 1.0 */ public class DeleteFile implements UndoableOperation { private static final Logger LOGGER = HandlerUtils.getLogger(DeleteFile.class); private final File actual; private final File backup; private final FilenameResolver filenameResolver; /** * Constructor that doesn't allow a reason to be given * * @param undoManager cannot be <code>null</code> * @param filenameResolver cannot be <code>null</code> * @param actual the file to delete; must be an existing file (not a * directory) * @deprecated use the constructor that allows a reason to be given */ @Deprecated public DeleteFile(final UndoManager undoManager, final FilenameResolver filenameResolver, final File actual) { this(undoManager, filenameResolver, actual, null); } /** * Constructor that allows a reason to be given * * @param undoManager cannot be <code>null</code> * @param filenameResolver cannot be <code>null</code> * @param actual the file to delete; must be an existing file (not a * directory) * @param reason the reason for the file's deletion (can be blank) * @since 1.2.0 */ public DeleteFile(final UndoManager undoManager, final FilenameResolver filenameResolver, final File actual, final String reason) { Validate.notNull(undoManager, "Undo manager required"); Validate.notNull(actual, "File required"); Validate.notNull(filenameResolver, "Filename resolver required"); Validate.isTrue(actual.exists(), "File '%s' must exist", actual); Validate.isTrue(actual.isFile(), "Path '%s' must be a file (not a directory)", actual); try { backup = File.createTempFile("DeleteFile", "tmp"); FileUtils.copyFile(actual, backup); } catch (final IOException ioe) { throw new IllegalStateException("Unable to make a backup of file '" + actual + "'", ioe); } this.actual = actual; this.actual.delete(); this.filenameResolver = filenameResolver; undoManager.add(this); String deletionMessage = "Deleted " + filenameResolver.getMeaningfulName(actual); if (StringUtils.isNotBlank(reason)) { deletionMessage += " - " + reason.trim(); } LOGGER.fine(deletionMessage); } public void reset() { // Fix for ROO-1555 try { if (backup.delete()) { LOGGER.finest("Reset manage " + filenameResolver.getMeaningfulName(backup)); } else { backup.deleteOnExit(); LOGGER.fine("Reset failed " + filenameResolver.getMeaningfulName(backup)); } } catch (final Throwable e) { backup.deleteOnExit(); LOGGER.fine("Reset failed " + filenameResolver.getMeaningfulName(backup)); } } public boolean undo() { try { FileUtils.copyFile(backup, actual); LOGGER.fine("Undo delete " + filenameResolver.getMeaningfulName(actual)); return true; } catch (final IOException ioe) { LOGGER.fine("Undo failed " + filenameResolver.getMeaningfulName(actual)); return false; } } }