nuget tool install sketch
[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 import org.jetbrains.annotations.Nullable;\r
26 \r
27 import java.io.*;\r
28 import java.util.zip.ZipInputStream;\r
29 \r
30 /**\r
31  * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
32  * Date: 15.08.11 20:47\r
33  */\r
34 public class NuGetToolsInstaller {\r
35   private static final Logger LOG = Logger.getInstance(NuGetToolsInstaller.class.getName());\r
36 \r
37   private final ToolPaths myToolPaths;\r
38   private final NuGetFeedReader myClient;\r
39   private final AvailableToolsState myState;\r
40   private final ToolPacker myPacker;\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     myToolPaths = toolPaths;\r
47     myClient = client;\r
48     myState = state;\r
49     myPacker = packer;\r
50   }\r
51 \r
52   @Nullable\r
53   private FeedPackage findTool(@NotNull final String packageId) {\r
54     return myState.findTool(packageId);\r
55   }\r
56 \r
57   public InstallResult installNuGet(@NotNull final String packageId, @NotNull final InstallLogger logger) {\r
58     logger.started(packageId);\r
59 \r
60     FeedPackage tool = null;\r
61     try {\r
62       tool = findTool(packageId);\r
63       if (tool == null) {\r
64         logger.packageNotFound(packageId);\r
65         return null;\r
66       }\r
67 \r
68       final File pkg = downloadPackage(logger, tool);\r
69       final File dest = extractPackage(logger, tool, pkg);\r
70       File agentTool = packAgentPlugin(logger, tool, dest);\r
71       agentTool = registerAgentPlugins(logger, tool, agentTool);\r
72 \r
73       return new InstallResult(dest, agentTool);\r
74     } catch (ProcessedException e) {\r
75       return null;\r
76     } catch (Exception e) {\r
77       LOG.warn("Failed to install NuGet.Commandline package. " + e.getMessage(), e);\r
78       return null;\r
79     } finally {\r
80       logger.finished(packageId, tool);\r
81     }\r
82   }\r
83 \r
84   @NotNull\r
85   private File registerAgentPlugins(InstallLogger logger, FeedPackage tool, File agentTool) {\r
86     logger.agentToolPubslishStarted(tool, agentTool);\r
87 \r
88     try {\r
89       final File dest = new File(myToolPaths.getAgentPluginsPath(), agentTool.getName());\r
90       if (!agentTool.renameTo(dest)) {\r
91         FileUtil.copy(agentTool, dest);\r
92         FileUtil.delete(agentTool);\r
93       }\r
94       return dest;\r
95     } catch (Exception e) {\r
96       logger.agentToolPublishFailed(tool, agentTool, e);\r
97       throw new ProcessedException();\r
98     } finally {\r
99       logger.agentToolPuglishFinished(tool, agentTool);\r
100     }\r
101   }\r
102 \r
103   private File packAgentPlugin(@NotNull final InstallLogger logger,\r
104                                @NotNull final FeedPackage tool,\r
105                                @NotNull final File dest) {\r
106     logger.agentToolPackStarted(tool, dest);\r
107     try {\r
108       return myPacker.packTool("nuget-commandline-" + tool.getInfo().getVersion(), dest);\r
109     } catch (Exception e) {\r
110       logger.agentToolPackFailed(tool, dest, e);\r
111       LOG.warn("Failed to pack agent tool " + tool);\r
112       throw new ProcessedException();\r
113     } finally {\r
114       logger.agentToolPackFinished(tool);\r
115     }\r
116   }\r
117 \r
118   @NotNull\r
119   private File extractPackage(@NotNull final InstallLogger logger,\r
120                               @NotNull final FeedPackage tool,\r
121                               @NotNull final File pkg) {\r
122     logger.packageUnpackStarted(tool, pkg);\r
123     File dest = null;\r
124     try {\r
125       dest = new File(myToolPaths.getTools(), tool.getInfo().getVersion());\r
126       FileUtil.createDir(dest);\r
127       final ZipInputStream zip = new ZipInputStream(new BufferedInputStream(new FileInputStream(pkg)));\r
128       if (!ArchiveUtil.unpackZip(zip, dest)) {\r
129         throw new IOException("Failed to unpack package " + tool.getInfo() + " to " + dest);\r
130       }\r
131       return dest;\r
132     } catch (Exception e) {\r
133       logger.packageUnpackFailed(tool, pkg, dest);\r
134       LOG.warn("Failed to unpack nuget package " + tool + ". " + e.getMessage(), e);\r
135       throw new ProcessedException();\r
136     } finally {\r
137       logger.packageUnpackFinished(tool, pkg, dest);\r
138     }\r
139   }\r
140 \r
141   @NotNull\r
142   private File downloadPackage(@NotNull final InstallLogger logger,\r
143                                @NotNull final FeedPackage tool) {\r
144     logger.packageDownloadStarted(tool);\r
145     File pkg = null;\r
146     try {\r
147       pkg = FileUtil.createTempFile("nuget.commandline", ".nupkg");\r
148       myClient.downloadPackage(tool, pkg);\r
149       return pkg;\r
150     } catch (Exception e) {\r
151       LOG.warn("Failed to download package " + tool + (pkg != null ? " to file " + pkg : ""));\r
152       logger.packageDownloadFailed(tool, pkg, e);\r
153       throw new ProcessedException();\r
154     } finally {\r
155       logger.packageDownloadFinished(tool, pkg);\r
156     }\r
157   }\r
158 \r
159   private static class ProcessedException extends RuntimeException {\r
160   }\r
161 }\r