Search in sources :

Example 1 with SuspendableContainerResponseContext

use of org.jboss.resteasy.core.interception.jaxrs.SuspendableContainerResponseContext in project quarkus by quarkusio.

the class TemplateResponseFilter method filter.

@SuppressWarnings("unchecked")
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
    Object entity = responseContext.getEntity();
    if (entity instanceof TemplateInstance) {
        SuspendableContainerResponseContext ctx = (SuspendableContainerResponseContext) responseContext;
        ctx.suspend();
        MediaType mediaType;
        TemplateInstance instance = (TemplateInstance) entity;
        Object variantsAttr = instance.getAttribute(TemplateInstance.VARIANTS);
        if (variantsAttr != null) {
            List<javax.ws.rs.core.Variant> variants = new ArrayList<>();
            for (Variant variant : (List<Variant>) variantsAttr) {
                variants.add(new javax.ws.rs.core.Variant(MediaType.valueOf(variant.getMediaType()), variant.getLocale(), variant.getEncoding()));
            }
            javax.ws.rs.core.Variant selected = requestContext.getRequest().selectVariant(variants);
            if (selected != null) {
                Locale selectedLocale = selected.getLanguage();
                if (selectedLocale == null) {
                    List<Locale> acceptableLocales = requestContext.getAcceptableLanguages();
                    if (!acceptableLocales.isEmpty()) {
                        selectedLocale = acceptableLocales.get(0);
                    }
                }
                instance.setAttribute(TemplateInstance.SELECTED_VARIANT, new Variant(selectedLocale, selected.getMediaType().toString(), selected.getEncoding()));
                mediaType = selected.getMediaType();
            } else {
                mediaType = responseContext.getMediaType();
            }
        } else {
            mediaType = responseContext.getMediaType();
        }
        CompletionStage<String> cs = instance.renderAsync();
        if (!Arc.container().instance(Engine.class).get().useAsyncTimeout()) {
            // Make sure the timeout is always used
            long timeout = instance.getTimeout();
            cs = cs.toCompletableFuture().orTimeout(timeout, TimeUnit.MILLISECONDS);
        }
        try {
            cs.whenComplete((r, t) -> {
                if (t == null) {
                    // an NPE further down
                    if (mediaType != null) {
                        ctx.setEntity(r, null, mediaType);
                    } else {
                        ctx.setEntity(r);
                    }
                    ctx.resume();
                } else {
                    ctx.resume(t);
                }
            });
        } catch (Throwable t) {
            ctx.resume(t);
        }
    }
}
Also used : Locale(java.util.Locale) ArrayList(java.util.ArrayList) SuspendableContainerResponseContext(org.jboss.resteasy.core.interception.jaxrs.SuspendableContainerResponseContext) TemplateInstance(io.quarkus.qute.TemplateInstance) Variant(io.quarkus.qute.Variant) MediaType(javax.ws.rs.core.MediaType) ArrayList(java.util.ArrayList) List(java.util.List) Engine(io.quarkus.qute.Engine)

Example 2 with SuspendableContainerResponseContext

use of org.jboss.resteasy.core.interception.jaxrs.SuspendableContainerResponseContext in project resteasy by resteasy.

the class AsyncResponseFilter method filter.

