Пример #1
0
  @SuppressWarnings({"rawtypes", "unchecked"})
  private Configuration build(Object context) {

    Map<Integer, List<Rule>> priorityMap = new LinkedHashMap<Integer, List<Rule>>();
    for (ConfigurationProvider provider : providers) {
      if (provider.handles(context)) {
        Configuration configuration = provider.getConfiguration(context);

        if (configuration != null) {
          List<Rule> rules = configuration.getRules();
          if (rules != null) {
            for (Rule rule : rules) {
              if (rule != null) {
                if (rule instanceof RelocatableRule && ((RelocatableRule) rule).isRelocated())
                  addListValue(priorityMap, ((RelocatableRule) rule).priority(), rule);
                else addListValue(priorityMap, provider.priority(), rule);
              } else {
                log.debug(
                    "Ignoring null Rule from ConfigurationProvider ["
                        + provider.getClass().getName()
                        + "]");
              }
            }
          } else {
            log.debug(
                "Ignoring null List<Rule> from ConfigurationProvider ["
                    + provider.getClass().getName()
                    + "]");
          }
        } else {
          log.debug(
              "Ignoring null Configuration from ConfigurationProvider ["
                  + provider.getClass().getName()
                  + "].");
        }
      }
    }

    ConfigurationBuilder result = ConfigurationBuilder.begin();
    ArrayList<Integer> sortedKeys = new ArrayList<Integer>(priorityMap.keySet());
    Collections.sort(sortedKeys);

    for (Integer integer : sortedKeys) {
      List<Rule> list = priorityMap.get(integer);
      for (final Rule rule : list) {
        result.addRule(rule);

        if (rule instanceof ParameterizedRule) {
          ParameterizedCallback callback =
              new ParameterizedCallback() {
                @Override
                public void call(Parameterized parameterized) {
                  Set<String> names = parameterized.getRequiredParameterNames();
                  ParameterStore store = ((ParameterizedRule) rule).getParameterStore();

                  if (names != null)
                    for (String name : names) {
                      Parameter<?> parameter = store.get(name, new DefaultParameter(name));
                      if (parameter instanceof ConfigurableParameter<?>)
                        ((ConfigurableParameter<?>) parameter).bindsTo(Evaluation.property(name));
                    }

                  parameterized.setParameterStore(store);
                }
              };

          Visitor<Condition> conditionVisitor = new ParameterizedConditionVisitor(callback);
          new ConditionVisit(rule).accept(conditionVisitor);

          Visitor<Operation> operationVisitor = new ParameterizedOperationVisitor(callback);
          new OperationVisit(rule).accept(operationVisitor);
        }
      }
    }

    return result;
  }