Program: 120404
Project: 120404
Buggy source:
/** 
 * qzhang Comment method "isAvailableSubValue".
 * @param value
 * @return
 */
private Function getAvailableFunFromValue(MetadataColumnExt bean,String value,List<Function> funs){
  Function currentFun=null;
  if (("String_Node_Str").equals(bean.getTalendType()) && value != null && value.split("String_Node_Str").length > 3 && value.split("String_Node_Str").length > 3) {
    int index=-1;
    int k=0;
    for (int i=0; i < funs.size(); i++) {
      Function function=funs.get(i);
      int indexOf=value.indexOf(function.getName());
      if (index == -1 || (indexOf > -1 && index > indexOf)) {
        index=indexOf;
        k=i;
      }
    }
    int firstIndex=value.indexOf("String_Node_Str");
    int lastIndex=value.lastIndexOf("String_Node_Str");
    if (firstIndex < lastIndex && lastIndex < value.length()) {
      String str=value.substring(firstIndex + 1,lastIndex);
      String[] split=str.split("String_Node_Str");
      if (funs.get(k).getParameters().size() == split.length) {
        currentFun=funs.get(k).clone(split);
      }
    }
    return currentFun;
  }
  boolean isExsit=false;
  for (int i=0; i < funs.size() && !isExsit; i++) {
    Function function=funs.get(i);
    if (value != null && value.indexOf(function.getName()) != -1) {
      isExsit=true;
    }
  }
  if (value != null) {
    boolean isPure=true;
    int paramLength=value.length() - 2;
    if (UIManager.isJavaProject()) {
      isPure=value.indexOf("String_Node_Str") != -1 && value.indexOf("String_Node_Str") > value.indexOf("String_Node_Str") && value.endsWith("String_Node_Str");
      paramLength=value.length() - 1;
    }
 else {
      isPure=value.startsWith(PERL_FUN_PREFIX) && value.endsWith(PERL_FUN_SUFFIX);
    }
    if (isPure && isExsit) {
      for (      Function function : funs) {
        int indexOf=value.indexOf(function.getName());
        if (indexOf != -1) {
          String para=value.substring(indexOf + function.getName().length() + 1,paramLength);
          if ("String_Node_Str".equals(para)) {
            if (function.getParameters().size() == 0) {
              currentFun=(Function)function.clone();
            }
          }
 else {
            try {
              Pattern regex=Pattern.compile("String_Node_Str",Pattern.CANON_EQ);
              Matcher m=regex.matcher(para);
              List<String> strs=new ArrayList<String>();
              while (m.find()) {
                strs.add(m.group());
              }
              String[] ps=strs.toArray(new String[strs.size()]);
              if (ps.length == function.getParameters().size()) {
                currentFun=function.clone(ps);
              }
            }
 catch (            PatternSyntaxException ex) {
            }
          }
        }
      }
    }
 else {
      currentFun=createPureFunctions(value,funs,currentFun);
    }
  }
  return currentFun;
}

Fixed version (ground truth):
/** 
 * qzhang Comment method "isAvailableSubValue".
 * @param value
 * @return
 */
private Function getAvailableFunFromValue(MetadataColumnExt bean,String value,List<Function> funs){
  Function currentFun=null;
  if (("String_Node_Str").equals(bean.getTalendType()) && value != null && value.split("String_Node_Str").length > 3 && value.split("String_Node_Str").length > 3) {
    int index=-1;
    int k=0;
    for (int i=0; i < funs.size(); i++) {
      Function function=funs.get(i);
      int indexOf=value.indexOf(function.getName());
      if (index == -1 || (indexOf > -1 && index > indexOf)) {
        index=indexOf;
        k=i;
      }
    }
    int firstIndex=value.indexOf("String_Node_Str");
    int lastIndex=value.lastIndexOf("String_Node_Str");
    if (firstIndex < lastIndex && lastIndex < value.length()) {
      String str=value.substring(firstIndex + 1,lastIndex);
      String[] split=str.split("String_Node_Str");
      if (funs.get(k).getParameters().size() == split.length) {
        currentFun=funs.get(k).clone(split);
        if (currentFun != null) {
          return currentFun;
        }
      }
    }
  }
  boolean isExsit=false;
  for (int i=0; i < funs.size() && !isExsit; i++) {
    Function function=funs.get(i);
    if (value != null && value.indexOf(function.getName()) != -1) {
      isExsit=true;
    }
  }
  if (value != null) {
    boolean isPure=true;
    int paramLength=value.length() - 2;
    if (UIManager.isJavaProject()) {
      isPure=value.indexOf("String_Node_Str") != -1 && value.indexOf("String_Node_Str") > value.indexOf("String_Node_Str") && value.endsWith("String_Node_Str");
      paramLength=value.length() - 1;
    }
 else {
      isPure=value.startsWith(PERL_FUN_PREFIX) && value.endsWith(PERL_FUN_SUFFIX);
    }
    if (isPure && isExsit) {
      for (      Function function : funs) {
        int indexOf=value.indexOf(function.getName());
        if (indexOf != -1) {
          String para=value.substring(indexOf + function.getName().length() + 1,paramLength);
          if ("String_Node_Str".equals(para)) {
            if (function.getParameters().size() == 0) {
              currentFun=(Function)function.clone();
            }
          }
 else {
            try {
              Pattern regex=Pattern.compile("String_Node_Str",Pattern.CANON_EQ);
              Matcher m=regex.matcher(para);
              List<String> strs=new ArrayList<String>();
              while (m.find()) {
                strs.add(m.group());
              }
              String[] ps=strs.toArray(new String[strs.size()]);
              if (ps.length == function.getParameters().size()) {
                currentFun=function.clone(ps);
              }
            }
 catch (            PatternSyntaxException ex) {
            }
          }
        }
      }
    }
 else {
      currentFun=createPureFunctions(value,funs,currentFun);
    }
  }
  return currentFun;
}