private void saveDocumentStatus(
      DocumentStatus cspDocumentStatus, PASEventRefVo pasEventRef, MemberOfStaffShortVo mos)
      throws StaleObjectException {
    DomainFactory factory = getDomainFactory();

    CorrespondenceDetails domCspDet =
        CorrespondenceDetails.getCorrespondenceDetailsFromPasEvent(
            factory, pasEventRef.getID_PASEvent());
    CorrespondenceDetailsVo voCorrespondenceDetails =
        CorrespondenceDetailsVoAssembler.create(domCspDet);

    voCorrespondenceDetails.setCspStatusHistory(
        updateHistoryStatus(voCorrespondenceDetails, cspDocumentStatus, mos));
    voCorrespondenceDetails.setCurrentStatus(cspDocumentStatus);

    CorrespondenceDetails domDocDetails = null;

    domDocDetails =
        CorrespondenceDetailsVoAssembler.extractCorrespondenceDetails(
            factory, voCorrespondenceDetails);

    factory.save(domDocDetails);
  }
  public static java.util.Set extractCorrespondenceDetailsSet(
      ims.domain.ILightweightDomainFactory domainFactory,
      ims.correspondence.vo.CorrespondenceDetailsVoCollection voCollection,
      java.util.Set domainObjectSet,
      HashMap domMap) {
    int size = (null == voCollection) ? 0 : voCollection.size();
    if (domainObjectSet == null) {
      domainObjectSet = new java.util.HashSet();
    }
    java.util.Set newSet = new java.util.HashSet();
    for (int i = 0; i < size; i++) {
      ims.correspondence.vo.CorrespondenceDetailsVo vo = voCollection.get(i);
      ims.correspondence.domain.objects.CorrespondenceDetails domainObject =
          CorrespondenceDetailsVoAssembler.extractCorrespondenceDetails(domainFactory, vo, domMap);

      // TODO: This can only occur in the situation of a stale object exception. For now leave it to
      // the Interceptor to handle it.
      if (domainObject == null) {
        continue;
      }

      // Trying to avoid the hibernate collection being marked as dirty via its public interface
      // methods. (like add)
      if (!domainObjectSet.contains(domainObject)) domainObjectSet.add(domainObject);
      newSet.add(domainObject);
    }
    java.util.Set removedSet = new java.util.HashSet();
    java.util.Iterator iter = domainObjectSet.iterator();
    // Find out which objects need to be removed
    while (iter.hasNext()) {
      ims.domain.DomainObject o = (ims.domain.DomainObject) iter.next();
      if ((o == null || o.getIsRIE() == null || !o.getIsRIE().booleanValue())
          && !newSet.contains(o)) {
        removedSet.add(o);
      }
    }
    iter = removedSet.iterator();
    // Remove the unwanted objects
    while (iter.hasNext()) {
      domainObjectSet.remove(iter.next());
    }
    return domainObjectSet;
  }
  public static java.util.List extractCorrespondenceDetailsList(
      ims.domain.ILightweightDomainFactory domainFactory,
      ims.correspondence.vo.CorrespondenceDetailsVoCollection voCollection,
      java.util.List domainObjectList,
      HashMap domMap) {
    int size = (null == voCollection) ? 0 : voCollection.size();
    if (domainObjectList == null) {
      domainObjectList = new java.util.ArrayList();
    }
    for (int i = 0; i < size; i++) {
      ims.correspondence.vo.CorrespondenceDetailsVo vo = voCollection.get(i);
      ims.correspondence.domain.objects.CorrespondenceDetails domainObject =
          CorrespondenceDetailsVoAssembler.extractCorrespondenceDetails(domainFactory, vo, domMap);

      // TODO: This can only occur in the situation of a stale object exception. For now leave it to
      // the Interceptor to handle it.
      if (domainObject == null) {
        continue;
      }

      int domIdx = domainObjectList.indexOf(domainObject);
      if (domIdx == -1) {
        domainObjectList.add(i, domainObject);
      } else if (i != domIdx && i < domainObjectList.size()) {
        Object tmp = domainObjectList.get(i);
        domainObjectList.set(i, domainObjectList.get(domIdx));
        domainObjectList.set(domIdx, tmp);
      }
    }

    // Remove all ones in domList where index > voCollection.size() as these should
    // now represent the ones removed from the VO collection. No longer referenced.
    int i1 = domainObjectList.size();
    while (i1 > size) {
      domainObjectList.remove(i1 - 1);
      i1 = domainObjectList.size();
    }
    return domainObjectList;
  }