CCM NG/ccm-core: Fixed Role#hashCode and Role#equals which were giving inconsitent results due to use of lazily fetched attribute.
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4864 8810af33-2d31-482b-a856-94f89814c4dfpull/2/head
parent
4a2cadf628
commit
453c133ce0
|
|
@ -77,6 +77,7 @@ public class LoginView extends CustomComponent implements View {
|
||||||
|
|
||||||
formLayout = new FormLayout();
|
formLayout = new FormLayout();
|
||||||
formLayout.setSizeFull();
|
formLayout.setSizeFull();
|
||||||
|
formLayout.setMargin(true);
|
||||||
|
|
||||||
userName = new TextField();
|
userName = new TextField();
|
||||||
userName.setCaption("User name");
|
userName.setCaption("User name");
|
||||||
|
|
@ -126,7 +127,6 @@ public class LoginView extends CustomComponent implements View {
|
||||||
// submitButton.removeClickShortcut();
|
// submitButton.removeClickShortcut();
|
||||||
// }
|
// }
|
||||||
// });
|
// });
|
||||||
|
|
||||||
password.addFocusListener(event -> {
|
password.addFocusListener(event -> {
|
||||||
submitButton.setClickShortcut(ShortcutAction.KeyCode.ENTER);
|
submitButton.setClickShortcut(ShortcutAction.KeyCode.ENTER);
|
||||||
});
|
});
|
||||||
|
|
@ -136,15 +136,13 @@ public class LoginView extends CustomComponent implements View {
|
||||||
|
|
||||||
loginPanel = new Panel("Login", formLayout);
|
loginPanel = new Panel("Login", formLayout);
|
||||||
|
|
||||||
loginPanel.setWidth(
|
loginPanel.setWidth("24em");
|
||||||
"24em");
|
|
||||||
|
|
||||||
final VerticalLayout viewLayout = new VerticalLayout(loginPanel);
|
final VerticalLayout viewLayout = new VerticalLayout(loginPanel);
|
||||||
|
|
||||||
viewLayout.setComponentAlignment(loginPanel, Alignment.MIDDLE_CENTER);
|
viewLayout.setComponentAlignment(loginPanel, Alignment.MIDDLE_CENTER);
|
||||||
|
|
||||||
setCompositionRoot(viewLayout);
|
super.setCompositionRoot(viewLayout);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
|
|
|
||||||
|
|
@ -275,7 +275,7 @@ public class GroupDetails extends Window {
|
||||||
final TabSheet tabs = new TabSheet();
|
final TabSheet tabs = new TabSheet();
|
||||||
tabs.addTab(membersGrid, "Members");
|
tabs.addTab(membersGrid, "Members");
|
||||||
tabs.addTab(rolesGrid, "Roles");
|
tabs.addTab(rolesGrid, "Roles");
|
||||||
|
|
||||||
final VerticalLayout windowLayout = new VerticalLayout(propertiesPanel,
|
final VerticalLayout windowLayout = new VerticalLayout(propertiesPanel,
|
||||||
tabs);
|
tabs);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,8 @@ public class GroupSelectorDataProvider extends AbstractDataProvider<Group, Strin
|
||||||
criteriaQuery.where(builder.not(from.in(excludedGroups)));
|
criteriaQuery.where(builder.not(from.in(excludedGroups)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
criteriaQuery.orderBy(builder.asc(from.get("name")));
|
||||||
|
|
||||||
return entityManager
|
return entityManager
|
||||||
.createQuery(criteriaQuery)
|
.createQuery(criteriaQuery)
|
||||||
.setMaxResults(query.getLimit())
|
.setMaxResults(query.getLimit())
|
||||||
|
|
|
||||||
|
|
@ -18,23 +18,19 @@
|
||||||
*/
|
*/
|
||||||
package org.libreccm.admin.ui.usersgroupsroles;
|
package org.libreccm.admin.ui.usersgroupsroles;
|
||||||
|
|
||||||
import com.arsdigita.ui.admin.AdminUiConstants;
|
|
||||||
|
|
||||||
import com.vaadin.icons.VaadinIcons;
|
import com.vaadin.icons.VaadinIcons;
|
||||||
import com.vaadin.ui.Button;
|
import com.vaadin.ui.Button;
|
||||||
|
|
||||||
import com.vaadin.ui.Grid;
|
import com.vaadin.ui.Grid;
|
||||||
import com.vaadin.ui.HorizontalLayout;
|
import com.vaadin.ui.HorizontalLayout;
|
||||||
import com.vaadin.ui.UI;
|
|
||||||
import com.vaadin.ui.Window;
|
import com.vaadin.ui.Window;
|
||||||
import com.vaadin.ui.components.grid.HeaderCell;
|
import com.vaadin.ui.components.grid.HeaderCell;
|
||||||
import com.vaadin.ui.components.grid.HeaderRow;
|
import com.vaadin.ui.components.grid.HeaderRow;
|
||||||
import com.vaadin.ui.themes.ValoTheme;
|
import com.vaadin.ui.themes.ValoTheme;
|
||||||
import org.libreccm.cdi.utils.CdiUtil;
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
import org.libreccm.security.Role;
|
import org.libreccm.security.Role;
|
||||||
import org.libreccm.security.RoleRepository;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ResourceBundle;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -42,25 +38,16 @@ import java.util.ResourceBundle;
|
||||||
*/
|
*/
|
||||||
public class RoleSelector extends Window {
|
public class RoleSelector extends Window {
|
||||||
|
|
||||||
private static final long serialVersionUID = -1437536052155383270L;
|
private static final long serialVersionUID = -6893510634359633368L;
|
||||||
|
|
||||||
private static final String COL_NAME = "rolename";
|
private static final String COL_NAME = "rolename";
|
||||||
private static final String COL_OTHER = "other";
|
|
||||||
|
|
||||||
private final RoleRepository roleRepo;
|
|
||||||
|
|
||||||
private final RoleSelectionAction roleSelectionAction;
|
|
||||||
|
|
||||||
public RoleSelector(final String caption,
|
public RoleSelector(final String caption,
|
||||||
final String actionLabel,
|
final String actionLabel,
|
||||||
final UsersGroupsRoles usersGroupsRoles,
|
final UsersGroupsRoles usersGroupsRoles,
|
||||||
final List<Role> excludedRoles,
|
final List<Role> excludedRoles,
|
||||||
final RoleSelectionAction action) {
|
final RoleSelectionAction action) {
|
||||||
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
|
||||||
roleRepo = cdiUtil.findBean(RoleRepository.class);
|
|
||||||
this.roleSelectionAction = action;
|
|
||||||
|
|
||||||
addWidgets(caption, actionLabel, excludedRoles, action);
|
addWidgets(caption, actionLabel, excludedRoles, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -71,9 +58,9 @@ public class RoleSelector extends Window {
|
||||||
|
|
||||||
setCaption(caption);
|
setCaption(caption);
|
||||||
|
|
||||||
final ResourceBundle bundle = ResourceBundle
|
// final ResourceBundle bundle = ResourceBundle
|
||||||
.getBundle(AdminUiConstants.ADMIN_BUNDLE,
|
// .getBundle(AdminUiConstants.ADMIN_BUNDLE,
|
||||||
UI.getCurrent().getLocale());
|
// UI.getCurrent().getLocale());
|
||||||
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
|
|
||||||
|
|
@ -82,10 +69,6 @@ public class RoleSelector extends Window {
|
||||||
.addColumn(Role::getName)
|
.addColumn(Role::getName)
|
||||||
.setId(COL_NAME)
|
.setId(COL_NAME)
|
||||||
.setCaption("Role");
|
.setCaption("Role");
|
||||||
rolesGrid
|
|
||||||
.addColumn(role -> " ")
|
|
||||||
.setId(COL_OTHER)
|
|
||||||
.setCaption(" ");
|
|
||||||
|
|
||||||
rolesGrid.setSelectionMode(Grid.SelectionMode.MULTI);
|
rolesGrid.setSelectionMode(Grid.SelectionMode.MULTI);
|
||||||
rolesGrid.setWidth("100%");
|
rolesGrid.setWidth("100%");
|
||||||
|
|
@ -95,7 +78,6 @@ public class RoleSelector extends Window {
|
||||||
action.action(rolesGrid.getSelectedItems());
|
action.action(rolesGrid.getSelectedItems());
|
||||||
close();
|
close();
|
||||||
});
|
});
|
||||||
|
|
||||||
actionButton.setIcon(VaadinIcons.PLUS_CIRCLE_O);
|
actionButton.setIcon(VaadinIcons.PLUS_CIRCLE_O);
|
||||||
actionButton.setStyleName(ValoTheme.BUTTON_TINY);
|
actionButton.setStyleName(ValoTheme.BUTTON_TINY);
|
||||||
|
|
||||||
|
|
@ -107,14 +89,13 @@ public class RoleSelector extends Window {
|
||||||
clearButton.setStyleName(ValoTheme.BUTTON_TINY);
|
clearButton.setStyleName(ValoTheme.BUTTON_TINY);
|
||||||
|
|
||||||
final HeaderRow actions = rolesGrid.prependHeaderRow();
|
final HeaderRow actions = rolesGrid.prependHeaderRow();
|
||||||
final HeaderCell actionsCell = actions.join(COL_NAME,
|
final HeaderCell actionsCell = actions.getCell(COL_NAME);
|
||||||
COL_OTHER);
|
|
||||||
actionsCell.setComponent(new HorizontalLayout(actionButton,
|
actionsCell.setComponent(new HorizontalLayout(actionButton,
|
||||||
clearButton));
|
clearButton));
|
||||||
|
|
||||||
final RoleSelectorDataProvider dataProvider = cdiUtil
|
final RoleSelectorDataProvider dataProvider = cdiUtil
|
||||||
.findBean(RoleSelectorDataProvider.class);
|
.findBean(RoleSelectorDataProvider.class);
|
||||||
|
|
||||||
dataProvider.setExcludedRoles(excludedRoles);
|
dataProvider.setExcludedRoles(excludedRoles);
|
||||||
|
|
||||||
rolesGrid.setDataProvider(dataProvider);
|
rolesGrid.setDataProvider(dataProvider);
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ import javax.transaction.Transactional;
|
||||||
@ViewScoped
|
@ViewScoped
|
||||||
public class RoleSelectorDataProvider extends AbstractDataProvider<Role, String> {
|
public class RoleSelectorDataProvider extends AbstractDataProvider<Role, String> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 3915041291561733758L;
|
private static final long serialVersionUID = 6142912046579055420L;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private EntityManager entityManager;
|
private EntityManager entityManager;
|
||||||
|
|
@ -58,25 +58,24 @@ public class RoleSelectorDataProvider extends AbstractDataProvider<Role, String>
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
@Override
|
@Override
|
||||||
public int size(final Query<Role, String> query) {
|
public int size(final Query<Role, String> query) {
|
||||||
|
|
||||||
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
|
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
|
||||||
final CriteriaQuery<Long> criteriaQuery = builder
|
final CriteriaQuery<Long> criteriaQuery = builder
|
||||||
.createQuery(Long.class);
|
.createQuery(Long.class);
|
||||||
final Root<Role> from = criteriaQuery.from(Role.class);
|
final Root<Role> from = criteriaQuery.from(Role.class);
|
||||||
|
criteriaQuery.select(builder.count(from));
|
||||||
criteriaQuery
|
criteriaQuery.distinct(true);
|
||||||
.select(builder.count(from))
|
|
||||||
.distinct(true);
|
|
||||||
|
|
||||||
if (roleNameFilter != null && !roleNameFilter.trim().isEmpty()) {
|
if (roleNameFilter != null && !roleNameFilter.trim().isEmpty()) {
|
||||||
criteriaQuery
|
criteriaQuery
|
||||||
.where(builder.like(builder.lower(from.get("name")),
|
.where(builder.like(builder.lower(from.get("name")),
|
||||||
String.format("%s%%", roleNameFilter)));
|
String.format("%s%%", roleNameFilter)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (excludedRoles != null && !excludedRoles.isEmpty()) {
|
if (excludedRoles != null && !excludedRoles.isEmpty()) {
|
||||||
criteriaQuery.where(builder.not(from.in(excludedRoles)));
|
criteriaQuery.where(builder.not(from.in(excludedRoles)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return entityManager
|
return entityManager
|
||||||
.createQuery(criteriaQuery)
|
.createQuery(criteriaQuery)
|
||||||
.getSingleResult()
|
.getSingleResult()
|
||||||
|
|
@ -86,25 +85,25 @@ public class RoleSelectorDataProvider extends AbstractDataProvider<Role, String>
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
@Override
|
@Override
|
||||||
public Stream<Role> fetch(final Query<Role, String> query) {
|
public Stream<Role> fetch(final Query<Role, String> query) {
|
||||||
|
|
||||||
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
|
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
|
||||||
final CriteriaQuery<Role> criteriaQuery = builder
|
final CriteriaQuery<Role> criteriaQuery = builder
|
||||||
.createQuery(Role.class);
|
.createQuery(Role.class);
|
||||||
final Root<Role> from = criteriaQuery.from(Role.class);
|
final Root<Role> from = criteriaQuery.from(Role.class);
|
||||||
|
|
||||||
criteriaQuery.distinct(true);
|
criteriaQuery.distinct(true);
|
||||||
|
|
||||||
if (roleNameFilter != null && !roleNameFilter.trim().isEmpty()) {
|
if (roleNameFilter != null && !roleNameFilter.trim().isEmpty()) {
|
||||||
criteriaQuery
|
criteriaQuery
|
||||||
.where(builder.like(builder.lower(from.get("name")),
|
.where(builder.like(builder.lower(from.get("name")),
|
||||||
String.format("%s%%", roleNameFilter)));
|
String.format("%s%%", roleNameFilter)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (excludedRoles != null && !excludedRoles.isEmpty()) {
|
if (excludedRoles != null && !excludedRoles.isEmpty()) {
|
||||||
criteriaQuery.where(builder.not(from.in(excludedRoles)));
|
criteriaQuery.where(builder.not(from.in(excludedRoles)));
|
||||||
}
|
}
|
||||||
|
|
||||||
criteriaQuery.orderBy(builder.asc(from.get("name")));
|
criteriaQuery.orderBy(builder.asc(from.get("name")));
|
||||||
|
|
||||||
return entityManager
|
return entityManager
|
||||||
.createQuery(criteriaQuery)
|
.createQuery(criteriaQuery)
|
||||||
.setMaxResults(query.getLimit())
|
.setMaxResults(query.getLimit())
|
||||||
|
|
@ -112,14 +111,15 @@ public class RoleSelectorDataProvider extends AbstractDataProvider<Role, String>
|
||||||
.getResultList()
|
.getResultList()
|
||||||
.stream();
|
.stream();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRoleNameFilter(final String roleNameFilter) {
|
public void setRoleNameFilter(final String roleNameFilter) {
|
||||||
this.roleNameFilter = roleNameFilter;
|
this.roleNameFilter = roleNameFilter;
|
||||||
refreshAll();
|
// refreshAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setExcludedRoles(final List<Role> excluededRoles) {
|
public void setExcludedRoles(final List<Role> excludedRoles) {
|
||||||
this.excludedRoles = new ArrayList<>(excluededRoles);
|
this.excludedRoles = new ArrayList<>(excludedRoles);
|
||||||
refreshAll();
|
// refreshAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -299,7 +299,7 @@ public class Role implements Serializable, Portable {
|
||||||
int hash = 7;
|
int hash = 7;
|
||||||
hash = 53 * hash + (int) (roleId ^ (roleId >>> 32));
|
hash = 53 * hash + (int) (roleId ^ (roleId >>> 32));
|
||||||
hash = 53 * hash + Objects.hashCode(name);
|
hash = 53 * hash + Objects.hashCode(name);
|
||||||
hash = 53 * hash + Objects.hashCode(permissions);
|
// hash = 53 * hash + Objects.hashCode(permissions);
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -319,10 +319,12 @@ public class Role implements Serializable, Portable {
|
||||||
if (roleId != other.getRoleId()) {
|
if (roleId != other.getRoleId()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!Objects.equals(name, other.getName())) {
|
|
||||||
return false;
|
return Objects.equals(name, other.getName());
|
||||||
}
|
// if (!Objects.equals(name, other.getName())) {
|
||||||
return Objects.equals(permissions, other.getPermissions());
|
// return false;
|
||||||
|
// }
|
||||||
|
// return Objects.equals(permissions, other.getPermissions());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canEqual(final Object obj) {
|
public boolean canEqual(final Object obj) {
|
||||||
|
|
|
||||||
|
|
@ -612,3 +612,4 @@ ui.admin.importexport.import.current_status=Import current status
|
||||||
ui.admin.importexport.import.report=Report from last import process
|
ui.admin.importexport.import.report=Report from last import process
|
||||||
ui.groups.roles.remove=Remove
|
ui.groups.roles.remove=Remove
|
||||||
ui.user.groups.remove=Remove
|
ui.user.groups.remove=Remove
|
||||||
|
ui.user.roles.remove=Remove
|
||||||
|
|
|
||||||
|
|
@ -616,3 +616,4 @@ ui.admin.importexport.import.current_status=Aktueller Status des Import-Prozesse
|
||||||
ui.admin.importexport.import.report=Bericht des letzten Import-Prozesses
|
ui.admin.importexport.import.report=Bericht des letzten Import-Prozesses
|
||||||
ui.groups.roles.remove=Entfernen
|
ui.groups.roles.remove=Entfernen
|
||||||
ui.user.groups.remove=Entfernen
|
ui.user.groups.remove=Entfernen
|
||||||
|
ui.user.roles.remove=Entfernen
|
||||||
|
|
|
||||||
|
|
@ -609,3 +609,4 @@ ui.admin.importexport.import.current_status=Import current status
|
||||||
ui.admin.importexport.import.report=Report from last import process
|
ui.admin.importexport.import.report=Report from last import process
|
||||||
ui.groups.roles.remove=Remove
|
ui.groups.roles.remove=Remove
|
||||||
ui.user.groups.remove=Remove
|
ui.user.groups.remove=Remove
|
||||||
|
ui.user.roles.remove=Remove
|
||||||
|
|
|
||||||
|
|
@ -600,3 +600,4 @@ ui.admin.importexport.import.current_status=Import current status
|
||||||
ui.admin.importexport.import.report=Report from last import process
|
ui.admin.importexport.import.report=Report from last import process
|
||||||
ui.groups.roles.remove=Remove
|
ui.groups.roles.remove=Remove
|
||||||
ui.user.groups.remove=Remove
|
ui.user.groups.remove=Remove
|
||||||
|
ui.user.roles.remove=Remove
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue