CCM NG/ccm-core: Fixed some LazyInitizationExceptions

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4796 8810af33-2d31-482b-a856-94f89814c4df
jensp 2017-06-21 18:21:06 +00:00
parent 2438e125ad
commit b66556aabb
7 changed files with 170 additions and 58 deletions

View File

@ -33,6 +33,6 @@ public class ToolboxConstants {
}
public static final String TOOLBOX_BUNDLE
= "com.arsdigita.toolbox.ui.ToolboxResources";
= "com.arsdigita.toolbox.ToolboxResources";
}

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
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<String> 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<String> 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<String> 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<String> 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:

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@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<Role> 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(", "));
}
}

View File

@ -203,6 +203,7 @@ public class GroupDetails extends Window {
});
}));
userSelector.center();
userSelector.setWidth("80%");
UI.getCurrent().addWindow(userSelector);
});
final HeaderCell membersGridHeaderCell = membersGridHeader

View File

@ -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<User, String>
final Root<User> 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<User, String>
@Override
public Stream<User> fetch(final Query<User, String> query) {
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<User> criteriaQuery = builder
CriteriaQuery<User> criteriaQuery = builder
.createQuery(User.class);
final Root<User> from = criteriaQuery.from(User.class);
criteriaQuery = criteriaQuery.distinct(true);
if (userNameFilter != null && !userNameFilter.trim().isEmpty()) {
criteriaQuery

View File

@ -71,7 +71,7 @@ public class AssignableTaskRepository
final User user, final Workflow workflow) {
final TypedQuery<AssignableTask> 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<AssignableTask> query = getEntityManager()
.createNamedQuery(
"UserTask.findAssignedTasks", AssignableTask.class);
"AssignableTask.findAssignedTasks", AssignableTask.class);
final List<Role> roles = user.getRoleMemberships()
.stream()
.map(membership -> membership.getRole())

View File

@ -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<Long, Task> 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<Long, Task> tasks) {
private void createTask(final Workflow workflow,
final Task template,
final Map<Long, Task> 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);
}
}