/**
   * Installs the account defined in this wizard.
   *
   * @return the created <tt>ProtocolProviderService</tt> corresponding to the new account
   * @throws OperationFailedException if the operation didn't succeed
   */
  @Override
  public ProtocolProviderService signin() throws OperationFailedException {
    firstWizardPage.commitPage();

    return firstWizardPage.isCommitted()
        ? signin(registration.getUserID(), registration.getPassword())
        : null;
  }
  /**
   * Returns the set of data that user has entered through this wizard.
   *
   * @return Iterator
   */
  @Override
  public Iterator<Map.Entry<String, String>> getSummary() {
    Hashtable<String, String> summaryTable = new Hashtable<String, String>();

    summaryTable.put(
        Resources.getString("plugin.jabberaccregwizz.USERNAME"), registration.getUserID());

    summaryTable.put(
        Resources.getString("service.gui.REMEMBER_PASSWORD"),
        Boolean.toString(registration.isRememberPassword()));

    summaryTable.put(
        Resources.getString("plugin.jabberaccregwizz.SERVER"), registration.getServerAddress());

    summaryTable.put(
        Resources.getString("service.gui.PORT"), String.valueOf(registration.getServerPort()));

    summaryTable.put(
        Resources.getString("plugin.jabberaccregwizz.ENABLE_KEEP_ALIVE"),
        String.valueOf(registration.isSendKeepAlive()));

    summaryTable.put(
        Resources.getString("plugin.jabberaccregwizz.ENABLE_GMAIL_NOTIFICATIONS"),
        String.valueOf(registration.isGmailNotificationEnabled()));

    summaryTable.put(
        Resources.getString("plugin.jabberaccregwizz.RESOURCE"), registration.getResource());

    summaryTable.put(
        Resources.getString("plugin.jabberaccregwizz.PRIORITY"),
        String.valueOf(registration.getPriority()));

    summaryTable.put(
        Resources.getString("plugin.sipaccregwizz.DTMF_METHOD"), registration.getDTMFMethod());

    summaryTable.put(
        Resources.getString("plugin.sipaccregwizz.DTMF_MINIMAL_TONE_DURATION"),
        registration.getDtmfMinimalToneDuration());

    return summaryTable.entrySet().iterator();
  }
  /**
   * Creates an account for the given user and password.
   *
   * @param providerFactory the ProtocolProviderFactory which will create the account
   * @param userName the user identifier
   * @param passwd the password
   * @return the <tt>ProtocolProviderService</tt> for the new account.
   * @throws OperationFailedException if the operation didn't succeed
   */
  protected ProtocolProviderService installAccount(
      ProtocolProviderFactory providerFactory, String userName, String passwd)
      throws OperationFailedException {
    if (logger.isTraceEnabled()) {
      logger.trace("Preparing to install account for user " + userName);
    }
    Hashtable<String, String> accountProperties = new Hashtable<String, String>();

    String protocolIconPath = getProtocolIconPath();

    String accountIconPath = getAccountIconPath();

    registration.storeProperties(
        userName, passwd, protocolIconPath, accountIconPath, accountProperties);

    accountProperties.put(
        ProtocolProviderFactory.IS_PREFERRED_PROTOCOL, Boolean.toString(isPreferredProtocol()));
    accountProperties.put(ProtocolProviderFactory.PROTOCOL, getProtocol());

    if (isModification()) {
      providerFactory.modifyAccount(protocolProvider, accountProperties);

      setModification(false);

      return protocolProvider;
    }

    try {
      if (logger.isTraceEnabled()) {
        logger.trace(
            "Will install account for user "
                + userName
                + " with the following properties."
                + accountProperties);
      }

      AccountID accountID = providerFactory.installAccount(userName, accountProperties);

      ServiceReference serRef = providerFactory.getProviderForAccount(accountID);

      protocolProvider =
          (ProtocolProviderService) JabberAccRegWizzActivator.bundleContext.getService(serRef);
    } catch (IllegalArgumentException exc) {
      logger.warn(exc.getMessage());

      throw new OperationFailedException(
          "Username, password or server is null.", OperationFailedException.ILLEGAL_ARGUMENT);
    } catch (IllegalStateException exc) {
      logger.warn(exc.getMessage());

      throw new OperationFailedException(
          "Account already exists.", OperationFailedException.IDENTIFICATION_CONFLICT);
    } catch (Throwable exc) {
      logger.warn(exc.getMessage());

      throw new OperationFailedException(
          "Failed to add account.", OperationFailedException.GENERAL_ERROR);
    }

    return protocolProvider;
  }
  /**
   * Installs the account defined in this wizard.
   *
   * @param userName the user name to sign in with
   * @param password the password to sign in with
   * @return the created <tt>ProtocolProviderService</tt> corresponding to the new account
   * @throws OperationFailedException if the operation didn't succeed
   */
  public ProtocolProviderService signin(final String userName, final String password)
      throws OperationFailedException {
    /*
     * If firstWizardPage is null we are requested sign-in from initial
     * account registration form we must init firstWizardPage in order to
     * init default values
     * Pawel: firstWizardPage is never null, and commitPage fails with no
     * user ID provided for simple account wizard. Now userName and password
     * are reentered here.
     */
    final AccountPanel accPanel = (AccountPanel) firstWizardPage.getSimpleForm();
    /*
     * XXX Swing is not thread safe! We've experienced deadlocks on OS X
     * upon invoking accPanel's setters. In order to address them, (1)
     * invoke accPanel's setters on the AWT event dispatching thread and (2)
     * do it only if absolutely necessary.
     */
    String accPanelUsername = accPanel.getUsername();
    boolean equals = false;
    final boolean rememberPassword = (password != null);

    if (StringUtils.isEquals(accPanelUsername, userName)) {
      char[] accPanelPasswordChars = accPanel.getPassword();
      char[] passwordChars = (password == null) ? null : password.toCharArray();

      if (accPanelPasswordChars == null)
        equals = ((passwordChars == null) || passwordChars.length == 0);
      else if (passwordChars == null) equals = (accPanelPasswordChars.length == 0);
      else equals = Arrays.equals(accPanelPasswordChars, passwordChars);
      if (equals) {
        boolean accPanelRememberPassword = accPanel.isRememberPassword();

        equals = (accPanelRememberPassword == rememberPassword);
      }
    }
    if (!equals) {
      try {
        if (SwingUtilities.isEventDispatchThread()) {
          accPanel.setUsername(userName);
          accPanel.setPassword(password);
          accPanel.setRememberPassword(rememberPassword);
        } else {
          SwingUtilities.invokeAndWait(
              new Runnable() {
                public void run() {
                  accPanel.setUsername(userName);
                  accPanel.setPassword(password);
                  accPanel.setRememberPassword(rememberPassword);
                }
              });
        }
      } catch (Exception e) {
        if (e instanceof OperationFailedException) {
          throw (OperationFailedException) e;
        } else {
          throw new OperationFailedException(
              "Failed to set username and password on " + accPanel.getClass().getName(),
              OperationFailedException.INTERNAL_ERROR,
              e);
        }
      }
    }

    if (!firstWizardPage.isCommitted()) firstWizardPage.commitPage();
    if (!firstWizardPage.isCommitted()) {
      throw new OperationFailedException(
          "Could not confirm data.", OperationFailedException.GENERAL_ERROR);
    }

    ProtocolProviderFactory factory = JabberAccRegWizzActivator.getJabberProtocolProviderFactory();

    return installAccount(
        factory,
        registration.getUserID(), // The user id may get changed.
        // Server part can be added in the
        // data commit.
        password);
  }