Program: 64718
Project: 64718
Buggy source:
/** 
 * INTERNAL:
 * @param session typically will be a unit of work
 * @param userSpecifiedResolver a user-provided subclass of IDResolver, may be null 
 */
public void resolveReferences(AbstractSession session,IDResolver userSpecifiedResolver){
  for (int x=0, referencesSize=references.size(); x < referencesSize; x++) {
    Reference reference=(Reference)references.get(x);
    Object referenceSourceObject=reference.getSourceObject();
    if (reference.getMapping() instanceof XMLCollectionReferenceMapping) {
      XMLCollectionReferenceMapping mapping=(XMLCollectionReferenceMapping)reference.getMapping();
      ContainerPolicy cPolicy=mapping.getContainerPolicy();
      Object container=reference.getContainer();
      createPKVectorsFromMap(reference,mapping);
      if (reference.getPrimaryKey() == null) {
        continue;
      }
      Object value=null;
      if (!mapping.isWriteOnly()) {
        for (Iterator pkIt=((Vector)reference.getPrimaryKey()).iterator(); pkIt.hasNext(); ) {
          CacheId primaryKey=(CacheId)pkIt.next();
          value=getValue(session,reference,primaryKey);
          if (value != null) {
            cPolicy.addInto(value,container,session);
          }
        }
      }
      mapping.setAttributeValueInObject(referenceSourceObject,container);
      XMLInverseReferenceMapping inverseReferenceMapping=mapping.getInverseReferenceMapping();
      if (inverseReferenceMapping != null && value != null) {
        AttributeAccessor backpointerAccessor=inverseReferenceMapping.getAttributeAccessor();
        ContainerPolicy backpointerContainerPolicy=inverseReferenceMapping.getContainerPolicy();
        if (backpointerContainerPolicy == null) {
          backpointerAccessor.setAttributeValueInObject(value,referenceSourceObject);
        }
 else {
          Object backpointerContainer=backpointerAccessor.getAttributeValueFromObject(value);
          if (backpointerContainer == null) {
            backpointerContainer=backpointerContainerPolicy.containerInstance();
            backpointerAccessor.setAttributeValueInObject(value,backpointerContainer);
          }
          backpointerContainerPolicy.addInto(referenceSourceObject,backpointerContainer,session);
        }
      }
    }
 else     if (reference.getMapping() instanceof XMLObjectReferenceMapping) {
      CacheId primaryKey=(CacheId)reference.getPrimaryKey();
      Object value=null;
      if (userSpecifiedResolver != null) {
        final Callable c;
        try {
          if (primaryKey.getPrimaryKey().length > 1) {
            Map<String,Object> idWrapper=new HashMap<String,Object>();
            for (int y=0; y < primaryKey.getPrimaryKey().length; y++) {
              XMLObjectReferenceMapping refMapping=(XMLObjectReferenceMapping)reference.getMapping();
              String idName=refMapping.getReferenceDescriptor().getPrimaryKeyFieldNames().elementAt(y);
              Object idValue=primaryKey.getPrimaryKey()[y];
              idWrapper.put(idName,idValue);
            }
            c=userSpecifiedResolver.resolve(idWrapper,reference.getTargetClass());
          }
 else {
            c=userSpecifiedResolver.resolve(primaryKey.getPrimaryKey()[0],reference.getTargetClass());
          }
          if (c != null) {
            value=c.call();
          }
        }
 catch (        Exception e) {
          throw XMLMarshalException.unmarshalException(e);
        }
      }
 else {
        value=getValue(session,reference,primaryKey);
      }
      XMLObjectReferenceMapping mapping=(XMLObjectReferenceMapping)reference.getMapping();
      if (value != null) {
        mapping.setAttributeValueInObject(reference.getSourceObject(),value);
      }
      if (null != reference.getSetting()) {
        reference.getSetting().setValue(value);
      }
      XMLInverseReferenceMapping inverseReferenceMapping=mapping.getInverseReferenceMapping();
      if (inverseReferenceMapping != null) {
        AttributeAccessor backpointerAccessor=inverseReferenceMapping.getAttributeAccessor();
        ContainerPolicy backpointerContainerPolicy=inverseReferenceMapping.getContainerPolicy();
        if (backpointerContainerPolicy == null) {
          backpointerAccessor.setAttributeValueInObject(value,referenceSourceObject);
        }
 else {
          Object backpointerContainer=backpointerAccessor.getAttributeValueFromObject(value);
          if (backpointerContainer == null) {
            backpointerContainer=backpointerContainerPolicy.containerInstance();
            backpointerAccessor.setAttributeValueInObject(value,backpointerContainer);
          }
          backpointerContainerPolicy.addInto(reference.getSourceObject(),backpointerContainer,session);
        }
      }
    }
  }
  references=new ArrayList<Reference>();
  cache.clear();
}

