diff --git a/ccm-cms/src/main/java/org/librecms/Cms.java b/ccm-cms/src/main/java/org/librecms/Cms.java
index 334532fe2..15528811a 100644
--- a/ccm-cms/src/main/java/org/librecms/Cms.java
+++ b/ccm-cms/src/main/java/org/librecms/Cms.java
@@ -19,13 +19,21 @@ import org.libreccm.modules.ShutdownEvent;
import org.libreccm.modules.UnInstallEvent;
import org.libreccm.web.ApplicationType;
import org.libreccm.web.CcmApplication;
-import org.librecms.assets.*;
+import org.librecms.assets.AssetTypes;
+import org.librecms.assets.Bookmark;
+import org.librecms.assets.ExternalAudioAsset;
+import org.librecms.assets.ExternalVideoAsset;
+import org.librecms.assets.FileAsset;
+import org.librecms.assets.Image;
+import org.librecms.assets.LegalMetadata;
+import org.librecms.assets.SideNote;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionCreator;
import org.librecms.contentsection.ContentSectionSetup;
import org.librecms.contentsection.ui.admin.ApplicationInstanceForm;
import org.librecms.contentsection.ui.admin.SettingsPane;
import org.librecms.contenttypes.Article;
+import org.librecms.contenttypes.ContentTypes;
import org.librecms.contenttypes.Event;
import org.librecms.contenttypes.MultiPartArticle;
import org.librecms.contenttypes.News;
diff --git a/ccm-cms/src/main/java/org/librecms/ContentTypes.java b/ccm-cms/src/main/java/org/librecms/ContentTypes.java
deleted file mode 100644
index 98d8491b5..000000000
--- a/ccm-cms/src/main/java/org/librecms/ContentTypes.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2016 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package org.librecms;
-
-import org.librecms.contentsection.ContentItem;
-
-/**
- * Annotation for modules to describe the content types provided by a module.
- * The content types - classes which extend the {@link ContentItem} class - must
- * be annotated with the {@link ContentType} annotation.
- *
- *
- * @author Jens Pelzetter
- */
-public @interface ContentTypes {
-
- Class extends ContentItem>[] value();
-
-}
diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemRepository.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemRepository.java
index 6881d0aa7..4778627e1 100644
--- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemRepository.java
+++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemRepository.java
@@ -30,6 +30,8 @@ import org.libreccm.categorization.ObjectNotAssignedToCategoryException;
import org.libreccm.core.CcmObject;
import org.libreccm.core.CcmObjectRepository;
import org.libreccm.core.UnexpectedErrorException;
+import org.libreccm.security.PermissionChecker;
+import org.libreccm.security.Role;
import java.util.List;
import java.util.Optional;
@@ -41,8 +43,12 @@ import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;
import org.libreccm.security.Shiro;
+import org.libreccm.security.User;
import org.libreccm.workflow.Workflow;
+import java.util.Collections;
+import java.util.stream.Collectors;
+
import javax.transaction.Transactional;
/**
@@ -68,6 +74,9 @@ public class ContentItemRepository
@Inject
private Shiro shiro;
+
+ @Inject
+ private PermissionChecker permissionChecker;
@Override
public Long getEntityId(final ContentItem item) {
@@ -222,14 +231,35 @@ public class ContentItemRepository
return query.getSingleResult();
}
+ @Transactional(Transactional.TxType.REQUIRED)
public Optional findByNameInFolder(final Category folder,
final String name) {
+
+ final Optional user = shiro.getUser();
+ final List roles;
+ if (user.isPresent()) {
+ roles = user
+ .get()
+ .getRoleMemberships()
+ .stream()
+ .map(membership -> membership.getRole())
+ .collect(Collectors.toList());
+ } else {
+ roles = Collections.emptyList();
+ }
+
+ final boolean isSystemUser = shiro.isSystemUser();
+ final boolean isAdmin = permissionChecker.isPermitted("*");
+
final TypedQuery query = getEntityManager()
.createNamedQuery("ContentItem.findByNameInFolder",
ContentItem.class);
query.setParameter("folder", folder);
query.setParameter("name", name);
-
+ query.setParameter("roles", roles);
+ query.setParameter("isSystemUser", isSystemUser);
+ query.setParameter("isAdmin", isAdmin);
+
try {
return Optional.of(query.getSingleResult());
} catch (NoResultException ex) {