Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> 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() {
}

Expand All @@ -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<String> enhancementList) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks like quilty is mad because there is no coverage of this method. I know there's no existing test, but since this is one of the central changes in this PR I'd suggest adding one, even if it just targets your modifications. It looks like it should be very testable

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 {
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,14 +24,15 @@
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
*
* @author lfarrell
*/
public class BinaryEnhancementProcessor implements Processor {
private static final Logger log = LoggerFactory.getLogger(BinaryEnhancementProcessor.class);

private RepositoryObjectLoader repoObjLoader;

@Override
Expand Down Expand Up @@ -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);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In order to allow us to catch empty enhancementLists, not just the absence of the XML element, we could directly use getChildTextTrim here and then do a blank/null check in the conditional

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());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -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}}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,19 @@
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;
import static edu.unc.lib.boxc.model.api.rdf.Fcrepo4Repository.Binary;
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;
Expand Down Expand Up @@ -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<String> enhancementsList) {
Document msg = new Document();
Element entry = new Element("entry", ATOM_NS);
entry.addContent(new Element("mimeType", ATOM_NS).setText(mimeType));
Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<String, Object> 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));
Expand All @@ -425,6 +450,7 @@ private Map<String, Object> 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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public class RunEnhancementsRequest {
private boolean force;
private AgentPrincipals agent;
private boolean recursive;
private List<String> enhancements;

public List<String> getPids() {
return pids;
Expand Down Expand Up @@ -44,4 +45,12 @@ public boolean isRecursive() {
public void setRecursive(boolean recursive) {
this.recursive = recursive;
}

public List<String> getEnhancements() {
return enhancements;
}

public void setEnhancements(List<String> enhancements) {
this.enhancements = enhancements;
}
}
Loading
Loading