|
2#
楼主 |
发表于 2010-12-10 16:59:31
|
只看该作者
public List<String[]> getMethods(String content) {
List<String[]> list = new ArrayList<String[]>();
Pattern p = Pattern.compile(Regex.REGEX_FUNC);
Matcher m = p.matcher(content);
while (m.find()) {
String temp = m.group().trim();
// 将一个函数每个部分拆分出来存入数组
String[] spOpr = new String[5];
// 第1个元素保存函数类型oneway|twoway
String field1 = temp.substring(0, temp.indexOf(" "));
if (field1.equals("oneway")) {
spOpr[0] = field1;
temp = temp.substring(temp.indexOf(" ")).trim();
} else {
spOpr[0] = "twoway";
}
// 第2个元素保存函数返回值类型
spOpr[1] = temp.substring(0, temp.indexOf(" "));
temp = temp.substring(temp.indexOf(" ")).trim();
// 第3个元素保存函数名
spOpr[2] = temp.substring(0, temp.indexOf("(")).trim();
String field4 = temp.substring(temp.indexOf("(") + 1,
temp.indexOf(")")).trim();
// 第4个元素保存参数列表,如没有则置为空值
spOpr[3] = field4.equals("") ? null : field4;
String field5 = temp.substring(temp.lastIndexOf("(") + 1,
temp.lastIndexOf(")")).trim();
// 第5个元素保存异常,如没有则置为空值
spOpr[4] = field5.equals(field4) ? null : field5;
list.add(spOpr);
}
return list;
}
/**
* 将函数转换为XML格式
*
* @param optRoot
* @param content
*/
public void toXML(Element optRoot, String content) {
if (content == null)
return;
List<String[]> list = getMethods(content);
for (int i = 0; i < list.size(); i++) {
String[] func = list.get(i);
// 生成operation节点,函数的根节点
Element operation = new Element("operation");
operation.setAttribute("name", func[2]);
operation.setAttribute("type", func[0]);
// 生成req节点,属operation下一级节点
Element req = new Element("req");
Element rsp = null;
/**
* 如果函数是twoway类型则生成rsp节点 rsp节点下第一个param为函数调用结果
*/
if (func[0].equals("twoway")) {
rsp = new Element("rsp");
Element resultP = new Element("param");
Element resultN = new Element("node");
resultN.setAttribute("name", "call_result");
resultN.setAttribute("type", "oct");
resultN.setAttribute("value", "");
resultP.addContent(resultN);
rsp.addContent(resultP);
}
//函数返回值转换
retToXML(rsp, func[1]);
//函数参数转换
paramToXML(req, rsp, func[3]);
operation.addContent(req);
if (rsp != null) {
operation.addContent(rsp);
}
optRoot.addContent(operation);
} |
|