Merge branch 'master' of git.labs.intellij.net:idea/community

This commit is contained in:
Michael Golubev
2013-12-02 18:47:13 +01:00
2 changed files with 49 additions and 3 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.vfs.impl.http;
import com.intellij.openapi.util.AsyncResult;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
@@ -34,4 +35,7 @@ public interface RemoteFileInfo {
RemoteFileState getState();
void cancelDownloading();
@NotNull
AsyncResult<VirtualFile> download();
}
@@ -19,10 +19,11 @@ import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.util.AsyncResult;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsBundle;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -142,7 +143,7 @@ public class RemoteFileInfoImpl implements RemoteContentProvider.DownloadingCall
VirtualFile localFile = new WriteAction<VirtualFile>() {
@Override
protected void run(final Result<VirtualFile> result) {
protected void run(@NotNull final Result<VirtualFile> result) {
final VirtualFile file = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(localIOFile);
if (file != null) {
file.refresh(false, false);
@@ -234,7 +235,7 @@ public class RemoteFileInfoImpl implements RemoteContentProvider.DownloadingCall
myCancelled.set(true);
if (myPrevLocalFile != null) {
myLocalVirtualFile = myPrevLocalFile;
myLocalFile = VfsUtil.virtualToIoFile(myLocalVirtualFile);
myLocalFile = VfsUtilCore.virtualToIoFile(myLocalVirtualFile);
myState = RemoteFileState.DOWNLOADED;
myErrorMessage = null;
}
@@ -291,4 +292,45 @@ public class RemoteFileInfoImpl implements RemoteContentProvider.DownloadingCall
}
}
}
@NotNull
@Override
public AsyncResult<VirtualFile> download() {
synchronized (myLock) {
switch (getState()) {
case DOWNLOADING_NOT_STARTED:
startDownloading();
return createDownloadedCallback(this);
case DOWNLOADING_IN_PROGRESS:
return createDownloadedCallback(this);
case DOWNLOADED:
return new AsyncResult.Done<VirtualFile>(myLocalVirtualFile);
case ERROR_OCCURRED:
default:
return new AsyncResult.Rejected<VirtualFile>();
}
}
}
private static AsyncResult<VirtualFile> createDownloadedCallback(@NotNull RemoteFileInfo remoteFileInfo) {
final AsyncResult<VirtualFile> callback = new AsyncResult<VirtualFile>();
remoteFileInfo.addDownloadingListener(new FileDownloadingAdapter() {
@Override
public void fileDownloaded(VirtualFile localFile) {
callback.setDone(localFile);
}
@Override
public void errorOccurred(@NotNull String errorMessage) {
callback.reject(errorMessage);
}
@Override
public void downloadingCancelled() {
callback.setRejected();
}
});
return callback;
}
}