diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/AssetFolderEntry.java b/ccm-cms/src/main/java/org/librecms/contentsection/AssetFolderEntry.java new file mode 100644 index 000000000..ac2609c15 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/contentsection/AssetFolderEntry.java @@ -0,0 +1,117 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.contentsection; + +import java.util.Date; +import java.util.Objects; + +/** + * + * @author Jens Pelzetter + */ +public class AssetFolderEntry { + + private long entryId; + + private String entryUuid; + + private String displayName; + + private boolean folder; + + public AssetFolderEntry() { + + } + + public AssetFolderEntry( + final long entryId, + final String entryUuid, + final String displayName, + final Date creationDate, + final Date lastModified, + final String version, + final boolean folder + ) { + this.entryId = entryId; + this.entryUuid = entryUuid; + this.displayName = displayName; + this.folder = folder; + } + + public long getEntryId() { + return entryId; + } + + public void setEntryId(final long entryId) { + this.entryId = entryId; + } + + public String getEntryUuid() { + return entryUuid; + } + + public void setEntryUuid(final String entryUuid) { + this.entryUuid = entryUuid; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(final String displayName) { + this.displayName = displayName; + } + + public boolean isFolder() { + return folder; + } + + public void setFolder(final boolean folder) { + this.folder = folder; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 29 * hash + (int) (entryId ^ (entryId >>> 32)); + hash = 29 * hash + Objects.hashCode(entryUuid); + hash = 29 * hash + Objects.hashCode(displayName); + hash = 29 * hash + (folder ? 1 : 0); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof AssetFolderEntry)) { + return false; + } + final AssetFolderEntry other = (AssetFolderEntry) obj; + if (!other.canEqual(this)) { + return false; + } + if (entryId != other.getEntryId()) { + return false; + } + if (folder != other.isFolder()) { + return false; + } + if (!Objects.equals(entryUuid, other.getEntryUuid())) { + return false; + } + return Objects.equals(displayName, other.getDisplayName()); + } + + public boolean canEqual(final Object obj) { + return obj instanceof AssetFolderEntry; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/DocumentFolderEntry.java b/ccm-cms/src/main/java/org/librecms/contentsection/DocumentFolderEntry.java index b74b073bb..b70b7929c 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/DocumentFolderEntry.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/DocumentFolderEntry.java @@ -87,19 +87,19 @@ public class DocumentFolderEntry { } public Date getCreationDate() { - return creationDate; + return new Date(creationDate.getTime()); } public void setCreationDate(final Date creationDate) { - this.creationDate = creationDate; + this.creationDate = new Date(creationDate.getTime()); } public Date getLastModified() { - return lastModified; + return new Date(lastModified.getTime()); } public void setLastModified(final Date lastModified) { - this.lastModified = lastModified; + this.lastModified = new Date(lastModified.getTime()); } public String getVersion() { @@ -156,13 +156,13 @@ public class DocumentFolderEntry { if (!Objects.equals(entryUuid, other.getEntryUuid())) { return false; } + if (!Objects.equals(itemClass, other.getItemClass())) { + return false; + } if (!Objects.equals(displayName, other.getDisplayName())) { return false; } - if (version != other.getVersion()) { - return false; - } - return true; + return Objects.equals(version, other.getVersion()); } public boolean canEqual(final Object obj) { diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java b/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java index ce1b73b62..f8a60ac45 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java @@ -26,7 +26,6 @@ import javax.persistence.Table; import org.libreccm.categorization.Category; import java.io.Serializable; -import java.time.LocalDate; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -124,6 +123,61 @@ import static org.librecms.CmsConstants.*; ) }) @NamedNativeQueries({ + @NamedNativeQuery( + name = "Folder.countAssetFolderEntries", + query = "SELECT (" + + "(" + + "SELECT COUNT(*) " + + "FROM ccm_core.ccm_objects " + + "JOIN ccm_cms.assets " + + "ON ccm_objects.object_id = assets.object_id " + + "JOIN ccm_core.categorizations " + + " ON ccm_objects.object_id " + + " = categorizations.object_id " + + "WHERE categorizations.category_id = :folderId " + + ") " + + "+ " + + "(" + + "SELECT COUNT(*) " + + "FROM ccm_core.categories " + + "JOIN ccm_core.ccm_objects " + + " ON categories.object_id = ccm_objects.object_id " + + "JOIN ccm_cms.folders " + + " ON categories.object_id = folders.object_id " + + "WHERE categories.parent_category_id = :folderId " + + "AND folders.type = 'ASSETS_FOLDER'" + + ") " + + ") AS entries_count", + resultSetMapping = "Folder.countAssetFolderEntries" + ), + @NamedNativeQuery( + name = "Folder.getAssetFolderEntries", + query = "SELECT ccm_objects.object_id AS entry_id, " + + " ccm_objects.uuid AS entry_uuid, " + + " ccm_objects.display_name AS display_name, " + + " false AS is_folder " + + "FROM ccm_cms.assets " + + "JOIN ccm_core.ccm_objects " + + " ON ccm_cms.assets.object_id " + + " = ccm_core.ccm_objects.object_id " + + "JOIN ccm_core.categorizations " + + " ON ccm_objects.object_id " + + " = ccm_core.categorizations.object_id " + + "WHERE categorizations.category_id = :folderId " + + "UNION " + + "SELECT categories.object_id AS entry_id, " + + " ccm_objects.uuid AS entry_uuid, " + + " categories.\"name\" AS display_name, " + + " true as is_folder " + + "FROM ccm_core.categories " + + "JOIN ccm_core.ccm_objects " + + " ON categories.object_id = ccm_objects.object_id " + + "JOIN ccm_cms.folders " + + " ON categories.object_id = folders.object_id " + + "WHERE categories.parent_category_id = :folderId " + + "AND folders.\"type\" = 'ASSETS_FOLDER'", + resultSetMapping = "Folder.DocumentFolderEntry" + ), @NamedNativeQuery( name = "Folder.countDocumentFolderEntries", query = "SELECT (" @@ -201,6 +255,26 @@ import static org.librecms.CmsConstants.*; @ColumnResult(name = "entries_count", type = long.class) } ), + @SqlResultSetMapping( + name = "Folder.countAssetFolderEntries", + columns = { + @ColumnResult(name = "entries_count", type = long.class) + } + ), + @SqlResultSetMapping( + name = "Folder.getAssetFolderEntries", + classes = { + @ConstructorResult( + columns = { + @ColumnResult(name = "entry_id", type = long.class), + @ColumnResult(name = "entry_uuid"), + @ColumnResult(name = "display_name"), + @ColumnResult(name = "is_folder", type = boolean.class) + }, + targetClass = AssetFolderEntry.class + ) + } + ), @SqlResultSetMapping( name = "Folder.DocumentFolderEntry", classes = { @@ -216,28 +290,8 @@ import static org.librecms.CmsConstants.*; @ColumnResult(name = "is_folder", type = boolean.class) }, targetClass = DocumentFolderEntry.class - ),} - // entities = { - // @EntityResult( - // entityClass = DocumentFolderEntry.class, - // fields = { - // @FieldResult(column = "entry_id", name = "entryId"), - // @FieldResult(column = "entry_uuid", name = "entryUuid"), - // @FieldResult(column = "display_name", name = "displayName"), - // @FieldResult(column = "item_class", name = "itemClass"), - // @FieldResult( - // column = "creation_date", - // name = "creation_date" - // ), - // @FieldResult( - // column = "last_modified", - // name = "lastModified" - // ), - // @FieldResult(column = "version", name = "version"), - // @FieldResult(column = "is_folder", name = "folder") - // } - // ) - // } + ) + } ) }) public class Folder extends Category implements Serializable { @@ -245,7 +299,6 @@ public class Folder extends Category implements Serializable { private static final long serialVersionUID = 1L; @OneToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "CONTENT_SECTION_ID") @JoinTable(name = "FOLDER_CONTENT_SECTION_MAP", schema = DB_SCHEMA, inverseJoinColumns = { @JoinColumn(name = "CONTENT_SECTION_ID")}, @@ -291,14 +344,6 @@ public class Folder extends Category implements Serializable { .collect(Collectors.toList())); } -// public Folder getParentFolder() { -// final Category parent = getParentCategory(); -// if (parent == null) { -// return null; -// } else { -// return (Folder) getParentCategory(); -// } -// } @Override public int hashCode() { int hash = super.hashCode(); @@ -330,9 +375,13 @@ public class Folder extends Category implements Serializable { @Override public String toString(final String data) { - return super.toString(String.format(", type = %s%s", - type, - data)); + return super.toString( + String.format( + ", type = %s%s", + type, + data + ) + ); } } diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/FolderRepository.java b/ccm-cms/src/main/java/org/librecms/contentsection/FolderRepository.java index ab3e8e5a2..d06182548 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/FolderRepository.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/FolderRepository.java @@ -306,6 +306,35 @@ public class FolderRepository extends AbstractEntityRepository { ).getSingleResult(); } + public List getAssetFolderEntries( + final Folder folder, + final int firstResult, + final int maxResults, + final String term + ) { + return getEntityManager() + .createNamedQuery( + "Folder.getAssetFolderEntries", AssetFolderEntry.class + ) + .setParameter( + "folderId", Objects.requireNonNull(folder).getObjectId() + ) + .setFirstResult(firstResult) + .setMaxResults(maxResults) + .getResultList(); + } + + public long countAssetFolderEntries( + final Folder folder, + final String term + ) { + return getEntityManager() + .createNamedQuery("Folder.countAssetFolderEntries", Long.class) + .setParameter( + "folderId", Objects.requireNonNull(folder).getObjectId() + ).getSingleResult(); + } + public long countObjectsInFolder(final Folder folder) { return countObjectsInFolder(folder, ""); } diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/privileges/ItemPrivileges.java b/ccm-cms/src/main/java/org/librecms/contentsection/privileges/ItemPrivileges.java index 0ccb4b645..621db34d4 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/privileges/ItemPrivileges.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/privileges/ItemPrivileges.java @@ -24,9 +24,6 @@ import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.Folder; import org.librecms.contentsection.rs.ContentItems; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; /** * Constants for privileges allowing actions on the items of a content section. diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/AbstractCurrentUserPermissions.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AbstractCurrentUserPermissions.java new file mode 100644 index 000000000..d3b5dd888 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AbstractCurrentUserPermissions.java @@ -0,0 +1,50 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.libreccm.security.PermissionChecker; +import org.libreccm.security.PermissionManager; +import org.librecms.contentsection.Folder; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +/** + * + * @author Jens Pelzetter + */ +abstract class AbstractCurrentUserPermissions { + + @Inject + private PermissionChecker permissionChecker; + + @Inject + private PermissionManager permissionManager; + + public List buildCurrentUserPermissions( + final Folder folder + ) { + return permissionManager + .listDefiniedPrivileges(getPrivilegesClass()) + .stream() + .map(privilege -> buildCurrentUserPermission(folder, privilege)) + .collect(Collectors.toList()); + } + + protected abstract Class getPrivilegesClass(); + + private GrantedPrivilegeModel buildCurrentUserPermission( + final Folder folder, final String privilege + ) { + final GrantedPrivilegeModel model = new GrantedPrivilegeModel(); + model.setPrivilege(privilege); + model.setGranted(permissionChecker.isPermitted(privilege, folder)); + return model; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/AbstractFolderTree.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AbstractFolderTree.java new file mode 100644 index 000000000..a1c1d2ebb --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AbstractFolderTree.java @@ -0,0 +1,100 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.Folder; +import org.librecms.contentsection.FolderManager; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +abstract class AbstractFolderTree, P extends PermissionsModel> { + + @Inject + private FolderManager folderManager; + + @Transactional(Transactional.TxType.REQUIRED) + public List buildFolderTree( + final ContentSection section, final Folder currentFolder + ) { + final Folder root = getRootFolder(section); + final String currentFolderPath = folderManager + .getFolderPath(currentFolder) + .substring( + folderManager + .getFolderPath(section.getRootDocumentsFolder()) + .length() - 1 + ); + + return root + .getSubFolders() + .stream() + .sorted(this::compareFolders) + .map( + folder -> buildFolderTreeNode( + section, currentFolderPath, folder + ) + ).collect(Collectors.toList()); + } + + protected abstract T newFolderTreeNode(); + + @Transactional(Transactional.TxType.REQUIRED) + protected abstract Folder getRootFolder(final ContentSection section); + + @Transactional(Transactional.TxType.REQUIRED) + protected abstract P buildPermissionsModel(final Folder folder); + + private T buildFolderTreeNode( + final ContentSection section, + final String currentFolderPath, + final Folder folder + ) { + final String folderPath = folderManager + .getFolderPath(folder) + .substring( + folderManager + .getFolderPath(section.getRootDocumentsFolder()) + .length() - 1 + ); + final T node = newFolderTreeNode(); + node.setFolderId(folder.getObjectId()); + node.setUuid(folder.getUuid()); + node.setName(folder.getName()); + node.setPath(folderPath); + node.setOpen(currentFolderPath.startsWith(folderPath)); + node.setSelected(currentFolderPath.equals(folderPath)); + node.setPermissions(buildPermissionsModel(folder)); + + node.setSubFolders( + folder + .getSubFolders() + .stream() + .sorted(this::compareFolders) + .map( + subFolder -> buildFolderTreeNode( + section, currentFolderPath, subFolder + ) + ) + .collect(Collectors.toList()) + ); + + return node; + } + + private int compareFolders(final Folder folder1, final Folder folder2) { + return folder1.getName().compareTo(folder2.getName()); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/AbstractGrantedPrivileges.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AbstractGrantedPrivileges.java new file mode 100644 index 000000000..3e732d4bc --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AbstractGrantedPrivileges.java @@ -0,0 +1,95 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.libreccm.security.Permission; +import org.libreccm.security.PermissionChecker; +import org.libreccm.security.PermissionManager; +import org.libreccm.security.Role; +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.Folder; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +/** + * + * @author Jens Pelzetter + */ +abstract class AbstractGrantedPrivileges { + + @Inject + private PermissionChecker permissionChecker; + + @Inject + private PermissionManager permissionManager; + + public List buildPermissionsMatrix( + final ContentSection section, final Folder folder + ) { + return section + .getRoles() + .stream() + .map(role -> buildPrivilegesGrantedToRoleModel(role, folder)) + .collect(Collectors.toList()); + } + + private PrivilegesGrantedToRoleModel buildPrivilegesGrantedToRoleModel( + final Role role, final Folder folder + ) { + final List grantedPrivilges = permissionManager + .listDefiniedPrivileges(getPrivilegesClass()) + .stream() + .map( + privilege -> buildGrantedPrivilegeModel( + role, + folder, + privilege, + permissionManager.findPermissionsForRoleAndObject( + role, folder + ) + ) + ) + .collect(Collectors.toList()); + + final PrivilegesGrantedToRoleModel model + = new PrivilegesGrantedToRoleModel(); + model.setGrantedPrivileges(grantedPrivilges); + model.setGrantee(role.getName()); + + return model; + } + + private GrantedPrivilegeModel buildGrantedPrivilegeModel( + final Role role, + final Folder folder, + final String privilege, + final List permissions + ) { + final GrantedPrivilegeModel model = new GrantedPrivilegeModel(); + model.setGranted(permissionChecker.isPermitted(privilege, folder, role)); + model.setInherited( + model.isGranted() + && permissions + .stream() + .anyMatch( + permission + -> permission.getGrantee().equals(role) + && permission.getGrantedPrivilege().equals(privilege) + && permission.getObject().equals(folder) + && permission.getInheritedFrom() != null + ) + ); + model.setPrivilege(privilege); + + return model; + } + + protected abstract Class getPrivilegesClass(); + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderController.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderController.java new file mode 100644 index 000000000..35bded472 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderController.java @@ -0,0 +1,580 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.l10n.GlobalizationHelper; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.PermissionChecker; +import org.libreccm.security.PermissionManager; +import org.libreccm.security.Role; +import org.libreccm.security.RoleRepository; +import org.librecms.contentsection.Asset; +import org.librecms.contentsection.AssetFolderEntry; +import org.librecms.contentsection.AssetManager; +import org.librecms.contentsection.AssetRepository; +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.ContentSectionRepository; +import org.librecms.contentsection.Folder; +import org.librecms.contentsection.FolderManager; +import org.librecms.contentsection.FolderRepository; +import org.librecms.contentsection.FolderType; +import org.librecms.contentsection.privileges.AssetPrivileges; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.transaction.Transactional; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Controller +@Path("/{sectionIdentifier}/assetfolders") +public class AssetFolderController { + + @Inject + private AssetFolderModel assetFolderModel; + + @Inject + private AssetFolderTree assetFolderTree; + + @Inject + private AssetPermissions assetPermissions; + + @Inject + private AssetManager assetManager; + + @Inject + private AssetRepository assetRepo; + + @Inject + private ContentSectionModel contentSectionModel; + + @Inject + private ContentSectionRepository sectionRepo; + + @Inject + private CurrentUserAssetPermissions currentUserPermissions; + + @Inject + private FolderManager folderManager; + + @Inject + private FolderRepository folderRepo; + + @Inject + private GlobalizationHelper globalizationHelper; + + @Inject + private GrantedAssetPrivileges grantedPrivileges; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private Models models; + + @Inject + private PermissionChecker permissionChecker; + + @Inject + private PermissionManager permissionManager; + + @Inject + private RoleRepository roleRepo; + + private static final Logger LOGGER = LogManager.getLogger( + AssetFolderController.class + ); + + @GET + @Path("/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String list( + @PathParam("sectionIdentifier") final String sectionIdentifier, + @QueryParam("filterTerm") @DefaultValue("") final String filterTerm, + @QueryParam("firstResult") @DefaultValue("0") final int firstResult, + @QueryParam("maxResults") @DefaultValue("20") final int maxResults + ) { + return list( + sectionIdentifier, "", filterTerm, firstResult, maxResults + ); + } + + @GET + @Path("/{folderPath:(.+)?}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String list( + @PathParam("sectionIdentifier") final String sectionIdentifier, + @PathParam("folderPath") final String folderPath, + @QueryParam("filterTerm") @DefaultValue("") final String filterTerm, + @QueryParam("firstResult") @DefaultValue("0") final int firstResult, + @QueryParam("maxResults") @DefaultValue("20") final int maxResults + ) { + final Optional sectionResult = retrieveContentSection( + sectionIdentifier + ); + + if (!sectionResult.isPresent()) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/contentsection-not-found.xhtml"; + } + + final ContentSection section = sectionResult.get(); + if (!permissionChecker.isPermitted( + AssetPrivileges.EDIT, section.getRootAssetsFolder() + )) { + models.put("sectionidentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + contentSectionModel.setSection(section); + + final Folder folder; + if (folderPath.isEmpty()) { + folder = section.getRootAssetsFolder(); + assetFolderModel.setBreadcrumbs(Collections.emptyList()); + } else { + final Optional folderResult = folderRepo + .findByPath( + section, + folderPath, + FolderType.ASSETS_FOLDER + ); + if (folderResult.isPresent()) { + folder = folderResult.get(); + + assetFolderModel.setBreadcrumbs(buildBreadcrumbs(folderPath)); + } else { + models.put("contentSection", section.getLabel()); + models.put("folderPath", folderPath); + return "org/librecms/ui/contentsection/assetfolder/asssetfolder-not-found.xhtml"; + } + } + + if (!permissionChecker.isPermitted(AssetPrivileges.EDIT, folder)) { + models.put("sectionidentifier", sectionIdentifier); + models.put("folderPath", folderPath); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + final List folderEntries = folderRepo + .getAssetFolderEntries(folder, firstResult, maxResults, filterTerm); + assetFolderModel.setCount( + folderRepo.countAssetFolderEntries(folder, filterTerm) + ); + assetFolderModel.setFirstResult(firstResult); + assetFolderModel.setMaxResults(maxResults); + + contentSectionModel.setAssetFolders( + assetFolderTree.buildFolderTree(section, folder) + ); + + assetFolderModel.setRows( + folderEntries + .stream() + .map(entry -> buildRowModel(section, entry)) + .collect(Collectors.toList()) + ); + + assetFolderModel.setPath(folderPath); + assetFolderModel.setCanCreateSubFolders( + permissionChecker.isPermitted(AssetPrivileges.CREATE_NEW, folder) + ); + assetFolderModel.setCanCreateAssets( + permissionChecker.isPermitted(AssetPrivileges.CREATE_NEW, folder) + ); + assetFolderModel.setGrantedPermissions( + grantedPrivileges.buildPermissionsMatrix(section, folder) + ); + assetFolderModel.setPrivileges( + permissionManager.listDefiniedPrivileges(AssetPrivileges.class) + ); + assetFolderModel.setCurrentUserPermissions( + currentUserPermissions.buildCurrentUserPermissions(folder) + ); + + return "org/librecms/ui/contentsection/assetfolder/assetfolder.xhtml"; + } + + @POST + @Path("/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String newSubFolder( + @PathParam("sectionIdentifier") final String sectionIdentifier, + @FormParam("folderName") final String folderName + ) { + return newSubFolder( + sectionIdentifier, "", folderName + ); + } + + @POST + @Path("/{parentFolderPath:(.+)?}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String newSubFolder( + @PathParam("sectionIdentifier") final String sectionIdentifier, + @PathParam("parentFolderPath") final String parentFolderPath, + @FormParam("folderName") final String folderName + ) { + final Optional sectionResult = retrieveContentSection( + sectionIdentifier + ); + + if (!sectionResult.isPresent()) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/contentsection-not-found.xhtml"; + } + + final ContentSection section = sectionResult.get(); + if (!permissionChecker.isPermitted( + AssetPrivileges.EDIT, section.getRootAssetsFolder() + )) { + models.put("sectionidentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + final Folder parentFolder; + if (parentFolderPath.isEmpty()) { + parentFolder = section.getRootAssetsFolder(); + } else { + final Optional parentFolderResult = folderRepo + .findByPath( + section, + parentFolderPath, + FolderType.ASSETS_FOLDER + ); + if (parentFolderResult.isPresent()) { + parentFolder = parentFolderResult.get(); + } else { + models.put("contentSection", section.getLabel()); + models.put("folderPath", parentFolderPath); + return "org/librecms/ui/contentsection/assetfolder/assetfolder-not-found.xhtml"; + } + } + + if (!permissionChecker.isPermitted( + AssetPrivileges.CREATE_NEW, parentFolder + )) { + models.put("sectionidentifier", sectionIdentifier); + models.put("folderPath", parentFolderPath); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + folderManager.createFolder(folderName, parentFolder); + + return String.format( + "redirect:/%s/assetfolders/%s", + sectionIdentifier, + parentFolderPath + ); + } + + @POST + @Path("/@permissions/{role}/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String updatePermissions( + @PathParam("sectionIdentifier") final String sectionIdentifier, + @PathParam("role") final String roleParam, + @FormParam("permissions") final List permissions + ) { + return updatePermissions( + sectionIdentifier, "", roleParam, permissions + ); + } + + @POST + @Path("/@permissions/{role}/{folderPath:(.+)?}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String updatePermissions( + @PathParam("sectionIdentifier") final String sectionIdentifier, + @PathParam("folderPath") final String folderPath, + @PathParam("role") final String roleParam, + @FormParam("permissions") final List permissions + ) { + final Optional sectionResult = retrieveContentSection( + sectionIdentifier + ); + if (!sectionResult.isPresent()) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/contentsection-not-found.xhtml"; + } + + final ContentSection section = sectionResult.get(); + if (!permissionChecker.isPermitted( + AssetPrivileges.EDIT, section.getRootAssetsFolder() + )) { + models.put("sectionidentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + final Folder folder; + if (folderPath.isEmpty()) { + folder = section.getRootAssetsFolder(); + assetFolderModel.setBreadcrumbs(Collections.emptyList()); + } else { + final Optional folderResult = folderRepo + .findByPath( + section, + folderPath, + FolderType.ASSETS_FOLDER + ); + if (folderResult.isPresent()) { + folder = folderResult.get(); + + assetFolderModel.setBreadcrumbs(buildBreadcrumbs(folderPath)); + } else { + models.put("contentSection", section.getLabel()); + models.put("folderPath", folderPath); + return "org/librecms/ui/contentsection/assestfolder/assetfolder-not-found.xhtml"; + } + } + + if (!permissionChecker.isPermitted(AssetPrivileges.EDIT, folder)) { + models.put("sectionidentifier", sectionIdentifier); + models.put("folderPath", folderPath); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + final Optional roleResult = roleRepo.findByName(roleParam); + if (!roleResult.isPresent()) { + models.put("role", roleParam); + } + final Role role = roleResult.get(); + + final List privileges = permissionManager + .listDefiniedPrivileges(AssetPrivileges.class); + + privileges + .stream() + .filter(privilege -> permissions.contains(privilege)) + .forEach( + privilege -> permissionManager.grantPrivilege( + privilege, role, folder + ) + ); + privileges + .stream() + .filter(privilege -> !permissions.contains(privilege)) + .forEach( + privilege -> permissionManager.revokePrivilege( + privilege, role, folder + ) + ); + + return String.format( + "redirect:/%s/assetfolders/%s", + sectionIdentifier, + folderPath + ); + } + + @POST + @Path("/@rename/{folderPath:(.+)?}") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String renameFolder( + @PathParam("sectionIdentifier") final String sectionIdentifier, + @PathParam("folderPath") final String folderPath, + @FormParam("folderName") final String folderName + ) { + final Optional sectionResult = retrieveContentSection( + sectionIdentifier + ); + if (!sectionResult.isPresent()) { + models.put("sectionIdentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/contentsection-not-found.xhtml"; + } + + final ContentSection section = sectionResult.get(); + if (!permissionChecker.isPermitted( + AssetPrivileges.EDIT, section.getRootAssetsFolder() + )) { + models.put("sectionidentifier", sectionIdentifier); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + final Folder folder; + final Optional folderResult = folderRepo + .findByPath( + section, + folderPath, + FolderType.ASSETS_FOLDER + ); + if (folderResult.isPresent()) { + folder = folderResult.get(); + + assetFolderModel.setBreadcrumbs(buildBreadcrumbs(folderPath)); + } else { + models.put("contentSection", section.getLabel()); + models.put("folderPath", folderPath); + return "org/librecms/ui/contentsection/assetfolder/assetfolder-not-found.xhtml"; + } + + if (!permissionChecker.isPermitted(AssetPrivileges.EDIT, folder)) { + models.put("sectionidentifier", sectionIdentifier); + models.put("folderPath", folderPath); + return "org/librecms/ui/contentsection/access-denied.xhtml"; + } + + folder.setName(folderName); + folderRepo.save(folder); + + final String[] folderPathTokens = folderPath.split("/"); + final String returnFolderPath = String.join( + "/", + Arrays.copyOf(folderPathTokens, folderPathTokens.length - 1) + ); + + return String.format( + "redirect:/%s/assetfolders/%s", + sectionIdentifier, + returnFolderPath + ); + } + + private Optional retrieveContentSection( + final String sectionIdentifier + ) { + final Identifier identifier = identifierParser.parseIdentifier( + sectionIdentifier + ); + + final Optional sectionResult; + switch (identifier.getType()) { + case ID: + sectionResult = sectionRepo.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + sectionResult = sectionRepo.findByUuid(identifier + .getIdentifier()); + break; + default: + sectionResult = sectionRepo.findByLabel(identifier + .getIdentifier()); + break; + } + return sectionResult; + } + + private List buildBreadcrumbs( + final String folderPath + ) { + final List breadcrumbs + = new ArrayList<>(); + final List tokens = Arrays + .stream(folderPath.split("/")) + .filter(token -> !token.isEmpty()) + .collect(Collectors.toList()); + for (final String token : tokens) { + final String path = breadcrumbs + .stream() + .map(FolderBreadcrumbsModel::getPathToken) + .collect(Collectors.joining("/")); + final FolderBreadcrumbsModel breadcrumb + = new FolderBreadcrumbsModel(); + breadcrumb.setPath(path); + breadcrumb.setPathToken(token); + breadcrumbs.add(breadcrumb); + } + breadcrumbs + .get(breadcrumbs.size() - 1) + .setCurrentFolder(true); + return breadcrumbs; + } + + private AssetFolderRowModel buildRowModel( + final ContentSection section, final AssetFolderEntry entry + ) { + Objects.requireNonNull(section); + Objects.requireNonNull(entry); + + final AssetFolderRowModel row = new AssetFolderRowModel(); + if (entry.isFolder()) { + final Folder folder = folderRepo + .findById(entry.getEntryId()) + .get(); + row.setDeletable( + folderManager.folderIsDeletable(folder) + == FolderManager.FolderIsDeletable.YES + ); + row.setFolder(true); + row.setFolderPath( + folderManager + .getFolderPath(folder) + .substring( + folderManager + .getFolderPath(section.getRootAssetsFolder()) + .length() + ) + ); + row.setName(entry.getDisplayName()); + row.setTitle( + globalizationHelper.getValueFromLocalizedString( + folder.getTitle() + ) + ); + row.setType( + globalizationHelper.getLocalizedTextsUtil( + "org.librecms.CmsAdminMessages" + ).getText("contentsection.assetfolder.types.folder") + ); + row.setPermissions( + assetPermissions.buildAssetPermissionsModel(folder) + ); + } else { + final Asset asset = assetRepo + .findById(entry.getEntryId()) + .get(); + row.setDeletable(!assetManager.isAssetInUse(asset)); + row.setFolder(false); + row.setName(entry.getDisplayName()); + row.setNoneCmsObject(false); + row.setTitle( + globalizationHelper.getValueFromLocalizedString( + asset.getTitle() + ) + ); + row.setType(asset.getClass().getName()); + row.setPermissions( + assetPermissions.buildAssetPermissionsModel(asset) + ); + } + + return row; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderModel.java new file mode 100644 index 000000000..17b7b2cf6 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderModel.java @@ -0,0 +1,139 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("AssetFolderModel") +public class AssetFolderModel { + + private long count; + + private int firstResult; + + private int maxResults; + + private List rows; + + private List breadcrumbs; + + private String path; + + private boolean canCreateSubFolders; + + private boolean canCreateAssets; + + private List currentUserPermissions; + + private List grantedPermissions; + + private List privileges; + + public long getCount() { + return count; + } + + public void setCount(final long count) { + this.count = count; + } + + public int getFirstResult() { + return firstResult; + } + + public void setFirstResult(final int firstResult) { + this.firstResult = firstResult; + } + + public int getMaxResults() { + return maxResults; + } + + public void setMaxResults(final int maxResults) { + this.maxResults = maxResults; + } + + public List getRows() { + return Collections.unmodifiableList(rows); + } + + public void setRows(final List rows) { + this.rows = new ArrayList<>(rows); + } + + public List getBreadcrumbs() { + return Collections.unmodifiableList(breadcrumbs); + } + + public void setBreadcrumbs( + final List breadcrumbs + ) { + this.breadcrumbs = new ArrayList<>(breadcrumbs); + } + + public String getPath() { + return path; + } + + public void setPath(final String path) { + this.path = path; + } + + public boolean isCanCreateSubFolders() { + return canCreateSubFolders; + } + + public void setCanCreateSubFolders(final boolean canCreateSubFolders) { + this.canCreateSubFolders = canCreateSubFolders; + } + + public boolean isCanCreateAssets() { + return canCreateAssets; + } + + public void setCanCreateAssets(final boolean canCreateAssets) { + this.canCreateAssets = canCreateAssets; + } + + public List getCurrentUserPermissions() { + return Collections.unmodifiableList(currentUserPermissions); + } + + public void setCurrentUserPermissions( + final List currentUserPermissions + ) { + this.currentUserPermissions = new ArrayList<>(currentUserPermissions); + } + + public List getGrantedPermissions() { + return Collections.unmodifiableList(grantedPermissions); + } + + public void setGrantedPermissions( + final List grantedPermissions + ) { + this.grantedPermissions = new ArrayList<>(grantedPermissions); + } + + public List getPrivileges() { + return Collections.unmodifiableList(privileges); + } + + public void setPrivileges(final List privileges) { + this.privileges = new ArrayList<>(privileges); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderRowModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderRowModel.java new file mode 100644 index 000000000..b87481308 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderRowModel.java @@ -0,0 +1,94 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +/** + * + * @author Jens Pelzetter + */ +public class AssetFolderRowModel { + + private boolean deletable; + + private boolean folder; + + private String folderPath; + + private String name; + + private boolean noneCmsObject; + + private String title; + + private String type; + + private AssetPermissionsModel permissions; + + public boolean isDeletable() { + return deletable; + } + + public void setDeletable(final boolean deletable) { + this.deletable = deletable; + } + + public boolean isFolder() { + return folder; + } + + public void setFolder(final boolean folder) { + this.folder = folder; + } + + public String getFolderPath() { + return folderPath; + } + + public void setFolderPath(final String folderPath) { + this.folderPath = folderPath; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public boolean isNoneCmsObject() { + return noneCmsObject; + } + + public void setNoneCmsObject(final boolean noneCmsObject) { + this.noneCmsObject = noneCmsObject; + } + + public String getTitle() { + return title; + } + + public void setTitle(final String title) { + this.title = title; + } + + public String getType() { + return type; + } + + public void setType(final String type) { + this.type = type; + } + + public AssetPermissionsModel getPermissions() { + return permissions; + } + + public void setPermissions(final AssetPermissionsModel permissions) { + this.permissions = permissions; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderTree.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderTree.java new file mode 100644 index 000000000..2c35cb49d --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderTree.java @@ -0,0 +1,40 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.Folder; + +import javax.enterprise.context.Dependent; +import javax.inject.Inject; + +/** + * + * @author Jens Pelzetter + */ +@Dependent +public class AssetFolderTree + extends AbstractFolderTree { + + @Inject + private AssetPermissions assetPermissions; + + @Override + public AssetFolderTreeNode newFolderTreeNode() { + return new AssetFolderTreeNode(); + } + + @Override + public Folder getRootFolder(final ContentSection section) { + return section.getRootAssetsFolder(); + } + + @Override + public AssetPermissionsModel buildPermissionsModel(final Folder folder) { + return assetPermissions.buildAssetPermissionsModel(folder); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderTreeNode.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderTreeNode.java new file mode 100644 index 000000000..3ccbcd059 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetFolderTreeNode.java @@ -0,0 +1,15 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +/** + * + * @author Jens Pelzetter + */ +public class AssetFolderTreeNode + extends FolderTreeNode { + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetPermissions.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetPermissions.java new file mode 100644 index 000000000..fac5243e8 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetPermissions.java @@ -0,0 +1,72 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.libreccm.security.PermissionChecker; +import org.librecms.contentsection.Asset; +import org.librecms.contentsection.Folder; +import org.librecms.contentsection.privileges.AssetPrivileges; + +import javax.enterprise.context.Dependent; +import javax.inject.Inject; + +/** + * + * @author Jens Pelzetter + */ +@Dependent +class AssetPermissions { + + @Inject + private PermissionChecker permissionChecker; + + public AssetPermissionsModel buildAssetPermissionsModel( + final Folder folder + ) { + final AssetPermissionsModel model = new AssetPermissionsModel(); + model.setGrantedCreateNew( + permissionChecker.isPermitted(AssetPrivileges.CREATE_NEW, folder) + ); + model.setGrantedDelete( + permissionChecker.isPermitted(AssetPrivileges.DELETE, folder) + ); + model.setGrantedEdit( + permissionChecker.isPermitted(AssetPrivileges.EDIT, folder) + ); + model.setGrantedUse( + permissionChecker.isPermitted(AssetPrivileges.USE, folder) + ); + model.setGrantedView( + permissionChecker.isPermitted(AssetPrivileges.VIEW, folder) + ); + + return model; + } + + public AssetPermissionsModel buildAssetPermissionsModel( + final Asset asset + ) { + final AssetPermissionsModel model = new AssetPermissionsModel(); + model.setGrantedCreateNew( + permissionChecker.isPermitted(AssetPrivileges.CREATE_NEW, asset) + ); + model.setGrantedDelete( + permissionChecker.isPermitted(AssetPrivileges.DELETE, asset) + ); + model.setGrantedEdit( + permissionChecker.isPermitted(AssetPrivileges.EDIT, asset) + ); + model.setGrantedUse( + permissionChecker.isPermitted(AssetPrivileges.USE, asset) + ); + model.setGrantedView( + permissionChecker.isPermitted(AssetPrivileges.VIEW, asset) + ); + + return model; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetPermissionsModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetPermissionsModel.java new file mode 100644 index 000000000..5cb33fcef --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/AssetPermissionsModel.java @@ -0,0 +1,64 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +/** + * + * @author Jens Pelzetter + */ +public class AssetPermissionsModel implements PermissionsModel { + + private boolean grantedCreateNew; + + private boolean grantedDelete; + + private boolean grantedUse; + + private boolean grantedEdit; + + private boolean grantedView; + + public boolean isGrantedCreateNew() { + return grantedCreateNew; + } + + public void setGrantedCreateNew(final boolean grantedCreateNew) { + this.grantedCreateNew = grantedCreateNew; + } + + public boolean isGrantedDelete() { + return grantedDelete; + } + + public void setGrantedDelete(final boolean grantedDelete) { + this.grantedDelete = grantedDelete; + } + + public boolean isGrantedUse() { + return grantedUse; + } + + public void setGrantedUse(final boolean grantedUse) { + this.grantedUse = grantedUse; + } + + public boolean isGrantedEdit() { + return grantedEdit; + } + + public void setGrantedEdit(final boolean grantedEdit) { + this.grantedEdit = grantedEdit; + } + + public boolean isGrantedView() { + return grantedView; + } + + public void setGrantedView(final boolean grantedView) { + this.grantedView = grantedView; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java index c6f147d5e..41c73f3a7 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionApplication.java @@ -24,8 +24,9 @@ public class ContentSectionApplication extends Application { public Set> getClasses() { final Set> classes = new HashSet<>(); - classes.add(IsAuthenticatedFilter.class); + classes.add(AssetFolderController.class); classes.add(DocumentFolderController.class); + classes.add(IsAuthenticatedFilter.class); return classes; } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionModel.java index ec2a0de33..337eb341f 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionModel.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/ContentSectionModel.java @@ -23,30 +23,44 @@ import javax.inject.Named; @RequestScoped @Named("ContentSectionModel") public class ContentSectionModel { - + private ContentSection section; - - private List folders; - + + private List assetFolders; + + private List documentFolders; + protected void setSection(final ContentSection section) { this.section = Objects.requireNonNull( section, "Parameter section can't be null" ); } - + public String getSectionName() { return Optional .ofNullable(section) .map(ContentSection::getLabel) .orElse(""); } - - public List getFolders() { - return Collections.unmodifiableList(folders); + + public List getAssetFolders() { + return Collections.unmodifiableList(assetFolders); } - - protected void setFolders(final List folders) { - this.folders = new ArrayList<>(folders); + + protected void setAssetFolders( + final List assetFolders + ) { + this.assetFolders = new ArrayList<>(assetFolders); } - + + public List getDocumentFolders() { + return Collections.unmodifiableList(documentFolders); + } + + protected void setDocumentFolders( + final List documentFolders + ) { + this.documentFolders = new ArrayList<>(documentFolders); + } + } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/CurrentUserAssetPermissions.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/CurrentUserAssetPermissions.java new file mode 100644 index 000000000..336dcc8ef --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/CurrentUserAssetPermissions.java @@ -0,0 +1,25 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.librecms.contentsection.privileges.AssetPrivileges; + +import javax.enterprise.context.Dependent; + +/** + * + * @author Jens Pelzetter + */ +@Dependent +public class CurrentUserAssetPermissions + extends AbstractCurrentUserPermissions { + + @Override + protected Class getPrivilegesClass() { + return AssetPrivileges.class; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/CurrentUserDocumentPermissions.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/CurrentUserDocumentPermissions.java new file mode 100644 index 000000000..6e544bc85 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/CurrentUserDocumentPermissions.java @@ -0,0 +1,25 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.librecms.contentsection.privileges.ItemPrivileges; + +import javax.enterprise.context.Dependent; + +/** + * + * @author Jens Pelzetter + */ +@Dependent +public class CurrentUserDocumentPermissions + extends AbstractCurrentUserPermissions { + + @Override + protected Class getPrivilegesClass() { + return ItemPrivileges.class; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderController.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderController.java index 38c693e67..45c9b1207 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderController.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderController.java @@ -11,7 +11,6 @@ import org.libreccm.api.Identifier; import org.libreccm.api.IdentifierParser; import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.security.AuthorizationRequired; -import org.libreccm.security.Permission; import org.libreccm.security.PermissionChecker; import org.libreccm.security.PermissionManager; import org.libreccm.security.Role; @@ -57,7 +56,6 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; - import javax.ws.rs.FormParam; import javax.ws.rs.POST; @@ -119,17 +117,29 @@ public class DocumentFolderController { @Inject private RoleRepository roleRepo; + @Inject + private DocumentPermissions documentPermissions; + + @Inject + private DocumentFolderTree documentFolderTree; + + @Inject + private GrantedItemPrivileges grantedPrivileges; + + @Inject + private CurrentUserDocumentPermissions currentUserPermissions; + @GET @Path("/") @AuthorizationRequired @Transactional(Transactional.TxType.REQUIRED) - public String listItems( + public String list( @PathParam("sectionIdentifier") final String sectionIdentifier, @QueryParam("filterTerm") @DefaultValue("") final String filterTerm, @QueryParam("firstResult") @DefaultValue("0") final int firstResult, @QueryParam("maxResults") @DefaultValue("20") final int maxResults ) { - return listItems( + return list( sectionIdentifier, "", filterTerm, firstResult, maxResults ); } @@ -138,7 +148,7 @@ public class DocumentFolderController { @Path("/{folderPath:(.+)?}") @AuthorizationRequired @Transactional(Transactional.TxType.REQUIRED) - public String listItems( + public String list( @PathParam("sectionIdentifier") final String sectionIdentifier, @PathParam("folderPath") final String folderPath, @QueryParam("filterTerm") @DefaultValue("") final String filterTerm, @@ -209,10 +219,9 @@ public class DocumentFolderController { documentFolderModel.setFirstResult(firstResult); documentFolderModel.setMaxResults(maxResults); - final List folderTree = buildFolderTree( - section, folder + contentSectionModel.setDocumentFolders( + documentFolderTree.buildFolderTree(section, folder) ); - contentSectionModel.setFolders(folderTree); documentFolderModel.setRows( folderEntries @@ -238,13 +247,13 @@ public class DocumentFolderController { ) ); documentFolderModel.setGrantedPermissions( - buildPermissionsMatrix(section, folder) + grantedPrivileges.buildPermissionsMatrix(section, folder) ); documentFolderModel.setPrivileges( permissionManager.listDefiniedPrivileges(ItemPrivileges.class) ); documentFolderModel.setCurrentUserPermissions( - buildCurrentUserPermissions(folder) + currentUserPermissions.buildCurrentUserPermissions(folder) ); return "org/librecms/ui/contentsection/documentfolder/documentfolder.xhtml"; @@ -387,8 +396,11 @@ public class DocumentFolderController { parentFolder = section.getRootDocumentsFolder(); } else { final Optional parentFolderResult = folderRepo - .findByPath(section, parentFolderPath, - FolderType.DOCUMENTS_FOLDER); + .findByPath( + section, + parentFolderPath, + FolderType.DOCUMENTS_FOLDER + ); if (parentFolderResult.isPresent()) { parentFolder = parentFolderResult.get(); } else { @@ -569,10 +581,10 @@ public class DocumentFolderController { final String[] folderPathTokens = folderPath.split("/"); final String returnFolderPath = String.join( - "/", + "/", Arrays.copyOf(folderPathTokens, folderPathTokens.length - 1) ); - + return String.format( "redirect:/%s/documentfolders/%s", sectionIdentifier, @@ -606,74 +618,10 @@ public class DocumentFolderController { return sectionResult; } - private List buildFolderTree( - final ContentSection section, final Folder currentFolder - ) { - final Folder root = section.getRootDocumentsFolder(); - final String currentFolderPath = folderManager - .getFolderPath(currentFolder) - .substring( - folderManager - .getFolderPath(section.getRootDocumentsFolder()) - .length() - 1 - ); - - return root - .getSubFolders() - .stream() - .sorted( - (folder1, folder2) - -> folder1.getName().compareTo(folder2.getName()) - ) - .map(folder -> buildFolderTreeNode(section, currentFolderPath, - folder)) - .collect(Collectors.toList()); - } - - private FolderTreeNode buildFolderTreeNode( - final ContentSection section, - final String currentFolderPath, - final Folder folder - ) { - final String folderPath = folderManager - .getFolderPath(folder) - .substring( - folderManager - .getFolderPath(section.getRootDocumentsFolder()) - .length() - 1 - ); - - final FolderTreeNode node = new FolderTreeNode(); - node.setFolderId(folder.getObjectId()); - node.setUuid(folder.getUuid()); - node.setName(folder.getName()); - node.setPath(folderPath); - node.setOpen(currentFolderPath.startsWith(folderPath)); - node.setSelected(currentFolderPath.equals(folderPath)); - node.setPermissions(buildItemPermissionsModel(folder)); - node.setSubFolders( - folder - .getSubFolders() - .stream() - .sorted( - (folder1, folder2) - -> folder1.getName().compareTo(folder2.getName()) - ) - .map( - subFolder -> buildFolderTreeNode( - section, currentFolderPath, subFolder - ) - ) - .collect(Collectors.toList()) - ); - - return node; - } - - private List buildBreadcrumbs( + private List buildBreadcrumbs( final String folderPath ) { - final List breadcrumbs + final List breadcrumbs = new ArrayList<>(); final List tokens = Arrays .stream(folderPath.split("/")) @@ -682,10 +630,10 @@ public class DocumentFolderController { for (final String token : tokens) { final String path = breadcrumbs .stream() - .map(DocumentFolderBreadcrumbModel::getPathToken) + .map(FolderBreadcrumbsModel::getPathToken) .collect(Collectors.joining("/")); - final DocumentFolderBreadcrumbModel breadcrumb - = new DocumentFolderBreadcrumbModel(); + final FolderBreadcrumbsModel breadcrumb + = new FolderBreadcrumbsModel(); breadcrumb.setPath(path); breadcrumb.setPathToken(token); breadcrumbs.add(breadcrumb); @@ -737,7 +685,9 @@ public class DocumentFolderController { "org.librecms.CmsAdminMessages" ).getText("contentsection.documentfolder.types.folder") ); - row.setPermissions(buildItemPermissionsModel(folder)); + row.setPermissions( + documentPermissions.buildDocumentPermissionsModel(folder) + ); } else { final ContentItem contentItem = itemRepo .findById(entry.getEntryId()) @@ -809,204 +759,12 @@ public class DocumentFolderController { ) ).orElse("?") ); - row.setPermissions(buildItemPermissionsModel(contentItem)); + row.setPermissions( + documentPermissions.buildDocumentPermissionsModel(contentItem) + ); } return row; } - private ItemPermissionsModel buildItemPermissionsModel( - final Folder folder - ) { - final ItemPermissionsModel model = new ItemPermissionsModel(); - model.setGrantedAdminister( - permissionChecker.isPermitted( - ItemPrivileges.ADMINISTER, folder - ) - ); - model.setGrantedApplyAlternateWorkflow( - permissionChecker.isPermitted( - ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, folder - ) - ); - model.setGrantedApprove( - permissionChecker.isPermitted( - ItemPrivileges.APPROVE, folder - ) - ); - model.setGrantedCategorize( - permissionChecker.isPermitted( - ItemPrivileges.CATEGORIZE, folder - ) - ); - model.setGrantedCreateNew( - permissionChecker.isPermitted( - ItemPrivileges.CREATE_NEW, folder - ) - ); - model.setGrantedDelete( - permissionChecker.isPermitted( - ItemPrivileges.DELETE, folder - ) - ); - model.setGrantedEdit( - permissionChecker.isPermitted( - ItemPrivileges.EDIT, folder - ) - ); - model.setGrantedPreview( - permissionChecker.isPermitted( - ItemPrivileges.PREVIEW, folder - ) - ); - model.setGrantedPublish( - permissionChecker.isPermitted( - ItemPrivileges.PUBLISH, folder - ) - ); - model.setGrantedViewPublished( - permissionChecker.isPermitted( - ItemPrivileges.VIEW_PUBLISHED, folder - ) - ); - return model; - } - - private ItemPermissionsModel buildItemPermissionsModel( - final ContentItem item - ) { - final ItemPermissionsModel model = new ItemPermissionsModel(); - model.setGrantedAdminister( - permissionChecker.isPermitted( - ItemPrivileges.ADMINISTER, item - ) - ); - model.setGrantedApplyAlternateWorkflow( - permissionChecker.isPermitted( - ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, item - ) - ); - model.setGrantedApprove( - permissionChecker.isPermitted( - ItemPrivileges.APPROVE, item - ) - ); - model.setGrantedCategorize( - permissionChecker.isPermitted( - ItemPrivileges.CATEGORIZE, item - ) - ); - model.setGrantedCreateNew( - permissionChecker.isPermitted( - ItemPrivileges.CREATE_NEW, item - ) - ); - model.setGrantedDelete( - permissionChecker.isPermitted( - ItemPrivileges.DELETE, item - ) - ); - model.setGrantedEdit( - permissionChecker.isPermitted( - ItemPrivileges.EDIT, item - ) - ); - model.setGrantedPreview( - permissionChecker.isPermitted( - ItemPrivileges.PREVIEW, item - ) - ); - model.setGrantedPublish( - permissionChecker.isPermitted( - ItemPrivileges.PUBLISH, item - ) - ); - model.setGrantedViewPublished( - permissionChecker.isPermitted( - ItemPrivileges.VIEW_PUBLISHED, item - ) - ); - return model; - } - - private List buildPermissionsMatrix( - final ContentSection section, final Folder folder - ) { - return section - .getRoles() - .stream() - .map(role -> buildPrivilegesGrantedToRoleModel(role, folder)) - .collect(Collectors.toList()); - } - - private PrivilegesGrantedToRoleModel buildPrivilegesGrantedToRoleModel( - final Role role, final Folder folder - ) { - final List grantedPrivilges = permissionManager - .listDefiniedPrivileges(ItemPrivileges.class) - .stream() - .map( - privilege -> buildGrantedPrivilegeModel( - role, - folder, - privilege, - permissionManager.findPermissionsForRoleAndObject( - role, folder - ) - ) - ) - .collect(Collectors.toList()); - - final PrivilegesGrantedToRoleModel model - = new PrivilegesGrantedToRoleModel(); - model.setGrantedPrivileges(grantedPrivilges); - model.setGrantee(role.getName()); - - return model; - } - - private GrantedPrivilegeModel buildGrantedPrivilegeModel( - final Role role, - final Folder folder, - final String privilege, - final List permissions - ) { - final GrantedPrivilegeModel model = new GrantedPrivilegeModel(); - model.setGranted(permissionChecker.isPermitted(privilege, folder, role)); - model.setInherited( - model.isGranted() - && permissions - .stream() - .anyMatch( - permission - -> permission.getGrantee().equals(role) - && permission.getGrantedPrivilege().equals(privilege) - && permission.getObject().equals(folder) - && permission.getInheritedFrom() != null - ) - ); - model.setPrivilege(privilege); - - return model; - } - - private List buildCurrentUserPermissions( - final Folder folder - ) { - return permissionManager - .listDefiniedPrivileges(ItemPrivileges.class) - .stream() - .map(privilege -> buildCurrentUserPermission(folder, privilege)) - .collect(Collectors.toList()); - } - - private GrantedPrivilegeModel buildCurrentUserPermission( - final Folder folder, final String privilege - ) { - final GrantedPrivilegeModel model = new GrantedPrivilegeModel(); - model.setPrivilege(privilege); - model.setGranted(permissionChecker.isPermitted(privilege, folder)); - return model; - } - } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderModel.java index 8605f46f0..a27a366d5 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderModel.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderModel.java @@ -29,7 +29,7 @@ public class DocumentFolderModel { private List rows; - private List breadcrumbs; + private List breadcrumbs; private String path; @@ -85,12 +85,12 @@ public class DocumentFolderModel { this.rows = new ArrayList<>(rows); } - public List getBreadcrumbs() { + public List getBreadcrumbs() { return Collections.unmodifiableList(breadcrumbs); } public void setBreadcrumbs( - final List breadcrumbs + final List breadcrumbs ) { this.breadcrumbs = new ArrayList<>(breadcrumbs); } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderRowModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderRowModel.java index d1b0d8587..d0f0b5fab 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderRowModel.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderRowModel.java @@ -36,7 +36,7 @@ public class DocumentFolderRowModel { private String type; - private ItemPermissionsModel permissions; + private DocumentPermissionsModel permissions; public String getCreated() { return created; @@ -130,12 +130,12 @@ public class DocumentFolderRowModel { this.type = type; } - public ItemPermissionsModel getPermissions() { + public DocumentPermissionsModel getPermissions() { return permissions; } protected void setPermissions( - final ItemPermissionsModel permissions + final DocumentPermissionsModel permissions ) { this.permissions = permissions; } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderTree.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderTree.java new file mode 100644 index 000000000..23bb6b3fc --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderTree.java @@ -0,0 +1,44 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.librecms.contentsection.ContentSection; +import org.librecms.contentsection.Folder; + +import javax.enterprise.context.Dependent; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@Dependent +public class DocumentFolderTree + extends AbstractFolderTree{ + + @Inject + private DocumentPermissions documentPermissions; + + @Override + public DocumentFolderTreeNode newFolderTreeNode() { + return new DocumentFolderTreeNode(); + } + + @Transactional(Transactional.TxType.REQUIRED) + @Override + public Folder getRootFolder(final ContentSection section) { + return section.getRootDocumentsFolder(); + } + + @Override + public DocumentPermissionsModel buildPermissionsModel(final Folder folder) { + return documentPermissions.buildDocumentPermissionsModel(folder); + } + + + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderTreeNode.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderTreeNode.java new file mode 100644 index 000000000..09d6e6686 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderTreeNode.java @@ -0,0 +1,15 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +/** + * + * @author Jens Pelzetter + */ +public class DocumentFolderTreeNode + extends FolderTreeNode { + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentPermissions.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentPermissions.java new file mode 100644 index 000000000..92a53d55d --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentPermissions.java @@ -0,0 +1,140 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.libreccm.security.PermissionChecker; +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.Folder; +import org.librecms.contentsection.privileges.ItemPrivileges; + +import javax.enterprise.context.Dependent; +import javax.inject.Inject; + +/** + * + * @author Jens Pelzetter + */ +@Dependent +class DocumentPermissions { + + @Inject + private PermissionChecker permissionChecker; + + public DocumentPermissionsModel buildDocumentPermissionsModel( + final Folder folder + ) { + final DocumentPermissionsModel model = new DocumentPermissionsModel(); + model.setGrantedAdminister( + permissionChecker.isPermitted( + ItemPrivileges.ADMINISTER, folder + ) + ); + model.setGrantedApplyAlternateWorkflow( + permissionChecker.isPermitted( + ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, folder + ) + ); + model.setGrantedApprove( + permissionChecker.isPermitted( + ItemPrivileges.APPROVE, folder + ) + ); + model.setGrantedCategorize( + permissionChecker.isPermitted( + ItemPrivileges.CATEGORIZE, folder + ) + ); + model.setGrantedCreateNew( + permissionChecker.isPermitted( + ItemPrivileges.CREATE_NEW, folder + ) + ); + model.setGrantedDelete( + permissionChecker.isPermitted( + ItemPrivileges.DELETE, folder + ) + ); + model.setGrantedEdit( + permissionChecker.isPermitted( + ItemPrivileges.EDIT, folder + ) + ); + model.setGrantedPreview( + permissionChecker.isPermitted( + ItemPrivileges.PREVIEW, folder + ) + ); + model.setGrantedPublish( + permissionChecker.isPermitted( + ItemPrivileges.PUBLISH, folder + ) + ); + model.setGrantedViewPublished( + permissionChecker.isPermitted( + ItemPrivileges.VIEW_PUBLISHED, folder + ) + ); + return model; + } + + public DocumentPermissionsModel buildDocumentPermissionsModel( + final ContentItem item + ) { + final DocumentPermissionsModel model = new DocumentPermissionsModel(); + model.setGrantedAdminister( + permissionChecker.isPermitted( + ItemPrivileges.ADMINISTER, item + ) + ); + model.setGrantedApplyAlternateWorkflow( + permissionChecker.isPermitted( + ItemPrivileges.APPLY_ALTERNATE_WORKFLOW, item + ) + ); + model.setGrantedApprove( + permissionChecker.isPermitted( + ItemPrivileges.APPROVE, item + ) + ); + model.setGrantedCategorize( + permissionChecker.isPermitted( + ItemPrivileges.CATEGORIZE, item + ) + ); + model.setGrantedCreateNew( + permissionChecker.isPermitted( + ItemPrivileges.CREATE_NEW, item + ) + ); + model.setGrantedDelete( + permissionChecker.isPermitted( + ItemPrivileges.DELETE, item + ) + ); + model.setGrantedEdit( + permissionChecker.isPermitted( + ItemPrivileges.EDIT, item + ) + ); + model.setGrantedPreview( + permissionChecker.isPermitted( + ItemPrivileges.PREVIEW, item + ) + ); + model.setGrantedPublish( + permissionChecker.isPermitted( + ItemPrivileges.PUBLISH, item + ) + ); + model.setGrantedViewPublished( + permissionChecker.isPermitted( + ItemPrivileges.VIEW_PUBLISHED, item + ) + ); + return model; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ItemPermissionsModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentPermissionsModel.java similarity index 97% rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/ItemPermissionsModel.java rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentPermissionsModel.java index 90b6a673c..ac5b67cbb 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/ItemPermissionsModel.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentPermissionsModel.java @@ -9,7 +9,7 @@ package org.librecms.ui.contentsections; * * @author Jens Pelzetter */ -public class ItemPermissionsModel { +public class DocumentPermissionsModel implements PermissionsModel { private boolean grantedAdminister; diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderBreadcrumbModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/FolderBreadcrumbsModel.java similarity index 95% rename from ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderBreadcrumbModel.java rename to ccm-cms/src/main/java/org/librecms/ui/contentsections/FolderBreadcrumbsModel.java index a12f76eb4..a383ccd9a 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/DocumentFolderBreadcrumbModel.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/FolderBreadcrumbsModel.java @@ -9,7 +9,7 @@ package org.librecms.ui.contentsections; * * @author Jens Pelzetter */ -public class DocumentFolderBreadcrumbModel { +public class FolderBreadcrumbsModel { private String pathToken; diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FolderTreeNode.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/FolderTreeNode.java index 8eb67b0d3..07b857805 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/FolderTreeNode.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/FolderTreeNode.java @@ -11,8 +11,10 @@ import java.util.List; /** * * @author Jens Pelzetter + * @param + * @param

