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 extends Task> 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);
}
}