From ddc70c795d385bfc940004ae0563ec914798757a Mon Sep 17 00:00:00 2001 From: jensp Date: Tue, 4 Oct 2016 15:26:32 +0000 Subject: [PATCH] CCM NG/ccm-core: Additional queries (and accompanying methods in RoleRepository) for Role to find Roles by the the permissions granted to the role. git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4349 8810af33-2d31-482b-a856-94f89814c4df --- .../main/java/org/libreccm/security/Role.java | 13 +- .../org/libreccm/security/RoleRepository.java | 37 +++-- .../libreccm/security/RoleRepositoryTest.java | 132 ++++++++++++++++-- 3 files changed, 163 insertions(+), 19 deletions(-) diff --git a/ccm-core/src/main/java/org/libreccm/security/Role.java b/ccm-core/src/main/java/org/libreccm/security/Role.java index fefd8e4b1..8b4c18f7b 100644 --- a/ccm-core/src/main/java/org/libreccm/security/Role.java +++ b/ccm-core/src/main/java/org/libreccm/security/Role.java @@ -89,7 +89,18 @@ import javax.xml.bind.annotation.XmlRootElement; query = "SELECT COUNT(r.name) FROM Role r " + "WHERE LOWER(r.name) LIKE CONCAT(LOWER(:name), '%') " + "GROUP BY r.name " - + "ORDER BY r.name ") + + "ORDER BY r.name "), + @NamedQuery( + name = "Role.findByPrivilege", + query = "SELECT r FROM Role r JOIN r.permissions p " + + "WHERE p.grantedPrivilege = :privilege " + + "ORDER BY r.name"), + @NamedQuery( + name = "Role.findByPrivilegeAndObject", + query = "SELECT r FROM Role r JOIN r.permissions p " + + "WHERE p.grantedPrivilege = :privilege " + + "AND p.object = :object " + + "ORDER BY r.name") }) @NamedEntityGraphs({ @NamedEntityGraph( diff --git a/ccm-core/src/main/java/org/libreccm/security/RoleRepository.java b/ccm-core/src/main/java/org/libreccm/security/RoleRepository.java index fa7d76107..2210afb91 100644 --- a/ccm-core/src/main/java/org/libreccm/security/RoleRepository.java +++ b/ccm-core/src/main/java/org/libreccm/security/RoleRepository.java @@ -28,6 +28,7 @@ import org.libreccm.core.CoreConstants; import javax.persistence.NoResultException; import javax.transaction.Transactional; +import org.libreccm.core.CcmObject; /** * Repository class for {@link Role} entities. @@ -52,7 +53,7 @@ public class RoleRepository extends AbstractEntityRepository { public long count() { final TypedQuery query = getEntityManager().createNamedQuery( - "Role.count", Long.class); + "Role.count", Long.class); return query.getSingleResult(); } @@ -62,11 +63,11 @@ public class RoleRepository extends AbstractEntityRepository { * @param name The name of the role to retrieve. * * @return The role identified by the provided {@code name} or {@code null} - * if there is no matching role. + * if there is no matching role. */ public Role findByName(final String name) { final TypedQuery query = getEntityManager().createNamedQuery( - "Role.findByName", Role.class); + "Role.findByName", Role.class); query.setParameter("name", name); final List result = query.getResultList(); if (result.isEmpty()) { @@ -78,22 +79,42 @@ public class RoleRepository extends AbstractEntityRepository { public List findAllOrderedByRoleName() { final TypedQuery query = getEntityManager().createNamedQuery( - "Role.findAllOrderedByRoleName", Role.class); + "Role.findAllOrderedByRoleName", Role.class); return query.getResultList(); } public List findAllOrderedByRole(final int maxResults, final int firstResult) { final TypedQuery query = getEntityManager().createNamedQuery( - "Role.findAllOrderedByRoleName", Role.class); + "Role.findAllOrderedByRoleName", Role.class); query.setMaxResults(maxResults); query.setFirstResult(firstResult); return query.getResultList(); } + @Transactional(Transactional.TxType.REQUIRED) + public List findByPrivilege(final String privilege) { + final TypedQuery query = getEntityManager().createNamedQuery( + "Role.findByPrivilege", Role.class); + query.setParameter("privilege", privilege); + + return query.getResultList(); + } + + @Transactional(Transactional.TxType.REQUIRED) + public List findByPrivilege(final String privilege, + final CcmObject object) { + final TypedQuery query = getEntityManager().createNamedQuery( + "Role.findByPrivilegeAndObject", Role.class); + query.setParameter("privilege", privilege); + query.setParameter("object", object); + + return query.getResultList(); + } + public List searchByName(final String name) { final TypedQuery query = getEntityManager().createNamedQuery( - "Role.searchByName", Role.class); + "Role.searchByName", Role.class); query.setParameter("name", name); return query.getResultList(); } @@ -102,7 +123,7 @@ public class RoleRepository extends AbstractEntityRepository { final int maxResults, final int firstResult) { final TypedQuery query = getEntityManager().createNamedQuery( - "Role.searchByName", Role.class); + "Role.searchByName", Role.class); query.setParameter("name", name); query.setFirstResult(firstResult); query.setMaxResults(maxResults); @@ -111,7 +132,7 @@ public class RoleRepository extends AbstractEntityRepository { public long searchByNameCount(final String name) { final TypedQuery query = getEntityManager().createNamedQuery( - "Role.searchByNameCount", Long.class); + "Role.searchByNameCount", Long.class); query.setParameter("name", name); try { return query.getSingleResult(); diff --git a/ccm-core/src/test/java/org/libreccm/security/RoleRepositoryTest.java b/ccm-core/src/test/java/org/libreccm/security/RoleRepositoryTest.java index 5fe212b0d..83e2f320d 100644 --- a/ccm-core/src/test/java/org/libreccm/security/RoleRepositoryTest.java +++ b/ccm-core/src/test/java/org/libreccm/security/RoleRepositoryTest.java @@ -31,8 +31,6 @@ import org.jboss.arquillian.transaction.api.annotation.Transactional; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.jboss.shrinkwrap.resolver.api.maven.Maven; -import org.jboss.shrinkwrap.resolver.api.maven.PomEquippedResolveStage; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -42,21 +40,22 @@ import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import org.libreccm.tests.categories.IntegrationTest; -import java.io.File; import java.util.List; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import org.libreccm.core.CcmObject; +import org.libreccm.core.CcmObjectRepository; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import static org.libreccm.testutils.DependenciesHelpers.*; /** - * Tests for the {@link RoleRepository}. Note. We are not enabling the - * {@link AuthorizationInterceptor} for this test. - * + * Tests for the {@link RoleRepository}. Note. We are not enabling the + * {@link AuthorizationInterceptor} for this test. + * * @author Jens Pelzetter */ @Category(IntegrationTest.class) @@ -73,6 +72,9 @@ public class RoleRepositoryTest { @Inject private RoleRepository roleRepository; + @Inject + private CcmObjectRepository ccmObjRepo; + @PersistenceContext private EntityManager entityManager; @@ -104,16 +106,18 @@ public class RoleRepositoryTest { .addPackage(org.libreccm.core.CcmObject.class.getPackage()) .addPackage(org.libreccm.categorization.Categorization.class .getPackage()) - .addPackage(org.libreccm.configuration.ConfigurationManager.class + .addPackage( + org.libreccm.configuration.ConfigurationManager.class .getPackage()) - .addPackage(org.libreccm.l10n.LocalizedString.class.getPackage()) - .addPackage(org.libreccm.web.CcmApplication.class.getPackage()) + .addPackage(org.libreccm.l10n.LocalizedString.class.getPackage()). + addPackage(org.libreccm.web.CcmApplication.class.getPackage()) .addPackage(org.libreccm.workflow.Workflow.class.getPackage()) .addPackage(org.libreccm.jpa.EntityManagerProducer.class .getPackage()) .addPackage(org.libreccm.jpa.utils.MimeTypeConverter.class .getPackage()) - .addPackage(org.libreccm.testutils.EqualsVerifier.class.getPackage()) + .addPackage(org.libreccm.testutils.EqualsVerifier.class. + getPackage()) .addPackage(org.libreccm.tests.categories.IntegrationTest.class .getPackage()) .addAsLibraries(getModuleDependencies()) @@ -124,16 +128,31 @@ public class RoleRepositoryTest { .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); } + /** + * Verify that a {@link RoleRepository} instance is injected into + * {@link #roleRepository}. + */ @Test public void repoIsInjected() { assertThat(roleRepository, is(not(nullValue()))); } + /** + * Verify that a {@link EntityManager} instance is injected into + * {@link #entityManager}. + */ @Test public void entityManagerIsInjected() { assertThat(entityManager, is(not(nullValue()))); } + /** + * Helper method encapsulating some checks done multiple test methods. + * + * @param administrator The administrator role. + * @param user The user role. + * @param reader The reader role. + */ private void checkRoles(final Role administrator, final Role user, final Role reader) { @@ -150,6 +169,10 @@ public class RoleRepositoryTest { assertThat(reader.getName(), is(equalTo(READER))); } + /** + * Tries to find several {@link Role}s by their {@link Role#roleId} using + * {@link RoleRepository#findById(java.lang.Object)}. + */ @Test @UsingDataSet("datasets/org/libreccm/security/RoleRepositoryTest/data.yml") @InSequence(100) @@ -161,6 +184,10 @@ public class RoleRepositoryTest { checkRoles(administrator, user, reader); } + /** + * Tries to find several {@link Role}s by their unique {@link Role#name} + * using {@link RoleRepository#findByName(java.lang.String)}. + */ @Test @UsingDataSet("datasets/org/libreccm/security/RoleRepositoryTest/data.yml") @InSequence(200) @@ -172,6 +199,9 @@ public class RoleRepositoryTest { checkRoles(administrator, user, reader); } + /** + * Tries to find all {@link Role}s using {@link RoleRepository#findAll()}. + */ @Test @UsingDataSet("datasets/org/libreccm/security/RoleRepositoryTest/data.yml") @InSequence(300) @@ -181,6 +211,70 @@ public class RoleRepositoryTest { assertThat(roles.size(), is(3)); } + /** + * Tests the {@link RoleRepository#findByPrivilege(java.lang.String)} method + * and the named query used by this method. Note: We are using the dataset + * from the {@link PermissionManagerTest} here because it contains roles, + * permissions and objects. + */ + @Test + @UsingDataSet( + "datasets/org/libreccm/security/PermissionManagerTest/data.yml") + @InSequence(310) + public void findByPrivilege() { + final List rolesWithPrivilege1 = roleRepository.findByPrivilege( + "privilege1"); + final List rolesWithPrivilege2 = roleRepository.findByPrivilege( + "privilege2"); + final List empty = roleRepository.findByPrivilege("privilege3"); + + assertThat(rolesWithPrivilege1.size(), is(1)); + assertThat(rolesWithPrivilege2.size(), is(2)); + assertThat(empty.isEmpty(), is(true)); + + assertThat(rolesWithPrivilege1.get(0).getName(), is(equalTo("role1"))); + assertThat(rolesWithPrivilege2.get(0).getName(), is(equalTo("role1"))); + assertThat(rolesWithPrivilege2.get(1).getName(), is(equalTo("role2"))); + + } + + /** + * Tests the {@link RoleRepository#findByPrivilege(java.lang.String, org.libreccm.core.CcmObject) + * } method and the named query used by this method. Note: We are using the + * dataset from the {@link PermissionManagerTest} here because it contains + * roles, permissions and objects. + */ + @Test + @UsingDataSet( + "datasets/org/libreccm/security/PermissionManagerTest/data.yml") + @InSequence(310) + public void findByPrivilegeAndObject() { + final CcmObject object1 = ccmObjRepo.findById(-20001L); + final CcmObject object2 = ccmObjRepo.findById(-20002L); + final CcmObject object3 = ccmObjRepo.findById(-20003L); + + final List rolesWithPrivilege1 = roleRepository.findByPrivilege( + "privilege1", object1); + final List rolesWithPrivilege2 = roleRepository.findByPrivilege( + "privilege2", object1); + final List empty1 = roleRepository.findByPrivilege("privilege3", + object1); + final List empty2 = roleRepository.findByPrivilege("privilege1", + object3); + + assertThat(rolesWithPrivilege1.size(), is(0)); + assertThat(rolesWithPrivilege2.size(), is(1)); + assertThat(empty1.isEmpty(), is(true)); + assertThat(empty2.isEmpty(), is(true)); + + assertThat(rolesWithPrivilege2.get(0).getName(), is(equalTo("role1"))); + + } + + /** + * Tries to save a new {@link Role} by using + * {@link RoleRepository#save(org.libreccm.security.Role)}. + */ @Test @UsingDataSet("datasets/org/libreccm/security/RoleRepositoryTest/data.yml") @ShouldMatchDataSet(value = "datasets/org/libreccm/security/" @@ -194,6 +288,10 @@ public class RoleRepositoryTest { roleRepository.save(role); } + /** + * Tries to save a updated {@link Role} by using + * {@link RoleRepository#save(org.libreccm.security.Role)}. + */ @Test @UsingDataSet("datasets/org/libreccm/security/RoleRepositoryTest/data.yml") @ShouldMatchDataSet(value = "datasets/org/libreccm/security/" @@ -207,6 +305,11 @@ public class RoleRepositoryTest { roleRepository.save(role); } + /** + * Verifies that {@link RoleRepository#save(org.libreccm.security.Role)} + * throws a {@link IllegalArgumentException} is called with {@code null} for + * the {@link Role} to save. + */ @Test(expected = IllegalArgumentException.class) @ShouldThrowException(IllegalArgumentException.class) @InSequence(600) @@ -214,6 +317,10 @@ public class RoleRepositoryTest { roleRepository.save(null); } + /** + * Tries a delete a {@link Role} by using + * {@link RoleRepository#delete(org.libreccm.security.Role)}. + */ @Test @UsingDataSet("datasets/org/libreccm/security/RoleRepositoryTest/data.yml") @ShouldMatchDataSet(value = "datasets/org/libreccm/security/" @@ -226,6 +333,11 @@ public class RoleRepositoryTest { roleRepository.delete(role); } + /** + * Verifies that {@link RoleRepository#delete(org.libreccm.security.Role)} + * throws an {@link IllegalArgumentException} is called with {@code null} + * for the {@link Role} to delete. + */ @Test(expected = IllegalArgumentException.class) @ShouldThrowException(IllegalArgumentException.class) @InSequence(800)