Exemplo n.º 1
0
  /**
   * 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;
  }
Exemplo n.º 2
0
  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();
  }