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 2017/05/09 16:10:01 UTC

svn commit: r1794605 - in /sling/trunk/testing/junit/scriptable: ./ src/main/java/org/apache/sling/junit/scriptable/

Author: cziegeler
Date: Tue May  9 16:10:00 2017
New Revision: 1794605

URL: http://svn.apache.org/viewvc?rev=1794605&view=rev
Log:
Update to parent pom 30 and R6 OSGi annotations

Modified:
    sling/trunk/testing/junit/scriptable/pom.xml
    sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/HttpRequest.java
    sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/HttpResponse.java
    sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ScriptableTestsProvider.java
    sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/TestServletOutputStream.java

Modified: sling/trunk/testing/junit/scriptable/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/scriptable/pom.xml?rev=1794605&r1=1794604&r2=1794605&view=diff
==============================================================================
--- sling/trunk/testing/junit/scriptable/pom.xml (original)
+++ sling/trunk/testing/junit/scriptable/pom.xml Tue May  9 16:10:00 2017
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache.sling</groupId>
         <artifactId>sling</artifactId>
-        <version>26</version>
+        <version>30</version>
         <relativePath />
     </parent>
 
@@ -47,10 +47,6 @@
         <plugins>
             <plugin>
                 <groupId>org.apache.felix</groupId>
-                <artifactId>maven-scr-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <extensions>true</extensions>
                 <configuration>
@@ -67,16 +63,7 @@
     <dependencies>
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-            <scope>provided</scope>
+            <artifactId>osgi.core</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
@@ -115,19 +102,15 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
-            <version>4.8.2</version>
-            <scope>provided</scope>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
-            <version>2.4</version>
+            <artifactId>javax.servlet-api</artifactId>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
-            <version>1.5.11</version>
-            <scope>provided</scope>
         </dependency>
     </dependencies>
 </project>

Modified: sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/HttpRequest.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/HttpRequest.java?rev=1794605&r1=1794604&r2=1794605&view=diff
==============================================================================
--- sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/HttpRequest.java (original)
+++ sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/HttpRequest.java Tue May  9 16:10:00 2017
@@ -20,16 +20,26 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.security.Principal;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 
+import javax.servlet.AsyncContext;
+import javax.servlet.DispatcherType;
 import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
 import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpUpgradeHandler;
