REPO-4082 Transformers should have unique option names (#291)

* REPO-4082 Transformers should have unique option names

In addition to making the transform options, the following tidy up activities were performed:

* Rendition 2 Definitions beans have been simplified so there is just one common parent,
   as this makes it clearer what the transform options are even if some of them are shared.
* Removal of "required": "false" from transform-service-config.json as this is the default.
   Test added to make sure it really is the default for option values and option groups.
*  Refactored some of the code in RenditionTest and a sub classes (in
    alfresco-enterprise-repository) now that the Transform Service is more stable.
    They are now able to share static finals.
This commit is contained in:
alandavis
2018-12-06 09:35:33 +00:00
committed by GitHub
parent ded9d4eb4a
commit 67b8bb3dd5
13 changed files with 352 additions and 239 deletions

View File

@@ -115,6 +115,7 @@ public class RemoteTransformerClient
if (args[i+1] != null)
{
builder.addTextBody(args[i], args[i + 1]);
sj.add(args[i] + '=' + args[i + 1]);
}
}

View File

@@ -33,7 +33,12 @@ import org.alfresco.repo.content.transform.ContentTransformerWorker;
import org.alfresco.repo.content.transform.RemoteTransformerClient;
import org.alfresco.repo.content.transform.magick.ImageResizeOptions;
import org.alfresco.repo.content.transform.magick.ImageTransformationOptions;
import org.alfresco.service.cmr.repository.*;
import org.alfresco.service.cmr.repository.ContentIOException;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.MimetypeService;
import org.alfresco.service.cmr.repository.PagedSourceOptions;
import org.alfresco.service.cmr.repository.TransformationOptions;
import org.alfresco.util.Pair;
import org.alfresco.util.PropertyCheck;
import org.alfresco.util.TempFileProvider;
@@ -46,9 +51,9 @@ import java.io.File;
import java.util.HashMap;
import java.util.Map;
import static org.alfresco.repo.rendition2.RenditionDefinition2.ALLOW_ENLARGEMENT;
import static org.alfresco.repo.rendition2.RenditionDefinition2.ALLOW_PDF_ENLARGEMENT;
import static org.alfresco.repo.rendition2.RenditionDefinition2.HEIGHT;
import static org.alfresco.repo.rendition2.RenditionDefinition2.MAINTAIN_ASPECT_RATIO;
import static org.alfresco.repo.rendition2.RenditionDefinition2.MAINTAIN_PDF_ASPECT_RATIO;
import static org.alfresco.repo.rendition2.RenditionDefinition2.PAGE;
import static org.alfresco.repo.rendition2.RenditionDefinition2.WIDTH;
@@ -380,8 +385,8 @@ public class AlfrescoPdfRendererContentTransformerWorker extends ContentTransfor
PAGE, page,
WIDTH, width,
HEIGHT, height,
ALLOW_ENLARGEMENT, allowEnlargement,
MAINTAIN_ASPECT_RATIO, maintainAspectRatio);
ALLOW_PDF_ENLARGEMENT, allowEnlargement,
MAINTAIN_PDF_ASPECT_RATIO, maintainAspectRatio);
}
@Override

View File

@@ -62,9 +62,6 @@ public interface RenditionDefinition2
public static final String RESIZE_HEIGHT = "resizeHeight";
public static final String RESIZE_PERCENTAGE = "resizePercentage";
// ImageMagick & PdfRenderer options
/** Indicates whether scaling operations should scale up or down (true or false). */
public static final String ALLOW_ENLARGEMENT = "allowEnlargement";
@@ -78,6 +75,12 @@ public interface RenditionDefinition2
public static final String WIDTH = "width";
public static final String HEIGHT = "height";
/** Indicates whether scaling operations should scale up or down (true or false). */
public static final String ALLOW_PDF_ENLARGEMENT = "allowPdfEnlargement";
/** Indicates whether the aspect ratio of the image should be maintained (true or false). */
public static final String MAINTAIN_PDF_ASPECT_RATIO = "maintainPdfAspectRatio";
// Video options

View File

