@SuppressWarnings("unchecked") private <T extends Throwable> ExceptionMapper<T> doCreateExceptionMapper( Class<?> exceptionType, Message m) { List<ExceptionMapper<?>> candidates = new LinkedList<ExceptionMapper<?>>(); for (ProviderInfo<ExceptionMapper<?>> em : exceptionMappers) { handleMapper(candidates, em, exceptionType, m, ExceptionMapper.class, true); } if (candidates.size() == 0) { return null; } Collections.sort(candidates, new ClassComparator(exceptionType)); return (ExceptionMapper<T>) candidates.get(0); }
@SuppressWarnings("unchecked") public <T extends Throwable> ResponseExceptionMapper<T> createResponseExceptionMapper( Message m, Class<?> paramType) { List<ResponseExceptionMapper<?>> candidates = new LinkedList<ResponseExceptionMapper<?>>(); for (ProviderInfo<ResponseExceptionMapper<?>> em : responseExceptionMappers) { handleMapper(candidates, em, paramType, m, ResponseExceptionMapper.class, true); } if (candidates.size() == 0) { return null; } Collections.sort(candidates, new ClassComparator(paramType)); return (ResponseExceptionMapper<T>) candidates.get(0); }
return (MessageBodyWriter<T>) ep.getProvider(); handleMapper(candidates, ep, type, m, MessageBodyWriter.class, false);
return (MessageBodyReader<T>) ep.getProvider(); handleMapper(candidates, ep, type, m, MessageBodyReader.class, false);
protected <T> boolean handleMapper(ProviderInfo<T> em, Class<?> expectedType, Message m, Class<?> providerClass, Class<?> commonBaseClass, boolean injectContext) { Class<?> mapperClass = ClassHelper.getRealClass(bus, em.getProvider()); Type[] types; if (m != null && MessageUtils.getContextualBoolean(m, IGNORE_TYPE_VARIABLES)) { types = new Type[]{mapperClass}; } else { types = getGenericInterfaces(mapperClass, expectedType, commonBaseClass); } for (Type t : types) { if (t instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType)t; Type[] args = pt.getActualTypeArguments(); for (Type arg : args) { if (arg instanceof TypeVariable) { TypeVariable<?> var = (TypeVariable<?>) arg; Type[] bounds = var.getBounds(); boolean isResolved = false; for (Type bound : bounds) { Class<?> cls = InjectionUtils.getRawType(bound); if (cls != null && (cls == Object.class || cls.isAssignableFrom(expectedType))) { isResolved = true; break; } }
for (ProviderInfo<MessageBodyReader<?>> ep : messageReaders) { if (matchesReaderMediaTypes(ep, mediaType) && handleMapper(ep, type, m, MessageBodyReader.class, false)) {
for (ProviderInfo<MessageBodyWriter<?>> ep : messageWriters) { if (matchesWriterMediaTypes(ep, mediaType) && handleMapper(ep, type, m, MessageBodyWriter.class, false)) {