Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BXC-4361 - Capture previous patron role state in premis event #1664

Merged
merged 1 commit into from
Feb 13, 2024
Merged
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 @@ -8,17 +8,20 @@
import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.springframework.util.Assert.notNull;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.apache.jena.datatypes.xsd.XSDDatatype;
import org.apache.jena.datatypes.xsd.XSDDateTime;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
Expand Down Expand Up @@ -152,14 +155,22 @@ private Resource replacePatronRoles(RepositoryObject repoObj, Model model, Patro
// Update a copy of the model for this object
Resource resc = model.getResource(repoObj.getPid().getRepositoryPath());

// So nor proceed if there are no changes to role assignments
// Do not proceed if there are no changes to role assignments
if (!hasRoleChanges(resc, assignments)) {
return null;
}

var oldRoles = new ArrayList<Property>();
var oldPrincipals = new ArrayList<String>();
// Clear out all the existing staff roles
for (UserRole role: UserRole.getPatronRoles()) {
resc.removeAll(role.getProperty());
var it = resc.listProperties(role.getProperty());
while (it.hasNext()) {
Statement stmt = it.next();
oldRoles.add(stmt.getPredicate());
oldPrincipals.add(stmt.getString());
it.remove();
}
}

// Add the new role assignments
Expand All @@ -172,7 +183,7 @@ private Resource replacePatronRoles(RepositoryObject repoObj, Model model, Patro
// Add PREMIS event indicating the role changes
return premisLoggerFactory.createPremisLogger(repoObj).buildEvent(Premis.PolicyAssignment)
.addImplementorAgent(AgentPids.forPerson(agent))
.addEventDetail(createRoleEventDetails(assignments))
.addEventDetail(createRoleEventDetails(assignments, oldRoles, oldPrincipals))
.create();
}

Expand Down Expand Up @@ -251,14 +262,27 @@ private Resource updateEmbargo(RepositoryObject repoObj, Model model, PatronAcce
}
}

private String createRoleEventDetails(Collection<RoleAssignment> assignments) {
StringBuilder details = new StringBuilder("Patron roles for item set to:");
private String createRoleEventDetails(Collection<RoleAssignment> assignments,
List<Property> oldRoles, List<String> oldPrincipals) {
StringBuilder details = new StringBuilder("Patron roles for item changed from:");
details.append(NEWLINE);
if (oldRoles.isEmpty()) {
details.append("No roles assigned").append(NEWLINE);
} else {
// Add the old assignments in alphabetic order in order to guarantee consistent messages
List<String> oldAssignments = new ArrayList<>();
for (int i = 0; i < oldRoles.size(); i++) {
oldAssignments.add(oldPrincipals.get(i) + ": " + oldRoles.get(i).getURI() + NEWLINE);
}
oldAssignments.stream().sorted().forEach(details::append);
}
details.append("To new roles:").append(NEWLINE);
if (assignments == null || assignments.isEmpty()) {
details.append("No roles assigned");
} else {
String roleDetails = assignments.stream()
.map(a -> a.getPrincipal() + ": " + a.getRole().getPropertyString())
.sorted()
.collect(Collectors.joining(NEWLINE));
details.append(roleDetails);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,12 @@ public void assignNewRoles() throws Exception {

List<String> eventDetails = getEventDetails(target);
assertEquals(1, eventDetails.size());
assertEventWithDetail(eventDetails, PUBLIC_PRINC + ": " + canViewMetadata.getPropertyString());
assertEventWithDetail(eventDetails, AUTHENTICATED_PRINC + ": " + canViewOriginals.getPropertyString());
assertEquals("Patron roles for item changed from:\n" +
"No roles assigned\n" +
"To new roles:\n" +
"authenticated: http://cdr.unc.edu/definitions/acl#canViewOriginals\n" +
"everyone: http://cdr.unc.edu/definitions/acl#canViewMetadata",
eventDetails.get(0));

assertMessageSent(pid);
}
Expand Down Expand Up @@ -375,7 +379,10 @@ public void revokeRole() throws Exception {

List<String> eventDetails = getEventDetails(target);
assertEquals(1, eventDetails.size());
assertEventWithDetail(eventDetails, PUBLIC_PRINC + ": " + UserRole.none.getPropertyString());
assertEquals("Patron roles for item changed from:\n" +
"everyone: http://cdr.unc.edu/definitions/acl#canViewOriginals\n" +
"To new roles:\n" +
"everyone: http://cdr.unc.edu/definitions/acl#none", eventDetails.get(0));

assertMessageSent(pid);
}
Expand Down Expand Up @@ -403,8 +410,11 @@ public void overwriteRoles() throws Exception {

List<String> eventDetails = getEventDetails(target);
assertEquals(1, eventDetails.size());
assertEventWithDetail(eventDetails, AUTHENTICATED_PRINC + ": " + canViewMetadata.getPropertyString());
assertFalse(eventDetails.get(0).contains(PUBLIC_PRINC));
assertEquals("Patron roles for item changed from:\n" +
"authenticated: http://cdr.unc.edu/definitions/acl#canViewOriginals\n" +
"everyone: http://cdr.unc.edu/definitions/acl#canViewOriginals\n" +
"To new roles:\n" +
"authenticated: http://cdr.unc.edu/definitions/acl#canViewMetadata", eventDetails.get(0));

assertMessageSent(pid);
}
Expand All @@ -428,7 +438,10 @@ public void clearExistingRoles() throws Exception {

List<String> eventDetails = getEventDetails(target);
assertEquals(1, eventDetails.size());
assertEventWithDetail(eventDetails, "No roles assigned");
assertEquals("Patron roles for item changed from:\n" +
"everyone: http://cdr.unc.edu/definitions/acl#canViewOriginals\n" +
"To new roles:\n" +
"No roles assigned", eventDetails.get(0));

assertMessageSent(pid);
}
Expand Down Expand Up @@ -628,7 +641,11 @@ public void rolesUpdatedWhenSkippingEmbargo() throws Exception {

List<String> eventDetails = getEventDetails(target);
assertEquals(1, eventDetails.size());
assertEventWithDetail(eventDetails, AUTHENTICATED_PRINC + ": " + canViewOriginals.getPropertyString());
assertEquals("Patron roles for item changed from:\n" +
"No roles assigned\n" +
"To new roles:\n" +
"authenticated: http://cdr.unc.edu/definitions/acl#canViewOriginals",
eventDetails.get(0));

assertMessageSent(pid);
}
Expand Down Expand Up @@ -786,6 +803,10 @@ public void addPatronRolesToResourceWithStaffRoles() throws Exception {
List<String> eventDetails = getEventDetails(target);
assertEquals(1, eventDetails.size());
assertEventWithDetail(eventDetails, AUTHENTICATED_PRINC + ": " + canViewMetadata.getPropertyString());
assertEquals("Patron roles for item changed from:\n" +
"No roles assigned\n" +
"To new roles:\n" +
"authenticated: http://cdr.unc.edu/definitions/acl#canViewMetadata", eventDetails.get(0));

assertMessageSent(pid);
}
Expand Down
Loading