From ba5e114ffe3458fd8657cd64fb7fc5aa6bda60e0 Mon Sep 17 00:00:00 2001 From: jensp Date: Tue, 27 Jun 2017 19:30:48 +0000 Subject: [PATCH] CCM NG/ccm-core: Some work for the Vaadin prototype git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4821 8810af33-2d31-482b-a856-94f89814c4df Former-commit-id: c101563f80c5e91801a2c6655869842f42bb7c8c --- .../ui/usersgroupsroles/GroupDetails.java | 9 +- .../GroupMembersController.java | 21 ++-- .../GroupMembersTableDataProvider.java | 35 +++--- .../GroupRolesController.java | 97 ++++++++++++++ .../GroupRolesTableDataProvider.java | 119 ++++++++++++++++++ .../admin/ui/usersgroupsroles/RoleEditor.java | 11 +- 6 files changed, 255 insertions(+), 37 deletions(-) create mode 100644 ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupRolesController.java create mode 100644 ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupRolesTableDataProvider.java 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 1111bff08..af624f4dc 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 @@ -48,10 +48,7 @@ import org.libreccm.security.GroupRepository; import org.libreccm.security.User; import org.libreccm.security.UserRepository; -import java.util.ArrayList; -import java.util.List; import java.util.ResourceBundle; -import java.util.stream.Collectors; /** * @@ -220,14 +217,12 @@ public class GroupDetails extends Window { dataProvider.setGroup(group); membersGrid.setDataProvider(dataProvider); + //ToDo Add roles grid + final TabSheet tabs = new TabSheet(); tabs.addTab(membersGrid, "Members"); tabs.addTab(new Label("Roles Placeholder"), "Roles"); -// final Panel membersPanel = new Panel("Members"); -// membersPanel.setContent(membersGrid); -// final VerticalLayout windowLayout = new VerticalLayout(propertiesPanel, -// membersPanel); final VerticalLayout windowLayout = new VerticalLayout(propertiesPanel, tabs); diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupMembersController.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupMembersController.java index 02040f310..35c1770d4 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupMembersController.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupMembersController.java @@ -47,20 +47,20 @@ class GroupMembersController { private GroupManager groupManager; @Transactional(Transactional.TxType.REQUIRED) - public void addMembersToGroup(final Set users, final Group group) { + protected void addMembersToGroup(final Set users, final Group group) { users.forEach(user -> addMemberToGroup(user, group)); } @Transactional(Transactional.TxType.REQUIRED) - public void addMemberToGroup(final User user, final Group group) { + protected void addMemberToGroup(final User user, final Group group) { final User theUser = userRepo .findById(user.getPartyId()) - .orElseThrow(() -> new IllegalArgumentException(String - .format("No user with id %d in the database. " - + "Where did that ID come from?", - user.getPartyId()))); + .orElseThrow(() -> new IllegalArgumentException( + String.format("No user with id %d in the database. " + + "Where did that ID come from?", + user.getPartyId()))); final Group theGroup = groupRepo .findById(group.getPartyId()) @@ -71,10 +71,10 @@ class GroupMembersController { groupManager.addMemberToGroup(theUser, theGroup); } - + @Transactional(Transactional.TxType.REQUIRED) - public void removeMemberFromGroup(final User member, final Group group) { - + protected void removeMemberFromGroup(final User member, final Group group) { + final User theMember = userRepo .findById(member.getPartyId()) .orElseThrow(() -> new IllegalArgumentException(String @@ -88,9 +88,8 @@ class GroupMembersController { .format("No group with id %d in the database. " + "Where did that ID come from?", group.getPartyId()))); - + groupManager.removeMemberFromGroup(theMember, theGroup); } - } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupMembersTableDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupMembersTableDataProvider.java index 62311fc09..e52d51243 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupMembersTableDataProvider.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupMembersTableDataProvider.java @@ -41,7 +41,7 @@ import javax.transaction.Transactional; * @author Jens Pelzetter */ @ViewScoped -public class GroupMembersTableDataProvider +class GroupMembersTableDataProvider extends AbstractDataProvider { private static final long serialVersionUID = -1924910843845830008L; @@ -56,8 +56,9 @@ public class GroupMembersTableDataProvider return false; } + @Transactional(Transactional.TxType.REQUIRED) @Override - public int size(Query query) { + public int size(final Query query) { Objects.requireNonNull(group, "This data provider needs to be initalized " @@ -81,7 +82,7 @@ public class GroupMembersTableDataProvider final Root from = criteriaQuery .from(GroupMembership.class); - + criteriaQuery = criteriaQuery.select(builder.count(from)); criteriaQuery.where(builder.equal(from.get("group"), group)); @@ -118,21 +119,21 @@ public class GroupMembersTableDataProvider // .stream(); final CriteriaQuery criteriaQuery = builder - .createQuery(GroupMembership.class); - final Root from = criteriaQuery + .createQuery(GroupMembership.class); + final Root from = criteriaQuery .from(GroupMembership.class); - final Join join = from.join("member"); - criteriaQuery - .where(builder.equal(from.get("group"), group)) - .orderBy(builder.asc(join.get("name"))); - - return entityManager - .createQuery(criteriaQuery) - .setMaxResults(query.getLimit()) - .setFirstResult(query.getOffset()) - .getResultList() - .stream() - .map(membership -> membership.getMember()); + final Join join = from.join("member"); + criteriaQuery + .where(builder.equal(from.get("group"), group)) + .orderBy(builder.asc(join.get("name"))); + + return entityManager + .createQuery(criteriaQuery) + .setMaxResults(query.getLimit()) + .setFirstResult(query.getOffset()) + .getResultList() + .stream() + .map(GroupMembership::getMember); } public void setGroup(final Group group) { diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupRolesController.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupRolesController.java new file mode 100644 index 000000000..cfcb9d739 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupRolesController.java @@ -0,0 +1,97 @@ +/* + * 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 org.libreccm.admin.ui.usersgroupsroles; + +import org.libreccm.security.Group; +import org.libreccm.security.GroupManager; +import org.libreccm.security.GroupRepository; +import org.libreccm.security.Role; +import org.libreccm.security.RoleManager; +import org.libreccm.security.RoleRepository; + +import java.util.Set; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +class GroupRolesController { + + @Inject + private RoleRepository roleRepo; + + @Inject + private RoleManager roleManager; + + @Inject + private GroupRepository groupRepo; + + @Inject + private GroupManager groupManager; + + @Transactional(Transactional.TxType.REQUIRED) + protected void assignRolesToGroup(final Set roles, final Group group) { + + roles.forEach(role -> assignRoleToGroup(role, group)); + } + + @Transactional(Transactional.TxType.REQUIRED) + protected void assignRoleToGroup(final Role role, final Group group) { + + final Role theRole = roleRepo + .findById(role.getRoleId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No Role with ID %d in the database.", + role.getRoleId()))); + + final Group theGroup = groupRepo + .findById(group.getPartyId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No group with id %d in the database. " + + "Where did that ID come from?", + group.getPartyId()))); + + roleManager.assignRoleToParty(theRole, theGroup); + } + + @Transactional(Transactional.TxType.REQUIRED) + protected void removeRoleFromGroup(final Role role, final Group group) { + + final Role theRole = roleRepo + .findById(role.getRoleId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No Role with ID %d in the database.", + role.getRoleId()))); + + final Group theGroup = groupRepo + .findById(group.getPartyId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No group with id %d in the database. " + + "Where did that ID come from?", + group.getPartyId()))); + + roleManager.removeRoleFromParty(theRole, theGroup); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupRolesTableDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupRolesTableDataProvider.java new file mode 100644 index 000000000..f755ac61b --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/GroupRolesTableDataProvider.java @@ -0,0 +1,119 @@ +/* + * 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 org.libreccm.admin.ui.usersgroupsroles; + +import com.vaadin.cdi.ViewScoped; +import com.vaadin.data.provider.AbstractDataProvider; +import com.vaadin.data.provider.Query; +import org.libreccm.security.Group; +import org.libreccm.security.Role; +import org.libreccm.security.RoleMembership; + +import java.util.Objects; +import java.util.stream.Stream; + +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@ViewScoped +class GroupRolesTableDataProvider + extends AbstractDataProvider { + + private static final long serialVersionUID = 7981493169013788121L; + + @Inject + private EntityManager entityManager; + + private Group group; + + @Override + public boolean isInMemory() { + return false; + } + + @Transactional(Transactional.TxType.REQUIRED) + @Override + public int size(Query query) { + + Objects.requireNonNull(group, + "This data provider needs to be initalized " + + "by calling setGroup(Group) before calling " + + "the count method."); + + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = builder + .createQuery(Long.class); + + final Root from = criteriaQuery + .from(RoleMembership.class); + + criteriaQuery + .select(builder.count(from)) + .where(builder.equal(from.get("member"), group)); + + return entityManager + .createQuery(criteriaQuery) + .getSingleResult() + .intValue(); + } + + @Transactional(Transactional.TxType.REQUIRED) + @Override + public Stream fetch(Query query) { + + Objects.requireNonNull(group, + "This data provider needs to be initalized " + + "by calling setGroup(Group) before calling " + + "the fetch method."); + + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + + final CriteriaQuery criteriaQuery = builder + .createQuery(RoleMembership.class); + final Root from = criteriaQuery + .from(RoleMembership.class); + final Join join = from.join("role"); + criteriaQuery + .where(builder.equal(from.get("member"), group)) + .orderBy(builder.asc(join.get("name"))); + + return entityManager + .createQuery(criteriaQuery) + .setMaxResults(query.getLimit()) + .setFirstResult(query.getOffset()) + .getResultList() + .stream() + .map(RoleMembership::getRole); + } + + public void setGroup(final Group group) { + Objects.requireNonNull(group); + this.group = group; + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/RoleEditor.java b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/RoleEditor.java index ae4d2249c..feea5eed6 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/RoleEditor.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/usersgroupsroles/RoleEditor.java @@ -131,9 +131,16 @@ public class RoleEditor extends Window { // } if (role != null) { roleName.setValue(role.getName()); - roleDescription.setValue(role + final String description = role .getDescription() - .getValue(UI.getCurrent().getLocale())); + .getValue(UI.getCurrent().getLocale()); + if (description == null) { + roleDescription.setValue(""); + } else { + roleDescription.setValue(role + .getDescription() + .getValue(UI.getCurrent().getLocale())); + } } setContent(layout);