@SuppressWarnings("unchecked") private <T> Map<NameKey, ProviderInfo<T>> addToPostMatching( Map<NameKey, ProviderInfo<T>> map, Object provider, int priority, boolean asc) { Map<NameKey, ProviderInfo<T>> newMap = new LinkedHashMap<NameKey, ProviderInfo<T>>(); Iterator<Map.Entry<NameKey, ProviderInfo<T>>> it = map.entrySet().iterator(); if (it.hasNext()) { boolean added = false; while (it.hasNext()) { Map.Entry<NameKey, ProviderInfo<T>> entry = it.next(); int providerPriority = entry.getKey().getPriority(); // this surely can be collapsed further if (!added && asc && (priority < providerPriority || !it.hasNext())) { addNewProvider(newMap, entry, provider, priority, providerPriority >= priority); added = true; } else if (!added && !asc && (priority > providerPriority || !it.hasNext())) { addNewProvider(newMap, entry, provider, priority, priority > providerPriority); added = true; } else { newMap.put(entry.getKey(), entry.getValue()); } } } else { newMap.put(new NameKey(nameBinding, priority), (ProviderInfo<T>)newProvider(provider)); } return newMap; }
@Override public Configurable register(Object provider) { return register(provider, AnnotationUtils.getBindingPriority(provider.getClass())); }
if (contract == ContainerRequestFilter.class && provider instanceof ContainerRequestFilter) { if (isPrematching(provider.getClass())) { addToInterceptors(preMatchContainerRequestFilters, provider, bindingPriority, true); } else { postMatchContainerRequestFilters = addToPostMatching(postMatchContainerRequestFilters, provider, bindingPriority, true); setIsNeeded = true; addToPostMatching(postMatchContainerResponseFilters, provider, bindingPriority, false); setIsNeeded = true; addToInterceptors(readerInterceptors, provider, bindingPriority, true); addToInterceptors(writerInterceptors, provider, bindingPriority, false);
@SuppressWarnings("unchecked") private <T> void addToInterceptors(List<ProviderInfo<T>> providers, Object provider, int priority, boolean asc) { int size = providers.size(); if (size > 0) { for (int i = 0; i < size; i++) { int providerPriority = AnnotationUtils.getBindingPriority( providers.get(i).getProvider().getClass()); if (asc) { if (priority < providerPriority || i + 1 == size) { int index = priority < providerPriority ? i : i + 1; providers.add(index, (ProviderInfo<T>)newProvider(provider)); break; } } else if (priority > providerPriority || i + 1 == size) { int index = priority > providerPriority ? i : i + 1; providers.add(index, (ProviderInfo<T>)newProvider(provider)); break; } } } else { providers.add((ProviderInfo<T>)newProvider(provider)); } }
@SuppressWarnings("unchecked") private <T> void addNewProvider(Map<NameKey, ProviderInfo<T>> newMap, Map.Entry<NameKey, ProviderInfo<T>> entry, Object provider, int priority, boolean first) { if (first) { newMap.put(new NameKey(nameBinding, priority), (ProviderInfo<T>)newProvider(provider)); newMap.put(entry.getKey(), entry.getValue()); } else { newMap.put(entry.getKey(), entry.getValue()); newMap.put(new NameKey(nameBinding, priority), (ProviderInfo<T>)newProvider(provider)); } }
private void doApplyDynamicFeatures(ClassResourceInfo cri) { Set<OperationResourceInfo> oris = cri.getMethodDispatcher().getOperationResourceInfos(); for (OperationResourceInfo ori : oris) { for (DynamicFeature feature : dynamicFeatures) { Configurable methodConfigurable = new MethodConfigurable(ori); feature.configure(new ResourceInfoImpl(ori), methodConfigurable); } } Collection<ClassResourceInfo> subs = cri.getSubResources(); for (ClassResourceInfo sub : subs) { if (sub != cri) { doApplyDynamicFeatures(sub); } } }
@Override public Configurable register(Class<?> providerClass) { return register(providerClass, AnnotationUtils.getBindingPriority(providerClass)); }
@Override public <T> Configurable register(Object provider, Class<? super T>... contracts) { return register(provider, BindingPriority.USER, contracts); }
@Override public <T> Configurable register(Class<T> providerClass, Class<? super T>... contracts) { return register(providerClass, BindingPriority.USER, contracts); }
@Override public Configurable register(Object provider, int bindingPriority) { return doRegister(provider, bindingPriority, FILTER_INTERCEPTOR_CLASSES); }
@Override public <T> Configurable register(Object provider, int bindingPriority, Class<? super T>... contracts) { return doRegister(provider, bindingPriority, contracts); }
@Override public <T> Configurable register(Class<T> providerClass, int bindingPriority, Class<? super T>... contracts) { return doRegister(createProvider(providerClass), bindingPriority, contracts); }
@Override public Configurable register(Class<?> providerClass, int bindingPriority) { return doRegister(createProvider(providerClass), bindingPriority, FILTER_INTERCEPTOR_CLASSES); }