private List<OFHolder<T>> internalGetProvidersByMediaType(MediaType mediaType, Class<?> cls) { Set<OFHolder<T>> compatible = new TreeSet<OFHolder<T>>(Collections.reverseOrder()); for (Entry<MediaType, HashSet<PriorityObjectFactory<T>>> entry : entrySet) { if (areMediaTypesCompatible(entry.getKey(), mediaType)) { // media type is compatible, check generic type of the // subset for (PriorityObjectFactory<T> of : entry.getValue()) { if (GenericsUtils.isGenericInterfaceAssignableFrom(cls, of .getInstanceClass(), rawType)) { // Both media type and generic types are compatible. // The assumption here that more specific media // types are added first so replacing the entity // with the same object factory of the different // media type, won't change the map. // This is done via the equals() of the OFHolder // which doesn't compare the MediaType compatible .add(new OFHolder<T>(entry.getKey(), of, of.isSystemProvider)); } } } } @SuppressWarnings("unchecked") OFHolder<T>[] tmp = compatible.toArray(new OFHolder[compatible.size()]); return Arrays.asList(tmp); }
MessageBodyWriter<T> ret = null; for (MediaTypeMap<MessageBodyWriter<?>>.OFHolder<MessageBodyWriter<?>> factory : writersFactories) { MessageBodyWriter<?> writer = factory.getInstance(runtimeContext); if (isWriteable(writer, type, genericType, annotations, mediaType, runtimeContext, factory.isSystemProvider)) { if (logger.isTraceEnabled()) {
MessageBodyReader<T> ret = null; for (MediaTypeMap<MessageBodyReader<?>>.OFHolder<MessageBodyReader<?>> factory : factories) { MessageBodyReader<?> reader = factory.getInstance(runtimeContext); if (isReadable(reader, type, genericType, annotations, mediaType, runtimeContext, factory.isSystemProvider)) { ret = (MessageBodyReader<T>)reader;
Annotation[] ann = new Annotation[0]; for (MediaTypeMap<MessageBodyReader<?>>.OFHolder<MessageBodyReader<?>> factory : readerFactories) { MessageBodyReader<?> reader = factory.getInstance(runtimeContext); Consumes consumes = factory.getInstanceClass().getAnnotation(Consumes.class); String[] values = null; if (consumes != null) {
public MediaType getMessageBodyWriterMediaTypeLimitByIsWritable(Class<?> type, RuntimeContext runtimeContext) { logger.trace("Searching MessageBodyWriters media types limited by class type {}", type); //$NON-NLS-1$ List<MediaTypeMap<MessageBodyWriter<?>>.OFHolder<MessageBodyWriter<?>>> writerFactories = messageBodyWriters.getProvidersByMediaType(MediaType.WILDCARD_TYPE, type); logger.trace("Found all MessageBodyWriter ObjectFactories limited by class type {}", //$NON-NLS-1$ writerFactories); Annotation[] ann = new Annotation[0]; for (MediaTypeMap<MessageBodyWriter<?>>.OFHolder<MessageBodyWriter<?>> factory : writerFactories) { MessageBodyWriter<?> writer = factory.getInstance(runtimeContext); Produces produces = factory.getInstanceClass().getAnnotation(Produces.class); String[] values = null; if (produces != null) { values = AnnotationUtils.parseConsumesProducesValues(produces.value()); } else { values = new String[] {MediaType.WILDCARD}; } for (String v : values) { MediaType mt = MediaType.valueOf(v); if (isWriteable(writer, type, type, ann, mt, runtimeContext, factory.isSystemProvider)) { logger.trace("Returning media type {}", mt); //$NON-NLS-1$ return mt; } } } return null; }