001/*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * SonarQube is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * SonarQube is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
019 */
020package org.sonar.process.monitor;
021
022import org.apache.commons.lang.StringUtils;
023
024import javax.annotation.Nullable;
025
026import java.io.File;
027import java.util.ArrayList;
028import java.util.Collections;
029import java.util.HashMap;
030import java.util.LinkedHashMap;
031import java.util.List;
032import java.util.Map;
033import java.util.Properties;
034
035public class JavaCommand {
036
037  // unique key among the group of commands to launch
038  private final String key;
039
040  private File workDir;
041
042  // for example -Xmx1G
043  private final List<String> javaOptions = new ArrayList<String>();
044
045  // entry point
046  private String className;
047
048  // relative path to JAR files
049  private final List<String> classpath = new ArrayList<String>();
050
051  // program arguments (parameters of main(String[])
052  private final Map<String, String> arguments = new LinkedHashMap<String, String>();
053
054  private final Map<String, String> envVariables = new HashMap<String, String>(System.getenv());
055
056  private File tempDir = null;
057
058  public JavaCommand(String key) {
059    this.key = key;
060  }
061
062  public String getKey() {
063    return key;
064  }
065
066  public File getWorkDir() {
067    return workDir;
068  }
069
070  public JavaCommand setWorkDir(File workDir) {
071    this.workDir = workDir;
072    return this;
073  }
074
075  public File getTempDir() {
076    return tempDir;
077  }
078
079  public JavaCommand setTempDir(File tempDir) {
080    this.tempDir = tempDir;
081    return this;
082  }
083
084  public List<String> getJavaOptions() {
085    return javaOptions;
086  }
087
088  public JavaCommand addJavaOption(String s) {
089    if (StringUtils.isNotBlank(s)) {
090      javaOptions.add(s);
091    }
092    return this;
093  }
094
095  public JavaCommand addJavaOptions(String s) {
096    for (String opt : s.split(" ")) {
097      addJavaOption(opt);
098    }
099    return this;
100  }
101
102  public String getClassName() {
103    return className;
104  }
105
106  public JavaCommand setClassName(String className) {
107    this.className = className;
108    return this;
109  }
110
111  public List<String> getClasspath() {
112    return classpath;
113  }
114
115  public JavaCommand addClasspath(String s) {
116    classpath.add(s);
117    return this;
118  }
119
120  public Map<String, String> getArguments() {
121    return arguments;
122  }
123
124  public JavaCommand setArgument(String key, @Nullable String value) {
125    if (value == null) {
126      arguments.remove(key);
127    } else {
128      arguments.put(key, value);
129    }
130    return this;
131  }
132
133  public JavaCommand setArguments(Properties args) {
134    for (Map.Entry<Object, Object> entry : args.entrySet()) {
135      setArgument(entry.getKey().toString(), entry.getValue() != null ? entry.getValue().toString() : null);
136    }
137    return this;
138  }
139
140  public Map<String, String> getEnvVariables() {
141    return envVariables;
142  }
143
144  public JavaCommand setEnvVariable(String key, @Nullable String value) {
145    if (value == null) {
146      envVariables.remove(key);
147    } else {
148      envVariables.put(key, value);
149    }
150    return this;
151  }
152
153  @Override
154  public String toString() {
155    final StringBuilder sb = new StringBuilder("JavaCommand{");
156    sb.append("workDir=").append(workDir);
157    sb.append(", javaOptions=").append(javaOptions);
158    sb.append(", className='").append(className).append('\'');
159    sb.append(", classpath=").append(classpath);
160    sb.append(", arguments=").append(arguments);
161    sb.append(", envVariables=").append(envVariables);
162    sb.append('}');
163    return sb.toString();
164  }
165}