 +   */
 +  protected abstract FilterDefinition[] filterDefinitions();
 +
-+  public synchronized void initPipeline(ServletContext servletContext)
-+      throws ServletException {
++  @Override
++  public synchronized void initPipeline(ServletContext servletContext) throws ServletException {
 +
 +    //double-checked lock, prevents duplicate initialization
 +    if (initialized)

+    for (final ServletDefinition servletDefinition : servletDefinitions()) {
+      if (servletDefinition.shouldServe(path)) {
+        return new RequestDispatcher() {
+          public void forward(ServletRequest servletRequest, ServletResponse servletResponse)
+              throws ServletException, IOException {
+            Preconditions.checkState(!servletResponse.isCommitted(),
+                "Response has been committed--you can only call forward before"
+                + " committing the response (hint: don't flush buffers)");
+
+            // clear buffer before forwarding
+            servletResponse.resetBuffer();
+
+            ServletRequest requestToProcess;
+            if (servletRequest instanceof HttpServletRequest) {
+               requestToProcess = wrapRequest((HttpServletRequest)servletRequest, newRequestUri);
+            } else {
+              // This should never happen, but instead of throwing an exception
+              // we will allow a happy case pass thru for maximum tolerance to

+    };
+  }
+
+  @Override
+  public void destroyPipeline() {
+    //destroy servlets first
+    servletPipeline.destroy();
