Program: 123972
Project: 123972
Buggy source:
/** 
 * init the LoopEntry according by "nodePaths" and "loopPath".
 * @return
 */
private void initLoopEntry(){
  Map<String,LoopEntry> entryMap=new HashMap<String,LoopEntry>();
  FunctionRegister funcRegister=new FunctionRegister();
  Function function=null;
  if (this.loopPath.indexOf("String_Node_Str") >= 0 && this.loopPath.indexOf("String_Node_Str") >= 0) {
    if (nodePaths.length > 0) {
      String strTmp=loopPath.substring(loopPath.lastIndexOf("String_Node_Str"));
      String strFuncName=strTmp.substring(strTmp.indexOf("String_Node_Str") + 2,strTmp.indexOf("String_Node_Str"));
      if (funcRegister.isFuncRegistered(strFuncName)) {
        function=funcRegister.getFunction(strFuncName);
      }
    }
    loopPath=loopPath.substring(0,loopPath.lastIndexOf("String_Node_Str"));
  }
  for (int m=0; m < nodePaths.length; m++) {
    String column=nodePaths[m];
    String resultCol=this.loopPath;
    boolean isAsXML=this.asXMLs[m];
    String tmpLoopPath=null;
    String[] splits=column.split("String_Node_Str");
    for (    String tmp : splits) {
      if (tmp.equals("String_Node_Str")) {
        resultCol=resultCol.substring(0,resultCol.lastIndexOf("String_Node_Str"));
        tmpLoopPath=resultCol;
      }
 else       if (tmp.equals("String_Node_Str")) {
        tmpLoopPath=resultCol;
      }
 else {
        if (tmp.indexOf("String_Node_Str") >= 0 && tmp.indexOf("String_Node_Str") >= 0) {
          resultCol=resultCol.substring(0,resultCol.lastIndexOf("String_Node_Str"));
          tmpLoopPath=resultCol;
          String strFuncName=tmp.substring(tmp.indexOf("String_Node_Str") + 2,tmp.indexOf("String_Node_Str"));
          if (funcRegister.isFuncRegistered(strFuncName)) {
            function=funcRegister.getFunction(strFuncName);
          }
        }
 else {
          resultCol+="String_Node_Str" + tmp;
        }
      }
    }
    if (tmpLoopPath == null) {
      tmpLoopPath=loopPath;
    }
    if (!entryMap.containsKey(tmpLoopPath)) {
      entryMap.put(tmpLoopPath,new LoopEntry(tmpLoopPath));
    }
    if (function == null) {
      entryMap.get(tmpLoopPath).addPath(resultCol,column,isAsXML);
    }
 else {
      entryMap.get(tmpLoopPath).addPath(column,column,isAsXML);
      entryMap.get(tmpLoopPath).addFunction(column,function);
      function=null;
    }
  }
  String[] splits=loopPath.split("String_Node_Str");
  String path="String_Node_Str";
  LoopEntry tmpentry=null;
  for (  String tmp : splits) {
    if (tmp.trim().length() > 0) {
      path+="String_Node_Str" + tmp;
      if (entryMap.containsKey(path)) {
        if (tmpentry == null) {
          tmpentry=entryMap.get(path);
          this.entry=tmpentry;
        }
 else {
          tmpentry.setSubLoop(entryMap.get(path));
          tmpentry=entryMap.get(path);
        }
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * init the LoopEntry according by "nodePaths" and "loopPath".
 * @return
 */
private void initLoopEntry(){
  Map<String,LoopEntry> entryMap=new HashMap<String,LoopEntry>();
  FunctionRegister funcRegister=new FunctionRegister();
  Function function=null;
  if (this.loopPath.indexOf("String_Node_Str") >= 0 && this.loopPath.indexOf("String_Node_Str") >= 0) {
    if (nodePaths.length > 0) {
      String strTmp=loopPath.substring(loopPath.lastIndexOf("String_Node_Str"));
      String strFuncName=strTmp.substring(strTmp.indexOf("String_Node_Str") + 2,strTmp.indexOf("String_Node_Str"));
      if (funcRegister.isFuncRegistered(strFuncName)) {
        function=funcRegister.getFunction(strFuncName);
      }
    }
    loopPath=loopPath.substring(0,loopPath.lastIndexOf("String_Node_Str"));
  }
  for (int m=0; m < nodePaths.length; m++) {
    String column=nodePaths[m];
    String resultCol=this.loopPath;
    boolean isAsXML=this.asXMLs[m];
    boolean isDot=false;
    String tmpLoopPath=null;
    String[] splits=column.split("String_Node_Str");
    for (    String tmp : splits) {
      if (tmp.equals("String_Node_Str")) {
        resultCol=resultCol.substring(0,resultCol.lastIndexOf("String_Node_Str"));
        tmpLoopPath=resultCol;
      }
 else       if (tmp.equals("String_Node_Str")) {
        tmpLoopPath=resultCol;
        isDot=true;
      }
 else {
        if (tmp.indexOf("String_Node_Str") >= 0 && tmp.indexOf("String_Node_Str") >= 0) {
          resultCol=resultCol.substring(0,resultCol.lastIndexOf("String_Node_Str"));
          tmpLoopPath=resultCol;
          String strFuncName=tmp.substring(tmp.indexOf("String_Node_Str") + 2,tmp.indexOf("String_Node_Str"));
          if (funcRegister.isFuncRegistered(strFuncName)) {
            function=funcRegister.getFunction(strFuncName);
          }
        }
 else {
          resultCol+="String_Node_Str" + tmp;
        }
      }
    }
    if (tmpLoopPath == null) {
      tmpLoopPath=loopPath;
    }
    if (!entryMap.containsKey(tmpLoopPath)) {
      entryMap.put(tmpLoopPath,new LoopEntry(tmpLoopPath));
    }
    if (function == null) {
      entryMap.get(tmpLoopPath).addPath(resultCol,column,isAsXML,isDot);
    }
 else {
      entryMap.get(tmpLoopPath).addPath(column,column,isAsXML,isDot);
      entryMap.get(tmpLoopPath).addFunction(column,function);
      function=null;
    }
  }
  String[] splits=loopPath.split("String_Node_Str");
  String path="String_Node_Str";
  LoopEntry tmpentry=null;
  for (  String tmp : splits) {
    if (tmp.trim().length() > 0) {
      path+="String_Node_Str" + tmp;
      if (entryMap.containsKey(path)) {
        if (tmpentry == null) {
          tmpentry=entryMap.get(path);
          this.entry=tmpentry;
        }
 else {
          tmpentry.setSubLoop(entryMap.get(path));
          tmpentry=entryMap.get(path);
        }
      }
    }
  }
}