Ejemplo n.º 1
0
  @Override
  protected Condition createCondition() {
    URI designatorType = null;
    URI designatorId = null;
    try {
      designatorType = new URI("http://www.w3.org/2001/XMLSchema#integer");
      designatorId = new URI(getId());
    } catch (URISyntaxException ex) {
      log.fatal(null, ex);
    }
    FunctionFactory factory = FunctionFactory.getConditionInstance();
    Function conditionFunction = null;
    try {
      conditionFunction = factory.createFunction(globalFunction.getFunctionName());
    } catch (UnknownIdentifierException ex) {
      log.fatal(null, ex);
    } catch (FunctionTypeException ex) {
      log.fatal(null, ex);
    }

    if (this.values.isEmpty()) {
      List tmp = new ArrayList();
      tmp.add(BooleanAttribute.getInstance(false));
      return new Condition(conditionFunction, tmp);
    }

    Function conditionFunction2 = null;
    try {
      conditionFunction2 = factory.createFunction("urn:oasis:names:tc:xacml:1.0:function:" + "and");
    } catch (UnknownIdentifierException ex) {
      log.fatal(null, ex);
    } catch (FunctionTypeException ex) {
      log.fatal(null, ex);
    }

    factory = FunctionFactory.getGeneralInstance();
    Function greaterFunction;
    try {
      greaterFunction =
          factory.createFunction(ComparisonFunction.NAME_INTEGER_GREATER_THAN_OR_EQUAL);
    } catch (Exception e) {
      log.fatal("Exception in condition creation", e);
      return null;
    }

    Function lessFunction;
    try {
      lessFunction = factory.createFunction(ComparisonFunction.NAME_INTEGER_LESS_THAN_OR_EQUAL);
    } catch (Exception e) {
      log.fatal("Exception in condition creation", e);
      return null;
    }

    URI quantityDesignatorId = null;
    try {
      quantityDesignatorId = new URI("urn:oasis:names:tc:xacml:1.0:resource:quantity-id");
    } catch (URISyntaxException ex) {
      log.error(null, ex);
    }

    Function quantityFunction;
    try {
      quantityFunction =
          factory.createFunction("urn:oasis:names:tc:xacml:1.0:function:" + "integer-one-and-only");
    } catch (Exception e) {
      log.fatal("Exception in SCQuantity condition", e);
      return null;
    }

    List applyCondArgs = new ArrayList();
    List conditionArgs = new ArrayList();
    for (Object quantitiesOb : values) {
      applyCondArgs.clear();
      List quantities = (List) quantitiesOb;
      List applyArgs = new ArrayList();
      List applyArgsUser = new ArrayList();

      List greatApplyArgs = new ArrayList();
      List greatApplyArgsUser = new ArrayList();

      AttributeDesignator lowDesignator =
          new AttributeDesignator(
              AttributeDesignator.RESOURCE_TARGET,
              designatorType,
              quantityDesignatorId,
              false,
              null);
      applyArgsUser.add(lowDesignator);
      Apply lowApplyUser = new Apply(quantityFunction, applyArgsUser);
      IntegerAttribute lowQuantityAttribute = new IntegerAttribute((Long) quantities.get(0));
      applyArgs.add(lowApplyUser);
      applyArgs.add(lowQuantityAttribute);
      Apply lowApply = new Apply(greaterFunction, applyArgs);
      applyCondArgs.add(lowApply);

      AttributeDesignator greatDesignator =
          new AttributeDesignator(
              AttributeDesignator.RESOURCE_TARGET,
              designatorType,
              quantityDesignatorId,
              false,
              null);
      greatApplyArgsUser.add(greatDesignator);
      Apply greatApplyUser = new Apply(quantityFunction, greatApplyArgsUser);
      IntegerAttribute greatQuantityAttribute = new IntegerAttribute((Long) quantities.get(1));
      greatApplyArgs.add(greatApplyUser);
      greatApplyArgs.add(greatQuantityAttribute);
      Apply applyCondition = new Apply(lessFunction, greatApplyArgs);
      applyCondArgs.add(applyCondition);
      Apply applyCond = new Apply(conditionFunction2, applyCondArgs);
      conditionArgs.add(applyCond);
    }
    Condition condition = new Condition(conditionFunction, conditionArgs);
    return condition;
  }