diff --git a/pom.xml b/pom.xml index c8b54bcedf..7023bad3b3 100644 --- a/pom.xml +++ b/pom.xml @@ -51,8 +51,8 @@ 7.0.2 5.23.0 5.23.0 - 5.1.8-A.1 - 4.1.8-A.1 + 5.1.8-A.2 + 4.1.8-A.2 7.1 1.0.2 diff --git a/repository/src/main/java/org/alfresco/repo/content/transform/AbstractLocalTransform.java b/repository/src/main/java/org/alfresco/repo/content/transform/AbstractLocalTransform.java index 79b171420c..269b4524f8 100644 --- a/repository/src/main/java/org/alfresco/repo/content/transform/AbstractLocalTransform.java +++ b/repository/src/main/java/org/alfresco/repo/content/transform/AbstractLocalTransform.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2019 - 2022 Alfresco Software Limited + * Copyright (C) 2019 - 2025 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -39,6 +39,7 @@ 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.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.transform.config.TransformOption; import org.alfresco.transform.config.TransformOptionGroup; import org.alfresco.transform.config.TransformOptionValue; @@ -52,6 +53,7 @@ public abstract class AbstractLocalTransform implements LocalTransform protected final String name; protected final MimetypeService mimetypeService; + protected final NodeService nodeService; protected final TransformerDebug transformerDebug; protected final Set transformsTransformOptionNames = new HashSet<>(); @@ -65,7 +67,8 @@ public abstract class AbstractLocalTransform implements LocalTransform MimetypeService mimetypeService, boolean strictMimeTypeCheck, Map> strictMimetypeExceptions, boolean retryTransformOnDifferentMimeType, Set transformsTransformOptions, - LocalTransformServiceRegistry localTransformServiceRegistry) + LocalTransformServiceRegistry localTransformServiceRegistry, + NodeService nodeService) { this.name = name; this.transformerDebug = transformerDebug; @@ -74,6 +77,7 @@ public abstract class AbstractLocalTransform implements LocalTransform this.strictMimetypeExceptions = strictMimetypeExceptions; this.retryTransformOnDifferentMimeType = retryTransformOnDifferentMimeType; this.localTransformServiceRegistry = localTransformServiceRegistry; + this.nodeService = nodeService; addOptionNames(transformsTransformOptionNames, transformsTransformOptions); } diff --git a/repository/src/main/java/org/alfresco/repo/content/transform/LocalFailoverTransform.java b/repository/src/main/java/org/alfresco/repo/content/transform/LocalFailoverTransform.java index cee13bc330..f4ec8642cb 100644 --- a/repository/src/main/java/org/alfresco/repo/content/transform/LocalFailoverTransform.java +++ b/repository/src/main/java/org/alfresco/repo/content/transform/LocalFailoverTransform.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2019 - 2022 Alfresco Software Limited + * Copyright (C) 2019 - 2025 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -37,6 +37,7 @@ 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.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.transform.config.TransformOption; import org.alfresco.util.TempFileProvider; @@ -54,10 +55,10 @@ public class LocalFailoverTransform extends AbstractLocalTransform Map> strictMimetypeExceptions, boolean retryTransformOnDifferentMimeType, Set transformsTransformOptions, - LocalTransformServiceRegistry localTransformServiceRegistry) + LocalTransformServiceRegistry localTransformServiceRegistry, NodeService nodeService) { super(name, transformerDebug, mimetypeService, strictMimeTypeCheck, strictMimetypeExceptions, - retryTransformOnDifferentMimeType, transformsTransformOptions, localTransformServiceRegistry); + retryTransformOnDifferentMimeType, transformsTransformOptions, localTransformServiceRegistry, nodeService); } @Override diff --git a/repository/src/main/java/org/alfresco/repo/content/transform/LocalPassThroughTransform.java b/repository/src/main/java/org/alfresco/repo/content/transform/LocalPassThroughTransform.java index e45c6bc5a0..17ca9731ae 100644 --- a/repository/src/main/java/org/alfresco/repo/content/transform/LocalPassThroughTransform.java +++ b/repository/src/main/java/org/alfresco/repo/content/transform/LocalPassThroughTransform.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2022 Alfresco Software Limited + * Copyright (C) 2005 - 2025 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -41,6 +41,7 @@ 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.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.transform.config.SupportedSourceAndTarget; import org.alfresco.transform.config.TransformOption; import org.alfresco.transform.config.Transformer; @@ -63,10 +64,10 @@ public class LocalPassThroughTransform extends AbstractLocalTransform Map> strictMimetypeExceptions, boolean retryTransformOnDifferentMimeType, Set transformsTransformOptions, - LocalTransformServiceRegistry localTransformServiceRegistry) + LocalTransformServiceRegistry localTransformServiceRegistry, NodeService nodeService) { super(name, transformerDebug, mimetypeService, strictMimeTypeCheck, strictMimetypeExceptions, - retryTransformOnDifferentMimeType, transformsTransformOptions, localTransformServiceRegistry); + retryTransformOnDifferentMimeType, transformsTransformOptions, localTransformServiceRegistry, nodeService); } public static Transformer getConfig(List mimetypes) diff --git a/repository/src/main/java/org/alfresco/repo/content/transform/LocalPipelineTransform.java b/repository/src/main/java/org/alfresco/repo/content/transform/LocalPipelineTransform.java index 7a71c94fcc..0ada671e95 100644 --- a/repository/src/main/java/org/alfresco/repo/content/transform/LocalPipelineTransform.java +++ b/repository/src/main/java/org/alfresco/repo/content/transform/LocalPipelineTransform.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2022 Alfresco Software Limited + * Copyright (C) 2005 - 2025 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -38,6 +38,7 @@ 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.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.transform.config.TransformOption; import org.alfresco.util.TempFileProvider; @@ -61,10 +62,10 @@ public class LocalPipelineTransform extends AbstractLocalTransform Map> strictMimetypeExceptions, boolean retryTransformOnDifferentMimeType, Set transformsTransformOptions, - LocalTransformServiceRegistry localTransformServiceRegistry) + LocalTransformServiceRegistry localTransformServiceRegistry, NodeService nodeService) { super(name, transformerDebug, mimetypeService, strictMimeTypeCheck, strictMimetypeExceptions, - retryTransformOnDifferentMimeType, transformsTransformOptions, localTransformServiceRegistry); + retryTransformOnDifferentMimeType, transformsTransformOptions, localTransformServiceRegistry, nodeService); } @Override diff --git a/repository/src/main/java/org/alfresco/repo/content/transform/LocalTransformImpl.java b/repository/src/main/java/org/alfresco/repo/content/transform/LocalTransformImpl.java index a6f4c6eba2..eba4418474 100644 --- a/repository/src/main/java/org/alfresco/repo/content/transform/LocalTransformImpl.java +++ b/repository/src/main/java/org/alfresco/repo/content/transform/LocalTransformImpl.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2022 Alfresco Software Limited + * Copyright (C) 2005 - 2025 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -26,19 +26,24 @@ package org.alfresco.repo.content.transform; import static org.alfresco.repo.rendition2.RenditionDefinition2.SOURCE_ENCODING; +import static org.alfresco.repo.rendition2.RenditionDefinition2.SOURCE_FILENAME; import static org.alfresco.repo.rendition2.RenditionDefinition2.SOURCE_NODE_REF; import java.util.HashMap; import java.util.Map; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + import org.alfresco.httpclient.HttpClientConfig; +import org.alfresco.model.ContentModel; import org.alfresco.repo.content.metadata.AsynchronousExtractor; import org.alfresco.repo.rendition2.RenditionDefinition2; 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.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.transform.config.TransformOption; import org.alfresco.util.Pair; @@ -60,10 +65,11 @@ public class LocalTransformImpl extends AbstractLocalTransform Set transformsTransformOptions, LocalTransformServiceRegistry localTransformServiceRegistry, String baseUrl, HttpClientConfig httpClientConfig, + NodeService nodeService, int startupRetryPeriodSeconds) { super(name, transformerDebug, mimetypeService, strictMimeTypeCheck, strictMimetypeExceptions, - retryTransformOnDifferentMimeType, transformsTransformOptions, localTransformServiceRegistry); + retryTransformOnDifferentMimeType, transformsTransformOptions, localTransformServiceRegistry, nodeService); remoteTransformerClient = new RemoteTransformerClient(name, baseUrl, httpClientConfig); remoteTransformerClient.setStartupRetryPeriodSeconds(startupRetryPeriodSeconds); @@ -155,6 +161,17 @@ public class LocalTransformImpl extends AbstractLocalTransform transformOptions.put(SOURCE_NODE_REF, sourceNodeRef.toString()); } + String filename = null; + if (sourceNodeRef != null && nodeService.exists(sourceNodeRef)) + { + filename = (String) nodeService.getProperty(sourceNodeRef, ContentModel.PROP_NAME); + } + + if (StringUtils.isNotEmpty(filename)) + { + transformOptions.put(SOURCE_FILENAME, filename); + } + // Build an array of option names and values and extract the timeout. long timeoutMs = 0; int nonOptions = transformOptions.containsKey(RenditionDefinition2.TIMEOUT) ? 1 : 0; diff --git a/repository/src/main/java/org/alfresco/repo/content/transform/LocalTransformServiceRegistry.java b/repository/src/main/java/org/alfresco/repo/content/transform/LocalTransformServiceRegistry.java index 2d278db113..1f7c3a7e0f 100644 --- a/repository/src/main/java/org/alfresco/repo/content/transform/LocalTransformServiceRegistry.java +++ b/repository/src/main/java/org/alfresco/repo/content/transform/LocalTransformServiceRegistry.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2019 - 2023 Alfresco Software Limited + * Copyright (C) 2019 - 2025 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -43,6 +43,7 @@ import org.springframework.beans.factory.InitializingBean; import org.alfresco.httpclient.HttpClientConfig; import org.alfresco.service.cmr.repository.MimetypeService; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.transform.config.CoreFunction; import org.alfresco.transform.config.TransformOption; import org.alfresco.transform.config.TransformOptionGroup; @@ -71,6 +72,7 @@ public class LocalTransformServiceRegistry extends TransformServiceRegistryImpl private Map localTransforms = new HashMap<>(); } + private NodeService nodeService; private String pipelineConfigDir; private Properties properties; private MimetypeService mimetypeService; @@ -85,6 +87,11 @@ public class LocalTransformServiceRegistry extends TransformServiceRegistryImpl return httpClientConfig; } + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + public void setHttpClientConfig(HttpClientConfig httpClientConfig) { this.httpClientConfig = httpClientConfig; @@ -139,6 +146,7 @@ public class LocalTransformServiceRegistry extends TransformServiceRegistryImpl PropertyCheck.mandatory(this, "mimetypeService", mimetypeService); PropertyCheck.mandatory(this, "properties", properties); PropertyCheck.mandatory(this, "transformerDebug", transformerDebug); + PropertyCheck.mandatory(this, "nodeService", nodeService); strictMimetypeExceptions = getStrictMimetypeExceptions(); super.afterPropertiesSet(); } @@ -193,14 +201,14 @@ public class LocalTransformServiceRegistry extends TransformServiceRegistryImpl { localTransform = new LocalPassThroughTransform(name, transformerDebug, mimetypeService, strictMimeTypeCheck, strictMimetypeExceptions, retryTransformOnDifferentMimeType, - transformsTransformOptions, this); + transformsTransformOptions, this, nodeService); } else if (!isPipeline && !isFailover) { int startupRetryPeriodSeconds = getStartupRetryPeriodSeconds(name); localTransform = new LocalTransformImpl(name, transformerDebug, mimetypeService, strictMimeTypeCheck, strictMimetypeExceptions, retryTransformOnDifferentMimeType, - transformsTransformOptions, this, baseUrl, httpClientConfig, + transformsTransformOptions, this, baseUrl, httpClientConfig, nodeService, startupRetryPeriodSeconds); } else if (isPipeline) @@ -215,7 +223,7 @@ public class LocalTransformServiceRegistry extends TransformServiceRegistryImpl localTransform = new LocalPipelineTransform(name, transformerDebug, mimetypeService, strictMimeTypeCheck, strictMimetypeExceptions, retryTransformOnDifferentMimeType, - transformsTransformOptions, this); + transformsTransformOptions, this, nodeService); for (int i = 0; i < transformerCount; i++) { TransformStep intermediateTransformerStep = pipeline.get(i); @@ -264,7 +272,7 @@ public class LocalTransformServiceRegistry extends TransformServiceRegistryImpl localTransform = new LocalFailoverTransform(name, transformerDebug, mimetypeService, strictMimeTypeCheck, strictMimetypeExceptions, retryTransformOnDifferentMimeType, - transformsTransformOptions, this); + transformsTransformOptions, this, nodeService); for (String transformerStepName : failover) { diff --git a/repository/src/main/java/org/alfresco/repo/rendition2/RenditionDefinition2.java b/repository/src/main/java/org/alfresco/repo/rendition2/RenditionDefinition2.java index 6614ebc533..95ec69a4fe 100644 --- a/repository/src/main/java/org/alfresco/repo/rendition2/RenditionDefinition2.java +++ b/repository/src/main/java/org/alfresco/repo/rendition2/RenditionDefinition2.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2018 Alfresco Software Limited + * Copyright (C) 2005 - 2025 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -35,6 +35,7 @@ import org.alfresco.api.AlfrescoPublicApi; * @author adavis */ @AlfrescoPublicApi +@SuppressWarnings({"PMD.UnnecessaryFullyQualifiedName", "PMD.UnnecessaryModifier"}) public interface RenditionDefinition2 { public static final String TIMEOUT = "timeout"; @@ -106,6 +107,11 @@ public interface RenditionDefinition2 */ public static final String SOURCE_NODE_REF = "sourceNodeRef"; + /** + * The Source File Name is automatically added to the Transform Options if not specified and the transformer knows about it. + */ + public static final String SOURCE_FILENAME = "sourceFilename"; + /** * The encoding of a Target Node is automatically added to the Transform Options if not specified and the transformer knows about it. */ diff --git a/repository/src/main/resources/alfresco/rendition-services2-context.xml b/repository/src/main/resources/alfresco/rendition-services2-context.xml index b207f15dc7..42f3313104 100644 --- a/repository/src/main/resources/alfresco/rendition-services2-context.xml +++ b/repository/src/main/resources/alfresco/rendition-services2-context.xml @@ -128,6 +128,7 @@ + diff --git a/repository/src/test/java/org/alfresco/transform/registry/LocalTransformServiceRegistryConfigTest.java b/repository/src/test/java/org/alfresco/transform/registry/LocalTransformServiceRegistryConfigTest.java index 394331aea1..7b8b7d9cc8 100644 --- a/repository/src/test/java/org/alfresco/transform/registry/LocalTransformServiceRegistryConfigTest.java +++ b/repository/src/test/java/org/alfresco/transform/registry/LocalTransformServiceRegistryConfigTest.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2023 Alfresco Software Limited + * Copyright (C) 2005 - 2025 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -64,6 +64,7 @@ import org.alfresco.repo.content.transform.LocalPipelineTransform; import org.alfresco.repo.content.transform.LocalTransformImpl; import org.alfresco.repo.content.transform.LocalTransformServiceRegistry; import org.alfresco.repo.content.transform.TransformerDebug; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.transform.config.SupportedSourceAndTarget; import org.alfresco.transform.config.TransformConfig; import org.alfresco.transform.config.TransformOption; @@ -205,6 +206,9 @@ public class LocalTransformServiceRegistryConfigTest extends TransformRegistryMo @Mock private MimetypeMap mimetypeMap; + @Mock + private NodeService nodeService; + private Map> imagemagickSupportedTransformation; private Map> tikaSupportedTransformation; private Map> pdfRendererSupportedTransformation; @@ -232,6 +236,7 @@ public class LocalTransformServiceRegistryConfigTest extends TransformRegistryMo registry.setProperties(properties); registry.setTransformerDebug(transformerDebug); registry.setMimetypeService(mimetypeMap); + registry.setNodeService(nodeService); registry.setPipelineConfigDir(""); registry.setCronExpression(null); // just read it once registry.afterPropertiesSet(); diff --git a/repository/src/test/resources/test/alfresco/test-renditions-context.xml b/repository/src/test/resources/test/alfresco/test-renditions-context.xml index 990b71bf97..eea831a8f7 100644 --- a/repository/src/test/resources/test/alfresco/test-renditions-context.xml +++ b/repository/src/test/resources/test/alfresco/test-renditions-context.xml @@ -28,6 +28,7 @@ + \ No newline at end of file