/**
   * This method persists a new XACML policy, which was read from filesystem, in the registry
   *
   * @param policyDTO PolicyDTO object
   * @param registry Registry
   * @param promote where policy must be promote PDP or not
   * @return returns whether True/False
   * @throws org.wso2.carbon.identity.entitlement.EntitlementException throws if policy with same id
   *     is exist
   */
  public static boolean addFilesystemPolicy(PolicyDTO policyDTO, Registry registry, boolean promote)
      throws EntitlementException {

    PAPPolicyStoreManager policyAdmin;
    AbstractPolicy policyObj;

    if (policyDTO.getPolicy() != null) {
      policyDTO.setPolicy(policyDTO.getPolicy().replaceAll(">\\s+<", "><"));
    }

    policyObj = getPolicy(policyDTO.getPolicy());

    if (policyObj != null) {
      PAPPolicyStore policyStore = new PAPPolicyStore(registry);
      policyAdmin = new PAPPolicyStoreManager();
      policyDTO.setPolicyId(policyObj.getId().toASCIIString());
      policyDTO.setActive(true);

      if (isPolicyExists(policyDTO.getPolicyId(), registry)) {
        throw new EntitlementException("An Entitlement Policy with the given ID already exists");
      }

      policyDTO.setPromote(true);
      policyAdmin.addOrUpdatePolicy(policyDTO);

      PAPPolicyStoreReader reader = new PAPPolicyStoreReader(policyStore);
      policyDTO = reader.readPolicyDTO(policyDTO.getPolicyId());

      PolicyStoreDTO policyStoreDTO = new PolicyStoreDTO();
      policyStoreDTO.setPolicyId(policyDTO.getPolicyId());
      policyStoreDTO.setPolicy(policyDTO.getPolicy());
      policyStoreDTO.setPolicyOrder(policyDTO.getPolicyOrder());
      policyStoreDTO.setAttributeDTOs(policyDTO.getAttributeDTOs());

      if (promote) {
        addPolicyToPDP(policyStoreDTO);
      }

      policyAdmin.addOrUpdatePolicy(policyDTO);

      return true;
    } else {
      throw new EntitlementException("Invalid Entitlement Policy");
    }
  }