82172d33b83cdbc20b962446202c795b46e5d32d
[teamcity/dotNetPackagesSupport.git] / nuget-server / src / jetbrains / buildServer / nuget / server / toolRegistry / impl / NuGetToolsInstaller.java
1 /*\r
2  * Copyright 2000-2011 JetBrains s.r.o.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 package jetbrains.buildServer.nuget.server.toolRegistry.impl;\r
18 \r
19 import com.intellij.openapi.diagnostic.Logger;\r
20 import jetbrains.buildServer.nuget.server.feed.reader.FeedPackage;\r
21 import jetbrains.buildServer.nuget.server.feed.reader.NuGetFeedReader;\r
22 import jetbrains.buildServer.util.ArchiveUtil;\r
23 import jetbrains.buildServer.util.FileUtil;\r
24 import org.jetbrains.annotations.NotNull;\r
25 \r
26 import java.io.*;\r
27 import java.util.zip.ZipInputStream;\r
28 \r
29 /**\r
30  * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
31  * Date: 15.08.11 20:47\r
32  */\r
33 public class NuGetToolsInstaller {\r
34   private static final Logger LOG = Logger.getInstance(NuGetToolsInstaller.class.getName());\r
35 \r
36   private final ToolPaths myToolPaths;\r
37   private final NuGetFeedReader myClient;\r
38   private final AvailableToolsState myState;\r
39   private final ToolPacker myPacker;\r
40   private final PluginNaming myNaming;\r
41 \r
42   public NuGetToolsInstaller(@NotNull final ToolPaths toolPaths,\r
43                              @NotNull final NuGetFeedReader client,\r
44                              @NotNull final AvailableToolsState state,\r
45                              @NotNull final ToolPacker packer,\r
46                              @NotNull final PluginNaming naming) {\r
47     myToolPaths = toolPaths;\r
48     myClient = client;\r
49     myState = state;\r
50     myPacker = packer;\r
51     myNaming = naming;\r
52   }\r
53 \r
54   public InstallResult installNuGet(@NotNull final String packageId, @NotNull final InstallLogger logger) {\r
55     logger.started(packageId);\r
56 \r
57     FeedPackage tool = null;\r
58     try {\r
59       tool = myState.findTool(packageId);\r
60       if (tool == null) {\r
61         logger.packageNotFound(packageId);\r
62         return null;\r
63       }\r
64 \r
65       final File pkg = downloadPackage(logger, tool);\r
66       final File dest = extractPackage(logger, tool, pkg);\r
67       File agentTool = packAgentPlugin(logger, tool, dest);\r
68       agentTool = registerAgentPlugins(logger, tool, agentTool);\r
69 \r
70       return new InstallResult(dest, agentTool);\r
71     } catch (ProcessedException e) {\r
72       return null;\r
73     } catch (Exception e) {\r
74       LOG.warn("Failed to install NuGet.Commandline package. " + e.getMessage(), e);\r
75       return null;\r
76     } finally {\r
77       logger.finished(packageId, tool);\r
78     }\r
79   }\r
80 \r
81   @NotNull\r
82   private File registerAgentPlugins(InstallLogger logger, FeedPackage tool, File agentTool) {\r
83     logger.agentToolPubslishStarted(tool, agentTool);\r
84 \r
85     try {\r
86       final File dest = myNaming.getAgetToolFilePath(tool);\r
87       if (!agentTool.renameTo(dest)) {\r
88         FileUtil.copy(agentTool, dest);\r
89         FileUtil.delete(agentTool);\r
90       }\r
91       return dest;\r
92     } catch (Exception e) {\r
93       logger.agentToolPublishFailed(tool, agentTool, e);\r
94       throw new ProcessedException();\r
95     } finally {\r
96       logger.agentToolPuglishFinished(tool, agentTool);\r
97     }\r
98   }\r
99 \r
100   private String getAgentToolFileName(@NotNull String version) {\r
101     return "nuget-commnadline-" + version;\r
102   }\r
103 \r
104   private File packAgentPlugin(@NotNull final InstallLogger logger,\r
105                                @NotNull final FeedPackage tool,\r
106                                @NotNull final File dest) {\r
107     logger.agentToolPackStarted(tool, dest);\r
108     try {\r
109       return myPacker.packTool(getAgentToolFileName(tool.getInfo().getVersion()), dest);\r
110     } catch (Exception e) {\r
111       logger.agentToolPackFailed(tool, dest, e);\r
112       LOG.warn("Failed to pack agent tool " + tool);\r
113       throw new ProcessedException();\r
114     } finally {\r
115       logger.agentToolPackFinished(tool);\r
116     }\r
117   }\r
118 \r
119   @NotNull\r
120   private File extractPackage(@NotNull final InstallLogger logger,\r
121                               @NotNull final FeedPackage tool,\r
122                               @NotNull final File pkg) {\r
123     logger.packageUnpackStarted(tool, pkg);\r
124     File dest = null;\r
125     try {\r
126       dest = new File(myToolPaths.getTools(), tool.getInfo().getVersion());\r
127       FileUtil.createDir(dest);\r
128       final ZipInputStream zip = new ZipInputStream(new BufferedInputStream(new FileInputStream(pkg)));\r
129       if (!ArchiveUtil.unpackZip(zip, dest)) {\r
130         throw new IOException("Failed to unpack package " + tool.getInfo() + " to " + dest);\r
131       }\r
132       return dest;\r
133     } catch (Exception e) {\r
134       logger.packageUnpackFailed(tool, pkg, dest);\r
135       LOG.warn("Failed to unpack nuget package " + tool + ". " + e.getMessage(), e);\r
136       throw new ProcessedException();\r
137     } finally {\r
138       logger.packageUnpackFinished(tool, pkg, dest);\r
139     }\r
140   }\r
141 \r
142   @NotNull\r
143   private File downloadPackage(@NotNull final InstallLogger logger,\r
144                                @NotNull final FeedPackage tool) {\r
145     logger.packageDownloadStarted(tool);\r
146     File pkg = null;\r
147     try {\r
148       pkg = FileUtil.createTempFile("nuget.commandline", ".nupkg");\r
149       myClient.downloadPackage(tool, pkg);\r
150       return pkg;\r
151     } catch (Exception e) {\r
152       LOG.warn("Failed to download package " + tool + (pkg != null ? " to file " + pkg : ""));\r
153       logger.packageDownloadFailed(tool, pkg, e);\r
154       throw new ProcessedException();\r
155     } finally {\r
156       logger.packageDownloadFinished(tool, pkg);\r
157     }\r
158   }\r
159 \r
160   private static class ProcessedException extends RuntimeException {\r
161   }\r
162 }\r