You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2015/04/27 22:58:25 UTC

svn commit: r1676377 - in /sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet: HtmlRenderer.java JUnitServlet.java ServletProcessor.java SlingJUnitServlet.java

Author: cziegeler
Date: Mon Apr 27 20:58:25 2015
New Revision: 1676377

URL: http://svn.apache.org/r1676377
Log:
Don't use scr annotation inheritence

Added:
    sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/ServletProcessor.java   (with props)
Modified:
    sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/HtmlRenderer.java
    sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/JUnitServlet.java
    sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/SlingJUnitServlet.java

Modified: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/HtmlRenderer.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/HtmlRenderer.java?rev=1676377&r1=1676376&r2=1676377&view=diff
==============================================================================
--- sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/HtmlRenderer.java (original)
+++ sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/HtmlRenderer.java Mon Apr 27 20:58:25 2015
@@ -25,8 +25,8 @@ import javax.servlet.http.HttpServletRes
 
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.junit.RendererFactory;
 import org.apache.sling.junit.Renderer;
+import org.apache.sling.junit.RendererFactory;
 import org.apache.sling.junit.TestSelector;
 import org.junit.runner.Description;
 import org.junit.runner.Result;
@@ -40,9 +40,9 @@ public class HtmlRenderer extends RunLis
 
     public static final String EXTENSION = "html";
     private PrintWriter output;
-    
+
     /** @inheritDoc */
-    public Renderer createRenderer() { 
+    public Renderer createRenderer() {
         return new HtmlRenderer();
     }
 
@@ -50,9 +50,9 @@ public class HtmlRenderer extends RunLis
     public boolean appliesTo(TestSelector s) {
         // This is our default renderer, applies to the empty
         // extension as well
-        return EXTENSION.equals(s.getExtension()) || "".equals(s.getExtension()); 
+        return EXTENSION.equals(s.getExtension()) || "".equals(s.getExtension());
     }
-    
+
     /** @inheritDoc */
     public String getExtension() {
         return EXTENSION;
@@ -64,7 +64,7 @@ public class HtmlRenderer extends RunLis
         HtmlFilter.escape(output, str);
         output.println("</p>");
     }
-    
+
     /** @inheritDoc */
     public void list(String cssClass, Collection<String> data) {
         output.println("<ul class='testNames'>");
@@ -75,18 +75,18 @@ public class HtmlRenderer extends RunLis
         }
         output.println("</ul>");
     }
-    
+
     /** @inheritDoc */
     public void title(int level, String title) {
         output.print("<h" + level + ">");
         HtmlFilter.escape(output, title);
         output.print("</h" + level + ">");
     }
-    
+
     /** @inheritDoc */
     public void link(String info, String url, String method) {
         output.println("<div class='link'>");
-        
+
         if("POST".equalsIgnoreCase(method)) {
             output.print("<form method='POST' action='");
             output.print(url);
@@ -102,7 +102,7 @@ public class HtmlRenderer extends RunLis
             HtmlFilter.escape(output, info);
             output.println("</a>");
         }
-        
+
         output.println("</div>");
     }
 
@@ -115,7 +115,7 @@ public class HtmlRenderer extends RunLis
         response.setCharacterEncoding("UTF-8");
         output = response.getWriter();
         output.println("<html><head>");
-        output.println("<link rel='stylesheet' type='text/css' href='" + JUnitServlet.CSS + "'/>");
+        output.println("<link rel='stylesheet' type='text/css' href='" + ServletProcessor.CSS + "'/>");
         output.print("<title>");
         HtmlFilter.escape(output, pageTitle);
         output.println("</title>");
@@ -123,19 +123,19 @@ public class HtmlRenderer extends RunLis
         HtmlFilter.escape(output, pageTitle);
         output.println("</h1>");
     }
-    
+
     /** @inheritDoc */
     public void cleanup() {
         output.println("</body>");
         output.println("</html>");
         output = null;
     }
