@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; }