package org.jmeld.util.file.cmd; import org.jmeld.util.file.*; import org.jmeld.util.node.*; import java.io.*; import java.util.*; public class CopyFileCmd extends AbstractCmd { private JMDiffNode diffNode; private FileNode fromFileNode; private FileNode toFileNode; public CopyFileCmd(JMDiffNode diffNode, FileNode fromFileNode, FileNode toFileNode) throws Exception { this.diffNode = diffNode; this.fromFileNode = fromFileNode; this.toFileNode = toFileNode; } public void createCommands() throws Exception { List<File> parentFiles; File fromFile; File toFile; fromFile = fromFileNode.getFile().getCanonicalFile(); toFile = toFileNode.getFile().getCanonicalFile(); parentFiles = FileUtil.getParentFiles(toFile); Collections.reverse(parentFiles); for (File parentFile : parentFiles) { if (!parentFile.exists()) { addCommand(new MkDirCommand(parentFile)); } } addCommand(new CopyCommand(fromFile, toFile)); addFinallyCommand(new ResetCommand(toFileNode)); } class MkDirCommand extends Command { private File dirFile; MkDirCommand(File dirFile) throws Exception { this.dirFile = dirFile; } public void execute() throws Exception { if (debug) { System.out.println("mkdir : " + dirFile); } dirFile.mkdir(); } public void undo() { if (debug) { System.out.println("rmdir : " + dirFile); } dirFile.delete(); } } class CopyCommand extends Command { private File fromFile; private File toFile; private File backupFile; private boolean toFileExists; CopyCommand(File fromFile, File toFile) { this.fromFile = fromFile; this.toFile = toFile; } public void execute() throws Exception { if (toFile.exists()) { toFileExists = true; backupFile = FileUtil.createTempFile("jmeld", "backup"); if (debug) { System.out.println("copy : " + toFile + " -> " + backupFile); } FileUtil.copy(toFile, backupFile); } if (debug) { System.out.println("copy : " + fromFile + " -> " + toFile); } FileUtil.copy(fromFile, toFile); } public void undo() { try { if (toFileExists) { if (backupFile != null) { if (debug) { System.out.println("copy : " + backupFile + " -> " + toFile); } FileUtil.copy(backupFile, toFile); backupFile.delete(); backupFile = null; } } else { if (debug) { System.out.println("delete : " + toFile); } toFile.delete(); } } catch (Exception ex) { ex.printStackTrace(); } } @Override public void discard() { if (backupFile != null) { if (debug) { System.out.println("delete : " + backupFile); } backupFile.delete(); } } } class ResetCommand extends Command { private FileNode fileNode; ResetCommand(FileNode fileNode) { this.fileNode = fileNode; } public void execute() throws Exception { reset(); } public void undo() { reset(); } @Override public void discard() { reset(); } private void reset() { fileNode.resetContent(); diffNode.compareContents(); } } }