diff --git a/operations-jms/src/main/java/edu/unc/lib/boxc/operations/jms/RunEnhancementsMessageHelpers.java b/operations-jms/src/main/java/edu/unc/lib/boxc/operations/jms/RunEnhancementsMessageHelpers.java index 2a58ba290a..2d93bf9add 100644 --- a/operations-jms/src/main/java/edu/unc/lib/boxc/operations/jms/RunEnhancementsMessageHelpers.java +++ b/operations-jms/src/main/java/edu/unc/lib/boxc/operations/jms/RunEnhancementsMessageHelpers.java @@ -9,13 +9,23 @@ import edu.unc.lib.boxc.model.api.ids.PID; import edu.unc.lib.boxc.operations.jms.JMSMessageUtil.CDRActions; +import java.util.List; + /** * Helper methods for run enhancement messages * * @author bbpennel */ public class RunEnhancementsMessageHelpers { - + public static final String ENHANCEMENT_LIST = "enhancementList"; + public static final String IMAGE_ACCESS_COPY = "imageAccessCopy"; + public static final String EXTRACT_FULLTEXT = "extractFulltext"; + public static final String AUDIO_ACCESS_COPY = "audioAccessCopy"; + public static final String VIDEO_ACCESS_COPY = "videoAccessCopy"; + public static final String MACHINE_GEN_DESCRIPTION = "machineGenDescription"; + public static final List DEFAULT_ENHANCEMENTS = List.of(IMAGE_ACCESS_COPY,EXTRACT_FULLTEXT, + AUDIO_ACCESS_COPY, VIDEO_ACCESS_COPY, MACHINE_GEN_DESCRIPTION); + public static final String DEFAULT_ENHANCEMENTS_STRING = String.join(",", DEFAULT_ENHANCEMENTS); private RunEnhancementsMessageHelpers() { } @@ -25,16 +35,16 @@ private RunEnhancementsMessageHelpers() { * @param userid * @param pid * @param force + * @param enhancementList list of enhancements to run * @return */ - public static Document makeEnhancementOperationBody(String userid, PID pid, Boolean force) { + public static Document makeEnhancementOperationBody(String userid, PID pid, Boolean force, List enhancementList) { Document msg = new Document(); Element entry = new Element("entry", ATOM_NS); entry.addContent(new Element("author", ATOM_NS) .addContent(new Element("name", ATOM_NS).setText(userid))); Element paramForce = new Element("force", CDR_MESSAGE_NS); - if (force) { paramForce.setText("true"); } else { @@ -44,8 +54,14 @@ public static Document makeEnhancementOperationBody(String userid, PID pid, Bool Element enhancements = new Element(CDRActions.RUN_ENHANCEMENTS.getName(), CDR_MESSAGE_NS); enhancements.addContent(new Element("pid", CDR_MESSAGE_NS).setText(pid.getRepositoryPath())); enhancements.addContent(paramForce); - entry.addContent(enhancements); + if (enhancementList != null) { + Element paramEnhancementList = new Element("enhancementList", CDR_MESSAGE_NS); + paramEnhancementList.setText(String.join(",",enhancementList)); + enhancements.addContent(paramEnhancementList); + } + + entry.addContent(enhancements); msg.addContent(entry); return msg; diff --git a/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/BinaryEnhancementProcessor.java b/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/BinaryEnhancementProcessor.java index 03c7169217..e467274415 100644 --- a/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/BinaryEnhancementProcessor.java +++ b/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/BinaryEnhancementProcessor.java @@ -2,6 +2,10 @@ import static edu.unc.lib.boxc.model.api.xml.JDOMNamespaceUtil.CDR_MESSAGE_NS; import static edu.unc.lib.boxc.operations.jms.JMSMessageUtil.CDRActions.RUN_ENHANCEMENTS; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.DEFAULT_ENHANCEMENTS_STRING; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.ENHANCEMENT_LIST; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.MACHINE_GEN_DESCRIPTION; +import static edu.unc.lib.boxc.services.camel.util.CdrFcrepoHeaders.CdrEnhancementSet; import static org.fcrepo.camel.FcrepoHeaders.FCREPO_URI; import org.apache.camel.Exchange; @@ -20,6 +24,8 @@ import edu.unc.lib.boxc.model.fcrepo.ids.PIDs; import edu.unc.lib.boxc.services.camel.util.MessageUtil; +import java.util.Objects; + /** * Sets headers related to identifying binary objects to run enhancement operations on * @@ -27,7 +33,6 @@ */ public class BinaryEnhancementProcessor implements Processor { private static final Logger log = LoggerFactory.getLogger(BinaryEnhancementProcessor.class); - private RepositoryObjectLoader repoObjLoader; @Override @@ -61,6 +66,15 @@ public void process(final Exchange exchange) throws Exception { } else { in.setHeader("force", "false"); } + + Element enhancementsList = enhancementsEl.getChild(ENHANCEMENT_LIST, CDR_MESSAGE_NS); + if (enhancementsList == null) { + in.setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS_STRING); + } else { + var enhancements = enhancementsList.getTextTrim(); + in.setHeader(CdrEnhancementSet, enhancements); + } + } catch (ObjectTypeMismatchException e) { log.warn("{} is not a repository object. No enhancement headers added", objPid.getRepositoryPath()); } diff --git a/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/accessSurrogates/AccessSurrogateRequestProcessor.java b/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/accessSurrogates/AccessSurrogateRequestProcessor.java index 7d1086587a..efae364a0f 100644 --- a/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/accessSurrogates/AccessSurrogateRequestProcessor.java +++ b/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/accessSurrogates/AccessSurrogateRequestProcessor.java @@ -61,7 +61,7 @@ public void process(Exchange exchange) throws Exception { } PID originalPid = DatastreamPids.getOriginalFilePid(pid); - Document msg = makeEnhancementOperationBody(agent.getUsername(), originalPid, true); + Document msg = makeEnhancementOperationBody(agent.getUsername(), originalPid, true, null); messageSender.sendMessage(msg); } else { log.error("Cannot process access surrogate update for {}, non FileObjects do not have access surrogates", diff --git a/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/enhancements/EnhancementRouter.java b/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/enhancements/EnhancementRouter.java index 176a24c890..596602b5f3 100644 --- a/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/enhancements/EnhancementRouter.java +++ b/services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/enhancements/EnhancementRouter.java @@ -37,8 +37,6 @@ public class EnhancementRouter extends RouteBuilder { @PropertyInject("cdr.enhancement.processingThreads") private Integer enhancementThreads; - private static final String DEFAULT_ENHANCEMENTS = "imageAccessCopy,extractFulltext,audioAccessCopy," + - "videoAccessCopy,machineGenDescription"; @Override public void configure() throws Exception { @@ -73,7 +71,6 @@ public void configure() throws Exception { from("direct:process.original") .routeId("ProcessOriginalBinary") .startupOrder(108) - .setHeader(CdrEnhancementSet, constant(DEFAULT_ENHANCEMENTS)) .process(mdProcessor) .filter(header(CdrBinaryPath).isNotNull()) .to("{{cdr.enhancement.perform.camel}}"); diff --git a/services-camel-app/src/test/java/edu/unc/lib/boxc/services/camel/BinaryEnhancementProcessorTest.java b/services-camel-app/src/test/java/edu/unc/lib/boxc/services/camel/BinaryEnhancementProcessorTest.java index 3f082d39fe..b09b2f24ba 100644 --- a/services-camel-app/src/test/java/edu/unc/lib/boxc/services/camel/BinaryEnhancementProcessorTest.java +++ b/services-camel-app/src/test/java/edu/unc/lib/boxc/services/camel/BinaryEnhancementProcessorTest.java @@ -15,6 +15,7 @@ import org.mockito.Mock; import java.util.Collections; +import java.util.List; import static edu.unc.lib.boxc.fcrepo.FcrepoJmsConstants.RESOURCE_TYPE; import static edu.unc.lib.boxc.model.api.rdf.Cdr.Collection; @@ -22,6 +23,11 @@ import static edu.unc.lib.boxc.model.api.xml.JDOMNamespaceUtil.ATOM_NS; import static edu.unc.lib.boxc.model.api.xml.JDOMNamespaceUtil.CDR_MESSAGE_NS; import static edu.unc.lib.boxc.operations.jms.JMSMessageUtil.CDRActions.RUN_ENHANCEMENTS; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.DEFAULT_ENHANCEMENTS; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.DEFAULT_ENHANCEMENTS_STRING; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.ENHANCEMENT_LIST; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.MACHINE_GEN_DESCRIPTION; +import static edu.unc.lib.boxc.services.camel.util.CdrFcrepoHeaders.CdrEnhancementSet; import static org.fcrepo.camel.FcrepoHeaders.FCREPO_URI; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.never; @@ -76,73 +82,93 @@ void closeService() throws Exception { @Test public void testUpdateHeadersText() throws Exception { - setMessageBody("text/plain", true, false); + setMessageBody("text/plain", true, false, null); processor.process(exchange); verify(message).setHeader(FCREPO_URI, RESC_URI); verify(message).setHeader(RESOURCE_TYPE, Binary.getURI()); + verify(message).setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS_STRING); + verify(message).setHeader("force", "false"); } @Test public void testUpdateHeadersImageNonCollectionThumb() throws Exception { - setMessageBody("image/png", true, false); + setMessageBody("image/png", true, false, null); processor.process(exchange); verify(message).setHeader(FCREPO_URI, RESC_URI); verify(message).setHeader(RESOURCE_TYPE, Binary.getURI()); verify(message).setHeader("force", "false"); + verify(message).setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS_STRING); } @Test public void testThumbForce() throws Exception { - setMessageBody("image/png", true, true); + setMessageBody("image/png", true, true, null); processor.process(exchange); verify(message).setHeader(FCREPO_URI, RESC_URI); verify(message).setHeader(RESOURCE_TYPE, Binary.getURI()); verify(message).setHeader("force", "true"); + verify(message).setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS_STRING); } @Test public void testThumbNoForce() throws Exception { - setMessageBody("image/png", true, false); + setMessageBody("image/png", true, false, null); processor.process(exchange); verify(message).setHeader(FCREPO_URI, RESC_URI); verify(message).setHeader(RESOURCE_TYPE, Binary.getURI()); verify(message).setHeader("force", "false"); + verify(message).setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS_STRING); } @Test public void testExistingUriHeader() throws Exception { when(exchange.getIn().getHeader(FCREPO_URI)).thenReturn(RESC_URI); - setMessageBody("image/png", false, false); + setMessageBody("image/png", false, false, null); processor.process(exchange); verify(message, never()).setHeader(FCREPO_URI, RESC_URI); verify(message, never()).setHeader(RESOURCE_TYPE, Binary.getURI()); verify(message, never()).setHeader("force", "false"); + verify(message, never()).setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS_STRING); } @Test public void testNonBinary() throws Exception { when(repoObjLoader.getRepositoryObject(any(PID.class))).thenReturn(collObj); when(collObj.getTypes()).thenReturn(Collections.singletonList(Collection.getURI())); - setMessageBody("image/*", true, false); + setMessageBody("image/*", true, false, null); processor.process(exchange); verify(message).setHeader(FCREPO_URI, RESC_URI); verify(message).setHeader(RESOURCE_TYPE, Collection.getURI()); verify(message).setHeader("force", "false"); + verify(message).setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS_STRING); } - private void setMessageBody(String mimeType, boolean addEnhancementHeader, boolean force) { + @Test + public void testRegenerateDescription() throws Exception { + setMessageBody("image/png", true, false, List.of(MACHINE_GEN_DESCRIPTION)); + + processor.process(exchange); + + verify(message).setHeader(FCREPO_URI, RESC_URI); + verify(message).setHeader(RESOURCE_TYPE, Binary.getURI()); + verify(message).setHeader("force", "false"); + // the only enhancement run will be machine generated description + verify(message).setHeader(CdrEnhancementSet, MACHINE_GEN_DESCRIPTION); + } + + private void setMessageBody(String mimeType, boolean addEnhancementHeader, boolean force, List enhancementsList) { Document msg = new Document(); Element entry = new Element("entry", ATOM_NS); entry.addContent(new Element("mimeType", ATOM_NS).setText(mimeType)); @@ -151,6 +177,11 @@ private void setMessageBody(String mimeType, boolean addEnhancementHeader, boole Element enhancements = new Element(RUN_ENHANCEMENTS.getName(), CDR_MESSAGE_NS); enhancements.addContent(new Element("pid", CDR_MESSAGE_NS).setText(RESC_URI)); enhancements.addContent(new Element("force", CDR_MESSAGE_NS).setText(String.valueOf(force))); + if (enhancementsList != null) { + enhancements.addContent(new Element(ENHANCEMENT_LIST, CDR_MESSAGE_NS) + .setText(String.join(",",enhancementsList))); + } + entry.addContent(enhancements); } diff --git a/services-camel-app/src/test/java/edu/unc/lib/boxc/services/camel/enhancements/EnhancementRouterIT.java b/services-camel-app/src/test/java/edu/unc/lib/boxc/services/camel/enhancements/EnhancementRouterIT.java index 54cb06fc2e..be806443bf 100644 --- a/services-camel-app/src/test/java/edu/unc/lib/boxc/services/camel/enhancements/EnhancementRouterIT.java +++ b/services-camel-app/src/test/java/edu/unc/lib/boxc/services/camel/enhancements/EnhancementRouterIT.java @@ -9,8 +9,12 @@ import static edu.unc.lib.boxc.model.api.rdf.Fcrepo4Repository.Container; import static edu.unc.lib.boxc.model.fcrepo.ids.DatastreamPids.getTechnicalMetadataPid; import static edu.unc.lib.boxc.model.fcrepo.ids.RepositoryPaths.idToPath; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.DEFAULT_ENHANCEMENTS; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.DEFAULT_ENHANCEMENTS_STRING; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.MACHINE_GEN_DESCRIPTION; import static edu.unc.lib.boxc.services.camel.util.CdrFcrepoHeaders.CdrBinaryMimeType; import static edu.unc.lib.boxc.services.camel.util.CdrFcrepoHeaders.CdrBinaryPath; +import static edu.unc.lib.boxc.services.camel.util.CdrFcrepoHeaders.CdrEnhancementSet; import static edu.unc.lib.boxc.services.camel.util.CdrFcrepoHeaders.CdrImagePath; import static edu.unc.lib.boxc.services.camel.util.CdrFcrepoHeaders.CdrImagePathCleanup; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -413,7 +417,28 @@ public void testMachineGenDescription() throws Exception { template.sendBodyAndHeaders("", headers); verify(addAccessCopyProcessor, timeout(ALLOW_WAIT)).process(any(Exchange.class)); - verify(solrIngestProcessor, never()).process(any(Exchange.class)); + verify(solrIngestProcessor, timeout(ALLOW_WAIT)).process(any(Exchange.class)); + verify(addAudioAccessCopyProcessor, never()).process(any(Exchange.class)); + verify(addVideoAccessCopyProcessor, never()).process(any(Exchange.class)); + verify(machineGenDescriptionProcessor, timeout(ALLOW_WAIT)).process(any(Exchange.class)); + } + + @Test + public void testRegenerateMachineGenDescription() throws Exception { + FileObject fileObj = repoObjectFactory.createFileObject(null); + var storageUri = storageLocationTestHelper.makeTestStorageUri(DatastreamPids.getOriginalFilePid(fileObj.getPid())); + FileUtils.writeStringToFile(new File(storageUri), FILE_CONTENT, "UTF-8"); + BinaryObject binObj = fileObj.addOriginalFile(storageUri, + null, "image/png", null, null); + + Map headers = createEvent(binObj.getPid(), Binary.getURI()); + headers.replace(CdrEnhancementSet, MACHINE_GEN_DESCRIPTION); + headers.put("force", "true"); + + template.sendBodyAndHeaders("", headers); + + verify(addAccessCopyProcessor, never()).process(any(Exchange.class)); + verify(solrIngestProcessor, timeout(ALLOW_WAIT)).process(any(Exchange.class)); verify(addAudioAccessCopyProcessor, never()).process(any(Exchange.class)); verify(addVideoAccessCopyProcessor, never()).process(any(Exchange.class)); verify(machineGenDescriptionProcessor, timeout(ALLOW_WAIT)).process(any(Exchange.class)); @@ -425,6 +450,7 @@ private Map createEvent(PID pid, String... type) { headers.put(EVENT_TYPE, "ResourceCreation"); headers.put("CamelFcrepoUri", pid.getRepositoryPath()); headers.put(RESOURCE_TYPE, String.join(",", type)); + headers.put(CdrEnhancementSet, DEFAULT_ENHANCEMENTS_STRING); return headers; } diff --git a/web-services-app/src/main/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsRequest.java b/web-services-app/src/main/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsRequest.java index 8509f57825..aff9dc5f43 100644 --- a/web-services-app/src/main/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsRequest.java +++ b/web-services-app/src/main/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsRequest.java @@ -12,6 +12,7 @@ public class RunEnhancementsRequest { private boolean force; private AgentPrincipals agent; private boolean recursive; + private List enhancements; public List getPids() { return pids; @@ -44,4 +45,12 @@ public boolean isRecursive() { public void setRecursive(boolean recursive) { this.recursive = recursive; } + + public List getEnhancements() { + return enhancements; + } + + public void setEnhancements(List enhancements) { + this.enhancements = enhancements; + } } diff --git a/web-services-app/src/main/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsService.java b/web-services-app/src/main/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsService.java index 7f032a09a6..ba30a30f4e 100644 --- a/web-services-app/src/main/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsService.java +++ b/web-services-app/src/main/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsService.java @@ -65,6 +65,7 @@ public void run(RunEnhancementsRequest request) { var objectPids = request.getPids(); var force = request.isForce(); var recursive = request.isRecursive(); + var enhancements = request.getEnhancements(); for (String objectPid : objectPids) { PID pid = PIDs.get(objectPid); @@ -73,16 +74,16 @@ public void run(RunEnhancementsRequest request) { if (recursive && !(repositoryObjectLoader.getRepositoryObject(pid) instanceof FileObject)) { LOG.debug("Queueing object and children for enhancements: {}", pid); - recursiveEnhancements(pid, agent, force); + recursiveEnhancements(pid, agent, force, enhancements); } else { LOG.debug("Queueing object for enhancements: {}", pid); - shallowEnhancements(pid, agent, force); + shallowEnhancements(pid, agent, force, enhancements); } } } } - private void recursiveEnhancements(PID pid, AgentPrincipals agent, Boolean force) { + private void recursiveEnhancements(PID pid, AgentPrincipals agent, Boolean force, List enhancements) { SearchState searchState = new SearchState(); searchState.addFacet(new GenericFacet(SearchFieldKey.RESOURCE_TYPE, ResourceType.File.name())); searchState.setResultFields(RESULTS_FIELD_LIST); @@ -105,33 +106,33 @@ private void recursiveEnhancements(PID pid, AgentPrincipals agent, Boolean force LOG.debug("Found {} items to queue for enhancement run", totalResults); // Add the root container itself ContentObjectRecord rootContainer = resultResponse.getSelectedContainer(); - createMessage(rootContainer, agent.getUsername(), force); + createMessage(rootContainer, agent.getUsername(), force, enhancements); } for (ContentObjectRecord metadata : resultResponse.getResultList()) { - createMessage(metadata, agent.getUsername(), force); + createMessage(metadata, agent.getUsername(), force, enhancements); count++; } LOG.debug("Queued {} out of {} items for enhancements", count, totalResults); } while(count < totalResults); } - private void shallowEnhancements(PID pid, AgentPrincipals agent, Boolean force) { + private void shallowEnhancements(PID pid, AgentPrincipals agent, Boolean force, List enhancements) { SimpleIdRequest searchRequest = new SimpleIdRequest(pid, agent.getPrincipals()); ContentObjectRecord metadata = queryLayer.getObjectById(searchRequest); - createMessage(metadata, agent.getUsername(), force); + createMessage(metadata, agent.getUsername(), force, enhancements); } public void setAclService(AccessControlService aclService) { this.aclService = aclService; } - private void createMessage(ContentObjectRecord metadata, String username, Boolean force) { + private void createMessage(ContentObjectRecord metadata, String username, Boolean force, List enhancements) { PID pid = metadata.getPid(); Datastream originalDs = metadata.getDatastreamObject(ORIGINAL_FILE.getId()); String resourceType = metadata.getResourceType(); PID originalPid = (ResourceType.File.equals(resourceType) && originalDs != null) ? DatastreamPids.getOriginalFilePid(pid) : pid; - Document msg = makeEnhancementOperationBody(username, originalPid, force); + Document msg = makeEnhancementOperationBody(username, originalPid, force, enhancements); messageSender.sendMessage(msg); } diff --git a/web-services-app/src/test/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsServiceTest.java b/web-services-app/src/test/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsServiceTest.java index 6740af8476..d2f69e1f19 100644 --- a/web-services-app/src/test/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsServiceTest.java +++ b/web-services-app/src/test/java/edu/unc/lib/boxc/web/services/processing/RunEnhancementsServiceTest.java @@ -34,6 +34,9 @@ import static edu.unc.lib.boxc.model.api.xml.JDOMNamespaceUtil.ATOM_NS; import static edu.unc.lib.boxc.model.api.xml.JDOMNamespaceUtil.CDR_MESSAGE_NS; import static edu.unc.lib.boxc.operations.jms.JMSMessageUtil.CDRActions.RUN_ENHANCEMENTS; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.DEFAULT_ENHANCEMENTS_STRING; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.ENHANCEMENT_LIST; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.MACHINE_GEN_DESCRIPTION; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.argThat; @@ -121,7 +124,7 @@ public void runFileObjectTest() { verify(messageSender).sendMessage(docCaptor.capture()); Document msgDoc = docCaptor.getValue(); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDoc, dsPid, false); + assertMessageValues(msgDoc, dsPid, false, null); } @Test @@ -137,7 +140,24 @@ public void runFileObjectWithForceTest() { verify(messageSender).sendMessage(docCaptor.capture()); Document msgDoc = docCaptor.getValue(); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDoc, dsPid, true); + assertMessageValues(msgDoc, dsPid, true, null); + } + + @Test + public void runFileObjectWithRegenDescriptionTest() { + var request = new RunEnhancementsRequest(); + request.setAgent(agent); + request.setRecursive(true); + request.setForce(true); + request.setEnhancements(List.of(MACHINE_GEN_DESCRIPTION)); + request.setPids(List.of(filePid.getId())); + + service.run(request); + + verify(messageSender).sendMessage(docCaptor.capture()); + Document msgDoc = docCaptor.getValue(); + var dsPid = DatastreamPids.getOriginalFilePid(filePid); + assertMessageValues(msgDoc, dsPid, true, MACHINE_GEN_DESCRIPTION); } @Test @@ -152,7 +172,7 @@ public void runWorkObjectShallowTest() { verify(messageSender).sendMessage(docCaptor.capture()); Document msgDoc = docCaptor.getValue(); - assertMessageValues(msgDoc, workPid, false); + assertMessageValues(msgDoc, workPid, false, null); } @Test @@ -171,9 +191,31 @@ public void runWorkObjectRecursiveTest() { verify(messageSender, times(2)).sendMessage(docCaptor.capture()); var msgDocs = docCaptor.getAllValues(); - assertMessageValues(msgDocs.get(0), workPid, false); + assertMessageValues(msgDocs.get(0), workPid, false, null); + var dsPid = DatastreamPids.getOriginalFilePid(filePid); + assertMessageValues(msgDocs.get(1), dsPid, false, null); + } + + @Test + public void runWorkObjectRecursiveWithRegenDescriptionTest() { + when(searchResultResp.getResultCount()).thenReturn(1L); + when(searchResultResp.getSelectedContainer()).thenReturn(workRecord); + when(searchResultResp.getResultList()).thenReturn(List.of(fileRecord)); + + var request = new RunEnhancementsRequest(); + request.setAgent(agent); + request.setRecursive(true); + request.setForce(true); + request.setEnhancements(List.of(MACHINE_GEN_DESCRIPTION)); + request.setPids(List.of(workPid.getId())); + + service.run(request); + + verify(messageSender, times(2)).sendMessage(docCaptor.capture()); + var msgDocs = docCaptor.getAllValues(); + assertMessageValues(msgDocs.get(0), workPid, true, MACHINE_GEN_DESCRIPTION); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDocs.get(1), dsPid, false); + assertMessageValues(msgDocs.get(1), dsPid, true, MACHINE_GEN_DESCRIPTION); } @Test @@ -193,10 +235,10 @@ public void runMultiplePidsShallowTest() { verify(messageSender, times(3)).sendMessage(docCaptor.capture()); var msgDocs = docCaptor.getAllValues(); - assertMessageValues(msgDocs.get(0), workPid, false); + assertMessageValues(msgDocs.get(0), workPid, false, null); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDocs.get(1), dsPid, false); - assertMessageValues(msgDocs.get(2), collPid, false); + assertMessageValues(msgDocs.get(1), dsPid, false, null); + assertMessageValues(msgDocs.get(2), collPid, false, null); } @Test @@ -226,24 +268,26 @@ public void runMultiplePidsRecursiveTest() { verify(messageSender, times(4)).sendMessage(docCaptor.capture()); var msgDocs = docCaptor.getAllValues(); - assertMessageValues(msgDocs.get(0), workPid, false); + assertMessageValues(msgDocs.get(0), workPid, false, null); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDocs.get(1), dsPid, false); - assertMessageValues(msgDocs.get(2), workPid2, false); + assertMessageValues(msgDocs.get(1), dsPid, false, null); + assertMessageValues(msgDocs.get(2), workPid2, false, null); var dsPid2 = DatastreamPids.getOriginalFilePid(filePid2); - assertMessageValues(msgDocs.get(3), dsPid2, false); + assertMessageValues(msgDocs.get(3), dsPid2, false, null); } - private void assertMessageValues(Document msgDoc, PID expectedPid, boolean expectedForce) { + private void assertMessageValues(Document msgDoc, PID expectedPid, boolean expectedForce, String expectedEnhancements) { Element entry = msgDoc.getRootElement(); Element runEl = entry.getChild(RUN_ENHANCEMENTS.getName(), CDR_MESSAGE_NS); String pidString = runEl.getChildText("pid", CDR_MESSAGE_NS); String author = entry.getChild("author", ATOM_NS) .getChildText("name", ATOM_NS); var force = Boolean.valueOf(runEl.getChildText("force", CDR_MESSAGE_NS)); + var enhancements = runEl.getChildText(ENHANCEMENT_LIST, CDR_MESSAGE_NS); assertEquals(expectedPid, PIDs.get(pidString)); assertEquals(USER_NAME, author); assertEquals(expectedForce, force); + assertEquals(expectedEnhancements, enhancements); } } diff --git a/web-services-app/src/test/java/edu/unc/lib/boxc/web/services/rest/RunEnhancementsIT.java b/web-services-app/src/test/java/edu/unc/lib/boxc/web/services/rest/RunEnhancementsIT.java index da3775d3e1..b60c066410 100644 --- a/web-services-app/src/test/java/edu/unc/lib/boxc/web/services/rest/RunEnhancementsIT.java +++ b/web-services-app/src/test/java/edu/unc/lib/boxc/web/services/rest/RunEnhancementsIT.java @@ -220,6 +220,28 @@ public void runEnhancementsNoAccess() throws Exception { verify(messageSender, never()).sendMessage(any(Document.class)); } + @Test + public void setRunEnhancementsRegenerateDescription() throws Exception { + FileObject fileObj = repositoryObjectFactory.createFileObject(null); + PID filePid = fileObj.getPid(); + fileObj.addOriginalFile(makeContentUri(filePid, BINARY_CONTENT), "file.png", "image/png", null, null); + setResultMetadataObject(filePid, ResourceType.File.name()); + + MvcResult result = mvc.perform(post("/runEnhancements") + .contentType(MediaType.APPLICATION_JSON) + .content("{\"force\":true,\"pids\":[\"" + filePid.getId() + "\"],\"regenerateDescription\":true}") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().is2xxSuccessful()) + .andReturn(); + + assertResponseSuccess(result); + + verify(messageSender).sendMessage(docCaptor.capture()); + Document msgDoc = docCaptor.getValue(); + assertMessageValues(msgDoc, fileObj.getOriginalFile().getPid(), USER_NAME); + } + + private void assertResponseSuccess(MvcResult mvcResult) throws Exception { Map resp = MvcTestHelpers.getMapFromResponse(mvcResult); assertTrue(resp.containsKey("message"), "Missing run enhancements message");