more infrastructure:
[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.agent.runner.ProgramCommandLine;\r
24 import jetbrains.buildServer.nuget.agent.util.CommandlineBuildProcessFactory;\r
25 import jetbrains.buildServer.runner.SimpleRunnerConstants;\r
26 import org.jetbrains.annotations.NotNull;\r
27 \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   public BuildProcess executeCommandLine(@NotNull final BuildRunnerContext hostContext,\r
43                                          @NotNull final ProgramCommandLine cmd) throws RunBuildException {\r
44     BuildRunnerContext context = myFacade.createBuildRunnerContext(\r
45             hostContext.getBuild(),\r
46             SimpleRunnerConstants.TYPE,\r
47             cmd.getWorkingDirectory(),\r
48             hostContext\r
49     );\r
50 \r
51     context.addRunnerParameter(SimpleRunnerConstants.COMMAND_EXECUTABLE, cmd.getExecutablePath());\r
52     context.addRunnerParameter(SimpleRunnerConstants.COMMAND_PARAMETERS, joinCommandLineArguments(cmd.getArguments()));\r
53 \r
54     for (Map.Entry<String, String> e : cmd.getEnvironment().entrySet()) {\r
55       context.addEnvironmentVariable(e.getKey(), e.getValue());\r
56     }\r
57 \r
58     return myFacade.createExecutable(hostContext.getBuild(), context);\r
59   }\r
60 \r
61   //This is a same code as system uses in ProcessImpl class\r
62   private String joinCommandLineArguments(@NotNull final Collection<String> cmd) {\r
63     StringBuilder cmdbuf = new StringBuilder(80);\r
64     boolean isFirst = true;\r
65     for (String aCmd : cmd) {\r
66       if (!isFirst) {\r
67         cmdbuf.append(' ');\r
68       } else {\r
69         isFirst = false;\r
70       }\r
71       if (aCmd.indexOf(' ') < 0 && aCmd.indexOf('\t') < 0) {\r
72         cmdbuf.append(aCmd);\r
73         continue;\r
74       }\r
75 \r
76       if (aCmd.charAt(0) != '"') {\r
77         cmdbuf.append('"');\r
78         cmdbuf.append(aCmd);\r
79 \r
80         if (aCmd.endsWith("\\")) {\r
81           cmdbuf.append("\\");\r
82         }\r
83 \r
84         cmdbuf.append('"');\r
85       } else if (aCmd.endsWith("\"")) {\r
86         /* The argument has already been quoted. */\r
87         cmdbuf.append(aCmd);\r
88       } else {\r
89         /* Unmatched quote for the argument. */\r
90         throw new IllegalArgumentException();\r
91       }\r
92     }\r
93     return cmdbuf.toString();\r
94   }\r
95 \r
96 }\r