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/02 21:17:29 UTC

[sling-whiteboard] branch master updated: Separating out the API from SPI and adding a handler for flipping an image horizontally or vertically

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 4b0b4c4  Separating out the API from SPI and adding a handler for flipping an image horizontally or vertically
4b0b4c4 is described below

commit 4b0b4c48f9c2bbf55938c97bb3835d39dfda4ebb
Author: Dan Klco <kl...@adobe.com>
AuthorDate: Fri Jul 2 17:13:59 2021 -0400

    Separating out the API from SPI and adding a handler for flipping an image horizontally or vertically
---
 org.apache.sling.commons.thumbnail/NOTICE          |  2 +-
 org.apache.sling.commons.thumbnail/README.md       | 10 +++---
 .../commons/thumbnails/BadRequestException.java    |  5 +++
 .../{ => extension}/ThumbnailProvider.java         |  2 +-
 .../{ => extension}/TransformationHandler.java     |  3 +-
 .../commons/thumbnails/extension/package-info.java | 26 +++++++++++++++
 .../thumbnails/internal/ThumbnailsWebConsole.java  |  4 +--
 .../thumbnails/internal/TransformerImpl.java       |  4 +--
 .../internal/providers/ImageThumbnailProvider.java |  2 +-
 .../internal/providers/PdfThumbnailProvider.java   |  2 +-
 .../providers/SlideShowThumbnailProvider.java      |  2 +-
 .../internal/providers/TikaFallbackProvider.java   |  2 +-
 .../internal/transformers/ColorizeHandler.java     |  2 +-
 .../internal/transformers/CropHandler.java         |  7 ++--
 .../{TransparencyHandler.java => FlipHandler.java} | 32 +++++++++++--------
 .../internal/transformers/GreyscaleHandler.java    |  2 +-
 .../internal/transformers/ResizeHandler.java       | 15 ++++++---
 .../internal/transformers/RotateHandler.java       |  2 +-
 .../internal/transformers/ScaleHandler.java        | 25 +++++++++------
 .../internal/transformers/TransparencyHandler.java |  2 +-
 .../internal/DynamicTransformServletTest.java      |  4 +--
 .../internal/ThumbnailsWebConsoleTest.java         |  4 +--
 .../thumbnails/internal/TransformServletTest.java  |  4 +--
 .../thumbnails/internal/TransformerImplTest.java   |  4 +--
 .../providers/SlideShowThumbnailProviderTest.java  |  2 +-
 .../internal/transformers/CropHandlerTest.java     | 14 +++++++-
 ...{ScaleHandlerTest.java => FlipHandlerTest.java} | 37 +++++++---------------
 .../internal/transformers/ResizeHandlerTest.java   | 12 +++++++
 .../internal/transformers/ScaleHandlerTest.java    | 19 +++++++++++
 29 files changed, 164 insertions(+), 87 deletions(-)

diff --git a/org.apache.sling.commons.thumbnail/NOTICE b/org.apache.sling.commons.thumbnail/NOTICE
index c91d59c..c64a19b 100644
--- a/org.apache.sling.commons.thumbnail/NOTICE
+++ b/org.apache.sling.commons.thumbnail/NOTICE
@@ -1,4 +1,4 @@
-Apache Sling App CMS - Transformer
+Apache Sling Commons Thumbnails
 Copyright 2019 The Apache Software Foundation
 
 This product includes software developed at
diff --git a/org.apache.sling.commons.thumbnail/README.md b/org.apache.sling.commons.thumbnail/README.md
index 9bfba3a..09281bd 100644
--- a/org.apache.sling.commons.thumbnail/README.md
+++ b/org.apache.sling.commons.thumbnail/README.md
@@ -241,9 +241,9 @@ N/A
 
 Resizes an image to the size specified. If only one dimension is specified the image will be sized to the other
 
-_Implementation_: `org.apache.sling.commons.thumbnails.internal.transformers.ColorizeHandler`
+_Implementation_: `org.apache.sling.commons.thumbnails.internal.transformers.ResizeHandler`
 
