importjava.util.HashSet;importjava.util.List;importjava.util.Set;importjava.util.regex.Pattern;importcom.ibm.broker.javacompute.MbJavaComputeNode;importcom.ibm.broker.plugin.MbElement;importcom.ibm.broker.plugin.MbException;importcom.ibm.broker.plugin.MbMessage;importcom.ibm.broker.plugin.MbMessageAssembly;importcom.ibm.broker.plugin.MbOutputTerminal;publicclasssubflow_JavaComputeextendsMbJavaComputeNode {publicvoidevaluate(MbMessageAssembly inAssembly)throwsMbException {
MbOutputTerminal out=getOutputTerminal("out");
MbOutputTerminal alt=getOutputTerminal("alternate");
MbMessage inMessage=inAssembly.getMessage();
MbMessage outMessage=newMbMessage(inMessage);
MbMessageAssembly outAssembly=newMbMessageAssembly(inAssembly,outMessage);
MbElement document=outMessage.getRootElement();
MbElement root=document.getLastChild().getFirstChild();try{
SetselfDefNSSet=newHashSet();// 用来存储自定义的名称空间名
traverseAndRemoveNils(root,selfDefNSSet);// 遍历节点删除特定属性if(selfDefNSSet.size()>0){
traverseAndRemoveSelfDefNSNode(root,selfDefNSSet);// 遍历节点删除自定义名称空间节点
}
}catch(Exception ex){
ex.printStackTrace();
}
out.propagate(outAssembly);
}privatevoidtraverseAndRemoveNils(MbElement elm,SetselfDefNSSet)throwsException{//get all the attributes of current elementListattrSet=(List)elm.evaluateXPath("@*");for(MbElement attr:attrSet){
String name=attr.getName().toString();
String value=attr.getValue().toString();if(isNillAttr(name,value)){
attr.detach();
}if(isSelfDefNS(name,value)){
String[] arr=name.split(":");
selfDefNSSet.add(arr[1]);
attr.detach();
}
}//get all sub elements of current elementListnodeset=(List)elm.evaluateXPath("*");for(MbElement childElm:nodeset){//recursiontraverseAndRemoveNils(childElm,selfDefNSSet);
}
}
// 判断是否特定属性,a:nil,b:nil都算privatebooleanisNillAttr(String name,String value){
String patternStr="(\\w+)(:nil)";booleanresult1=Pattern.matches(patternStr, name);booleanresult2="true".equals(value);returnresult1&&result2;
}
// 判断是否自定义名称空间privatebooleanisSelfDefNS(String name,String value){
String patternStr="(xmlns:)(\\w+)";booleanresult=Pattern.matches(patternStr, name);returnresult;
}privatevoidtraverseAndRemoveSelfDefNSNode(MbElement elm,SetselfDefNSSet)throwsException{
String name=elm.getName().toString();if(isSelfDefNSNode(name,selfDefNSSet)){
elm.detach();
}//get all sub elements of current elementListnodeset=(List)elm.evaluateXPath("*");for(MbElement childElm:nodeset){//recursiontraverseAndRemoveSelfDefNSNode(childElm,selfDefNSSet);
}
}
// 判读节点是否自定义名称空间的限定名privatebooleanisSelfDefNSNode(String name,SetselfDefNSSet){
String[] arr=name.split(":");if(arr.length==2){
String ns=arr[0];returnselfDefNSSet.contains(ns);
}else{returnfalse;
}
}
}