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

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

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

        // redirect outgoing fkeys
        if (object.getOntology() != null)
          object.setOntology_Id(ontologyIdMap.get(object.getOntology_Id()));

        // add assay back to list
        ontologyTermList.set(i, object);
      }
      // add to database
      db.add(ontologyTermList);
      for (int i = 0; i < ontologyTermList.size(); i++) {
        ontologyTermIdMap.put(ontologyTermIds.get(i), ontologyTermList.get(i).getId());
      }
    }
  }
  @Override
  public List<HtmlInput<?>> getInputs() {
    List<HtmlInput<?>> inputs = new ArrayList<HtmlInput<?>>();
    // Autoid: Field(entity=ProtocolApplication_ontol11768, name=autoid, type=int, auto=true,
    // nillable=false, readonly=false, default=null)
    {
      IntInput input =
          new IntInput("ProtocolApplication_ontol11768_autoid", getEntity().getAutoid());

      input.setLabel("autoid");
      input.setDescription("automatic id field to ensure ordering of mrefs");
      input.setNillable(false);
      input.setReadonly(isReadonly() || getEntity().isReadonly());
      input.setHidden(!isNewRecord());
      if (this.getCompactView().size() > 0 && !this.getCompactView().contains(input.getName())) {
        input.setCollapse(true);
      }

      inputs.add(input);
    }
    // OntologyReference: Field(entity=ProtocolApplication_ontol11768, name=ontologyReference,
    // type=xref[OntologyTerm.id], xref_label='name', auto=false, nillable=false, readonly=false,
    // default=null)
    {
      // TODO: when we have JPA this should become:
      // XrefInput input = new XrefInput("ProtocolApplication_ontol11768_ontologyReference",
      // getEntity().getOntologyReference());
      // create xref dummy object
      OntologyTerm dummy = null;
      if (getEntity().getOntologyReference_Id() != null) {
        dummy = new OntologyTerm();
        dummy.setId(getEntity().getOntologyReference_Id());
        dummy.setName(getEntity().getOntologyReference_Name());
      }
      XrefInput input =
          new XrefInput(
              "ProtocolApplication_ontol11768_ontologyReference",
              org.molgenis.core.OntologyTerm.class,
              dummy);

      input.setLabel("ontologyReference");
      input.setDescription("");
      input.setNillable(false);
      input.setReadonly(isReadonly() || getEntity().isReadonly());
      if (this.getHiddenColumns().contains(input.getName())) {
        input.setHidden(!isNewRecord());
      }
      if (this.getCompactView().size() > 0 && !this.getCompactView().contains(input.getName())) {
        input.setCollapse(true);
      }

      inputs.add(input);
    }
    // InvestigationElement: Field(entity=ProtocolApplication_ontol11768, name=InvestigationElement,
    // type=xref[ProtocolApplication.id], xref_label=, auto=false, nillable=false, readonly=false,
    // default=null)
    {
      // TODO: when we have JPA this should become:
      // XrefInput input = new XrefInput("ProtocolApplication_ontol11768_InvestigationElement",
      // getEntity().getInvestigationElement());
      // create xref dummy object
      ProtocolApplication dummy = null;
      if (getEntity().getInvestigationElement_Id() != null) {
        dummy = new ProtocolApplication();
        dummy.setId(getEntity().getInvestigationElement_Id());
        dummy.setName(getEntity().getInvestigationElement_Name());
      }
      XrefInput input =
          new XrefInput(
              "ProtocolApplication_ontol11768_InvestigationElement",
              org.molgenis.protocol.ProtocolApplication.class,
              dummy);

      input.setLabel("InvestigationElement");
      input.setDescription("");
      input.setNillable(false);
      input.setReadonly(isReadonly() || getEntity().isReadonly());
      if (this.getHiddenColumns().contains(input.getName())) {
        input.setHidden(!isNewRecord());
      }
      if (this.getCompactView().size() > 0 && !this.getCompactView().contains(input.getName())) {
        input.setCollapse(true);
      }

      inputs.add(input);
    }

    return inputs;
  }
  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();
    }
  }