package org.caudexorigo.jersey;
import java.net.URI;
import javax.ws.rs.core.SecurityContext;
import org.caudexorigo.http.netty.HttpAction;
import org.caudexorigo.http.netty.HttpRequestWrapper;
import org.glassfish.jersey.internal.MapPropertiesDelegate;
import org.glassfish.jersey.internal.PropertiesDelegate;
import org.glassfish.jersey.server.ApplicationHandler;
import org.glassfish.jersey.server.ContainerRequest;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.spi.Container;
import org.jboss.netty.buffer.ChannelBufferInputStream;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.http.HttpRequest;
import org.jboss.netty.handler.codec.http.HttpResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JerseyHttpAction extends HttpAction implements Container
{
private static Logger log = LoggerFactory.getLogger(JerseyHttpAction.class);
public ApplicationHandler webappHandler;
private final ResourceConfig resConf;
private final SecurityContext securityCtx;
public JerseyHttpAction(ApplicationHandler webappHandler, ResourceConfig resConf, SecurityContext securityCtx)
{
this.webappHandler = webappHandler;
this.resConf = resConf;
this.securityCtx = securityCtx;
log.debug(String.format("new (%s, %s)", webappHandler.toString(), resConf.toString()));
}
@Override
public void service(ChannelHandlerContext ctx, HttpRequest req, HttpResponse response)
{
try
{
HttpRequestWrapper request = (HttpRequestWrapper) req;
String base = request.getUri();
final URI baseUri = new URI(base);
final URI requestUri = new URI(base.substring(0, base.length() - 1) + request.getUri());
PropertiesDelegate properties = new MapPropertiesDelegate();
ContainerRequest containerRequest = new ContainerRequest(baseUri, requestUri, request.getMethod().getName(), securityCtx, properties);
containerRequest.setEntityStream(new ChannelBufferInputStream(request.getContent()));
containerRequest.setWriter(new JerseyNettyResponseWriter(response));
webappHandler.handle(containerRequest);
}
catch (Throwable t)
{
throw new RuntimeException(t);
}
}
@Override
public ResourceConfig getConfiguration()
{
return resConf;
}
@Override
public void reload()
{
log.debug("reload(JerseyHttpAction)");
reload(getConfiguration());
}
@Override
public void reload(ResourceConfig resConf)
{
log.debug("reload(JerseyHttpAction, ResourceConfig)");
// webappHandler.onShutdown(this);
// webappHandler = new ApplicationHandler(resConf);
// webappHandler.onReload(this);
// webappHandler.onStartup(this);
}
@Override
public ApplicationHandler getApplicationHandler()
{
return webappHandler;
}
}