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.Validate; import org.springframework.roo.support.logging.HandlerUtils; /** * {@link UndoableOperation} to create a directory, including any parents. * <p> * Note that the created instance will internally track the uppermost directory * it created, and remove that directory during any undo operation. * * @author Ben Alex * @since 1.0 */ public class CreateDirectory implements UndoableOperation { private static final Logger LOGGER = HandlerUtils.getLogger(CreateDirectory.class); private final File actual; private File deleteFrom; private final FilenameResolver filenameResolver; public CreateDirectory(final UndoManager undoManager, final FilenameResolver filenameResolver, final File actual) { Validate.notNull(undoManager, "Undo manager required"); Validate.notNull(actual, "Actual file required"); Validate.notNull(filenameResolver, "Filename resolver required"); Validate.isTrue(!actual.exists(), "Actual file '%s' cannot exist", actual); this.filenameResolver = filenameResolver; this.actual = actual; // Figure out the first directory we should delete from deleteFrom = actual; while (true) { final File parent = deleteFrom.getParentFile(); if (!parent.exists()) { deleteFrom = parent; } else { break; } } Validate.validState(this.actual.mkdirs(), "Could not create directory '%s'", actual); undoManager.add(this); LOGGER.fine("Created " + filenameResolver.getMeaningfulName(actual)); } public void reset() {} public boolean undo() { boolean success = true; try { FileUtils.deleteDirectory(deleteFrom); } catch (IOException e) { success = false; } LOGGER.fine((success ? "Undo create " : "Undo failed ") + filenameResolver.getMeaningfulName(actual)); return success; } }