Skip to content

Instantly share code, notes, and snippets.

@yesil
Last active December 6, 2016 14:47
Show Gist options
  • Save yesil/75ba51947cab7c07f96dbd0a7a278ca4 to your computer and use it in GitHub Desktop.
Save yesil/75ba51947cab7c07f96dbd0a7a278ca4 to your computer and use it in GitHub Desktop.
Registers ReplicationReceiverWrapperFilter to the http service using Whiteboard
This filter is to be installed on a AEM publish instance.
It will buffer the replication request responses until completion before sending back a success (200).
This will help AEM author to detect that the replication request has really succeeded which is really important in case of package replications.
package daycare.core.filters;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component
@Service(value = Filter.class)
@Properties({ @Property(name = "pattern", value = "/bin/receive", propertyPrivate = true),
@Property(name = Constants.SERVICE_RANKING, intValue = Integer.MAX_VALUE, propertyPrivate = true) })
public class ReplicationReceiverWrapperFilter implements Filter {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final class BufferingResponse extends HttpServletResponseWrapper {
private StringWriter writer;
public BufferingResponse(final HttpServletResponse resp) {
super(resp);
}
/**
* @see javax.servlet.ServletResponseWrapper#getWriter()
*/
@Override
public PrintWriter getWriter() throws IOException {
if (writer == null) {
writer = new StringWriter();
}
return new PrintWriter(writer);
}
@Override
public void resetBuffer() {
if (this.writer != null) {
this.writer = new StringWriter();
}
super.resetBuffer();
}
public void finish(ServletResponse response) throws IOException {
if (writer != null) {
response.getWriter().write(writer.toString());
}
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
final HttpServletResponse res = (HttpServletResponse) response;
logger.debug("1. Buffered Replication Receiver is called");
final BufferingResponse bufResponse = new BufferingResponse(res);
res.setStatus(500);
chain.doFilter(req, bufResponse);
res.setStatus(200);
logger.debug("2. Buffered Replication Receiver is writing the response");
bufResponse.finish(response);
logger.debug("3. Buffered Replication Receiver has finished");
}
@Override
public void destroy() {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment