From 21550ec30be4a740c504b9c2ed27bf65091dea36 Mon Sep 17 00:00:00 2001 From: SatyamSah5 Date: Fri, 22 Aug 2025 16:39:46 +0530 Subject: [PATCH] ACS-9991 Allow Content and Metadata extract even if thumbnails are disabled (#3537) --- .../rendition2/RenditionService2Impl.java | 29 +++++++++- .../RenditionService2IntegrationTest.java | 54 +++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/repository/src/main/java/org/alfresco/repo/rendition2/RenditionService2Impl.java b/repository/src/main/java/org/alfresco/repo/rendition2/RenditionService2Impl.java index 730b476b03..25ff0f414f 100644 --- a/repository/src/main/java/org/alfresco/repo/rendition2/RenditionService2Impl.java +++ b/repository/src/main/java/org/alfresco/repo/rendition2/RenditionService2Impl.java @@ -81,11 +81,19 @@ public class RenditionService2Impl implements RenditionService2, InitializingBea public static final QName DEFAULT_RENDITION_CONTENT_PROP = ContentModel.PROP_CONTENT; public static final String DEFAULT_MIMETYPE = MimetypeMap.MIMETYPE_TEXT_PLAIN; + public static final String MIMETYPE_METADATA_EXTRACT = "alfresco-metadata-extract"; + public static final String MIMETYPE_METADATA_EMBED = "alfresco-metadata-embed"; public static final String DEFAULT_ENCODING = "UTF-8"; public static final int SOURCE_HAS_NO_CONTENT = -1; public static final int RENDITION2_DOES_NOT_EXIST = -2; + // Allowed mimetypes to support text or metadata extract transforms when thumbnails are disabled. + private static final Set ALLOWED_MIMETYPES = Set.of( + MimetypeMap.MIMETYPE_TEXT_PLAIN, + MIMETYPE_METADATA_EXTRACT, + MIMETYPE_METADATA_EMBED); + private static Log logger = LogFactory.getLog(RenditionService2Impl.class); // As Async transforms and renditions are so similar, this class provides a way to provide the code that is different. @@ -288,7 +296,7 @@ public class RenditionService2Impl implements RenditionService2, InitializingBea { try { - if (!isEnabled()) + if (!isAsyncAllowed(renderOrTransform)) { throw new RenditionService2Exception("Async transforms and renditions are disabled " + "(system.thumbnail.generate=false or renditionService2.enabled=false)."); @@ -967,4 +975,23 @@ public class RenditionService2Impl implements RenditionService2, InitializingBea } } } + + // Checks if the given transform callback is a text extract transform for content indexing or metadata extract/embed. + private boolean isTextOrMetadataExtractTransform(RenderOrTransformCallBack renderOrTransform) + { + RenditionDefinition2 renditionDefinition = renderOrTransform.getRenditionDefinition(); + return renditionDefinition != null && ALLOWED_MIMETYPES.contains(renditionDefinition.getTargetMimetype()); + } + + private boolean isAsyncAllowed(RenderOrTransformCallBack renderOrTransform) + { + // If enabled is false, all async transforms/renditions must be blocked + if (!enabled) + { + return false; + } + + // If thumbnails are disabled, allow only text extract or metadata extract/embed transforms + return thumbnailsEnabled || isTextOrMetadataExtractTransform(renderOrTransform); + } } diff --git a/repository/src/test/java/org/alfresco/repo/rendition2/RenditionService2IntegrationTest.java b/repository/src/test/java/org/alfresco/repo/rendition2/RenditionService2IntegrationTest.java index b2fd768e7a..548e7f5d3f 100644 --- a/repository/src/test/java/org/alfresco/repo/rendition2/RenditionService2IntegrationTest.java +++ b/repository/src/test/java/org/alfresco/repo/rendition2/RenditionService2IntegrationTest.java @@ -39,6 +39,7 @@ import org.junit.Test; import org.alfresco.model.ContentModel; import org.alfresco.model.RenditionModel; +import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.service.cmr.repository.ChildAssociationRef; @@ -776,4 +777,57 @@ public class RenditionService2IntegrationTest extends AbstractRenditionIntegrati } } + + @Test + public void testTextExtractTransformAllowedWhenThumbnailDisabled() + { + // create a source node + NodeRef sourceNodeRef = createSource(ADMIN, "quick.pdf"); + assertNotNull("Node not generated", sourceNodeRef); + String replyQueue = "org.test.queue"; + String targetMimetype = MimetypeMap.MIMETYPE_TEXT_PLAIN; + + TransformDefinition textExtractTransform = new TransformDefinition( + targetMimetype, + java.util.Collections.emptyMap(), + "clientData", + replyQueue, + "requestId"); + + renditionService2.setThumbnailsEnabled(false); + try + { + // Should NOT throw, as this is a text extract transform + AuthenticationUtil.runAs(() -> { + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + renditionService2.transform(sourceNodeRef, textExtractTransform); + return null; + }); + return null; + }, ADMIN); + } + finally + { + renditionService2.setThumbnailsEnabled(true); + } + } + + @Test + public void testMetadataExtractTransformAllowedWhenThumbnailDisabled() + { + // create a source node + NodeRef sourceNodeRef = createSource(ADMIN, "quick.pdf"); + assertNotNull("Node not generated", sourceNodeRef); + renditionService2.setThumbnailsEnabled(false); + try + { + // Should NOT throw, as this is a metadata extract transform + extract(ADMIN, sourceNodeRef); + waitForExtract(ADMIN, sourceNodeRef, true); + } + finally + { + renditionService2.setThumbnailsEnabled(true); + } + } }