Program: 58408
Project: 58408
Buggy source:
protected void renderOverviewRelations(GL gl,HeatMapWrapper leftHeatMapWrapper,HeatMapWrapper rightHeatMapWrapper){
  if (setsInFocus == null || setsInFocus.size() == 0)   return;
  float alpha=0.6f;
  ContentSelectionManager contentSelectionManager=useCase.getContentSelectionManager();
  ContentVirtualArray contentVALeft=leftHeatMapWrapper.getSet().getContentVA(ContentVAType.CONTENT);
  for (  Integer contentID : contentVALeft) {
    float positionZ=0.0f;
    for (    SelectionType type : contentSelectionManager.getSelectionTypes(contentID)) {
      float[] typeColor=type.getColor();
      positionZ=type.getPriority();
      if (type == SelectionType.MOUSE_OVER || type == SelectionType.SELECTION) {
        gl.glLineWidth(5);
        alpha=1f;
      }
 else {
        gl.glLineWidth(1);
        alpha=0.5f;
      }
      typeColor[3]=alpha;
      gl.glColor4fv(typeColor,0);
    }
    Vec2f leftPos=leftHeatMapWrapper.getRightOverviewLinkPositionFromContentID(contentID);
    if (leftPos == null)     continue;
    Vec2f rightPos=rightHeatMapWrapper.getLeftOverviewLinkPositionFromContentID(contentID);
    if (rightPos == null)     continue;
    ArrayList<Vec3f> points=new ArrayList<Vec3f>();
    points.add(new Vec3f(leftPos.x(),leftPos.y(),positionZ));
    Tree<ClusterNode> tree;
    int nodeID;
    ClusterNode node;
    ArrayList<ClusterNode> pathToRoot;
    tree=leftHeatMapWrapper.getSet().getContentTree();
    nodeID=tree.getNodeIDsFromLeafID(contentID).get(0);
    node=tree.getNodeByNumber(nodeID);
    pathToRoot=node.getParentPath(tree.getRoot());
    pathToRoot.remove(pathToRoot.size() - 1);
    for (    ClusterNode pathNode : pathToRoot) {
      Vec3f nodePos=pathNode.getPos();
      points.add(nodePos);
    }
    tree=rightHeatMapWrapper.getSet().getContentTree();
    nodeID=tree.getNodeIDsFromLeafID(contentID).get(0);
    node=tree.getNodeByNumber(nodeID);
    pathToRoot=node.getParentPath(tree.getRoot());
    pathToRoot.remove(pathToRoot.size() - 1);
    for (int i=pathToRoot.size() - 1; i >= 0; i--) {
      ClusterNode pathNode=pathToRoot.get(i);
      Vec3f nodePos=pathNode.getPos();
      points.add(nodePos);
    }
    points.add(new Vec3f(rightPos.x(),rightPos.y(),0));
    if (points.size() == 0)     continue;
    NURBSCurve curve=new NURBSCurve(points,80);
    points=curve.getCurvePoints();
    gl.glPushName(pickingManager.getPickingID(viewID,EPickingType.POLYLINE_SELECTION,contentID));
    gl.glBegin(GL.GL_LINE_STRIP);
    for (int i=0; i < points.size(); i++)     gl.glVertex3f(points.get(i).x(),points.get(i).y(),positionZ);
    gl.glEnd();
    gl.glPopName();
  }
}

Fixed version (ground truth):
protected void renderOverviewRelations(GL gl,HeatMapWrapper leftHeatMapWrapper,HeatMapWrapper rightHeatMapWrapper){
  if (setsInFocus == null || setsInFocus.size() == 0)   return;
  ContentVirtualArray contentVALeft=leftHeatMapWrapper.getSet().getContentVA(ContentVAType.CONTENT);
  for (  Integer contentID : contentVALeft) {
    float positionZ=setRelationColor(gl,leftHeatMapWrapper,contentID);
    Vec2f leftPos=leftHeatMapWrapper.getRightOverviewLinkPositionFromContentID(contentID);
    if (leftPos == null)     continue;
    Vec2f rightPos=rightHeatMapWrapper.getLeftOverviewLinkPositionFromContentID(contentID);
    if (rightPos == null)     continue;
    ArrayList<Vec3f> points=new ArrayList<Vec3f>();
    points.add(new Vec3f(leftPos.x(),leftPos.y(),positionZ));
    Tree<ClusterNode> tree;
    int nodeID;
    ClusterNode node;
    ArrayList<ClusterNode> pathToRoot;
    tree=leftHeatMapWrapper.getSet().getContentTree();
    nodeID=tree.getNodeIDsFromLeafID(contentID).get(0);
    node=tree.getNodeByNumber(nodeID);
    pathToRoot=node.getParentPath(tree.getRoot());
    pathToRoot.remove(pathToRoot.size() - 1);
    for (    ClusterNode pathNode : pathToRoot) {
      Vec3f nodePos=pathNode.getPos();
      points.add(nodePos);
    }
    tree=rightHeatMapWrapper.getSet().getContentTree();
    nodeID=tree.getNodeIDsFromLeafID(contentID).get(0);
    node=tree.getNodeByNumber(nodeID);
    pathToRoot=node.getParentPath(tree.getRoot());
    pathToRoot.remove(pathToRoot.size() - 1);
    for (int i=pathToRoot.size() - 1; i >= 0; i--) {
      ClusterNode pathNode=pathToRoot.get(i);
      Vec3f nodePos=pathNode.getPos();
      points.add(nodePos);
    }
    points.add(new Vec3f(rightPos.x(),rightPos.y(),0));
    if (points.size() == 0)     continue;
    NURBSCurve curve=new NURBSCurve(points,80);
    points=curve.getCurvePoints();
    gl.glPushName(pickingManager.getPickingID(viewID,EPickingType.POLYLINE_SELECTION,contentID));
    gl.glBegin(GL.GL_LINE_STRIP);
    for (int i=0; i < points.size(); i++)     gl.glVertex3f(points.get(i).x(),points.get(i).y(),positionZ);
    gl.glEnd();
    gl.glPopName();
  }
}