Skip to content

Commit

Permalink
Bxc 4064 assign thumbnail (#1604)
Browse files Browse the repository at this point in the history
* BXC-4064 starting thumbnail router and processor

* BXC-4064 add request and helper classes

* BXC-4064 add router test

* BXC-4064 add processor test

* BXC-4064 trying to work on tests

* BXC-4064 use captor and new mock init syntax

* BXC-4064 cleaning up

* BXC-4064 cleanup per PR comments

---------

Co-authored-by: Sharon Luong <[email protected]>
  • Loading branch information
sharonluong and Sharon Luong committed Aug 31, 2023
1 parent d491002 commit 88a903f
Show file tree
Hide file tree
Showing 13 changed files with 418 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ public static String getURI() {
public static final Property unpublished = createProperty(
"http://cdr.unc.edu/definitions/model#unpublished" );

/** Property which records which file should be used as thumbnail of the parent work
*/
public static final Property useAsThumbnail = createProperty(
"http://cdr.unc.edu/definitions/model#useAsThumbnail" );

/** Selector for identifying fields within descriptive metadata records which
* this vocabulary applies to.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package edu.unc.lib.boxc.operations.jms.thumbnail;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import edu.unc.lib.boxc.auth.api.models.AgentPrincipals;
import edu.unc.lib.boxc.auth.fcrepo.models.AgentPrincipalsImpl;

/**
* Request object for setting a file as thumbnail for a work
*
* @author snluong
*/
public class ThumbnailRequest {
@JsonDeserialize(as = AgentPrincipalsImpl.class)
private AgentPrincipals agent;
private String filePidString;

public AgentPrincipals getAgent() {
return agent;
}

public void setAgent(AgentPrincipals agent) {
this.agent = agent;
}

public String getFilePidString() {
return filePidString;
}

public void setFilePidString(String filePidString) {
this.filePidString = filePidString;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package edu.unc.lib.boxc.operations.jms.thumbnail;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.ObjectWriter;

import java.io.IOException;

/**
* Helper methods for serializing and deserializing thumbnail requests
*
* @author snluong
*/
public class ThumbnailRequestSerializationHelper {
private static final ObjectWriter REQUEST_WRITER;
private static final ObjectReader REQUEST_READER;
static {
ObjectMapper mapper = new ObjectMapper();
REQUEST_WRITER = mapper.writerFor(ThumbnailRequest.class);
REQUEST_READER = mapper.readerFor(ThumbnailRequest.class);
}

private ThumbnailRequestSerializationHelper() {
}

/**
* Transform request into a JSON string
* @param request
* @return
* @throws IOException
*/
public static String toJson(ThumbnailRequest request) throws IOException {
return REQUEST_WRITER.writeValueAsString(request);
}

/**
* Transform JSON string to a ThumbnailRequest
* @param json
* @return
* @throws IOException
*/
public static ThumbnailRequest toRequest(String json) throws IOException {
return REQUEST_READER.readValue(json);
}
}
4 changes: 4 additions & 0 deletions services-camel-app/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,10 @@
<groupId>org.apache.jena</groupId>
<artifactId>jena-fuseki-main</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package edu.unc.lib.boxc.services.camel.thumbnails;

import edu.unc.lib.boxc.auth.api.Permission;
import edu.unc.lib.boxc.auth.api.services.AccessControlService;
import edu.unc.lib.boxc.model.api.objects.RepositoryObjectLoader;
import edu.unc.lib.boxc.model.api.rdf.Cdr;
import edu.unc.lib.boxc.model.api.services.RepositoryObjectFactory;
import edu.unc.lib.boxc.model.fcrepo.ids.PIDs;
import edu.unc.lib.boxc.operations.jms.indexing.IndexingActionType;
import edu.unc.lib.boxc.operations.jms.indexing.IndexingMessageSender;
import edu.unc.lib.boxc.operations.jms.thumbnail.ThumbnailRequestSerializationHelper;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;

import java.io.IOException;

/**
* Processing requests to assign a thumbnail from a file to its parent work
*
* @author snluong
*/
public class ThumbnailRequestProcessor implements Processor {
private RepositoryObjectLoader repositoryObjectLoader;
private RepositoryObjectFactory repositoryObjectFactory;
private AccessControlService aclService;
private IndexingMessageSender indexingMessageSender;

@Override
public void process(Exchange exchange) throws IOException {
var in = exchange.getIn();
var request = ThumbnailRequestSerializationHelper.toRequest(in.getBody(String.class));
var agent = request.getAgent();
var pid = PIDs.get(request.getFilePidString());

aclService.assertHasAccess("User does not have permission to add/update work thumbnail",
pid, agent.getPrincipals(), Permission.editDescription);

var file = repositoryObjectLoader.getFileObject(pid);
var work = file.getParent();

repositoryObjectFactory.createExclusiveRelationship(work, Cdr.useAsThumbnail, file.getResource());

// send message to update solr
indexingMessageSender.sendIndexingOperation(
agent.getUsername(), work.getPid(), IndexingActionType.UPDATE_DATASTREAMS);
}

public void setRepositoryObjectLoader(RepositoryObjectLoader repositoryObjectLoader) {
this.repositoryObjectLoader = repositoryObjectLoader;
}

public void setRepositoryObjectFactory(RepositoryObjectFactory repositoryObjectFactory) {
this.repositoryObjectFactory = repositoryObjectFactory;
}

public void setAclService(AccessControlService aclService) {
this.aclService = aclService;
}

public void setIndexingMessageSender(IndexingMessageSender indexingMessageSender) {
this.indexingMessageSender = indexingMessageSender;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package edu.unc.lib.boxc.services.camel.thumbnails;

import org.apache.camel.BeanInject;
import org.apache.camel.builder.RouteBuilder;
import org.slf4j.Logger;

import static org.apache.camel.LoggingLevel.DEBUG;
import static org.slf4j.LoggerFactory.getLogger;

/**
* Router for processing assigning thumbnails for works
*
* @author snluong
*/
public class ThumbnailRouter extends RouteBuilder {
private static final Logger log = getLogger(ThumbnailRouter.class);
@BeanInject(value = "thumbnailRequestProcessor")
private ThumbnailRequestProcessor thumbnailRequestProcessor;

@Override
public void configure() throws Exception {
from("{{cdr.thumbnails.stream.camel}}")
.routeId("DcrThumbnails")
.log(DEBUG, log, "Received thumbnail request")
.bean(thumbnailRequestProcessor);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package edu.unc.lib.boxc.services.camel;

import edu.unc.lib.boxc.model.api.ids.PID;
import edu.unc.lib.boxc.model.fcrepo.ids.PIDs;
import org.apache.camel.Exchange;
import org.apache.camel.Message;

import java.util.UUID;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

/**
* Basic methods used in several Processor tests
*
* @author snluong
*/
public class ProcessorTestHelper {
public static PID makePid() {
return PIDs.get(UUID.randomUUID().toString());
}

public static Exchange mockExchange(String body) {
var exchange = mock(Exchange.class);
var message = mock(Message.class);
when(exchange.getIn()).thenReturn(message);
when(message.getBody(String.class)).thenReturn(body);
return exchange;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import edu.unc.lib.boxc.operations.jms.order.MultiParentOrderRequest;
import edu.unc.lib.boxc.operations.jms.order.OrderOperationType;
import edu.unc.lib.boxc.operations.jms.order.OrderRequestSerializationHelper;
import edu.unc.lib.boxc.services.camel.ProcessorTestHelper;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.junit.Before;
Expand Down Expand Up @@ -142,7 +143,7 @@ public void insufficientPermissionsTest() throws Exception {
public void invalidRequestBodyTest() throws Exception {
mockRequestAsValid();

var requestExchange = mockExchange("bad times");
var requestExchange = ProcessorTestHelper.mockExchange("bad times");
try {
processor.process(requestExchange);
fail();
Expand Down Expand Up @@ -340,14 +341,6 @@ private Exchange createRequestExchange(Map<String, List<String>> parentToOrder)
request.setEmail(EMAIL);
request.setOperation(OrderOperationType.SET);
request.setParentToOrdered(parentToOrder);
return mockExchange(OrderRequestSerializationHelper.toJson(request));
}

private Exchange mockExchange(String body) {
var exchange = mock(Exchange.class);
var message = mock(Message.class);
when(exchange.getIn()).thenReturn(message);
when(message.getBody(String.class)).thenReturn(body);
return exchange;
return ProcessorTestHelper.mockExchange(OrderRequestSerializationHelper.toJson(request));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import edu.unc.lib.boxc.model.api.objects.RepositoryObjectLoader;
import edu.unc.lib.boxc.model.api.objects.WorkObject;
import edu.unc.lib.boxc.operations.jms.MessageSender;
import edu.unc.lib.boxc.services.camel.ProcessorTestHelper;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.jdom2.Document;
Expand Down Expand Up @@ -88,7 +89,7 @@ public void init() {
when(exchange.getIn()).thenReturn(msg);
when(msg.getBody()).thenReturn(bodyDoc);

targetPid = makePid();
targetPid = ProcessorTestHelper.makePid();
}

@Test
Expand Down Expand Up @@ -177,15 +178,11 @@ private List<PID> addChildren(int count) {

List<PID> pids = new ArrayList<>();
for (int i = 0; i < count; i++) {
PID pid = makePid();
PID pid = ProcessorTestHelper.makePid();
pids.add(pid);
children.addContent(new Element("pid", CDR_MESSAGE_NS)
.setText(pid.getRepositoryPath()));
}
return pids;
}

private PID makePid() {
return PIDs.get(UUID.randomUUID().toString());
}
}
Loading

0 comments on commit 88a903f

Please sign in to comment.