/**
   * Checks that the given {@link PatientIdentifier} is valid
   *
   * @param pi - the {@link PatientIdentifier} to validate
   * @throws PatientIdentifierException if the {@link PatientIdentifier} is invalid
   * @should fail validation if PatientIdentifier is null
   * @should pass validation if PatientIdentifier is voided
   * @should fail validation if another patient has a matching identifier of the same type
   * @should pass if in use and id type uniqueness is set to non unique
   * @see #validateIdentifier(String, PatientIdentifierType)
   */
  public static void validateIdentifier(PatientIdentifier pi) throws PatientIdentifierException {

    // Validate that the identifier is non-null
    if (pi == null) {
      throw new BlankIdentifierException("PatientIdentifier.error.null");
    }

    // Only validate if the PatientIdentifier is not voided
    if (!pi.isVoided()) {

      // Check that this is a valid identifier
      validateIdentifier(pi.getIdentifier(), pi.getIdentifierType());

      // Check that location is included if it is required (default behavior is to require it)
      LocationBehavior lb = pi.getIdentifierType().getLocationBehavior();
      if (pi.getLocation() == null && (lb == null || lb == LocationBehavior.REQUIRED)) {
        String identifierString = (pi.getIdentifier() != null) ? pi.getIdentifier() : "";
        throw new PatientIdentifierException(
            Context.getMessageSourceService()
                .getMessage(
                    "PatientIdentifier.location.null",
                    new Object[] {identifierString},
                    Context.getLocale()));
      }

      if (pi.getIdentifierType().getUniquenessBehavior() != UniquenessBehavior.NON_UNIQUE
          && Context.getPatientService().isIdentifierInUseByAnotherPatient(pi)) {
        // Check is already in use by another patient
        throw new IdentifierNotUniqueException(
            Context.getMessageSourceService()
                .getMessage(
                    "PatientIdentifier.error.notUniqueWithParameter",
                    new Object[] {pi.getIdentifier()},
                    Context.getLocale()),
            pi);
      }
    }
  }
 private Patient getMrsPatient(org.openmrs.Patient savedPatient) {
   final List<Attribute> attributes =
       project(
           savedPatient.getAttributes(),
           Attribute.class,
           on(PersonAttribute.class).getAttributeType().toString(),
           on(PersonAttribute.class).getValue());
   PersonName firstName = patientHelper.getFirstName(savedPatient);
   final PatientIdentifier patientIdentifier = savedPatient.getPatientIdentifier();
   return new Patient(
       String.valueOf(savedPatient.getId()),
       firstName.getGivenName(),
       firstName.getMiddleName(),
       firstName.getFamilyName(),
       patientHelper.getPreferredName(savedPatient),
       savedPatient.getBirthdate(),
       savedPatient.getBirthdateEstimated(),
       savedPatient.getGender(),
       patientHelper.getAddress(savedPatient),
       attributes,
       (patientIdentifier != null)
           ? facilityAdaptor.convertLocationToFacility(patientIdentifier.getLocation())
           : null);
 }