@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
    // copy request filter callback values
    for (Entry<String, List<String>> entry : requestContext.getHeaders().entrySet()) {
        if (entry.getKey().startsWith("RequestFilterCallback"))
            addValuesToContext(responseContext, entry);
    }
    responseContext.getHeaders().add("ResponseFilterCallback" + name, String.valueOf(callbackException));
    callbackException = null;
    SuspendableContainerResponseContext ctx = (SuspendableContainerResponseContext) responseContext;
    String action = requestContext.getHeaderString(name);
    LOG.error("Filter response for " + name + " with action: " + action);
    if ("sync-pass".equals(action)) {
    // do nothing
    } else if ("sync-fail".equals(action)) {
        ctx.setEntity(name);
    } else if ("async-pass".equals(action)) {
        ctx.suspend();
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() -> ctx.resume());
    } else if ("async-pass-instant".equals(action)) {
        ctx.suspend();
        ctx.resume();
    } else if ("async-fail".equals(action)) {
        ctx.suspend();
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() -> {
            ctx.setEntity(name);
            ctx.resume();
        });
    } else if ("async-fail-late".equals(action)) {
        ctx.suspend();
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                LOG.error("Error:", e);
            }
            ctx.setEntity(name);
            ctx.resume();
        });
    } else if ("async-fail-instant".equals(action)) {
        ctx.suspend();
        ctx.setEntity(name);
        ctx.resume();
    } else if ("sync-throw".equals(action)) {
        throw new AsyncFilterException("ouch");
    } else if ("async-throw-late".equals(action)) {
        ctx.suspend();
        HttpRequest req = ResteasyContext.getContextData(HttpRequest.class);
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                LOG.error("Error:", e);
            }
            ctx.setEntity(name);
            ResteasyAsynchronousResponse resp = req.getAsyncContext().getAsyncResponse();
            resp.register((CompletionCallback) (t) -> {
                if (callbackException != null)
                    throw new RuntimeException("Callback called twice");
                callbackException = Objects.toString(t);
            });
            if ("true".equals(req.getHttpHeaders().getHeaderString("UseExceptionMapper")))
                ctx.resume(new AsyncFilterException("ouch"));
            else
                ctx.resume(new Throwable("ouch"));
        });
    }
    LOG.error("Filter response for " + name + " with action: " + action + " done");
}
Also used : HttpRequest(org.jboss.resteasy.spi.HttpRequest) SuspendableContainerResponseContext(org.jboss.resteasy.core.interception.jaxrs.SuspendableContainerResponseContext) CompletionCallback(jakarta.ws.rs.container.CompletionCallback) Logger(org.jboss.logging.Logger) IOException(java.io.IOException) HttpRequest(org.jboss.resteasy.spi.HttpRequest) Executors(java.util.concurrent.Executors) Objects(java.util.Objects) List(java.util.List) ResteasyContext(org.jboss.resteasy.core.ResteasyContext) ContainerRequestContext(jakarta.ws.rs.container.ContainerRequestContext) Entry(java.util.Map.Entry) ContainerResponseContext(jakarta.ws.rs.container.ContainerResponseContext) ContainerResponseFilter(jakarta.ws.rs.container.ContainerResponseFilter) ExecutorService(java.util.concurrent.ExecutorService) ResteasyAsynchronousResponse(org.jboss.resteasy.spi.ResteasyAsynchronousResponse) ResteasyAsynchronousResponse(org.jboss.resteasy.spi.ResteasyAsynchronousResponse) ExecutorService(java.util.concurrent.ExecutorService) List(java.util.List) SuspendableContainerResponseContext(org.jboss.resteasy.core.interception.jaxrs.SuspendableContainerResponseContext)

Example 3 with SuspendableContainerResponseContext

use of org.jboss.resteasy.core.interception.jaxrs.SuspendableContainerResponseContext in project resteasy by resteasy.

the class AsyncResponseFilter method filter.

