From 13cc34dfea174db3098d881c36d74fbfd3afa025 Mon Sep 17 00:00:00 2001 From: sharonl <6546457+sharonluong@users.noreply.github.com> Date: Fri, 12 Jun 2026 12:07:41 -0400 Subject: [PATCH 1/9] BXC-5684 add new param for run enhancement requests --- .../jms/RunEnhancementsMessageHelpers.java | 10 +++++++-- .../camel/BinaryEnhancementProcessor.java | 14 +++++++++++- .../AccessSurrogateRequestProcessor.java | 2 +- .../camel/enhancements/EnhancementRouter.java | 1 - .../processing/RunEnhancementsRequest.java | 9 ++++++++ .../processing/RunEnhancementsService.java | 19 ++++++++-------- .../web/services/rest/RunEnhancementsIT.java | 22 +++++++++++++++++++ 7 files changed, 63 insertions(+), 14 deletions(-) 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..fc1dc11d3b 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 @@ -27,20 +27,26 @@ private RunEnhancementsMessageHelpers() { * @param force * @return */ - public static Document makeEnhancementOperationBody(String userid, PID pid, Boolean force) { + public static Document makeEnhancementOperationBody(String userid, PID pid, Boolean force, Boolean regenerateDescription) { 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 { paramForce.setText("false"); } + Element paramRegen = new Element("regenerateDescription", CDR_MESSAGE_NS); + if (regenerateDescription) { + paramRegen.setText("true"); + } else { + paramRegen.setText("false"); + } + 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); 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..6126676439 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,7 @@ 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.services.camel.util.CdrFcrepoHeaders.CdrEnhancementSet; import static org.fcrepo.camel.FcrepoHeaders.FCREPO_URI; import org.apache.camel.Exchange; @@ -27,7 +28,8 @@ */ public class BinaryEnhancementProcessor implements Processor { private static final Logger log = LoggerFactory.getLogger(BinaryEnhancementProcessor.class); - + private static final String DEFAULT_ENHANCEMENTS = "imageAccessCopy,extractFulltext,audioAccessCopy," + + "videoAccessCopy,machineGenDescription"; private RepositoryObjectLoader repoObjLoader; @Override @@ -61,6 +63,16 @@ public void process(final Exchange exchange) throws Exception { } else { in.setHeader("force", "false"); } + + // if the request specifies machine gen description regeneration, + // only run the machine Gen Description enhancement and force it + Element regenerateDescriptionElement = enhancementsEl.getChild("regenerateDescription", CDR_MESSAGE_NS); + if (regenerateDescriptionElement != null) { + in.setHeader(CdrEnhancementSet, "machineGenDescription"); + in.setHeader("force", "true"); + } else { + in.setHeader(CdrEnhancementSet, DEFAULT_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..53dd83f04b 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, false); 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..c351797ac1 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 @@ -73,7 +73,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/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..0f6d424814 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 boolean regenerateDescription; public List getPids() { return pids; @@ -44,4 +45,12 @@ public boolean isRecursive() { public void setRecursive(boolean recursive) { this.recursive = recursive; } + + public boolean isRegenerateDescription() { + return regenerateDescription; + } + + public void setRegenerateDescription(boolean regenerateDescription) { + this.regenerateDescription = regenerateDescription; + } } 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..c69ae49d31 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 regenerateDescription = request.isRegenerateDescription(); 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, regenerateDescription); } else { LOG.debug("Queueing object for enhancements: {}", pid); - shallowEnhancements(pid, agent, force); + shallowEnhancements(pid, agent, force, regenerateDescription); } } } } - private void recursiveEnhancements(PID pid, AgentPrincipals agent, Boolean force) { + private void recursiveEnhancements(PID pid, AgentPrincipals agent, Boolean force, Boolean regenerateDescription) { 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, regenerateDescription); } for (ContentObjectRecord metadata : resultResponse.getResultList()) { - createMessage(metadata, agent.getUsername(), force); + createMessage(metadata, agent.getUsername(), force, regenerateDescription); 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, Boolean regenerateDescription) { SimpleIdRequest searchRequest = new SimpleIdRequest(pid, agent.getPrincipals()); ContentObjectRecord metadata = queryLayer.getObjectById(searchRequest); - createMessage(metadata, agent.getUsername(), force); + createMessage(metadata, agent.getUsername(), force, regenerateDescription); } 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, Boolean regenerateDescription) { 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, regenerateDescription); messageSender.sendMessage(msg); } 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"); From 05fab8e4e985c5d4aa3277e53ec27dd383c854e5 Mon Sep 17 00:00:00 2001 From: sharonl <6546457+sharonluong@users.noreply.github.com> Date: Mon, 15 Jun 2026 14:22:44 -0400 Subject: [PATCH 2/9] BXC-5684 update tests --- .../jms/RunEnhancementsMessageHelpers.java | 1 + .../camel/BinaryEnhancementProcessor.java | 15 ++++-- .../camel/BinaryEnhancementProcessorTest.java | 36 +++++++++++--- .../RunEnhancementsServiceTest.java | 49 +++++++++++++++++++ 4 files changed, 89 insertions(+), 12 deletions(-) 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 fc1dc11d3b..ebecad7361 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 @@ -50,6 +50,7 @@ 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); + enhancements.addContent(paramRegen); entry.addContent(enhancements); msg.addContent(entry); 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 6126676439..49f8163694 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 @@ -21,6 +21,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 * @@ -28,7 +30,7 @@ */ public class BinaryEnhancementProcessor implements Processor { private static final Logger log = LoggerFactory.getLogger(BinaryEnhancementProcessor.class); - private static final String DEFAULT_ENHANCEMENTS = "imageAccessCopy,extractFulltext,audioAccessCopy," + + public static final String DEFAULT_ENHANCEMENTS = "imageAccessCopy,extractFulltext,audioAccessCopy," + "videoAccessCopy,machineGenDescription"; private RepositoryObjectLoader repoObjLoader; @@ -58,18 +60,21 @@ public void process(final Exchange exchange) throws Exception { in.setHeader(FcrepoJmsConstants.RESOURCE_TYPE, String.join(",", repoObj.getTypes())); Element forceText = enhancementsEl.getChild("force", CDR_MESSAGE_NS); - if (forceText != null) { + Element regenerateDescriptionElement = enhancementsEl.getChild("regenerateDescription", CDR_MESSAGE_NS); + // force is set to true if it's a regen request + if (regenerateDescriptionElement != null) { + in.setHeader("force", "true"); + } + else if (forceText != null) { in.setHeader("force", forceText.getTextTrim()); } else { in.setHeader("force", "false"); } // if the request specifies machine gen description regeneration, - // only run the machine Gen Description enhancement and force it - Element regenerateDescriptionElement = enhancementsEl.getChild("regenerateDescription", CDR_MESSAGE_NS); + // only run the machine Gen Description enhancement if (regenerateDescriptionElement != null) { in.setHeader(CdrEnhancementSet, "machineGenDescription"); - in.setHeader("force", "true"); } else { in.setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS); } 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..450deb3fc7 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 @@ -22,6 +22,8 @@ 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.services.camel.BinaryEnhancementProcessor.DEFAULT_ENHANCEMENTS; +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,17 +78,19 @@ void closeService() throws Exception { @Test public void testUpdateHeadersText() throws Exception { - setMessageBody("text/plain", true, false); + setMessageBody("text/plain", true, false, false); processor.process(exchange); verify(message).setHeader(FCREPO_URI, RESC_URI); verify(message).setHeader(RESOURCE_TYPE, Binary.getURI()); + verify(message).setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS); + verify(message).setHeader("force", "false"); } @Test public void testUpdateHeadersImageNonCollectionThumb() throws Exception { - setMessageBody("image/png", true, false); + setMessageBody("image/png", true, false, false); processor.process(exchange); @@ -97,7 +101,7 @@ public void testUpdateHeadersImageNonCollectionThumb() throws Exception { @Test public void testThumbForce() throws Exception { - setMessageBody("image/png", true, true); + setMessageBody("image/png", true, true, false); processor.process(exchange); @@ -108,7 +112,7 @@ public void testThumbForce() throws Exception { @Test public void testThumbNoForce() throws Exception { - setMessageBody("image/png", true, false); + setMessageBody("image/png", true, false, false); processor.process(exchange); @@ -120,7 +124,7 @@ public void testThumbNoForce() throws Exception { @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, false); processor.process(exchange); @@ -133,7 +137,7 @@ public void testExistingUriHeader() throws Exception { 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, false); processor.process(exchange); @@ -142,7 +146,21 @@ public void testNonBinary() throws Exception { verify(message).setHeader("force", "false"); } - private void setMessageBody(String mimeType, boolean addEnhancementHeader, boolean force) { + @Test + public void testRegenerateDescription() throws Exception { + setMessageBody("image/png", true, false, true); + + processor.process(exchange); + + verify(message).setHeader(FCREPO_URI, RESC_URI); + verify(message).setHeader(RESOURCE_TYPE, Binary.getURI()); + // check that force has been turned to true + verify(message).setHeader("force", "true"); + // the only enhancement run will be machine generated description + verify(message).setHeader(CdrEnhancementSet, "machineGenDescription"); + } + + private void setMessageBody(String mimeType, boolean addEnhancementHeader, boolean force, boolean regenDescription) { Document msg = new Document(); Element entry = new Element("entry", ATOM_NS); entry.addContent(new Element("mimeType", ATOM_NS).setText(mimeType)); @@ -151,6 +169,10 @@ 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 (regenDescription) { + enhancements.addContent(new Element("regenerateDescription", CDR_MESSAGE_NS) + .setText("true")); + } entry.addContent(enhancements); } 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..62e1aed528 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 @@ -140,6 +140,24 @@ public void runFileObjectWithForceTest() { assertMessageValues(msgDoc, dsPid, true); } + @Test + public void runFileObjectWithRegenDescriptionTest() { + var request = new RunEnhancementsRequest(); + request.setAgent(agent); + request.setRecursive(true); + request.setForce(true); + request.setRegenerateDescription(true); + 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); + assertRegenDescValue(msgDoc, true); + } + @Test public void runWorkObjectShallowTest() { var request = new RunEnhancementsRequest(); @@ -176,6 +194,30 @@ public void runWorkObjectRecursiveTest() { assertMessageValues(msgDocs.get(1), dsPid, false); } + @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.setRegenerateDescription(true); + 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); + assertRegenDescValue(msgDocs.get(0), true); + var dsPid = DatastreamPids.getOriginalFilePid(filePid); + assertMessageValues(msgDocs.get(1), dsPid, true); + assertRegenDescValue(msgDocs.get(1), true); + } + @Test public void runMultiplePidsShallowTest() { PID collPid = TestHelper.makePid(); @@ -246,4 +288,11 @@ private void assertMessageValues(Document msgDoc, PID expectedPid, boolean expec assertEquals(USER_NAME, author); assertEquals(expectedForce, force); } + + private void assertRegenDescValue(Document msgDoc, boolean expectedRegenerateDescription) { + Element entry = msgDoc.getRootElement(); + Element runEl = entry.getChild(RUN_ENHANCEMENTS.getName(), CDR_MESSAGE_NS); + var regenerateDescription = Boolean.valueOf(runEl.getChildText("regenerateDescription", CDR_MESSAGE_NS)); + assertEquals(expectedRegenerateDescription, regenerateDescription); + } } From 498dbea2426d29e168abb86583ef9910d536d7b5 Mon Sep 17 00:00:00 2001 From: sharonl <6546457+sharonluong@users.noreply.github.com> Date: Mon, 15 Jun 2026 16:10:59 -0400 Subject: [PATCH 3/9] BXC-5684 update enhancement router IT --- .../camel/BinaryEnhancementProcessor.java | 3 +-- .../camel/enhancements/EnhancementRouter.java | 2 -- .../enhancements/EnhancementRouterIT.java | 26 ++++++++++++++++++- 3 files changed, 26 insertions(+), 5 deletions(-) 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 49f8163694..d58dfa00fa 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 @@ -64,8 +64,7 @@ public void process(final Exchange exchange) throws Exception { // force is set to true if it's a regen request if (regenerateDescriptionElement != null) { in.setHeader("force", "true"); - } - else if (forceText != null) { + } else if (forceText != null) { in.setHeader("force", forceText.getTextTrim()); } else { in.setHeader("force", "false"); 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 c351797ac1..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 { 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..187e54bfa6 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,10 @@ 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.services.camel.BinaryEnhancementProcessor.DEFAULT_ENHANCEMENTS; 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 +415,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, "machineGenDescription"); + 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 +448,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); return headers; } From 6710175ce9c8243140027c848952be710300e758 Mon Sep 17 00:00:00 2001 From: sharonl <6546457+sharonluong@users.noreply.github.com> Date: Mon, 15 Jun 2026 17:00:14 -0400 Subject: [PATCH 4/9] BXC-5684 refine header setting --- .../boxc/services/camel/BinaryEnhancementProcessor.java | 7 ++++--- .../services/camel/BinaryEnhancementProcessorTest.java | 7 +++---- 2 files changed, 7 insertions(+), 7 deletions(-) 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 d58dfa00fa..02ea5d77e1 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 @@ -61,8 +61,9 @@ public void process(final Exchange exchange) throws Exception { Element forceText = enhancementsEl.getChild("force", CDR_MESSAGE_NS); Element regenerateDescriptionElement = enhancementsEl.getChild("regenerateDescription", CDR_MESSAGE_NS); - // force is set to true if it's a regen request - if (regenerateDescriptionElement != null) { + var isRegenRequest = Objects.equals(regenerateDescriptionElement.getTextTrim(), "true"); + // if it's a regen request set force to true + if (isRegenRequest) { in.setHeader("force", "true"); } else if (forceText != null) { in.setHeader("force", forceText.getTextTrim()); @@ -72,7 +73,7 @@ public void process(final Exchange exchange) throws Exception { // if the request specifies machine gen description regeneration, // only run the machine Gen Description enhancement - if (regenerateDescriptionElement != null) { + if (isRegenRequest) { in.setHeader(CdrEnhancementSet, "machineGenDescription"); } else { in.setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS); 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 450deb3fc7..ddc3decc80 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 @@ -169,10 +169,9 @@ 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 (regenDescription) { - enhancements.addContent(new Element("regenerateDescription", CDR_MESSAGE_NS) - .setText("true")); - } + enhancements.addContent(new Element("regenerateDescription", CDR_MESSAGE_NS) + .setText(String.valueOf(regenDescription))); + entry.addContent(enhancements); } From 025d62f60d081179b52bc807bfec88ec1a9eae31 Mon Sep 17 00:00:00 2001 From: sharonl <6546457+sharonluong@users.noreply.github.com> Date: Tue, 16 Jun 2026 14:49:39 -0400 Subject: [PATCH 5/9] BXC-5684 send in enhancements as a list --- .../jms/RunEnhancementsMessageHelpers.java | 50 ++++++++++++++++--- .../camel/BinaryEnhancementProcessor.java | 15 +++--- .../AccessSurrogateRequestProcessor.java | 2 +- .../enhancements/EnhancementRouterIT.java | 3 +- .../processing/RunEnhancementsService.java | 5 +- 5 files changed, 57 insertions(+), 18 deletions(-) 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 ebecad7361..cc50b277de 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,12 +9,22 @@ 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); private RunEnhancementsMessageHelpers() { } @@ -27,7 +37,7 @@ private RunEnhancementsMessageHelpers() { * @param force * @return */ - public static Document makeEnhancementOperationBody(String userid, PID pid, Boolean force, Boolean regenerateDescription) { + public static Document makeEnhancementOperationBody(String userid, PID pid, Boolean force) { Document msg = new Document(); Element entry = new Element("entry", ATOM_NS); entry.addContent(new Element("author", ATOM_NS) @@ -40,17 +50,45 @@ public static Document makeEnhancementOperationBody(String userid, PID pid, Bool paramForce.setText("false"); } - Element paramRegen = new Element("regenerateDescription", CDR_MESSAGE_NS); - if (regenerateDescription) { - paramRegen.setText("true"); + 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); + + msg.addContent(entry); + + return msg; + } + + /** + * Generate the body for a run enhancement request message + * + * @param userid + * @param pid + * @param force + * @param enhancementList list of enhancements to run + * @return + */ + 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 { - paramRegen.setText("false"); + paramForce.setText("false"); } + Element paramEnhancementList = new Element("enhancementList", CDR_MESSAGE_NS); + paramEnhancementList.setText(enhancementList.toString()); + 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); - enhancements.addContent(paramRegen); + enhancements.addContent(paramEnhancementList); entry.addContent(enhancements); msg.addContent(entry); 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 02ea5d77e1..c2e8dd5e8f 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,8 @@ 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.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; @@ -60,8 +62,8 @@ public void process(final Exchange exchange) throws Exception { in.setHeader(FcrepoJmsConstants.RESOURCE_TYPE, String.join(",", repoObj.getTypes())); Element forceText = enhancementsEl.getChild("force", CDR_MESSAGE_NS); - Element regenerateDescriptionElement = enhancementsEl.getChild("regenerateDescription", CDR_MESSAGE_NS); - var isRegenRequest = Objects.equals(regenerateDescriptionElement.getTextTrim(), "true"); + Element enhancementsList = enhancementsEl.getChild(ENHANCEMENT_LIST, CDR_MESSAGE_NS); + var isRegenRequest = Objects.equals(enhancementsList.getTextTrim(), MACHINE_GEN_DESCRIPTION); // if it's a regen request set force to true if (isRegenRequest) { in.setHeader("force", "true"); @@ -70,14 +72,9 @@ public void process(final Exchange exchange) throws Exception { } else { in.setHeader("force", "false"); } + // set list of enhancements as specified + in.setHeader(CdrEnhancementSet, enhancementsList); - // if the request specifies machine gen description regeneration, - // only run the machine Gen Description enhancement - if (isRegenRequest) { - in.setHeader(CdrEnhancementSet, "machineGenDescription"); - } else { - in.setHeader(CdrEnhancementSet, DEFAULT_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 53dd83f04b..7d1086587a 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, false); + Document msg = makeEnhancementOperationBody(agent.getUsername(), originalPid, true); 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/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 187e54bfa6..d4e149b8c5 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,6 +9,7 @@ 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.MACHINE_GEN_DESCRIPTION; import static edu.unc.lib.boxc.services.camel.BinaryEnhancementProcessor.DEFAULT_ENHANCEMENTS; import static edu.unc.lib.boxc.services.camel.util.CdrFcrepoHeaders.CdrBinaryMimeType; import static edu.unc.lib.boxc.services.camel.util.CdrFcrepoHeaders.CdrBinaryPath; @@ -430,7 +431,7 @@ public void testRegenerateMachineGenDescription() throws Exception { null, "image/png", null, null); Map headers = createEvent(binObj.getPid(), Binary.getURI()); - headers.replace(CdrEnhancementSet, "machineGenDescription"); + headers.replace(CdrEnhancementSet, MACHINE_GEN_DESCRIPTION); headers.put("force", "true"); template.sendBodyAndHeaders("", headers); 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 c69ae49d31..17cf684880 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 @@ -1,6 +1,8 @@ package edu.unc.lib.boxc.web.services.processing; import static edu.unc.lib.boxc.model.api.DatastreamType.ORIGINAL_FILE; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.DEFAULT_ENHANCEMENTS; +import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.MACHINE_GEN_DESCRIPTION; import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.makeEnhancementOperationBody; import java.util.Arrays; @@ -132,7 +134,8 @@ private void createMessage(ContentObjectRecord metadata, String username, Boolea String resourceType = metadata.getResourceType(); PID originalPid = (ResourceType.File.equals(resourceType) && originalDs != null) ? DatastreamPids.getOriginalFilePid(pid) : pid; - Document msg = makeEnhancementOperationBody(username, originalPid, force, regenerateDescription); + var enhancements = regenerateDescription ? List.of(MACHINE_GEN_DESCRIPTION) : DEFAULT_ENHANCEMENTS; + Document msg = makeEnhancementOperationBody(username, originalPid, force, enhancements); messageSender.sendMessage(msg); } From a5cb73da147c7ebb877ad0728121477d8865c928 Mon Sep 17 00:00:00 2001 From: sharonl <6546457+sharonluong@users.noreply.github.com> Date: Tue, 16 Jun 2026 16:04:13 -0400 Subject: [PATCH 6/9] BXC-5684 update to fix tests and streamline constants --- .../jms/RunEnhancementsMessageHelpers.java | 7 +++-- .../camel/BinaryEnhancementProcessor.java | 8 ++--- .../camel/BinaryEnhancementProcessorTest.java | 30 +++++++++++-------- .../enhancements/EnhancementRouterIT.java | 5 ++-- 4 files changed, 28 insertions(+), 22 deletions(-) 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 cc50b277de..1f8afbdf0d 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 @@ -25,7 +25,7 @@ public class RunEnhancementsMessageHelpers { 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() { } @@ -50,6 +50,9 @@ public static Document makeEnhancementOperationBody(String userid, PID pid, Bool paramForce.setText("false"); } + Element paramEnhancementList = new Element("enhancementList", CDR_MESSAGE_NS); + paramEnhancementList.setText(DEFAULT_ENHANCEMENTS_STRING); + 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); @@ -83,7 +86,7 @@ public static Document makeEnhancementOperationBody(String userid, PID pid, Bool } Element paramEnhancementList = new Element("enhancementList", CDR_MESSAGE_NS); - paramEnhancementList.setText(enhancementList.toString()); + paramEnhancementList.setText(String.join(",",enhancementList)); Element enhancements = new Element(CDRActions.RUN_ENHANCEMENTS.getName(), CDR_MESSAGE_NS); enhancements.addContent(new Element("pid", CDR_MESSAGE_NS).setText(pid.getRepositoryPath())); 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 c2e8dd5e8f..a4d0439d0e 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 @@ -32,8 +32,6 @@ */ public class BinaryEnhancementProcessor implements Processor { private static final Logger log = LoggerFactory.getLogger(BinaryEnhancementProcessor.class); - public static final String DEFAULT_ENHANCEMENTS = "imageAccessCopy,extractFulltext,audioAccessCopy," + - "videoAccessCopy,machineGenDescription"; private RepositoryObjectLoader repoObjLoader; @Override @@ -63,9 +61,9 @@ public void process(final Exchange exchange) throws Exception { Element forceText = enhancementsEl.getChild("force", CDR_MESSAGE_NS); Element enhancementsList = enhancementsEl.getChild(ENHANCEMENT_LIST, CDR_MESSAGE_NS); - var isRegenRequest = Objects.equals(enhancementsList.getTextTrim(), MACHINE_GEN_DESCRIPTION); + var enhancements = enhancementsList.getTextTrim(); // if it's a regen request set force to true - if (isRegenRequest) { + if (Objects.equals(enhancements, MACHINE_GEN_DESCRIPTION)) { in.setHeader("force", "true"); } else if (forceText != null) { in.setHeader("force", forceText.getTextTrim()); @@ -73,7 +71,7 @@ public void process(final Exchange exchange) throws Exception { in.setHeader("force", "false"); } // set list of enhancements as specified - in.setHeader(CdrEnhancementSet, enhancementsList); + 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/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 ddc3decc80..69d134cdef 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,7 +23,10 @@ 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.services.camel.BinaryEnhancementProcessor.DEFAULT_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; @@ -78,19 +82,19 @@ void closeService() throws Exception { @Test public void testUpdateHeadersText() throws Exception { - setMessageBody("text/plain", true, false, false); + setMessageBody("text/plain", true, false, DEFAULT_ENHANCEMENTS); processor.process(exchange); verify(message).setHeader(FCREPO_URI, RESC_URI); verify(message).setHeader(RESOURCE_TYPE, Binary.getURI()); - verify(message).setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS); + verify(message).setHeader(CdrEnhancementSet, DEFAULT_ENHANCEMENTS_STRING); verify(message).setHeader("force", "false"); } @Test public void testUpdateHeadersImageNonCollectionThumb() throws Exception { - setMessageBody("image/png", true, false, false); + setMessageBody("image/png", true, false, DEFAULT_ENHANCEMENTS); processor.process(exchange); @@ -101,7 +105,7 @@ public void testUpdateHeadersImageNonCollectionThumb() throws Exception { @Test public void testThumbForce() throws Exception { - setMessageBody("image/png", true, true, false); + setMessageBody("image/png", true, true, DEFAULT_ENHANCEMENTS); processor.process(exchange); @@ -112,7 +116,7 @@ public void testThumbForce() throws Exception { @Test public void testThumbNoForce() throws Exception { - setMessageBody("image/png", true, false, false); + setMessageBody("image/png", true, false, DEFAULT_ENHANCEMENTS); processor.process(exchange); @@ -124,7 +128,7 @@ public void testThumbNoForce() throws Exception { @Test public void testExistingUriHeader() throws Exception { when(exchange.getIn().getHeader(FCREPO_URI)).thenReturn(RESC_URI); - setMessageBody("image/png", false, false, false); + setMessageBody("image/png", false, false, DEFAULT_ENHANCEMENTS); processor.process(exchange); @@ -137,7 +141,7 @@ public void testExistingUriHeader() throws Exception { 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, false); + setMessageBody("image/*", true, false, DEFAULT_ENHANCEMENTS); processor.process(exchange); @@ -148,7 +152,7 @@ public void testNonBinary() throws Exception { @Test public void testRegenerateDescription() throws Exception { - setMessageBody("image/png", true, false, true); + setMessageBody("image/png", true, false, List.of(MACHINE_GEN_DESCRIPTION)); processor.process(exchange); @@ -157,10 +161,10 @@ public void testRegenerateDescription() throws Exception { // check that force has been turned to true verify(message).setHeader("force", "true"); // the only enhancement run will be machine generated description - verify(message).setHeader(CdrEnhancementSet, "machineGenDescription"); + verify(message).setHeader(CdrEnhancementSet, MACHINE_GEN_DESCRIPTION); } - private void setMessageBody(String mimeType, boolean addEnhancementHeader, boolean force, boolean regenDescription) { + 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)); @@ -169,8 +173,8 @@ 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))); - enhancements.addContent(new Element("regenerateDescription", CDR_MESSAGE_NS) - .setText(String.valueOf(regenDescription))); + 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 d4e149b8c5..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,9 @@ 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.BinaryEnhancementProcessor.DEFAULT_ENHANCEMENTS; 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; @@ -449,7 +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); + headers.put(CdrEnhancementSet, DEFAULT_ENHANCEMENTS_STRING); return headers; } From ac12ba2e191af6df9f72bd6812132e4c8634e70b Mon Sep 17 00:00:00 2001 From: sharonl <6546457+sharonluong@users.noreply.github.com> Date: Tue, 16 Jun 2026 17:22:13 -0400 Subject: [PATCH 7/9] BXC-5684 fix tests --- .../RunEnhancementsServiceTest.java | 47 +++++++++---------- 1 file changed, 21 insertions(+), 26 deletions(-) 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 62e1aed528..dda79a8327 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, DEFAULT_ENHANCEMENTS_STRING); } @Test @@ -137,7 +140,7 @@ 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, DEFAULT_ENHANCEMENTS_STRING); } @Test @@ -154,8 +157,7 @@ public void runFileObjectWithRegenDescriptionTest() { verify(messageSender).sendMessage(docCaptor.capture()); Document msgDoc = docCaptor.getValue(); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDoc, dsPid, true); - assertRegenDescValue(msgDoc, true); + assertMessageValues(msgDoc, dsPid, true, MACHINE_GEN_DESCRIPTION); } @Test @@ -170,7 +172,7 @@ public void runWorkObjectShallowTest() { verify(messageSender).sendMessage(docCaptor.capture()); Document msgDoc = docCaptor.getValue(); - assertMessageValues(msgDoc, workPid, false); + assertMessageValues(msgDoc, workPid, false, DEFAULT_ENHANCEMENTS_STRING); } @Test @@ -189,9 +191,9 @@ 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, DEFAULT_ENHANCEMENTS_STRING); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDocs.get(1), dsPid, false); + assertMessageValues(msgDocs.get(1), dsPid, false, DEFAULT_ENHANCEMENTS_STRING); } @Test @@ -211,11 +213,9 @@ public void runWorkObjectRecursiveWithRegenDescriptionTest() { verify(messageSender, times(2)).sendMessage(docCaptor.capture()); var msgDocs = docCaptor.getAllValues(); - assertMessageValues(msgDocs.get(0), workPid, true); - assertRegenDescValue(msgDocs.get(0), true); + assertMessageValues(msgDocs.get(0), workPid, true, MACHINE_GEN_DESCRIPTION); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDocs.get(1), dsPid, true); - assertRegenDescValue(msgDocs.get(1), true); + assertMessageValues(msgDocs.get(1), dsPid, true, MACHINE_GEN_DESCRIPTION); } @Test @@ -235,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, DEFAULT_ENHANCEMENTS_STRING); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDocs.get(1), dsPid, false); - assertMessageValues(msgDocs.get(2), collPid, false); + assertMessageValues(msgDocs.get(1), dsPid, false, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDocs.get(2), collPid, false, DEFAULT_ENHANCEMENTS_STRING); } @Test @@ -268,31 +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, DEFAULT_ENHANCEMENTS_STRING); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDocs.get(1), dsPid, false); - assertMessageValues(msgDocs.get(2), workPid2, false); + assertMessageValues(msgDocs.get(1), dsPid, false, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDocs.get(2), workPid2, false, DEFAULT_ENHANCEMENTS_STRING); var dsPid2 = DatastreamPids.getOriginalFilePid(filePid2); - assertMessageValues(msgDocs.get(3), dsPid2, false); + assertMessageValues(msgDocs.get(3), dsPid2, false, DEFAULT_ENHANCEMENTS_STRING); } - 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); - } - - private void assertRegenDescValue(Document msgDoc, boolean expectedRegenerateDescription) { - Element entry = msgDoc.getRootElement(); - Element runEl = entry.getChild(RUN_ENHANCEMENTS.getName(), CDR_MESSAGE_NS); - var regenerateDescription = Boolean.valueOf(runEl.getChildText("regenerateDescription", CDR_MESSAGE_NS)); - assertEquals(expectedRegenerateDescription, regenerateDescription); + assertEquals(expectedEnhancements, enhancements); } } From ed79646659d52ce4999e5140a34e779882cfc9eb Mon Sep 17 00:00:00 2001 From: sharonl <6546457+sharonluong@users.noreply.github.com> Date: Thu, 18 Jun 2026 13:26:05 -0400 Subject: [PATCH 8/9] BXC-5684 update code --- .../jms/RunEnhancementsMessageHelpers.java | 44 +++---------------- .../camel/BinaryEnhancementProcessor.java | 11 ++--- .../AccessSurrogateRequestProcessor.java | 2 +- .../camel/BinaryEnhancementProcessorTest.java | 3 +- .../processing/RunEnhancementsRequest.java | 10 ++--- .../processing/RunEnhancementsService.java | 21 ++++----- 6 files changed, 26 insertions(+), 65 deletions(-) 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 1f8afbdf0d..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 @@ -35,9 +35,10 @@ 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) @@ -50,50 +51,17 @@ public static Document makeEnhancementOperationBody(String userid, PID pid, Bool paramForce.setText("false"); } - Element paramEnhancementList = new Element("enhancementList", CDR_MESSAGE_NS); - paramEnhancementList.setText(DEFAULT_ENHANCEMENTS_STRING); - 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); - - msg.addContent(entry); - - return msg; - } - - /** - * Generate the body for a run enhancement request message - * - * @param userid - * @param pid - * @param force - * @param enhancementList list of enhancements to run - * @return - */ - 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 { - paramForce.setText("false"); + if (enhancementList != null) { + Element paramEnhancementList = new Element("enhancementList", CDR_MESSAGE_NS); + paramEnhancementList.setText(String.join(",",enhancementList)); + enhancements.addContent(paramEnhancementList); } - Element paramEnhancementList = new Element("enhancementList", CDR_MESSAGE_NS); - paramEnhancementList.setText(String.join(",",enhancementList)); - - 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); - 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 a4d0439d0e..4d38f63a87 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 @@ -60,17 +60,14 @@ public void process(final Exchange exchange) throws Exception { in.setHeader(FcrepoJmsConstants.RESOURCE_TYPE, String.join(",", repoObj.getTypes())); Element forceText = enhancementsEl.getChild("force", CDR_MESSAGE_NS); - Element enhancementsList = enhancementsEl.getChild(ENHANCEMENT_LIST, CDR_MESSAGE_NS); - var enhancements = enhancementsList.getTextTrim(); - // if it's a regen request set force to true - if (Objects.equals(enhancements, MACHINE_GEN_DESCRIPTION)) { - in.setHeader("force", "true"); - } else if (forceText != null) { + if (forceText != null) { in.setHeader("force", forceText.getTextTrim()); } else { in.setHeader("force", "false"); } - // set list of enhancements as specified + + Element enhancementsList = enhancementsEl.getChild(ENHANCEMENT_LIST, CDR_MESSAGE_NS); + var enhancements = enhancementsList.getTextTrim(); in.setHeader(CdrEnhancementSet, enhancements); } catch (ObjectTypeMismatchException e) { 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/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 69d134cdef..69a1561ebf 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 @@ -158,8 +158,7 @@ public void testRegenerateDescription() throws Exception { verify(message).setHeader(FCREPO_URI, RESC_URI); verify(message).setHeader(RESOURCE_TYPE, Binary.getURI()); - // check that force has been turned to true - verify(message).setHeader("force", "true"); + verify(message).setHeader("force", "false"); // the only enhancement run will be machine generated description verify(message).setHeader(CdrEnhancementSet, MACHINE_GEN_DESCRIPTION); } 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 0f6d424814..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,7 +12,7 @@ public class RunEnhancementsRequest { private boolean force; private AgentPrincipals agent; private boolean recursive; - private boolean regenerateDescription; + private List enhancements; public List getPids() { return pids; @@ -46,11 +46,11 @@ public void setRecursive(boolean recursive) { this.recursive = recursive; } - public boolean isRegenerateDescription() { - return regenerateDescription; + public List getEnhancements() { + return enhancements; } - public void setRegenerateDescription(boolean regenerateDescription) { - this.regenerateDescription = regenerateDescription; + 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 17cf684880..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 @@ -1,8 +1,6 @@ package edu.unc.lib.boxc.web.services.processing; import static edu.unc.lib.boxc.model.api.DatastreamType.ORIGINAL_FILE; -import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.DEFAULT_ENHANCEMENTS; -import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.MACHINE_GEN_DESCRIPTION; import static edu.unc.lib.boxc.operations.jms.RunEnhancementsMessageHelpers.makeEnhancementOperationBody; import java.util.Arrays; @@ -67,7 +65,7 @@ public void run(RunEnhancementsRequest request) { var objectPids = request.getPids(); var force = request.isForce(); var recursive = request.isRecursive(); - var regenerateDescription = request.isRegenerateDescription(); + var enhancements = request.getEnhancements(); for (String objectPid : objectPids) { PID pid = PIDs.get(objectPid); @@ -76,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, regenerateDescription); + recursiveEnhancements(pid, agent, force, enhancements); } else { LOG.debug("Queueing object for enhancements: {}", pid); - shallowEnhancements(pid, agent, force, regenerateDescription); + shallowEnhancements(pid, agent, force, enhancements); } } } } - private void recursiveEnhancements(PID pid, AgentPrincipals agent, Boolean force, Boolean regenerateDescription) { + 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); @@ -108,33 +106,32 @@ 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, regenerateDescription); + createMessage(rootContainer, agent.getUsername(), force, enhancements); } for (ContentObjectRecord metadata : resultResponse.getResultList()) { - createMessage(metadata, agent.getUsername(), force, regenerateDescription); + 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, Boolean regenerateDescription) { + 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, regenerateDescription); + createMessage(metadata, agent.getUsername(), force, enhancements); } public void setAclService(AccessControlService aclService) { this.aclService = aclService; } - private void createMessage(ContentObjectRecord metadata, String username, Boolean force, Boolean regenerateDescription) { + 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; - var enhancements = regenerateDescription ? List.of(MACHINE_GEN_DESCRIPTION) : DEFAULT_ENHANCEMENTS; Document msg = makeEnhancementOperationBody(username, originalPid, force, enhancements); messageSender.sendMessage(msg); } From d89fce16ce7f324bf05856f58fc319874d89d042 Mon Sep 17 00:00:00 2001 From: sharonl <6546457+sharonluong@users.noreply.github.com> Date: Thu, 18 Jun 2026 14:05:07 -0400 Subject: [PATCH 9/9] BXC-5684 fix workflow --- .../camel/BinaryEnhancementProcessor.java | 9 ++++-- .../camel/BinaryEnhancementProcessorTest.java | 23 +++++++++------ .../RunEnhancementsServiceTest.java | 28 +++++++++---------- 3 files changed, 36 insertions(+), 24 deletions(-) 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 4d38f63a87..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,7 @@ 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; @@ -67,8 +68,12 @@ public void process(final Exchange exchange) throws Exception { } Element enhancementsList = enhancementsEl.getChild(ENHANCEMENT_LIST, CDR_MESSAGE_NS); - var enhancements = enhancementsList.getTextTrim(); - in.setHeader(CdrEnhancementSet, enhancements); + 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/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 69a1561ebf..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 @@ -82,7 +82,7 @@ void closeService() throws Exception { @Test public void testUpdateHeadersText() throws Exception { - setMessageBody("text/plain", true, false, DEFAULT_ENHANCEMENTS); + setMessageBody("text/plain", true, false, null); processor.process(exchange); @@ -94,60 +94,65 @@ public void testUpdateHeadersText() throws Exception { @Test public void testUpdateHeadersImageNonCollectionThumb() throws Exception { - setMessageBody("image/png", true, false, DEFAULT_ENHANCEMENTS); + 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, DEFAULT_ENHANCEMENTS); + 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, DEFAULT_ENHANCEMENTS); + 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, DEFAULT_ENHANCEMENTS); + 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, DEFAULT_ENHANCEMENTS); + 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); } @Test @@ -172,8 +177,10 @@ 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))); - enhancements.addContent(new Element(ENHANCEMENT_LIST, CDR_MESSAGE_NS) - .setText(String.join(",",enhancementsList))); + if (enhancementsList != null) { + enhancements.addContent(new Element(ENHANCEMENT_LIST, CDR_MESSAGE_NS) + .setText(String.join(",",enhancementsList))); + } entry.addContent(enhancements); } 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 dda79a8327..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 @@ -124,7 +124,7 @@ public void runFileObjectTest() { verify(messageSender).sendMessage(docCaptor.capture()); Document msgDoc = docCaptor.getValue(); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDoc, dsPid, false, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDoc, dsPid, false, null); } @Test @@ -140,7 +140,7 @@ public void runFileObjectWithForceTest() { verify(messageSender).sendMessage(docCaptor.capture()); Document msgDoc = docCaptor.getValue(); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDoc, dsPid, true, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDoc, dsPid, true, null); } @Test @@ -149,7 +149,7 @@ public void runFileObjectWithRegenDescriptionTest() { request.setAgent(agent); request.setRecursive(true); request.setForce(true); - request.setRegenerateDescription(true); + request.setEnhancements(List.of(MACHINE_GEN_DESCRIPTION)); request.setPids(List.of(filePid.getId())); service.run(request); @@ -172,7 +172,7 @@ public void runWorkObjectShallowTest() { verify(messageSender).sendMessage(docCaptor.capture()); Document msgDoc = docCaptor.getValue(); - assertMessageValues(msgDoc, workPid, false, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDoc, workPid, false, null); } @Test @@ -191,9 +191,9 @@ public void runWorkObjectRecursiveTest() { verify(messageSender, times(2)).sendMessage(docCaptor.capture()); var msgDocs = docCaptor.getAllValues(); - assertMessageValues(msgDocs.get(0), workPid, false, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDocs.get(0), workPid, false, null); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDocs.get(1), dsPid, false, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDocs.get(1), dsPid, false, null); } @Test @@ -206,7 +206,7 @@ public void runWorkObjectRecursiveWithRegenDescriptionTest() { request.setAgent(agent); request.setRecursive(true); request.setForce(true); - request.setRegenerateDescription(true); + request.setEnhancements(List.of(MACHINE_GEN_DESCRIPTION)); request.setPids(List.of(workPid.getId())); service.run(request); @@ -235,10 +235,10 @@ public void runMultiplePidsShallowTest() { verify(messageSender, times(3)).sendMessage(docCaptor.capture()); var msgDocs = docCaptor.getAllValues(); - assertMessageValues(msgDocs.get(0), workPid, false, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDocs.get(0), workPid, false, null); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDocs.get(1), dsPid, false, DEFAULT_ENHANCEMENTS_STRING); - assertMessageValues(msgDocs.get(2), collPid, false, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDocs.get(1), dsPid, false, null); + assertMessageValues(msgDocs.get(2), collPid, false, null); } @Test @@ -268,12 +268,12 @@ public void runMultiplePidsRecursiveTest() { verify(messageSender, times(4)).sendMessage(docCaptor.capture()); var msgDocs = docCaptor.getAllValues(); - assertMessageValues(msgDocs.get(0), workPid, false, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDocs.get(0), workPid, false, null); var dsPid = DatastreamPids.getOriginalFilePid(filePid); - assertMessageValues(msgDocs.get(1), dsPid, false, DEFAULT_ENHANCEMENTS_STRING); - assertMessageValues(msgDocs.get(2), workPid2, false, DEFAULT_ENHANCEMENTS_STRING); + 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, DEFAULT_ENHANCEMENTS_STRING); + assertMessageValues(msgDocs.get(3), dsPid2, false, null); } private void assertMessageValues(Document msgDoc, PID expectedPid, boolean expectedForce, String expectedEnhancements) {