Last active
December 6, 2016 14:47
-
-
Save yesil/75ba51947cab7c07f96dbd0a7a278ca4 to your computer and use it in GitHub Desktop.
Registers ReplicationReceiverWrapperFilter to the http service using Whiteboard
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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