/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.wsdl.actions.iface.tools.support;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.types.StringToStringMap;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Utility for build commandline arguments from dialog input
*
* @author ole.matzura
*/
public class ArgumentBuilder {
private static final String SHADOW = "XXXXXX";
private final StringToStringMap values;
private List<String> args = new ArrayList<String>();
/**
* List of arguments that needs to be shadowed.
*/
private List<String> argsToShadow = new ArrayList<String>();
private boolean isUnix;
public ArgumentBuilder(StringToStringMap values) {
values = escapeQuotes(values);
this.values = values;
}
public List<String> getArgs() {
if (isUnix) {
// sh -c requires all args in one string..
StringBuffer buf = new StringBuffer();
for (int c = 2; c < args.size(); c++) {
if (c > 2) {
buf.append(' ');
}
buf.append(escapeUnixArg(args.get(c)));
}
ArrayList<String> result = new ArrayList<String>();
result.add(args.get(0));
result.add(args.get(1));
result.add(buf.toString());
return result;
} else {
return new ArrayList<String>(args);
}
}
private StringToStringMap escapeQuotes(StringToStringMap values) {
StringToStringMap map = new StringToStringMap();
for (Map.Entry<String, String> entry : values.entrySet()) {
String newValue = internalEscapeQuotes(entry.getValue());
map.put(entry.getKey(), newValue);
}
return map;
}
private String internalEscapeQuotes(String str) {
if (str == null) {
return "";
}
StringBuffer buf = new StringBuffer();
for (int c = 0; c < str.length(); c++) {
char ch = str.charAt(c);
switch (ch) {
case '"':
buf.append('\\').append('"');
break;
default:
buf.append(ch);
}
}
return buf.toString();
}
private String escapeUnixArg(String str) {
if (str == null) {
return "";
}
StringBuffer buf = new StringBuffer();
for (int c = 0; c < str.length(); c++) {
char ch = str.charAt(c);
switch (ch) {
case ' ':
buf.append("%20");
break;
default:
buf.append(ch);
}
}
return buf.toString();
}
public boolean addString(String name, String arg) {
if (!values.containsKey(name)) {
return false;
}
String value = values.get(name).toString();
if (value == null || value.length() == 0) {
return false;
}
if (arg != null) {
args.add(arg);
}
args.add(value);
return true;
}
public boolean addStrings(String name, String arg, String sep) {
if (!values.containsKey(name)) {
return false;
}
String value = values.get(name).toString();
if (value == null || value.length() == 0) {
return false;
}
for (String v : value.split(sep)) {
if (arg != null) {
args.add(arg);
}
args.add(v.trim());
}
return true;
}
public boolean addStringShadow(String name, String arg) {
if (!values.containsKey(name)) {
return false;
}
String value = values.get(name).toString();
if (value == null || value.length() == 0) {
return false;
}
if (arg != null) {
args.add(arg);
}
args.add(value);
argsToShadow.add(value);
return true;
}
public ArgumentBuilder addArgs(String... args) {
for (int c = 0; c < args.length; c++) {
this.args.add(args[c]);
}
return this;
}
public boolean addBoolean(String name, String arg) {
if (values.containsKey(name) && Boolean.valueOf(values.get(name).toString())) {
args.add(arg);
return true;
}
return false;
}
/**
* Arguments that are added
*/
public String toString() {
StringBuffer buf = new StringBuffer();
for (int cnt = 0; cnt < args.size(); cnt++) {
if (cnt > 0) {
buf.append(' ');
}
String value = args.get(cnt);
for (String argToShadow : argsToShadow) {
if (value.equals(argToShadow)) {
value = SHADOW;
break;
}
if (value.startsWith(argToShadow)) {
value = argToShadow + SHADOW;
break;
}
}
if (value.indexOf('-') == 0) {
if (value.indexOf(' ') > 1) {
buf.append(value.substring(0, 2)).append('"').append(value.substring(2)).append('"');
} else {
buf.append(value);
}
} else if (value.indexOf(' ') >= 0) {
buf.append('"').append(value).append('"');
} else {
buf.append(value);
}
}
return buf.toString();
}
public ArgumentBuilder startScript(String script) {
return startScript(script, ".bat", ".sh");
}
public boolean addString(String name, String arg, String separator) {
if (!values.containsKey(name)) {
return false;
}
String value = values.get(name).toString();
if (value == null || value.length() == 0) {
return false;
}
args.add(arg + separator + value);
return true;
}
/**
* Just remember how argument starts, assumes that value can change.
*/
public boolean addStringShadow(String name, String arg, String separator) {
if (!values.containsKey(name)) {
return false;
}
String value = values.get(name).toString();
if (value == null || value.length() == 0) {
return false;
}
args.add(arg + separator + value);
argsToShadow.add(arg + separator);
return true;
}
public boolean addBoolean(String name, String arg, String trueValue, String falseValue) {
if (!values.containsKey(name)) {
return false;
}
args.add(arg);
if (Boolean.valueOf(values.get(name).toString())) {
args.add(trueValue);
return true;
} else {
args.add(falseValue);
return false;
}
}
public ArgumentBuilder startScript(String script, String windowsExt, String unixExt) {
if (UISupport.isWindows() && windowsExt != null) {
addArgs("cmd.exe", "/C", script + windowsExt);
} else {
isUnix = true;
if (!script.startsWith(".") && !script.startsWith(File.separator)) {
script = "./" + script;
}
addArgs("sh", "-c", script + unixExt);
}
return this;
}
public String[] getStringArgs() {
return args.toArray(new String[args.size()]);
}
}