use of jakarta.ws.rs.ext.ReaderInterceptor in project tomee by apache.
the class ResponseImpl method doReadEntity.
public <T> T doReadEntity(Class<T> cls, Type t, Annotation[] anns) throws ProcessingException, IllegalStateException {
checkEntityIsClosed();
// according to javadoc, should close when is not buffered.
boolean shouldClose = !entityBufferred && !JAXRSUtils.isStreamingOutType(cls);
if (lastEntity != null && cls.isAssignableFrom(lastEntity.getClass()) && !(lastEntity instanceof InputStream)) {
return cls.cast(lastEntity);
}
MediaType mediaType = getMediaType();
if (mediaType == null) {
mediaType = MediaType.WILDCARD_TYPE;
}
// the stream is available if entity is IS or
// message contains XMLStreamReader or Reader
boolean entityStreamAvailable = entityStreamAvailable();
InputStream entityStream = null;
if (!entityStreamAvailable) {
// try create a stream if the entity is String or Number
entityStream = convertEntityToStreamIfPossible();
entityStreamAvailable = entityStream != null;
} else if (entity instanceof InputStream) {
entityStream = InputStream.class.cast(entity);
} else {
Message inMessage = getResponseMessage();
Reader reader = inMessage.getContent(Reader.class);
if (reader != null) {
entityStream = InputStream.class.cast(new ReaderInputStream(reader));
}
}
// we need to check for readers even if no IS is set - the readers may still do it
List<ReaderInterceptor> readers = outMessage == null ? null : ProviderFactory.getInstance(outMessage).createMessageBodyReaderInterceptor(cls, t, anns, mediaType, outMessage, entityStreamAvailable, null);
if (readers != null) {
try {
if (entityBufferred) {
InputStream.class.cast(entity).reset();
}
Message responseMessage = getResponseMessage();
responseMessage.put(Message.PROTOCOL_HEADERS, getHeaders());
lastEntity = JAXRSUtils.readFromMessageBodyReader(readers, cls, t, anns, entityStream, mediaType, responseMessage);
// close the entity after readEntity is called.
T tCastLastEntity = castLastEntity();
shouldClose = shouldClose && !(tCastLastEntity instanceof AutoCloseable) && !(tCastLastEntity instanceof Source);
if (shouldClose) {
close();
}
return tCastLastEntity;
} catch (NoContentException ex) {
// check if basic type. Basic type throw exception, else return null.
if (isBasicType(cls)) {
autoClose(cls, true);
reportMessageHandlerProblem("MSG_READER_PROBLEM", cls, mediaType, ex);
} else {
if (shouldClose) {
close();
}
return null;
}
} catch (Exception ex) {
autoClose(cls, true);
reportMessageHandlerProblem("MSG_READER_PROBLEM", cls, mediaType, ex);
} finally {
ProviderFactory pf = ProviderFactory.getInstance(outMessage);
if (pf != null) {
pf.clearThreadLocalProxies();
}
}
} else if (entity != null && cls.isAssignableFrom(entity.getClass())) {
lastEntity = entity;
return castLastEntity();
} else if (entityStreamAvailable) {
reportMessageHandlerProblem("NO_MSG_READER", cls, mediaType, null);
}
throw new IllegalStateException("The entity is not backed by an input stream, entity class is : " + (entity != null ? entity.getClass().getName() : cls.getName()));
}
use of jakarta.ws.rs.ext.ReaderInterceptor in project tomee by apache.
the class JAXRSUtils method readFromMessageBodyReader.
@SuppressWarnings("unchecked")
public static Object readFromMessageBodyReader(List<ReaderInterceptor> readers, Class<?> targetTypeClass, Type parameterType, Annotation[] parameterAnnotations, InputStream is, MediaType mediaType, Message m) throws IOException, WebApplicationException {
// Verbose but avoids an extra context instantiation for the typical path
if (readers.size() > 1) {
ReaderInterceptor first = readers.remove(0);
ReaderInterceptorContext context = new ReaderInterceptorContextImpl(targetTypeClass, parameterType, parameterAnnotations, is, m, readers);
return first.aroundReadFrom(context);
}
MessageBodyReader<?> provider = ((ReaderInterceptorMBR) readers.get(0)).getMBR();
@SuppressWarnings("rawtypes") Class cls = targetTypeClass;
return provider.readFrom(cls, parameterType, parameterAnnotations, mediaType, new HttpHeadersImpl(m).getRequestHeaders(), is);
}
use of jakarta.ws.rs.ext.ReaderInterceptor in project resteasy by resteasy.
the class ConfigurationInheritanceTest method testReaderInterceptorInheritance.
@Test
public void testReaderInterceptorInheritance() {
Client client = ClientBuilder.newClient();
try {
fakeHttpServer.start();
WebTarget parentWebTarget = client.target("http://" + fakeHttpServer.getHostAndPort());
WebTarget childWebTarget = parentWebTarget.path("path");
childWebTarget.register((ClientResponseFilter) (containerRequestContext, containerResponseContext) -> {
containerResponseContext.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN);
containerResponseContext.setEntityStream(new ByteArrayInputStream("hello".getBytes()));
});
// Registration on parent MUST not affect the child
AtomicInteger parentReaderInterceptorCounter = new AtomicInteger(0);
ReaderInterceptor parentReaderInterceptor = (readerInterceptorContext) -> {
parentReaderInterceptorCounter.incrementAndGet();
return readerInterceptorContext.proceed();
};
parentWebTarget.register(parentReaderInterceptor);
childWebTarget.request().get().readEntity(String.class);
Assert.assertEquals(0, parentReaderInterceptorCounter.get());
// Child MUST only use the snapshot configuration of the parent
// taken at child creation time.
AtomicInteger childReaderInterceptorCounter = new AtomicInteger(0);
ReaderInterceptor childReaderInterceptor = (readerInterceptorContext) -> {
childReaderInterceptorCounter.incrementAndGet();
return readerInterceptorContext.proceed();
};
childWebTarget.register(childReaderInterceptor);
childWebTarget.request().get().readEntity(String.class);
Assert.assertEquals(1, childReaderInterceptorCounter.get());
Assert.assertEquals(0, parentReaderInterceptorCounter.get());
} finally {
client.close();
}
}
Aggregations