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