in src/main/java/org/apache/sling/engine/impl/filter/ServletFilterManager.java [222:286]
private void addFilterToChains(final Filter filter, final ServiceReference<Filter> reference) {
final Long serviceId = (Long) reference.getProperty(Constants.SERVICE_ID);
final MBeanReg mbeanReg = mbeanMap.get(serviceId);
final FilterProcessorMBeanImpl mbean = mbeanReg == null ? null : mbeanReg.mbean;
// get the order, Integer.MAX_VALUE by default
final String orderSource;
Object orderObj = reference.getProperty(Constants.SERVICE_RANKING);
if (orderObj == null) {
// filter order is defined as lower value has higher
// priority while service ranking is the opposite In
// addition we allow different types than Integer
orderObj = reference.getProperty(EngineConstants.FILTER_ORDER);
if (orderObj != null) {
log.warn("Filter service {} is using deprecated property {}. Use {} instead.",
reference, EngineConstants.FILTER_ORDER, Constants.SERVICE_RANKING );
// we can use 0 as the default as this will be applied
// in the next step anyway if this props contains an
// invalid value
orderSource = EngineConstants.FILTER_ORDER.concat("=").concat(orderObj.toString());
orderObj = Integer.valueOf(-1 * Converters.standardConverter().convert(orderObj).defaultValue(0).to(Integer.class));
} else {
orderSource = "none";
}
} else {
orderSource = Constants.SERVICE_RANKING.concat("=").concat(orderObj.toString());
}
final int order = (orderObj instanceof Integer) ? ((Integer) orderObj).intValue() : 0;
// register by scope
Object scopeValue = reference.getProperty(EngineConstants.SLING_FILTER_SCOPE);
if ( scopeValue == null ) {
scopeValue = reference.getProperty(EngineConstants.FILTER_SCOPE);
log.warn("Filter service {} is using deprecated property {}. Use {} instead.",
reference, EngineConstants.FILTER_SCOPE, EngineConstants.SLING_FILTER_SCOPE );
}
final String[] scopes = Converters.standardConverter().convert(scopeValue).to(String[].class);
final FilterPredicate predicate = new FilterPredicate(reference);
boolean used = false;
for (String scope : scopes) {
scope = scope.toUpperCase();
try {
FilterChainType type = FilterChainType.valueOf(scope.toString());
getFilterChain(type).addFilter(filter, predicate, serviceId, order, orderSource, mbean);
if (type == FilterChainType.COMPONENT) {
getFilterChain(FilterChainType.INCLUDE).addFilter(filter, predicate, serviceId, order,
orderSource, mbean);
getFilterChain(FilterChainType.FORWARD).addFilter(filter, predicate, serviceId, order,
orderSource, mbean);
}
used = true;
} catch (final IllegalArgumentException iae) {
log.warn("Filter service {} has invalid value {} for scope. Value is ignored", reference, scope);
}
}
if ( !used ){
log.warn("Filter service {} has been registered without a valid {} property. Using default value.", serviceId,
EngineConstants.SLING_FILTER_SCOPE);
getFilterChain(FilterChainType.REQUEST).addFilter(filter, predicate, serviceId, order, orderSource, mbean);
}
}