Program: 68700
Project: 68700
Buggy source:
/** 
 * INTERNAL: Recursive function deep copies all contained properties. Requirements: The value object has isSet=true for all callers.
 * @param copy
 * @param property
 * @param value
 * @param doMap (cache original -> copy DataObject instances to set non-containment properties after tree construction)
 * @param propMap (cache original DO:non-containment property values to be set after tree construction)
 */
private void copyContainmentPropertyValue(SDODataObject copy,Property property,Object value,HashMap doMap,HashMap ncPropMap,SDOChangeSummary cs){
  if (property.isMany()) {
    List copyValue=new ArrayList();
    copy.set(property,copyValue,false);
    for (Iterator iterValues=((List)value).iterator(); iterValues.hasNext(); ) {
      SDODataObject o=(SDODataObject)iterValues.next();
      DataObject copyO=copyPrivate(o,doMap,ncPropMap,cs);
      ((ListWrapper)copy.getList(property)).add(copyO,false);
      if ((copyO != null) && (copyO.getChangeSummary() != null) && (((SDOType)copyO.getType()).getChangeSummaryProperty() != null)) {
        if (o.getChangeSummary().isLogging()) {
          ((SDOChangeSummary)copyO.getChangeSummary()).setLogging(true);
        }
        copyChangeSummary(o.getChangeSummary(),copyO.getChangeSummary(),doMap);
      }
    }
  }
 else {
    DataObject copyO=copyPrivate((SDODataObject)value,doMap,ncPropMap,cs);
    copy.set(property,copyO,false);
    if ((copyO != null) && (copyO.getChangeSummary() != null) && (((SDOType)copyO.getType()).getChangeSummaryProperty() != null)) {
      if (((SDODataObject)value).getChangeSummary().isLogging()) {
        ((SDOChangeSummary)copyO.getChangeSummary()).setLogging(true);
      }
      copyChangeSummary(((SDODataObject)value).getChangeSummary(),copyO.getChangeSummary(),doMap);
    }
  }
}

Fixed version (ground truth):
/** 
 * INTERNAL: Recursive function deep copies all contained properties. Requirements: The value object has isSet=true for all callers.
 * @param copy
 * @param property
 * @param value
 * @param doMap (cache original -> copy DataObject instances to set non-containment properties after tree construction)
 * @param propMap (cache original DO:non-containment property values to be set after tree construction)
 */
private void copyContainmentPropertyValue(SDODataObject copy,Property property,Object value,HashMap doMap,HashMap ncPropMap,SDOChangeSummary cs){
  if (property.isMany()) {
    List copyValue=new ArrayList();
    copy.setInternal(property,copyValue,false);
    for (Iterator iterValues=((List)value).iterator(); iterValues.hasNext(); ) {
      SDODataObject o=(SDODataObject)iterValues.next();
      DataObject copyO=copyPrivate(o,doMap,ncPropMap,cs);
      ((ListWrapper)copy.getList(property)).add(copyO,false);
      if ((copyO != null) && (copyO.getChangeSummary() != null) && (((SDOType)copyO.getType()).getChangeSummaryProperty() != null)) {
        if (o.getChangeSummary().isLogging()) {
          ((SDOChangeSummary)copyO.getChangeSummary()).setLogging(true);
        }
        copyChangeSummary(o.getChangeSummary(),copyO.getChangeSummary(),doMap);
      }
    }
  }
 else {
    DataObject copyO=copyPrivate((SDODataObject)value,doMap,ncPropMap,cs);
    copy.setInternal(property,copyO,false);
    if ((copyO != null) && (copyO.getChangeSummary() != null) && (((SDOType)copyO.getType()).getChangeSummaryProperty() != null)) {
      if (((SDODataObject)value).getChangeSummary().isLogging()) {
        ((SDOChangeSummary)copyO.getChangeSummary()).setLogging(true);
      }
      copyChangeSummary(((SDODataObject)value).getChangeSummary(),copyO.getChangeSummary(),doMap);
    }
  }
}