Skip to content

Commit

Permalink
Add previous patron role state to premis event when assigning. Ensure…
Browse files Browse the repository at this point in the history
… that assignments show up in a consistent order by sorting them (#1664)
  • Loading branch information
bbpennel authored Feb 13, 2024
1 parent 45ec48e commit a627729
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 12 deletions.
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

0 comments on commit a627729

Please sign in to comment.