-    
+
     /** @inheritDoc */
     public RunListener getRunListener() {
         return this;
     }
-    
+
     @Override
     public void testFailure(Failure failure) throws Exception {
         super.testFailure(failure);
@@ -173,7 +173,7 @@ public class HtmlRenderer extends RunLis
         HtmlFilter.escape(output, String.valueOf(value));
         output.println("</span>");
     }
-    
+
     @Override
     public void testRunFinished(Result result) throws Exception {
         super.testRunFinished(result);
@@ -185,7 +185,7 @@ public class HtmlRenderer extends RunLis
         } else {
             cssClass += "success";
         }
-        
+
         output.println("<p class='testRun'>");
         output.print("TEST RUN FINISHED: ");
         counter("tests", "testCount", result.getRunCount());

Modified: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/JUnitServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/JUnitServlet.java?rev=1676377&r1=1676376&r2=1676377&view=diff
==============================================================================
--- sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/JUnitServlet.java (original)
+++ sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/JUnitServlet.java Mon Apr 27 20:58:25 2015
@@ -17,12 +17,7 @@
 package org.apache.sling.junit.impl.servlet;
 
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Collections;
 import java.util.Dictionary;
-import java.util.LinkedList;
-import java.util.List;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -32,10 +27,7 @@ import javax.servlet.http.HttpServletRes
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
-import org.apache.sling.junit.Renderer;
 import org.apache.sling.junit.RendererSelector;
-import org.apache.sling.junit.RequestParser;
-import org.apache.sling.junit.TestSelector;
 import org.apache.sling.junit.TestsManager;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.http.HttpService;