@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
    // copy request filter callback values
    for (Entry<String, List<String>> entry : requestContext.getHeaders().entrySet()) {
        if (entry.getKey().startsWith("RequestFilterCallback"))
            addValuesToContext(responseContext, entry);
    }
    responseContext.getHeaders().add("ResponseFilterCallback" + name, String.valueOf(callbackException));
    callbackException = null;
    SuspendableContainerResponseContext ctx = (SuspendableContainerResponseContext) responseContext;
    String action = requestContext.getHeaderString(name);
    LOG.error("Filter response for " + name + " with action: " + action);
    if ("sync-pass".equals(action)) {
    // do nothing
    } else if ("sync-fail".equals(action)) {
        ctx.setEntity(name);
    } else if ("async-pass".equals(action)) {
        ctx.suspend();
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() -> ctx.resume());
    } else if ("async-pass-instant".equals(action)) {
        ctx.suspend();
        ctx.resume();
    } else if ("async-fail".equals(action)) {
        ctx.suspend();
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() -> {
            ctx.setEntity(name);
            ctx.resume();
        });
    } else if ("async-fail-late".equals(action)) {
        ctx.suspend();
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                LOG.error("Error:", e);
            }
            ctx.setEntity(name);
            ctx.resume();
        });
    } else if ("async-fail-instant".equals(action)) {
        ctx.suspend();
        ctx.setEntity(name);
        ctx.resume();
    } else if ("sync-throw".equals(action)) {
        throw new AsyncFilterException("ouch");
    } else if ("async-throw-late".equals(action)) {
        ctx.suspend();
        HttpRequest req = ResteasyContext.getContextData(HttpRequest.class);
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                LOG.error("Error:", e);
            }
            ctx.setEntity(name);
            ResteasyAsynchronousResponse resp = req.getAsyncContext().getAsyncResponse();
            resp.register((CompletionCallback) (t) -> {
                if (callbackException != null)
                    throw new RuntimeException("Callback called twice");
                callbackException = Objects.toString(t);
            });
            if ("true".equals(req.getHttpHeaders().getHeaderString("UseExceptionMapper")))
                ctx.resume(new AsyncFilterException("ouch"));
            else
                ctx.resume(new Throwable("ouch"));
        });
    }
    LOG.error("Filter response for " + name + " with action: " + action + " done");
}
Also used : HttpRequest(org.jboss.resteasy.spi.HttpRequest) SuspendableContainerResponseContext(org.jboss.resteasy.core.interception.jaxrs.SuspendableContainerResponseContext) CompletionCallback(jakarta.ws.rs.container.CompletionCallback) Logger(org.jboss.logging.Logger) HttpRequest(org.jboss.resteasy.spi.HttpRequest) IOException(java.io.IOException) Executors(java.util.concurrent.Executors) Objects(java.util.Objects) ResteasyContext(org.jboss.resteasy.core.ResteasyContext) List(java.util.List) ContainerRequestContext(jakarta.ws.rs.container.ContainerRequestContext) Entry(java.util.Map.Entry) ContainerResponseContext(jakarta.ws.rs.container.ContainerResponseContext) ContainerResponseFilter(jakarta.ws.rs.container.ContainerResponseFilter) ResteasyAsynchronousResponse(org.jboss.resteasy.spi.ResteasyAsynchronousResponse) ExecutorService(java.util.concurrent.ExecutorService) ResteasyAsynchronousResponse(org.jboss.resteasy.spi.ResteasyAsynchronousResponse) ExecutorService(java.util.concurrent.ExecutorService) List(java.util.List) SuspendableContainerResponseContext(org.jboss.resteasy.core.interception.jaxrs.SuspendableContainerResponseContext)

Aggregations

List (java.util.List)3 SuspendableContainerResponseContext (org.jboss.resteasy.core.interception.jaxrs.SuspendableContainerResponseContext)3 CompletionCallback (jakarta.ws.rs.container.CompletionCallback)2 ContainerRequestContext (jakarta.ws.rs.container.ContainerRequestContext)2 ContainerResponseContext (jakarta.ws.rs.container.ContainerResponseContext)2 ContainerResponseFilter (jakarta.ws.rs.container.ContainerResponseFilter)2 IOException (java.io.IOException)2 Entry (java.util.Map.Entry)2 Objects (java.util.Objects)2 ExecutorService (java.util.concurrent.ExecutorService)2 Executors (java.util.concurrent.Executors)2 Logger (org.jboss.logging.Logger)2 ResteasyContext (org.jboss.resteasy.core.ResteasyContext)2 HttpRequest (org.jboss.resteasy.spi.HttpRequest)2 ResteasyAsynchronousResponse (org.jboss.resteasy.spi.ResteasyAsynchronousResponse)2 Engine (io.quarkus.qute.Engine)1 TemplateInstance (io.quarkus.qute.TemplateInstance)1 Variant (io.quarkus.qute.Variant)1 ArrayList (java.util.ArrayList)1 Locale (java.util.Locale)1