docs: private void executeAction(Action action, Form form) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
          // TODO: Check that all the required fields of the form were filled, if
          // TODO: not throw the corresponding exception. This will make a faster response,
          // TODO: since the request is stopped before it's sent.
          AdHocCommandData data = new AdHocCommandData();
          data.setType(IQ.Type.set);
          data.setTo(getOwnerJID());
          data.setNode(getNode());
          data.setSessionID(sessionID);
          data.setAction(action);
  
          if (form != null) {
              data.setForm(form.getDataFormToSend());
          }
  
          AdHocCommandData responseData = null;
          try {
              responseData = connection.createStanzaCollectorAndSend(data).nextResultOrThrow();
          }
          finally {
              // We set the response data in a 'finally' block, so that it also gets set even if an error IQ was returned.
              if (responseData != null) {
                  this.sessionID = responseData.getSessionID();
                  super.setData(responseData);
              }
          }
  
      }