Библиотека документов Liferay предназначена для хранения различных пользовательских файлов: документов, аудиозаписей, изображений и т.д. Она имеет привычную иерархическую структуру каталогов с настраиваемыми правами доступа для каждого каталога и файла в отдельности. Права доступа к ресурсу привязаны к роли пользователя.

Одна из известных проблем при работе с библиотекой документов заключается в том, что создаваемые подкаталоги не наследуют права доступа от родительского каталога. Вследствие этого права приходится выставлять вручную для каждого нового каталога. Это касается как создания каталогов через веб-интерфейс в разделе Site Administration - Documents and Media, так и их создания программным путём.
Для создания каталогов и файлов используются методы класса com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil
. Ниже приведён код простого портлета, создающего каталог с именем Test и его подкаталоги с заданным именем.
public class DLTestPortlet extends MVCPortlet {
public void addSubFolder(ActionRequest request, ActionResponse response) {
String name = ParamUtil.getString(request, "folderName");
ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
User usr = themeDisplay.getUser();
long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
ServiceContext serviceContext;
try {
serviceContext = ServiceContextFactory.getInstance(DLFolder.class.getName(), request);
Folder testFolder = checkOrCreateFolder("Test", parentFolderId, "", serviceContext);
checkOrCreateFolder(name, testFolder.getFolderId(), "", serviceContext);
SessionMessages.add(request, "subfolder-added");
} catch (Exception ex) {
SessionErrors.add(request, "subfolder-not-added");
System.out.println("ERROR: " + ex.getMessage());
}
SessionMessages.add(request, PortalUtil.getPortletId(request)
+ SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_ERROR_MESSAGE);
}
private Folder checkOrCreateFolder(String name, long parentFolderId, String folderDescription, ServiceContext sc) throws PortalException, SystemException {
Folder folder;
long userId = sc.getUserId();
long repositoryId = sc.getScopeGroupId();
try {
folder = DLAppLocalServiceUtil.getFolder(repositoryId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, name);
} catch (PortalException pe) {
folder = DLAppLocalServiceUtil.addFolder(userId, repositoryId, parentFolderId, name, folderDescription, sc);
}
return folder;
}
}
Создадим каталог Folder1.

Если всё прошло без ошибок, в разделе Documents and Media появится новый каталог с именем Test и вложенным в него каталогом Folder1. Права доступа у них одинаковые - доступ есть только у владельца.


Можно поменять права доступа на каталог Test и добавить в него ещё один подкаталог. Права доступа к новому подкаталогу останутся такими же, как у Folder1. То есть на них никак не влияют права каталога Test.
В API Liferay 6.2 нет возможности указать, что при создании нового каталога мы хотим по умолчанию назначать ему такие же права, как у его родителя. Поэтому копирование прав родительского каталога приходится делать вручную. Ниже приведён исправленный метод добавления подкаталога.
private Folder checkOrCreateFolder(String name, long parentFolderId, String folderDescription, ServiceContext sc) throws PortalException, SystemException {
Folder folder;
long userId = sc.getUserId();
long repositoryId = sc.getScopeGroupId();
try {
folder = DLAppLocalServiceUtil.getFolder(repositoryId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, name);
} catch (PortalException pe) {
folder = DLAppLocalServiceUtil.addFolder(userId, repositoryId, parentFolderId, name, folderDescription, sc);
List<ResourcePermission> permissionsList = ResourcePermissionLocalServiceUtil.getResourcePermissions(
folder.getCompanyId(), DLFolder.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
"" + parentFolderId);
for (ResourcePermission rp : permissionsList) {
ResourcePermissionLocalServiceUtil.addResourcePermissions(rp.getName(),
RoleLocalServiceUtil.getRole(rp.getRoleId()).getName(),
ResourceConstants.SCOPE_INDIVIDUAL,
rp.getActionIds());
}
}
return folder;
}
Теперь можно создать ещё один подкаталог каталога Test и убедиться, что изменённые права доступа были унаследованы.