This is an automated email from the ASF dual-hosted git repository. jsedding pushed a commit to branch resolver-2.x-backports in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git
commit 64397ffacf0debcd7a608825b12d1305563d73d2 Author: Carsten Ziegeler <[email protected]> AuthorDate: Fri Mar 28 06:37:12 2025 +0100 SLING-12608 : Implement Jakarta Servlet based Sling API (#52) * backport: retain only changes *not* related to Jakarta Servlet * Update dependency to latest API with jakarta support * Implement SlingServletResolver, fix test cases * Fix test cases * Use Sling api to wrap request/response * Use servlet wrapper from api * Support jakarta servlet registration * Try to use latest pax exam for java 17 support * Adjust pom * Fix some pax exam tests * Fix pax exam tests * Clean up pom * Remove dependency to outdated commons testing * Use Testing Paxexam 4.1.0 * Remove temporary optional import (cherry picked from commit e76580daf56902318fc147b9928de0c6dbf5fe97) --- pom.xml | 71 +++---- .../resolver/internal/SlingServletResolver.java | 2 +- .../defaults/DefaultErrorHandlerServlet.java | 22 +-- .../internal/SecureRequestsOptingServletTest.java | 49 +++-- .../defaults/DefaultErrorHandlerServletTest.java | 56 ++++-- .../resolver/internal/helper/HelperTestBase.java | 41 ++-- .../internal/helper/LocationCollectorTest.java | 51 +++-- .../internal/helper/ResourceCollectorTest.java | 69 ++++--- .../internal/helper/ScriptSelectionTest.java | 4 +- .../internal/resourcehiding/ServletHidingTest.java | 15 +- .../sling/servlets/resolver/it/SLING10478IT.java | 30 ++- .../resolver/it/ScriptEngineManagerMock.java | 29 +++ .../resolver/it/ServletResolverTestSupport.java | 206 ++++++++++++--------- .../servlets/resolver/it/ServletResourceIT.java | 22 +-- .../servlets/resolver/it/TestResourceProvider.java | 18 -- 15 files changed, 405 insertions(+), 280 deletions(-) diff --git a/pom.xml b/pom.xml index d1529d2..f20b388 100644 --- a/pom.xml +++ b/pom.xml @@ -36,14 +36,15 @@ <scm> <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git</connection> <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git</developerConnection> - <tag>org.apache.sling.servlets.resolver-2.11.10</tag> + <tag>resolver-2.x</tag> <url>https://github.com/apache/sling-org-apache-sling-servlets-resolver.git</url> </scm> <properties> <project.build.outputTimestamp>2025-07-11T14:46:48Z</project.build.outputTimestamp> <site.jira.version.id>12314292</site.jira.version.id> - <org.ops4j.pax.exam.version>4.13.3</org.ops4j.pax.exam.version> + <sling.java.version>17</sling.java.version> + <org.ops4j.pax.exam.version>4.14.0</org.ops4j.pax.exam.version> <!-- To debug the pax process, override this with -D --> <pax.vm.options>-Xmx512M</pax.vm.options> </properties> @@ -55,11 +56,10 @@ <version>1.0.4</version> <scope>provided</scope> </dependency> - <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> - <version>2.14.0</version> + <version>2.18.0</version> <scope>provided</scope> </dependency> <dependency> @@ -80,12 +80,13 @@ <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> + <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> - <groupId>jakarta.json</groupId> - <artifactId>jakarta.json-api</artifactId> - <version>2.0.2</version> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.commons.johnzon</artifactId> + <version>2.0.0</version> <scope>provided</scope> </dependency> <dependency> @@ -98,7 +99,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.serviceusermapper</artifactId> - <version>1.2.0</version> + <version>1.5.8</version> <scope>provided</scope> </dependency> <dependency> @@ -132,7 +133,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> - <version>3.4</version> + <version>3.17.0</version> <scope>provided</scope> </dependency> <dependency> @@ -186,13 +187,13 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.paxexam</artifactId> - <version>3.1.0</version> + <version>4.1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.commons.testing</artifactId> - <version>2.1.2</version> + <artifactId>org.apache.sling.auth.core</artifactId> + <version>1.7.0</version> <scope>test</scope> </dependency> <dependency> @@ -201,6 +202,12 @@ <version>2.9.2</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.resourceresolver</artifactId> + <version>1.10.0</version> + <scope>test</scope> + </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.osgi-mock.core</artifactId> @@ -238,7 +245,7 @@ <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> - <version>3.9.0</version> + <version>5.15.2</version> <scope>test</scope> </dependency> <dependency> @@ -283,30 +290,6 @@ <version>7.0.5</version> <scope>test</scope> </dependency> - <dependency> - <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.servlet-helpers</artifactId> - <version>1.4.2</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.resourceresolver</artifactId> - <version>1.10.0</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.scripting.core</artifactId> - <version>2.2.0</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.glassfish</groupId> - <artifactId>jakarta.json</artifactId> - <version>2.0.1</version> - <scope>test</scope> - </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-atinject_1.0_spec</artifactId> @@ -405,16 +388,10 @@ <artifactId>maven-failsafe-plugin</artifactId> <configuration> <redirectTestOutputToFile>true</redirectTestOutputToFile> - <systemProperties> - <property> - <name>bundle.filename</name> - <value>${basedir}/target/${project.build.finalName}.jar</value> - </property> - <property> - <name>pax.vm.options</name> - <value>${pax.vm.options}</value> - </property> - </systemProperties> + <systemPropertyVariables> + <bundle.filename>${basedir}/target/${project.build.finalName}.jar</bundle.filename> + <pax.vm.options>${pax.vm.options}</pax.vm.options> + </systemPropertyVariables> </configuration> <executions> <execution> diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java b/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java index a860cb0..f3f9c63 100644 --- a/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java +++ b/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java @@ -184,7 +184,7 @@ public class SlingServletResolver implements ServletResolver, SlingRequestListen servlet = resolveServletInternal(request, null, resourceType, scriptResolver); } - // last resort, use the core bundle default servlet + // last resort, use the default servlet if (servlet == null) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("No specific servlet found, trying default"); diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java index af1fddf..e4bcfca 100644 --- a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java +++ b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java @@ -19,6 +19,7 @@ package org.apache.sling.servlets.resolver.internal.defaults; import javax.servlet.GenericServlet; +import javax.servlet.RequestDispatcher; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; @@ -32,7 +33,6 @@ import java.io.StringWriter; import jakarta.json.Json; import jakarta.json.stream.JsonGenerator; -import org.apache.sling.api.SlingConstants; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.request.RequestProgressTracker; import org.apache.sling.api.request.ResponseUtil; @@ -67,10 +67,10 @@ public class DefaultErrorHandlerServlet extends GenericServlet { public void service(ServletRequest req, ServletResponse res) throws IOException { // get settings - Integer scObject = (Integer) req.getAttribute(SlingConstants.ERROR_STATUS); - String statusMessage = (String) req.getAttribute(SlingConstants.ERROR_MESSAGE); - String requestUri = (String) req.getAttribute(SlingConstants.ERROR_REQUEST_URI); - String servletName = (String) req.getAttribute(SlingConstants.ERROR_SERVLET_NAME); + Integer scObject = (Integer) req.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); + String statusMessage = (String) req.getAttribute(RequestDispatcher.ERROR_MESSAGE); + String requestUri = (String) req.getAttribute(RequestDispatcher.ERROR_REQUEST_URI); + String servletName = (String) req.getAttribute(RequestDispatcher.ERROR_SERVLET_NAME); // ensure values int statusCode = (scObject != null) ? scObject.intValue() : HttpServletResponse.SC_INTERNAL_SERVER_ERROR; @@ -107,8 +107,8 @@ public class DefaultErrorHandlerServlet extends GenericServlet { final PrintWriter escapingWriter = new PrintWriter(ResponseUtil.getXmlEscapingWriter(pw)); // dump the stack trace - if (req.getAttribute(SlingConstants.ERROR_EXCEPTION) instanceof Throwable) { - final Throwable throwable = (Throwable) req.getAttribute(SlingConstants.ERROR_EXCEPTION); + if (req.getAttribute(RequestDispatcher.ERROR_EXCEPTION) instanceof Throwable) { + final Throwable throwable = (Throwable) req.getAttribute(RequestDispatcher.ERROR_EXCEPTION); pw.println("<h3>Exception:</h3>"); pw.println("<pre>"); pw.flush(); @@ -153,7 +153,7 @@ public class DefaultErrorHandlerServlet extends GenericServlet { jsonGenerator.writeStartObject(); jsonGenerator.write("status", statusCode); - String msg = (String) req.getAttribute(SlingConstants.ERROR_MESSAGE); + String msg = (String) req.getAttribute(RequestDispatcher.ERROR_MESSAGE); if (msg != null && !msg.isEmpty()) { jsonGenerator.write("message", statusMessage); } @@ -168,7 +168,7 @@ public class DefaultErrorHandlerServlet extends GenericServlet { // SLING-10615 - for backward compatibility check for either a // String or Class value - Object exceptionTypeObj = req.getAttribute(SlingConstants.ERROR_EXCEPTION_TYPE); + Object exceptionTypeObj = req.getAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE); String exceptionType = null; if (exceptionTypeObj instanceof String) { exceptionType = (String) exceptionTypeObj; @@ -180,8 +180,8 @@ public class DefaultErrorHandlerServlet extends GenericServlet { } // dump the stack trace - if (req.getAttribute(SlingConstants.ERROR_EXCEPTION) instanceof Throwable) { - final Throwable throwable = (Throwable) req.getAttribute(SlingConstants.ERROR_EXCEPTION); + if (req.getAttribute(RequestDispatcher.ERROR_EXCEPTION) instanceof Throwable) { + final Throwable throwable = (Throwable) req.getAttribute(RequestDispatcher.ERROR_EXCEPTION); try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) { printStackTrace(pw, throwable); diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java index 1572ef4..257d0e1 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java @@ -25,36 +25,38 @@ import java.util.HashMap; import java.util.Map; import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.request.builder.Builders; import org.apache.sling.api.resource.PersistenceException; +import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.servlets.OptingServlet; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; +import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper; import org.apache.sling.servlets.resolver.internal.helper.HelperTestBase; import org.apache.sling.servlets.resolver.internal.resource.MockServletResource; import org.apache.sling.servlets.resolver.internal.resource.ServletResource; import org.junit.Test; +import org.mockito.Mockito; import org.osgi.framework.Bundle; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.fail; +@SuppressWarnings("deprecation") public class SecureRequestsOptingServletTest extends SlingServletResolverTestBase { protected static final String SERVLET_PATH = "/mock"; protected static final String SERVLET_NAME = "TestServlet"; protected static final String SERVLET_EXTENSION = "html"; + protected static final String RESOURCE_TYPE = "foo/bar"; + private Servlet testServlet; protected void defineTestServlets(Bundle bundle) { testServlet = new SecureRequestsOptingServlet(); - String path = "/" - + MockSlingHttpServletRequest.RESOURCE_TYPE - + "/" - + ResourceUtil.getName(MockSlingHttpServletRequest.RESOURCE_TYPE) - + ".servlet"; + String path = "/" + RESOURCE_TYPE + "/" + ResourceUtil.getName(RESOURCE_TYPE) + ".servlet"; Map<String, Object> props = new HashMap<>(); props.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, path); props.put("sling:resourceSuperType", ServletResource.DEFAULT_RESOURCE_SUPER_TYPE); @@ -72,26 +74,43 @@ public class SecureRequestsOptingServletTest extends SlingServletResolverTestBas @Test public void testAcceptsSecureRequest() { - MockSlingHttpServletRequest secureRequest = - new MockSlingHttpServletRequest(SERVLET_PATH, null, SERVLET_EXTENSION, null, null); - secureRequest.setResourceResolver(mockResourceResolver); - secureRequest.setSecure(true); + final Resource resource = Mockito.mock(Resource.class); + Mockito.when(resource.getResourceType()).thenReturn(RESOURCE_TYPE); + Mockito.when(resource.getPath()).thenReturn("/" + RESOURCE_TYPE); + + SlingHttpServletRequest secureRequest = new SecureRequest(Builders.newRequestBuilder(resource) + .withExtension(SERVLET_EXTENSION) + .build()); Servlet result = servletResolver.resolveServlet(secureRequest); assertEquals("Expecting our test servlet", testServlet, result); } @Test public void testIgnoreInsecureRequest() { - MockSlingHttpServletRequest insecureRequest = - new MockSlingHttpServletRequest(SERVLET_PATH, null, SERVLET_EXTENSION, null, null); - insecureRequest.setResourceResolver(mockResourceResolver); - insecureRequest.setSecure(false); + final Resource resource = Mockito.mock(Resource.class); + Mockito.when(resource.getResourceType()).thenReturn(RESOURCE_TYPE); + Mockito.when(resource.getPath()).thenReturn("/" + RESOURCE_TYPE); + + SlingHttpServletRequest insecureRequest = Builders.newRequestBuilder(resource) + .withExtension(SERVLET_EXTENSION) + .build(); Servlet result = servletResolver.resolveServlet(insecureRequest); assertNotSame( "Expecting a different servlet than our own", result.getClass(), SecureRequestsOptingServlet.class); } - @SuppressWarnings("serial") + public static class SecureRequest extends SlingHttpServletRequestWrapper { + + public SecureRequest(final SlingHttpServletRequest request) { + super(request); + } + + @Override + public boolean isSecure() { + return true; + } + } + private static class SecureRequestsOptingServlet extends HttpServlet implements OptingServlet { @Override diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java index e6d11c7..8201a7e 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServletTest.java @@ -34,9 +34,14 @@ import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.json.JsonReader; import org.apache.sling.api.SlingConstants; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletResponse; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.SlingHttpServletResponse; +import org.apache.sling.api.request.builder.Builders; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper; +import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper; import org.junit.Test; +import org.mockito.Mockito; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -44,17 +49,19 @@ import static org.junit.Assert.assertTrue; /** * SLING-10021 test 'Accept' content-type handling in the default error handler servlet */ +@SuppressWarnings("deprecation") public class DefaultErrorHandlerServletTest { - protected void assertJsonErrorResponse(MockSlingHttpServletRequest req) throws ServletException, IOException { - MockSlingHttpServletResponse res = new MockErrorSlingHttpServletResponse(false); + protected void assertJsonErrorResponse(SlingHttpServletRequest req) throws ServletException, IOException { + MockErrorSlingHttpServletResponse res = new MockErrorSlingHttpServletResponse( + Builders.newResponseBuilder().build(), false); DefaultErrorHandlerServlet errorServlet = new DefaultErrorHandlerServlet(); errorServlet.init(new MockServletConfig()); errorServlet.service(req, res); // verify we got json back - assertEquals("application/json", res.getContentType()); + assertEquals("application/json;charset=UTF-8", res.getContentType()); String responseOutput = res.getOutput().toString(); // check the json content matches what would be sent from the DefaultErrorHandlingServlet @@ -72,8 +79,13 @@ public class DefaultErrorHandlerServletTest { @Test public void testJsonErrorResponse() throws IOException, ServletException { + final Resource resource = Mockito.mock(Resource.class); + final SlingHttpServletRequest request = + Builders.newRequestBuilder(resource).build(); + // mock a request that accepts a json response - MockSlingHttpServletRequest req = new MockErrorSlingHttpServletRequest("application/json,*/*;q=0.9"); + MockErrorSlingHttpServletRequest req = + new MockErrorSlingHttpServletRequest(request, "application/json,*/*;q=0.9"); assertJsonErrorResponse(req); } @@ -83,8 +95,12 @@ public class DefaultErrorHandlerServletTest { */ @Test public void testJsonErrorResponseWithClassExceptionTypeAttributeValue() throws IOException, ServletException { + final Resource resource = Mockito.mock(Resource.class); + final SlingHttpServletRequest request = + Builders.newRequestBuilder(resource).build(); + // mock a request that accepts a json response - MockSlingHttpServletRequest req = new MockErrorSlingHttpServletRequest("application/json,*/*;q=0.9") { + SlingHttpServletRequest req = new MockErrorSlingHttpServletRequest(request, "application/json,*/*;q=0.9") { @Override public Object getAttribute(String name) { @@ -99,17 +115,22 @@ public class DefaultErrorHandlerServletTest { @Test public void testHtmlErrorResponse() throws IOException, ServletException { + final Resource resource = Mockito.mock(Resource.class); + final SlingHttpServletRequest request = + Builders.newRequestBuilder(resource).build(); + // mock a request that accepts an html response - MockSlingHttpServletRequest req = - new MockErrorSlingHttpServletRequest("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); - MockSlingHttpServletResponse res = new MockErrorSlingHttpServletResponse(false); + SlingHttpServletRequest req = new MockErrorSlingHttpServletRequest( + request, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); + MockErrorSlingHttpServletResponse res = new MockErrorSlingHttpServletResponse( + Builders.newResponseBuilder().build(), false); DefaultErrorHandlerServlet errorServlet = new DefaultErrorHandlerServlet(); errorServlet.init(new MockServletConfig()); errorServlet.service(req, res); // verify we got html back - assertEquals("text/html", res.getContentType()); + assertEquals("text/html;charset=UTF-8", res.getContentType()); String responseOutput = res.getOutput().toString(); // check the html content matches what would be sent from the DefaultErrorHandlingServlet @@ -155,14 +176,14 @@ public class DefaultErrorHandlerServletTest { /** * Mock impl to simulate an error response */ - private static final class MockErrorSlingHttpServletResponse extends MockSlingHttpServletResponse { + private static final class MockErrorSlingHttpServletResponse extends SlingHttpServletResponseWrapper { private PrintWriter writer; private StringWriter strWriter; private boolean committed; - public MockErrorSlingHttpServletResponse(boolean committed) { - super(); + public MockErrorSlingHttpServletResponse(final SlingHttpServletResponse response, final boolean committed) { + super(response); this.committed = committed; } @@ -189,7 +210,6 @@ public class DefaultErrorHandlerServletTest { return this.writer; } - @Override public StringBuffer getOutput() { return strWriter.getBuffer(); } @@ -198,11 +218,11 @@ public class DefaultErrorHandlerServletTest { /** * Mock impl to simulate an error request */ - private static class MockErrorSlingHttpServletRequest extends MockSlingHttpServletRequest { + private static class MockErrorSlingHttpServletRequest extends SlingHttpServletRequestWrapper { private String accept; - private MockErrorSlingHttpServletRequest(String accept) { - super(null, null, null, null, null); + private MockErrorSlingHttpServletRequest(final SlingHttpServletRequest request, final String accept) { + super(request); this.accept = accept; } diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java index 2bd3980..097a4d5 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java @@ -22,22 +22,24 @@ import java.util.Collections; import java.util.Map; import junit.framework.TestCase; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.request.builder.Builders; +import org.apache.sling.api.request.builder.SlingHttpServletRequestBuilder; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceMetadata; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceUtil; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; import org.apache.sling.testing.resourceresolver.MockResourceResolverFactory; import org.apache.sling.testing.resourceresolver.MockResourceResolverFactoryOptions; import org.jetbrains.annotations.Nullable; +import org.mockito.Mockito; public abstract class HelperTestBase extends TestCase { protected MockResourceResolverFactoryOptions resourceResolverOptions; protected ResourceResolver resourceResolver; - protected MockSlingHttpServletRequest request; - protected Resource resource; protected String resourcePath; @@ -65,8 +67,6 @@ public abstract class HelperTestBase extends TestCase { Resource parent = getOrCreateParentResource(resourceResolver, resourcePath); resource = resourceResolver.create( parent, "page", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType)); - - request = makeRequest("GET", "print.a4", "html"); } public static Resource addOrReplaceResource(ResourceResolver resolver, String path, String resourceType) { @@ -113,13 +113,29 @@ public abstract class HelperTestBase extends TestCase { return parent; } - protected MockSlingHttpServletRequest makeRequest(String method, String selectors, String extension) { - final MockSlingHttpServletRequest result = - new MockSlingHttpServletRequest(resourcePath, selectors, extension, null, null); - result.setMethod(method); - result.setResourceResolver(resourceResolver); - result.setResource(resource); - return result; + protected SlingHttpServletRequest makeRequest(String method, String selectors, String extension) { + final Resource rsrc = Mockito.mock(Resource.class); + final ResourceMetadata md = new ResourceMetadata(); + Mockito.when(rsrc.getResourceResolver()).thenReturn(resourceResolver); + Mockito.when(rsrc.getPath()).thenReturn(this.resource.getPath()); + Mockito.when(rsrc.getName()).thenReturn(this.resource.getName()); + Mockito.when(rsrc.getResourceType()).thenReturn(this.resource.getResourceType()); + md.setResolutionPath(rsrc.getPath()); + StringBuilder sb = new StringBuilder(); + sb.append("."); + if (selectors != null) { + sb.append(selectors); + sb.append("."); + } + sb.append(extension); + md.setResolutionPathInfo(sb.toString()); + SlingHttpServletRequestBuilder builder = Builders.newRequestBuilder(rsrc); + builder.withExtension(extension); + if (selectors != null) { + builder.withSelectors(selectors.split("\\.")); + } + builder.withRequestMethod(method); + return builder.build(); } @Override @@ -127,7 +143,6 @@ public abstract class HelperTestBase extends TestCase { super.tearDown(); resourceResolver = null; - request = null; resource = null; } } diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationCollectorTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationCollectorTest.java index c186708..11631ed 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationCollectorTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationCollectorTest.java @@ -24,12 +24,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.request.builder.Builders; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.resource.SyntheticResource; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; import org.apache.sling.testing.mock.sling.junit.SlingContext; import org.junit.Before; import org.junit.Rule; @@ -64,6 +65,7 @@ public class LocationCollectorTest { public final SlingContext context = new SlingContext(); SearchPathOptions searchPathOptions = new SearchPathOptions(); + protected String resourcePath; protected String resourceType; protected String resourceTypePath; @@ -71,7 +73,6 @@ public class LocationCollectorTest { protected String resourceSuperTypePath; protected Resource resource; - protected MockSlingHttpServletRequest request; protected ResourceResolver resolver; // required because of the spy @@ -92,15 +93,19 @@ public class LocationCollectorTest { Resource parent = resolver.getResource("/content"); resource = resolver.create( parent, "page", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType)); + } - request = new MockSlingHttpServletRequest(resourcePath, "print.A4", "html", null, null); - request.setMethod("GET"); - request.setResourceResolver(resolver); - request.setResource(resource); + protected SlingHttpServletRequest createRequest(final Resource r) { + return Builders.newRequestBuilder(r) + .withExtension("html") + .withSelectors("print", "A4") + .withRequestMethod("GET") + .build(); } @Test public void testSearchPathEmpty() { + final SlingHttpServletRequest request = this.createRequest(this.resource); // expect path gets { "/" } searchPathOptions.setSearchPaths(null); @@ -115,6 +120,7 @@ public class LocationCollectorTest { @Test public void testSearchPath1Element() { + final SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; searchPathOptions.setSearchPaths(new String[] {root0}); @@ -129,6 +135,7 @@ public class LocationCollectorTest { @Test public void testSearchPath2Elements() { + final SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; String root1 = "/libs/"; searchPathOptions.setSearchPaths(new String[] {root0, root1}); @@ -152,7 +159,7 @@ public class LocationCollectorTest { * @param newResourceSuperType the new resource super type, or null to not change it * @return the new resource */ - protected void replaceResource(String newResourceType, String newResourceSuperType) { + protected Resource replaceResource(String newResourceType, String newResourceSuperType) { @SuppressWarnings("unchecked") Map<String, Object> props = new HashMap<>(resource.adaptTo(Map.class)); if (newResourceType != null) { @@ -162,11 +169,12 @@ public class LocationCollectorTest { props.put("sling:resourceSuperType", newResourceSuperType); } Resource r = addOrReplaceResource(resolver, resource.getPath(), props); - request.setResource(r); + return r; } @Test public void testSearchPathEmptyAbsoluteType() { + final SlingHttpServletRequest request = this.createRequest(this.resource); // expect path gets { "/" } searchPathOptions.setSearchPaths(null); @@ -186,13 +194,14 @@ public class LocationCollectorTest { @Test public void testSearchPath1ElementAbsoluteType() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; searchPathOptions.setSearchPaths(new String[] {root0}); // absolute resource type resourceType = "/foo/bar"; resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType); - replaceResource(resourceType, null); + request = this.createRequest(replaceResource(resourceType, null)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); @@ -205,6 +214,7 @@ public class LocationCollectorTest { @Test public void testSearchPath2ElementsAbsoluteType() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; String root1 = "/libs/"; searchPathOptions.setSearchPaths(new String[] {root0, root1}); @@ -212,7 +222,7 @@ public class LocationCollectorTest { // absolute resource type resourceType = "/foo/bar"; resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType); - replaceResource(resourceType, null); + request = this.createRequest(replaceResource(resourceType, null)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); @@ -226,13 +236,14 @@ public class LocationCollectorTest { @Test public void testSearchPathEmptyWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); // expect path gets { "/" } searchPathOptions.setSearchPaths(null); // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(null, resourceSuperType); + request = this.createRequest(replaceResource(null, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); @@ -246,13 +257,14 @@ public class LocationCollectorTest { @Test public void testSearchPath1ElementWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; searchPathOptions.setSearchPaths(new String[] {root0}); // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(null, resourceSuperType); + request = this.createRequest(replaceResource(null, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); @@ -266,6 +278,7 @@ public class LocationCollectorTest { @Test public void testSearchPath2ElementsWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; String root1 = "/libs/"; searchPathOptions.setSearchPaths(new String[] {root0, root1}); @@ -273,7 +286,7 @@ public class LocationCollectorTest { // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(null, resourceSuperType); + request = this.createRequest(replaceResource(null, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); @@ -290,6 +303,7 @@ public class LocationCollectorTest { @Test public void testSearchPathEmptyAbsoluteTypeWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); // expect path gets { "/" } searchPathOptions.setSearchPaths(null); @@ -300,7 +314,7 @@ public class LocationCollectorTest { // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(resourceType, resourceSuperType); + request = this.createRequest(replaceResource(resourceType, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); @@ -314,6 +328,7 @@ public class LocationCollectorTest { @Test public void testSearchPath1ElementAbsoluteTypeWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; searchPathOptions.setSearchPaths(new String[] {root0}); @@ -324,7 +339,7 @@ public class LocationCollectorTest { // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(resourceType, resourceSuperType); + request = this.createRequest(replaceResource(resourceType, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); @@ -338,6 +353,7 @@ public class LocationCollectorTest { @Test public void testSearchPath2ElementsAbsoluteTypeWithSuper() { + SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; String root1 = "/libs/"; searchPathOptions.setSearchPaths(new String[] {root0, root1}); @@ -349,7 +365,7 @@ public class LocationCollectorTest { // set resource super type resourceSuperType = "foo:superBar"; resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType); - replaceResource(resourceType, resourceSuperType); + request = this.createRequest(replaceResource(resourceType, resourceSuperType)); final Resource r = request.getResource(); List<Resource> loc = getLocations(r.getResourceType(), r.getResourceSuperType()); @@ -365,6 +381,7 @@ public class LocationCollectorTest { @Test public void testScriptNameWithoutResourceType() { + final SlingHttpServletRequest request = this.createRequest(this.resource); String root0 = "/apps/"; String root1 = "/libs/"; searchPathOptions.setSearchPaths(new String[] {root0, root1}); @@ -518,6 +535,7 @@ public class LocationCollectorTest { @Test public void checkThatTheCacheIsUsed() { + final SlingHttpServletRequest request = this.createRequest(this.resource); // skip if the test runs without caching if (!useResourceCaching) { @@ -552,6 +570,7 @@ public class LocationCollectorTest { @Test public void testWithCacheMapKeyAlreadyUsed() { + final SlingHttpServletRequest request = this.createRequest(this.resource); // if the cacheKey in the ResourceResolverMap is already used, make sure that it's not overwritten // this is an adapted copy of the testSearchPath1Element testcase diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java index 0383f61..3ee4105 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java @@ -26,6 +26,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceUtil; @@ -41,6 +42,7 @@ public class ResourceCollectorTest extends HelperTestBase { } public void testGetServlets0() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { "/" + label + ".esp", // 0 "/GET.esp", // 1 @@ -55,10 +57,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 1, 0, 0, 1, 0, 1, 0, 1}; int[] indices = {7, 5, 6, 4, 2, 3, 0, 1}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServlets1() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { "/" + label + ".esp", // 0 "/GET.esp", // 1 @@ -73,10 +76,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; int[] indices = {7, 6, 3, 2, 0, 1}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServlets2() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { "/" + label + ".esp", // 0 "/GET.esp", // 1 @@ -92,10 +96,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; int[] indices = {8, 7, 2, 3, 0, 1}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServlets3() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { ".servlet", // 0 "/" + label + ".esp", // 1 @@ -112,10 +117,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; int[] indices = {9, 8, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServlets4() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { ".servlet", // 0 "/" + label + ".esp", // 1 @@ -133,10 +139,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1}; int[] indices = {10, 9, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServletsWithMethod() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { "/html.servlet", // 7 "/html.GET.servlet" @@ -145,10 +152,11 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {1, 1}; int[] indices = {1, 0}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testGetServletsScriptExtensionsPriority() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); String[] names = { ".servlet", // 0 "/" + label + ".esp", // 1 @@ -169,7 +177,7 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0}; int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices, new ArrayList<String>() { + effectiveTest(req, names, baseIdxs, indices, new ArrayList<String>() { private static final long serialVersionUID = -2278401285444759128L; { @@ -182,6 +190,7 @@ public class ResourceCollectorTest extends HelperTestBase { } public void testGetServletsScriptExtensionsPriority2() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); // scripts with extensions not registered by script engine factories String[] names = { ".servlet", // 0 @@ -204,7 +213,7 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0}; int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices, new ArrayList<String>() { + effectiveTest(req, names, baseIdxs, indices, new ArrayList<String>() { private static final long serialVersionUID = 4918721764309621104L; { @@ -215,6 +224,7 @@ public class ResourceCollectorTest extends HelperTestBase { } public void testGetServletsScriptExtensionsPriority3() { + SlingHttpServletRequest req = makeRequest("GET", "print.a4", "html"); // scripts with extensions not registered by script engine factories String[] names = { ".servlet", // 0 @@ -237,7 +247,7 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0}; int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices, new ArrayList<String>() { + effectiveTest(req, names, baseIdxs, indices, new ArrayList<String>() { private static final long serialVersionUID = 1527098044127506711L; { @@ -249,7 +259,7 @@ public class ResourceCollectorTest extends HelperTestBase { public void testAnyServlets0() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { "/" + label + ".ANY.esp", // 0 @@ -265,12 +275,12 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 1, 0, 0, 1, 0, 1, 0, 1}; int[] indices = {7, 5, 6, 4, 2, 3, 0, 1}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testAnyServlets1() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { "/" + label + ".ANY.esp", // 0 @@ -286,12 +296,12 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; int[] indices = {7, 6, 3, 2, 0, 1}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testAnyServlets2() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { "/" + label + ".ANY.esp", // 0 @@ -308,12 +318,12 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; int[] indices = {8, 7, 2, 3, 0, 1}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testAnyServlets3() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { ".servlet", // 0 @@ -331,12 +341,12 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; int[] indices = {9, 8, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testAnyServlets4() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { ".servlet", // 0 @@ -355,12 +365,12 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1}; int[] indices = {10, 9, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices); + effectiveTest(req, names, baseIdxs, indices); } public void testAnyServletsScriptExtensionsPriority() { // use a request with another request method "ANY" - request.setMethod("ANY"); + SlingHttpServletRequest req = makeRequest("ANY", "print.a4", "html"); String[] names = { ".servlet", // 0 @@ -382,7 +392,7 @@ public class ResourceCollectorTest extends HelperTestBase { int[] baseIdxs = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0}; int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0}; - effectiveTest(names, baseIdxs, indices, new ArrayList<String>() { + effectiveTest(req, names, baseIdxs, indices, new ArrayList<String>() { private static final long serialVersionUID = 3909592432283252117L; { @@ -394,11 +404,16 @@ public class ResourceCollectorTest extends HelperTestBase { }); } - protected void effectiveTest(String[] names, int[] baseIdxs, int[] indices) { - effectiveTest(names, baseIdxs, indices, null); + protected void effectiveTest(SlingHttpServletRequest r, String[] names, int[] baseIdxs, int[] indices) { + effectiveTest(r, names, baseIdxs, indices, null); } - protected void effectiveTest(String[] names, int[] baseIdxs, int[] indices, List<String> scriptEngineExtensions) { + protected void effectiveTest( + SlingHttpServletRequest r, + String[] names, + int[] baseIdxs, + int[] indices, + List<String> scriptEngineExtensions) { String[] base = {"/apps/" + resourceTypePath, "/libs/" + resourceTypePath}; @@ -412,12 +427,12 @@ public class ResourceCollectorTest extends HelperTestBase { pathMap.put(name, path); } - ResourceCollector lu = ResourceCollector.create(request, null, new String[] {"html"}, true); + ResourceCollector lu = ResourceCollector.create(r, null, new String[] {"html"}, true); Collection<Resource> res; if (scriptEngineExtensions != null) { - res = lu.getServlets(request.getResourceResolver(), scriptEngineExtensions); + res = lu.getServlets(r.getResourceResolver(), scriptEngineExtensions); } else { - res = lu.getServlets(request.getResourceResolver(), Collections.emptyList()); + res = lu.getServlets(r.getResourceResolver(), Collections.emptyList()); } Iterator<Resource> rIter = res.iterator(); diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java index 105e70e..9069a62 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java @@ -21,8 +21,8 @@ package org.apache.sling.servlets.resolver.internal.helper; import java.util.Collection; import java.util.Collections; +import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.resource.Resource; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; /** Various tests that explain and demonstrate how scripts are * selected. See the assertScript methods for how to interpret @@ -64,7 +64,7 @@ public class ScriptSelectionTest extends HelperTestBase { } // Create mock request and get scripts from ResourceCollector - final MockSlingHttpServletRequest req = makeRequest(method, selectors, extension); + final SlingHttpServletRequest req = makeRequest(method, selectors, extension); final ResourceCollector u = ResourceCollector.create(req, null, new String[] {"html"}, true); final Collection<Resource> s = u.getServlets(req.getResourceResolver(), Collections.emptyList()); diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/resourcehiding/ServletHidingTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/resourcehiding/ServletHidingTest.java index e7d366b..7a7cb54 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/resourcehiding/ServletHidingTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/resourcehiding/ServletHidingTest.java @@ -26,10 +26,13 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.request.builder.Builders; import org.apache.sling.api.resource.PersistenceException; +import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceUtil; +import org.apache.sling.api.resource.SyntheticResource; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; -import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest; import org.apache.sling.servlets.resolver.api.IgnoredServletResourcePredicate; import org.apache.sling.servlets.resolver.internal.SlingServletResolverTestBase; import org.apache.sling.servlets.resolver.internal.helper.HelperTestBase; @@ -46,6 +49,8 @@ public class ServletHidingTest extends SlingServletResolverTestBase { private static final String TEST_ID = UUID.randomUUID().toString(); + private static final String TEST_RESOURCE_TYPE = "foo/bar"; + protected static class TestServlet extends SlingSafeMethodsServlet { private final String id; @@ -77,15 +82,15 @@ public class ServletHidingTest extends SlingServletResolverTestBase { } private Servlet resolveServlet() { - MockSlingHttpServletRequest req = - new MockSlingHttpServletRequest(MockSlingHttpServletRequest.RESOURCE_TYPE, null, "html", null, null); - req.setResourceResolver(mockResourceResolver); + final Resource resource = new SyntheticResource(mockResourceResolver, "/content/foobar", TEST_RESOURCE_TYPE); + SlingHttpServletRequest req = + Builders.newRequestBuilder(resource).withExtension("html").build(); return servletResolver.resolveServlet(req); } @Override protected void defineTestServlets(Bundle bundle) { - registerServlet(TEST_ID, MockSlingHttpServletRequest.RESOURCE_TYPE); + registerServlet(TEST_ID, TEST_RESOURCE_TYPE); } private void assertResolvesToTestServletId(String info, boolean expectMatch) { diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/SLING10478IT.java b/src/test/java/org/apache/sling/servlets/resolver/it/SLING10478IT.java index 30dfd68..f63b07d 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/it/SLING10478IT.java +++ b/src/test/java/org/apache/sling/servlets/resolver/it/SLING10478IT.java @@ -28,7 +28,10 @@ import java.lang.reflect.InvocationTargetException; import jakarta.json.Json; import jakarta.json.stream.JsonGenerator; -import org.apache.sling.servlethelpers.MockSlingHttpServletResponse; +import org.apache.sling.api.SlingHttpServletResponse; +import org.apache.sling.api.request.builder.Builders; +import org.apache.sling.api.request.builder.SlingHttpServletResponseResult; +import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -92,11 +95,6 @@ public class SLING10478IT extends ServletResolverTestSupport { .register(bundleContext); } - @Override - protected MockSlingHttpServletResponse createMockSlingHttpServletResponse() { - return new HandleErrorMockSlingHttpServletResponse(); - } - /** * Test an error handling servlet that closes the response writer */ @@ -113,9 +111,16 @@ public class SLING10478IT extends ServletResolverTestSupport { checkErrorHandlerServlet("/not_real_path.noclose"); } + protected SlingHttpServletResponse createMockSlingHttpServletResponse() { + final SlingHttpServletResponse response = Builders.newResponseBuilder().build(); + return new HandleErrorMockSlingHttpServletResponse(response); + } + void checkErrorHandlerServlet(String path) throws Exception, InvocationTargetException { try { - final String output = executeRequest(M_GET, path, HttpServletResponse.SC_NOT_FOUND) + final SlingHttpServletResponse response = executeRequest(M_GET, path, HttpServletResponse.SC_NOT_FOUND); + final String output = ((SlingHttpServletResponseResult) + ((HandleErrorMockSlingHttpServletResponse) response).getResponse()) .getOutputAsString(); assertNotNull(output); assertTrue(output, output.contains("hello")); @@ -132,11 +137,16 @@ public class SLING10478IT extends ServletResolverTestSupport { /** * Subclass to simulate what the SlingHttpServletResponseImpl writer does */ - private static final class HandleErrorMockSlingHttpServletResponse extends MockSlingHttpServletResponse { + private static final class HandleErrorMockSlingHttpServletResponse extends SlingHttpServletResponseWrapper { + private HandleErrorResponseWriter writer = null; + public HandleErrorMockSlingHttpServletResponse(final SlingHttpServletResponse r) { + super(r); + } + @Override - public PrintWriter getWriter() { + public PrintWriter getWriter() throws IOException { if (writer == null) { writer = new HandleErrorResponseWriter(super.getWriter()); } @@ -144,7 +154,7 @@ public class SLING10478IT extends ServletResolverTestSupport { } @Override - public void flushBuffer() { + public void flushBuffer() throws IOException { if (!writer.isOpen()) { throw new IllegalStateException("Writer Already Closed"); } diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/ScriptEngineManagerMock.java b/src/test/java/org/apache/sling/servlets/resolver/it/ScriptEngineManagerMock.java new file mode 100644 index 0000000..a1cb7cc --- /dev/null +++ b/src/test/java/org/apache/sling/servlets/resolver/it/ScriptEngineManagerMock.java @@ -0,0 +1,29 @@ +/* + * 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.servlets.resolver.it; + +import javax.script.ScriptEngineManager; + +import org.osgi.service.component.annotations.Component; + +@Component(service = ScriptEngineManager.class) +public class ScriptEngineManagerMock extends ScriptEngineManager { + + // nothing to do +} diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java index 6c42a9f..22303f3 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java +++ b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java @@ -19,33 +19,32 @@ package org.apache.sling.servlets.resolver.it; import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import java.lang.reflect.Method; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.SlingHttpServletResponse; +import org.apache.sling.api.request.builder.Builders; +import org.apache.sling.api.request.builder.SlingHttpServletResponseResult; +import org.apache.sling.api.resource.AbstractResource; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceMetadata; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.engine.SlingRequestProcessor; -import org.apache.sling.servlethelpers.MockSlingHttpServletRequest; -import org.apache.sling.servlethelpers.MockSlingHttpServletResponse; import org.apache.sling.testing.paxexam.TestSupport; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.ops4j.pax.exam.Configuration; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.options.extra.VMOption; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; -import static org.apache.sling.testing.paxexam.SlingOptions.sling; -import static org.apache.sling.testing.paxexam.SlingOptions.slingScripting; -import static org.apache.sling.testing.paxexam.SlingOptions.slingXss; -import static org.apache.sling.testing.paxexam.SlingOptions.versionResolver; -import static org.apache.sling.testing.paxexam.SlingVersionResolver.SLING_GROUP_ID; +import static org.apache.sling.testing.paxexam.SlingOptions.eventadmin; +import static org.apache.sling.testing.paxexam.SlingOptions.scr; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.ops4j.pax.exam.CoreOptions.composite; -import static org.ops4j.pax.exam.CoreOptions.junitBundles; import static org.ops4j.pax.exam.CoreOptions.mavenBundle; import static org.ops4j.pax.exam.CoreOptions.options; import static org.ops4j.pax.exam.CoreOptions.vmOption; @@ -56,15 +55,11 @@ import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration; public class ServletResolverTestSupport extends TestSupport { @Inject - private ResourceResolverFactory resourceResolverFactory; + protected ResourceResolverFactory resourceResolverFactory; @Inject protected BundleContext bundleContext; - @SuppressWarnings("unused") - @Inject - private SlingRequestProcessor slingRequestProcessor; - public static final String P_PATHS = "sling.servlet.paths"; public static final String P_RESOURCE_TYPES = "sling.servlet.resourceTypes"; public static final String P_METHODS = "sling.servlet.methods"; @@ -97,63 +92,101 @@ public class ServletResolverTestSupport extends TestSupport { } final int httpPort = findFreePort(); - versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.api"); - versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.resourceresolver"); - versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.scripting.core"); - versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.commons.johnzon"); - versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.engine"); - versionResolver.setVersion(SLING_GROUP_ID, "org.apache.sling.auth.core", "1.6.0"); - versionResolver.setVersion("commons-fileupload", "commons-fileupload", "1.5"); return options(composite( when(debugOption != null).useOptions(debugOption), when(vmOption != null).useOptions(vmOption), when(jacocoCommand != null).useOptions(jacocoCommand), baseConfiguration(), - sling(), - slingScripting(), - slingXss(), - factoryConfiguration("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended") - .put("user.mapping", new String[] { - "org.apache.sling.servlets.resolver:console=sling-readall", - "org.apache.sling.servlets.resolver:scripts=sling-scripting" - }) - .asOption(), + mavenBundle() + .groupId("org.apache.felix") + .artifactId("org.apache.felix.http.servlet-api") + .version("3.0.0"), + mavenBundle() + .groupId("org.apache.felix") + .artifactId("org.apache.felix.http.jetty12") + .version("1.0.26"), + scr(), + eventadmin(), mavenBundle() .groupId("org.osgi") .artifactId("org.osgi.util.converter") - .version("1.0.9"), // new Sling API dependency - testBundle(), + .version("1.0.9"), mavenBundle() .groupId("org.apache.sling") - .artifactId("org.apache.sling.scripting.spi") + .artifactId("org.apache.sling.commons.johnzon") .versionAsInProject(), + mavenBundle().groupId("commons-io").artifactId("commons-io").versionAsInProject(), + mavenBundle() + .groupId("commons-codec") + .artifactId("commons-codec") + .version("1.15"), + mavenBundle() + .groupId("org.apache.commons") + .artifactId("commons-lang3") + .versionAsInProject(), + mavenBundle() + .groupId("org.apache.commons") + .artifactId("commons-collections4") + .version("4.4"), mavenBundle() .groupId("org.apache.sling") - .artifactId("org.apache.sling.servlet-helpers") + .artifactId("org.apache.sling.commons.mime") .versionAsInProject(), mavenBundle() - .groupId("org.glassfish") - .artifactId("jakarta.json") + .groupId("org.apache.sling") + .artifactId("org.apache.sling.commons.osgi") + .version("2.4.2"), + mavenBundle() + .groupId("org.apache.sling") + .artifactId("org.apache.sling.api") .versionAsInProject(), - // mavenBundle() - .groupId("commons-codec") - .artifactId("commons-codec") - .version("1.15"), - // + .groupId("org.apache.sling") + .artifactId("org.apache.sling.scripting.spi") + .versionAsInProject(), + mavenBundle() + .groupId("org.apache.sling") + .artifactId("org.apache.sling.serviceusermapper") + .versionAsInProject(), mavenBundle() .groupId("org.apache.felix") .artifactId("org.apache.felix.healthcheck.api") .versionAsInProject(), - // - junitBundles(), + mavenBundle() + .groupId("org.apache.sling") + .artifactId("org.apache.sling.auth.core") + .versionAsInProject(), + mavenBundle() + .groupId("org.apache.sling") + .artifactId("org.apache.sling.resourceresolver") + .versionAsInProject(), + mavenBundle() + .groupId("org.apache.sling") + .artifactId("org.apache.sling.settings") + .version("1.4.2"), + mavenBundle() + .groupId("commons-fileupload") + .artifactId("commons-fileupload") + .version("1.5"), + mavenBundle() + .groupId("org.apache.sling") + .artifactId("org.apache.sling.engine") + .versionAsInProject(), + factoryConfiguration("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended") + .put("user.mapping", new String[] { + "org.apache.sling.servlets.resolver:console=sling-readall", + "org.apache.sling.servlets.resolver:scripts=sling-scripting" + }) + .asOption(), newConfiguration("org.apache.felix.http") .put("org.osgi.service.http.port", httpPort) .asOption(), newConfiguration("org.apache.sling.jcr.resource.internal.JcrResourceResolverFactoryImpl") .put("resource.resolver.required.providernames", "") .asOption(), - buildBundleWithBnd(TestResourceProvider.class, TestServiceUserValidator.class), + buildBundleWithBnd( + TestResourceProvider.class, TestServiceUserValidator.class, ScriptEngineManagerMock.class), + testBundle(), newConfiguration("org.apache.sling.jcr.base.internal.LoginAdminWhitelist") .put("whitelist.bundles.regexp", "^PAXEXAM.*$") .asOption(), @@ -166,45 +199,56 @@ public class ServletResolverTestSupport extends TestSupport { return testBundle("bundle.filename"); } - protected MockSlingHttpServletResponse executeRequest(final String path, final int expectedStatus) - throws Exception { + protected SlingHttpServletResponse createMockSlingHttpServletResponse() { + return Builders.newResponseBuilder().build(); + } + + protected SlingHttpServletResponse executeRequest(final String path, final int expectedStatus) throws Exception { return executeRequest("GET", path, expectedStatus); } - protected MockSlingHttpServletResponse executeRequest( - final String method, final String path, final int expectedStatus) throws Exception { + protected SlingHttpServletResponse executeRequest(final String method, final String path, final int expectedStatus) + throws Exception { final ResourceResolver resourceResolver = resourceResolverFactory.getAdministrativeResourceResolver(null); assertNotNull("Expecting ResourceResolver", resourceResolver); - final MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(resourceResolver) { + final Resource resource = new AbstractResource() { + @Override + public String getPath() { + return path; + } + + @Override + public @NotNull String getResourceType() { + return "foo/bar"; + } + + @Override + public @Nullable String getResourceSuperType() { + return null; + } + @Override - public String getMethod() { - return method; + public @NotNull ResourceMetadata getResourceMetadata() { + return new ResourceMetadata(); + } + + @Override + public @NotNull ResourceResolver getResourceResolver() { + return resourceResolver; } }; - request.setPathInfo(path); - final MockSlingHttpServletResponse response = createMockSlingHttpServletResponse(); - - // Get SlingRequestProcessor.processRequest method and execute request - // This module depends on an older version of the sling.engine module and I don't want - // to change it just for these tests, so using reflection to get the processor, as we're - // running with a more recent version of sling.engine in the pax exam environment - final String slingRequestProcessorClassName = "org.apache.sling.engine.SlingRequestProcessor"; - final ServiceReference<?> ref = bundleContext.getServiceReference(slingRequestProcessorClassName); - assertNotNull("Expecting service:" + slingRequestProcessorClassName, ref); - - final Object processor = bundleContext.getService(ref); + + final SlingHttpServletRequest request = + Builders.newRequestBuilder(resource).withRequestMethod(method).build(); + final SlingHttpServletResponse response = createMockSlingHttpServletResponse(); + + final ServiceReference<SlingRequestProcessor> ref = + bundleContext.getServiceReference(SlingRequestProcessor.class); + assertNotNull("Expecting service:" + SlingRequestProcessor.class, ref); + + final SlingRequestProcessor processor = bundleContext.getService(ref); try { - // void processRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse - // resource, ResourceResolver resourceResolver) - final Method processMethod = processor - .getClass() - .getMethod( - "processRequest", - HttpServletRequest.class, - HttpServletResponse.class, - ResourceResolver.class); - assertNotNull("Expecting processRequest method", processMethod); - processMethod.invoke(processor, request, response, resourceResolver); + processor.processRequest(request, response, resourceResolver); } finally { bundleContext.ungetService(ref); } @@ -219,10 +263,6 @@ public class ServletResolverTestSupport extends TestSupport { return response; } - protected MockSlingHttpServletResponse createMockSlingHttpServletResponse() { - return new MockSlingHttpServletResponse(); - } - protected void assertTestServlet(final String path, int expectedStatus) throws Exception { assertTestServlet(M_GET, path, expectedStatus); } @@ -237,8 +277,8 @@ public class ServletResolverTestSupport extends TestSupport { protected void assertTestServlet(final String method, final String path, final String servletName) throws Exception { - final String output = - executeRequest(method, path, TestServlet.IM_A_TEAPOT).getOutputAsString(); + final SlingHttpServletResponse response = executeRequest(method, path, TestServlet.IM_A_TEAPOT); + final String output = ((SlingHttpServletResponseResult) response).getOutputAsString(); final String expected = TestServlet.SERVED_BY_PREFIX + servletName; assertTrue("Expecting output to contain " + expected + ", got " + output, output.contains(expected)); } diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResourceIT.java b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResourceIT.java index 73d56ad..e7994c7 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResourceIT.java +++ b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResourceIT.java @@ -18,23 +18,22 @@ */ package org.apache.sling.servlets.resolver.it; -import javax.inject.Inject; import javax.script.ScriptException; import javax.servlet.Servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.IOException; import java.util.Dictionary; import java.util.Hashtable; import java.util.LinkedHashSet; import java.util.Set; +import java.util.jar.JarInputStream; import org.apache.sling.api.resource.LoginException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; -import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.api.servlets.ServletResolverConstants; import org.apache.sling.scripting.spi.bundle.BundledRenderUnit; import org.apache.sling.scripting.spi.bundle.TypeProvider; @@ -48,8 +47,8 @@ import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; import org.ops4j.pax.exam.spi.reactors.PerClass; -import org.ops4j.pax.tinybundles.core.TinyBundle; -import org.ops4j.pax.tinybundles.core.TinyBundles; +import org.ops4j.pax.tinybundles.TinyBundle; +import org.ops4j.pax.tinybundles.TinyBundles; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -63,19 +62,14 @@ public class ServletResourceIT extends ServletResolverTestSupport { private BundledRenderUnit bundledRenderUnit; - @Inject - private ResourceResolverFactory resourceResolverFactory; - - @Inject - private BundleContext bundleContext; - protected Option testBundle() { try { - TinyBundle bundle = TinyBundles.bundle().read(new FileInputStream(System.getProperty("bundle.filename"))); + TinyBundle bundle = TinyBundles.bundle() + .readIn(new JarInputStream(new FileInputStream(System.getProperty("bundle.filename")))); String header = bundle.getHeader("Export-Package"); - bundle.set("Export-Package", header + ",org.apache.sling.servlets.resolver.internal.bundle"); + bundle.setHeader("Export-Package", header + ",org.apache.sling.servlets.resolver.internal.bundle"); return streamBundle(bundle.build()).start(); - } catch (FileNotFoundException e) { + } catch (IOException e) { throw new RuntimeException(e); } } diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/TestResourceProvider.java b/src/test/java/org/apache/sling/servlets/resolver/it/TestResourceProvider.java index 65f6b6c..7c00e2c 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/it/TestResourceProvider.java +++ b/src/test/java/org/apache/sling/servlets/resolver/it/TestResourceProvider.java @@ -21,7 +21,6 @@ package org.apache.sling.servlets.resolver.it; import java.util.Iterator; import org.apache.sling.api.resource.Resource; -import org.apache.sling.spi.resource.provider.ProviderContext; import org.apache.sling.spi.resource.provider.ResolveContext; import org.apache.sling.spi.resource.provider.ResourceContext; import org.apache.sling.spi.resource.provider.ResourceProvider; @@ -34,8 +33,6 @@ import org.osgi.service.component.annotations.Component; property = {"provider.root=/"}) public class TestResourceProvider extends ResourceProvider<Void> { - public TestResourceProvider() {} - @Override public @Nullable Resource getResource( @NotNull ResolveContext<Void> ctx, @@ -49,19 +46,4 @@ public class TestResourceProvider extends ResourceProvider<Void> { public @Nullable Iterator<Resource> listChildren(@NotNull ResolveContext<Void> ctx, @NotNull Resource parent) { return null; } - - @Override - public void start(@NotNull ProviderContext ctx) { - super.start(ctx); - } - - @Override - public void stop() { - super.stop(); - } - - @Override - public void update(long changeSet) { - super.update(changeSet); - } }
