46386b27461c63ed639b2ee9c2c386eca27f34ea
[idea/community.git] / platform / lang-impl / src / com / intellij / lang / javascript / boilerplate / GithubDownloadUtil.java
1 package com.intellij.lang.javascript.boilerplate;
2
3 import com.intellij.openapi.application.PathManager;
4 import com.intellij.openapi.progress.ProgressIndicator;
5 import com.intellij.openapi.progress.ProgressManager;
6 import com.intellij.openapi.project.Project;
7 import com.intellij.openapi.util.io.FileUtil;
8 import com.intellij.platform.templates.github.DownloadUtil;
9 import com.intellij.platform.templates.github.GeneratorException;
10 import com.intellij.platform.templates.github.Outcome;
11 import com.intellij.util.Producer;
12 import com.intellij.util.net.IOExceptionDialog;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
15
16 import java.io.File;
17 import java.io.IOException;
18 import java.util.concurrent.Callable;
19
20 /**
21  * @author Sergey Simonchik
22  */
23 public class GithubDownloadUtil {
24
25   private GithubDownloadUtil() {}
26
27   @NotNull
28   private static String formatGithubRepositoryName(@NotNull String userName, @NotNull String repositoryName) {
29     return "github-" + userName + "-" + repositoryName;
30   }
31
32   @NotNull
33   public static File getCacheDir(@NotNull String userName, @NotNull String repositoryName) {
34     File generatorsDir = new File(PathManager.getSystemPath(), "projectGenerators");
35     String dirName = formatGithubRepositoryName(userName, repositoryName);
36     File dir = new File(generatorsDir, dirName);
37     try {
38       return dir.getCanonicalFile();
39     } catch (IOException e) {
40       return dir;
41     }
42   }
43
44   public static File findCacheFile(@NotNull String userName, @NotNull String repositoryName, @NotNull String cacheFileName) {
45     File dir = getCacheDir(userName, repositoryName);
46     return new File(dir, cacheFileName);
47   }
48
49   @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
50   public static void downloadContentToFileWithProgressSynchronously(
51     @Nullable Project project,
52     @NotNull final String url,
53     @NotNull String progressTitle,
54     @NotNull final File outputFile,
55     @NotNull final String userName,
56     @NotNull final String repositoryName,
57     final boolean retryOnError) throws GeneratorException
58   {
59     Outcome<File> outcome = DownloadUtil.provideDataWithProgressSynchronously(
60       project,
61       progressTitle,
62       "Downloading zip archive" + DownloadUtil.CONTENT_LENGTH_TEMPLATE + " ...",
63       new Callable<File>() {
64         @Override
65         public File call() throws Exception {
66           ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator();
67           downloadAtomically(progress, url, outputFile, userName, repositoryName);
68           return outputFile;
69         }
70       }, new Producer<Boolean>() {
71         @Override
72         public Boolean produce() {
73           if (!retryOnError) {
74             return false;
75           }
76           return IOExceptionDialog.showErrorDialog("Download Error", "Can not download '" + url + "'");
77         }
78       }
79     );
80     File out = outcome.get();
81     if (out != null) {
82       return;
83     }
84     Exception e = outcome.getException();
85     if (e != null) {
86       throw new GeneratorException("Can not fetch content from " + url);
87     }
88     throw new GeneratorException("Download was cancelled");
89   }
90
91   /**
92    * Downloads content of {@code url} to {@code outputFile}.
93    * {@code outputFile} won't be modified in case of any I/O download errors.
94    *
95    * @param indicator   progress indicator
96    * @param url         url to download
97    * @param outputFile  output file
98    */
99   public static void downloadAtomically(@Nullable ProgressIndicator indicator,
100                                         @NotNull String url,
101                                         @NotNull File outputFile,
102                                         @NotNull String userName,
103                                         @NotNull String repositoryName) throws IOException
104   {
105     String tempFileName = String.format("github-%s-%s-%s", userName, repositoryName, outputFile.getName());
106     File tempFile = FileUtil.createTempFile(tempFileName + "-", ".tmp");
107     DownloadUtil.downloadAtomically(indicator, url, outputFile, tempFile);
108   }
109
110 }