package org.test4j.module.dbfit.utility;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.test4j.json.JSON;
import fit.Fixture;
import fit.Parse;
/**
* 参数解析工具类
*
* @author darui.wudr
*/
@SuppressWarnings("unchecked")
public class ParseArg {
/**
* 解析json对象
*
* @param <T>
* @param clazz
* @param json
* @return
*/
public static <T> T paserJson(Class<T> clazz, String json) {
return (T) JSON.toObject(json, clazz);
}
/**
* 将字符串解析为map,map entry用entrySplit分割,key-value以keySplit分割
*
* @param value
* @param entrySplit
* @param keySplit
* @return
*/
public static Map<String, String> parseMap(String value, String entrySplit, String keySplit) {
Map<String, String> map = new HashMap<String, String>();
if (value == null || value.equalsIgnoreCase("null")) {
return null;
} else if (value.trim().equalsIgnoreCase("")) {
return map;
} else {
String[] pairs = value.split(entrySplit);
for (String pair : pairs) {
String[] entry = pair.split(keySplit);
map.put(entry[0], entry[1]);
}
return map;
}
}
/**
* 解析默认的方式组装map数据的字符串,map entry用";"分割,key-value以":"分割<br>
* 例子: "key1:value1;key2:value2"
*
* @param value
* @return
*/
public static Map<String, String> parseMap(String value) {
return parseMap(value, ";", ":");
}
/**
* 解析以split分割的字符串为list对象
*
* @param value
* @param split
* @return
*/
public static List<String> parseList(String value, String split) {
List<String> list = new ArrayList<String>();
if (value == null || value.equalsIgnoreCase("null")) {
return null;
} else if (value.trim().equalsIgnoreCase("")) {
return list;
} else {
String[] items = value.split(split);
for (String item : items) {
list.add(item);
}
return list;
}
}
/**
* 解析以";"分割的字符串为list对象
*
* @param value
* @return
*/
public static List<String> parseList(String value) {
return parseList(value, ";");
}
/**
* 变量的正则表达式<br>
* 因为${var}是fitnesse wiki的表达式,所以这里改用@{var}
*/
public static String SYMBOL_PATTERN_EXPRESSION = "@\\{([\\w\\-\\.]+)\\}";
public static boolean containSymbols(String text) {
return text.matches(".*" + SYMBOL_PATTERN_EXPRESSION + ".*");
}
/**
* 根据预存的Symbol变量替换text字符串
*
* @param text
* @return
*/
public static String exactCellSymbolText(final String text) {
String _text = text;
String[] symbols = extractParamNames(text);
for (String symbol : symbols) {
String value = (String) SymbolUtil.getSymbol(symbol);
if (value == null) {
continue;
}
_text = _text.replaceFirst("@\\{" + symbol + "\\}", value);
}
return _text;
}
/**
* 变量表达式
*/
private static Pattern symbolPattern = Pattern.compile(SYMBOL_PATTERN_EXPRESSION);
/**
* 提取字符串中的变量列表 <br>
* MUST RETURN PARAMETER NAMES IN EXACT ORDER AS IN STATEMENT. <br>
* IF SINGLE PARAMETER APPEARS MULTIPLE TIMES,<br>
* MUST BE LISTED MULTIPLE TIMES IN THE ARRAY ALSO
*/
public static String[] extractParamNames(String commandText) {
ArrayList<String> hs = new ArrayList<String>();
Matcher mc = symbolPattern.matcher(commandText);
while (mc.find()) {
hs.add(mc.group(1));
}
String[] array = new String[hs.size()];
return hs.toArray(array);
}
/**
* 返回cell中的文本内容
*
* @param cell
* @return
*/
public static String parseCellValue(Parse cell) {
String content = cell.text();
if (content.startsWith("<<")) {
String value = (String) SymbolUtil.getSymbol(content.substring(2));
cell.addToBody(Fixture.gray("= " + value));
return value;
} else if (containSymbols(content)) {
String value = ParseArg.exactCellSymbolText(content);
cell.addToBody(Fixture.gray("= " + String.valueOf(value)));
return value;
} else {
return content;
}
}
public static String parseCellValue(String text) {
if (text == null) {
return "<null>";
}
if (text.startsWith("<<")) {
String value = (String) SymbolUtil.getSymbol(text.substring(2));
return value;
} else if (containSymbols(text)) {
String value = ParseArg.exactCellSymbolText(text);
return value;
} else {
return text;
}
}
}