001 package edu.rice.cs.cunit.instrumentors; 002 003 import java.io.File; 004 import java.io.IOException; 005 006 /** 007 * Exception inside the file instrumentor, preventing it to delete and rename two files. 008 * 009 * @author Mathias Ricken 010 */ 011 public class CouldNotDoubleRenameException extends RetryIOException { 012 /** 013 * File to rename to _oldFile. 014 */ 015 private File _curFile = null; 016 017 /** 018 * New fname of _curFile. 019 */ 020 private File _oldFile = null; 021 022 /** 023 * File to rename to _oldFile. 024 */ 025 private File _newFile = null; 026 027 /** 028 * Constructs a new exception. 029 * @param curFile current file, to be renamed to oldFile 030 * @param oldFile old file 031 * @param newFile new file, to be renamed to curFile 032 */ 033 public CouldNotDoubleRenameException(File curFile, File oldFile, File newFile) { 034 super("Could not rename file " + curFile.getPath()+ " to " + oldFile.getPath() + " and rename file " + 035 newFile.getPath()+ " to " + curFile.getPath()); 036 _curFile = curFile; 037 _oldFile = oldFile; 038 _newFile = newFile; 039 } 040 041 /** 042 * Retry the failed operation one more time. 043 * @throws java.io.IOException 044 */ 045 public void retry() throws IOException { 046 if (_curFile.exists() && !_oldFile.exists() && _newFile.exists()) { 047 boolean res = _curFile.renameTo(_oldFile); 048 if (!res) { 049 throw new IOException(getMessage()); 050 } 051 res = _newFile.renameTo(_curFile); 052 if (!res) { 053 throw new IOException(getMessage()); 054 } 055 } 056 else { 057 throw new IOException(getMessage()+"; cannot fix, situation not applicable"); 058 } 059 } 060 }