
com.github.gkutiel.flip.web.DynamicContentHandler Maven / Gradle / Ivy
package com.github.gkutiel.flip.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import com.github.gkutiel.flip.utils.Utils;
import com.github.gkutiel.flip.web.Flipper.RedirectException;
class DynamicContentHandler extends AbstractHandler {
private static abstract class ResultSender {
static ResultSender create(final Object result) {
if (result instanceof byte[]) return new ResultSender() {
@Override
void send(final HttpServletResponse res, final MethodInvoker methodInvoker, final Formatter formatter) {
try {
res.setContentType(methodInvoker.getMimeType());
final ServletOutputStream outputStream = res.getOutputStream();
outputStream.write((byte[]) result);
outputStream.close();
} catch (final IOException e) {
throw new RuntimeException(e);
}
}
};
return new ResultSender() {
@Override
void send(final HttpServletResponse res, final MethodInvoker methodInvoker, final Formatter formatter) {
try {
res.setCharacterEncoding("UTF-8");
res.setContentType(formatter.mimeType());
final PrintWriter writer = res.getWriter();
writer.println(formatter.format(result, methodInvoker.getXsl()));
writer.close();
} catch (final IOException e) {
throw new RuntimeException(e);
}
}
};
}
abstract void send(final HttpServletResponse res, final MethodInvoker methodInvoker, final Formatter formatter);
}
private static final Logger LOGGER = Logger.getLogger(DynamicContentHandler.class.getCanonicalName());
private static final MethodInvokerFinder METHOD_INVOKER_FINDER = new MethodInvokerFinder();
private Formatter formmaterFromPath(final String path) {
return path.endsWith("//") ? Formatter.JSON : Formatter.XML;
}
private MethodInvoker getMethodInvoker(final HttpServletRequest req) {
return METHOD_INVOKER_FINDER.find(req);
}
@Override
public void handle(final String target, final Request baseRequest, final HttpServletRequest req, final HttpServletResponse res) throws ServletException {
try {
final MethodInvoker methodInvoker = getMethodInvoker(req);
if (methodInvoker == null) {
baseRequest.setHandled(false);
return;
}
final Object result = methodInvoker.invoke(req, res);
final Formatter formatter = formmaterFromPath(Utils.Strings.emptyIfNull(req.getPathInfo()));
ResultSender.create(result).send(res, methodInvoker, formatter);
baseRequest.setHandled(true);
} catch (final RedirectException e) {
LOGGER.info("REDIRECTING: " + e.getMessage());
} catch (final Exception e) {
throw new ServletException(e.getCause());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy