void processAjaxRequest(HttpServletRequest request, Element xmlResponse) {
   try {
     sendProwlNotification(request);
   } catch (RuntimeException e) {
     ActionErrors errors = new ActionErrors();
     errors.addError("tcprowlProblem", createMessageWithNested(e));
     getOrCreateMessages(request).addMessage("tcprowlMessage", createMessageWithNested(e));
     errors.serialize(xmlResponse);
   }
 }
  @Override
  protected void doPost(
      @NotNull final HttpServletRequest request,
      @NotNull final HttpServletResponse response,
      @NotNull final Element xmlResponse) {
    final ActionErrors errors = new ActionErrors();
    final BasePropertiesBean propsBean = new BasePropertiesBean(null);
    PluginPropertiesUtil.bindPropertiesFromRequest(request, propsBean, true);

    final Map<String, String> props = propsBean.getProperties();
    final String subscriptionId = props.get(AzureWebConstants.SUBSCRIPTION_ID);
    final String certificate = props.get("secure:" + AzureWebConstants.MANAGEMENT_CERTIFICATE);

    final AzureApiConnector apiConnector;
    try {
      apiConnector = new AzureApiConnector(subscriptionId, certificate);
      apiConnector.test();
    } catch (InvalidCertificateException ex) {
      errors.addError(
          "certificateError",
          "Invalid Management certificate. Please enter the Management Certificate exactly as it is presented in the subscription file.");
      errors.serialize(xmlResponse);
      LOG.warnAndDebugDetails("An error during initializing connection: " + ex.getMessage(), ex);
      return;
    } catch (CheckedCloudException ex) {
      errors.addError(
          "pingError",
          "Error connecting to Microsoft Azure. Please check that your Management Certificate and Subscription ID are valid.");
      errors.serialize(xmlResponse);
      LOG.warnAndDebugDetails("An error during initializing connection: " + ex.getMessage(), ex);
      return;
    }

    final List<Promise<Content, Throwable, Void>> promises = new ArrayList<>(myHandlers.size());
    for (final ResourceHandler handler : myHandlers) {
      try {
        final Promise<Content, Throwable, Void> promise =
            handler
                .handle(apiConnector)
                .fail(
                    new FailCallback<Throwable>() {
                      @Override
                      public void onFail(Throwable result) {
                        LOG.warn(
                            String.format(
                                "Failed to execute handler %s: %s", handler.getName(), result),
                            result);
                        errors.addError(handler.getName(), result.getMessage());
                      }
                    });
        promises.add(promise);
      } catch (Throwable t) {
        LOG.warn(
            String.format("Failed to add handler %s: %s", handler.getName(), t.getMessage()), t);
        errors.addError(handler.getName(), t.getMessage());
      }
    }

    if (promises.size() == 0) {
      if (errors.hasErrors()) {
        writeErrors(xmlResponse, errors);
      }

      return;
    }

    try {
      myManager
          .when(promises.toArray(new Promise[] {}))
          .always(
              new AlwaysCallback<MultipleResults, OneReject>() {
                @Override
                public void onAlways(
                    Promise.State state, MultipleResults resolved, OneReject rejected) {
                  if (errors.hasErrors()) {
                    writeErrors(xmlResponse, errors);
                  } else {
                    for (OneResult oneResult : resolved) {
                      xmlResponse.addContent((Content) oneResult.getResult());
                    }
                  }
                }
              })
          .waitSafely();
    } catch (InterruptedException e) {
      LOG.warn("Request executing has been interrupted: " + e.getMessage());
      errors.addError("handler", e.getMessage());
      writeErrors(xmlResponse, errors);
    }
  }