-_Handler Type_: `sling/commons/thumbnails/transformers/colorize`
+_Handler Type_: `sling/commons/thumbnails/transformers/resize`
 
 _Parameters_
 
@@ -275,9 +275,9 @@ _Handler Type_: `sling/commons/thumbnails/transformers/scale`
 
 _Parameters_
 
-- both - scale the thumbnail by the same factor for width and height (0 - 1.0+)
-- width - scale the thumbnail width (0 - 1.0+)
-- height - scale the thumbnail height (0 - 1.0+)
+- both - scale the thumbnail by the same factor for width and height (0+ - 1.0+)
+- width - scale the thumbnail width (0+ - 1.0+)
+- height - scale the thumbnail height (0+ - 1.0+)
 
 ### Transparency Handler
 
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/BadRequestException.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/BadRequestException.java
index ad01503..6f118ef 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/BadRequestException.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/BadRequestException.java
@@ -39,4 +39,9 @@ public class BadRequestException extends RuntimeException {
         super(String.format(message, properties.entrySet().stream().map(en -> en.getKey() + "=" + en.getValue())
                 .collect(Collectors.joining("\n"))));
     }
+
+    public BadRequestException(String message, ValueMap properties, Exception cause) {
+        super(String.format(message, properties.entrySet().stream().map(en -> en.getKey() + "=" + en.getValue())
+                .collect(Collectors.joining("\n"))), cause);
+    }
 }
\ No newline at end of file
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/ThumbnailProvider.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/extension/ThumbnailProvider.java
similarity index 97%
rename from org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/ThumbnailProvider.java
rename to org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/extension/ThumbnailProvider.java
index df5871f..92fdf56 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/ThumbnailProvider.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/extension/ThumbnailProvider.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sling.commons.thumbnails;
+package org.apache.sling.commons.thumbnails.extension;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/TransformationHandler.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/extension/TransformationHandler.java
similarity index 93%
rename from org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/TransformationHandler.java
rename to org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/extension/TransformationHandler.java
index 33dc7ad..7e35552 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/TransformationHandler.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/extension/TransformationHandler.java
@@ -14,12 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sling.commons.thumbnails;
+package org.apache.sling.commons.thumbnails.extension;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
+import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
 import org.osgi.annotation.versioning.ConsumerType;
 
 /*
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/extension/package-info.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/extension/package-info.java
new file mode 100644
index 0000000..87d2208
--- /dev/null
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/extension/package-info.java
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+/**
+ * Extension points for file thumbnail generation and transformation
+ *
+ * @since 1.0.0
+ */
+@org.osgi.annotation.versioning.Version("1.0.0")
+package org.apache.sling.commons.thumbnails.extension;
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/ThumbnailsWebConsole.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/ThumbnailsWebConsole.java
index 1d79a24..ece6151 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/ThumbnailsWebConsole.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/ThumbnailsWebConsole.java
@@ -30,10 +30,10 @@ import com.google.common.collect.Lists;
 
 import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
-import org.apache.sling.commons.thumbnails.ThumbnailProvider;
 import org.apache.sling.commons.thumbnails.ThumbnailSupport;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.Transformer;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.osgi.framework.Constants;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/TransformerImpl.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/TransformerImpl.java
index 057aeea..51a4d6e 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/TransformerImpl.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/TransformerImpl.java
@@ -27,12 +27,12 @@ import org.apache.commons.io.IOUtils;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.commons.thumbnails.BadRequestException;
 import org.apache.sling.commons.thumbnails.OutputFileFormat;
-import org.apache.sling.commons.thumbnails.ThumbnailProvider;
 import org.apache.sling.commons.thumbnails.ThumbnailSupport;
 import org.apache.sling.commons.thumbnails.Transformation;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
 import org.apache.sling.commons.thumbnails.Transformer;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/ImageThumbnailProvider.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/ImageThumbnailProvider.java