Fixed version (ground truth):
/** 
 * INTERNAL:
 * @param session typically will be a unit of work
 * @param userSpecifiedResolver a user-provided subclass of IDResolver, may be null 
 */
public void resolveReferences(AbstractSession session,IDResolver userSpecifiedResolver,ErrorHandler handler){
  for (int x=0, referencesSize=references.size(); x < referencesSize; x++) {
    Reference reference=(Reference)references.get(x);
    Object referenceSourceObject=reference.getSourceObject();
    if (reference.getMapping() instanceof XMLCollectionReferenceMapping) {
      XMLCollectionReferenceMapping mapping=(XMLCollectionReferenceMapping)reference.getMapping();
      ContainerPolicy cPolicy=mapping.getContainerPolicy();
      Object container=reference.getContainer();
      createPKVectorsFromMap(reference,mapping);
      if (reference.getPrimaryKey() == null) {
        continue;
      }
      Object value=null;
      if (!mapping.isWriteOnly()) {
        for (Iterator pkIt=((Vector)reference.getPrimaryKey()).iterator(); pkIt.hasNext(); ) {
          CacheId primaryKey=(CacheId)pkIt.next();
          value=getValue(session,reference,primaryKey,handler);
          if (value != null) {
            cPolicy.addInto(value,container,session);
          }
        }
      }
      mapping.setAttributeValueInObject(referenceSourceObject,container);
      XMLInverseReferenceMapping inverseReferenceMapping=mapping.getInverseReferenceMapping();
      if (inverseReferenceMapping != null && value != null) {
        AttributeAccessor backpointerAccessor=inverseReferenceMapping.getAttributeAccessor();
        ContainerPolicy backpointerContainerPolicy=inverseReferenceMapping.getContainerPolicy();
        if (backpointerContainerPolicy == null) {
          backpointerAccessor.setAttributeValueInObject(value,referenceSourceObject);
        }
 else {
          Object backpointerContainer=backpointerAccessor.getAttributeValueFromObject(value);
          if (backpointerContainer == null) {
            backpointerContainer=backpointerContainerPolicy.containerInstance();
            backpointerAccessor.setAttributeValueInObject(value,backpointerContainer);
          }
          backpointerContainerPolicy.addInto(referenceSourceObject,backpointerContainer,session);
        }
      }
    }
 else     if (reference.getMapping() instanceof XMLObjectReferenceMapping) {
      CacheId primaryKey=(CacheId)reference.getPrimaryKey();
      Object value=null;
      if (userSpecifiedResolver != null) {
        final Callable c;
        try {
          if (primaryKey.getPrimaryKey().length > 1) {
            Map<String,Object> idWrapper=new HashMap<String,Object>();
            for (int y=0; y < primaryKey.getPrimaryKey().length; y++) {
              XMLObjectReferenceMapping refMapping=(XMLObjectReferenceMapping)reference.getMapping();
              String idName=refMapping.getReferenceDescriptor().getPrimaryKeyFieldNames().elementAt(y);
              Object idValue=primaryKey.getPrimaryKey()[y];
              idWrapper.put(idName,idValue);
            }
            c=userSpecifiedResolver.resolve(idWrapper,reference.getTargetClass());
          }
 else {
            c=userSpecifiedResolver.resolve(primaryKey.getPrimaryKey()[0],reference.getTargetClass());
          }
          if (c != null) {
            value=c.call();
          }
        }
 catch (        Exception e) {
          throw XMLMarshalException.unmarshalException(e);
        }
      }
 else {
        value=getValue(session,reference,primaryKey,handler);
      }
      XMLObjectReferenceMapping mapping=(XMLObjectReferenceMapping)reference.getMapping();
      if (value != null) {
        mapping.setAttributeValueInObject(reference.getSourceObject(),value);
      }
      if (null != reference.getSetting()) {
        reference.getSetting().setValue(value);
      }
      XMLInverseReferenceMapping inverseReferenceMapping=mapping.getInverseReferenceMapping();
      if (inverseReferenceMapping != null) {
        AttributeAccessor backpointerAccessor=inverseReferenceMapping.getAttributeAccessor();
        ContainerPolicy backpointerContainerPolicy=inverseReferenceMapping.getContainerPolicy();
        if (backpointerContainerPolicy == null) {
          backpointerAccessor.setAttributeValueInObject(value,referenceSourceObject);
        }
 else {
          Object backpointerContainer=backpointerAccessor.getAttributeValueFromObject(value);
          if (backpointerContainer == null) {
            backpointerContainer=backpointerContainerPolicy.containerInstance();
            backpointerAccessor.setAttributeValueInObject(value,backpointerContainer);
          }
          backpointerContainerPolicy.addInto(reference.getSourceObject(),backpointerContainer,session);
        }
      }
    }
  }
  references=new ArrayList<Reference>();
  cache.clear();
}