private Boolean isAllowableBaseType(
      String key, String baseType, Content content, String repositoryId) {
    // NavigationServices
    if (PermissionMapping.CAN_GET_DESCENDENTS_FOLDER.equals(key))
      return BaseTypeId.CMIS_FOLDER.value().equals(baseType);
    if (PermissionMapping.CAN_GET_CHILDREN_FOLDER.equals(key))
      return BaseTypeId.CMIS_FOLDER.value().equals(baseType);
    if (PermissionMapping.CAN_GET_FOLDER_PARENT_OBJECT.equals(key))
      if (contentService.isRoot(repositoryId, content)) {
        return false;
      } else {
        return BaseTypeId.CMIS_FOLDER.value().equals(baseType);
      }
    if (PermissionMapping.CAN_GET_PARENTS_FOLDER.equals(key))
      if (contentService.isRoot(repositoryId, content)) {
        return false;
      } else {
        return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
            || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
            || BaseTypeId.CMIS_POLICY.value().equals(baseType)
            || BaseTypeId.CMIS_ITEM.value().equals(baseType));
      }

    // Object Services
    if (PermissionMapping.CAN_CREATE_DOCUMENT_FOLDER.equals(key))
      return BaseTypeId.CMIS_FOLDER.value().equals(baseType);
    if (PermissionMapping.CAN_CREATE_FOLDER_FOLDER.equals(key))
      return BaseTypeId.CMIS_FOLDER.value().equals(baseType);
    if (PermissionMapping.CAN_CREATE_POLICY_FOLDER.equals(key))
      return BaseTypeId.CMIS_FOLDER.value().equals(baseType);
    if (PermissionMapping.CAN_CREATE_RELATIONSHIP_SOURCE.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.equals(baseType));
    if (PermissionMapping.CAN_CREATE_RELATIONSHIP_TARGET.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    if (PermissionMapping.CAN_GET_PROPERTIES_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
          || BaseTypeId.CMIS_RELATIONSHIP.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    if (PermissionMapping.CAN_UPDATE_PROPERTIES_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
          || BaseTypeId.CMIS_RELATIONSHIP.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    if (PermissionMapping.CAN_MOVE_OBJECT.equals(key))
      if (contentService.isRoot(repositoryId, content)) {
        return false;
      } else {
        return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
            || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
            || BaseTypeId.CMIS_POLICY.value().equals(baseType)
            || BaseTypeId.CMIS_ITEM.value().equals(baseType));
      }
    if (PermissionMapping.CAN_MOVE_TARGET.equals(key))
      return BaseTypeId.CMIS_FOLDER.value().equals(baseType);
    if (PermissionMapping.CAN_MOVE_SOURCE.equals(key))
      return BaseTypeId.CMIS_FOLDER.value().equals(baseType);
    if (PermissionMapping.CAN_DELETE_OBJECT.equals(key))
      if (contentService.isRoot(repositoryId, content)) {
        return false;
      } else {
        return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
            || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
            || BaseTypeId.CMIS_RELATIONSHIP.value().equals(baseType)
            || BaseTypeId.CMIS_POLICY.value().equals(baseType)
            || BaseTypeId.CMIS_ITEM.value().equals(baseType));
      }
    if (PermissionMapping.CAN_VIEW_CONTENT_OBJECT.equals(key))
      return BaseTypeId.CMIS_DOCUMENT.value().equals(baseType);
    if (PermissionMapping.CAN_SET_CONTENT_DOCUMENT.equals(key))
      return BaseTypeId.CMIS_DOCUMENT.value().equals(baseType);
    if (PermissionMapping.CAN_DELETE_CONTENT_DOCUMENT.equals(key))
      return BaseTypeId.CMIS_DOCUMENT.value().equals(baseType);
    if (PermissionMapping.CAN_DELETE_TREE_FOLDER.equals(key))
      return BaseTypeId.CMIS_FOLDER.value().equals(baseType);
    // Filing Services
    if (PermissionMapping.CAN_ADD_TO_FOLDER_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    if (PermissionMapping.CAN_ADD_TO_FOLDER_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    if (PermissionMapping.CAN_REMOVE_FROM_FOLDER_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    if (PermissionMapping.CAN_REMOVE_FROM_FOLDER_FOLDER.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType));
    // Versioning Services
    if (PermissionMapping.CAN_CHECKOUT_DOCUMENT.equals(key))
      return BaseTypeId.CMIS_DOCUMENT.value().equals(baseType);
    if (PermissionMapping.CAN_CANCEL_CHECKOUT_DOCUMENT.equals(key))
      return BaseTypeId.CMIS_DOCUMENT.value().equals(baseType);
    if (PermissionMapping.CAN_CHECKIN_DOCUMENT.equals(key))
      return BaseTypeId.CMIS_DOCUMENT.value().equals(baseType);
    if (PermissionMapping.CAN_GET_ALL_VERSIONS_VERSION_SERIES.equals(key))
      return BaseTypeId.CMIS_DOCUMENT.value().equals(baseType);
    // Relationship Services
    if (PermissionMapping.CAN_GET_OBJECT_RELATIONSHIPS_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    // Policy Services
    if (PermissionMapping.CAN_ADD_POLICY_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
          || BaseTypeId.CMIS_RELATIONSHIP.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    if (PermissionMapping.CAN_ADD_POLICY_POLICY.equals(key))
      return BaseTypeId.CMIS_POLICY.value().equals(baseType);
    if (PermissionMapping.CAN_REMOVE_POLICY_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
          || BaseTypeId.CMIS_RELATIONSHIP.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    if (PermissionMapping.CAN_REMOVE_POLICY_POLICY.equals(key))
      return BaseTypeId.CMIS_POLICY.value().equals(baseType);
    if (PermissionMapping.CAN_GET_APPLIED_POLICIES_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
          || BaseTypeId.CMIS_RELATIONSHIP.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    // ACL Services
    if (PermissionMapping.CAN_GET_ACL_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
          || BaseTypeId.CMIS_RELATIONSHIP.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));
    if (PermissionMapping.CAN_APPLY_ACL_OBJECT.equals(key))
      return (BaseTypeId.CMIS_DOCUMENT.value().equals(baseType)
          || BaseTypeId.CMIS_FOLDER.value().equals(baseType)
          || BaseTypeId.CMIS_RELATIONSHIP.value().equals(baseType)
          || BaseTypeId.CMIS_POLICY.value().equals(baseType)
          || BaseTypeId.CMIS_ITEM.value().equals(baseType));

    return false;
  }
  /**
   * TODO In the future, enable different configuration for Read/Update/Delete.
   *
   * @param callContext
   * @param repositoryId TODO
   * @param key
   * @param relationship
   * @return
   */
  private Boolean checkRelationshipPermission(
      CallContext callContext, String repositoryId, String key, Relationship relationship) {
    Content source = contentService.getRelationship(repositoryId, relationship.getSourceId());
    Content target = contentService.getRelationship(repositoryId, relationship.getTargetId());

    if (source == null || target == null) {
      log.warn(
          "[objectId="
              + relationship.getId()
              + "]Source or target of this relationship is missing");
      return false;
    }

    // Read action when a relationship is specified directly
    if (PermissionMapping.CAN_GET_PROPERTIES_OBJECT.equals(key)) {
      boolean readSource =
          checkPermission(
              callContext,
              repositoryId,
              PermissionMapping.CAN_GET_OBJECT_RELATIONSHIPS_OBJECT,
              contentService.calculateAcl(repositoryId, source),
              source.getType(),
              source);
      boolean readTarget =
          checkPermission(
              callContext,
              repositoryId,
              PermissionMapping.CAN_GET_OBJECT_RELATIONSHIPS_OBJECT,
              contentService.calculateAcl(repositoryId, target),
              target.getType(),
              target);
      return readSource | readTarget;
    }

    // Update action
    if (PermissionMapping.CAN_UPDATE_PROPERTIES_OBJECT.equals(key)) {
      boolean updateSource =
          checkPermission(
              callContext,
              repositoryId,
              PermissionMapping.CAN_GET_OBJECT_RELATIONSHIPS_OBJECT,
              contentService.calculateAcl(repositoryId, source),
              source.getType(),
              source);
      boolean updateTarget =
          checkPermission(
              callContext,
              repositoryId,
              PermissionMapping.CAN_GET_OBJECT_RELATIONSHIPS_OBJECT,
              contentService.calculateAcl(repositoryId, target),
              target.getType(),
              target);
      return updateSource | updateTarget;
    }

    // Delete action
    if (PermissionMapping.CAN_DELETE_OBJECT.equals(key)) {
      boolean deleteSource =
          checkPermission(
              callContext,
              repositoryId,
              PermissionMapping.CAN_GET_OBJECT_RELATIONSHIPS_OBJECT,
              contentService.calculateAcl(repositoryId, source),
              source.getType(),
              source);
      boolean deleteTarget =
          checkPermission(
              callContext,
              repositoryId,
              PermissionMapping.CAN_GET_OBJECT_RELATIONSHIPS_OBJECT,
              contentService.calculateAcl(repositoryId, target),
              target.getType(),
              target);
      return deleteSource | deleteTarget;
    }

    return false;
  }