package org.ovirt.engine.api.restapi.logging;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.WebApplicationException;
import org.jboss.resteasy.annotations.interception.DecoderPrecedence;
import org.jboss.resteasy.annotations.interception.ServerInterceptor;
import org.jboss.resteasy.spi.interception.MessageBodyWriterContext;
import org.jboss.resteasy.spi.interception.MessageBodyWriterInterceptor;
@Provider
@ServerInterceptor
@DecoderPrecedence
public class ResponsePayloadLogger extends MessageLogger implements MessageBodyWriterInterceptor {
@Override
public void write(MessageBodyWriterContext context) throws IOException, WebApplicationException {
OutputStream old = context.getOutputStream(), wrapper = null;
if (LOG.isDebugEnabled()) {
logHeaders(context);
wrapper = new LoggingOutputStream(old, LOG);
context.setOutputStream(wrapper);
}
try {
context.proceed();
} finally {
if (wrapper != null) {
try {
wrapper.close();
} catch (IOException ioe) {
// never thrown
}
context.setOutputStream(old);
}
}
}
protected void logHeaders(MessageBodyWriterContext context) {
for (Map.Entry<String, List<Object>> entry : context.getHeaders().entrySet()) {
StringBuilder header = new StringBuilder(entry.getKey());
header.append(":");
for (Object value : entry.getValue()) {
header.append(value).append(" ");
}
LOG.debug(header);
}
}
}