public RoleAssignmentSet roleAssignments(User user, Dataverse dv) {
   RoleAssignmentSet retVal = new RoleAssignmentSet(user);
   while (dv != null) {
     retVal.add(directRoleAssignments(user, dv));
     if (dv.isPermissionRoot()) break;
     dv = dv.getOwner();
   }
   return retVal;
 }
  /**
   * Get all the available roles in a given dataverse, mapped by the dataverse that defines them.
   * Map entries are ordered by reversed hierarchy (root is always last).
   *
   * @param dvId The id of dataverse whose available roles we query
   * @return map of available roles.
   */
  public Set<DataverseRole> availableRoles(Long dvId) {
    Dataverse dv = em.find(Dataverse.class, dvId);
    Set<DataverseRole> roles = dv.getRoles();
    roles.addAll(findBuiltinRoles());

    while (!dv.isEffectivelyPermissionRoot()) {
      dv = dv.getOwner();
      roles.addAll(dv.getRoles());
    }

    return roles;
  }
  public boolean isRequired() {
    if (required == null) {
      required = false;
      if (this.datasetFieldType.isPrimitive() && this.datasetFieldType.isRequired()) {
        required = true;
      }

      if (this.datasetFieldType.isHasRequiredChildren()) {
        required = true;
      }

      Dataverse dv = getDataverse();
      while (!dv.isMetadataBlockRoot()) {
        if (dv.getOwner() == null) {
          break; // we are at the root; which by defintion is metadata blcok root, regarldess of the
                 // value
        }
        dv = dv.getOwner();
      }

      List<DataverseFieldTypeInputLevel> dftilListFirst = dv.getDataverseFieldTypeInputLevels();
      if (!getDatasetFieldType().isHasChildren()) {
        for (DataverseFieldTypeInputLevel dsftil : dftilListFirst) {
          if (dsftil.getDatasetFieldType().equals(this.datasetFieldType)) {
            required = dsftil.isRequired();
          }
        }
      }

      if (getDatasetFieldType().isHasChildren() && (!dftilListFirst.isEmpty())) {
        for (DatasetFieldType child : getDatasetFieldType().getChildDatasetFieldTypes()) {
          for (DataverseFieldTypeInputLevel dftilTest : dftilListFirst) {
            if (child.equals(dftilTest.getDatasetFieldType())) {
              if (dftilTest.isRequired()) {
                required = true;
              }
            }
          }
        }
      }
    }
    // System.out.print("at return  " + this.datasetFieldType.getDisplayName() + " " + required);
    return required;
  }