Program: 75410
Project: 75410
Buggy source:
/** 
 * @param cubeHandle
 * @param cubeMaterializer
 * @throws IOException
 * @throws BirtException
 * @throws DataException
 */
private void createCube(TabularCubeHandle cubeHandle,CubeMaterializer cubeMaterializer) throws IOException, BirtException, DataException {
  List measureNames=new ArrayList();
  List measureGroups=cubeHandle.getContents(CubeHandle.MEASURE_GROUPS_PROP);
  for (int i=0; i < measureGroups.size(); i++) {
    MeasureGroupHandle mgh=(MeasureGroupHandle)measureGroups.get(i);
    List measures=mgh.getContents(MeasureGroupHandle.MEASURES_PROP);
    for (int j=0; j < measures.size(); j++) {
      MeasureHandle measure=(MeasureHandle)measures.get(j);
      measureNames.add(measure.getName());
    }
  }
  IDimension[] dimensions=populateDimensions(cubeMaterializer,cubeHandle);
  String[][] keyColumnNames=new String[dimensions.length][];
  for (int i=0; i < dimensions.length; i++) {
    TabularDimensionHandle dim=(TabularDimensionHandle)cubeHandle.getDimension(dimensions[i].getName());
    TabularHierarchyHandle hier=(TabularHierarchyHandle)dim.getDefaultHierarchy();
    if (cubeHandle.getDataSet().equals(hier.getDataSet())) {
      keyColumnNames[i]=dimensions[i].getHierarchy().getLevels()[dimensions[i].getHierarchy().getLevels().length - 1].getKeyNames();
    }
 else {
      Iterator it=cubeHandle.joinConditionsIterator();
      while (it.hasNext()) {
        DimensionConditionHandle dimCondHandle=(DimensionConditionHandle)it.next();
        if (dimCondHandle.getHierarchy().equals(hier)) {
          Iterator conditionIt=dimCondHandle.getJoinConditions().iterator();
          List keys=new ArrayList();
          while (conditionIt.hasNext()) {
            DimensionJoinConditionHandle joinCondition=(DimensionJoinConditionHandle)conditionIt.next();
            keys.add(joinCondition.getHierarchyKey());
          }
          keyColumnNames[i]=new String[keys.size()];
          for (int j=0; j < keys.size(); j++) {
            keyColumnNames[i][j]=keys.get(j).toString();
          }
        }
      }
    }
  }
  cubeMaterializer.createCube(cubeHandle.getQualifiedName(),keyColumnNames,dimensions,new DataSetIterator(this,cubeHandle),this.toStringArray(measureNames),null);
}

Fixed version (ground truth):
/** 
 * @param cubeHandle
 * @param cubeMaterializer
 * @throws IOException
 * @throws BirtException
 * @throws DataException
 */
private void createCube(TabularCubeHandle cubeHandle,CubeMaterializer cubeMaterializer) throws IOException, BirtException, DataException {
  List measureNames=new ArrayList();
  List measureGroups=cubeHandle.getContents(CubeHandle.MEASURE_GROUPS_PROP);
  for (int i=0; i < measureGroups.size(); i++) {
    MeasureGroupHandle mgh=(MeasureGroupHandle)measureGroups.get(i);
    List measures=mgh.getContents(MeasureGroupHandle.MEASURES_PROP);
    for (int j=0; j < measures.size(); j++) {
      MeasureHandle measure=(MeasureHandle)measures.get(j);
      measureNames.add(measure.getName());
    }
  }
  IDimension[] dimensions=populateDimensions(cubeMaterializer,cubeHandle);
  String[][] factTableKey=new String[dimensions.length][];
  String[][] dimensionKey=new String[dimensions.length][];
  for (int i=0; i < dimensions.length; i++) {
    TabularDimensionHandle dim=(TabularDimensionHandle)cubeHandle.getDimension(dimensions[i].getName());
    TabularHierarchyHandle hier=(TabularHierarchyHandle)dim.getDefaultHierarchy();
    if (cubeHandle.getDataSet().equals(hier.getDataSet())) {
      factTableKey[i]=dimensions[i].getHierarchy().getLevels()[dimensions[i].getHierarchy().getLevels().length - 1].getKeyNames();
      dimensionKey[i]=factTableKey[i];
    }
 else {
      Iterator it=cubeHandle.joinConditionsIterator();
      while (it.hasNext()) {
        DimensionConditionHandle dimCondHandle=(DimensionConditionHandle)it.next();
        if (dimCondHandle.getHierarchy().equals(hier)) {
          Iterator conditionIt=dimCondHandle.getJoinConditions().iterator();
          List dimensionKeys=new ArrayList();
          List factTableKeys=new ArrayList();
          while (conditionIt.hasNext()) {
            DimensionJoinConditionHandle joinCondition=(DimensionJoinConditionHandle)conditionIt.next();
            if (isAttribute(dimensions[i],joinCondition.getLevelName(),joinCondition.getHierarchyKey())) {
              dimensionKeys.add(OlapExpressionUtil.getAttributeColumnName(getLevelName(dimensions[i],joinCondition.getLevelName()),joinCondition.getHierarchyKey()));
            }
 else {
              dimensionKeys.add(joinCondition.getHierarchyKey());
            }
            factTableKeys.add(OlapExpressionUtil.getQualifiedLevelName(dimensions[i].getName(),joinCondition.getCubeKey()));
          }
          factTableKey[i]=new String[factTableKeys.size()];
          dimensionKey[i]=new String[dimensionKeys.size()];
          for (int j=0; j < dimensionKeys.size(); j++) {
            factTableKey[i][j]=factTableKeys.get(j).toString();
            dimensionKey[i][j]=dimensionKeys.get(j).toString();
          }
        }
      }
    }
  }
  cubeMaterializer.createCube(cubeHandle.getQualifiedName(),factTableKey,dimensionKey,dimensions,new DataSetIterator(this,cubeHandle),this.toStringArray(measureNames),null);
}