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