/**
   * Imports Person from tab/comma delimited File.
   *
   * @param PersonFile a tab delimited file with Person data.
   */
  private static void importPerson(Database db, File PersonFile)
      throws DatabaseException, IOException, Exception {
    logger.debug("trying to import " + PersonFile);
    if (!PersonFile.exists()) {
      logger.warn("Person.txt file is missing, skipped import");
    } else {
      // read Person from file
      CsvReader reader = new CsvFileReader(PersonFile);
      List<Person> personList =
          db.toList(Person.class, reader, Integer.MAX_VALUE); // should have no limit
      logger.debug("loaded " + personList.size() + " Person objects");

      // redirect incoming and outgoing fkeys
      List<Integer> personIds = new ArrayList<Integer>(); // also doesn't scale
      for (int i = 0; i < personList.size(); i++) // sorry, not a real list so need to put back!!
      {
        Person object = personList.get(i);

        // remember index of this id for incoming fkeys
        personIds.add(object.getId());

        // redirect outgoing fkeys
        if (object.getAffiliation() != null)
          object.setAffiliation_Id(instituteIdMap.get(object.getAffiliation_Id()));
        if (object.getRoles() != null)
          object.setRoles_Id(ontologyTermIdMap.get(object.getRoles_Id()));

        // add assay back to list
        personList.set(i, object);
      }
      // add to database
      db.add(personList);
      for (int i = 0; i < personList.size(); i++) {
        personIdMap.put(personIds.get(i), personList.get(i).getId());
        molgenisRoleIdMap.put(personIds.get(i), personList.get(i).getId());
      }
    }
  }
  public ImportWizardExcelPrognosis(File excelFile) throws Exception {

    Workbook workbook = Workbook.getWorkbook(excelFile);
    ArrayList<String> lowercasedSheetNames = new ArrayList<String>();
    Map<String, String> lowerToOriginalName = new HashMap<String, String>();

    try {

      for (String sheetName : workbook.getSheetNames()) {
        lowercasedSheetNames.add(sheetName.toLowerCase());
        lowerToOriginalName.put(sheetName.toLowerCase(), sheetName);
      }

      if (lowercasedSheetNames.contains("molgenisrole")) {
        String originalSheetname = lowerToOriginalName.get("molgenisrole");
        Sheet sheet = workbook.getSheet(originalSheetname);
        MolgenisRoleExcelReader excelReader = new MolgenisRoleExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        MolgenisRole entity = new MolgenisRole();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("molgenisgroup")) {
        String originalSheetname = lowerToOriginalName.get("molgenisgroup");
        Sheet sheet = workbook.getSheet(originalSheetname);
        MolgenisGroupExcelReader excelReader = new MolgenisGroupExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        MolgenisGroup entity = new MolgenisGroup();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("institute")) {
        String originalSheetname = lowerToOriginalName.get("institute");
        Sheet sheet = workbook.getSheet(originalSheetname);
        InstituteExcelReader excelReader = new InstituteExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        Institute entity = new Institute();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("ontology")) {
        String originalSheetname = lowerToOriginalName.get("ontology");
        Sheet sheet = workbook.getSheet(originalSheetname);
        OntologyExcelReader excelReader = new OntologyExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        Ontology entity = new Ontology();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("ontologyterm")) {
        String originalSheetname = lowerToOriginalName.get("ontologyterm");
        Sheet sheet = workbook.getSheet(originalSheetname);
        OntologyTermExcelReader excelReader = new OntologyTermExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        OntologyTerm entity = new OntologyTerm();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("person")) {
        String originalSheetname = lowerToOriginalName.get("person");
        Sheet sheet = workbook.getSheet(originalSheetname);
        PersonExcelReader excelReader = new PersonExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        Person entity = new Person();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("molgenisuser")) {
        String originalSheetname = lowerToOriginalName.get("molgenisuser");
        Sheet sheet = workbook.getSheet(originalSheetname);
        MolgenisUserExcelReader excelReader = new MolgenisUserExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        MolgenisUser entity = new MolgenisUser();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("molgenisrolegrouplink")) {
        String originalSheetname = lowerToOriginalName.get("molgenisrolegrouplink");
        Sheet sheet = workbook.getSheet(originalSheetname);
        MolgenisRoleGroupLinkExcelReader excelReader = new MolgenisRoleGroupLinkExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        MolgenisRoleGroupLink entity = new MolgenisRoleGroupLink();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("molgenisfile")) {
        String originalSheetname = lowerToOriginalName.get("molgenisfile");
        Sheet sheet = workbook.getSheet(originalSheetname);
        MolgenisFileExcelReader excelReader = new MolgenisFileExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        MolgenisFile entity = new MolgenisFile();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("runtimeproperty")) {
        String originalSheetname = lowerToOriginalName.get("runtimeproperty");
        Sheet sheet = workbook.getSheet(originalSheetname);
        RuntimePropertyExcelReader excelReader = new RuntimePropertyExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        RuntimeProperty entity = new RuntimeProperty();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("publication")) {
        String originalSheetname = lowerToOriginalName.get("publication");
        Sheet sheet = workbook.getSheet(originalSheetname);
        PublicationExcelReader excelReader = new PublicationExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        Publication entity = new Publication();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("usecase")) {
        String originalSheetname = lowerToOriginalName.get("usecase");
        Sheet sheet = workbook.getSheet(originalSheetname);
        UseCaseExcelReader excelReader = new UseCaseExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        UseCase entity = new UseCase();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("molgenisentity")) {
        String originalSheetname = lowerToOriginalName.get("molgenisentity");
        Sheet sheet = workbook.getSheet(originalSheetname);
        MolgenisEntityExcelReader excelReader = new MolgenisEntityExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        MolgenisEntity entity = new MolgenisEntity();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }
      if (lowercasedSheetNames.contains("molgenispermission")) {
        String originalSheetname = lowerToOriginalName.get("molgenispermission");
        Sheet sheet = workbook.getSheet(originalSheetname);
        MolgenisPermissionExcelReader excelReader = new MolgenisPermissionExcelReader();
        List<String> allHeaders = excelReader.getNonEmptyHeaders(sheet);
        MolgenisPermission entity = new MolgenisPermission();
        headersToMaps(originalSheetname, allHeaders, entity.getFields());
      }

      for (String sheetName : lowerToOriginalName.values()) {
        if (importOrder.contains(sheetName)) {
          sheetsImportable.put(sheetName, true);
        } else {
          sheetsImportable.put(sheetName, false);
        }
      }

    } catch (Exception e) {
      throw e;
    } finally {
      workbook.close();
    }
  }