diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileInfo.java b/platform/core-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileInfo.java index 9f4ef3e05fb7..9f517bb5b61a 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileInfo.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileInfo.java @@ -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 download(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileInfoImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileInfoImpl.java index 5775d2160b5f..4328df107d6f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileInfoImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileInfoImpl.java @@ -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() { @Override - protected void run(final Result result) { + protected void run(@NotNull final Result 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 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(myLocalVirtualFile); + + case ERROR_OCCURRED: + default: + return new AsyncResult.Rejected(); + } + } + } + + private static AsyncResult createDownloadedCallback(@NotNull RemoteFileInfo remoteFileInfo) { + final AsyncResult callback = new AsyncResult(); + 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; + } }