index ad189e5..831c078 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/ImageThumbnailProvider.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/ImageThumbnailProvider.java
@@ -21,7 +21,7 @@ import java.io.InputStream;
 import com.google.common.net.MediaType;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.commons.thumbnails.ThumbnailProvider;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
 import org.osgi.service.component.annotations.Component;
 
 /**
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/PdfThumbnailProvider.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/PdfThumbnailProvider.java
index 13c95c9..dc7fab5 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/PdfThumbnailProvider.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/PdfThumbnailProvider.java
@@ -30,7 +30,7 @@ import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.rendering.ImageType;
 import org.apache.pdfbox.rendering.PDFRenderer;
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.commons.thumbnails.ThumbnailProvider;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
 import org.osgi.service.component.annotations.Component;
 
 /**
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/SlideShowThumbnailProvider.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/SlideShowThumbnailProvider.java
index 2ecd21d..bd2f3d5 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/SlideShowThumbnailProvider.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/SlideShowThumbnailProvider.java
@@ -38,8 +38,8 @@ import org.apache.poi.xslf.usermodel.XMLSlideShow;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
 import org.apache.sling.commons.thumbnails.OutputFileFormat;
-import org.apache.sling.commons.thumbnails.ThumbnailProvider;
 import org.apache.sling.commons.thumbnails.ThumbnailSupport;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/TikaFallbackProvider.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/TikaFallbackProvider.java
index 9546794..57fb6cc 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/TikaFallbackProvider.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/providers/TikaFallbackProvider.java
@@ -28,7 +28,7 @@ import javax.swing.JEditorPane;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.commons.thumbnails.OutputFileFormat;
-import org.apache.sling.commons.thumbnails.ThumbnailProvider;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.AutoDetectParser;
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ColorizeHandler.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ColorizeHandler.java
index 0644b13..1af78f3 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ColorizeHandler.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ColorizeHandler.java
@@ -23,8 +23,8 @@ import java.io.OutputStream;
 
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.commons.thumbnails.BadRequestException;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.osgi.service.component.annotations.Component;
 
 import net.coobird.thumbnailator.Thumbnails;
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/CropHandler.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/CropHandler.java
index cb8b95c..7fda7b5 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/CropHandler.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/CropHandler.java
@@ -22,8 +22,8 @@ import java.io.OutputStream;
 
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.commons.thumbnails.BadRequestException;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.osgi.service.component.annotations.Component;
 
 import net.coobird.thumbnailator.Thumbnails;
@@ -54,10 +54,11 @@ public class CropHandler implements TransformationHandler {
         try {
             Positions pos = Positions.valueOf(positionStr);
             builder.crop(pos);
+            builder.toOutputStream(outputStream);
         } catch (IllegalArgumentException e) {
-            throw new BadRequestException("Unable to crop due to invalid crop position: " + positionStr, e);
+            throw new BadRequestException("Unable to crop due to invalid configuration: \n%s", config.getProperties(),
+                    e);
         }
-        builder.toOutputStream(outputStream);
     }
 
     private static void resize(Builder<? extends InputStream> builder, ValueMap properties) {
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/TransparencyHandler.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/FlipHandler.java
similarity index 69%
copy from org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/TransparencyHandler.java
copy to org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/FlipHandler.java
index 7921618..029cf05 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/TransparencyHandler.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/FlipHandler.java
@@ -20,24 +20,25 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.commons.thumbnails.BadRequestException;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.osgi.service.component.annotations.Component;
 
 import net.coobird.thumbnailator.Thumbnails;
 import net.coobird.thumbnailator.Thumbnails.Builder;
-import net.coobird.thumbnailator.filters.Transparency;
+import net.coobird.thumbnailator.filters.Flip;
+import net.coobird.thumbnailator.filters.ImageFilter;
 
 /**
- * A transformer for making an image transparent
+ * Fips the image
  */
 @Component(service = TransformationHandler.class, immediate = true)
