2 * Copyright 2000-2011 JetBrains s.r.o.
\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
8 * http://www.apache.org/licenses/LICENSE-2.0
\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
17 package jetbrains.buildServer.nuget.server.toolRegistry.impl;
\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
27 import java.util.zip.ZipInputStream;
\r
30 * Created by Eugene Petrenko (eugene.petrenko@gmail.com)
\r
31 * Date: 15.08.11 20:47
\r
33 public class NuGetToolsInstaller {
\r
34 private static final Logger LOG = Logger.getInstance(NuGetToolsInstaller.class.getName());
\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
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
54 public InstallResult installNuGet(@NotNull final String packageId, @NotNull final InstallLogger logger) {
\r
55 logger.started(packageId);
\r
57 FeedPackage tool = null;
\r
59 tool = myState.findTool(packageId);
\r
61 logger.packageNotFound(packageId);
\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
70 return new InstallResult(dest, agentTool);
\r
71 } catch (ProcessedException e) {
\r
73 } catch (Exception e) {
\r
74 LOG.warn("Failed to install NuGet.Commandline package. " + e.getMessage(), e);
\r
77 logger.finished(packageId, tool);
\r
82 private File registerAgentPlugins(InstallLogger logger, FeedPackage tool, File agentTool) {
\r
83 logger.agentToolPubslishStarted(tool, agentTool);
\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
92 } catch (Exception e) {
\r
93 logger.agentToolPublishFailed(tool, agentTool, e);
\r
94 throw new ProcessedException();
\r
96 logger.agentToolPuglishFinished(tool, agentTool);
\r
100 private String getAgentToolFileName(@NotNull String version) {
\r
101 return "nuget-commnadline-" + version;
\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
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
115 logger.agentToolPackFinished(tool);
\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
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
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
138 logger.packageUnpackFinished(tool, pkg, dest);
\r
143 private File downloadPackage(@NotNull final InstallLogger logger,
\r
144 @NotNull final FeedPackage tool) {
\r
145 logger.packageDownloadStarted(tool);
\r
148 pkg = FileUtil.createTempFile("nuget.commandline", ".nupkg");
\r
149 myClient.downloadPackage(tool, 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
156 logger.packageDownloadFinished(tool, pkg);
\r
160 private static class ProcessedException extends RuntimeException {
\r