package com.wix;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
/**
* Process target file, either the real file or a temp file
*/
public class ActualFile {
private static final Logger LOG = Logger.getInstance(Util.LOG_ID);
ActualFile(File file, File tempFile) {
this.file = file;
this.tempFile = tempFile;
}
ActualFile(File file) {
this(file, null);
}
private final File file;
private final File tempFile;
public File getFile() {
return file;
}
public File getActualFile() {
if (tempFile != null) {
return tempFile;
}
return file;
}
public void deleteTemp() {
if (tempFile != null && tempFile.exists() && tempFile.isFile()) {
boolean isDeleted = tempFile.delete();
if (!isDeleted) {
LOG.debug("Failed to delete temp file");
}
}
}
@Nullable
public static ActualFile getOrCreateActualFile(@NotNull Key<ThreadLocalActualFile> key, @NotNull VirtualFile virtualFile, @Nullable String content) {
FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance();
if (!fileDocumentManager.isFileModified(virtualFile)) {
File file = new File(virtualFile.getPath());
if (file.isFile()) {
return new ActualFile(file);
}
}
ThreadLocalActualFile threadLocal = key.get(virtualFile);
if (threadLocal == null) {
threadLocal = virtualFile.putUserDataIfAbsent(key, new ThreadLocalActualFile(virtualFile));
}
File file = threadLocal.getOrCreateFile();
if (file == null) {
return null;
}
if (content == null) {
Document document = fileDocumentManager.getDocument(virtualFile);
if (document != null) {
content = document.getText();
}
}
if (content == null) {
return null;
}
try {
FileUtil.writeToFile(file, content);
return new ActualFile(new File(virtualFile.getPath()), file);
} catch (IOException e) {
LOG.warn("Can not write to " + file.getAbsolutePath(), e);
}
return null;
}
}