private void addNames(Accessions accession, List<NameLinkType> nameList)
      throws IllegalAccessException, InvocationTargetException, DuplicateLinkException,
          UnknownLookupListException, PersistenceException, NoSuchAlgorithmException,
          UnsupportedEncodingException {
    NamesDAO namesDao = new NamesDAO();
    ArchDescriptionNames accessionName;

    for (NameLinkType thisNameLink : nameList) {
      accessionName =
          new ArchDescriptionNames(lookupName(namesDao, thisNameLink.getName()), accession);
      ImportUtils.nullSafeSet(
          accessionName,
          ArchDescriptionNames.PROPERTYNAME_NAME_LINK_FUNCTION,
          thisNameLink.getNameLinkFunction());
      ImportUtils.nullSafeSet(
          accessionName, ArchDescriptionNames.PROPERTYNAME_FORM, thisNameLink.getNameLinkForm());
      ImportUtils.nullSafeSet(
          accessionName, ArchDescriptionNames.PROPERTYNAME_ROLE, thisNameLink.getNameLinkRole());
      accession.addName(accessionName);
    }
  }
  /**
   * Import the file.
   *
   * @param importFile the file to import.
   * @param controller the controller to use.
   * @param progressPanel - the progress panel to display heartbeat messages
   * @return if we succeded
   */
  public boolean importFile(
      File importFile, DomainImportController controller, InfiniteProgressPanel progressPanel)
      throws ImportException {

    Collection<DomainObject> collection = new ArrayList<DomainObject>();

    if (importFile != null) {
      JAXBContext context;
      try {
        LookupListUtils.initIngestReport();
        context = JAXBContext.newInstance("org.archiviststoolkit.structure.accessionImport");
        AccessionRecords accessionRecords =
            (AccessionRecords) context.createUnmarshaller().unmarshal(importFile);
        Accessions accession;
        int recordCount = 1;
        progressPanel.setTextLine("Importing...", 1);
        PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(RecordType.class);
        for (RecordType record : accessionRecords.getRecord()) {
          // check to see if the process was cancelled  at this point if so just return
          if (progressPanel.isProcessCancelled()) {
            return false;
          }

          progressPanel.setTextLine("Processing record " + recordCount, 2);
          accession = new Accessions();
          accession.setRepository(repository);

          for (PropertyDescriptor descriptor : descriptors) {
            Class propertyType = descriptor.getPropertyType();
            if (propertyType == XMLGregorianCalendar.class) {
              ImportUtils.nullSafeDateSet(
                  accession,
                  descriptor.getName(),
                  (XMLGregorianCalendar) descriptor.getReadMethod().invoke(record));
            } else if (propertyType == String.class
                || propertyType == BigInteger.class
                || propertyType == BigDecimal.class) {
              ImportUtils.nullSafeSet(
                  accession, descriptor.getName(), descriptor.getReadMethod().invoke(record));

            } else if (propertyType == Boolean.class) {
              // this hack is needed because jaxb has a bug and the read method starts
              // with "is" instead of "get"
              String writeMethodName = descriptor.getWriteMethod().getName();
              String readMethodName = writeMethodName.replaceFirst("set", "is");
              Method readMethod = RecordType.class.getMethod(readMethodName);
              ImportUtils.nullSafeSet(accession, descriptor.getName(), readMethod.invoke(record));
            }
          }
          parseAccessionNumber(accession, record.getAccessionNumber());
          addSubjects(accession, record.getSubjectLink());
          addNames(accession, record.getNameLink());
          addResource(
              accession,
              record.getResourceIdentifier(),
              controller,
              accession.getAccessionNumber(),
              recordCount);
          collection.add(accession);
          recordCount++;
        }
        controller.domainImport(collection, ApplicationFrame.getInstance(), progressPanel);
        ImportExportLogDialog dialog =
            new ImportExportLogDialog(
                controller.constructFinalImportLogText()
                    + "\n\n"
                    + LookupListUtils.getIngestReport(),
                ImportExportLogDialog.DIALOG_TYPE_IMPORT);
        progressPanel.close();
        dialog.showDialog();
      } catch (JAXBException e) {
        progressPanel.close();
        new ErrorDialog(
                ApplicationFrame.getInstance(), "There is a problem importing accessions.", e)
            .showDialog();
      } catch (IllegalAccessException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (InvocationTargetException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (UnknownLookupListException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (ValidationException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (PersistenceException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (DuplicateLinkException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (NoSuchMethodException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (NoSuchAlgorithmException e) {
        new ErrorDialog("", e).showDialog();
      } catch (UnsupportedEncodingException e) {
        new ErrorDialog("", e).showDialog();
      }
    }
    return (true);
  }
  private Names lookupName(NamesDAO namesDao, NameComplexType nameFromImport)
      throws IllegalAccessException, InvocationTargetException, UnknownLookupListException,
          PersistenceException, NoSuchAlgorithmException, UnsupportedEncodingException {
    Names name = new Names();
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_NAME_TYPE, nameFromImport.getNameType());
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_SORT_NAME, nameFromImport.getSortName());
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_NAME_RULE, nameFromImport.getNameRule());
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_NUMBER, nameFromImport.getNumber());
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_QUALIFIER, nameFromImport.getQualifier());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_DESCRIPTION_TYPE, nameFromImport.getDescriptionType());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_DESCRIPTION_NOTE, nameFromImport.getDescriptionNote());
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_CITATION, nameFromImport.getCitation());
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_SALUTATION, nameFromImport.getSalutation());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_CONTACT_ADDRESS_1, nameFromImport.getContactAddress1());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_CONTACT_ADDRESS_2, nameFromImport.getContactAddress2());
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_CONTACT_CITY, nameFromImport.getContactCity());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_CONTACT_REGION, nameFromImport.getContactRegion());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_CONTACT_COUNTRY, nameFromImport.getContactCountry());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_CONTACT_MAIL_CODE, nameFromImport.getContactMailCode());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_CONTACT_PHONE, nameFromImport.getContactPhone());
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_CONTACT_FAX, nameFromImport.getContactFax());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_CONTACT_EMAIL, nameFromImport.getContactEmail());
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_CONTACT_NAME, nameFromImport.getContactName());
    ImportUtils.nullSafeSet(name, Names.PROPERTYNAME_FAMILY_NAME, nameFromImport.getFamilyName());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_FAMILY_NAME_PREFIX, nameFromImport.getFamilyNamePrefix());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_CORPORATE_PRIMARY_NAME, nameFromImport.getCorporatePrimaryName());
    ImportUtils.nullSafeSet(
        name,
        Names.PROPERTYNAME_CORPORATE_SUBORDINATE_1,
        nameFromImport.getCorporateSubordinate1());
    ImportUtils.nullSafeSet(
        name,
        Names.PROPERTYNAME_CORPORATE_SUBORDINATE_2,
        nameFromImport.getCorporateSubordinate2());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_PERSONAL_PRIMARY_NAME, nameFromImport.getPersonalPrimaryName());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_PERSONAL_REST_OF_NAME, nameFromImport.getPersonalRestOfName());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_PERSONAL_PREFIX, nameFromImport.getPersonalPrefix());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_PERSONAL_SUFFIX, nameFromImport.getPersonalSuffix());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_PERSONAL_FULLER_FORM, nameFromImport.getPersonalFullerForm());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_PERSONAL_TITLE, nameFromImport.getPersonalTitle());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_PERSONAL_DATES, nameFromImport.getPersonalDates());
    ImportUtils.nullSafeSet(
        name, Names.PROPERTYNAME_PERSONAL_DIRECT_ORDER, nameFromImport.isPersonalDirectOrder());
    if (nameFromImport.getNameSource() == null) {
      name.setNameSource("ingest");
    } else {
      name.setNameSource(nameFromImport.getNameSource());
    }
    if (name.getSortName() == null || name.getSortName().length() == 0) {
      name.createSortName();

      // check to see if sort name is still empty. If so, set it to " " so that
      // this record can be inserted into an Oracle DB without throwing an error
      if (name.getSortName().length() == 0) {
        name.setSortName(" ");
      }
    }
    NameUtils.setMd5Hash(name);

    return namesDao.lookupName(name, true);
  }