@@ -47,33 +39,33 @@ import org.slf4j.LoggerFactory;
 @SuppressWarnings("serial")
 @Component(immediate=true, metatype=true)
 public class JUnitServlet extends HttpServlet {
-    
+
     private final Logger log = LoggerFactory.getLogger(getClass());
-    
-    public static final String CSS = "junit.css";
-    public static final String FORCE_RELOAD_PARAM = "forceReload";
-    
+
     @Property(value="/system/sling/junit")
     static final String SERVLET_PATH_NAME = "servlet.path";
-    
-    /** Non-null if we are registered with HttpService */ 
+
+    /** Non-null if we are registered with HttpService */
     private String servletPath;
-    
+
     @Reference
     private TestsManager testsManager;
-    
+
     @Reference
     private HttpService httpService;
-    
+
     @Reference
     private RendererSelector rendererSelector;
-    
-    protected void activate(ComponentContext ctx) throws ServletException, NamespaceException {
+
+    private volatile ServletProcessor processor;
+
+    protected void activate(final ComponentContext ctx) throws ServletException, NamespaceException {
         servletPath = getServletPath(ctx);
         if(servletPath == null) {
             log.info("Servlet path is null, not registering with HttpService");
         } else {
             httpService.registerServlet(servletPath, this, null, null);
+            this.processor = new ServletProcessor(testsManager, rendererSelector);
             log.info("Servlet registered at {}", servletPath);
         }
     }
@@ -81,7 +73,7 @@ public class JUnitServlet extends HttpSe
     /** Return the path at which to mount this servlet, or null
      *  if it must not be mounted.
      */
-    protected String getServletPath(ComponentContext ctx) {
+    private String getServletPath(ComponentContext ctx) {
         final Dictionary<?, ?> config = ctx.getProperties();
         String result = (String)config.get(SERVLET_PATH_NAME);
         if(result != null && result.trim().length() == 0) {
@@ -89,149 +81,27 @@ public class JUnitServlet extends HttpSe
         }
         return result;
     }
-    
+
     protected void deactivate(ComponentContext ctx) throws ServletException, NamespaceException {
         if(servletPath != null) {
             httpService.unregister(servletPath);
             log.info("Servlet unregistered from path {}", servletPath);
         }
         servletPath = null;
+        this.processor = null;
     }
-    
-    /** Return sorted list of available tests
-     * @param prefix optionally select only names that match this prefix
-     */
-    private List<String> getTestNames(TestSelector selector, boolean forceReload) {
-        final List<String> result = new LinkedList<String>();
-        if(forceReload) {
-            log.debug("{} is true, clearing TestsManager caches", FORCE_RELOAD_PARAM);
-        }
-        result.addAll(testsManager.getTestNames(selector));
-        Collections.sort(result);
-        return result;
-    }
-    
-    private void sendCss(HttpServletResponse response) throws IOException {
-        final InputStream str = getClass().getResourceAsStream("/" + CSS);
-        if(str == null) {
-            response.sendError(HttpServletResponse.SC_NOT_FOUND, CSS);
-        } else {
-            response.setContentType("text/css");
-            final OutputStream out = response.getOutputStream();
-            final byte[] buffer = new byte[16384];
-            int count = 0;
-            while( (count = str.read(buffer)) > 0) {
-                out.write(buffer, 0, count);
-            }
-            out.flush();
-        }
-    }
-    
-    private boolean getForceReloadOption(HttpServletRequest request) {
-        final boolean forceReload = "true".equalsIgnoreCase(request.getParameter(FORCE_RELOAD_PARAM));
-        log.debug("{} option is set to {}", FORCE_RELOAD_PARAM, forceReload);
-        return forceReload;
-    }
-    
-    /** GET request lists available tests */
-    @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
-    throws ServletException, IOException {
-        final boolean forceReload = getForceReloadOption(request);
-        
-        // Redirect to / if called without it, and serve CSS if requested 
-        {
-            final String pi = request.getPathInfo();
-            if(pi == null) {
-                response.sendRedirect(request.getContextPath() + servletPath + "/");
-            } else if(pi.endsWith(CSS)) {
-                sendCss(response);
-                return;
-            }
-        }
-
-        final TestSelector selector = getTestSelector(request);
-        final Renderer renderer = rendererSelector.getRenderer(selector);
-        if(renderer == null) {
-            throw new ServletException("No Renderer found for " + selector);
-        }
-        log.debug("GET request: {}", selector);
 
-        renderer.setup(response, getClass().getSimpleName());
-        renderer.info("info", "Test selector: " + selector); 
-        
-        // Any test classes?
-        final List<String> testNames = getTestNames(selector, forceReload); 
-        if(testNames.isEmpty()) {
-            renderer.info(
-                    "warning",
-                    "No test classes found for selector " + selector
-                    + ", check the requirements of the active " +
-                    "TestsProvider services for how to supply tests." 
-                    );
-        } else {
-            try {
-                testsManager.listTests(testNames, renderer);
-                final String postPath = getTestExecutionPath(request, selector, renderer.getExtension()); 
-                renderer.link("Execute these tests", postPath, "POST");
-            } catch(Exception e) {
-                throw new ServletException(e);
-            }
-        }
-        renderer.cleanup();
-    }
-    
-    /** POST request executes tests */
     @Override
-    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
-    throws ServletException, IOException {
-        final TestSelector selector = getTestSelector(request);
-        final boolean forceReload = getForceReloadOption(request);
-        log.info("POST request, executing tests: {}, {}={}", 
-                new Object[] { selector, FORCE_RELOAD_PARAM, forceReload});
-        
-        final Renderer renderer = rendererSelector.getRenderer(selector);
-        if(renderer == null) {
-            throw new ServletException("No Renderer found for " + selector);
-        }
-        renderer.setup(response, getClass().getSimpleName());
-        
-        final List<String> testNames = getTestNames(selector, forceReload);
-        if(testNames.isEmpty()) {
-            response.sendError(
-                    HttpServletResponse.SC_NOT_FOUND, 
-                    "No tests found for " + selector);
-        }
-        try {
-            testsManager.executeTests(testNames, renderer, selector);
-        } catch(Exception e) {
-            throw new ServletException(e);
-        }
-        
-        renderer.cleanup();
-    }
-    
-    /** Return a TestSelector for supplied request */
-    protected TestSelector getTestSelector(HttpServletRequest request) {
-        return new RequestParser(getTestSelectionPath(request));
-    }
-    
-    /** Return subpath to use for selecting tests */
-    protected String getTestSelectionPath(HttpServletRequest request) {
-        return request.getPathInfo();
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+            throws ServletException, IOException {
+        this.processor.doGet(req, resp, this.servletPath);
     }
-    
-    /** Return path to which to POST to execute specified test */
-    protected String getTestExecutionPath(HttpServletRequest request, TestSelector selector, String extension) {
-    	String selectedTestMethodName = selector.getSelectedTestMethodName();
-    	String methodStr = "";
-    	if (selectedTestMethodName != null && !"".equals(selectedTestMethodName)) {
-    		methodStr = "/" + selectedTestMethodName;
-    	}
-        return  "./"
-        + selector.getTestSelectorString()
-        + methodStr
-        + "."
-        + extension;
+
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+            throws ServletException, IOException {
+        this.processor.doPost(req, resp);
     }
+
+
 }
\ No newline at end of file

Added: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/ServletProcessor.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/ServletProcessor.java?rev=1676377&view=auto
==============================================================================
--- sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/ServletProcessor.java (added)
+++ sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/ServletProcessor.java Mon Apr 27 20:58:25 2015
@@ -0,0 +1,189 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.junit.impl.servlet;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.sling.junit.Renderer;
+import org.apache.sling.junit.RendererSelector;
+import org.apache.sling.junit.RequestParser;
+import org.apache.sling.junit.TestSelector;
+import org.apache.sling.junit.TestsManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ServletProcessor {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    public static final String CSS = "junit.css";
+    public static final String FORCE_RELOAD_PARAM = "forceReload";
+
+    private final TestsManager testsManager;
+
+    private final RendererSelector rendererSelector;
+
+    public ServletProcessor(final TestsManager testsManager,
+            final RendererSelector rendererSelector) {
+        this.testsManager = testsManager;
+        this.rendererSelector = rendererSelector;
+    }
+
+    /** Return sorted list of available tests
+     * @param prefix optionally select only names that match this prefix
+     */
+    private List<String> getTestNames(TestSelector selector, boolean forceReload) {
+        final List<String> result = new LinkedList<String>();
+        if(forceReload) {
+            log.debug("{} is true, clearing TestsManager caches", FORCE_RELOAD_PARAM);
+        }
+        result.addAll(testsManager.getTestNames(selector));
+        Collections.sort(result);
+        return result;
+    }
+
+    private void sendCss(HttpServletResponse response) throws IOException {
+        final InputStream str = getClass().getResourceAsStream("/" + CSS);
+        if(str == null) {
+            response.sendError(HttpServletResponse.SC_NOT_FOUND, CSS);
+        } else {
+            response.setContentType("text/css");
+            final OutputStream out = response.getOutputStream();
+            final byte[] buffer = new byte[16384];
+            int count = 0;
+            while( (count = str.read(buffer)) > 0) {
+                out.write(buffer, 0, count);
+            }
+            out.flush();
+        }
+    }
+
+    private boolean getForceReloadOption(HttpServletRequest request) {
+        final boolean forceReload = "true".equalsIgnoreCase(request.getParameter(FORCE_RELOAD_PARAM));
+        log.debug("{} option is set to {}", FORCE_RELOAD_PARAM, forceReload);
+        return forceReload;
+    }
+
+    /** GET request lists available tests */
+    public void doGet(final HttpServletRequest request, final HttpServletResponse response, final String servletPath)
+    throws ServletException, IOException {
+        final boolean forceReload = getForceReloadOption(request);
+
+        // Redirect to / if called without it, and serve CSS if requested
+        {
+            final String pi = request.getPathInfo();
+            if(pi == null) {
+                response.sendRedirect(request.getContextPath() + servletPath + "/");
+            } else if(pi.endsWith(CSS)) {
+                sendCss(response);
+                return;
+            }
+        }
+
+        final TestSelector selector = getTestSelector(request);
+        final Renderer renderer = rendererSelector.getRenderer(selector);
+        if(renderer == null) {
+            throw new ServletException("No Renderer found for " + selector);
+        }
+        log.debug("GET request: {}", selector);
+
+        renderer.setup(response, getClass().getSimpleName());
+        renderer.info("info", "Test selector: " + selector);
+
+        // Any test classes?
+        final List<String> testNames = getTestNames(selector, forceReload);
+        if(testNames.isEmpty()) {
+            renderer.info(
+                    "warning",
+                    "No test classes found for selector " + selector
+                    + ", check the requirements of the active " +
+                    "TestsProvider services for how to supply tests."
+                    );
+        } else {
+            try {
+                testsManager.listTests(testNames, renderer);
+                final String postPath = getTestExecutionPath(request, selector, renderer.getExtension());
+                renderer.link("Execute these tests", postPath, "POST");
+            } catch(Exception e) {
+                throw new ServletException(e);
+            }
+        }
+        renderer.cleanup();
+    }
+
+    /** POST request executes tests */
+    public void doPost(HttpServletRequest request, HttpServletResponse response)
+    throws ServletException, IOException {
+        final TestSelector selector = getTestSelector(request);
+        final boolean forceReload = getForceReloadOption(request);
+        log.info("POST request, executing tests: {}, {}={}",
+                new Object[] { selector, FORCE_RELOAD_PARAM, forceReload});
+
+        final Renderer renderer = rendererSelector.getRenderer(selector);
+        if(renderer == null) {
+            throw new ServletException("No Renderer found for " + selector);
+        }
+        renderer.setup(response, getClass().getSimpleName());
+
+        final List<String> testNames = getTestNames(selector, forceReload);
+        if(testNames.isEmpty()) {
+            response.sendError(
+                    HttpServletResponse.SC_NOT_FOUND,
+                    "No tests found for " + selector);
+        }
+        try {
+            testsManager.executeTests(testNames, renderer, selector);
+        } catch(Exception e) {
+            throw new ServletException(e);
+        }
+
+        renderer.cleanup();
+    }
+
+    /** Return a TestSelector for supplied request */
+    private TestSelector getTestSelector(HttpServletRequest request) {
+        return new RequestParser(getTestSelectionPath(request));
+    }
+
+    /** Return subpath to use for selecting tests */
+    protected String getTestSelectionPath(HttpServletRequest request) {
+        return request.getPathInfo();
+    }
+
+    /** Return path to which to POST to execute specified test */
+    protected String getTestExecutionPath(HttpServletRequest request, TestSelector selector, String extension) {
+    	String selectedTestMethodName = selector.getSelectedTestMethodName();
+    	String methodStr = "";
+    	if (selectedTestMethodName != null && !"".equals(selectedTestMethodName)) {
+    		methodStr = "/" + selectedTestMethodName;
+    	}
+        return  "./"
+        + selector.getTestSelectorString()
+        + methodStr
+        + "."
+        + extension;
+    }
+}
\ No newline at end of file

Propchange: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/ServletProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/ServletProcessor.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Modified: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/SlingJUnitServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/SlingJUnitServlet.java?rev=1676377&r1=1676376&r2=1676377&view=diff
==============================================================================
--- sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/SlingJUnitServlet.java (original)
+++ sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/SlingJUnitServlet.java Mon Apr 27 20:58:25 2015
@@ -16,14 +16,23 @@
  */
 package org.apache.sling.junit.impl.servlet;
 
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 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.Reference;
 import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.junit.RendererSelector;
 import org.apache.sling.junit.TestSelector;
+import org.apache.sling.junit.TestsManager;
 import org.osgi.service.component.ComponentContext;
+import org.osgi.service.http.NamespaceException;
 
 /** Alternate entry point for testing, that uses
  *  the Sling request/response cycle.
@@ -31,56 +40,77 @@ import org.osgi.service.component.Compon
  *  Can be used to run tests in an environment that
  *  more closely matches how Sling components run,
  *  but requires Sling - so we keep both servlets
- *  in order for this module to be reusable without 
+ *  in order for this module to be reusable without
  *  Sling.
- *  
+ *
  *  This servlet is registered with a specific resource
  *  type, to call it a Sling resource must be created
  *  with this resource type.
  */
 @SuppressWarnings("serial")
-@Component
+@Component(metatype=true)
 @Service(value=javax.servlet.Servlet.class)
 @Properties({
         @Property(name="sling.servlet.resourceTypes", value="sling/junit/testing"),
         @Property(name="sling.servlet.extensions", value="junit"),
         @Property(name="sling.servlet.methods", value={"GET","POST"})
 })
-public class SlingJUnitServlet extends JUnitServlet {
-    
+public class SlingJUnitServlet extends HttpServlet {
+
     public static final String EXTENSION = ".junit";
-    
-    /** Do not register this servlet with HttpService ourselves,
-     *  Sling will take care of that.
-     */
+
+    @Reference
+    private TestsManager testsManager;
+
+    @Reference
+    private RendererSelector rendererSelector;
+
+    private volatile ServletProcessor processor;
+
+    protected void activate(final ComponentContext ctx) throws ServletException, NamespaceException {
+        this.processor = new ServletProcessor(testsManager, rendererSelector) {
+            @Override
+            protected String getTestSelectionPath(HttpServletRequest request) {
+                // PathInfo contains the path to our resource, followed
+                // by the .junit extension - cut up to that
+                String result = request.getPathInfo();
+                final int pos = result.indexOf(EXTENSION);
+                if(pos >= 0) {
+                    result = result.substring(pos + EXTENSION.length());
+                }
+                return result;
+            }
+
+            /** Return path to which to POST to execute specified test */
+            @Override
+            protected String getTestExecutionPath(HttpServletRequest request, TestSelector selector, String extension) {
+                String selectedTestMethodName = selector.getSelectedTestMethodName();
+                String methodStr = "";
+                if (selectedTestMethodName != null && !"".equals(selectedTestMethodName)) {
+                    methodStr = "/" + selectedTestMethodName;
+                }
+                return  "./"
+                + selector.getTestSelectorString()
+                + methodStr
+                + "."
+                + extension;
+            }
+        };
+    }
+
+    protected void deactivate(ComponentContext ctx) throws ServletException, NamespaceException {
+        this.processor = null;
+    }
+
     @Override
-    protected String getServletPath(ComponentContext ctx) {
-        return null;
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+            throws ServletException, IOException {
+        this.processor.doGet(req, resp, null);
     }
-    
+
     @Override
-    protected String getTestSelectionPath(HttpServletRequest request) {
-        // PathInfo contains the path to our resource, followed
-        // by the .junit extension - cut up to that
-        String result = request.getPathInfo();
-        final int pos = result.indexOf(EXTENSION);
-        if(pos >= 0) {
-            result = result.substring(pos + EXTENSION.length());
-        }
-        return result;
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+            throws ServletException, IOException {
+        this.processor.doPost(req, resp);
     }
-    
-    /** Return path to which to POST to execute specified test */
-    protected String getTestExecutionPath(HttpServletRequest request, TestSelector selector, String extension) {
-    	String selectedTestMethodName = selector.getSelectedTestMethodName();
-    	String methodStr = "";
-    	if (selectedTestMethodName != null && !"".equals(selectedTestMethodName)) {
-    		methodStr = "/" + selectedTestMethodName;
-    	}
-        return  "./"
-        + selector.getTestSelectorString()
-        + methodStr
-        + "."
-        + extension;
     }
-}