/**
   * Go to detail page
   *
   * @return forward to DETAIL page
   */
  public String detail() {
    Integer id = Integer.parseInt(FacesUtils.getRequestParameter("id"));
    idea = manager.getEntityById(id);

    return SpringUtils.isAclPermissionGranted(idea, BasePermission.WRITE)
        ? NavigationResults.EDIT
        : NavigationResults.DETAIL;
  }
  private void addAclLevel(
      Map<AclMatrixKey, AclMatrixValue> matrix,
      AclImpl acl,
      Class type,
      ITransferObject dto,
      Permission perm) {
    Principal principal = SpringUtils.getPrincipal();
    Sid sid = new PrincipalSid(principal.getUsername());
    AclMatrixKey key = new AclMatrixKey(type, principal.getRoleId());
    AclMatrixValue level = matrix.get(key);

    log.debug(
        "addAclLevel -"
            + " permission=["
            + perm.getPattern()
            + "]"
            + " type="
            + type.getSimpleName()
            + " id="
            + dto.getId()
            + " ownerId="
            + dto.getOwnerId()
            + " departmentId="
            + dto.getDepartmentId()
            + " userId="
            + principal.getId()
            + " roleId="
            + principal.getRoleId()
            + " level="
            + level);
    if (level == null) {
      throw new UnsupportedOperationException("Write permission level for " + key + " not defined");
    }

    switch (level) {
      case ALL:
        acl.insertAce(null, perm, sid, true);
        break;

      case OWN:
        if (isIgnoreUnownedObjects() && (dto.getOwnerId() == null)) {
          acl.insertAce(null, perm, sid, true);
          log.warn(
              "addAclLevel - allowing permission ["
                  + perm.getPattern()
                  + "] on object "
                  + type.getSimpleName()
                  + "["
                  + dto.getId()
                  + "] "
                  + "because it is not owned by any user and ignoreUnownedObjects=true in DefaultAclService");
        } else {
          if (dto.getOwnerId() == principal.getId()) {
            acl.insertAce(null, perm, sid, true);
          }
        }
        break;

      case AREA:
        if (isIgnoreUnownedObjects() && (dto.getDepartmentId() == null)) {
          acl.insertAce(null, perm, sid, true);
          log.warn(
              "addAclLevel - allowing permission ["
                  + perm.getPattern()
                  + "] on object "
                  + type.getSimpleName()
                  + "["
                  + dto.getId()
                  + "] "
                  + "because it is not owned by any department and ignoreUnownedObjects=true in DefaultAclService");
        } else {
          if (dto.getDepartmentId() == principal.getDepartmentId()) {
            acl.insertAce(null, perm, sid, true);
          }
        }
        break;

      case DENY:
        // Do nothing
        break;

      default:
        throw new UnsupportedOperationException(
            "AclMatrixValue(" + level + ") not supported by write permission in readAclById()");
    }
  }
 /**
  * Whether or not edit button is available for user
  *
  * @return true if user can edit current object
  */
 public boolean isEditAvailable() {
   return SpringUtils.isAclPermissionGranted(idea, BasePermission.WRITE);
 }
 /**
  * Whether or not delete button is available for user
  *
  * @return true if user can delete current object
  */
 public boolean isDeleteAvailable() {
   return (idea.getId() != null)
       && SpringUtils.isAclPermissionGranted(idea, BasePermission.DELETE);
 }
 /**
  * Whether or not create button is available for user
  *
  * @return true if user can create objects of type Idea
  */
 public boolean isCreateAvailable() {
   return SpringUtils.isRolePermissionGranted(Permission.Entity_Create(Idea.class));
 }