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