public CreateNewPackagePresenterImpl(CreateNewPackageView view) {
    super(view);
    this.view = view;
    this.content_dir = null;
    directoryChooser = new DirectoryChooser();
    fileChooser = new FileChooser();

    fileChooser
        .getExtensionFilters()
        .add(new FileChooser.ExtensionFilter("Package Description (*.json)", "*.json"));
    fileChooser
        .getExtensionFilters()
        .add(new FileChooser.ExtensionFilter("All files (*.*)", "*.*"));

    InputStream defaultRulesStream =
        Thread.currentThread()
            .getContextClassLoader()
            .getResourceAsStream("rules/default-rules.xml");

    PackageDescriptionRulesBuilder builder = new JaxbPackageDescriptionRulesBuilder();

    RulesSpec packageDescriptionPrefs = builder.buildPackageDescriptionRules(defaultRulesStream);

    ruleProperties = new SystemPropertyPreferencesRulePropertiesManager();
    ruleProperties.init(packageDescriptionPrefs);

    creator = new GeneralPackageDescriptionCreator(packageDescriptionPrefs);

    view.setPresenter(this);
    view.promptForUndefinedProperties(ruleProperties);
    bind();
  }
  private void bind() {

    // Handles the continue button in the footer being pressed. Validates that all required fields
    // are present, sets the state on the controller,
    // and instructs the controller to move to the next page.
    view.getContinueButton()
        .setOnAction(
            arg0 -> {
              try {
                if (root_artifact_dir != null
                    && root_artifact_dir.exists()
                    && root_artifact_dir.canRead()) {

                  /* Insert properties, if any */
                  for (Map.Entry<String, String> property : view.getPropertyValues().entrySet()) {
                    ruleProperties.setProperty(property.getKey(), property.getValue());
                  }
                  // TODO: when we support multiple ontologies we will need to adjust the handling
                  // of the user's
                  // choice of ontology identifier instead of hardcoded value here

                  final PackageDescriptionServiceWorker packageDescriptionService =
                      new PackageDescriptionServiceWorker(
                          DcsPackageDescriptionSpec.SPECIFICATION_ID, root_artifact_dir);

                  view.showProgressIndicatorPopUp();

                  ((ProgressDialogPopup) view.getProgressIndicatorPopUp())
                      .setCancelEventHandler(event -> packageDescriptionService.cancel());

                  controller.setCrossPageProgressIndicatorPopUp(view.getProgressIndicatorPopUp());
                  controller.setContentRoot(content_dir);
                  controller.setRootArtifactDir(root_artifact_dir);

                  packageDescriptionService.setOnCancelled(
                      event -> {
                        packageDescriptionService.reset();
                        controller.getCrossPageProgressIndicatorPopUp().hide();
                        controller.showHome(false);
                      });

                  packageDescriptionService.setOnFailed(
                      workerStateEvent -> {
                        displayExceptionMessage(workerStateEvent.getSource().getException());
                        view.getErrorMessage().setVisible(true);
                        packageDescriptionService.reset();
                        controller.getCrossPageProgressIndicatorPopUp().hide();
                        controller.showHome(false);
                      });

                  packageDescriptionService.setOnSucceeded(
                      workerStateEvent -> {
                        PackageDescription packageDescription =
                            (PackageDescription) workerStateEvent.getSource().getValue();
                        controller.setPackageDescription(packageDescription);
                        controller.setPackageDescriptionFile(null);
                        packageDescriptionService.reset();
                        controller.goToNextPage();
                      });

                  packageDescriptionService.start();

                } else if (root_artifact_dir != null
                    && (!root_artifact_dir.exists() || !root_artifact_dir.canRead())) {
                  view.getErrorMessage().setText(errors.get(ErrorKey.INACCESSIBLE_CONTENT_DIR));
                  view.getErrorMessage().setVisible(true);
                } else if (controller.getPackageDescription() != null) {
                  controller.goToNextPage();
                } else {
                  view.getErrorMessage()
                      .setText(errors.get(ErrorKey.BASE_DIRECTORY_OR_DESCRIPTION_NOT_SELECTED));
                  view.getErrorMessage().setVisible(true);
                }
              } catch (Exception e) {
                view.getErrorMessage()
                    .setText(messages.formatErrorCreatingNewPackage(e.getMessage()));
                view.getErrorMessage().setVisible(true);
                log.error(e.getMessage());
              }
            });

    // Handles the user pressing the button to choose a base directory to create a package from.
    view.getChooseContentDirectoryButton()
        .setOnAction(
            event -> {
              if (directoryChooser.getInitialDirectory() != null
                  && !directoryChooser.getInitialDirectory().exists()) {
                directoryChooser.setInitialDirectory(null);
              }

              File dir = controller.showOpenDirectoryDialog(directoryChooser);

              if (dir != null) {
                root_artifact_dir = dir;
                content_dir = root_artifact_dir.getParentFile();
                view.getSelectedBaseDirectoryTextField().setText(root_artifact_dir.getPath());
                view.getSelectedPackageDescriptionTextField().setText("");
                // If the error message happens to be visible erase it.
                view.getErrorMessage().setVisible(false);
                directoryChooser.setInitialDirectory(dir);
              }
            });

    // Handles the user pressing a button to choose an existing package description.
    view.getChoosePackageDescriptionButton()
        .setOnAction(
            arg0 -> {
              File descriptionFile = controller.showOpenFileDialog(fileChooser);

              if (descriptionFile != null) {
                try {
                  FileInputStream fis = new FileInputStream(descriptionFile);
                  PackageDescription description = packageDescriptionBuilder.deserialize(fis);
                  // If the selected package description file is valid set it on the controller and
                  // remove the content directory if it was set.
                  if (description != null) {
                    // content_dir = null;
                    controller.setPackageDescription(description);
                    controller.setPackageDescriptionFile(descriptionFile);
                    controller.setRootArtifactDir(null);
                    controller.setContentRoot(null);
                    content_dir = null;
                    root_artifact_dir = null;

                    view.getErrorMessage().setVisible(false);
                    view.getSelectedPackageDescriptionTextField()
                        .setText(descriptionFile.getPath());
                    view.getSelectedBaseDirectoryTextField().setText("");
                    fileChooser.setInitialDirectory(descriptionFile.getParentFile());
                  }
                } catch (FileNotFoundException | PackageToolException e) {
                  view.getErrorMessage()
                      .setText(
                          messages.formatPackageDescriptionBuilderFailure(
                              descriptionFile.getName()));
                  view.getErrorMessage().setVisible(true);
                  log.error(e.getMessage());
                }
              }
            });
  }