public ExternalAccessControlManager(
      NamespaceRegistry namespaceRegistry,
      ExternalSessionImpl session,
      ExternalDataSource dataSource) {

    this.session = session;
    this.workspaceName = session.getWorkspace().getName();
    this.aclReadOnly =
        dataSource instanceof ExternalDataSource.AccessControllable
            || dataSource instanceof ExternalDataSource.SupportPrivileges;
    this.writable = dataSource instanceof ExternalDataSource.Writable;
    this.supportPrivileges = dataSource instanceof ExternalDataSource.SupportPrivileges;
    this.rootUserName = JahiaUserManagerService.getInstance().getRootUserName();
    this.dataSource = dataSource;

    this.pathPermissionCache =
        Collections.synchronizedMap(
            new LRUMap(SettingsBean.getInstance().getAccessManagerPathPermissionCacheMaxSize()));
    this.jahiaPrincipal =
        new JahiaPrincipal(
            session.getUserID(),
            session.getRealm(),
            session.getUserID().startsWith(JahiaLoginModule.SYSTEM),
            JahiaLoginModule.GUEST.equals(session.getUserID()));
    try {
      registry = new JahiaPrivilegeRegistry(namespaceRegistry);
      this.modifyAccessControlPrivilege =
          registry.getPrivilege("jcr:modifyAccessControl", workspaceName);
      this.writePrivilege = registry.getPrivilege("jcr:write", workspaceName);
    } catch (RepositoryException e) {
      throw new JahiaRuntimeException(e);
    }
  }
 public boolean canManageNodeTypes(String path) throws RepositoryException {
   return hasPrivileges(
       path,
       new Privilege[] {
         registry.getPrivilege(
             JCR_NODE_TYPE_MANAGEMENT + "_" + session.getWorkspace().getName(), null)
       });
 }
 // JCR_REMOVE_NODE
 public void checkRemoveNode(String path) throws RepositoryException {
   if (!hasPrivileges(
       path,
       new Privilege[] {
         registry.getPrivilege(JCR_REMOVE_NODE + "_" + session.getWorkspace().getName(), null)
       })) {
     throw new AccessDeniedException(path);
   }
 }
 // JCR_ADD_CHILD_NODES
 public void checkAddChildNodes(String path) throws RepositoryException {
   if (!hasPrivileges(
       path,
       new Privilege[] {
         registry.getPrivilege(JCR_ADD_CHILD_NODES + "_" + session.getWorkspace().getName(), null)
       })) {
     throw new AccessDeniedException(path);
   }
 }
 public void checkRead(String path) throws RepositoryException {
   if (!hasPrivileges(
       path,
       new Privilege[] {
         registry.getPrivilege(JCR_READ + "_" + session.getWorkspace().getName(), null)
       })) {
     throw new PathNotFoundException(path);
   }
 }
 // JCR_MODIFY_PROPERTIES
 public void checkModify(String path) throws RepositoryException {
   if (!hasPrivileges(
       path,
       new Privilege[] {
         registry.getPrivilege(
             JCR_MODIFY_PROPERTIES + "_" + session.getWorkspace().getName(), null)
       })) {
     throw new AccessDeniedException(path);
   }
 }
  @Override
  public boolean hasPrivileges(final String absPath, final Privilege[] privileges)
      throws PathNotFoundException, RepositoryException {

    if (supportPrivileges) {
      // if the node is created in the same session, return true
      for (Item item : session.getNewItems()) {
        if (item.getPath().equals(absPath)) {
          return true;
        }
      }

      // check privilege names
      return hasPrivilegesLegacy(absPath, privileges);
    } else {
      // check ACLs
      Set<String> privs = new HashSet<>();
      for (Privilege privilege : privileges) {
        privs.add(privilege.getName());
      }
      String mountPoint = session.getRepository().getStoreProvider().getMountPoint();
      Session securitySession =
          JCRSessionFactory.getInstance()
              .getCurrentSystemSession(session.getWorkspace().getName(), null, null);
      PathWrapper pathWrapper =
          new ExternalPathWrapperImpl(
              StringUtils.equals(absPath, "/") ? mountPoint : mountPoint + absPath,
              securitySession);
      return AccessManagerUtils.isGranted(
          pathWrapper,
          privs,
          securitySession,
          jahiaPrincipal,
          workspaceName,
          false,
          pathPermissionCache,
          compiledAcls,
          registry);
    }
  }