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