Class<?> providerClass = provider.getProvider().getClass(); final Set<Type> contractTypes = provider.getContractTypes(); if (contractTypes != null && !contractTypes.contains(providerClass)) { providerClass = ReflectionHelper.theMostSpecificTypeOf(contractTypes); if (preMatching && preMatchingFilters != null) { it.remove(); preMatchingFilters.add(new RankedProvider<>((ContainerRequestFilter) provider.getProvider(), model.getPriority(ContainerRequestFilter.class)));
/** * Creates a new {@code RankedProvider} instance for given {@code provider} with specific {@code rank} (> 0). * * @param provider service provider to create a {@code RankedProvider} instance from. * @param rank rank of this provider. * @param contracts contracts implemented by the service provider */ public RankedProvider(final T provider, final int rank, final Set<Type> contracts) { this.provider = provider; this.rank = computeRank(provider, rank); this.contractTypes = contracts; }
protected int getPriority(final RankedProvider<T> rankedProvider) { return rankedProvider.getRank(); } }
/** * Look for a service of given type. If more then one service is found the method sorts them are returns the one with highest * priority. * * @param clazz type of service to look for. * @param <T> type of service to look for. * @return instance of service with highest priority or {@code null} if service of given type cannot be found. * @see javax.annotation.Priority */ private static <T> Optional<T> lookupService(final Class<T> clazz) { List<RankedProvider<T>> providers = new LinkedList<>(); for (T provider : ServiceFinder.find(clazz)) { providers.add(new RankedProvider<>(provider)); } providers.sort(new RankedComparator<>(RankedComparator.Order.DESCENDING)); return providers.isEmpty() ? Optional.empty() : Optional.ofNullable(providers.get(0).getProvider()); }
/** * Get the iterable of all {@link RankedProvider providers} (custom and default) registered for the given service provider * contract in the underlying {@link InjectionManager injection manager} container. * * @param <T> service provider contract Java type. * @param injectionManager underlying injection manager. * @param contract service provider contract. * @return iterable of all available ranked service providers for the contract. Return value is never {@code null}. */ public static <T> Iterable<RankedProvider<T>> getAllRankedProviders(InjectionManager injectionManager, Class<T> contract) { List<ServiceHolder<T>> providers = getServiceHolders(injectionManager, contract, CustomAnnotationLiteral.INSTANCE); providers.addAll(getServiceHolders(injectionManager, contract)); LinkedHashMap<ServiceHolder<T>, RankedProvider<T>> providerMap = new LinkedHashMap<>(); for (ServiceHolder<T> provider : providers) { if (!providerMap.containsKey(provider)) { Set<Type> contractTypes = provider.getContractTypes(); Class<?> implementationClass = provider.getImplementationClass(); boolean proxyGenerated = true; for (Type ct : contractTypes) { if (((Class<?>) ct).isAssignableFrom(implementationClass)) { proxyGenerated = false; break; } } Set<Type> contracts = proxyGenerated ? contractTypes : null; providerMap.put(provider, new RankedProvider<>(provider.getInstance(), provider.getRank(), contracts)); } } return providerMap.values(); }
@Override public T apply(final RankedProvider<T> input) { return input.getProvider(); } });
/** * Look for a service of given type. If more then one service is found the method sorts them are returns the one with highest * priority. * * @param clazz type of service to look for. * @param <T> type of service to look for * @return instance of service with highest priority or {@code null} if service of given type cannot be found. * @see javax.annotation.Priority */ static <T> T lookupService(final Class<T> clazz) { final List<RankedProvider<T>> providers = new LinkedList<>(); for (final T provider : ServiceFinder.find(clazz)) { providers.add(new RankedProvider<>(provider)); } Collections.sort(providers, new RankedComparator<T>(RankedComparator.Order.ASCENDING)); return providers.isEmpty() ? null : providers.get(0).getProvider(); }
/** * Get the iterable of all {@link RankedProvider providers} (custom and default) registered for the given service provider * contract in the underlying {@link InjectionManager injection manager} container. * * @param <T> service provider contract Java type. * @param injectionManager underlying injection manager. * @param contract service provider contract. * @return iterable of all available ranked service providers for the contract. Return value is never {@code null}. */ public static <T> Iterable<RankedProvider<T>> getAllRankedProviders(InjectionManager injectionManager, Class<T> contract) { List<ServiceHolder<T>> providers = getServiceHolders(injectionManager, contract, CustomAnnotationLiteral.INSTANCE); providers.addAll(getServiceHolders(injectionManager, contract)); LinkedHashMap<ServiceHolder<T>, RankedProvider<T>> providerMap = new LinkedHashMap<>(); for (ServiceHolder<T> provider : providers) { if (!providerMap.containsKey(provider)) { Set<Type> contractTypes = provider.getContractTypes(); Class<?> implementationClass = provider.getImplementationClass(); boolean proxyGenerated = true; for (Type ct : contractTypes) { if (((Class<?>) ct).isAssignableFrom(implementationClass)) { proxyGenerated = false; break; } } Set<Type> contracts = proxyGenerated ? contractTypes : null; providerMap.put(provider, new RankedProvider<>(provider.getInstance(), provider.getRank(), contracts)); } } return providerMap.values(); }
@Override public T apply(final RankedProvider<T> input) { return input.getProvider(); } });
Class<?> providerClass = provider.getProvider().getClass(); final Set<Type> contractTypes = provider.getContractTypes(); if (contractTypes != null && !contractTypes.contains(providerClass)) { providerClass = ReflectionHelper.theMostSpecificTypeOf(contractTypes); if (preMatching && preMatchingFilters != null) { it.remove(); preMatchingFilters.add(new RankedProvider<>((ContainerRequestFilter) provider.getProvider(), model.getPriority(ContainerRequestFilter.class)));
/** * Look for a service of given type. If more then one service is found the method sorts them are returns the one with highest * priority. * * @param clazz type of service to look for. * @param <T> type of service to look for. * @return instance of service with highest priority or {@code null} if service of given type cannot be found. * @see javax.annotation.Priority */ private static <T> Optional<T> lookupService(final Class<T> clazz) { List<RankedProvider<T>> providers = new LinkedList<>(); for (T provider : ServiceFinder.find(clazz)) { providers.add(new RankedProvider<>(provider)); } providers.sort(new RankedComparator<>(RankedComparator.Order.DESCENDING)); return providers.isEmpty() ? Optional.empty() : Optional.ofNullable(providers.get(0).getProvider()); }
new RankedProvider<>( (WriterInterceptor) provider, model.getPriority(WriterInterceptor.class))); new RankedProvider<>( (ReaderInterceptor) provider, model.getPriority(ReaderInterceptor.class))); new RankedProvider<>( (ContainerRequestFilter) provider, model.getPriority(ContainerRequestFilter.class))); new RankedProvider<>( (ContainerResponseFilter) provider, model.getPriority(ContainerResponseFilter.class)));
@Override public T apply(final RankedProvider<T> input) { return input.getProvider(); } });
/** * Creates a new {@code RankedProvider} instance for given {@code provider} with specific {@code rank} (> 0). * * @param provider service provider to create a {@code RankedProvider} instance from. * @param rank rank of this provider. * @param contracts contracts implemented by the service provider */ public RankedProvider(final T provider, final int rank, final Set<Type> contracts) { this.provider = provider; this.rank = computeRank(provider, rank); this.contractTypes = contracts; }
protected int getPriority(final RankedProvider<T> rankedProvider) { return rankedProvider.getRank(); } }
Class<?> providerClass = provider.getProvider().getClass(); final Set<Type> contractTypes = provider.getContractTypes(); if (contractTypes != null && !contractTypes.contains(providerClass)) { providerClass = ReflectionHelper.theMostSpecificTypeOf(contractTypes); if (preMatching && preMatchingFilters != null) { it.remove(); preMatchingFilters.add(new RankedProvider<>((ContainerRequestFilter) provider.getProvider(), model.getPriority(ContainerRequestFilter.class)));
private Hk2CustomBoundTypesProvider lookupHk2CustomBoundTypesProvider() throws ServiceConfigurationError { final List<RankedProvider<Hk2CustomBoundTypesProvider>> providers = new LinkedList<RankedProvider<Hk2CustomBoundTypesProvider>>(); for (final Hk2CustomBoundTypesProvider provider : ServiceFinder.find(Hk2CustomBoundTypesProvider.class)) { providers.add(new RankedProvider<Hk2CustomBoundTypesProvider>(provider)); } Collections.sort(providers, new RankedComparator<Hk2CustomBoundTypesProvider>(RankedComparator.Order.DESCENDING)); return providers.isEmpty() ? null : providers.get(0).getProvider(); }
new RankedProvider<>( (WriterInterceptor) provider, model.getPriority(WriterInterceptor.class))); new RankedProvider<>( (ReaderInterceptor) provider, model.getPriority(ReaderInterceptor.class))); new RankedProvider<>( (ContainerRequestFilter) provider, model.getPriority(ContainerRequestFilter.class))); new RankedProvider<>( (ContainerResponseFilter) provider, model.getPriority(ContainerResponseFilter.class)));
@Override public T apply(final RankedProvider<T> input) { return input.getProvider(); } });
/** * Creates a new {@code RankedProvider} instance. The rank of the provider is obtained from the {@link javax.annotation.Priority} * annotation or is set to {@value javax.ws.rs.Priorities#USER} if the annotation is not present. * * @param provider service provider to create a {@code RankedProvider} instance from. */ public RankedProvider(final T provider) { this.provider = provider; this.rank = computeRank(provider, ContractProvider.NO_PRIORITY); this.contractTypes = null; }