/**
   * This method is use for create,publish and subscribe given web application
   *
   * @param webAppDetail Bean object of the web application
   * @throws AppManagementException Throws this when failed to add an user Throws this when store
   *     session is failed while requesting Throws this when policy id is failed while requesting
   *     Throws this when failed to create,publish or subscribe web application
   */
  public void createAndPublishWebApplication(WebAppDetail webAppDetail)
      throws AppManagementException {
    String currentUserName = webAppDetail.getUserName();
    String creatorSession = webAppDetail.getCreatorSession();
    String storeSession = webAppDetail.getStoreSession();
    String java_policyId = AppMDAO.getDisplayOrderSeqNo();
    webAppDetail.setContext(generateWebAppContext(webAppDetail.getContext()));
    if (currentUserName.equals("admin")) {
      adminPublisherSession = webAppDetail.getCreatorSession();
    } else {
      try {
        adminPublisherSession =
            httpHandler.doPostHttps(
                httpsBackEndUrl + "/publisher/api/authenticate",
                "username="******"&password="******"&action=login",
                "",
                "application/x-www-form-urlencoded");
      } catch (IOException e) {
        String errorMessage = "Error while requesting publisher session";
        log.error(errorMessage, e);
        throw new AppManagementException(errorMessage, e);
      }
    }

    String policyIDResponce = null;
    try {
      policyIDResponce =
          httpHandler.doPostHttps(
                  httpsBackEndUrl
                      + "/publisher/api/entitlement/policy/partial"
                      + "/policyGroup/save",
                  "anonymousAccessToUrlPattern=false&policyGroupName"
                      + "=samples&throttlingTier=Unlimited&objPartialMappings=[]&policyGroupDesc=samples"
                      + "&userRoles=",
                  creatorSession,
                  "application/x-www-form-urlencoded; charset=UTF-8")
              .split(":")[3];
    } catch (IOException e) {
      log.error("Error while requesting a policy id", e);
      throw new AppManagementException("Error while requesting a policy id", e);
    }
    String policyId = policyIDResponce.substring(1, (policyIDResponce.length() - 2)).trim();
    AppCreateRequest appCreateRequest = new AppCreateRequest();
    appCreateRequest.setUritemplate_policyGroupIds("[" + policyId + "]");
    appCreateRequest.setUritemplate_policyGroupId4(policyId);
    appCreateRequest.setUritemplate_policyGroupId3(policyId);
    appCreateRequest.setUritemplate_policyGroupId2(policyId);
    appCreateRequest.setUritemplate_policyGroupId1(policyId);
    appCreateRequest.setUritemplate_policyGroupId0(policyId);
    appCreateRequest.setOverview_provider(currentUserName);
    appCreateRequest.setUritemplate_javaPolicyIds("[" + java_policyId + "]");
    appCreateRequest.setClaimPropertyCounter(webAppDetail.getClaims().size() + "");
    appCreateRequest.setOverview_name(webAppDetail.getWebAppName());
    appCreateRequest.setOverview_displayName(webAppDetail.getDisplayName());
    appCreateRequest.setOverview_context(webAppDetail.getContext());
    appCreateRequest.setOverview_version(webAppDetail.getVersion());
    appCreateRequest.setOverview_trackingCode(appCreateRequest.generateTrackingID());
    appCreateRequest.setOverview_transports("http");
    appCreateRequest.setOverview_webAppUrl(
        httpBackEndUrl + "/" + webAppDetail.getWarFileName() + "/");
    appCreateRequest.setOverview_treatAsASite(webAppDetail.getTreatAsASite());
    String UUID = null;
    String errorMessage = "Error while creating a web application" + webAppDetail.getDisplayName();
    try {
      UUID = createWebApplication(appCreateRequest.generateRequestParameters(), webAppDetail);
    } catch (IOException e) {
      log.error(errorMessage, e);
      throw new AppManagementException(errorMessage, e);
    } catch (RegistryException e) {
      log.error(errorMessage, e);
      throw new AppManagementException(errorMessage, e);
    } catch (InterruptedException e) {
      log.error(errorMessage, e);
      throw new AppManagementException(errorMessage, e);
    }
    try {
      applicationPublisher.publishApplication("webapp", UUID, adminPublisherSession);
    } catch (IOException e) {
      String publishingErrorMessage =
          "Error while publishing a web application " + webAppDetail.getDisplayName();
      log.error(publishingErrorMessage, e);
      throw new AppManagementException(publishingErrorMessage, e);
    }
    log.info(appCreateRequest.getOverview_name() + " published and UUID is " + UUID);
    try {
      applicationSubscriber.subscribeApplication(appCreateRequest, storeSession, currentUserName);
    } catch (IOException e) {
      String subscribingErrorMessage =
          "Error while subscribing a web application " + webAppDetail.getDisplayName();
      log.error(subscribingErrorMessage, e);
      throw new AppManagementException(subscribingErrorMessage, e);
    }
    log.info(
        appCreateRequest.getOverview_name()
            + "application subscribed by subsciber_"
            + currentUserName);
  }