/*
* 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.support;
import com.eviware.soapui.support.types.StringList;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
public class StringUtils {
public static final String NEWLINE = System.getProperty("line.separator");
public static final char DEFAULT_FILENAME_WHITESPACE_CHAR = '-';
public static String unquote(String str) {
int length = str == null ? -1 : str.length();
if (str == null || length == 0) {
return str;
}
if (length > 1 && str.charAt(0) == '\"' && str.charAt(length - 1) == '\"') {
str = str.substring(1, length - 1);
}
return str;
}
public static boolean isNullOrEmpty(String str) {
return str == null || str.length() == 0 || str.trim().length() == 0;
}
public static int parseInt(String str, int defaultValue) {
if (isNullOrEmpty(str)) {
return defaultValue;
}
try {
return Integer.parseInt(str);
} catch (NumberFormatException e) {
return defaultValue;
}
}
public static List<String> splitLines(String string) {
try {
ArrayList<String> list = new ArrayList<String>();
LineNumberReader reader = new LineNumberReader(new StringReader(string));
String s;
while ((s = reader.readLine()) != null) {
list.add(s);
}
return list;
} catch (IOException e) {
// I don't think this can really happen with a StringReader.
throw new RuntimeException(e);
}
}
public static String normalizeSpace(String str) {
if (!isNullOrEmpty(str)) {
StringTokenizer st = new StringTokenizer(str);
if (st.hasMoreTokens()) {
StringBuilder sb = new StringBuilder(str.length());
while (true) {
sb.append(st.nextToken());
if (st.hasMoreTokens()) {
sb.append(' ');
} else {
break;
}
}
return sb.toString();
} else {
return "";
}
} else {
return str;
}
}
public static boolean hasContent(String str) {
return str != null && str.trim().length() > 0;
}
public static String stripStartAndEnd(String s, String start, String end) {
if (s.startsWith(start) && s.endsWith(end)) {
return s.substring(start.length(), s.length() - end.length());
} else {
return s;
}
}
public static Writer createSeparatedRow(Writer writer, StringList values, char separator, char quote)
throws IOException {
for (int c = 0; c < values.size(); c++) {
String value = values.get(c);
if (c > 0) {
writer.append(separator);
}
if (quote > 0) {
writer.append(quote);
if (value != null) {
for (int i = 0; i < value.length(); i++) {
char ch = value.charAt(i);
if (ch == quote) {
writer.append('\\');
} else if (ch == '\\') {
writer.append('\\');
}
writer.append(ch);
}
}
writer.append(quote);
} else if (value != null) {
writer.append(value);
}
}
return writer;
}
public static StringList readSeparatedRow(String row, char separator, char quote) {
StringList result = new StringList();
while (row != null && row.length() > 0) {
if (row.startsWith(String.valueOf(quote))) {
StringBuilder buf = new StringBuilder();
char last = row.charAt(0);
int ix = 1;
while (ix < row.length()) {
char ch = row.charAt(ix);
if (ch == quote && last != '\\') {
result.add(buf.toString());
row = row.length() > ix + 1 ? row.substring(ix + 1) : null;
if (row != null && row.length() > 1 && row.charAt(0) == separator) {
row = row.substring(1);
ix = -1;
}
break;
} else if (ch != '\\' || last == '\\') {
buf.append(ch);
}
last = ch;
ix++;
}
if (row != null && ix == row.length()) {
result.add(row);
row = null;
}
} else {
int ix = row.indexOf(separator);
if (ix == -1) {
result.add(row);
row = null;
} else {
result.add(row.substring(0, ix));
row = row.substring(ix + 1);
}
}
}
return result;
}
/**
* replaces only white spaces from file name
*/
public static String createFileName(String str, char whitespaceChar) {
StringBuilder result = new StringBuilder();
for (int c = 0; c < str.length(); c++) {
char ch = str.charAt(c);
if (Character.isWhitespace(ch) && whitespaceChar != 0) {
result.append(whitespaceChar);
} else if (Character.isLetterOrDigit(ch)) {
result.append(ch);
} else if (ch == whitespaceChar) {
result.append(ch);
}
}
return result.toString();
}
/**
* replaces only white spaces from file name, uses the
* DEFAULT_FILENAME_WHITESPACE_CHAR
*/
public static String createFileName(String str) {
return createFileName(str, DEFAULT_FILENAME_WHITESPACE_CHAR);
}
/**
* replaces all non letter and non digit characters from file name
*
* @param str
* @param replace
* @return
*/
public static String createFileName2(String str, char replace) {
StringBuilder result = new StringBuilder();
for (int c = 0; c < str.length(); c++) {
char ch = str.charAt(c);
if (Character.isLetterOrDigit(ch)) {
result.append(ch);
} else {
result.append(replace);
}
}
return result.toString();
}
public static String createXmlName(String str) {
StringBuilder result = new StringBuilder();
boolean skipped = false;
for (int c = 0; c < str.length(); c++) {
char ch = str.charAt(c);
if (Character.isLetter(ch) || ch == '_' || ch == '-' || ch == '.') {
if (skipped) {
result.append(Character.toUpperCase(ch));
} else {
result.append(ch);
}
skipped = false;
} else if (Character.isDigit(ch)) {
result.append(ch);
skipped = false;
} else {
skipped = true;
}
}
String resultString = result.toString();
return isValidXmlName(str) ? resultString : "_" + resultString;
}
private static boolean isValidXmlName(String str) {
if (str.isEmpty() || str.toLowerCase().startsWith("xml")) {
return false;
}
char firstCharacter = str.charAt(0);
return Character.isLetter(firstCharacter) || firstCharacter == '_';
}
public static String[] merge(String[] incomingNames, String string) {
StringList result = new StringList(incomingNames);
result.add(string);
return result.toStringArray();
}
public static String quote(String str) {
if (str == null) {
return str;
}
if (str.length() < 2 || !str.startsWith("\"") || !str.endsWith("\"")) {
str = "\"" + str + "\"";
}
return str;
}
public static String join(String[] array, String separator) {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < array.length; i++) {
if (i > 0) {
buf.append(separator);
}
buf.append(array[i]);
}
return buf.toString();
}
public static String toHtml(String string) {
return toHtml(string, 0);
}
public static String toHtml(String string, int maxSize) {
if (StringUtils.isNullOrEmpty(string)) {
return "<html><body></body></html>";
}
BufferedReader st = new BufferedReader(new StringReader(string));
StringBuilder buf = new StringBuilder("<html><body>");
String str = null;
try {
str = st.readLine();
while (str != null && (maxSize == 0 || (buf.length() + str.length()) < maxSize)) {
if (str.equalsIgnoreCase("<br/>")) {
str = "<br>";
}
buf.append(str);
if (!str.equalsIgnoreCase("<br>")) {
buf.append("<br>");
}
str = st.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
if (str != null) {
buf.append("...");
}
buf.append("</body></html>");
string = buf.toString();
return string;
}
public static String replace(String data, String from, String to) {
StringBuilder buf = new StringBuilder(data.length());
int pos;
int i = 0;
while ((pos = data.indexOf(from, i)) != -1) {
buf.append(data.substring(i, pos)).append(to);
i = pos + from.length();
}
buf.append(data.substring(i));
return buf.toString();
}
public static String fixLineSeparator(String xml) throws UnsupportedEncodingException {
if ("\r\n".equals(System.getProperty("line.separator"))) {
xml = xml.replaceAll("\r[^\n]", System.getProperty("line.separator"));
} else {
xml = xml.replaceAll("\r\n", System.getProperty("line.separator"));
}
return xml;
}
public static String capitalize(String string) {
if (isNullOrEmpty(string)) {
return string;
}
return string.toUpperCase().substring(0, 1) + string.toLowerCase().substring(1);
}
public static String[] toStringArray(Object[] selectedOptions) {
String[] result = new String[selectedOptions.length];
for (int c = 0; c < selectedOptions.length; c++) {
result[c] = String.valueOf(selectedOptions[c]);
}
return result;
}
public static List<String> toStringList(Object[] selectedOptions) {
StringList result = new StringList();
for (Object o : selectedOptions) {
result.add(o.toString());
}
return result;
}
public static String[] sortNames(String[] names) {
Arrays.sort(names);
return names;
}
}