/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.filesystem;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import gw.config.CommonServices;
import gw.fs.IFile;
import gw.plugin.ij.core.IDEAPlatformHelper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class IDEAFile extends IDEAResource implements IFile {
public IDEAFile(VirtualFile file) {
super(file);
}
public IDEAFile(String file) {
super(file);
}
@Nullable
@Override
public InputStream openInputStream() throws IOException {
String temporaryBuffer = getTemporaryBuffer(this);
if (temporaryBuffer != null) {
return new ByteArrayInputStream(temporaryBuffer.getBytes("UTF-8"));
} else {
return _virtualFile != null ? _virtualFile.getInputStream() : new FileInputStream(new File(_path));
}
}
@Nullable
private String getTemporaryBuffer(@NotNull IDEAFile file) {
final VirtualFile virtualFile = file.getVirtualFile();
// we're getting the cached documents since getDocument() forces PSI creating which will cause deadlock !!!
if (virtualFile != null && !virtualFile.getFileType().isBinary()) {
final Document document = FileDocumentManager.getInstance().getCachedDocument(virtualFile);
final String[] result = new String[1];
if (document != null) {
if (ApplicationManagerEx.getApplicationEx().tryRunReadAction(new Runnable() {
@Override
public void run() {
result[0] = document.getText();
}
})) {
return result[0];
} else {
return document.getCharsSequence().toString();
}
}
}
return null;
}
@Nullable
@Override
public OutputStream openOutputStream() throws IOException {
return _virtualFile != null ? _virtualFile.getOutputStream(this) : null;
}
@Nullable
@Override
public OutputStream openOutputStreamForAppend() throws IOException {
return _virtualFile != null ? _virtualFile.getOutputStream(this) : null;
}
@Nullable
@Override
public String getExtension() {
return _virtualFile != null ? _virtualFile.getExtension() : FileUtil.getExtension(_path);
}
@NotNull
@Override
public String getBaseName() {
if (_virtualFile != null) {
return _virtualFile.getNameWithoutExtension();
} else {
String name = _path.substring(_path.lastIndexOf('/') + 1);
name = name.substring(0, name.lastIndexOf('.'));
return name;
}
}
protected VirtualFile create(@NotNull final VirtualFile virtualFile, @NotNull final String name) throws IOException {
final VirtualFile[] result = new VirtualFile[1];
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
try {
result[0] = virtualFile.createChildData(this, name);
} catch (IOException e) {
e.printStackTrace();
}
}
});
return result[0];
}
}