public static ims.core.clinical.domain.objects.Medication extractMedication(
      ims.domain.ILightweightDomainFactory domainFactory,
      ims.core.vo.MedicationVo valueObject,
      HashMap domMap) {
    if (null == valueObject) {
      return null;
    }
    Integer id = valueObject.getID_Medication();
    ims.core.clinical.domain.objects.Medication domainObject = null;
    if (null == id) {
      if (domMap.get(valueObject) != null) {
        return (ims.core.clinical.domain.objects.Medication) domMap.get(valueObject);
      }
      // ims.core.vo.MedicationVo ID_Medication field is unknown
      domainObject = new ims.core.clinical.domain.objects.Medication();
      domMap.put(valueObject, domainObject);
    } else {
      String key = (valueObject.getClass().getName() + "__" + valueObject.getID_Medication());
      if (domMap.get(key) != null) {
        return (ims.core.clinical.domain.objects.Medication) domMap.get(key);
      }
      domainObject =
          (ims.core.clinical.domain.objects.Medication)
              domainFactory.getDomainObject(ims.core.clinical.domain.objects.Medication.class, id);

      // TODO: Not sure how this should be handled. Effectively it must be a staleobject exception,
      // but maybe should be handled as that further up.
      if (domainObject == null) return null;

      domMap.put(key, domainObject);
    }
    domainObject.setVersion(valueObject.getVersion_Medication());

    domainObject.setTaxonomyMap(
        ims.core.vo.domain.TaxonomyMapAssembler.extractTaxonomyMapList(
            domainFactory, valueObject.getTaxonomyMap(), domainObject.getTaxonomyMap(), domMap));
    domainObject.setKeywords(
        ims.core.vo.domain.KeywordVoAssembler.extractKeywordList(
            domainFactory, valueObject.getKeywords(), domainObject.getKeywords(), domMap));
    // This is to overcome a bug in both Sybase and Oracle which prevents them from storing an empty
    // string correctly
    // Sybase stores it as a single space, Oracle stores it as NULL. This fix will make them
    // consistent at least.
    if (valueObject.getMedicationName() != null && valueObject.getMedicationName().equals("")) {
      valueObject.setMedicationName(null);
    }
    domainObject.setMedicationName(valueObject.getMedicationName());
    domainObject.setIsActive(valueObject.getIsActive());
    domainObject.setIsControlledDrug(valueObject.getIsControlledDrug());
    // create LookupInstance from vo LookupType
    ims.domain.lookups.LookupInstance value6 = null;
    if (null != valueObject.getFrequencyDefault()) {
      value6 = domainFactory.getLookupInstance(valueObject.getFrequencyDefault().getID());
    }
    domainObject.setFrequencyDefault(value6);
    domainObject.setNoOfDaysSupplyDefault(valueObject.getNoOfDaysSupplyDefault());

    return domainObject;
  }
  /**
   * Update the ValueObject with the Domain Object.
   *
   * @param map DomainObjectMap of DomainObjects to already created ValueObjects.
   * @param valueObject to be updated
   * @param domainObject ims.core.resource.domain.objects.ServiceActivity
   */
  public static ims.core.vo.ServiceActivityForServiceConfigurationVo insert(
      DomainObjectMap map,
      ims.core.vo.ServiceActivityForServiceConfigurationVo valueObject,
      ims.core.resource.domain.objects.ServiceActivity domainObject) {
    if (null == domainObject) {
      return valueObject;
    }
    if (null == map) {
      map = new DomainObjectMap();
    }

    valueObject.setID_ServiceActivity(domainObject.getId());
    valueObject.setIsRIE(domainObject.getIsRIE());

    // If this is a recordedInError record, and the domainObject
    // value isIncludeRecord has not been set, then we return null and
    // not the value object
    if (valueObject.getIsRIE() != null
        && valueObject.getIsRIE().booleanValue() == true
        && !domainObject.isIncludeRecord()) return null;

    // If this is not a recordedInError record, and the domainObject
    // value isIncludeRecord has been set, then we return null and
    // not the value object
    if ((valueObject.getIsRIE() == null || valueObject.getIsRIE().booleanValue() == false)
        && domainObject.isIncludeRecord()) return null;

    // Service
    if (domainObject.getService() != null) {
      if (domainObject.getService()
          instanceof
          HibernateProxy) // If the proxy is set, there is no need to lazy load, the proxy knows the
      // id already.
      {
        HibernateProxy p = (HibernateProxy) domainObject.getService();
        int id = Integer.parseInt(p.getHibernateLazyInitializer().getIdentifier().toString());
        valueObject.setService(new ims.core.clinical.vo.ServiceRefVo(id, -1));
      } else {
        valueObject.setService(
            new ims.core.clinical.vo.ServiceRefVo(
                domainObject.getService().getId(), domainObject.getService().getVersion()));
      }
    }
    // Activity
    valueObject.setActivity(
        ims.core.vo.domain.ActivityLiteVoAssembler.create(map, domainObject.getActivity()));
    // TaxonomyMap
    valueObject.setTaxonomyMap(
        ims.core.vo.domain.TaxonomyMapAssembler.createTaxonomyMapCollectionFromTaxonomyMap(
            map, domainObject.getTaxonomyMap()));
    // isActive
    valueObject.setIsActive(domainObject.isIsActive());
    // isFlexible
    valueObject.setIsFlexible(domainObject.isIsFlexible());
    return valueObject;
  }
  /**
   * Update the ValueObject with the Domain Object.
   *
   * @param map DomainObjectMap of DomainObjects to already created ValueObjects.
   * @param valueObject to be updated
   * @param domainObject ims.oncology.domain.objects.ContactTypesByDisciplineItem
   */
  public static ims.oncology.vo.ContactTypesByDisciplineItemVo insert(
      DomainObjectMap map,
      ims.oncology.vo.ContactTypesByDisciplineItemVo valueObject,
      ims.oncology.domain.objects.ContactTypesByDisciplineItem domainObject) {
    if (null == domainObject) {
      return valueObject;
    }
    if (null == map) {
      map = new DomainObjectMap();
    }

    valueObject.setID_ContactTypesByDisciplineItem(domainObject.getId());
    valueObject.setIsRIE(domainObject.getIsRIE());

    // If this is a recordedInError record, and the domainObject
    // value isIncludeRecord has not been set, then we return null and
    // not the value object
    if (valueObject.getIsRIE() != null
        && valueObject.getIsRIE().booleanValue() == true
        && !domainObject.isIncludeRecord()) return null;

    // If this is not a recordedInError record, and the domainObject
    // value isIncludeRecord has been set, then we return null and
    // not the value object
    if ((valueObject.getIsRIE() == null || valueObject.getIsRIE().booleanValue() == false)
        && domainObject.isIncludeRecord()) return null;

    // ContactType
    valueObject.setContactType(domainObject.getContactType());
    // Active
    valueObject.setActive(domainObject.isActive());
    // Parent
    if (domainObject.getParent() != null) {
      if (domainObject.getParent()
          instanceof
          HibernateProxy) // If the proxy is set, there is no need to lazy load, the proxy knows the
      // id already.
      {
        HibernateProxy p = (HibernateProxy) domainObject.getParent();
        int id = Integer.parseInt(p.getHibernateLazyInitializer().getIdentifier().toString());
        valueObject.setParent(new ims.oncology.vo.ContactTypesByDisciplineItemRefVo(id, -1));
      } else {
        valueObject.setParent(
            new ims.oncology.vo.ContactTypesByDisciplineItemRefVo(
                domainObject.getParent().getId(), domainObject.getParent().getVersion()));
      }
    }
    // TaxonomyMap
    valueObject.setTaxonomyMap(
        ims.core.vo.domain.TaxonomyMapAssembler.createTaxonomyMapCollectionFromTaxonomyMap(
            map, domainObject.getTaxonomyMap()));
    return valueObject;
  }
  public static ims.core.resource.people.domain.objects.Gp extractGp(
      ims.domain.ILightweightDomainFactory domainFactory,
      ims.core.vo.GPNTPFVo valueObject,
      HashMap domMap) {
    if (null == valueObject) {
      return null;
    }
    Integer id = valueObject.getID_Gp();
    ims.core.resource.people.domain.objects.Gp domainObject = null;
    if (null == id) {
      if (domMap.get(valueObject) != null) {
        return (ims.core.resource.people.domain.objects.Gp) domMap.get(valueObject);
      }
      // ims.core.vo.GPNTPFVo ID_Gp field is unknown
      domainObject = new ims.core.resource.people.domain.objects.Gp();
      domMap.put(valueObject, domainObject);
    } else {
      String key = (valueObject.getClass().getName() + "__" + valueObject.getID_Gp());
      if (domMap.get(key) != null) {
        return (ims.core.resource.people.domain.objects.Gp) domMap.get(key);
      }
      domainObject =
          (ims.core.resource.people.domain.objects.Gp)
              domainFactory.getDomainObject(ims.core.resource.people.domain.objects.Gp.class, id);

      // TODO: Not sure how this should be handled. Effectively it must be a staleobject exception,
      // but maybe should be handled as that further up.
      if (domainObject == null) return null;

      domMap.put(key, domainObject);
    }
    domainObject.setVersion(valueObject.getVersion_Gp());

    domainObject.setName(
        ims.core.vo.domain.PersonNameAssembler.extractPersonName(
            domainFactory, valueObject.getName(), domMap));
    domainObject.setPractices(
        ims.core.vo.domain.GPToPracticeNTPFVoAssembler.extractGpToPracticeSet(
            domainFactory, valueObject.getPractices(), domainObject.getPractices(), domMap));
    domainObject.setCodeMappings(
        ims.core.vo.domain.TaxonomyMapAssembler.extractTaxonomyMapList(
            domainFactory, valueObject.getCodeMappings(), domainObject.getCodeMappings(), domMap));

    return domainObject;
  }
  public static java.util.Set extractTaxonomyMapSet(
      ims.domain.ILightweightDomainFactory domainFactory,
      ims.core.vo.TaxonomyMapCollection 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.core.vo.TaxonomyMap vo = voCollection.get(i);
      ims.core.clinical.domain.objects.TaxonomyMap domainObject =
          TaxonomyMapAssembler.extractTaxonomyMap(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;
  }
  /**
   * Update the ValueObject with the Domain Object.
   *
   * @param map DomainObjectMap of DomainObjects to already created ValueObjects.
   * @param valueObject to be updated
   * @param domainObject ims.core.resource.people.domain.objects.Gp
   */
  public static ims.core.vo.GPNTPFVo insert(
      DomainObjectMap map,
      ims.core.vo.GPNTPFVo valueObject,
      ims.core.resource.people.domain.objects.Gp domainObject) {
    if (null == domainObject) {
      return valueObject;
    }
    if (null == map) {
      map = new DomainObjectMap();
    }

    valueObject.setID_Gp(domainObject.getId());
    valueObject.setIsRIE(domainObject.getIsRIE());

    // If this is a recordedInError record, and the domainObject
    // value isIncludeRecord has not been set, then we return null and
    // not the value object
    if (valueObject.getIsRIE() != null
        && valueObject.getIsRIE().booleanValue() == true
        && !domainObject.isIncludeRecord()) return null;

    // If this is not a recordedInError record, and the domainObject
    // value isIncludeRecord has been set, then we return null and
    // not the value object
    if ((valueObject.getIsRIE() == null || valueObject.getIsRIE().booleanValue() == false)
        && domainObject.isIncludeRecord()) return null;

    // name
    valueObject.setName(ims.core.vo.domain.PersonNameAssembler.create(map, domainObject.getName()));
    // practices
    valueObject.setPractices(
        ims.core.vo.domain.GPToPracticeNTPFVoAssembler
            .createGPToPracticeNTPFVoCollectionFromGpToPractice(map, domainObject.getPractices()));
    // CodeMappings
    valueObject.setCodeMappings(
        ims.core.vo.domain.TaxonomyMapAssembler.createTaxonomyMapCollectionFromTaxonomyMap(
            map, domainObject.getCodeMappings()));
    return valueObject;
  }
  public static java.util.List extractTaxonomyMapList(
      ims.domain.ILightweightDomainFactory domainFactory,
      ims.core.vo.TaxonomyMapCollection 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.core.vo.TaxonomyMap vo = voCollection.get(i);
      ims.core.clinical.domain.objects.TaxonomyMap domainObject =
          TaxonomyMapAssembler.extractTaxonomyMap(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;
  }
  /**
   * Update the ValueObject with the Domain Object.
   *
   * @param map DomainObjectMap of DomainObjects to already created ValueObjects.
   * @param valueObject to be updated
   * @param domainObject ims.core.clinical.domain.objects.Medication
   */
  public static ims.core.vo.MedicationVo insert(
      DomainObjectMap map,
      ims.core.vo.MedicationVo valueObject,
      ims.core.clinical.domain.objects.Medication domainObject) {
    if (null == domainObject) {
      return valueObject;
    }
    if (null == map) {
      map = new DomainObjectMap();
    }

    valueObject.setID_Medication(domainObject.getId());
    valueObject.setIsRIE(domainObject.getIsRIE());

    // If this is a recordedInError record, and the domainObject
    // value isIncludeRecord has not been set, then we return null and
    // not the value object
    if (valueObject.getIsRIE() != null
        && valueObject.getIsRIE().booleanValue() == true
        && !domainObject.isIncludeRecord()) return null;

    // If this is not a recordedInError record, and the domainObject
    // value isIncludeRecord has been set, then we return null and
    // not the value object
    if ((valueObject.getIsRIE() == null || valueObject.getIsRIE().booleanValue() == false)
        && domainObject.isIncludeRecord()) return null;

    // TaxonomyMap
    valueObject.setTaxonomyMap(
        ims.core.vo.domain.TaxonomyMapAssembler.createTaxonomyMapCollectionFromTaxonomyMap(
            map, domainObject.getTaxonomyMap()));
    // Keywords
    valueObject.setKeywords(
        ims.core.vo.domain.KeywordVoAssembler.createKeywordVoCollectionFromKeyword(
            map, domainObject.getKeywords()));
    // MedicationName
    valueObject.setMedicationName(domainObject.getMedicationName());
    // isActive
    valueObject.setIsActive(domainObject.isIsActive());
    // isControlledDrug
    valueObject.setIsControlledDrug(domainObject.isIsControlledDrug());
    // FrequencyDefault
    ims.domain.lookups.LookupInstance instance6 = domainObject.getFrequencyDefault();
    if (null != instance6) {
      ims.framework.utils.ImagePath img = null;
      ims.framework.utils.Color color = null;
      img = null;
      if (instance6.getImage() != null) {
        img =
            new ims.framework.utils.ImagePath(
                instance6.getImage().getImageId(), instance6.getImage().getImagePath());
      }
      color = instance6.getColor();
      if (color != null) color.getValue();

      ims.core.vo.lookups.MedicationFrequency voLookup6 =
          new ims.core.vo.lookups.MedicationFrequency(
              instance6.getId(), instance6.getText(), instance6.isActive(), null, img, color);
      ims.core.vo.lookups.MedicationFrequency parentVoLookup6 = voLookup6;
      ims.domain.lookups.LookupInstance parent6 = instance6.getParent();
      while (parent6 != null) {
        if (parent6.getImage() != null) {
          img =
              new ims.framework.utils.ImagePath(
                  parent6.getImage().getImageId(), parent6.getImage().getImagePath());
        } else {
          img = null;
        }
        color = parent6.getColor();
        if (color != null) color.getValue();
        parentVoLookup6.setParent(
            new ims.core.vo.lookups.MedicationFrequency(
                parent6.getId(), parent6.getText(), parent6.isActive(), null, img, color));
        parentVoLookup6 = parentVoLookup6.getParent();
        parent6 = parent6.getParent();
      }
      valueObject.setFrequencyDefault(voLookup6);
    }
    // NoOfDaysSupplyDefault
    valueObject.setNoOfDaysSupplyDefault(domainObject.getNoOfDaysSupplyDefault());
    return valueObject;
  }
  public static ims.oncology.domain.objects.ContactTypesByDisciplineItem
      extractContactTypesByDisciplineItem(
          ims.domain.ILightweightDomainFactory domainFactory,
          ims.oncology.vo.ContactTypesByDisciplineItemVo valueObject,
          HashMap domMap) {
    if (null == valueObject) {
      return null;
    }
    Integer id = valueObject.getID_ContactTypesByDisciplineItem();
    ims.oncology.domain.objects.ContactTypesByDisciplineItem domainObject = null;
    if (null == id) {
      if (domMap.get(valueObject) != null) {
        return (ims.oncology.domain.objects.ContactTypesByDisciplineItem) domMap.get(valueObject);
      }
      // ims.oncology.vo.ContactTypesByDisciplineItemVo ID_ContactTypesByDisciplineItem field is
      // unknown
      domainObject = new ims.oncology.domain.objects.ContactTypesByDisciplineItem();
      domMap.put(valueObject, domainObject);
    } else {
      String key =
          (valueObject.getClass().getName()
              + "__"
              + valueObject.getID_ContactTypesByDisciplineItem());
      if (domMap.get(key) != null) {
        return (ims.oncology.domain.objects.ContactTypesByDisciplineItem) domMap.get(key);
      }
      domainObject =
          (ims.oncology.domain.objects.ContactTypesByDisciplineItem)
              domainFactory.getDomainObject(
                  ims.oncology.domain.objects.ContactTypesByDisciplineItem.class, id);

      // TODO: Not sure how this should be handled. Effectively it must be a staleobject exception,
      // but maybe should be handled as that further up.
      if (domainObject == null) return null;

      domMap.put(key, domainObject);
    }
    domainObject.setVersion(valueObject.getVersion_ContactTypesByDisciplineItem());

    // This is to overcome a bug in both Sybase and Oracle which prevents them from storing an empty
    // string correctly
    // Sybase stores it as a single space, Oracle stores it as NULL. This fix will make them
    // consistent at least.
    if (valueObject.getContactType() != null && valueObject.getContactType().equals("")) {
      valueObject.setContactType(null);
    }
    domainObject.setContactType(valueObject.getContactType());
    domainObject.setActive(valueObject.getActive());
    ims.oncology.domain.objects.ContactTypesByDisciplineItem value3 = null;
    if (null != valueObject.getParent()) {
      if (valueObject.getParent().getBoId() == null) {
        if (domMap.get(valueObject.getParent()) != null) {
          value3 =
              (ims.oncology.domain.objects.ContactTypesByDisciplineItem)
                  domMap.get(valueObject.getParent());
        }
      } else if (valueObject.getBoVersion()
          == -1) // RefVo was not modified since obtained from the Assembler, no need to update the
      // BO field
      {
        value3 = domainObject.getParent();
      } else {
        value3 =
            (ims.oncology.domain.objects.ContactTypesByDisciplineItem)
                domainFactory.getDomainObject(
                    ims.oncology.domain.objects.ContactTypesByDisciplineItem.class,
                    valueObject.getParent().getBoId());
      }
    }
    domainObject.setParent(value3);
    domainObject.setTaxonomyMap(
        ims.core.vo.domain.TaxonomyMapAssembler.extractTaxonomyMapList(
            domainFactory, valueObject.getTaxonomyMap(), domainObject.getTaxonomyMap(), domMap));

    return domainObject;
  }