@Override
  public void run() {
    try {
      final JDialog configDialog =
          TwsListener.getConfigDialog(); // blocks the thread until the config dialog is available

      GuiExecutor.instance()
          .execute(
              new Runnable() {
                @Override
                public void run() {
                  configure(
                      configDialog, mPortNumber, mApiEnable, mApiReadOnly, mApiBypassPrecautions);
                }
              });

    } catch (Exception e) {
      Utils.logError("" + e.getMessage());
    }
  }
  private void configure(
      final JDialog configDialog,
      final int portNumber,
      final String ApiEnable,
      final String ApiReadOnly,
      final String ApiBypassPrecautions) {
    try {

      final String Enable = "enable";
      final String Disable = "disable";
      final String Manual = "manual";

      if (!TwsListener.selectConfigSection(configDialog, new String[] {"API", "Settings"}))
        // older versions of TWS don't have the Settings node below the API node
        TwsListener.selectConfigSection(configDialog, new String[] {"API"});

      if (portNumber != 0) {

        Utils.logToConsole("Performing port configuration");

        Component comp = Utils.findComponent(configDialog, "Socket port");
        if (comp == null) throw new IBControllerException("could not find socket port component");

        JTextField tf = Utils.findTextField((Container) comp, 0);
        if (tf == null) throw new IBControllerException("could not find socket port field");

        int currentPort = Integer.parseInt(tf.getText());
        if (currentPort == portNumber) {
          Utils.logToConsole("TWS API socket port is already set to " + tf.getText());
        } else {
          if (!IBController.isGateway()) {
            JCheckBox cb = Utils.findCheckBox(configDialog, "Enable ActiveX and Socket Clients");
            if (cb == null)
              throw new IBControllerException("could not find Enable ActiveX checkbox");
            if (cb.isSelected()) TwsListener.setApiConfigChangeConfirmationExpected(true);
          }
          Utils.logToConsole("TWS API socket port was set to " + tf.getText());
          tf.setText(new Integer(portNumber).toString());
          Utils.logToConsole("TWS API socket port now set to " + tf.getText());
        }
      }

      // implement ForceTwsApiEnable=enable|disable|manual
      if (!ApiEnable.equalsIgnoreCase(Manual)) {
        Utils.logToConsole("Configure ActiveX and Socket Clients: " + ApiEnable);
        JCheckBox apicb = Utils.findCheckBox(configDialog, "Enable ActiveX and Socket Clients");
        if (apicb == null)
          throw new IBControllerException("could not find Enable ActiveX checkbox");
        if (ApiEnable.equalsIgnoreCase(Enable)) {
          if (!apicb.isSelected()) apicb.doClick();
        } else if (ApiEnable.equalsIgnoreCase(Disable)) {
          if (apicb.isSelected()) apicb.doClick();
        }
        Utils.logToConsole(
            "TWS Enable ActiveX and Socket Clients checkbox was set to " + apicb.isSelected());
      }

      // implement ForceTwsApiReadOnly=enable|disable|manual
      if (!ApiReadOnly.equalsIgnoreCase(Manual)) {
        Utils.logToConsole("Configure TWS Read-Only API checkbox: " + ApiReadOnly);
        JCheckBox rocb = Utils.findCheckBox(configDialog, "Read-Only API");
        if (rocb == null) throw new IBControllerException("could not find read-only API checkbox");
        if (ApiReadOnly.equalsIgnoreCase(Enable)) {
          if (!rocb.isSelected()) rocb.doClick();
        } else if (ApiReadOnly.equalsIgnoreCase(Disable)) {
          if (rocb.isSelected()) rocb.doClick();
        }
        Utils.logToConsole("TWS Read-Only API checkbox was set to " + rocb.isSelected());
      }

      if (!ApiBypassPrecautions.equalsIgnoreCase(Manual)) {
        // now configure the Order Precautions, if the configuration calls for it
        Utils.logToConsole(
            "Configure Bypass Order Precautions API checkbox: " + ApiBypassPrecautions);
        if (TwsListener.selectConfigSection(configDialog, new String[] {"API", "Precautions"})) {

          JCheckBox bpcb =
              Utils.findCheckBox(configDialog, "Bypass Order Precautions for API Orders");
          if (bpcb == null)
            throw new IBControllerException("could not find Bypass Order Precautions API checkbox");
          if (ApiBypassPrecautions.equalsIgnoreCase(Enable)) {
            if (!bpcb.isSelected()) bpcb.doClick();
          } else if (ApiBypassPrecautions.equalsIgnoreCase(Disable)) {
            if (bpcb.isSelected()) bpcb.doClick();
          }
          Utils.logToConsole(
              "Bypass Order Precautions for API checkbox was set to " + bpcb.isSelected());
        } else {
          throw new IBControllerException("Can't select API->Precautions config section");
        }
      }

      Utils.clickButton(configDialog, "OK");

      configDialog.setVisible(false);
    } catch (IBControllerException e) {
      Utils.logError("" + e.getMessage());
    }
  }