Program: 108767
Project: 108767
Buggy source:
@Override @SuppressWarnings("String_Node_Str") protected List<Group> prepareGroups(){
  String valid=internalIsValid();
  if (valid != null) {
    throw new IllegalArgumentException(valid);
  }
  DataTypeWithRatioScale<T> type=(DataTypeWithRatioScale<T>)getDataType();
  if (this.adjustment == DynamicAdjustment.SNAP_TO_BOUNDS) {
    for (    String value : getData()) {
      T parsedValue=type.parse(value);
      try {
        if (type.compare(min,parsedValue) > 0) {
          min=parsedValue;
        }
        if (type.compare(max,parsedValue) < 0) {
          max=parsedValue;
        }
      }
 catch (      Exception e) {
        throw new IllegalArgumentException("String_Node_Str" + value);
      }
    }
  }
  ArrayList<IndexNode> nodes=new ArrayList<IndexNode>();
  for (int i=0, len=intervals.size(); i < len; i+=INDEX_FANOUT) {
    int min=i;
    int max=Math.min(i + INDEX_FANOUT - 1,len - 1);
    List<Interval<T>> leafs=new ArrayList<Interval<T>>();
    for (int j=min; j <= max; j++) {
      leafs.add(intervals.get(j));
    }
    nodes.add(new IndexNode(intervals.get(min).min,intervals.get(max).max,leafs.toArray(new Interval[leafs.size()])));
  }
  while (nodes.size() > 1) {
    List<IndexNode> current=(List<IndexNode>)nodes.clone();
    nodes.clear();
    for (int i=0, len=current.size(); i < len; i+=INDEX_FANOUT) {
      int min=i;
      int max=Math.min(i + INDEX_FANOUT - 1,len - 1);
      List<IndexNode> temp=new ArrayList<IndexNode>();
      for (int j=min; j <= max; j++) {
        temp.add(current.get(j));
      }
      nodes.add(new IndexNode(current.get(min).min,current.get(max).max,temp.toArray(new HierarchyBuilderIntervalBased.IndexNode[temp.size()])));
    }
  }
  IndexNode index=nodes.get(0);
  String[] data=getData();
  List<Group> groups=new ArrayList<Group>();
  for (int i=0; i < data.length; i++) {
    groups.add(getInterval(index,data[i]));
  }
  return groups;
}

Fixed version (ground truth):
@Override @SuppressWarnings("String_Node_Str") protected List<Group> prepareGroups(){
  String valid=internalIsValid();
  if (valid != null) {
    throw new IllegalArgumentException(valid);
  }
  DataTypeWithRatioScale<T> type=(DataTypeWithRatioScale<T>)getDataType();
  T actualMin=min;
  T actualMax=max;
  if (this.adjustment == DynamicAdjustment.SNAP_TO_BOUNDS) {
    for (    String value : getData()) {
      T parsedValue=type.parse(value);
      try {
        if (type.compare(actualMin,parsedValue) > 0) {
          actualMin=parsedValue;
        }
        if (type.compare(actualMax,parsedValue) < 0) {
          actualMax=parsedValue;
        }
      }
 catch (      Exception e) {
        throw new IllegalArgumentException("String_Node_Str" + value);
      }
    }
  }
  List<Interval<T>> actualIntervals=this.intervals;
  if (actualMin != min) {
    actualIntervals=(ArrayList<Interval<T>>)((ArrayList<Interval<T>>)this.intervals).clone();
    Interval<T> first=intervals.get(0);
    actualIntervals.set(0,new Interval<T>((DataType<T>)type,actualMin,first.max,first.function));
  }
  ArrayList<IndexNode> nodes=new ArrayList<IndexNode>();
  for (int i=0, len=actualIntervals.size(); i < len; i+=INDEX_FANOUT) {
    int min=i;
    int max=Math.min(i + INDEX_FANOUT - 1,len - 1);
    List<Interval<T>> leafs=new ArrayList<Interval<T>>();
    for (int j=min; j <= max; j++) {
      leafs.add(actualIntervals.get(j));
    }
    nodes.add(new IndexNode(actualIntervals.get(min).min,actualIntervals.get(max).max,leafs.toArray(new Interval[leafs.size()])));
  }
  while (nodes.size() > 1) {
    List<IndexNode> current=(List<IndexNode>)nodes.clone();
    nodes.clear();
    for (int i=0, len=current.size(); i < len; i+=INDEX_FANOUT) {
      int min=i;
      int max=Math.min(i + INDEX_FANOUT - 1,len - 1);
      List<IndexNode> temp=new ArrayList<IndexNode>();
      for (int j=min; j <= max; j++) {
        temp.add(current.get(j));
      }
      nodes.add(new IndexNode(current.get(min).min,current.get(max).max,temp.toArray(new HierarchyBuilderIntervalBased.IndexNode[temp.size()])));
    }
  }
  IndexNode index=nodes.get(0);
  String[] data=getData();
  List<Group> groups=new ArrayList<Group>();
  Map<Group,Group> cache=new HashMap<Group,Group>();
  for (int i=0; i < data.length; i++) {
    Group group=getInterval(index,actualMax,data[i]);
    Group cached=cache.get(group);
    if (cached != null) {
      groups.add(cached);
    }
 else {
      cache.put(group,group);
      groups.add(group);
    }
  }
  return groups;
}