c104b9823bd3a72125148c636705536dc44f6d5b
[teamcity/dotNetPackagesSupport.git] / nuget-agent / src / jetbrains / buildServer / nuget / agent / util / impl / CommandlineBuildProcessFactoryImpl.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.agent.util.impl;\r
18 \r
19 import jetbrains.buildServer.RunBuildException;\r
20 import jetbrains.buildServer.agent.BuildProcess;\r
21 import jetbrains.buildServer.agent.BuildProcessFacade;\r
22 import jetbrains.buildServer.agent.BuildRunnerContext;\r
23 import jetbrains.buildServer.nuget.agent.util.CommandlineBuildProcessFactory;\r
24 import jetbrains.buildServer.runner.SimpleRunnerConstants;\r
25 import org.jetbrains.annotations.NotNull;\r
26 \r
27 import java.io.File;\r
28 import java.util.Collection;\r
29 import java.util.Map;\r
30 \r
31 /**\r
32  * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
33  * Date: 07.07.11 15:13\r
34  */\r
35 public class CommandlineBuildProcessFactoryImpl implements CommandlineBuildProcessFactory {\r
36   private final BuildProcessFacade myFacade;\r
37 \r
38   public CommandlineBuildProcessFactoryImpl(@NotNull final BuildProcessFacade facade) {\r
39     myFacade = facade;\r
40   }\r
41 \r
42   @NotNull\r
43   public BuildProcess executeCommandLine(@NotNull BuildRunnerContext hostContext,\r
44                                          @NotNull File program,\r
45                                          @NotNull Collection<String> argz,\r
46                                          @NotNull File workingDir,\r
47                                          @NotNull final Map<String, String> additionalEnvironment) throws RunBuildException {\r
48     BuildRunnerContext context = myFacade.createBuildRunnerContext(\r
49             hostContext.getBuild(),\r
50             SimpleRunnerConstants.TYPE,\r
51             workingDir.getPath(),\r
52             hostContext\r
53     );\r
54 \r
55     for (Map.Entry<String, String> entry : additionalEnvironment.entrySet()) {\r
56       context.addEnvironmentVariable(entry.getKey(), entry.getValue());\r
57     }\r
58 \r
59     context.addRunnerParameter(SimpleRunnerConstants.COMMAND_EXECUTABLE, program.getPath());\r
60     context.addRunnerParameter(SimpleRunnerConstants.COMMAND_PARAMETERS, joinCommandLineArguments(argz));\r
61 \r
62     return myFacade.createExecutable(hostContext.getBuild(), context);\r
63   }\r
64 \r
65   //This is a same code as system uses in ProcessImpl class\r
66   private String joinCommandLineArguments(@NotNull final Collection<String> cmd) {\r
67     StringBuilder cmdbuf = new StringBuilder(80);\r
68     boolean isFirst = true;\r
69     for (String aCmd : cmd) {\r
70       if (!isFirst) {\r
71         cmdbuf.append(' ');\r
72       } else {\r
73         isFirst = false;\r
74       }\r
75       if (aCmd.indexOf(' ') < 0 && aCmd.indexOf('\t') < 0) {\r
76         cmdbuf.append(aCmd);\r
77         continue;\r
78       }\r
79 \r
80       if (aCmd.charAt(0) != '"') {\r
81         cmdbuf.append('"');\r
82         cmdbuf.append(aCmd);\r
83 \r
84         if (aCmd.endsWith("\\")) {\r
85           cmdbuf.append("\\");\r
86         }\r
87 \r
88         cmdbuf.append('"');\r
89       } else if (aCmd.endsWith("\"")) {\r
90         /* The argument has already been quoted. */\r
91         cmdbuf.append(aCmd);\r
92       } else {\r
93         /* Unmatched quote for the argument. */\r
94         throw new IllegalArgumentException();\r
95       }\r
96     }\r
97     return cmdbuf.toString();\r
98   }\r
99 \r
100 }\r