-public class TransparencyHandler implements TransformationHandler {
+public class FlipHandler implements TransformationHandler {
 
-    public static final String RESOURCE_TYPE = "sling/commons/thumbnails/transformers/transparency";
-    public static final String PN_BOTH = "both";
+    public static final String RESOURCE_TYPE = "sling/commons/thumbnails/transformers/flip";
+
+    public static final String PN_DIRECTION = "direction";
 
     @Override
     public String getResourceType() {
@@ -47,18 +48,21 @@ public class TransparencyHandler implements TransformationHandler {
     @Override
     public void handle(InputStream inputStream, OutputStream outputStream, TransformationHandlerConfig config)
             throws IOException {
-        Builder<? extends InputStream> builder = Thumbnails.of(inputStream);
-        ValueMap properties = config.getProperties();
 
-        double alpha = properties.get(ColorizeHandler.PN_ALPHA, 0.0);
+        String direction = config.getProperties().get(PN_DIRECTION, "").toUpperCase();
 
-        if (alpha < 0 || alpha > 1.0) {
-            throw new BadRequestException("Unable to make transparent, bad alpha value " + alpha);
+        ImageFilter flipper = null;
+        if ("HORIZONTAL".equals(direction)) {
+            flipper = Flip.HORIZONTAL;
+        } else if ("VERTICAL".equals(direction)) {
+            flipper = Flip.VERTICAL;
+        } else {
+            throw new BadRequestException("Could not flip image with configuration: \n%s", config.getProperties());
         }
 
-        builder.addFilter(new Transparency(alpha));
+        Builder<? extends InputStream> builder = Thumbnails.of(inputStream);
+        builder.addFilter(flipper);
         builder.scale(1.0);
-
         builder.toOutputStream(outputStream);
     }
 
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/GreyscaleHandler.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/GreyscaleHandler.java
index fc22ea6..77bd9a2 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/GreyscaleHandler.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/GreyscaleHandler.java
@@ -21,8 +21,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.osgi.service.component.annotations.Component;
 
 import net.coobird.thumbnailator.Thumbnails;
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ResizeHandler.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ResizeHandler.java
index 6dcd1bd..b545c46 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ResizeHandler.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ResizeHandler.java
@@ -22,8 +22,8 @@ import java.io.OutputStream;
 
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.commons.thumbnails.BadRequestException;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.osgi.service.component.annotations.Component;
 
 import net.coobird.thumbnailator.Thumbnails;
@@ -50,12 +50,17 @@ public class ResizeHandler implements TransformationHandler {
             throws IOException {
         Builder<? extends InputStream> builder = Thumbnails.of(inputStream);
 
-        resize(builder, config.getProperties());
+        try {
+            resize(builder, config.getProperties());
 
-        boolean keepAspectRatio = config.getProperties().get(PN_KEEP_ASPECT_RATIO, true);
-        builder.keepAspectRatio(keepAspectRatio);
+            boolean keepAspectRatio = config.getProperties().get(PN_KEEP_ASPECT_RATIO, true);
+            builder.keepAspectRatio(keepAspectRatio);
 
-        builder.toOutputStream(outputStream);
+            builder.toOutputStream(outputStream);
+        } catch (IllegalArgumentException e) {
+            throw new BadRequestException("Unable to resize due to invalid configuration: \n%s", config.getProperties(),
+                    e);
+        }
     }
 
     private static void resize(Builder<? extends InputStream> builder, ValueMap properties) {
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/RotateHandler.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/RotateHandler.java
index 569a94c..dd9525b 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/RotateHandler.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/RotateHandler.java
@@ -20,8 +20,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.osgi.service.component.annotations.Component;
 
 import net.coobird.thumbnailator.Thumbnails;
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandler.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandler.java
index 4e2b7c3..36da131 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandler.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandler.java
@@ -22,8 +22,8 @@ import java.io.OutputStream;
 
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.commons.thumbnails.BadRequestException;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.osgi.service.component.annotations.Component;
 
 import net.coobird.thumbnailator.Thumbnails;
@@ -46,20 +46,25 @@ public class ScaleHandler implements TransformationHandler {
     @Override
     public void handle(InputStream inputStream, OutputStream outputStream, TransformationHandlerConfig config)
             throws IOException {
-        Builder<? extends InputStream> builder = Thumbnails.of(inputStream);
         ValueMap properties = config.getProperties();
         double both = properties.get(PN_BOTH, -1.0);
         double width = properties.get(ResizeHandler.PN_WIDTH, -1.0);
         double height = properties.get(ResizeHandler.PN_HEIGHT, -1.0);
-        if (both >= 0) {
-            builder.scale(both);
-        } else if (width >= 0 && height >= 0) {
-            builder.scale(width, height);
-        } else {
-            throw new BadRequestException("Could not scale thumbnail, invalid paramters: \n%s", properties);
-        }
+        try {
+            Builder<? extends InputStream> builder = Thumbnails.of(inputStream);
+            if (both >= 0) {
+                builder.scale(both);
+            } else if (width >= 0 && height >= 0) {
+                builder.scale(width, height);
+            } else {
+                throw new BadRequestException("Could not scale thumbnail, invalid paramters: \n%s", properties);
+            }
 
-        builder.toOutputStream(outputStream);
+            builder.toOutputStream(outputStream);
+        } catch (IllegalArgumentException e) {
+            throw new BadRequestException("Unable to resize due to invalid configuration: \n%s", config.getProperties(),
+                    e);
+        }
     }
 
 }
diff --git a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/TransparencyHandler.java b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/TransparencyHandler.java
index 7921618..8058bd1 100644
--- a/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/TransparencyHandler.java
+++ b/org.apache.sling.commons.thumbnail/src/main/java/org/apache/sling/commons/thumbnails/internal/transformers/TransparencyHandler.java
@@ -22,8 +22,8 @@ import java.io.OutputStream;
 
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.commons.thumbnails.BadRequestException;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.osgi.service.component.annotations.Component;
 
 import net.coobird.thumbnailator.Thumbnails;
diff --git a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/DynamicTransformServletTest.java b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/DynamicTransformServletTest.java
index b48f25d..ea36641 100644
--- a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/DynamicTransformServletTest.java
+++ b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/DynamicTransformServletTest.java
@@ -29,9 +29,9 @@ import java.util.List;
 import javax.servlet.ServletException;
 
 import org.apache.sling.api.resource.LoginException;
-import org.apache.sling.commons.thumbnails.ThumbnailProvider;
 import org.apache.sling.commons.thumbnails.ThumbnailSupport;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.apache.sling.commons.thumbnails.internal.providers.ImageThumbnailProvider;
 import org.apache.sling.commons.thumbnails.internal.providers.PdfThumbnailProvider;
 import org.apache.sling.commons.thumbnails.internal.transformers.CropHandler;
diff --git a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/ThumbnailsWebConsoleTest.java b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/ThumbnailsWebConsoleTest.java
index 4fa721d..72713b9 100644
--- a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/ThumbnailsWebConsoleTest.java
+++ b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/ThumbnailsWebConsoleTest.java
@@ -30,9 +30,9 @@ import javax.servlet.ServletException;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.sling.api.resource.LoginException;
-import org.apache.sling.commons.thumbnails.ThumbnailProvider;
 import org.apache.sling.commons.thumbnails.ThumbnailSupport;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.apache.sling.commons.thumbnails.internal.providers.ImageThumbnailProvider;
 import org.apache.sling.commons.thumbnails.internal.providers.PdfThumbnailProvider;
 import org.apache.sling.commons.thumbnails.internal.transformers.CropHandler;
diff --git a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/TransformServletTest.java b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/TransformServletTest.java
index ff3ca05..b8c4daa 100644
--- a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/TransformServletTest.java
+++ b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/TransformServletTest.java
@@ -34,10 +34,10 @@ 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.commons.thumbnails.ThumbnailProvider;
 import org.apache.sling.commons.thumbnails.ThumbnailSupport;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.apache.sling.commons.thumbnails.internal.models.TransformationHandlerConfigImpl;
 import org.apache.sling.commons.thumbnails.internal.models.TransformationImpl;
 import org.apache.sling.commons.thumbnails.internal.providers.ImageThumbnailProvider;
diff --git a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/TransformerImplTest.java b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/TransformerImplTest.java
index a5161b4..5328b3a 100644
--- a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/TransformerImplTest.java
+++ b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/TransformerImplTest.java
@@ -30,11 +30,11 @@ import java.util.Map;
 
 import org.apache.sling.commons.thumbnails.BadRequestException;
 import org.apache.sling.commons.thumbnails.OutputFileFormat;
-import org.apache.sling.commons.thumbnails.ThumbnailProvider;
 import org.apache.sling.commons.thumbnails.ThumbnailSupport;
-import org.apache.sling.commons.thumbnails.TransformationHandler;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
 import org.apache.sling.commons.thumbnails.Transformer;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
+import org.apache.sling.commons.thumbnails.extension.TransformationHandler;
 import org.apache.sling.commons.thumbnails.internal.models.TransformationHandlerConfigImpl;
 import org.apache.sling.commons.thumbnails.internal.models.TransformationImpl;
 import org.apache.sling.commons.thumbnails.internal.providers.ImageThumbnailProvider;
diff --git a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/providers/SlideShowThumbnailProviderTest.java b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/providers/SlideShowThumbnailProviderTest.java
index 9f59e77..2b1d8dc 100644
--- a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/providers/SlideShowThumbnailProviderTest.java
+++ b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/providers/SlideShowThumbnailProviderTest.java
@@ -26,8 +26,8 @@ import java.io.IOException;
 import java.util.Collections;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.commons.thumbnails.ThumbnailProvider;
 import org.apache.sling.commons.thumbnails.ThumbnailSupport;
+import org.apache.sling.commons.thumbnails.extension.ThumbnailProvider;
 import org.apache.sling.commons.thumbnails.internal.ContextHelper;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Before;
diff --git a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/CropHandlerTest.java b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/CropHandlerTest.java
index 31031dd..d54c8cb 100644
--- a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/CropHandlerTest.java
+++ b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/CropHandlerTest.java
@@ -80,7 +80,19 @@ public class CropHandlerTest {
 
     @Test(expected = BadRequestException.class)
     public void testMissingWidthHeight() throws IOException {
-        TransformationHandlerConfig config = new TransformationHandlerConfigImpl("/conf", Collections.singletonMap(CropHandler.PN_POSITION, "center"));
+        TransformationHandlerConfig config = new TransformationHandlerConfigImpl("/conf",
+                Collections.singletonMap(CropHandler.PN_POSITION, "center"));
+        cropper.handle(inputStream, outputStream, config);
+    }
+
+    @Test(expected = BadRequestException.class)
+    public void testInvalidHuge() throws IOException {
+
+        Map<String, Object> properties = new HashMap<>();
+        properties.put(ResizeHandler.PN_WIDTH, Integer.MAX_VALUE);
+        properties.put(ResizeHandler.PN_HEIGHT, Integer.MAX_VALUE);
+
+        TransformationHandlerConfig config = new TransformationHandlerConfigImpl("/conf", properties);
         cropper.handle(inputStream, outputStream, config);
     }
 
diff --git a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandlerTest.java b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/FlipHandlerTest.java
similarity index 72%
copy from org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandlerTest.java
copy to org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/FlipHandlerTest.java
index 6607935..5c9271f 100644
--- a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandlerTest.java
+++ b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/FlipHandlerTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.sling.commons.thumbnails.internal.transformers;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 
 import java.io.ByteArrayOutputStream;
@@ -31,55 +30,43 @@ import org.apache.sling.commons.thumbnails.internal.models.TransformationHandler
 import org.junit.Before;
 import org.junit.Test;
 
-public class ScaleHandlerTest {
+public class FlipHandlerTest {
 
     private InputStream inputStream;
     private ByteArrayOutputStream outputStream;
-    private ScaleHandler scaler;
+    private FlipHandler flop;
 
     @Before
     public void init() {
         inputStream = getClass().getClassLoader().getResourceAsStream("apache.png");
         outputStream = new ByteArrayOutputStream();
-        scaler = new ScaleHandler();
+        flop = new FlipHandler();
     }
 
     @Test
-    public void testResourceType() throws IOException {
-        assertEquals("sling/commons/thumbnails/transformers/scale", scaler.getResourceType());
-    }
-
-    @Test
-    public void testScaleBoth() throws IOException {
-
+    public void testFlipHorizontal() throws IOException {
         Map<String, Object> properties = new HashMap<>();
-        properties.put(ScaleHandler.PN_BOTH, 2);
-
+        properties.put(FlipHandler.PN_DIRECTION, "horizontal");
         TransformationHandlerConfig config = new TransformationHandlerConfigImpl("/conf", properties);
-        scaler.handle(inputStream, outputStream, config);
+        flop.handle(inputStream, outputStream, config);
         assertNotEquals(0, outputStream.toByteArray().length);
     }
 
     @Test
-    public void testScaleWidthAndHeight() throws IOException {
-
+    public void testFlipVertical() throws IOException {
         Map<String, Object> properties = new HashMap<>();
-        properties.put(ResizeHandler.PN_WIDTH, 2);
-        properties.put(ResizeHandler.PN_HEIGHT, 1);
-
+        properties.put(FlipHandler.PN_DIRECTION, "VERTICAL");
         TransformationHandlerConfig config = new TransformationHandlerConfigImpl("/conf", properties);
-        scaler.handle(inputStream, outputStream, config);
+        flop.handle(inputStream, outputStream, config);
         assertNotEquals(0, outputStream.toByteArray().length);
     }
 
     @Test(expected = BadRequestException.class)
-    public void testInvalidScale() throws IOException {
-
+    public void testInvalidDirection() throws IOException {
         Map<String, Object> properties = new HashMap<>();
-        properties.put(ResizeHandler.PN_WIDTH, 2);
-
+        properties.put(FlipHandler.PN_DIRECTION, "asdf");
         TransformationHandlerConfig config = new TransformationHandlerConfigImpl("/conf", properties);
-        scaler.handle(inputStream, outputStream, config);
+        flop.handle(inputStream, outputStream, config);
     }
 
 }
diff --git a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ResizeHandlerTest.java b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ResizeHandlerTest.java
index 7e90136..23d4a5b 100644
--- a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ResizeHandlerTest.java
+++ b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ResizeHandlerTest.java
@@ -25,6 +25,7 @@ import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.sling.commons.thumbnails.BadRequestException;
 import org.apache.sling.commons.thumbnails.TransformationHandlerConfig;
 import org.apache.sling.commons.thumbnails.internal.models.TransformationHandlerConfigImpl;
 import org.junit.Before;
@@ -79,4 +80,15 @@ public class ResizeHandlerTest {
         assertNotNull(outputStream.toByteArray());
     }
 
+    @Test(expected = BadRequestException.class)
+    public void testInvalidHuge() throws IOException {
+
+        Map<String, Object> properties = new HashMap<>();
+        properties.put(ResizeHandler.PN_WIDTH, Integer.MAX_VALUE);
+        properties.put(ResizeHandler.PN_HEIGHT, Integer.MAX_VALUE);
+
+        TransformationHandlerConfig config = new TransformationHandlerConfigImpl("/conf", properties);
+        sizer.handle(inputStream, outputStream, config);
+    }
+
 }
diff --git a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandlerTest.java b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandlerTest.java
index 6607935..4fb4b5b 100644
--- a/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandlerTest.java
+++ b/org.apache.sling.commons.thumbnail/src/test/java/org/apache/sling/commons/thumbnails/internal/transformers/ScaleHandlerTest.java
@@ -82,4 +82,23 @@ public class ScaleHandlerTest {
         scaler.handle(inputStream, outputStream, config);
     }
 
+    @Test(expected = BadRequestException.class)
+    public void testInvalidScaleWidth() throws IOException {
+
+        Map<String, Object> properties = new HashMap<>();
+        properties.put(ResizeHandler.PN_HEIGHT, 2);
+
+        TransformationHandlerConfig config = new TransformationHandlerConfigImpl("/conf", properties);
+        scaler.handle(inputStream, outputStream, config);
+    }
+
+    @Test(expected = BadRequestException.class)
+    public void testInvalidHugeScale() throws IOException {
+
+        Map<String, Object> properties = new HashMap<>();
+        properties.put(ScaleHandler.PN_BOTH, Integer.MAX_VALUE);
+
+        TransformationHandlerConfig config = new TransformationHandlerConfigImpl("/conf", properties);
+        scaler.handle(inputStream, outputStream, config);
+    }
 }