fix nuget tools filter
[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 void 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;\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       registerAgentPlugins(logger, tool, agentTool);\r
69     } catch (ProcessedException e) {\r
70       //NOP;\r
71     } catch (Exception e) {\r
72       LOG.warn("Failed to install NuGet.Commandline package. " + e.getMessage(), e);\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.agentToolPublishStarted(tool, agentTool);\r
81 \r
82     try {\r
83       final File dest = myNaming.getAgetToolFilePath(tool);\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.agentToolPublishFinished(tool, agentTool);\r
94     }\r
95   }\r
96 \r
97   private String getAgentToolFileName(@NotNull String version) {\r
98     return "nuget-commnadline-" + version;\r
99   }\r
100 \r
101   private File packAgentPlugin(@NotNull final InstallLogger logger,\r
102                                @NotNull final FeedPackage tool,\r
103                                @NotNull final File dest) {\r
104     logger.agentToolPackStarted(tool, dest);\r
105     try {\r
106       return myPacker.packTool(getAgentToolFileName(tool.getInfo().getVersion()), dest);\r
107     } catch (Exception e) {\r
108       logger.agentToolPackFailed(tool, dest, e);\r
109       LOG.warn("Failed to pack agent tool " + tool);\r
110       throw new ProcessedException();\r
111     } finally {\r
112       logger.agentToolPackFinished(tool);\r
113     }\r
114   }\r
115 \r
116   @NotNull\r
117   private File extractPackage(@NotNull final InstallLogger logger,\r
118                               @NotNull final FeedPackage tool,\r
119                               @NotNull final File pkg) {\r
120     logger.packageUnpackStarted(tool, pkg);\r
121     File dest = null;\r
122     try {\r
123       dest = new File(myToolPaths.getTools(), tool.getInfo().getVersion());\r
124       FileUtil.createDir(dest);\r
125       final ZipInputStream zip = new ZipInputStream(new BufferedInputStream(new FileInputStream(pkg)));\r
126       if (!ArchiveUtil.unpackZip(zip, dest)) {\r
127         throw new IOException("Failed to unpack package " + tool.getInfo() + " to " + dest);\r
128       }\r
129       return dest;\r
130     } catch (Exception e) {\r
131       logger.packageUnpackFailed(tool, pkg, dest);\r
132       LOG.warn("Failed to unpack nuget package " + tool + ". " + e.getMessage(), e);\r
133       throw new ProcessedException();\r
134     } finally {\r
135       logger.packageUnpackFinished(tool, pkg, dest);\r
136     }\r
137   }\r
138 \r
139   @NotNull\r
140   private File downloadPackage(@NotNull final InstallLogger logger,\r
141                                @NotNull final FeedPackage tool) {\r
142     logger.packageDownloadStarted(tool);\r
143     File pkg = null;\r
144     try {\r
145       pkg = FileUtil.createTempFile("nuget.commandline", ".nupkg");\r
146       myClient.downloadPackage(tool, pkg);\r
147       return pkg;\r
148     } catch (Exception e) {\r
149       LOG.warn("Failed to download package " + tool + (pkg != null ? " to file " + pkg : ""));\r
150       logger.packageDownloadFailed(tool, pkg, e);\r
151       throw new ProcessedException();\r
152     } finally {\r
153       logger.packageDownloadFinished(tool, pkg);\r
154     }\r
155   }\r
156 \r
157   private static class ProcessedException extends RuntimeException {\r
158   }\r
159 }\r