public PersonIdentifier getGlobalIdentifierById(PersonIdentifier personIdentifier) {

    ValidationService validationService = Context.getValidationService();
    validationService.validate(personIdentifier);

    GlobalIdentifier globalIdentifier = Context.getConfiguration().getGlobalIdentifier();
    if (!globalIdentifier.isAssignGlobalIdentifier()) {
      log.warn("The system is not configured to assign global identifiers.");
      return null;
    }

    IdentifierDomain globalDomain = globalIdentifier.getIdentifierDomain();
    // Check to see if the person already has a global identifier
    Person person = personDao.getPersonById(personIdentifier);
    if (person != null) {
      for (PersonIdentifier identifier : person.getPersonIdentifiers()) {
        IdentifierDomain identifierDomain = identifier.getIdentifierDomain();
        if (identifierDomain != null && identifierDomain.equals(globalDomain)) {
          if (log.isTraceEnabled()) {
            log.trace("Person has a global identifier assigned: " + identifier);
          }
          return identifier;
        }
      }
    }
    return null;
  }
  public Person findPersonById(PersonIdentifier personIdentifier) {

    ValidationService validationService = Context.getValidationService();
    validationService.validate(personIdentifier);

    return personDao.getPersonById(personIdentifier);
  }
  public List<IdentifierDomainAttribute> getIdentifierDomainAttributes(
      IdentifierDomain identifierDomain) {

    ValidationService validationService = Context.getValidationService();
    validationService.validate(identifierDomain);

    return personDao.getIdentifierDomainAttributes(identifierDomain);
  }
  public List<Person> findPersonsById(PersonIdentifier personIdentifier) {

    ValidationService validationService = Context.getValidationService();
    validationService.validate(personIdentifier);

    List<Person> persons = personDao.getPersonsByIdentifier(personIdentifier);
    return persons;
  }
  public IdentifierDomainAttribute getIdentifierDomainAttribute(
      IdentifierDomain identifierDomain, String attributeName) {

    ValidationService validationService = Context.getValidationService();
    validationService.validate(identifierDomain);

    return personDao.getIdentifierDomainAttribute(identifierDomain, attributeName);
  }
  public IdentifierDomain findIdentifierDomainByName(String identifierDomainName) {
    ValidationService validationService = Context.getValidationService();
    validationService.validate(identifierDomainName);

    if (identifierDomainName == null || identifierDomainName.length() == 0) {
      return null;
    }
    return personDao.findIdentifierDomainByName(identifierDomainName);
  }
  public IdentifierDomain findIdentifierDomain(IdentifierDomain identifierDomain) {
    ValidationService validationService = Context.getValidationService();
    validationService.validate(identifierDomain);

    if (identifierDomain == null
        || (identifierDomain.getIdentifierDomainId() == null
            && identifierDomain.getNamespaceIdentifier() == null
            && (identifierDomain.getUniversalIdentifier() == null
                || identifierDomain.getUniversalIdentifierTypeCode() == null))) {
      return null;
    }
    return super.findIdentifierDomain(identifierDomain);
  }
  public List<Person> findPersonsByAttributes(Person person) {
    ValidationService validationService = Context.getValidationService();
    validationService.validate(person);

    Record record = new Record(person);
    Criteria criteria = ConvertUtil.buildCriteriaFromProperties(record);
    ConvertUtil.addIndirectCriteria(person, criteria);
    List<Person> persons;
    if (person.getPersonIdentifiers() != null && person.getPersonIdentifiers().size() > 0) {
      persons = personDao.getPersons(criteria, person.getPersonIdentifiers());
    } else {
      persons = personDao.getPersons(criteria);
    }
    return persons;
  }
  public List<Person> findMatchingPersonsByAttributes(Person person) {
    ValidationService validationService = Context.getValidationService();
    validationService.validate(person);

    populateCustomFields(person);
    Record record = ConvertUtil.getRecordFromPerson(person);
    MatchingService matchingService = Context.getMatchingService();
    List<Person> persons = new java.util.ArrayList<Person>();
    try {
      Set<RecordPair> links = matchingService.match(record);
      for (RecordPair recordPair : links) {
        Person personLinked = (Person) recordPair.getRightRecord().getObject();
        persons.add(personDao.loadPerson(personLinked.getPersonId()));
      }
    } catch (ApplicationException e) {
      log.warn("While searching for matching persons, the system encountered an issue: " + e, e);
    }
    return persons;
  }
  public List<Person> findLinkedPersons(PersonIdentifier identifier) {
    ValidationService validationService = Context.getValidationService();
    validationService.validate(identifier);

    List<Person> linkedPersons = new ArrayList<Person>();
    Person person = personDao.getPersonById(identifier);
    if (person == null) {
      return linkedPersons;
    }
    List<PersonLink> links = personLinkDao.getPersonLinks(person);
    for (PersonLink link : links) {
      if (person.getPersonId().equals(link.getPersonLeft().getPersonId())) {
        linkedPersons.add(link.getPersonRight());
      } else {
        linkedPersons.add(link.getPersonLeft());
      }
    }
    return linkedPersons;
  }