+import javax.servlet.http.Part;
 
 /** Fake request used to acquire content from Sling */
 public class HttpRequest implements HttpServletRequest {
@@ -37,227 +47,363 @@ public class HttpRequest implements Http
     public static final String FAKE_URL_BASE = "http://example.com";
     private final String path;
     private final Map<String, Object> attributes;
-    private final Map<String, String> parameters;
-    
+    private final Map<String, String[]> parameters;
+
     HttpRequest(String path) {
         this.path = path;
-        attributes = new HashMap<String, Object>();
-        parameters = new HashMap<String, String>();
+        attributes = new HashMap<>();
+        parameters = new HashMap<>();
     }
-    
+
+    @Override
     public String getAuthType() {
         return null;
     }
 
+    @Override
     public String getContextPath() {
         return "";
     }
 
+    @Override
     public Cookie[] getCookies() {
         return null;
     }
 
+    @Override
     public long getDateHeader(String name) {
         return 0;
     }
 
+    @Override
     public String getHeader(String name) {
         return null;
     }
 
-    public Enumeration<?> getHeaderNames() {
+    @Override
+    public Enumeration<String> getHeaderNames() {
         return null;
     }
 
-    public Enumeration<?> getHeaders(String name) {
+    @Override
+    public Enumeration<String> getHeaders(String name) {
         return null;
     }
 
+    @Override
     public int getIntHeader(String name) {
         return 0;
     }
 
+    @Override
     public String getMethod() {
         return "GET";
     }
 
+    @Override
     public String getPathInfo() {
         return null;
     }
 
+    @Override
     public String getPathTranslated() {
         return null;
     }
 
+    @Override
     public String getQueryString() {
         return null;
     }
 
+    @Override
     public String getRemoteUser() {
         return null;
     }
 
+    @Override
     public String getRequestedSessionId() {
         return null;
     }
 
+    @Override
     public String getRequestURI() {
         return path;
     }
 
+    @Override
     public StringBuffer getRequestURL() {
         return new StringBuffer(FAKE_URL_BASE + path);
     }
 
+    @Override
     public String getServletPath() {
-        return path; 
+        return path;
     }
 
+    @Override
     public HttpSession getSession() {
         return null;
     }
 
+    @Override
     public HttpSession getSession(boolean create) {
         return null;
     }
 
+    @Override
     public Principal getUserPrincipal() {
         return null;
     }
 
+    @Override
     public boolean isRequestedSessionIdFromCookie() {
         return false;
     }
 
+    @Override
     public boolean isRequestedSessionIdFromUrl() {
         return false;
     }
 
+    @Override
     public boolean isRequestedSessionIdFromURL() {
         return false;
     }
 
+    @Override
     public boolean isRequestedSessionIdValid() {
         return false;
     }
 
+    @Override
     public boolean isUserInRole(String role) {
         return false;
     }
 
+    @Override
     public Object getAttribute(String name) {
         return attributes.get(name);
     }
 
-    public Enumeration<?> getAttributeNames() {
+    @Override
+    public Enumeration<String> getAttributeNames() {
         return null;
     }
 
+    @Override
     public String getCharacterEncoding() {
         return null;
     }
 
+    @Override
     public int getContentLength() {
         return 0;
     }
 
+    @Override
     public String getContentType() {
         return null;
     }
 
+    @Override
     public ServletInputStream getInputStream() throws IOException {
         return null;
     }
 
+    @Override
     public String getLocalAddr() {
         return null;
     }
 
+    @Override
     public Locale getLocale() {
         return null;
     }
 
-    public Enumeration<?> getLocales() {
+    @Override
+    public Enumeration<Locale> getLocales() {
         return null;
     }
 
+    @Override
     public String getLocalName() {
         return null;
     }
 
+    @Override
     public int getLocalPort() {
         return 0;
     }
 
+    @Override
     public String getParameter(String name) {
         return null;
     }
 
-    public Map<?,?> getParameterMap() {
+    @Override
+    public Map<String, String[]> getParameterMap() {
         return parameters;
     }
 
-    public Enumeration<?> getParameterNames() {
+    @Override
+    public Enumeration<String> getParameterNames() {
         return null;
     }
 
+    @Override
     public String[] getParameterValues(String name) {
         return null;
     }
 
+    @Override
     public String getProtocol() {
         return null;
     }
 
+    @Override
     public BufferedReader getReader() throws IOException {
         return null;
     }
 
+    @Override
     public String getRealPath(String path) {
         return null;
     }
 
+    @Override
     public String getRemoteAddr() {
         return null;
     }
 
+    @Override
     public String getRemoteHost() {
         return null;
     }
 
+    @Override
     public int getRemotePort() {
         return 0;
     }
 
+    @Override
     public RequestDispatcher getRequestDispatcher(String path) {
         return null;
     }
 
+    @Override
     public String getScheme() {
         return "http";
     }
 
+    @Override
     public String getServerName() {
         return null;
     }
 
+    @Override
     public int getServerPort() {
         return 0;
     }
 
+    @Override
     public boolean isSecure() {
         return false;
     }
 
+    @Override
     public void removeAttribute(String name) {
         attributes.remove(name);
     }
 
+    @Override
     public void setAttribute(String name, Object o) {
         attributes.put(name, o);
     }
 
+    @Override
     public void setCharacterEncoding(String env)
             throws UnsupportedEncodingException {
     }
+
+    @Override
+    public long getContentLengthLong() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    @Override
+    public ServletContext getServletContext() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public AsyncContext startAsync() throws IllegalStateException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse)
+            throws IllegalStateException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean isAsyncStarted() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean isAsyncSupported() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public AsyncContext getAsyncContext() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public DispatcherType getDispatcherType() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String changeSessionId() {
+        return null;
+    }
+
+    @Override
+    public boolean authenticate(HttpServletResponse response) throws IOException, ServletException {
+        return false;
+    }
+
+    @Override
+    public void login(String username, String password) throws ServletException {
+    }
+
+    @Override
+    public void logout() throws ServletException {
+    }
+
+    @Override
+    public Collection<Part> getParts() throws IOException, ServletException {
+        return null;
+    }
+
+    @Override
+    public Part getPart(String name) throws IOException, ServletException {
+        return null;
+    }
+
+    @Override
+    public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException {
+        return null;
+    }
 }

Modified: sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/HttpResponse.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/HttpResponse.java?rev=1794605&r1=1794604&r2=1794605&view=diff
==============================================================================
--- sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/HttpResponse.java (original)
+++ sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/HttpResponse.java Tue May  9 16:10:00 2017
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
+import java.util.Collection;
 import java.util.Locale;
 
 import javax.servlet.ServletOutputStream;
@@ -35,125 +36,157 @@ public class HttpResponse implements Htt
     private String contentType;
     private final TestServletOutputStream outputStream;
     private final PrintWriter writer;
-    
+
     HttpResponse() throws UnsupportedEncodingException {
         outputStream = new TestServletOutputStream();
         writer = new PrintWriter(new OutputStreamWriter(outputStream, encoding));
     }
-    
+
+    @Override
     public void addCookie(Cookie cookie) {
     }
 
+    @Override
     public void addDateHeader(String name, long date) {
     }
 
+    @Override
     public void addHeader(String name, String value) {
     }
 
+    @Override
     public void addIntHeader(String name, int value) {
     }
 
+    @Override
     public boolean containsHeader(String name) {
         return false;
     }
 
+    @Override
     public String encodeRedirectUrl(String url) {
         return null;
     }
 
+    @Override
     public String encodeRedirectURL(String url) {
         return null;
     }
 
+    @Override
     public String encodeUrl(String url) {
         return null;
     }
 
+    @Override
     public String encodeURL(String url) {
         return null;
     }
 
+    @Override
     public void sendError(int sc, String msg) throws IOException {
         status = sc;
         message = msg;
     }
 
+    @Override
     public void sendError(int sc) throws IOException {
         status = sc;
     }
 
+    @Override
     public void sendRedirect(String location) throws IOException {
     }
 
+    @Override
     public void setDateHeader(String name, long date) {
     }
 
+    @Override
     public void setHeader(String name, String value) {
     }
 
+    @Override
     public void setIntHeader(String name, int value) {
     }
 
+    @Override
     public void setStatus(int sc, String sm) {
         status = sc;
         message = sm;
     }
 
+    @Override
     public void setStatus(int sc) {
         status = sc;
     }
 
+    @Override
     public void flushBuffer() throws IOException {
     }
 
+    @Override
     public int getBufferSize() {
         return 0;
     }
 
+    @Override
     public String getCharacterEncoding() {
         return encoding;
     }
 
+    @Override
     public String getContentType() {
         return contentType;
     }
 
+    @Override
     public Locale getLocale() {
         return null;
     }
 
+    @Override
     public ServletOutputStream getOutputStream() throws IOException {
         return outputStream;
     }
 
+    @Override
     public PrintWriter getWriter() throws IOException {
         return writer;
     }
 
+    @Override
     public boolean isCommitted() {
         return false;
     }
 
+    @Override
     public void reset() {
     }
 
+    @Override
     public void resetBuffer() {
     }
 
+    @Override
     public void setBufferSize(int size) {
     }
 
+    @Override
     public void setCharacterEncoding(String charset) {
         encoding = charset;
     }
 
+    @Override
     public void setContentLength(int len) {
     }
 
+    @Override
     public void setContentType(String type) {
         contentType = type;
     }
 
+    @Override
     public void setLocale(Locale loc) {
     }
 
@@ -173,12 +206,32 @@ public class HttpResponse implements Htt
         this.encoding = encoding;
     }
 
+    @Override
     public int getStatus() {
         return status;
     }
-    
+
     public String getContent() {
         writer.flush();
         return outputStream.toString();
     }
+
+    @Override
+    public void setContentLengthLong(long len) {
+    }
+
+    @Override
+    public String getHeader(String name) {
+        return null;
+    }
+
+    @Override
+    public Collection<String> getHeaders(String name) {
+        return null;
+    }
+
+    @Override
+    public Collection<String> getHeaderNames() {
+        return null;
+    }
 }

Modified: sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ScriptableTestsProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ScriptableTestsProvider.java?rev=1794605&r1=1794604&r2=1794605&view=diff
==============================================================================
--- sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ScriptableTestsProvider.java (original)
+++ sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ScriptableTestsProvider.java Tue May  9 16:10:00 2017
@@ -31,26 +31,22 @@ import javax.jcr.observation.EventIterat
 import javax.jcr.observation.EventListener;
 import javax.jcr.query.Query;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.engine.SlingRequestProcessor;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.jcr.resource.api.JcrResourceConstants;
 import org.apache.sling.junit.TestsProvider;
-import org.apache.sling.spi.resource.provider.ResourceProvider;
 import org.osgi.framework.Constants;
-import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** TestsProvider that provides test classes for repository
  *  nodes that have a sling:Test mixin.
  */
-@Component
-@Service
+@Component(service = TestsProvider.class)
 public class ScriptableTestsProvider implements TestsProvider {
     private final Logger log = LoggerFactory.getLogger(getClass());
     private String pid;
@@ -58,13 +54,13 @@ public class ScriptableTestsProvider imp
     private ResourceResolver resolver;
     private long lastModified = System.currentTimeMillis();
     private long lastReloaded;
-    
+
     /** List of resource paths that point to tests */
-    private static List<String> testPaths = new LinkedList<String>();
-    
+    private static List<String> testPaths = new LinkedList<>();
+
     public static final String SLING_TEST_NODETYPE = "sling:Test";
     public static final String TEST_CLASS_NAME = ScriptableTestsProvider.class.getName();
-    
+
     /** Context that's passed to TestAllPaths */
     static class TestContext {
         final List<String> testPaths;
@@ -77,51 +73,52 @@ public class ScriptableTestsProvider imp
             resourceResolver = rr;
         }
     }
-    
+
     /** Need a ThreadLocal to pass context, as it's JUnit who instantiates the
      *  test classes, we can't easily decorate them (AFAIK).
      */
-    static final ThreadLocal<TestContext> testContext = new ThreadLocal<TestContext>(); 
-    
+    static final ThreadLocal<TestContext> testContext = new ThreadLocal<>();
+
     /** We only consider test resources under the search path
-     *  of the JCR resource resolver. These paths are supposed 
-     *  to be secured, as they contain other admin stuff anyway, 
-     *  so non-admin users are prevented from creating test nodes. 
+     *  of the JCR resource resolver. These paths are supposed
+     *  to be secured, as they contain other admin stuff anyway,
+     *  so non-admin users are prevented from creating test nodes.
      */
     private String[] allowedRoots;
-    
+
     @Reference
     private SlingRepository repository;
-    
+
     @Reference
     private SlingRequestProcessor requestProcessor;
-    
+
     @Reference
     private ResourceResolverFactory resolverFactory;
-    
+
     // Need one listener per root path
-    private List<EventListener> listeners = new ArrayList<EventListener>();
-    
+    private List<EventListener> listeners = new ArrayList<>();
+
     class RootListener implements EventListener {
         private final String path;
-        
+
         RootListener(String path) {
             this.path = path;
         }
-        
+
+        @Override
         public void onEvent(EventIterator it) {
             log.debug("Change detected under {}, will reload list of test paths", path);
             lastModified = System.currentTimeMillis();
         }
     };
-    
-    protected void activate(ComponentContext ctx) throws Exception {
-        pid = (String)ctx.getProperties().get(Constants.SERVICE_PID);
+
+    protected void activate(final Map<String, Object> props) throws Exception {
+        pid = (String)props.get(Constants.SERVICE_PID);
         session = repository.loginAdministrative(repository.getDefaultWorkspace());
-        Map<String, Object> auth = new HashMap<String, Object>();
+        Map<String, Object> auth = new HashMap<>();
         auth.put(JcrResourceConstants.AUTHENTICATION_INFO_SESSION, session);
         resolver = resolverFactory.getResourceResolver(auth);
-        
+
         // Copy resource resolver paths and make sure they end with a /
         final String [] paths = resolver.getSearchPath();
         allowedRoots = new String[paths.length];
@@ -131,9 +128,9 @@ public class ScriptableTestsProvider imp
                 allowedRoots[i] += "/";
             }
         }
-        
+
         // Listen to changes to sling:Test nodes under allowed roots
-        final int eventTypes = 
+        final int eventTypes =
             Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED;
         final boolean isDeep = true;
         final boolean noLocal = true;
@@ -144,13 +141,13 @@ public class ScriptableTestsProvider imp
             listeners.add(listener);
             session.getWorkspace().getObservationManager().addEventListener(listener, eventTypes, path, isDeep, uuid, nodeTypes, noLocal);
             log.debug("Listening for JCR events under {}", path);
-            
+
         }
-        
+
         log.info("Activated, will look for test resources under {}", Arrays.asList(allowedRoots));
     }
-    
-    protected void deactivate(ComponentContext ctx) throws RepositoryException {
+
+    protected void deactivate() throws RepositoryException {
         if (resolver != null) {
             resolver.close();
             resolver = null;
@@ -164,18 +161,19 @@ public class ScriptableTestsProvider imp
         }
         session = null;
     }
-    
+
+    @Override
     public Class<?> createTestClass(String testName) throws ClassNotFoundException {
         if(!testName.equals(TEST_CLASS_NAME)) {
             throw new ClassNotFoundException(testName + " - the only valid name is " + TEST_CLASS_NAME);
         }
-        
+
         try {
             maybeQueryTestResources();
         } catch(Exception e) {
             throw new RuntimeException("Exception in maybeQueryTestResources()", e);
         }
-        
+
         if(testPaths.size() == 0) {
             return ExplainTests.class;
         } else {
@@ -184,29 +182,31 @@ public class ScriptableTestsProvider imp
         }
     }
 
+    @Override
     public String getServicePid() {
         return pid;
     }
 
+    @Override
     public List<String> getTestNames() {
         // We have a single test to run, would be better to have one
         // test class per test resource but that looks harder. Maybe
-        // use the Sling compiler to generate test classes? 
-        final List<String> result = new LinkedList<String>();
+        // use the Sling compiler to generate test classes?
+        final List<String> result = new LinkedList<>();
         result.add(TEST_CLASS_NAME);
         return result;
     }
-    
+
     private List<String> maybeQueryTestResources() throws RepositoryException {
         if(lastModified <= lastReloaded) {
             log.debug("No changes detected, keeping existing list of {} test resources", testPaths.size());
             return testPaths;
         }
-        
+
         log.info("Changes detected, reloading list of test resources");
         final long reloadTime = System.currentTimeMillis();
-        final List<String> newList = new LinkedList<String>();
-        
+        final List<String> newList = new LinkedList<>();
+
         for(String root : allowedRoots) {
             final String statement = "/jcr:root" + root + "/element(*, " + SLING_TEST_NODETYPE + ")";
             log.debug("Querying for test nodes: {}", statement);
@@ -219,23 +219,24 @@ public class ScriptableTestsProvider imp
                 log.debug("Test resource found: {}", path);
             }
         }
-        log.info("List of test resources updated, {} resource(s) found under {}", 
+        log.info("List of test resources updated, {} resource(s) found under {}",
                 newList.size(), Arrays.asList(allowedRoots));
 
         synchronized (testPaths) {
             testPaths.clear();
             testPaths.addAll(newList);
         }
-        
+
         lastReloaded = reloadTime;
-        
+
         return testPaths;
     }
-    
+
+    @Override
     public long lastModified() {
         return lastModified;
     }
-    
+
     static TestContext getTestContext() {
         return testContext.get();
     }

Modified: sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/TestServletOutputStream.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/TestServletOutputStream.java?rev=1794605&r1=1794604&r2=1794605&view=diff
==============================================================================
--- sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/TestServletOutputStream.java (original)
+++ sling/trunk/testing/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/TestServletOutputStream.java Tue May  9 16:10:00 2017
@@ -20,19 +20,29 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
 
 /** Output stream for our fake HTTP response class */
 public class TestServletOutputStream extends ServletOutputStream {
 
     private final ByteArrayOutputStream bos = new ByteArrayOutputStream();
-    
+
     @Override
     public String toString() {
         return bos.toString();
     }
-    
+
     @Override
     public void write(int b) throws IOException {
         bos.write(b);
     }
+
+    @Override
+    public boolean isReady() {
+        return true;
+    }
+
+    @Override
+    public void setWriteListener(WriteListener writeListener) {
+    }
 }