You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by dk...@apache.org on 2021/07/20 03:20:42 UTC
[sling-whiteboard] branch master updated: Updating the dynamic
transform servlet to allow for using a resource path
This is an automated email from the ASF dual-hosted git repository.
dklco pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git
The following commit(s) were added to refs/heads/master by this push:
new 97c1913 Updating the dynamic transform servlet to allow for using a resource path
97c1913 is described below
commit 97c19135d3a5f4f4bd330bce043603bd06601ba1
Author: Dan Klco <kl...@adobe.com>
AuthorDate: Mon Jul 19 23:20:30 2021 -0400
Updating the dynamic transform servlet to allow for using a resource path
---
.../internal/DynamicTransformServlet.java | 24 +++++---
.../thumbnails/internal/RenditionSupportImpl.java | 7 ++-
.../internal/DynamicTransformServletTest.java | 72 ++++++++++++++++++++++
.../thumbnails/internal/TransformServletTest.java | 52 +++++++++++++---
4 files changed, 136 insertions(+), 19 deletions(-)
diff --git a/org.apache.sling.thumbnails/src/main/java/org/apache/sling/thumbnails/internal/DynamicTransformServlet.java b/org.apache.sling.thumbnails/src/main/java/org/apache/sling/thumbnails/internal/DynamicTransformServlet.java
index 9c81b70..938e085 100644
--- a/org.apache.sling.thumbnails/src/main/java/org/apache/sling/thumbnails/internal/DynamicTransformServlet.java
+++ b/org.apache.sling.thumbnails/src/main/java/org/apache/sling/thumbnails/internal/DynamicTransformServlet.java
@@ -88,13 +88,11 @@ public class DynamicTransformServlet extends SlingAllMethodsServlet {
.forValue(Optional.ofNullable(request.getParameter("format")).orElse("jpeg"));
response.setHeader("Content-Disposition", "filename=" + resource.getName());
response.setContentType(format.getMimeType());
- ObjectMapper objectMapper = new ObjectMapper();
- List<TransformationHandlerConfigImpl> transformations = parsePostBody(request, objectMapper);
+ Transformation transformation = getTransformation(request);
- log.debug("Transforming resource: {} with transformation: {} to {}", resource, transformations, format);
- ByteArrayOutputStream baos = transform(resource, response, format.toString(),
- new TransformationImpl(transformations));
+ log.debug("Transforming resource: {} with transformation: {} to {}", resource, transformation, format);
+ ByteArrayOutputStream baos = transform(resource, response, format.toString(), transformation);
String renditionName = request.getParameter("renditionName");
if (StringUtils.isNotBlank(renditionName)) {
@@ -116,8 +114,20 @@ public class DynamicTransformServlet extends SlingAllMethodsServlet {
}
}
- private List<TransformationHandlerConfigImpl> parsePostBody(SlingHttpServletRequest request,
- ObjectMapper objectMapper) throws IOException {
+ private Transformation getTransformation(SlingHttpServletRequest request) throws IOException {
+ String transformationPath = request.getParameter("transformationResource");
+ if (StringUtils.isNotBlank(request.getParameter("transformationResource"))) {
+ return Optional.ofNullable(request.getResourceResolver().getResource(transformationPath))
+ .map(r -> r.adaptTo(Transformation.class)).orElseThrow(
+ () -> new BadRequestException("Requested invalid transformation: " + transformationPath));
+
+ } else {
+ return new TransformationImpl(parsePostBody(request));
+ }
+ }
+
+ private List<TransformationHandlerConfigImpl> parsePostBody(SlingHttpServletRequest request) throws IOException {
+ ObjectMapper objectMapper = new ObjectMapper();
try {
return objectMapper.readValue(request.getReader(),
new TypeReference<List<TransformationHandlerConfigImpl>>() {
diff --git a/org.apache.sling.thumbnails/src/main/java/org/apache/sling/thumbnails/internal/RenditionSupportImpl.java b/org.apache.sling.thumbnails/src/main/java/org/apache/sling/thumbnails/internal/RenditionSupportImpl.java
index cad8477..d1e306e 100644
--- a/org.apache.sling.thumbnails/src/main/java/org/apache/sling/thumbnails/internal/RenditionSupportImpl.java
+++ b/org.apache.sling.thumbnails/src/main/java/org/apache/sling/thumbnails/internal/RenditionSupportImpl.java
@@ -93,12 +93,13 @@ public class RenditionSupportImpl implements RenditionSupport {
@Override
public void setRendition(@NotNull Resource file, @NotNull String renditionName, @NotNull InputStream contents)
throws PersistenceException {
-
+ if (renditionName.indexOf("/") != 0) {
+ renditionName = "/" + renditionName;
+ }
try (ResourceResolver serviceResolver = transformationServiceUser.getTransformationServiceUser()) {
Resource renditionFile = ResourceUtil.getOrCreateResource(serviceResolver,
- file.getPath() + "/" + thumbnailSupport.getRenditionPath(file.getResourceType()) + "/"
- + renditionName,
+ file.getPath() + "/" + thumbnailSupport.getRenditionPath(file.getResourceType()) + renditionName,
Collections.singletonMap(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE),
JcrConstants.NT_UNSTRUCTURED, false);
Map<String, Object> properties = new HashMap<>();
diff --git a/org.apache.sling.thumbnails/src/test/java/org/apache/sling/thumbnails/internal/DynamicTransformServletTest.java b/org.apache.sling.thumbnails/src/test/java/org/apache/sling/thumbnails/internal/DynamicTransformServletTest.java
index 3764879..a4daa13 100644
--- a/org.apache.sling.thumbnails/src/test/java/org/apache/sling/thumbnails/internal/DynamicTransformServletTest.java
+++ b/org.apache.sling.thumbnails/src/test/java/org/apache/sling/thumbnails/internal/DynamicTransformServletTest.java
@@ -24,15 +24,22 @@ import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import javax.servlet.ServletException;
import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.Resource;
import org.apache.sling.testing.mock.sling.junit.SlingContext;
import org.apache.sling.thumbnails.ThumbnailSupport;
+import org.apache.sling.thumbnails.Transformation;
+import org.apache.sling.thumbnails.TransformationHandlerConfig;
import org.apache.sling.thumbnails.extension.ThumbnailProvider;
import org.apache.sling.thumbnails.extension.TransformationHandler;
+import org.apache.sling.thumbnails.internal.models.TransformationHandlerConfigImpl;
+import org.apache.sling.thumbnails.internal.models.TransformationImpl;
import org.apache.sling.thumbnails.internal.providers.ImageThumbnailProvider;
import org.apache.sling.thumbnails.internal.providers.PdfThumbnailProvider;
import org.apache.sling.thumbnails.internal.transformers.CropHandler;
@@ -118,6 +125,71 @@ public class DynamicTransformServletTest {
}
@Test
+ public void testRequestWithResource() throws IOException, ServletException {
+
+ context.create().resource("/home/users/test/transformation");
+
+ List<TransformationHandlerConfig> handlers = new ArrayList<>();
+
+ Map<String, Object> size = new HashMap<>();
+ size.put(ResizeHandler.PN_WIDTH, 200);
+ size.put(ResizeHandler.PN_HEIGHT, 200);
+ handlers.add(new TransformationHandlerConfigImpl(ResizeHandler.RESOURCE_TYPE, size));
+
+ Map<String, Object> crop = new HashMap<>();
+ crop.put(CropHandler.PN_POSITION, "center");
+ crop.put(ResizeHandler.PN_WIDTH, 200);
+ crop.put(ResizeHandler.PN_HEIGHT, 200);
+ handlers.add(new TransformationHandlerConfigImpl(CropHandler.RESOURCE_TYPE, crop));
+
+ Transformation transformation = new TransformationImpl(handlers, "test");
+
+ context.registerAdapter(Resource.class, Transformation.class, transformation);
+
+ context.request().addRequestParameter("resource", "/content/apache/sling-apache-org/index/apache.png");
+ context.request().addRequestParameter("format", "png");
+ context.request().addRequestParameter("transformationResource", "/home/users/test/transformation");
+ context.request().setContent(
+ "[{\"handlerType\":\"sling/thumbnails/transformers/crop\",\"properties\":{\"position\":\"CENTER\",\"width\":1000,\"height\":1000}}]"
+ .getBytes());
+ dts.doPost(context.request(), context.response());
+
+ assertEquals(200, context.response().getStatus());
+ assertEquals("image/png", context.response().getContentType());
+
+ assertNotEquals(0, context.response().getOutput().length);
+ }
+
+ @Test
+ public void testRequestWithInvalidResource() throws IOException, ServletException {
+
+ context.request().addRequestParameter("resource", "/content/apache/sling-apache-org/index/apache.png");
+ context.request().addRequestParameter("format", "png");
+ context.request().addRequestParameter("transformationResource", "/home/users/test/transformation");
+ context.request().setContent(
+ "[{\"handlerType\":\"sling/thumbnails/transformers/crop\",\"properties\":{\"position\":\"CENTER\",\"width\":1000,\"height\":1000}}]"
+ .getBytes());
+ dts.doPost(context.request(), context.response());
+
+ assertEquals(400, context.response().getStatus());
+ }
+
+ @Test
+ public void testRequestWithFailedAdaption() throws IOException, ServletException {
+
+ context.create().resource("/home/users/test/transformation");
+ context.request().addRequestParameter("resource", "/content/apache/sling-apache-org/index/apache.png");
+ context.request().addRequestParameter("format", "png");
+ context.request().addRequestParameter("transformationResource", "/home/users/test/transformation");
+ context.request().setContent(
+ "[{\"handlerType\":\"sling/thumbnails/transformers/crop\",\"properties\":{\"position\":\"CENTER\",\"width\":1000,\"height\":1000}}]"
+ .getBytes());
+ dts.doPost(context.request(), context.response());
+
+ assertEquals(400, context.response().getStatus());
+ }
+
+ @Test
public void testNoFormat() throws IOException, ServletException {
context.request().addRequestParameter("resource", "/content/apache/sling-apache-org/index/apache.png");
diff --git a/org.apache.sling.thumbnails/src/test/java/org/apache/sling/thumbnails/internal/TransformServletTest.java b/org.apache.sling.thumbnails/src/test/java/org/apache/sling/thumbnails/internal/TransformServletTest.java
index 92b6643..b71fdc8 100644
--- a/org.apache.sling.thumbnails/src/test/java/org/apache/sling/thumbnails/internal/TransformServletTest.java
+++ b/org.apache.sling.thumbnails/src/test/java/org/apache/sling/thumbnails/internal/TransformServletTest.java
@@ -28,16 +28,24 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.pdfbox.io.IOUtils;
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.servlethelpers.MockRequestDispatcherFactory;
+import org.apache.sling.testing.mock.sling.junit.SlingContext;
+import org.apache.sling.thumbnails.ThumbnailSupport;
+import org.apache.sling.thumbnails.TransformationHandlerConfig;
import org.apache.sling.thumbnails.extension.ThumbnailProvider;
import org.apache.sling.thumbnails.extension.TransformationHandler;
import org.apache.sling.thumbnails.internal.models.TransformationHandlerConfigImpl;
@@ -46,10 +54,6 @@ import org.apache.sling.thumbnails.internal.providers.ImageThumbnailProvider;
import org.apache.sling.thumbnails.internal.providers.PdfThumbnailProvider;
import org.apache.sling.thumbnails.internal.transformers.CropHandler;
import org.apache.sling.thumbnails.internal.transformers.ResizeHandler;
-import org.apache.sling.servlethelpers.MockRequestDispatcherFactory;
-import org.apache.sling.testing.mock.sling.junit.SlingContext;
-import org.apache.sling.thumbnails.ThumbnailSupport;
-import org.apache.sling.thumbnails.TransformationHandlerConfig;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -112,14 +116,21 @@ public class TransformServletTest {
providers.add(new PdfThumbnailProvider());
ThumbnailSupport thumbnailSupport = mock(ThumbnailSupport.class);
- when(thumbnailSupport.getPersistableTypes()).thenReturn(Collections.emptySet());
- when(thumbnailSupport.getSupportedTypes()).thenReturn(Collections.singleton("nt:file"));
- when(thumbnailSupport.getMetaTypePropertyPath("nt:file")).thenReturn("jcr:content/jcr:mimeType");
- when(thumbnailSupport.getServletErrorResourcePath()).thenReturn("/content/error");
+ when(thumbnailSupport.getPersistableTypes()).thenReturn(Collections.singleton("sling:File"));
+ when(thumbnailSupport.getRenditionPath("sling:File")).thenReturn("jcr:content/renditions");
+ Set<String> supportedTypes = new HashSet<>();
+ supportedTypes.add("sling:File");
+ supportedTypes.add("nt:file");
+ when(thumbnailSupport.getSupportedTypes()).thenReturn(supportedTypes);
+ when(thumbnailSupport.getMetaTypePropertyPath(anyString())).thenReturn("jcr:content/jcr:mimeType");
+ when(thumbnailSupport.getServletErrorResourcePath()).thenReturn("/content");
TransformerImpl transformer = new TransformerImpl(providers, thumbnailSupport, th);
- RenditionSupportImpl renditionSupport = new RenditionSupportImpl(thumbnailSupport, tsu);
+ ResourceResolverFactory contextFactory = Mockito.mock(ResourceResolverFactory.class);
+ Mockito.when(contextFactory.getServiceResourceResolver(Mockito.any())).thenReturn(context.resourceResolver());
+ TransformationServiceUser contextTsu = new TransformationServiceUser(contextFactory);
+ RenditionSupportImpl renditionSupport = new RenditionSupportImpl(thumbnailSupport, contextTsu);
ts = new TransformServlet(thumbnailSupport, transformer, tsu, new TransformationCache(tsu), renditionSupport,
mock(BundleContext.class));
@@ -143,6 +154,29 @@ public class TransformServletTest {
}
@Test
+ public void testPersistence() throws IOException, ServletException {
+
+ context.create().resource("/content/slingfile.jpg",
+ Collections.singletonMap(JcrConstants.JCR_PRIMARYTYPE, "sling:File"));
+ Map<String, Object> slingFileProperties = new HashMap<>();
+ slingFileProperties.put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED);
+ slingFileProperties.put(JcrConstants.JCR_DATA,
+ IOUtils.toByteArray(this.getClass().getClassLoader().getResourceAsStream("apache.png")));
+ slingFileProperties.put("jcr:mimeType", "image/jpeg");
+ context.create().resource("/content/slingfile.jpg/jcr:content", slingFileProperties);
+
+ context.currentResource("/content/slingfile.jpg");
+ context.requestPathInfo().setSuffix("/test.png");
+ context.requestPathInfo().setExtension("transform");
+
+ ts.doGet(context.request(), context.response());
+
+ assertNotNull(context.response().getOutput());
+
+ assertNotNull(context.resourceResolver().getResource("/content/slingfile.jpg/jcr:content/renditions/test.png"));
+ }
+
+ @Test
public void testUnsupportedOutput() throws IOException, ServletException {
context.currentResource("/content/apache/sling-apache-org/index/apache.png");