/** @todo DRY! Perhaps we should merge this with the older updateContentIndexTime method. */
 public DvObject updatePermissionIndexTime(DvObject dvObject) {
   /**
    * @todo to avoid a possible OptimisticLockException, should we merge dvObject before we try to
    *     set this timestamp? See
    *     https://github.com/IQSS/dataverse/commit/6ad0ebb272c8cb46368cb76784b55dbf33eea947
    */
   DvObject dvObjectToModify = findDvObject(dvObject.getId());
   dvObjectToModify.setPermissionIndexTime(new Timestamp(new Date().getTime()));
   DvObject savedDvObject = em.merge(dvObjectToModify);
   return savedDvObject;
 }
  public Set<RoleAssignment> rolesAssignments(DvObject dv) {
    Set<RoleAssignment> ras = new HashSet<>();
    while (!dv.isEffectivelyPermissionRoot()) {
      ras.addAll(
          em.createNamedQuery("RoleAssignment.listByDefinitionPointId", RoleAssignment.class)
              .setParameter("definitionPointId", dv.getId())
              .getResultList());
      dv = dv.getOwner();
    }

    ras.addAll(
        em.createNamedQuery("RoleAssignment.listByDefinitionPointId", RoleAssignment.class)
            .setParameter("definitionPointId", dv.getId())
            .getResultList());

    return ras;
  }
 /**
  * Retrieves the roles assignments for {@code user}, directly on {@code dv}. No traversal on the
  * containment hierarchy is done.
  *
  * @param roas the user whose roles are given
  * @param dvo the object where the roles are defined.
  * @return Set of roles defined for the user in the given dataverse.
  * @see #roleAssignments(edu.harvard.iq.dataverse.DataverseUser,
  *     edu.harvard.iq.dataverse.Dataverse)
  */
 public List<RoleAssignment> directRoleAssignments(RoleAssignee roas, DvObject dvo) {
   if (roas == null) throw new IllegalArgumentException("RoleAssignee cannot be null");
   TypedQuery<RoleAssignment> query =
       em.createNamedQuery(
           "RoleAssignment.listByAssigneeIdentifier_DefinitionPointId", RoleAssignment.class);
   query.setParameter("assigneeIdentifier", roas.getIdentifier());
   query.setParameter("definitionPointId", dvo.getId());
   return query.getResultList();
 }
 public void revoke(Set<DataverseRole> roles, RoleAssignee assignee, DvObject defPoint) {
   for (DataverseRole role : roles) {
     em.createNamedQuery("RoleAssignment.deleteByAssigneeIdentifier_RoleIdDefinition_PointId")
         .setParameter("assigneeIdentifier", assignee.getIdentifier())
         .setParameter("roleId", role.getId())
         .setParameter("definitionPointId", defPoint.getId())
         .executeUpdate();
     em.refresh(role);
   }
   em.refresh(assignee);
 }
  public RoleAssignmentSet assignmentsFor(final User u, final DvObject d) {
    return d.accept(
        new DvObject.Visitor<RoleAssignmentSet>() {

          @Override
          public RoleAssignmentSet visit(Dataverse dv) {
            return roleAssignments(u, dv);
          }

          @Override
          public RoleAssignmentSet visit(Dataset ds) {
            RoleAssignmentSet asgn = ds.getOwner().accept(this);
            asgn.add(directRoleAssignments(u, ds));
            return asgn;
          }

          @Override
          public RoleAssignmentSet visit(DataFile df) {
            RoleAssignmentSet asgn = df.getOwner().accept(this);
            asgn.add(directRoleAssignments(u, df));
            return asgn;
          }
        });
  }
 /**
  * Retrieves the roles assignments for {@code user}, directly on {@code dv}. No traversal on the
  * containment hierarchy is done.
  *
  * @param dvo the object where the roles are defined.
  * @return Set of roles defined for the user in the given dataverse.
  * @see #roleAssignments(edu.harvard.iq.dataverse.DataverseUser,
  *     edu.harvard.iq.dataverse.Dataverse)
  */
 public List<RoleAssignment> directRoleAssignments(DvObject dvo) {
   TypedQuery<RoleAssignment> query =
       em.createNamedQuery("RoleAssignment.listByDefinitionPointId", RoleAssignment.class);
   query.setParameter("definitionPointId", dvo.getId());
   return query.getResultList();
 }