@Override
    public boolean finish() {
      // about to invoke the operation so save our state
      saveWidgetValues();

      if (!saveDirtyEditors())
        // User clicked on cancel when being asked to save dirty editors.
        return false;

      final Injector injector =
          UIPlugin.getInstance()
              .createInjector(
                  new OAuthModule(
                      FORGE_CLIENT_ID,
                      FORGE_CLIENT_SECRET,
                      loginField.getText(),
                      passwordField.getText()));
      try {
        @SuppressWarnings("unchecked")
        List<IResource> whiteCheckedResources = getWhiteCheckedResources();
        File tmpDir = new File(System.getProperty("java.io.tmpdir"));
        File destinationDir = File.createTempFile("forge-", ".tarballs", tmpDir);
        destinationDir.delete();
        destinationDir.mkdir();
        ModuleExportToForgeOperation exportOp =
            new ModuleExportToForgeOperation(
                getExportSpecs(whiteCheckedResources),
                destinationDir,
                dryRunButton.getSelection()) {

              @Override
              protected Forge getForge() {
                return injector.getInstance(Forge.class);
              }

              @Override
              protected ForgeService getForgeService() {
                return injector.getInstance(ForgeService.class);
              }
            };
        boolean result = executeExport(exportOp);
        Diagnostic diag = exportOp.getDiagnostic();
        if (diag.getSeverity() == Diagnostic.ERROR) {
          Exception e = diag.getException();
          ErrorDialog.openError(
              getContainer().getShell(),
              DataTransferMessages.DataTransfer_exportProblems,
              null, // no special message
              UIPlugin.createStatus(IStatus.ERROR, diag.toString(), e));
        } else
          MessageDialog.openInformation(
              getContainer().getShell(),
              DataTransferMessages.DataTransfer_information,
              diag.toString());
        return result;
      } catch (CoreException e) {
        ErrorDialog.openError(
            getContainer().getShell(),
            DataTransferMessages.DataTransfer_exportProblems,
            null, // no special message
            e.getStatus());
      } catch (Exception e) {
        ErrorDialog.openError(
            getContainer().getShell(),
            DataTransferMessages.DataTransfer_exportProblems,
            null,
            UIPlugin.createStatus(IStatus.ERROR, e.getMessage(), e));
      }
      return false;
    }