*/ -public class FolderTreeNode { +public class FolderTreeNode { private long folderId; @@ -22,13 +24,13 @@ public class FolderTreeNode { private String path; - private List subFolders; + private List subFolders; private boolean open; private boolean selected; - private ItemPermissionsModel permissions; + private P permissions; public long getFolderId() { return folderId; @@ -62,11 +64,11 @@ public class FolderTreeNode { this.path = path; } - public List getSubFolders() { + public List getSubFolders() { return Collections.unmodifiableList(subFolders); } - public void setSubFolders(final List subFolders) { + public void setSubFolders(final List subFolders) { this.subFolders = subFolders; } @@ -86,13 +88,11 @@ public class FolderTreeNode { this.selected = selected; } - public ItemPermissionsModel getPermissions() { + public P getPermissions() { return permissions; } - public void setPermissions( - final ItemPermissionsModel permissions - ) { + public void setPermissions(final P permissions) { this.permissions = permissions; } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/GrantedAssetPrivileges.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/GrantedAssetPrivileges.java new file mode 100644 index 000000000..44365903a --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/GrantedAssetPrivileges.java @@ -0,0 +1,24 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.librecms.contentsection.privileges.AssetPrivileges; + +import javax.enterprise.context.Dependent; + +/** + * + * @author Jens Pelzetter + */ +@Dependent +public class GrantedAssetPrivileges extends AbstractGrantedPrivileges { + + @Override + protected Class getPrivilegesClass() { + return AssetPrivileges.class; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/GrantedItemPrivileges.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/GrantedItemPrivileges.java new file mode 100644 index 000000000..7ce48b604 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/GrantedItemPrivileges.java @@ -0,0 +1,24 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +import org.librecms.contentsection.privileges.ItemPrivileges; + +import javax.enterprise.context.Dependent; + +/** + * + * @author Jens Pelzetter + */ +@Dependent +public class GrantedItemPrivileges extends AbstractGrantedPrivileges { + + @Override + protected Class getPrivilegesClass() { + return ItemPrivileges.class; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/PermissionsModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/PermissionsModel.java new file mode 100644 index 000000000..a126491fa --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/PermissionsModel.java @@ -0,0 +1,14 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.librecms.ui.contentsections; + +/** + * + * @author Jens Pelzetter + */ +public interface PermissionsModel { + +} diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assetfolder/assetfolder-not-found.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assetfolder/assetfolder-not-found.xhtml new file mode 100644 index 000000000..86376dfa1 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assetfolder/assetfolder-not-found.xhtml @@ -0,0 +1,27 @@ +]> + + + + + + +

+ + + +
+
+ #{CmsAdminMessages.getMessage("contentsections.assetfolders.not_found", [contentSection, folderPath])} +
+
+
+ + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documentfolder/documentfolder.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documentfolder/documentfolder.xhtml index 20179d6a4..ca6cc20d2 100644 --- a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documentfolder/documentfolder.xhtml +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documentfolder/documentfolder.xhtml @@ -78,7 +78,7 @@
    -