From eae5fa0edcf5daa93906285ed2472696cd7a60b8 Mon Sep 17 00:00:00 2001 From: tosmers Date: Wed, 3 May 2017 16:58:35 +0000 Subject: [PATCH] [UPDATE] - adds implementation to all resolveId-methods of the IdResolver-classes - modifies generateId-method for PermissionIdGenerator to match the trunk implementation of the idGenerator - adds missing findBy-methods to repositories git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4703 8810af33-2d31-482b-a856-94f89814c4df --- .../org/libreccm/categorization/Category.java | 4 + .../categorization/CategoryIdResolver.java | 2 +- .../categorization/CategoryRepository.java | 29 +- .../libreccm/core/CcmObjectIdResolver.java | 7 +- .../libreccm/core/CcmObjectRepository.java | 22 +- .../libreccm/security/GroupIdResolver.java | 7 +- .../libreccm/security/PartyIdResolver.java | 8 +- .../libreccm/security/PartyRepository.java | 14 +- .../org/libreccm/security/Permission.java | 8 +- .../security/PermissionIdGenerator.java | 23 +- .../security/PermissionIdResolver.java | 42 +- .../security/PermissionRepository.java | 78 + .../org/libreccm/security/RoleIdResolver.java | 8 +- .../org/libreccm/security/UserIdResolver.java | 8 +- .../org/libreccm/workflow/AssignableTask.java | 4 + .../workflow/AssignableTaskIdResolver.java | 8 +- .../workflow/AssignableTaskRepository.java | 26 +- .../main/java/org/libreccm/workflow/Task.java | 4 + .../org/libreccm/workflow/TaskIdResolver.java | 8 +- .../org/libreccm/workflow/TaskRepository.java | 25 +- .../libreccm/workflow/WorkflowIdResolver.java | 8 +- .../portation/CoreDataImportTest.java | 2 +- .../trunk-iaw-exports/assignableTasks.xml | 9530 +++---- .../trunk-iaw-exports/categories.xml | 338 +- .../trunk-iaw-exports/groupMemberships.xml | 165 +- .../portation/trunk-iaw-exports/groups.xml | 60 +- .../trunk-iaw-exports/permissions.xml | 16855 +---------- .../trunk-iaw-exports/roleMemberships.xml | 23503 +--------------- .../portation/trunk-iaw-exports/roles.xml | 1575 +- .../portation/trunk-iaw-exports/workflows.xml | 4376 +-- 30 files changed, 9347 insertions(+), 47400 deletions(-) create mode 100644 ccm-core/src/main/java/org/libreccm/security/PermissionRepository.java diff --git a/ccm-core/src/main/java/org/libreccm/categorization/Category.java b/ccm-core/src/main/java/org/libreccm/categorization/Category.java index 202404be3..18f87048d 100644 --- a/ccm-core/src/main/java/org/libreccm/categorization/Category.java +++ b/ccm-core/src/main/java/org/libreccm/categorization/Category.java @@ -80,6 +80,10 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA; name = "Category.findByName", query = "SELECT c FROM Category c WHERE c.name = :name") , + @NamedQuery( + name = "Category.findByUuid", + query = "SELECT c FROM Category c WHERE c.uuid = :uuid") + , @NamedQuery( name = "Category.findParentCategory", query = "SELECT c.parentCategory FROM Category c WHERE c = :category") diff --git a/ccm-core/src/main/java/org/libreccm/categorization/CategoryIdResolver.java b/ccm-core/src/main/java/org/libreccm/categorization/CategoryIdResolver.java index ab2c23d68..54058d8ed 100644 --- a/ccm-core/src/main/java/org/libreccm/categorization/CategoryIdResolver.java +++ b/ccm-core/src/main/java/org/libreccm/categorization/CategoryIdResolver.java @@ -43,7 +43,7 @@ public class CategoryIdResolver implements ObjectIdResolver { @Override public Object resolveId(ObjectIdGenerator.IdKey id) { - return null; + return categoryRepository.findByUuid(id.key.toString()); } @Override diff --git a/ccm-core/src/main/java/org/libreccm/categorization/CategoryRepository.java b/ccm-core/src/main/java/org/libreccm/categorization/CategoryRepository.java index c8579a4a3..3bed87421 100644 --- a/ccm-core/src/main/java/org/libreccm/categorization/CategoryRepository.java +++ b/ccm-core/src/main/java/org/libreccm/categorization/CategoryRepository.java @@ -26,15 +26,15 @@ import org.libreccm.security.AuthorizationRequired; import org.libreccm.security.PermissionChecker; import org.libreccm.security.RequiresPrivilege; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.persistence.NoResultException; +import javax.persistence.TypedQuery; +import javax.transaction.Transactional; import java.util.List; import java.util.Optional; import java.util.UUID; -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; -import javax.persistence.TypedQuery; -import javax.transaction.Transactional; - /** * Provides CRUB operations for {@link Category} objects. * @@ -88,6 +88,25 @@ public class CategoryRepository extends AbstractEntityRepository return query.getResultList(); } + /** + * Finds a {@link Category} by its uuid. + * + * @param uuid The uuid of the item to find + * + * @return An optional either with the found item or empty + */ + public Optional findByUuid(final String uuid) { + final TypedQuery query = getEntityManager(). + createNamedQuery("Category.findByUuid", Category.class); + query.setParameter("uuid", uuid); + + try { + return Optional.of(query.getSingleResult()); + } catch (NoResultException ex) { + return Optional.empty(); + } + } + @Transactional(Transactional.TxType.REQUIRED) public Optional findByPath(final String path) { if (path == null || path.isEmpty()) { diff --git a/ccm-core/src/main/java/org/libreccm/core/CcmObjectIdResolver.java b/ccm-core/src/main/java/org/libreccm/core/CcmObjectIdResolver.java index 9aca9e336..8e3af975c 100644 --- a/ccm-core/src/main/java/org/libreccm/core/CcmObjectIdResolver.java +++ b/ccm-core/src/main/java/org/libreccm/core/CcmObjectIdResolver.java @@ -21,11 +21,16 @@ package org.libreccm.core; import com.fasterxml.jackson.annotation.ObjectIdGenerator; import com.fasterxml.jackson.annotation.ObjectIdResolver; +import javax.inject.Inject; + /** * @author Tobias Osmers * @version created on 3/23/17 */ public class PartyIdResolver implements ObjectIdResolver { + @Inject + private PartyRepository partyRepository; + @Override public void bindItem(final ObjectIdGenerator.IdKey id, final Object pojo) { @@ -36,8 +41,7 @@ public class PartyIdResolver implements ObjectIdResolver { @Override public Object resolveId(final ObjectIdGenerator.IdKey id) { - // Find the user for the id (don't confuse that with the primary key!). - return null; + return partyRepository.findByName(id.key.toString()); } @Override diff --git a/ccm-core/src/main/java/org/libreccm/security/PartyRepository.java b/ccm-core/src/main/java/org/libreccm/security/PartyRepository.java index ac2491c1c..bdf6986dd 100644 --- a/ccm-core/src/main/java/org/libreccm/security/PartyRepository.java +++ b/ccm-core/src/main/java/org/libreccm/security/PartyRepository.java @@ -18,16 +18,14 @@ */ package org.libreccm.security; -import javax.enterprise.context.RequestScoped; - import org.libreccm.core.AbstractEntityRepository; import org.libreccm.core.CoreConstants; -import java.util.List; -import java.util.Optional; - +import javax.enterprise.context.RequestScoped; import javax.persistence.TypedQuery; import javax.transaction.Transactional; +import java.util.List; +import java.util.Optional; /** * Repository class for parties. @@ -51,11 +49,11 @@ public class PartyRepository extends AbstractEntityRepository { } /** - * Finds a party (which can be a user or group) by its name. + * Finds a {@link Party} (which can be a user or group) by its name. * - * @param name + * @param name The name of the item to find * - * @return + * @return An optional either with the found item or empty */ public Optional findByName(final String name) { final TypedQuery query = getEntityManager().createNamedQuery( diff --git a/ccm-core/src/main/java/org/libreccm/security/Permission.java b/ccm-core/src/main/java/org/libreccm/security/Permission.java index 187430fe0..c96fa5bca 100644 --- a/ccm-core/src/main/java/org/libreccm/security/Permission.java +++ b/ccm-core/src/main/java/org/libreccm/security/Permission.java @@ -58,6 +58,12 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA; @Entity @Table(name = "PERMISSIONS", schema = DB_SCHEMA) @NamedQueries({ + @NamedQuery(name = "Permission.findByCustomPermId", + query = "SELECT p FROM Permission p " + + "WHERE p.grantedPrivilege = :privilege " + + "AND p.grantee = :grantee " + + "AND p.object = :object") + , @NamedQuery(name = "Permission.existsForPrivilegeRoleObject", query = "SELECT COUNT(p) FROM Permission p " + "WHERE p.grantedPrivilege = :privilege " @@ -79,7 +85,7 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA; + "AND p.inherited = true") , @NamedQuery(name = "Permission.existsForPrivilegeAndRole", - query = "SELECT count(p) FROM Permission p " + query = "SELECT COUNT(p) FROM Permission p " + "WHERE p.grantedPrivilege = :privilege " + "AND p.grantee = :grantee " + "AND p.object IS NULL") diff --git a/ccm-core/src/main/java/org/libreccm/security/PermissionIdGenerator.java b/ccm-core/src/main/java/org/libreccm/security/PermissionIdGenerator.java index 34f062763..a6d441b8d 100644 --- a/ccm-core/src/main/java/org/libreccm/security/PermissionIdGenerator.java +++ b/ccm-core/src/main/java/org/libreccm/security/PermissionIdGenerator.java @@ -62,22 +62,15 @@ public class PermissionIdGenerator extends ObjectIdGenerator { final Permission permission = (Permission) forPojo; - String id = permission.getGrantedPrivilege() + - permission.getPermissionId(); - boolean a = false, b = false; - if (permission.getObject() != null) { - id += permission.getObject().getUuid(); - a = true; - } - if (permission.getGrantee() != null) { - id += permission.getGrantee().getName(); - b = true; + if (permission.getGrantee() == null && + permission.getObject() == null) { + throw new IllegalStateException(); } -// if (!(a || b)) { -// throw new IllegalStateException(); -// } - - return id; + return String.join("_", + permission.getGrantedPrivilege(), + String.valueOf(permission.getGrantee().getRoleId()), + String.valueOf(permission.getObject().getObjectId()) + ); } } diff --git a/ccm-core/src/main/java/org/libreccm/security/PermissionIdResolver.java b/ccm-core/src/main/java/org/libreccm/security/PermissionIdResolver.java index 58897b63c..8bc452a5b 100644 --- a/ccm-core/src/main/java/org/libreccm/security/PermissionIdResolver.java +++ b/ccm-core/src/main/java/org/libreccm/security/PermissionIdResolver.java @@ -20,12 +20,25 @@ package org.libreccm.security; import com.fasterxml.jackson.annotation.ObjectIdGenerator; import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.core.CcmObject; +import org.libreccm.core.CcmObjectRepository; +import org.libreccm.core.UnexpectedErrorException; + +import javax.inject.Inject; +import java.util.Optional; /** * @author grantee = roleRepository.findById(granteeId); + if (!grantee.isPresent()) { + throw new UnexpectedErrorException(String.format( + "Role with id \"%s\" was not found in the database," + + " but has been associated with a permission.", + granteeId)); + } + final Optional object = ccmObjectRepository.findObjectById + (objectId); + Optional permission = permissionRepository + .findByCustomPermId(privilege, + grantee.get(), + object.orElse(null)); + if (!permission.isPresent()) { + throw new UnexpectedErrorException(String.format( + "Permission with privilege \"%s\", grantee \"%s and " + + "object \"%s\" was not found in the database.", + privilege, grantee.toString(), object.toString())); + } + + return permission.get(); } @Override diff --git a/ccm-core/src/main/java/org/libreccm/security/PermissionRepository.java b/ccm-core/src/main/java/org/libreccm/security/PermissionRepository.java new file mode 100644 index 000000000..b913fd2f4 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/security/PermissionRepository.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2015 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.libreccm.security; + +import org.libreccm.core.AbstractEntityRepository; + +import javax.faces.bean.RequestScoped; +import javax.persistence.NoResultException; +import javax.persistence.TypedQuery; +import java.util.Optional; + +/** + * A repository class for {@link Permission}. + * + * @author findByCustomPermId(final String privilege, + final Role grantee, + final Object object) { + final TypedQuery query = getEntityManager().createNamedQuery( + "Permission.findByCustomPermId", Permission.class); + query.setParameter("privilege", privilege); + query.setParameter("grantee", grantee); + if (object != null) + query.setParameter("object", object); + + try { + return Optional.of(query.getSingleResult()); + } catch (NoResultException ex) { + return Optional.empty(); + } + } +} diff --git a/ccm-core/src/main/java/org/libreccm/security/RoleIdResolver.java b/ccm-core/src/main/java/org/libreccm/security/RoleIdResolver.java index 061cca93a..0d24841d1 100644 --- a/ccm-core/src/main/java/org/libreccm/security/RoleIdResolver.java +++ b/ccm-core/src/main/java/org/libreccm/security/RoleIdResolver.java @@ -21,11 +21,16 @@ package org.libreccm.security; import com.fasterxml.jackson.annotation.ObjectIdGenerator; import com.fasterxml.jackson.annotation.ObjectIdResolver; +import javax.inject.Inject; + /** * @author Tobias Osmers * @version created on 3/23/17 */ public class UserIdResolver implements ObjectIdResolver { + @Inject + private UserRepository userRepository; + @Override public void bindItem(final ObjectIdGenerator.IdKey id, final Object pojo) { @@ -36,8 +41,7 @@ public class UserIdResolver implements ObjectIdResolver { @Override public Object resolveId(final ObjectIdGenerator.IdKey id) { - // Find the user for the id (don't confuse that with the primary key!). - return null; + return userRepository.findByName(id.key.toString()); } @Override diff --git a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java index 0e0af38f0..bc2ebd821 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTask.java @@ -53,6 +53,10 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA; @Entity @Table(name = "WORKFLOW_ASSIGNABLE_TASKS", schema = DB_SCHEMA) @NamedQueries({ + @NamedQuery( + name = "AssignableTask.findByUuid", + query = "SELECT t FROM AssignableTask t WHERE t.uuid = :uuid") + , @NamedQuery( name = "AssignableTask.findLockedBy", query = "SELECT t FROM AssignableTask t WHERE t.lockingUser = :user") diff --git a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskIdResolver.java b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskIdResolver.java index c1bb90df4..84bf2618d 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskIdResolver.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskIdResolver.java @@ -21,11 +21,16 @@ package org.libreccm.workflow; import com.fasterxml.jackson.annotation.ObjectIdGenerator; import com.fasterxml.jackson.annotation.ObjectIdResolver; +import javax.inject.Inject; + /** * @author findEnabledTasksForWorkflow( final User user, final Workflow workflow) { final TypedQuery query = getEntityManager() diff --git a/ccm-core/src/main/java/org/libreccm/workflow/Task.java b/ccm-core/src/main/java/org/libreccm/workflow/Task.java index 5fa2b3771..fb5f41313 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/Task.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/Task.java @@ -71,6 +71,10 @@ import static org.libreccm.core.CoreConstants.DB_SCHEMA; "PMD.TooManyMethods", "PMD.AvoidDuplicateLiterals"}) @NamedQueries({ + @NamedQuery( + name = "Task.findByUuid", + query = "SELECT t FROM Task t WHERE t.uuid = :uuid") + , @NamedQuery( name = "Task.countUnfinishedAndActiveTasksForWorkflow", query = "SELECT COUNT(t) FROM Task t " diff --git a/ccm-core/src/main/java/org/libreccm/workflow/TaskIdResolver.java b/ccm-core/src/main/java/org/libreccm/workflow/TaskIdResolver.java index f48f4f587..dc1675636 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/TaskIdResolver.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/TaskIdResolver.java @@ -21,11 +21,16 @@ package org.libreccm.workflow; import com.fasterxml.jackson.annotation.ObjectIdGenerator; import com.fasterxml.jackson.annotation.ObjectIdResolver; +import javax.inject.Inject; + /** * @author