diff: deprecate BinaryFileContent

* check FileType instead
* compare files using streams
* binary viewer want to show UIBasedFileType even if it's DocumentContent
This commit is contained in:
Aleksey Pivovarov
2015-05-13 15:55:24 +03:00
parent 39cdd40876
commit ac599da7bf
7 changed files with 49 additions and 22 deletions
@@ -15,10 +15,13 @@
*/
package com.intellij.diff.contents;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
@Deprecated
/** @deprecated Use {@link FileContent} and {@link VirtualFile#contentsToByteArray()} */
public interface BinaryFileContent extends FileContent {
/**
* @return Binary representation of content.
@@ -101,7 +101,7 @@ public class DiffContentFactoryImpl extends DiffContentFactory {
if (file.isDirectory()) return new DirectoryContentImpl(project, file);
DocumentContent content = createDocument(project, file);
if (content != null) return content;
return new BinaryFileContentImpl(project, file);
return new FileContentImpl(project, file);
}
@Override
@@ -25,14 +25,14 @@ import org.jetbrains.annotations.Nullable;
import java.io.IOException;
/**
* Allows to compare binary files
* Allows to compare files
*/
public class BinaryFileContentImpl implements DiffContent, BinaryFileContent {
public class FileContentImpl implements FileContent, BinaryFileContent {
@NotNull private final VirtualFile myFile;
@Nullable private final Project myProject;
@NotNull private final FileType myType;
public BinaryFileContentImpl(@Nullable Project project, @NotNull VirtualFile file) {
public FileContentImpl(@Nullable Project project, @NotNull VirtualFile file) {
assert file.isValid() && !file.isDirectory();
myProject = project;
myFile = file;
@@ -26,6 +26,7 @@ import com.intellij.diff.util.DiffUtil;
import com.intellij.diff.util.Side;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
@@ -42,6 +43,7 @@ import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Couple;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
@@ -172,9 +174,9 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
@NotNull
private Pair<FileEditor, FileEditorProvider> createEditor(@NotNull final DiffContent content) throws IOException {
if (content instanceof EmptyContent) return Pair.empty();
if (content instanceof BinaryFileContent) {
if (content instanceof FileContent) {
Project project = myProject != null ? myProject : ProjectManager.getInstance().getDefaultProject();
VirtualFile file = ((BinaryFileContent)content).getFile();
VirtualFile file = ((FileContent)content).getFile();
FileEditorProvider[] providers = FileEditorProviderManager.getInstance().getProviders(project, file);
if (providers.length == 0) throw new IOException("Can't find FileEditorProvider");
@@ -269,8 +271,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
};
}
// TODO: compare text with image by-byte?
if (!(contents.get(0) instanceof BinaryFileContent) || !(contents.get(1) instanceof BinaryFileContent)) {
if (!(contents.get(0) instanceof FileContent) || !(contents.get(1) instanceof FileContent)) {
return new Runnable() {
@Override
public void run() {
@@ -279,12 +280,35 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
};
}
final BinaryFileContent content1 = (BinaryFileContent)contents.get(0);
final BinaryFileContent content2 = (BinaryFileContent)contents.get(1);
byte[] bytes1 = content1.getBytes();
byte[] bytes2 = content2.getBytes();
final VirtualFile file1 = ((FileContent)contents.get(0)).getFile();
final VirtualFile file2 = ((FileContent)contents.get(1)).getFile();
if (!file1.isValid() || !file2.isValid()) {
return new Runnable() {
@Override
public void run() {
myPanel.addDiffErrorNotification();
clearDiffPresentation();
}
};
}
final boolean equal = Arrays.equals(bytes1, bytes2);
final boolean equal = ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() {
@Override
public Boolean compute() {
try {
// we can't use getInputStream() here because we can't restore BOM marker
// (getBom() can return null for binary files, while getInputStream() strips BOM for all files).
// It can be made for files from VFS that implements FileSystemInterface though.
byte[] bytes1 = file1.contentsToByteArray();
byte[] bytes2 = file2.contentsToByteArray();
return Arrays.equals(bytes1, bytes2);
}
catch (IOException e) {
LOG.warn(e);
return false;
}
}
});
return new Runnable() {
@Override
@@ -401,10 +425,10 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
public static boolean canShowContent(@NotNull DiffContent content, @NotNull DiffContext context) {
if (content instanceof EmptyContent) return true;
if (content instanceof DocumentContent) return true;
if (content instanceof BinaryFileContent) {
if (content instanceof FileContent) {
Project project = context.getProject();
if (project == null) project = ProjectManager.getInstance().getDefaultProject();
VirtualFile file = ((BinaryFileContent)content).getFile();
VirtualFile file = ((FileContent)content).getFile();
return FileEditorProviderManager.getInstance().getProviders(project, file).length != 0;
}
@@ -413,8 +437,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
public static boolean wantShowContent(@NotNull DiffContent content, @NotNull DiffContext context) {
if (content instanceof EmptyContent) return false;
if (content instanceof DocumentContent) return false;
if (content instanceof BinaryFileContent) {
if (content instanceof FileContent) {
if (content.getContentType() == null) return false;
if (content.getContentType().isBinary()) return true;
if (content.getContentType() instanceof UIBasedFileType) return true;
@@ -153,6 +153,7 @@ class DirDiffViewer implements FrameDiffTool.DiffViewer {
if (content instanceof DirectoryContent) return true;
if (content instanceof FileContent &&
content.getContentType() instanceof ArchiveFileType &&
((FileContent)content).getFile().isValid() &&
((FileContent)content).getFile().isInLocalFileSystem()) {
return true;
}
@@ -16,9 +16,9 @@
package com.intellij.diff.tools.util.base;
import com.intellij.diff.DiffContext;
import com.intellij.diff.contents.BinaryFileContent;
import com.intellij.diff.contents.DiffContent;
import com.intellij.diff.contents.DocumentContent;
import com.intellij.diff.contents.FileContent;
import com.intellij.diff.requests.ContentDiffRequest;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.event.DocumentAdapter;
@@ -79,8 +79,8 @@ public abstract class ListenerDiffViewerBase extends DiffViewerBase {
protected VirtualFileListener createFileListener(@NotNull ContentDiffRequest request) {
final List<VirtualFile> files = new ArrayList<VirtualFile>(0);
for (DiffContent content : request.getContents()) {
if (content instanceof BinaryFileContent) {
files.add(((BinaryFileContent)content).getFile());
if (content instanceof FileContent && !(content instanceof DocumentContent)) {
files.add(((FileContent)content).getFile());
}
}
@@ -1,5 +1,6 @@
package com.intellij.openapi.vcs.changes.actions.migrate;
import com.intellij.diff.contents.FileContentImpl;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -22,7 +23,6 @@ import com.intellij.diff.chains.DiffRequestChain;
import com.intellij.diff.chains.DiffRequestProducer;
import com.intellij.diff.chains.DiffRequestProducerException;
import com.intellij.diff.chains.SimpleDiffRequestChain;
import com.intellij.diff.contents.BinaryFileContentImpl;
import com.intellij.diff.contents.DiffContent;
import com.intellij.diff.contents.DocumentContentImpl;
import com.intellij.diff.contents.EmptyContent;
@@ -118,7 +118,7 @@ public class MigrateToNewDiffUtil {
if (oldContent.isBinary()) {
VirtualFile file = oldContent.getFile();
if (file == null) return null;
return new BinaryFileContentImpl(project, file);
return new FileContentImpl(project, file);
}
else {
Document document = oldContent.getDocument();