@@ -46,6 +46,7 @@ import java.util.Set;
import java.util.StringJoiner;
import static org.alfresco.repo.rendition2.RenditionDefinition2.ALLOW_ENLARGEMENT;
import static org.alfresco.repo.rendition2.RenditionDefinition2.ALLOW_PDF_ENLARGEMENT;
import static org.alfresco.repo.rendition2.RenditionDefinition2.AUTO_ORIENT;
import static org.alfresco.repo.rendition2.RenditionDefinition2.CROP_GRAVITY;
import static org.alfresco.repo.rendition2.RenditionDefinition2.CROP_HEIGHT;
@@ -59,6 +60,7 @@ import static org.alfresco.repo.rendition2.RenditionDefinition2.FLASH_VERSION;
import static org.alfresco.repo.rendition2.RenditionDefinition2.HEIGHT;
import static org.alfresco.repo.rendition2.RenditionDefinition2.INCLUDE_CONTENTS;
import static org.alfresco.repo.rendition2.RenditionDefinition2.MAINTAIN_ASPECT_RATIO;
import static org.alfresco.repo.rendition2.RenditionDefinition2.MAINTAIN_PDF_ASPECT_RATIO;
import static org.alfresco.repo.rendition2.RenditionDefinition2.MAX_SOURCE_SIZE_K_BYTES;
import static org.alfresco.repo.rendition2.RenditionDefinition2.OFFSET;
import static org.alfresco.repo.rendition2.RenditionDefinition2.PAGE;
@@ -96,7 +98,8 @@ public class TransformationOptionsConverter implements InitializingBean
private static Set<String> RESIZE_OPTIONS = new HashSet<>(Arrays.asList(new String[]
{
WIDTH, HEIGHT,
WIDTH, HEIGHT, ALLOW_PDF_ENLARGEMENT, MAINTAIN_PDF_ASPECT_RATIO,
THUMBNAIL, RESIZE_WIDTH, RESIZE_HEIGHT, RESIZE_PERCENTAGE,
ALLOW_ENLARGEMENT, MAINTAIN_ASPECT_RATIO
}));
@@ -112,7 +115,7 @@ public class TransformationOptionsConverter implements InitializingBean
private static Set<String> PDF_OPTIONS = new HashSet<>(Arrays.asList(new String[]
{
PAGE, WIDTH, HEIGHT
PAGE, WIDTH, HEIGHT, ALLOW_PDF_ENLARGEMENT, MAINTAIN_PDF_ASPECT_RATIO
}));
private static Set<String> FLASH_OPTIONS = new HashSet<>(Arrays.asList(new String[]
@@ -192,12 +195,15 @@ public class TransformationOptionsConverter implements InitializingBean
boolean hasOptions = !subclassOptionNames.isEmpty();
if (isPdfRendition || hasOptions)
{
// The "pdf" rendition used the wrong TransformationOptions subclass.
if (isPdfRendition || FLASH_OPTIONS.containsAll(subclassOptionNames))
{
SWFTransformationOptions opts = new SWFTransformationOptions();
transformationOptions = opts;
opts.setFlashVersion(isPdfRendition ? "9" : options.get(FLASH_VERSION));
}
// Even though the only standard rendition to use the pdf-renderer is "pdf" there may be custom renditions
// that use ImageTransformOptions to specify width, height etc.
else if (IMAGE_OPTIONS.containsAll(subclassOptionNames) || PDF_OPTIONS.containsAll(subclassOptionNames))
{
ImageTransformationOptions opts = new ImageTransformationOptions();

View File

@@ -29,7 +29,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
/**
* Represents an individual transformer option or group of options that are required or optional.
* Represents an individual transformer option or group of options that are required or optional (default).
*/
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,

View File

@@ -35,7 +35,7 @@ import java.util.List;
public class TransformOptionGroup implements TransformOption
{
private boolean required;
private List<TransformOption> transformOptions;
List<TransformOption> transformOptions;
public TransformOptionGroup()
{

View File

@@ -42,13 +42,13 @@ import java.util.concurrent.ConcurrentMap;
import static org.alfresco.repo.rendition2.RenditionDefinition2.TIMEOUT;
/**
* Used by clients work out if a transformation is supported by the Transform Service.
* Used by clients to work out if a transformation is supported by the Transform Service.
*/
public class TransformServiceRegistryImpl implements TransformServiceRegistry, InitializingBean
{
class SupportedTransform
{
private TransformOptionGroup transformOptions;
TransformOptionGroup transformOptions;
private long maxSourceSizeBytes;
public SupportedTransform(List<TransformOption> transformOptions, long maxSourceSizeBytes)

View File

@@ -119,103 +119,115 @@
<property name="transformServiceRegistry" ref="transformServiceRegistry" />
</bean>
<!-- The definitions -->
<bean id="baseRenditionDefinition2" class="org.alfresco.repo.rendition2.RenditionDefinition2Impl" abstract="true">
<constructor-arg name="registry" ref="renditionDefinitionRegistry2"/>
<constructor-arg name="transformOptions">
<map>
<entry key="timeout" value="${system.thumbnail.definition.default.timeoutMs}" />
</map>
</constructor-arg>
</bean>
<bean id="baseResizeRenditionDefinition2" parent="baseRenditionDefinition2" abstract="true">
<constructor-arg name="transformOptions">
<map merge="true">
<entry key="maintainAspectRatio" value="true"/>
<entry key="thumbnail" value="true"/>
</map>
</constructor-arg>
</bean>
<bean id="renditionDefinition2Medium" parent="baseResizeRenditionDefinition2">
<constructor-arg name="renditionName" value="medium"/>
<constructor-arg name="targetMimetype" value="image/jpeg"/>
<constructor-arg name="transformOptions">
<map merge="true">
<entry key="resizeWidth" value="100"/>
<entry key="resizeHeight" value="100"/>
</map>
</constructor-arg>
</bean>
<bean id="renditionDefinition2DocLib" parent="baseResizeRenditionDefinition2">
<constructor-arg name="renditionName" value="doclib"/>
<constructor-arg name="targetMimetype" value="image/png"/>
<constructor-arg name="transformOptions">
<map merge="true">
<entry key="resizeWidth" value="100"/>
<entry key="resizeHeight" value="100"/>
<entry key="allowEnlargement" value="false" />
</map>
</constructor-arg>
</bean>
<bean id="renditionDefinition2Imgpreview" parent="baseResizeRenditionDefinition2">
<constructor-arg name="renditionName" value="imgpreview"/>
<constructor-arg name="targetMimetype" value="image/jpeg"/>
<constructor-arg name="transformOptions">
<map merge="true">
<entry key="resizeWidth" value="960"/>
<entry key="resizeHeight" value="960"/>
<entry key="allowEnlargement" value="false" />
</map>
</constructor-arg>
</bean>
<bean id="renditionDefinition2Avatar" parent="baseResizeRenditionDefinition2">
<constructor-arg name="renditionName" value="avatar"/>
<constructor-arg name="targetMimetype" value="image/png"/>
<constructor-arg name="transformOptions">
<map merge="true">
<entry key="resizeWidth" value="64"/>
<entry key="resizeHeight" value="64"/>
<entry key="allowEnlargement" value="false" />
</map>
</constructor-arg>
</bean>
<bean id="renditionDefinition2Avatar32" parent="baseResizeRenditionDefinition2">
<constructor-arg name="renditionName" value="avatar32"/>
<constructor-arg name="targetMimetype" value="image/png"/>
<constructor-arg name="transformOptions">
<map merge="true">
<entry key="resizeWidth" value="32"/>
<entry key="resizeHeight" value="32"/>
<entry key="allowEnlargement" value="false" />
</map>
</constructor-arg>
</bean>
<bean id="renditionDefinition2Webpreview" parent="baseRenditionDefinition2">
<constructor-arg name="renditionName" value="webpreview"/>
<constructor-arg name="targetMimetype" value="application/x-shockwave-flash"/>
<constructor-arg name="transformOptions">
<map merge="true">
<entry key="flashVersion" value="9"/>
</map>
</constructor-arg>
</bean>
<bean id="renditionDefinition2Pdf" parent="baseRenditionDefinition2">
<constructor-arg name="renditionName" value="pdf"/>
<constructor-arg name="targetMimetype" value="application/pdf"/>
</bean>
<!-- Process raw content update events -->
<bean id="renditionEventProcessor" class="org.alfresco.repo.rendition2.RenditionEventProcessor">
<property name="renditionService2" ref="renditionService2" />
<property name="messagingObjectMapper" ref="alfrescoEventObjectMapper" />
<property name="transactionService" ref="transactionService" />
</bean>
<!-- The definitions -->
<bean id="renditionDefinition2Medium" class="org.alfresco.repo.rendition2.RenditionDefinition2Impl">
<constructor-arg name="renditionName" value="medium"/>
<constructor-arg name="targetMimetype" value="image/jpeg"/>
<constructor-arg name="transformOptions">
<map>
<entry key="resizeWidth" value="100"/>
<entry key="resizeHeight" value="100"/>
<entry key="maintainAspectRatio" value="true"/>
<entry key="thumbnail" value="true"/>
<entry key="timeout" value="${system.thumbnail.definition.default.timeoutMs}" />
</map>
</constructor-arg>
<constructor-arg name="registry" ref="renditionDefinitionRegistry2"/>
</bean>
<bean id="renditionDefinition2DocLib" class="org.alfresco.repo.rendition2.RenditionDefinition2Impl">
<constructor-arg name="renditionName" value="doclib"/>
<constructor-arg name="targetMimetype" value="image/png"/>
<constructor-arg name="transformOptions">
<map>
<entry key="resizeWidth" value="100"/>
<entry key="resizeHeight" value="100"/>
<entry key="allowEnlargement" value="false" />
<entry key="maintainAspectRatio" value="true"/>
<entry key="thumbnail" value="true"/>
<entry key="timeout" value="${system.thumbnail.definition.default.timeoutMs}" />
</map>
</constructor-arg>
<constructor-arg name="registry" ref="renditionDefinitionRegistry2"/>
</bean>
<bean id="renditionDefinition2Imgpreview" class="org.alfresco.repo.rendition2.RenditionDefinition2Impl">
<constructor-arg name="renditionName" value="imgpreview"/>
<constructor-arg name="targetMimetype" value="image/jpeg"/>
<constructor-arg name="transformOptions">
<map>
<entry key="resizeWidth" value="960"/>
<entry key="resizeHeight" value="960"/>
<entry key="allowEnlargement" value="false" />
<entry key="maintainAspectRatio" value="true"/>
<entry key="thumbnail" value="true"/>
<entry key="timeout" value="${system.thumbnail.definition.default.timeoutMs}" />
</map>
</constructor-arg>
<constructor-arg name="registry" ref="renditionDefinitionRegistry2"/>
</bean>
<bean id="renditionDefinition2Avatar" class="org.alfresco.repo.rendition2.RenditionDefinition2Impl">
<constructor-arg name="renditionName" value="avatar"/>
<constructor-arg name="targetMimetype" value="image/png"/>
<constructor-arg name="transformOptions">
<map>
<entry key="resizeWidth" value="64"/>
<entry key="resizeHeight" value="64"/>
<entry key="allowEnlargement" value="false" />
<entry key="maintainAspectRatio" value="true"/>
<entry key="thumbnail" value="true"/>
<entry key="timeout" value="${system.thumbnail.definition.default.timeoutMs}" />
</map>
</constructor-arg>
<constructor-arg name="registry" ref="renditionDefinitionRegistry2"/>
</bean>
<bean id="renditionDefinition2Avatar32" class="org.alfresco.repo.rendition2.RenditionDefinition2Impl">
<constructor-arg name="renditionName" value="avatar32"/>
<constructor-arg name="targetMimetype" value="image/png"/>
<constructor-arg name="transformOptions">
<map>
<entry key="resizeWidth" value="32"/>
<entry key="resizeHeight" value="32"/>
<entry key="allowEnlargement" value="false" />
<entry key="maintainAspectRatio" value="true"/>
<entry key="thumbnail" value="true"/>
<entry key="timeout" value="${system.thumbnail.definition.default.timeoutMs}" />
</map>
</constructor-arg>
<constructor-arg name="registry" ref="renditionDefinitionRegistry2"/>
</bean>
<bean id="renditionDefinition2Webpreview" class="org.alfresco.repo.rendition2.RenditionDefinition2Impl">
<constructor-arg name="renditionName" value="webpreview"/>
<constructor-arg name="targetMimetype" value="application/x-shockwave-flash"/>
<constructor-arg name="transformOptions">
<map>
<entry key="flashVersion" value="9"/>
<entry key="timeout" value="${system.thumbnail.definition.default.timeoutMs}" />
</map>
</constructor-arg>
<constructor-arg name="registry" ref="renditionDefinitionRegistry2"/>
</bean>
<bean id="renditionDefinition2Pdf" class="org.alfresco.repo.rendition2.RenditionDefinition2Impl">
<constructor-arg name="renditionName" value="pdf"/>
<constructor-arg name="targetMimetype" value="application/pdf"/>
<constructor-arg name="transformOptions">
<map>
<entry key="timeout" value="${system.thumbnail.definition.default.timeoutMs}" />
</map>
</constructor-arg>
<constructor-arg name="registry" ref="renditionDefinitionRegistry2"/>
</bean>
</beans>

View File

@@ -18,11 +18,11 @@
"name": "tika",
"version": "1",
"transformOptions": [
{"value": {"required": false, "name": "transform"}},
{"value": {"required": false, "name": "includeContents"}},
{"value": {"required": false, "name": "notExtractBookmarksText"}},
{"value": {"required": false, "name": "targetMimetype"}},
{"value": {"required": false, "name": "targetEncoding"}}
{"value": {"name": "transform"}},
{"value": {"name": "includeContents"}},
{"value": {"name": "notExtractBookmarksText"}},
{"value": {"name": "targetMimetype"}},
{"value": {"name": "targetEncoding"}}
],
"supportedSourceAndTargetList": [
{"sourceExt": "pdf", "maxSourceSizeBytes": 26214400, "targetExt": "txt" },
@@ -39,11 +39,11 @@
"name": "pdfRenderer",
"version": "1",
"transformOptions": [
{"value": {"required": false, "name": "page"}},
{"value": {"required": false, "name": "width"}},
{"value": {"required": false, "name": "height"}},
{"value": {"required": false, "name": "allowEnlargement"}},
{"value": {"required": false, "name": "maintainAspectRatio"}}
{"value": {"name": "page"}},
{"value": {"name": "width"}},
{"value": {"name": "height"}},
{"value": {"name": "allowPdfEnlargement"}},
{"value": {"name": "maintainPdfAspectRatio"}}
],
"supportedSourceAndTargetList": [
{"sourceExt": "pdf", "targetExt": "png" }
@@ -53,25 +53,25 @@
"name": "imageMagick",
"version": "1",
"transformOptions": [
{"value": {"required": false, "name": "alphaRemove"}},
{"value": {"required": false, "name": "autoOrient"}},
{"value": {"required": false, "name": "startPage"}},
{"value": {"required": false, "name": "endPage"}},
{"group": {"required": false, "transformOptions": [
{"value": {"required": false, "name": "cropGravity"}},
{"value": {"required": false, "name": "cropWidth"}},
{"value": {"required": false, "name": "cropHeight"}},
{"value": {"required": false, "name": "cropPercentage"}},
{"value": {"required": false, "name": "cropXOffset"}},
{"value": {"required": false, "name": "cropYOffset"}}
{"value": {"name": "alphaRemove"}},
{"value": {"name": "autoOrient"}},
{"value": {"name": "startPage"}},
{"value": {"name": "endPage"}},
{"group": {"transformOptions": [
{"value": {"name": "cropGravity"}},
{"value": {"name": "cropWidth"}},
{"value": {"name": "cropHeight"}},
{"value": {"name": "cropPercentage"}},
{"value": {"name": "cropXOffset"}},
{"value": {"name": "cropYOffset"}}
]}},
{"group": {"required": false, "transformOptions": [
{"value": {"required": false, "name": "thumbnail"}},
{"value": {"required": false, "name": "resizeHeight"}},
{"value": {"required": false, "name": "resizeWidth"}},
{"value": {"required": false, "name": "resizePercentage"}},
{"value": {"required": false, "name": "allowEnlargement"}},
{"value": {"required": false, "name": "maintainAspectRatio"}}
{"group": {"transformOptions": [
{"value": {"name": "thumbnail"}},
{"value": {"name": "resizeHeight"}},
{"value": {"name": "resizeWidth"}},
{"value": {"name": "resizePercentage"}},
{"value": {"name": "allowEnlargement"}},
{"value": {"name": "maintainAspectRatio"}}
]}}
],
"supportedSourceAndTargetList": [
@@ -102,35 +102,35 @@
"group": {
"required": true,
"transformOptions": [
{"value": {"required": false, "name": "alphaRemove"}},
{"value": {"required": false, "name": "autoOrient"}},
{"value": {"required": false, "name": "startPage"}},
{"value": {"required": false, "name": "endPage"}},
{"group": {"required": false, "transformOptions": [
{"value": {"required": false, "name": "cropGravity"}},
{"value": {"required": false, "name": "cropWidth"}},
{"value": {"required": false, "name": "cropHeight"}},
{"value": {"required": false, "name": "cropPercentage"}},
{"value": {"required": false, "name": "cropXOffset"}},
{"value": {"required": false, "name": "cropYOffset"}}
{"value": {"name": "alphaRemove"}},
{"value": {"name": "autoOrient"}},
{"value": {"name": "startPage"}},
{"value": {"name": "endPage"}},
{"group": {"transformOptions": [
{"value": {"name": "cropGravity"}},
{"value": {"name": "cropWidth"}},
{"value": {"name": "cropHeight"}},
{"value": {"name": "cropPercentage"}},
{"value": {"name": "cropXOffset"}},
{"value": {"name": "cropYOffset"}}
]}},
{"group": {"required": false, "transformOptions": [
{"value": {"required": false, "name": "thumbnail"}},
{"value": {"required": false, "name": "resizeHeight"}},
{"value": {"required": false, "name": "resizeWidth"}},
{"value": {"required": false, "name": "resizePercentage"}},
{"value": {"required": false, "name": "allowEnlargement"}},
{"value": {"required": false, "name": "maintainAspectRatio"}}
{"group": {"transformOptions": [
{"value": {"name": "thumbnail"}},
{"value": {"name": "resizeHeight"}},
{"value": {"name": "resizeWidth"}},
{"value": {"name": "resizePercentage"}},
{"value": {"name": "allowEnlargement"}},
{"value": {"name": "maintainAspectRatio"}}
]}}
]}},{
"group": {
"required": false,
"transformOptions": [
{"value": {"required": false, "name": "page"}},
{"value": {"required": false, "name": "width"}},
{"value": {"required": false, "name": "height"}},
{"value": {"required": false, "name": "allowEnlargement"}},
{"value": {"required": false, "name": "maintainAspectRatio"}}
{"value": {"name": "page"}},
{"value": {"name": "width"}},
{"value": {"name": "height"}},
{"value": {"name": "allowPdfEnlargement"}},
{"value": {"name": "maintainPdfAspectRatio"}}
]
}
}

View File

@@ -74,4 +74,10 @@ public class NoLocalTransformRenditionTest extends RenditionTest
{
internalTestGifRenditions(0, 0);
}
@Test
public void testAllTransformServiceConfigRenditions() throws Exception
{
internalTestTasRestApiRenditions(0, 0);
}
}

View File

@@ -28,16 +28,19 @@ package org.alfresco.repo.rendition2;
import junit.framework.AssertionFailedError;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.thumbnail.ThumbnailDefinition;
import org.alfresco.transform.client.model.config.TransformServiceRegistry;
import org.alfresco.util.testing.category.DebugTests;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringJoiner;
@@ -48,141 +51,13 @@ import java.util.StringJoiner;
*/
public class RenditionTest extends AbstractRenditionIntegrationTest
{
@Before
public void setUp() throws Exception
{
super.setUp();
AuthenticationUtil.setRunAsUser(AuthenticationUtil.getAdminUserName());
}
// This is the same order as produced by MimetypeMap
public static final List<String> TAS_REST_API_SOURCE_EXTENSIONS = Arrays.asList(
"gif", "jpg", "png", "msg", "doc","ppt", "xls", "docx", "pptx", "xlsx");
private Set<String> getThumbnailNames(List<ThumbnailDefinition> thumbnailDefinitions)
{
Set<String> names = new HashSet<>();
for (ThumbnailDefinition thumbnailDefinition : thumbnailDefinitions)
{
String name = thumbnailDefinition.getName();
names.add(name);
}
return names;
}
private void assertRenditionsOkayFromSourceExtension(List<String> sourceExtensions, List<String> excludeList, List<String> expectedToFail,
int expectedRenditionCount, int expectedFailedCount) throws Exception
{
int expectedSuccessCount = expectedRenditionCount - Math.min(excludeList.size(), expectedRenditionCount) - expectedFailedCount;
int renditionCount = 0;
int failedCount = 0;
int successCount = 0;
RenditionDefinitionRegistry2 renditionDefinitionRegistry2 = renditionService2.getRenditionDefinitionRegistry2();
StringJoiner failures = new StringJoiner("\n");
StringJoiner successes = new StringJoiner("\n");
for (String sourceExtension : sourceExtensions)
{
String sourceMimetype = mimetypeMap.getMimetype(sourceExtension);
String testFileName = getTestFileName(sourceMimetype);
if (testFileName != null)
{
Set<String> renditionNames = renditionDefinitionRegistry2.getRenditionNamesFrom(sourceMimetype, -1);
List<ThumbnailDefinition> thumbnailDefinitions = thumbnailRegistry.getThumbnailDefinitions(sourceMimetype, -1);
Set<String> thumbnailNames = getThumbnailNames(thumbnailDefinitions);
assertEquals("There should be the same renditions ("+renditionNames+") as deprecated thumbnails ("+thumbnailNames+")",
renditionNames, thumbnailNames);
renditionCount += renditionNames.size();
for (String renditionName : renditionNames)
{
RenditionDefinition2 renditionDefinition = renditionDefinitionRegistry2.getRenditionDefinition(renditionName);
String targetMimetype = renditionDefinition.getTargetMimetype();
String targetExtension = mimetypeMap.getExtension(targetMimetype);
String sourceTragetRendition = sourceExtension + ' ' + targetExtension + ' ' + renditionName;
if (!excludeList.contains(sourceTragetRendition))
{
String task = sourceExtension + " " + targetExtension + " " + renditionName;
try
{
checkRendition(testFileName, renditionName, !expectedToFail.contains(sourceTragetRendition));
successes.add(task);
successCount++;
}
catch (AssertionFailedError e)
{
failures.add(task + " " + e.getMessage());
failedCount++;
}
}
}
}
}
System.out.println("FAILURES:\n"+failures+"\n");
System.out.println("SUCCESSES:\n"+successes+"\n");
System.out.println("renditionCount: "+renditionCount+" expected "+expectedRenditionCount);
System.out.println(" failedCount: "+failedCount+" expected "+expectedFailedCount);
System.out.println(" successCount: "+successCount+" expected "+expectedSuccessCount);
assertEquals("Rendition count has changed", expectedRenditionCount, renditionCount);
assertEquals("Failed rendition count has changed", expectedFailedCount, failedCount);
assertEquals("Successful rendition count has changed", expectedSuccessCount, successCount);
if (failures.length() > 0)
{
fail(failures.toString());
}
}
@Test
public void testExpectedNumberOfRenditions() throws Exception
{
RenditionDefinitionRegistry2 renditionDefinitionRegistry21 = renditionService2.getRenditionDefinitionRegistry2();
Set<String> renditionNames = renditionDefinitionRegistry21.getRenditionNames();
assertEquals("Added or removed a definition (rendition-service2-contex.xml)?", 7, renditionNames.size());
}
@Test
public void testTasRestApiRenditions() throws Exception
{
internalTestTasRestApiRenditions(62, 0);
}
protected void internalTestTasRestApiRenditions(int expectedRenditionCount, int expectedFailedCount) throws Exception
{
assertRenditionsOkayFromSourceExtension(Arrays.asList("doc", "xls", "ppt", "docx", "xlsx", "pptx", "msg", "pdf", "png", "gif", "jpg"),
Arrays.asList(new String[]{
"docx jpg imgpreview",
"docx jpg medium",
"xlsx jpg imgpreview",
"xlsx jpg medium",
}),
Collections.emptyList(), expectedRenditionCount, expectedFailedCount);
}
@Category(DebugTests.class)
@Test
public void testAllSourceExtensions() throws Exception
{
internalTestAllSourceExtensions(196, 0);
}
protected void internalTestAllSourceExtensions(int expectedRenditionCount, int expectedFailedCount) throws Exception
{
List<String> sourceExtensions = new ArrayList<>();
for (String sourceMimetype : mimetypeMap.getMimetypes())
{
String sourceExtension = mimetypeMap.getExtension(sourceMimetype);
sourceExtensions.add(sourceExtension);
}
assertRenditionsOkayFromSourceExtension(sourceExtensions,
Arrays.asList(new String[]{
"docx jpg imgpreview",
"docx jpg medium",
"xlsx jpg imgpreview",
"xlsx jpg medium",
public static final List<String> TAS_REST_API_EXCLUDE_LIST = Collections.EMPTY_LIST;
public static final List<String> ALL_SOURCE_EXTENSIONS_EXCLUDE_LIST = Arrays.asList(
"key jpg imgpreview",
"key jpg medium",
"key png doclib",
@@ -212,11 +87,189 @@ public class RenditionTest extends AbstractRenditionIntegrationTest
"wpd png doclib",
"wpd png avatar",
"wpd png avatar32",
"wpd jpg imgpreview"
}),
"wpd jpg imgpreview");
@Autowired
private TransformServiceRegistry transformServiceRegistry;
@Before
public void setUp() throws Exception
{
super.setUp();
AuthenticationUtil.setRunAsUser(AuthenticationUtil.getAdminUserName());
}
private Set<String> getThumbnailNames(List<ThumbnailDefinition> thumbnailDefinitions)
{
Set<String> names = new HashSet<>();
for (ThumbnailDefinition thumbnailDefinition : thumbnailDefinitions)
{
String name = thumbnailDefinition.getName();
names.add(name);
}
return names;
}
private void assertRenditionsOkayFromSourceExtension(List<String> sourceExtensions, List<String> excludeList, List<String> expectedToFail,
int expectedRenditionCount, int expectedFailedCount) throws Exception
{
int renditionCount = 0;
int failedCount = 0;
int successCount = 0;
int excludedCount = 0;
RenditionDefinitionRegistry2 renditionDefinitionRegistry2 = renditionService2.getRenditionDefinitionRegistry2();
StringJoiner failures = new StringJoiner("\n");
StringJoiner successes = new StringJoiner("\n");
for (String sourceExtension : sourceExtensions)
{
String sourceMimetype = mimetypeMap.getMimetype(sourceExtension);
String testFileName = getTestFileName(sourceMimetype);
if (testFileName != null)
{
Set<String> renditionNames = renditionDefinitionRegistry2.getRenditionNamesFrom(sourceMimetype, -1);
List<ThumbnailDefinition> thumbnailDefinitions = thumbnailRegistry.getThumbnailDefinitions(sourceMimetype, -1);
Set<String> thumbnailNames = getThumbnailNames(thumbnailDefinitions);
assertEquals("There should be the same renditions ("+renditionNames+") as deprecated thumbnails ("+thumbnailNames+")",
renditionNames, thumbnailNames);
renditionCount += renditionNames.size();
for (String renditionName : renditionNames)
{
RenditionDefinition2 renditionDefinition = renditionDefinitionRegistry2.getRenditionDefinition(renditionName);
String targetMimetype = renditionDefinition.getTargetMimetype();
String targetExtension = mimetypeMap.getExtension(targetMimetype);
String sourceTragetRendition = sourceExtension + ' ' + targetExtension + ' ' + renditionName;
if (excludeList.contains(sourceTragetRendition))
{
excludedCount++;
}
else
{
String task = sourceExtension + " " + targetExtension + " " + renditionName;
try
{
checkRendition(testFileName, renditionName, !expectedToFail.contains(sourceTragetRendition));
successes.add(task);
successCount++;
}
catch (AssertionFailedError e)
{
failures.add(task + " " + e.getMessage());
failedCount++;
}
}
}
}
}
int expectedSuccessCount = expectedRenditionCount - excludedCount - expectedFailedCount;
System.out.println("FAILURES:\n"+failures+"\n");
System.out.println("SUCCESSES:\n"+successes+"\n");
System.out.println("renditionCount: "+renditionCount+" expected "+expectedRenditionCount);
System.out.println(" failedCount: "+failedCount+" expected "+expectedFailedCount);
System.out.println(" successCount: "+successCount+" expected "+expectedSuccessCount);
assertEquals("Rendition count has changed", expectedRenditionCount, renditionCount);
assertEquals("Failed rendition count has changed", expectedFailedCount, failedCount);
assertEquals("Successful rendition count has changed", expectedSuccessCount, successCount);
if (failures.length() > 0)
{
fail(failures.toString());
}
}
@Test
public void testExpectedNumberOfRenditions() throws Exception
{
RenditionDefinitionRegistry2 renditionDefinitionRegistry21 = renditionService2.getRenditionDefinitionRegistry2();
Set<String> renditionNames = renditionDefinitionRegistry21.getRenditionNames();
assertEquals("Added or removed a definition (rendition-service2-contex.xml)?", 7, renditionNames.size());
}
@Category(DebugTests.class)
public void testTasRestApiRenditions() throws Exception
{
internalTestTasRestApiRenditions(62, 0);
}
protected void internalTestTasRestApiRenditions(int expectedRenditionCount, int expectedFailedCount) throws Exception
{
assertRenditionsOkayFromSourceExtension(TAS_REST_API_SOURCE_EXTENSIONS, TAS_REST_API_EXCLUDE_LIST,
Collections.emptyList(), expectedRenditionCount, expectedFailedCount);
}
@Category(DebugTests.class)
@Test
public void testAllSourceExtensions() throws Exception
{
internalTestAllSourceExtensions(196, 0);
}
protected void internalTestAllSourceExtensions(int expectedRenditionCount, int expectedFailedCount) throws Exception
{
List<String> sourceExtensions = getAllSourceMimetypes();
assertRenditionsOkayFromSourceExtension(sourceExtensions,
ALL_SOURCE_EXTENSIONS_EXCLUDE_LIST,
Collections.emptyList(), expectedRenditionCount, expectedFailedCount);
}
@Category(DebugTests.class)
@Test
public void testTransformServiceConfig() throws Exception
{
internalTestTransformServiceConfig(57, 0);
}
// Tests all renditions supported by the TransformServiceRegistry (in the case of Transform Service, see
// transform-service-config.json and the LegacyLocalTransformServiceRegistry see the original ACS config).
protected void internalTestTransformServiceConfig(int expectedRenditionCount, int expectedFailedCount) throws Exception
{
List<String> sourceExtensions = getAllSourceMimetypes();
List<String> excludeList = new ArrayList<>();
for (String sourceExtension : sourceExtensions)
{
String sourceMimetype = mimetypeMap.getMimetype(sourceExtension);
String testFileName = getTestFileName(sourceMimetype);
if (testFileName != null)
{
Set<String> renditionNames = renditionDefinitionRegistry2.getRenditionNamesFrom(sourceMimetype, -1);
for (String renditionName : renditionNames)
{
RenditionDefinition2 renditionDefinition = renditionDefinitionRegistry2.getRenditionDefinition(renditionName);
String targetMimetype = renditionDefinition.getTargetMimetype();
String targetExtension = mimetypeMap.getExtension(targetMimetype);
String sourceTragetRendition = sourceExtension + ' ' + targetExtension + ' ' + renditionName;
Map<String, String> actualOptions = renditionDefinition.getTransformOptions();
if (!transformServiceRegistry.isSupported(sourceMimetype, -1L, targetMimetype,
actualOptions, null))
{
excludeList.add(sourceTragetRendition);
}
}
}
}
assertRenditionsOkayFromSourceExtension(sourceExtensions, excludeList,
Collections.emptyList(), expectedRenditionCount, expectedFailedCount);
}
private List<String> getAllSourceMimetypes()
{
List<String> sourceExtensions = new ArrayList<>();
for (String sourceMimetype : mimetypeMap.getMimetypes())
{
String sourceExtension = mimetypeMap.getExtension(sourceMimetype);
sourceExtensions.add(sourceExtension);
}
return sourceExtensions;
}
@Test
public void testGifRenditions() throws Exception
{

View File

@@ -265,8 +265,8 @@ public class TransformServiceRegistryImplTest
new TransformOptionValue(false, "page"),
new TransformOptionValue(false, "width"),
new TransformOptionValue(false, "height"),
new TransformOptionValue(false, "allowEnlargement"),
new TransformOptionValue(false, "maintainAspectRatio")),
new TransformOptionValue(false, "allowPdfEnlargement"),
new TransformOptionValue(false, "maintainPdfAspectRatio")),
Arrays.asList(
new SupportedSourceAndTarget(PDF, PNG, -1)));
@@ -416,6 +416,34 @@ public class TransformServiceRegistryImplTest
"There may be multiple transformers for the same combination. Config change?",
4, countSupportedTransforms(false));
ConcurrentMap<String, List<TransformServiceRegistryImpl.SupportedTransform>> transformer =
registry.transformers.get("officeToImageViaPdf");
// Check required and optional default correctly
ConcurrentMap<String, List<TransformServiceRegistryImpl.SupportedTransform>> transformsToWord =
registry.transformers.get("application/msword");
List<TransformServiceRegistryImpl.SupportedTransform> supportedTransforms = transformsToWord.get("image/gif");
TransformServiceRegistryImpl.SupportedTransform supportedTransform = supportedTransforms.get(0);
TransformOptionGroup imageMagick = (TransformOptionGroup)supportedTransform.transformOptions.transformOptions.get(0);
TransformOptionGroup pdf = (TransformOptionGroup)supportedTransform.transformOptions.transformOptions.get(1);
TransformOptionValue alphaRemove = (TransformOptionValue)imageMagick.transformOptions.get(0);
TransformOptionGroup crop = (TransformOptionGroup)imageMagick.transformOptions.get(4);
TransformOptionValue cropGravity = (TransformOptionValue)crop.transformOptions.get(0);
TransformOptionValue cropWidth = (TransformOptionValue)crop.transformOptions.get(1);
assertTrue("The holding group should be required", supportedTransform.transformOptions.isRequired());
assertTrue("imageMagick should be required as it is set", imageMagick.isRequired());
assertFalse("pdf should be optional as required is not set", pdf.isRequired());
assertEquals("alphaRemove", alphaRemove.getName());
assertEquals("cropGravity", cropGravity.getName());
assertEquals("cropWidth", cropWidth.getName());
assertFalse("alphaRemove should be optional as required is not set", alphaRemove.isRequired());
assertFalse("crop should be optional as required is not set", crop.isRequired());
assertTrue("cropGravity should be required as it is set", cropGravity.isRequired());
assertFalse("cropWidth should be optional as required is not set", cropWidth.isRequired());
// Check a supported transform for each transformer.
assertSupported(DOC,1234, GIF, null, null, "");
assertSupported(DOC,1234, PNG, null, null, "");

View File

@@ -7,35 +7,34 @@
"group": {
"required": true,
"transformOptions": [
{"value": {"required": false, "name": "alphaRemove"}},
{"value": {"required": false, "name": "autoOrient"}},
{"value": {"required": false, "name": "startPage"}},
{"value": {"required": false, "name": "endPage"}},
{"group": {"required": false, "transformOptions": [
{"value": {"required": false, "name": "cropGravity"}},
{"value": {"required": false, "name": "cropWidth"}},
{"value": {"required": false, "name": "cropHeight"}},
{"value": {"required": false, "name": "cropPercentage"}},
{"value": {"required": false, "name": "cropXOffset"}},
{"value": {"required": false, "name": "cropYOffset"}}
{"value": {"name": "alphaRemove"}},
{"value": {"name": "autoOrient"}},
{"value": {"name": "startPage"}},
{"value": {"name": "endPage"}},
{"group": {"transformOptions": [
{"value": {"required": "true", "name": "cropGravity"}},
{"value": {"name": "cropWidth"}},
{"value": {"name": "cropHeight"}},
{"value": {"name": "cropPercentage"}},
{"value": {"name": "cropXOffset"}},
{"value": {"name": "cropYOffset"}}
]}},
{"group": {"required": false, "transformOptions": [
{"value": {"required": false, "name": "thumbnail"}},
{"value": {"required": false, "name": "resizeHeight"}},
{"value": {"required": false, "name": "resizeWidth"}},
{"value": {"required": false, "name": "resizePercentage"}},
{"value": {"required": false, "name": "allowEnlargement"}},
{"value": {"required": false, "name": "maintainAspectRatio"}}
{"group": {"transformOptions": [
{"value": {"name": "thumbnail"}},
{"value": {"name": "resizeHeight"}},
{"value": {"name": "resizeWidth"}},
{"value": {"name": "resizePercentage"}},
{"value": {"name": "allowEnlargement"}},
{"value": {"name": "maintainAspectRatio"}}
]}}
]}},{
"group": {
"required": false,
"transformOptions": [
{"value": {"required": false, "name": "page"}},
{"value": {"required": false, "name": "width"}},
{"value": {"required": false, "name": "height"}},
{"value": {"required": false, "name": "allowEnlargement"}},
{"value": {"required": false, "name": "maintainAspectRatio"}}
{"value": {"name": "page"}},
{"value": {"name": "width"}},
{"value": {"name": "height"}},
{"value": {"name": "allowPdfEnlargement"}},
{"value": {"name": "maintainPdfAspectRatio"}}
]
}
}