From 98b2ad2d907dcf7e2b7cd4df7ec12c548aa7e587 Mon Sep 17 00:00:00 2001 From: jensp Date: Wed, 21 Jun 2017 18:21:06 +0000 Subject: [PATCH] CCM NG/ccm-core: Fixed some LazyInitizationExceptions git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4796 8810af33-2d31-482b-a856-94f89814c4df Former-commit-id: b66556aabb5d0772788b1b56b62ef712359c247c --- .../arsdigita/toolbox/ToolboxConstants.java | 2 +- .../users/GroupsRolesTableModel.java | 66 +++------- .../users/UsersGroupsRolesController.java | 121 ++++++++++++++++++ .../ui/usersgroupsroles/GroupDetails.java | 1 + .../UserSelectorDataProvider.java | 7 +- .../workflow/AssignableTaskRepository.java | 4 +- .../libreccm/workflow/WorkflowManager.java | 27 +++- 7 files changed, 170 insertions(+), 58 deletions(-) create mode 100644 ccm-core/src/main/java/com/arsdigita/ui/admin/usersgroupsroles/users/UsersGroupsRolesController.java diff --git a/ccm-core/src/main/java/com/arsdigita/toolbox/ToolboxConstants.java b/ccm-core/src/main/java/com/arsdigita/toolbox/ToolboxConstants.java index b21881c11..204407118 100644 --- a/ccm-core/src/main/java/com/arsdigita/toolbox/ToolboxConstants.java +++ b/ccm-core/src/main/java/com/arsdigita/toolbox/ToolboxConstants.java @@ -33,6 +33,6 @@ public class ToolboxConstants { } public static final String TOOLBOX_BUNDLE - = "com.arsdigita.toolbox.ui.ToolboxResources"; + = "com.arsdigita.toolbox.ToolboxResources"; } diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/usersgroupsroles/users/GroupsRolesTableModel.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/usersgroupsroles/users/GroupsRolesTableModel.java index 8a5d68848..37c638323 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/usersgroupsroles/users/GroupsRolesTableModel.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/usersgroupsroles/users/GroupsRolesTableModel.java @@ -22,6 +22,7 @@ import com.arsdigita.bebop.Label; import com.arsdigita.bebop.table.TableModel; import com.arsdigita.globalization.GlobalizedMessage; +import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.security.User; import java.util.ArrayList; @@ -32,8 +33,8 @@ import java.util.Set; import static com.arsdigita.ui.admin.AdminUiConstants.*; /** - * Model for the {@link GroupsRolesTable}. - * + * Model for the {@link GroupsRolesTable}. + * * @author Jens Pelzetter */ class GroupsRolesTableModel implements TableModel { @@ -89,19 +90,13 @@ class GroupsRolesTableModel implements TableModel { case COL_LABEL: return new Label(new GlobalizedMessage("ui.admin.user.groups", ADMIN_BUNDLE)); - case COL_VALUE: - final List groupNames = new ArrayList<>(); - user.getGroupMemberships().forEach(m -> { - groupNames.add(m.getGroup().getName()); - }); - - groupNames.sort((name1, name2) -> { - return name1.compareTo(name2); - }); - - return String.join( - ", ", groupNames.toArray(new String[groupNames.size()])); + case COL_VALUE: { + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final UsersGroupsRolesController controller = cdiUtil + .findBean(UsersGroupsRolesController.class); + return controller.getNamesOfAssignedGroups(user); + } case COL_ACTION: return new Label(new GlobalizedMessage( "ui.admin.user.groups.edit", ADMIN_BUNDLE)); @@ -115,19 +110,13 @@ class GroupsRolesTableModel implements TableModel { case COL_LABEL: return new Label(new GlobalizedMessage("ui.admin.user.roles", ADMIN_BUNDLE)); - case COL_VALUE: - final List roleNames = new ArrayList<>(); - user.getRoleMemberships().forEach(m -> { - roleNames.add(m.getRole().getName()); - }); - - roleNames.sort((name1, name2) -> { - return name1.compareTo(name2); - }); - - return String.join( - ", ", roleNames.toArray(new String[roleNames.size()])); + case COL_VALUE: { + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final UsersGroupsRolesController controller = cdiUtil + .findBean(UsersGroupsRolesController.class); + return controller.getNamesOfAssignedGroups(user); + } case COL_ACTION: return new Label(new GlobalizedMessage( "ui.admin.user.roles.edit", ADMIN_BUNDLE)); @@ -141,26 +130,13 @@ class GroupsRolesTableModel implements TableModel { case COL_LABEL: return new Label(new GlobalizedMessage( "ui.admin.user.all_roles", ADMIN_BUNDLE)); - case COL_VALUE: - final Set roleNames = new HashSet<>(); - user.getRoleMemberships().forEach(m -> { - roleNames.add(m.getRole().getName()); - }); - - user.getGroupMemberships().forEach(m -> { - m.getGroup().getRoleMemberships().forEach(r -> { - roleNames.add(r.getRole().getName()); - }); - }); - - final List allRoleNames = new ArrayList<>(roleNames); - allRoleNames.sort((name1, name2) -> { - return name1.compareTo(name2); - }); - - return String.join(", ", allRoleNames.toArray( - new String[allRoleNames.size()])); + case COL_VALUE: { + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final UsersGroupsRolesController controller = cdiUtil + .findBean(UsersGroupsRolesController.class); + return controller.getNamesOfAllAssignedRoles(user); + } case COL_ACTION: return ""; default: diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/usersgroupsroles/users/UsersGroupsRolesController.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/usersgroupsroles/users/UsersGroupsRolesController.java new file mode 100644 index 000000000..2f79d7b95 --- /dev/null +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/usersgroupsroles/users/UsersGroupsRolesController.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2017 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 com.arsdigita.ui.admin.usersgroupsroles.users; + +import org.libreccm.security.Group; +import org.libreccm.security.GroupMembership; +import org.libreccm.security.Role; +import org.libreccm.security.RoleMembership; +import org.libreccm.security.User; +import org.libreccm.security.UserRepository; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +class UsersGroupsRolesController { + + @Inject + private UserRepository userRepo; + + @Transactional(Transactional.TxType.REQUIRED) + protected String getNamesOfAssignedGroups(final User user) { + + final User theUser = userRepo + .findById(user.getPartyId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No User with ID %d in the database.", + user.getPartyId()))); + + return theUser + .getGroupMemberships() + .stream() + .map(GroupMembership::getGroup) + .map(Group::getName) + .sorted((name1, name2) -> name1.compareTo(name2)) + .collect(Collectors.joining(", ")); + } + + @Transactional(Transactional.TxType.REQUIRED) + public String getNamesOfAssignedRoles(final User user) { + + final User theUser = userRepo + .findById(user.getPartyId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No User with ID %d in the database.", + user.getPartyId()))); + + return theUser + .getRoleMemberships() + .stream() + .map(RoleMembership::getRole) + .map(Role::getName) + .sorted((name1, name2) -> name1.compareTo(name2)) + .collect(Collectors.joining(", ")); + + } + + @Transactional(Transactional.TxType.REQUIRED) + public String getNamesOfAllAssignedRoles(final User user) { + + final User theUser = userRepo + .findById(user.getPartyId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No User with ID %d in the database.", + user.getPartyId()))); + + final Set rolesFromGroups = new HashSet<>(); + theUser + .getGroupMemberships() + .stream() + .map(GroupMembership::getGroup) + .forEach(group -> { + group + .getRoleMemberships() + .stream() + .map(RoleMembership::getRole) + .forEach(role -> rolesFromGroups.add(role)); + }); + + return Stream.concat( + theUser + .getRoleMemberships() + .stream() + .map(RoleMembership::getRole) + .map(Role::getName), + rolesFromGroups + .stream() + .map(Role::getName) + .sorted((name1, name2) -> name1.compareTo(name2))) + .collect(Collectors.joining(", ")); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupDetails.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupDetails.java index ba342ce02..1111bff08 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupDetails.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupDetails.java @@ -203,6 +203,7 @@ public class GroupDetails extends Window { }); })); userSelector.center(); + userSelector.setWidth("80%"); UI.getCurrent().addWindow(userSelector); }); final HeaderCell membersGridHeaderCell = membersGridHeader diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UserSelectorDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UserSelectorDataProvider.java index 550789e40..14d69c4ba 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UserSelectorDataProvider.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/UserSelectorDataProvider.java @@ -30,7 +30,6 @@ import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Expression; import javax.persistence.criteria.Root; import javax.transaction.Transactional; @@ -63,7 +62,8 @@ public class UserSelectorDataProvider extends AbstractDataProvider final Root from = criteriaQuery.from(User.class); criteriaQuery = criteriaQuery.select(builder.count(from)); - + criteriaQuery = criteriaQuery.distinct(true); + if (userNameFilter != null && !userNameFilter.trim().isEmpty()) { criteriaQuery .where(builder.like(builder.lower(from.get("name")), @@ -84,9 +84,10 @@ public class UserSelectorDataProvider extends AbstractDataProvider @Override public Stream fetch(final Query query) { final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); - final CriteriaQuery criteriaQuery = builder + CriteriaQuery criteriaQuery = builder .createQuery(User.class); final Root from = criteriaQuery.from(User.class); + criteriaQuery = criteriaQuery.distinct(true); if (userNameFilter != null && !userNameFilter.trim().isEmpty()) { criteriaQuery diff --git a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java index 4c35189a0..7b8af11d0 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/AssignableTaskRepository.java @@ -71,7 +71,7 @@ public class AssignableTaskRepository final User user, final Workflow workflow) { final TypedQuery query = getEntityManager() .createNamedQuery( - "UserTask.findEnabledTasksForWorkflow", AssignableTask.class); + "AssignableTask.findEnabledTasksForWorkflow", AssignableTask.class); query.setParameter("user", user); query.setParameter("workflow", workflow); @@ -82,7 +82,7 @@ public class AssignableTaskRepository final Workflow workflow) { final TypedQuery query = getEntityManager() .createNamedQuery( - "UserTask.findAssignedTasks", AssignableTask.class); + "AssignableTask.findAssignedTasks", AssignableTask.class); final List roles = user.getRoleMemberships() .stream() .map(membership -> membership.getRole()) diff --git a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java index d920792c7..e5c0a4b5c 100644 --- a/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java +++ b/ccm-core/src/main/java/org/libreccm/workflow/WorkflowManager.java @@ -132,16 +132,24 @@ public class WorkflowManager { workflow.setName(name); final LocalizedString description = new LocalizedString(); - template.getDescription().getValues().forEach( - (locale, str) -> description.addValue(locale, str)); + template + .getDescription() + .getValues() + .forEach((locale, str) -> description.addValue(locale, str)); workflow.setDescription(description); final Map tasks = new HashMap<>(); - template.getTasks().forEach(taskTemplate -> createTask(taskTemplate, - tasks)); - template.getTasks().forEach(taskTemplate -> fixTaskDependencies( - taskTemplate, tasks.get(taskTemplate.getTaskId()), tasks)); + template + .getTasks() + .forEach(taskTemplate -> createTask(workflow, taskTemplate, tasks)); + template + .getTasks() + .forEach(taskTemplate -> { + fixTaskDependencies(taskTemplate, + tasks.get(taskTemplate.getTaskId()), + tasks); + }); workflow.setObject(object); workflow.setState(WorkflowState.INIT); @@ -161,7 +169,10 @@ public class WorkflowManager { * @param template The template for the task from the workflow template. * @param tasks A map for storing the new tasks. */ - private void createTask(final Task template, final Map tasks) { + private void createTask(final Workflow workflow, + final Task template, + final Map tasks) { + final Class templateClass = template.getClass(); final Task task; try { @@ -214,6 +225,8 @@ public class WorkflowManager { throw new RuntimeException(); } + workflow.addTask(task); + task.setWorkflow(workflow); tasks.put(template.getTaskId(), task); } }