CCM NG/ccm-core: Fixed some LazyInitizationExceptions

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

View File

@ -33,6 +33,6 @@ public class ToolboxConstants {
} }
public static final String TOOLBOX_BUNDLE 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.bebop.table.TableModel;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.User; import org.libreccm.security.User;
import java.util.ArrayList; import java.util.ArrayList;
@ -32,8 +33,8 @@ import java.util.Set;
import static com.arsdigita.ui.admin.AdminUiConstants.*; 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> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
class GroupsRolesTableModel implements TableModel { class GroupsRolesTableModel implements TableModel {
@ -89,19 +90,13 @@ class GroupsRolesTableModel implements TableModel {
case COL_LABEL: case COL_LABEL:
return new Label(new GlobalizedMessage("ui.admin.user.groups", return new Label(new GlobalizedMessage("ui.admin.user.groups",
ADMIN_BUNDLE)); ADMIN_BUNDLE));
case COL_VALUE: case COL_VALUE: {
final List<String> groupNames = new ArrayList<>(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
user.getGroupMemberships().forEach(m -> { final UsersGroupsRolesController controller = cdiUtil
groupNames.add(m.getGroup().getName()); .findBean(UsersGroupsRolesController.class);
});
groupNames.sort((name1, name2) -> {
return name1.compareTo(name2);
});
return String.join(
", ", groupNames.toArray(new String[groupNames.size()]));
return controller.getNamesOfAssignedGroups(user);
}
case COL_ACTION: case COL_ACTION:
return new Label(new GlobalizedMessage( return new Label(new GlobalizedMessage(
"ui.admin.user.groups.edit", ADMIN_BUNDLE)); "ui.admin.user.groups.edit", ADMIN_BUNDLE));
@ -115,19 +110,13 @@ class GroupsRolesTableModel implements TableModel {
case COL_LABEL: case COL_LABEL:
return new Label(new GlobalizedMessage("ui.admin.user.roles", return new Label(new GlobalizedMessage("ui.admin.user.roles",
ADMIN_BUNDLE)); ADMIN_BUNDLE));
case COL_VALUE: case COL_VALUE: {
final List<String> roleNames = new ArrayList<>(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
user.getRoleMemberships().forEach(m -> { final UsersGroupsRolesController controller = cdiUtil
roleNames.add(m.getRole().getName()); .findBean(UsersGroupsRolesController.class);
});
roleNames.sort((name1, name2) -> {
return name1.compareTo(name2);
});
return String.join(
", ", roleNames.toArray(new String[roleNames.size()]));
return controller.getNamesOfAssignedGroups(user);
}
case COL_ACTION: case COL_ACTION:
return new Label(new GlobalizedMessage( return new Label(new GlobalizedMessage(
"ui.admin.user.roles.edit", ADMIN_BUNDLE)); "ui.admin.user.roles.edit", ADMIN_BUNDLE));
@ -141,26 +130,13 @@ class GroupsRolesTableModel implements TableModel {
case COL_LABEL: case COL_LABEL:
return new Label(new GlobalizedMessage( return new Label(new GlobalizedMessage(
"ui.admin.user.all_roles", ADMIN_BUNDLE)); "ui.admin.user.all_roles", ADMIN_BUNDLE));
case COL_VALUE: case COL_VALUE: {
final Set<String> roleNames = new HashSet<>(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
user.getRoleMemberships().forEach(m -> { final UsersGroupsRolesController controller = cdiUtil
roleNames.add(m.getRole().getName()); .findBean(UsersGroupsRolesController.class);
});
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()]));
return controller.getNamesOfAllAssignedRoles(user);
}
case COL_ACTION: case COL_ACTION:
return ""; return "";
default: 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.center();
userSelector.setWidth("80%");
UI.getCurrent().addWindow(userSelector); UI.getCurrent().addWindow(userSelector);
}); });
final HeaderCell membersGridHeaderCell = membersGridHeader final HeaderCell membersGridHeaderCell = membersGridHeader

View File

@ -30,7 +30,6 @@ import javax.inject.Inject;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
import javax.transaction.Transactional; import javax.transaction.Transactional;
@ -63,7 +62,8 @@ public class UserSelectorDataProvider extends AbstractDataProvider<User, String>
final Root<User> from = criteriaQuery.from(User.class); final Root<User> from = criteriaQuery.from(User.class);
criteriaQuery = criteriaQuery.select(builder.count(from)); criteriaQuery = criteriaQuery.select(builder.count(from));
criteriaQuery = criteriaQuery.distinct(true);
if (userNameFilter != null && !userNameFilter.trim().isEmpty()) { if (userNameFilter != null && !userNameFilter.trim().isEmpty()) {
criteriaQuery criteriaQuery
.where(builder.like(builder.lower(from.get("name")), .where(builder.like(builder.lower(from.get("name")),
@ -84,9 +84,10 @@ public class UserSelectorDataProvider extends AbstractDataProvider<User, String>
@Override @Override
public Stream<User> fetch(final Query<User, String> query) { public Stream<User> fetch(final Query<User, String> query) {
final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<User> criteriaQuery = builder CriteriaQuery<User> criteriaQuery = builder
.createQuery(User.class); .createQuery(User.class);
final Root<User> from = criteriaQuery.from(User.class); final Root<User> from = criteriaQuery.from(User.class);
criteriaQuery = criteriaQuery.distinct(true);
if (userNameFilter != null && !userNameFilter.trim().isEmpty()) { if (userNameFilter != null && !userNameFilter.trim().isEmpty()) {
criteriaQuery criteriaQuery

View File

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

View File

@ -132,16 +132,24 @@ public class WorkflowManager {
workflow.setName(name); workflow.setName(name);
final LocalizedString description = new LocalizedString(); final LocalizedString description = new LocalizedString();
template.getDescription().getValues().forEach( template
(locale, str) -> description.addValue(locale, str)); .getDescription()
.getValues()
.forEach((locale, str) -> description.addValue(locale, str));
workflow.setDescription(description); workflow.setDescription(description);
final Map<Long, Task> tasks = new HashMap<>(); final Map<Long, Task> tasks = new HashMap<>();
template.getTasks().forEach(taskTemplate -> createTask(taskTemplate, template
tasks)); .getTasks()
template.getTasks().forEach(taskTemplate -> fixTaskDependencies( .forEach(taskTemplate -> createTask(workflow, taskTemplate, tasks));
taskTemplate, tasks.get(taskTemplate.getTaskId()), tasks)); template
.getTasks()
.forEach(taskTemplate -> {
fixTaskDependencies(taskTemplate,
tasks.get(taskTemplate.getTaskId()),
tasks);
});
workflow.setObject(object); workflow.setObject(object);
workflow.setState(WorkflowState.INIT); workflow.setState(WorkflowState.INIT);
@ -161,7 +169,10 @@ public class WorkflowManager {
* @param template The template for the task from the workflow template. * @param template The template for the task from the workflow template.
* @param tasks A map for storing the new tasks. * @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 Class<? extends Task> templateClass = template.getClass();
final Task task; final Task task;
try { try {
@ -214,6 +225,8 @@ public class WorkflowManager {
throw new RuntimeException(); throw new RuntimeException();
} }
workflow.addTask(task);
task.setWorkflow(workflow);
tasks.put(template.getTaskId(), task); tasks.put(template.getTaskId(), task);
} }
} }