From 2d2b4357f9bd6afb50907ca482f5e465490cc1f5 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Thu, 3 Dec 2020 09:38:12 +0000 Subject: [PATCH] ACS-976 Metadata extraction NPE thrown in multi-node cluster using ATS (#190) * ACS-976 Metadata extraction NPE thrown in multi-node cluster using ATS In a multi repo node cluster, it is possible one node requests a metadata extract via the ATS and that another responds to it. In this case the responder needs to recreate the TransformRequest. In this case the target mimetype was wrong, resulting in the TransformRequest being sent to the wrong code which then through a NPE because there was no replyQueue specified on the TransformRequest. * ACS-963 Investigate testSharedLinkCreateGetDelete failures Modified date changes. It can change now as metadata extract is async --- .../rest/api/tests/SharedLinkApiTest.java | 2 +- .../metadata/AsynchronousExtractor.java | 16 +++++++++++++ .../executer/AsynchronousExtractorTest.java | 24 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/remote-api/src/test/java/org/alfresco/rest/api/tests/SharedLinkApiTest.java b/remote-api/src/test/java/org/alfresco/rest/api/tests/SharedLinkApiTest.java index ee89070bc1..2cd00ce6fc 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/tests/SharedLinkApiTest.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/tests/SharedLinkApiTest.java @@ -483,7 +483,7 @@ public class SharedLinkApiTest extends AbstractBaseApiTest response = getSingle(NodesEntityResource.class, d1Id, null, 200); nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); - assertEquals(docModifiedAt.getTime(), nodeResp.getModifiedAt().getTime()); // not changed +// assertEquals(docModifiedAt.getTime(), nodeResp.getModifiedAt().getTime()); // not changed - now can be as metadata extract is async assertEquals(docModifiedBy, nodeResp.getModifiedByUser().getId()); // not changed (ie. not user2) diff --git a/repository/src/main/java/org/alfresco/repo/content/metadata/AsynchronousExtractor.java b/repository/src/main/java/org/alfresco/repo/content/metadata/AsynchronousExtractor.java index ec388f0ec6..4699200d83 100644 --- a/repository/src/main/java/org/alfresco/repo/content/metadata/AsynchronousExtractor.java +++ b/repository/src/main/java/org/alfresco/repo/content/metadata/AsynchronousExtractor.java @@ -189,6 +189,22 @@ public class AsynchronousExtractor extends AbstractMappingMetadataExtracter return MIMETYPE_METADATA_EMBED.equals(targetMimetype); } + public static String getTargetMimetypeFromTransformName(String transformName) + { + return transformName == null ? null + : transformName.startsWith(MIMETYPE_METADATA_EXTRACT) ? MIMETYPE_METADATA_EXTRACT + : transformName.startsWith(MIMETYPE_METADATA_EMBED) ? MIMETYPE_METADATA_EMBED + : null; + } + + public static String getSourceMimetypeFromTransformName(String transformName) + { + return transformName == null ? null + : transformName.startsWith(MIMETYPE_METADATA_EXTRACT) ? transformName.substring(MIMETYPE_METADATA_EXTRACT.length()+1) + : transformName.startsWith(MIMETYPE_METADATA_EMBED) ? transformName.substring(MIMETYPE_METADATA_EMBED.length()+1) + : null; + } + /** * Returns a file extension used as the target in a transform. The normal extension is changed if the * {@code targetMimetype} is an extraction or embedding type. diff --git a/repository/src/test/java/org/alfresco/repo/action/executer/AsynchronousExtractorTest.java b/repository/src/test/java/org/alfresco/repo/action/executer/AsynchronousExtractorTest.java index 7c468671f0..a470d16b02 100644 --- a/repository/src/test/java/org/alfresco/repo/action/executer/AsynchronousExtractorTest.java +++ b/repository/src/test/java/org/alfresco/repo/action/executer/AsynchronousExtractorTest.java @@ -844,4 +844,28 @@ public class AsynchronousExtractorTest extends BaseSpringTest assertEquals("Unexpected tags", 0, tags.size()); } + + @Test + public void testStaticMethods() + { + assertTrue("isMetadataExtractMimetype", AsynchronousExtractor.isMetadataExtractMimetype("alfresco-metadata-extract")); + assertTrue("isMetadataEmbedMimetype", AsynchronousExtractor.isMetadataEmbedMimetype("alfresco-metadata-embed")); + assertFalse("isMetadataExtractMimetype", AsynchronousExtractor.isMetadataExtractMimetype("alfresco-metadata-embed")); + assertFalse("isMetadataEmbedMimetype", AsynchronousExtractor.isMetadataEmbedMimetype("alfresco-metadata-extract")); + + assertEquals("getTargetMimetypeFromTransformName", "alfresco-metadata-extract", + AsynchronousExtractor.getTargetMimetypeFromTransformName("alfresco-metadata-extract/text/plain")); + assertEquals("getTargetMimetypeFromTransformName", "alfresco-metadata-embed", + AsynchronousExtractor.getTargetMimetypeFromTransformName("alfresco-metadata-embed/text/plain")); + + assertEquals("getTargetMimetypeFromTransformName", null, + AsynchronousExtractor.getTargetMimetypeFromTransformName("anything else")); + assertEquals("getTargetMimetypeFromTransformName", null, + AsynchronousExtractor.getTargetMimetypeFromTransformName(null)); + + assertEquals("getTargetMimetypeFromTransformName", "text/plain", + AsynchronousExtractor.getSourceMimetypeFromTransformName("alfresco-metadata-extract/text/plain")); + assertEquals("getTargetMimetypeFromTransformName", "text/plain", + AsynchronousExtractor.getSourceMimetypeFromTransformName("alfresco-metadata-embed/text/plain")); + } } \ No newline at end of file