/** * Create new entity provider model. * * NOTE: The constructor is package private on purpose as we do not support extensions of this class from another package. * * @param provider entity provider instance. * @param declaredTypes declared supported media types. * @param custom custom flag; {@code true} is the provider is custom, {@code false} if the provider is one of the * default Jersey providers. * @param providerType parameterized entity provider type (used to retrieve the provided Java type). */ AbstractEntityProviderModel(final T provider, final List<MediaType> declaredTypes, final boolean custom, final Class<T> providerType) { this.provider = provider; this.declaredTypes = declaredTypes; this.custom = custom; this.providedType = getProviderClassParam(provider, providerType); }
@Override public int compare(final AbstractEntityProviderModel<T> modelA, final AbstractEntityProviderModel<T> modelB) { final int distance = compareTypeDistances(modelA.providedType(), modelB.providedType()); if (distance != 0) { return distance; } final int mediaTypeComparison = getMediaTypeDistance(wantedMediaType, modelA.declaredTypes()) - getMediaTypeDistance(wantedMediaType, modelB.declaredTypes()); if (mediaTypeComparison != 0) { return mediaTypeComparison; } if (modelA.isCustom() ^ modelB.isCustom()) { return (modelA.isCustom()) ? -1 : 1; } return 0; }
/** * Safely invokes {@link javax.ws.rs.ext.MessageBodyWriter#isWriteable isWriteable} method on the underlying provider. * * Any exceptions will be logged at finer level. * * @param type the class of instance that is to be written. * @param genericType the type of instance to be written, obtained either * by reflection of a resource method return type or via inspection * of the returned instance. {@link javax.ws.rs.core.GenericEntity} * provides a way to specify this information at runtime. * @param annotations an array of the annotations attached to the message entity instance. * @param mediaType the media type of the HTTP entity. * @return {@code true} if the type is supported, otherwise {@code false}. */ public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return MessageBodyFactory.isWriteable(super.provider(), type, genericType, annotations, mediaType); } }
@Override public void writeTo(final Set<String> s, final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType, final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream) throws IOException, WebApplicationException { final PrintStream ps = new PrintStream(entityStream, true, MessageUtils.getCharset(mediaType).name()); for (final String item : s) { ps.println(item); } } }
@Override public <T> MessageBodyWriter<T> getMessageBodyWriter(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return workers.get().getMessageBodyWriter(type, genericType, annotations, mediaType); }
@Override @SuppressWarnings("unchecked") public MediaType getMessageBodyWriterMediaType( final Class<?> c, final Type t, final Annotation[] as, final List<MediaType> acceptableMediaTypes) { for (final MediaType acceptable : acceptableMediaTypes) { for (final WriterModel model : writers) { for (final MediaType mt : model.declaredTypes()) { if (mt.isCompatible(acceptable) && model.isWriteable(c, t, as, acceptable)) { return MediaTypes.mostSpecific(mt, acceptable); } } } } return null; }
@Override public int compare(final AbstractEntityProviderModel<?> o1, final AbstractEntityProviderModel<?> o2) { final Class<?> o1ProviderClassParam = o1.providedType(); final Class<?> o2ProviderClassParam = o2.providedType(); if (o1ProviderClassParam == o2ProviderClassParam) { // Compare producible media types. return compare(o2.declaredTypes(), o1.declaredTypes()); } else if (o1ProviderClassParam.isAssignableFrom(o2ProviderClassParam)) { return 1; } else if (o2ProviderClassParam.isAssignableFrom(o1ProviderClassParam)) { return -1; } return 0; }
@Override public <T> MessageBodyReader<T> getMessageBodyReader(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return workers.get().getMessageBodyReader(type, genericType, annotations, mediaType); }
private void ensureMediaType() { if (getMediaType() == null) { // Content-Type is not present choose a default type final GenericType<?> entityType = new GenericType(getEntityType()); final List<MediaType> mediaTypes = workers.getMessageBodyWriterMediaTypes( entityType.getRawType(), entityType.getType(), getEntityAnnotations()); setMediaType(getMediaType(mediaTypes)); } }
private void fillOutputTypesFromWorkers(final Set<MediaType> effectiveOutputTypes, final Class<?> returnEntityType) { effectiveOutputTypes.addAll(workers.getMessageBodyWriterMediaTypesByType(returnEntityType)); }
@Override public Object readFrom(final Class type, final Type genericType, final Annotation[] annotations, final MediaType mediaType, final MultivaluedMap httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException { return new ClipboardData(readStringFromStream(entityStream, MessageUtils.getCharset(mediaType))); } }
@Override public int compare(final AbstractEntityProviderModel<T> modelA, final AbstractEntityProviderModel<T> modelB) { final int distance = compareTypeDistances(modelA.providedType(), modelB.providedType()); if (distance != 0) { return distance; } final int mediaTypeComparison = getMediaTypeDistance(wantedMediaType, modelA.declaredTypes()) - getMediaTypeDistance(wantedMediaType, modelB.declaredTypes()); if (mediaTypeComparison != 0) { return mediaTypeComparison; } if (modelA.isCustom() ^ modelB.isCustom()) { return (modelA.isCustom()) ? -1 : 1; } return 0; }
@Override public <T> MessageBodyWriter<T> getMessageBodyWriter(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return workers.get().getMessageBodyWriter(type, genericType, annotations, mediaType); }
@Override public int compare(final AbstractEntityProviderModel<?> o1, final AbstractEntityProviderModel<?> o2) { final Class<?> o1ProviderClassParam = o1.providedType(); final Class<?> o2ProviderClassParam = o2.providedType(); if (o1ProviderClassParam == o2ProviderClassParam) { // Compare producible media types. return compare(o2.declaredTypes(), o1.declaredTypes()); } else if (o1ProviderClassParam.isAssignableFrom(o2ProviderClassParam)) { return 1; } else if (o2ProviderClassParam.isAssignableFrom(o1ProviderClassParam)) { return -1; } return 0; }
@Override public <T> MessageBodyReader<T> getMessageBodyReader(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return workers.get().getMessageBodyReader(type, genericType, annotations, mediaType); }
/** * Safely invokes {@link javax.ws.rs.ext.MessageBodyWriter#isWriteable isWriteable} method on the underlying provider. * * Any exceptions will be logged at finer level. * * @param type the class of instance that is to be written. * @param genericType the type of instance to be written, obtained either * by reflection of a resource method return type or via inspection * of the returned instance. {@link javax.ws.rs.core.GenericEntity} * provides a way to specify this information at runtime. * @param annotations an array of the annotations attached to the message entity instance. * @param mediaType the media type of the HTTP entity. * @return {@code true} if the type is supported, otherwise {@code false}. */ public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return MessageBodyFactory.isWriteable(super.provider(), type, genericType, annotations, mediaType); } }
private void ensureMediaType() { if (getMediaType() == null) { // Content-Type is not present choose a default type final GenericType<?> entityType = new GenericType(getEntityType()); final List<MediaType> mediaTypes = workers.getMessageBodyWriterMediaTypes( entityType.getRawType(), entityType.getType(), getEntityAnnotations()); setMediaType(getMediaType(mediaTypes)); } }
/** * Create new entity provider model. * * NOTE: The constructor is package private on purpose as we do not support extensions of this class from another package. * * @param provider entity provider instance. * @param declaredTypes declared supported media types. * @param custom custom flag; {@code true} is the provider is custom, {@code false} if the provider is one of the * default Jersey providers. * @param providerType parameterized entity provider type (used to retrieve the provided Java type). */ AbstractEntityProviderModel(final T provider, final List<MediaType> declaredTypes, final boolean custom, final Class<T> providerType) { this.provider = provider; this.declaredTypes = declaredTypes; this.custom = custom; this.providedType = getProviderClassParam(provider, providerType); }
private void fillOutputTypesFromWorkers(final Set<MediaType> effectiveOutputTypes, final Class<?> returnEntityType) { effectiveOutputTypes.addAll(workers.getMessageBodyWriterMediaTypesByType(returnEntityType)); }
@Override public Object readFrom(final Class type, final Type genericType, final Annotation[] annotations, final MediaType mediaType, final MultivaluedMap httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException { final String jsonExpression = readStringFromStream(entityStream, MessageUtils.getCharset(mediaType)); return new ClipboardData(jsonExpression.replace(JsonOpenning, "").replace(JsonClosing, "")); } }