/** * Takes collection of all filters/interceptors (either request/reader or response/writer) and * separates out all name-bound filters/interceptors, returns them as a separate MultivaluedMap, * mapping the name-bound annotation to the list of name-bound filters/interceptors. * * <p>Note, the name-bound filters/interceptors are removed from the original filters/interceptors * collection. If non-null collection is passed in the postMatching parameter (applicable for * filters only), this method also removes all the global postMatching filters from the original * collection and adds them to the collection passed in the postMatching parameter. * * @param all Collection of all filters to be processed. * @param applicationNameBindings collection of name binding annotations attached to the JAX-RS * application. * @return {@link MultivaluedMap} of all name-bound filters. */ private static <T> MultivaluedMap<Class<? extends Annotation>, RankedProvider<T>> filterNameBound( final Iterable<RankedProvider<T>> all, final Collection<RankedProvider<ContainerRequestFilter>> preMatching, final ComponentBag componentBag, final Collection<Class<? extends Annotation>> applicationNameBindings) { final MultivaluedMap<Class<? extends Annotation>, RankedProvider<T>> result = new MultivaluedHashMap<Class<? extends Annotation>, RankedProvider<T>>(); for (Iterator<RankedProvider<T>> it = all.iterator(); it.hasNext(); ) { RankedProvider<T> provider = it.next(); final Class<?> providerClass = provider.getProvider().getClass(); ContractProvider model = componentBag.getModel(providerClass); if (model == null) { // the provider was (most likely) bound in HK2 externally model = ComponentBag.modelFor(providerClass); } if (preMatching != null && providerClass.getAnnotation(PreMatching.class) != null) { it.remove(); preMatching.add( new RankedProvider<ContainerRequestFilter>( (ContainerRequestFilter) provider.getProvider(), model.getPriority(ContainerRequestFilter.class))); } boolean nameBound = model.isNameBound(); if (nameBound && !applicationNameBindings.isEmpty()) { for (Class<? extends Annotation> binding : model.getNameBindings()) { if (applicationNameBindings.contains(binding)) { // override the name-bound flag nameBound = false; break; } } } if (nameBound) { // not application-bound it.remove(); for (Class<? extends Annotation> binding : model.getNameBindings()) { result.add(binding, provider); } } } return result; }
private void bindProvidersAndResources( final Set<ComponentProvider> componentProviders, final ComponentBag componentBag, final Set<Class<?>> resourceClasses, final Set<Object> resourceInstances) { final JerseyResourceContext resourceContext = locator.getService(JerseyResourceContext.class); final DynamicConfiguration dc = Injections.getConfiguration(locator); final Set<Class<?>> registeredClasses = runtimeConfig.getRegisteredClasses(); // Merge programmatic resource classes with component classes. Set<Class<?>> classes = Sets.newIdentityHashSet(); classes.addAll( Sets.filter( componentBag.getClasses(ComponentBag.EXCLUDE_META_PROVIDERS), new Predicate<Class<?>>() { @Override public boolean apply(Class<?> componentClass) { return Providers.checkProviderRuntime( componentClass, componentBag.getModel(componentClass), RuntimeType.SERVER, !registeredClasses.contains(componentClass), resourceClasses.contains(componentClass)); } })); classes.addAll(resourceClasses); // Bind classes. for (Class<?> componentClass : classes) { ContractProvider model = componentBag.getModel(componentClass); if (resourceClasses.contains(componentClass)) { if (bindWithComponentProvider(componentClass, model, componentProviders)) { continue; } if (!Resource.isAcceptable(componentClass)) { LOGGER.warning(LocalizationMessages.NON_INSTANTIABLE_COMPONENT(componentClass)); continue; } if (model != null && !Providers.checkProviderRuntime( componentClass, model, RuntimeType.SERVER, !registeredClasses.contains(componentClass), true)) { model = null; } resourceContext.unsafeBindResource(componentClass, model, dc); } else { ProviderBinder.bindProvider(componentClass, model, dc); } } // Merge programmatic resource instances with other component instances. Set<Object> instances = Sets.newHashSet(); instances.addAll( Sets.filter( componentBag.getInstances(ComponentBag.EXCLUDE_META_PROVIDERS), new Predicate<Object>() { @Override public boolean apply(Object component) { final Class<?> componentClass = component.getClass(); return Providers.checkProviderRuntime( componentClass, componentBag.getModel(componentClass), RuntimeType.SERVER, !registeredClasses.contains(componentClass), resourceInstances.contains(component)); } })); instances.addAll(resourceInstances); // Bind instances. for (Object component : instances) { ContractProvider model = componentBag.getModel(component.getClass()); if (resourceInstances.contains(component)) { if (model != null && !Providers.checkProviderRuntime( component.getClass(), model, RuntimeType.SERVER, !registeredClasses.contains(component.getClass()), true)) { model = null; } resourceContext.unsafeBindResource(component, model, dc); } else { ProviderBinder.bindProvider(component, model, dc); } } dc.commit(); }