@Override
  public AbstractResult combine(EvaluationCtx context, List parameters, List policyElements) {

    List<ObligationResult> denyObligations = new ArrayList<ObligationResult>();
    List<Advice> denyAdvices = new ArrayList<Advice>();

    for (Object policyElement : policyElements) {
      AbstractPolicy policy = ((PolicyCombinerElement) (policyElement)).getPolicy();
      MatchResult match = policy.match(context);
      if (match.getResult() == MatchResult.MATCH) {
        AbstractResult result = policy.evaluate(context);
        int value = result.getDecision();
        // if there was a value of PERMIT, then regardless of what else
        // we've seen, we always return PERMIT
        if (value == AbstractResult.DECISION_PERMIT) {
          return result;
        } else if (value == AbstractResult.DECISION_DENY) {
          denyObligations.addAll(result.getObligations());
          denyAdvices.addAll(result.getAdvices());
        }
      }
    }

    // if there is not any value of PERMIT. The return DENY
    return ResultFactory.getFactory()
        .getResult(AbstractResult.DECISION_DENY, denyObligations, denyAdvices, context);
  }
  public ProxyPolicy(AbstractPolicy policy) {
    if (policy == null) throw new IllegalArgumentException("policy may not be null");

    this.id = policy.getId().toString();
    this.target = policy.getTarget();

    if (policy instanceof Policy) this.refType = PolicyReference.POLICY_REFERENCE;
    if (policy instanceof PolicySet) this.refType = PolicyReference.POLICYSET_REFERENCE;
  }
  /**
   * 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");
    }
  }