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");