package org.infinispan.rest.embedded.netty4; import java.io.IOException; import javax.ws.rs.core.SecurityContext; import org.infinispan.rest.embedded.netty4.security.Authenticator; import org.jboss.resteasy.core.SynchronousDispatcher; import org.jboss.resteasy.core.ThreadLocalResteasyProviderFactory; import org.jboss.resteasy.spi.HttpRequest; import org.jboss.resteasy.spi.HttpResponse; import org.jboss.resteasy.spi.ResteasyProviderFactory; import io.netty.channel.ChannelHandlerContext; /** * Helper/delegate class to unify Servlet and Filter dispatcher implementations * * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @author Norman Maurer * @version $Revision: 1 $ * Temporary fork from RestEasy 3.1.0 */ public class RequestDispatcher { protected final SynchronousDispatcher dispatcher; protected final ResteasyProviderFactory providerFactory; private final Authenticator authenticator; public RequestDispatcher(SynchronousDispatcher dispatcher, ResteasyProviderFactory providerFactory, Authenticator authenticator) { this.dispatcher = dispatcher; this.providerFactory = providerFactory; this.authenticator = authenticator; } public SynchronousDispatcher getDispatcher() { return dispatcher; } public Authenticator getAuthenticator() { return authenticator; } public ResteasyProviderFactory getProviderFactory() { return providerFactory; } public void service(ChannelHandlerContext ctx, HttpRequest request, HttpResponse response, boolean handleNotFound) throws IOException { try { ResteasyProviderFactory defaultInstance = ResteasyProviderFactory.getInstance(); if (defaultInstance instanceof ThreadLocalResteasyProviderFactory) { ThreadLocalResteasyProviderFactory.push(providerFactory); } SecurityContext securityContext; if (authenticator != null) { securityContext = authenticator.authenticate(ctx, request, response); if (securityContext == null) return; // Authentication failed } else { securityContext = NettySecurityContext.ANONYMOUS; } try { ResteasyProviderFactory.pushContext(SecurityContext.class, securityContext); ResteasyProviderFactory.pushContext(ChannelHandlerContext.class, ctx); if (handleNotFound) { dispatcher.invoke(request, response); } else { dispatcher.invokePropagateNotFound(request, response); } } finally { ResteasyProviderFactory.clearContextData(); } } finally { ResteasyProviderFactory defaultInstance = ResteasyProviderFactory.getInstance(); if (defaultInstance instanceof ThreadLocalResteasyProviderFactory) { ThreadLocalResteasyProviderFactory.pop(); } } } }