Skip to content

Commit

Permalink
MID-3938, step 2: when editing a user, we delay fetching of all user'…
Browse files Browse the repository at this point in the history
…s assignment targets until really necessary
  • Loading branch information
mederly committed May 26, 2017
1 parent 1e0cd21 commit 3f53f89
Show file tree
Hide file tree
Showing 10 changed files with 170 additions and 113 deletions.
@@ -0,0 +1,51 @@
/*
* Copyright (c) 2010-2017 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.evolveum.midpoint.gui.api.model;

import java.util.List;

/**
* A loadable model of a list that knows how to provide count of list items without having to retrieve the actual data.
* Useful e.g. to implement MID-3938 (Optimize midPoint for many focus assignments).
*
* @author mederly
*/
public abstract class CountableLoadableModel<T> extends LoadableModel<List<T>> {

public CountableLoadableModel() {
}

public CountableLoadableModel(boolean alwaysReload) {
super(alwaysReload);
}

public int count() {
if (isLoaded()) {
List<T> object = getObject();
return object != null ? object.size() : 0;
} else {
return countInternal();
}
}

// This should be overridden to provide more efficient implementation, avoiding full loading of objects
public int countInternal() {
List<T> object = getObject();
return object != null ? object.size() : 0;
}

}
Expand Up @@ -142,16 +142,15 @@ public class AssignmentEditorPanel extends BasePanel<AssignmentEditorDto> {
private IModel<List<ACAttributeDto>> attributesModel;
protected WebMarkupContainer headerRow;
protected PageBase pageBase;
protected List<AssignmentsPreviewDto> privilegesList;
protected IModel<List<AssignmentsPreviewDto>> privilegesListModel;
protected boolean delegatedToMe;
private LoadableModel<ItemSecurityDecisions> decisionsModel;

public AssignmentEditorPanel(String id, IModel<AssignmentEditorDto> model, boolean delegatedToMe,
List<AssignmentsPreviewDto> privilegesList,
PageBase pageBase) {
LoadableModel<List<AssignmentsPreviewDto>> privilegesListModel, PageBase pageBase) {
super(id, model);
this.pageBase = pageBase;
this.privilegesList = privilegesList;
this.privilegesListModel = privilegesListModel;
this.delegatedToMe = delegatedToMe;

initDecisionsModel();
Expand Down Expand Up @@ -210,7 +209,7 @@ public boolean isVisible() {

protected void initHeaderRow(){
AjaxCheckBox selected = new AjaxCheckBox(ID_SELECTED,
new PropertyModel<Boolean>(getModel(), AssignmentEditorDto.F_SELECTED)) {
new PropertyModel<>(getModel(), AssignmentEditorDto.F_SELECTED)) {
private static final long serialVersionUID = 1L;

@Override
Expand Down Expand Up @@ -474,7 +473,7 @@ public boolean isVisible(){
body.add(focusTypeContainer);

ObjectTypeSelectPanel<FocusType> focusType = new ObjectTypeSelectPanel<>(ID_FOCUS_TYPE,
new PropertyModel<QName>(getModel(), AssignmentEditorDto.F_FOCUS_TYPE), FocusType.class);
new PropertyModel<>(getModel(), AssignmentEditorDto.F_FOCUS_TYPE), FocusType.class);
focusTypeContainer.add(focusType);

Label relationLabel = new Label(ID_RELATION_LABEL, new AbstractReadOnlyModel<String>() {
Expand Down Expand Up @@ -584,7 +583,7 @@ public boolean isVisible() {
activationBlock.add(validFromContainer);

DateInput validFrom = new DateInput(ID_VALID_FROM,
createDateModel(new PropertyModel<XMLGregorianCalendar>(getModel(),
createDateModel(new PropertyModel<>(getModel(),
AssignmentEditorDto.F_ACTIVATION + ".validFrom")));
validFrom.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
Expand All @@ -610,7 +609,7 @@ public boolean isVisible() {
activationBlock.add(validToContainer);

DateInput validTo = new DateInput(ID_VALID_TO,
createDateModel(new PropertyModel<XMLGregorianCalendar>(getModel(),
createDateModel(new PropertyModel<>(getModel(),
AssignmentEditorDto.F_ACTIVATION + ".validTo")));
validTo.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
Expand Down
Expand Up @@ -18,6 +18,7 @@

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.togglebutton.ToggleIconButton;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
Expand Down Expand Up @@ -86,16 +87,31 @@ public class DelegationEditorPanel extends AssignmentEditorPanel {

public DelegationEditorPanel(String id, IModel<AssignmentEditorDto> delegationTargetObjectModel, boolean delegatedToMe,
List<AssignmentsPreviewDto> privilegesList, PageBase pageBase) {
super(id, delegationTargetObjectModel, delegatedToMe, privilegesList, pageBase);
super(id, delegationTargetObjectModel, delegatedToMe, new LoadableModel<List<AssignmentsPreviewDto>>(false) {
@Override
protected List<AssignmentsPreviewDto> load() {
return privilegesList;
}
}, pageBase);
}

public DelegationEditorPanel(String id, IModel<AssignmentEditorDto> delegationTargetObjectModel, boolean delegatedToMe,
LoadableModel<List<AssignmentsPreviewDto>> privilegesListModel, PageBase pageBase) {
super(id, delegationTargetObjectModel, delegatedToMe, privilegesListModel, pageBase);
}

@Override
protected void initHeaderRow(){
if (delegatedToMe){
privilegesList = getModelObject().getPrivilegeLimitationList();
if (delegatedToMe) {
privilegesListModel = new LoadableModel<List<AssignmentsPreviewDto>>(false) {
@Override
protected List<AssignmentsPreviewDto> load() {
return DelegationEditorPanel.this.getModelObject().getPrivilegeLimitationList();
}
};
}
AjaxCheckBox selected = new AjaxCheckBox(ID_SELECTED,
new PropertyModel<Boolean>(getModel(), AssignmentEditorDto.F_SELECTED)) {
new PropertyModel<>(getModel(), AssignmentEditorDto.F_SELECTED)) {
private static final long serialVersionUID = 1L;

@Override
Expand Down Expand Up @@ -217,6 +233,7 @@ public boolean isVisible(){
if (!UserDtoStatus.ADD.equals(getModelObject().getStatus())){
return true;
}
List<AssignmentsPreviewDto> privilegesList = privilegesListModel.getObject();
return privilegesList != null && privilegesList.size() > 0;
}
});
Expand All @@ -235,7 +252,7 @@ public Boolean getObject(){
@Override
public void setObject(Boolean value){
if (value){
getModelObject().setPrivilegeLimitationList(privilegesList);
getModelObject().setPrivilegeLimitationList(privilegesListModel.getObject());
} else {
getModelObject().setPrivilegeLimitationList(new ArrayList<>());
}
Expand Down Expand Up @@ -287,7 +304,7 @@ public boolean isVisible(){
public void onClick(AjaxRequestTarget target) {
AssignmentPreviewDialog assignmentPreviewDialog =
new AssignmentPreviewDialog(pageBase.getMainPopupBodyId(),
selectExistingPrivileges(privilegesList),
selectExistingPrivileges(privilegesListModel.getObject()),
null, pageBase, true){
@Override
protected boolean isDelegationPreview(){
Expand Down Expand Up @@ -473,7 +490,7 @@ public boolean isVisible(){
private boolean allAssignmentPrivilegesSelected(){
return getModelObject().getPrivilegeLimitationList() == null ||
getModelObject().getPrivilegeLimitationList().size() == 0 ||
getModelObject().getPrivilegeLimitationList().size() == privilegesList.size();
getModelObject().getPrivilegeLimitationList().size() == privilegesListModel.getObject().size();
}

private List<String> getPrivilegesNamesList(){
Expand Down
Expand Up @@ -15,9 +15,11 @@
*/
package com.evolveum.midpoint.web.component.objectdetails;

import java.util.List;

import com.evolveum.midpoint.gui.api.ComponentConstants;
import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab;
import com.evolveum.midpoint.gui.api.component.tabs.PanelTab;
import com.evolveum.midpoint.gui.api.model.CountableLoadableModel;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior;
import com.evolveum.midpoint.prism.query.ObjectQuery;
Expand All @@ -27,24 +29,19 @@
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.Model;

import com.evolveum.midpoint.gui.api.component.MainObjectListPanel;
import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab;
import com.evolveum.midpoint.gui.api.component.tabs.PanelTab;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto;
import com.evolveum.midpoint.web.component.assignment.AssignmentTablePanel;
import com.evolveum.midpoint.web.component.prism.ContainerStatus;
import com.evolveum.midpoint.web.component.prism.ObjectWrapper;
import com.evolveum.midpoint.web.page.admin.PageAdminFocus;
import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails;
import com.evolveum.midpoint.web.page.admin.roles.RoleMemberPanel;
import com.evolveum.midpoint.web.page.admin.users.component.AbstractRoleMemberPanel;
import com.evolveum.midpoint.web.page.admin.users.dto.FocusSubwrapperDto;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;

import java.util.List;

/**
* @author semancik
Expand All @@ -59,7 +56,7 @@ public abstract class AbstractRoleMainPanel<R extends AbstractRoleType> extends
private static final String OPERATION_CAN_SEARCH_ROLE_MEMBERSHIP_ITEM = DOT_CLASS + "canSearchRoleMembershipItem";

public AbstractRoleMainPanel(String id, LoadableModel<ObjectWrapper<R>> objectModel,
LoadableModel<List<AssignmentEditorDto>> assignmentsModel,
CountableLoadableModel<AssignmentEditorDto> assignmentsModel,
LoadableModel<List<FocusSubwrapperDto<ShadowType>>> projectionModel,
LoadableModel<List<AssignmentEditorDto>> inducementsModel, PageAdminFocus<R> parentPage) {
super(id, objectModel, assignmentsModel, projectionModel, parentPage);
Expand Down
Expand Up @@ -18,14 +18,13 @@
import com.evolveum.midpoint.gui.api.ComponentConstants;
import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab;
import com.evolveum.midpoint.gui.api.component.tabs.PanelTab;
import com.evolveum.midpoint.gui.api.model.CountableLoadableModel;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
Expand Down Expand Up @@ -64,14 +63,14 @@ public class FocusMainPanel<F extends FocusType> extends AbstractObjectMainPanel
private static final Trace LOGGER = TraceManager.getTrace(FocusMainPanel.class);

private LoadableModel<List<FocusSubwrapperDto<ShadowType>>> projectionModel;
private LoadableModel<List<AssignmentEditorDto>> assignmentsModel;
private CountableLoadableModel<AssignmentEditorDto> assignmentsModel;
private TaskDtoProvider taskDtoProvider;
private FocusAssignmentsTabPanel assignmentsTabPanel = null;

public FocusMainPanel(String id, LoadableModel<ObjectWrapper<F>> objectModel,
LoadableModel<List<AssignmentEditorDto>> assignmentsModel,
LoadableModel<List<FocusSubwrapperDto<ShadowType>>> projectionModel,
PageAdminFocus<F> parentPage) {
CountableLoadableModel<AssignmentEditorDto> assignmentsModel,
LoadableModel<List<FocusSubwrapperDto<ShadowType>>> projectionModel,
PageAdminFocus<F> parentPage) {
super(id, objectModel, parentPage);
Validate.notNull(projectionModel, "Null projection model");
this.assignmentsModel = assignmentsModel;
Expand Down Expand Up @@ -286,7 +285,7 @@ public WebMarkupContainer createPanel(String panelId) {

@Override
public String getCount() {
return Integer.toString(assignmentsModel.getObject() == null ? 0 : assignmentsModel.getObject().size());
return Integer.toString(assignmentsModel.count());
}
});

Expand Down
Expand Up @@ -15,33 +15,30 @@
*/
package com.evolveum.midpoint.web.component.objectdetails;

import java.util.ArrayList;
import java.util.List;

import com.evolveum.midpoint.gui.api.ComponentConstants;
import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior;
import com.evolveum.midpoint.web.component.assignment.RelationTypes;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction;
import com.evolveum.midpoint.web.page.admin.roles.RoleGovernanceRelationsPanel;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.Model;

import com.evolveum.midpoint.gui.api.component.tabs.PanelTab;
import com.evolveum.midpoint.gui.api.model.CountableLoadableModel;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior;
import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto;
import com.evolveum.midpoint.web.component.assignment.RelationTypes;
import com.evolveum.midpoint.web.component.prism.ContainerStatus;
import com.evolveum.midpoint.web.component.prism.ObjectWrapper;
import com.evolveum.midpoint.web.page.admin.PageAdminFocus;
import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails;
import com.evolveum.midpoint.web.page.admin.roles.RoleGovernanceRelationsPanel;
import com.evolveum.midpoint.web.page.admin.roles.RoleMemberPanel;
import com.evolveum.midpoint.web.page.admin.roles.RolePolicyPanel;
import com.evolveum.midpoint.web.page.admin.users.component.AbstractRoleMemberPanel;
import com.evolveum.midpoint.web.page.admin.users.dto.FocusSubwrapperDto;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.Model;

import java.util.ArrayList;
import java.util.List;

/**
* @author semancik
Expand All @@ -51,7 +48,7 @@ public class RoleMainPanel extends AbstractRoleMainPanel<RoleType> {
private static final long serialVersionUID = 1L;

public RoleMainPanel(String id, LoadableModel<ObjectWrapper<RoleType>> objectModel,
LoadableModel<List<AssignmentEditorDto>> assignmentsModel,
CountableLoadableModel<AssignmentEditorDto> assignmentsModel,
LoadableModel<List<FocusSubwrapperDto<ShadowType>>> projectionModel,
LoadableModel<List<AssignmentEditorDto>> inducementsModel, PageAdminFocus<RoleType> parentPage) {
super(id, objectModel, assignmentsModel, projectionModel, inducementsModel, parentPage);
Expand Down
Expand Up @@ -45,14 +45,14 @@ public class UserDelegationsTabPanel<F extends FocusType> extends AbstractObject
private static final Trace LOGGER = TraceManager.getTrace(FocusAssignmentsTabPanel.class);

private LoadableModel<List<AssignmentEditorDto>> delegationsModel;
private List<AssignmentsPreviewDto> privilegesList = new ArrayList<>();
private LoadableModel<List<AssignmentsPreviewDto>> privilegesListModel;

public UserDelegationsTabPanel(String id, Form mainForm, LoadableModel<ObjectWrapper<F>> focusWrapperModel,
LoadableModel<List<AssignmentEditorDto>> delegationsModel,
List<AssignmentsPreviewDto> privilegesList, PageBase page) {
LoadableModel<List<AssignmentEditorDto>> delegationsModel,
LoadableModel<List<AssignmentsPreviewDto>> privilegesListModel, PageBase page) {
super(id, mainForm, focusWrapperModel, page);
this.delegationsModel = delegationsModel;
this.privilegesList = privilegesList;
this.privilegesListModel = privilegesListModel;
initLayout();
}

Expand All @@ -69,7 +69,7 @@ private void initLayout() {
@Override
public void populateAssignmentDetailsPanel(ListItem<AssignmentEditorDto> item) {
DelegationEditorPanel editor = new DelegationEditorPanel(ID_ROW, item.getModel(), false,
privilegesList, pageBase);
privilegesListModel, pageBase);
item.add(editor);
}

Expand Down Expand Up @@ -102,7 +102,7 @@ public void onClick(AjaxRequestTarget target) {
@Override
protected void onSelectPerformed(AjaxRequestTarget target, UserType user) {
pageBase.hideMainPopup(target);
List<ObjectType> newAssignmentsList = new ArrayList<ObjectType>();
List<ObjectType> newAssignmentsList = new ArrayList<>();
newAssignmentsList.add(user);
addSelectedAssignablePerformed(target, newAssignmentsList, getPageBase().getMainPopup().getId());
}
Expand Down Expand Up @@ -161,7 +161,7 @@ protected void addSelectedAssignablePerformed(AjaxRequestTarget target, List<Obj
AssignmentEditorDto dto = AssignmentEditorDto.createDtoAddFromSelectedObject(
((PrismObject<UserType>)getObjectWrapper().getObject()).asObjectable(),
SchemaConstants.ORG_DEPUTY, getPageBase(), (UserType) object);
dto.setPrivilegeLimitationList(privilegesList);
dto.setPrivilegeLimitationList(privilegesListModel.getObject());
delegationsModel.getObject().add(dto);
} catch (Exception e) {
error(getString("AssignmentTablePanel.message.couldntAssignObject", object.getName(),
Expand Down

0 comments on commit 3f53f89

Please sign in to comment.