Skip to content

Commit

Permalink
bug fixing on the Request a role panel
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Apr 20, 2016
1 parent 0499686 commit dc92e6d
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 81 deletions.
Expand Up @@ -17,21 +17,33 @@
package com.evolveum.midpoint.web.component.assignment;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.model.api.ModelInteractionService;
import com.evolveum.midpoint.model.api.RoleSelectionSpecification;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.RetrieveOption;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.web.component.prism.ContainerStatus;
import com.evolveum.midpoint.web.component.prism.ObjectWrapper;
import com.evolveum.midpoint.web.component.prism.ObjectWrapperFactory;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
Expand Down Expand Up @@ -73,12 +85,13 @@
* through the list and to reset the list to the
* initial state
*/
public class MultipleAssignmentSelector<F extends FocusType> extends BasePanel<List<AssignmentEditorDto>> {
public class MultipleAssignmentSelector<F extends FocusType, H extends FocusType> extends BasePanel<List<AssignmentEditorDto>> {
private static final long serialVersionUID = 1L;

private static final Trace LOGGER = TraceManager.getTrace(MultipleAssignmentSelector.class);
private static final String DOT_CLASS = MultipleAssignmentSelector.class.getName() + ".";
private static final String OPERATION_LOAD_AVAILABLE_ROLES = DOT_CLASS + "loadAvailableRoles";
private static final String OPERATION_LOAD_FILTER_OBJECT = DOT_CLASS + "loadFilterObject";

private static final String ID_USER_CHOOSER_DIALOG = "userChooserDialog";
private static final String ID_TABLE = "table";
Expand All @@ -94,20 +107,20 @@ public class MultipleAssignmentSelector<F extends FocusType> extends BasePanel<L
private IModel<Search> searchModel;
private BaseSortableDataProvider provider;
private Class type;
private Class<F> targetFocusClass;
private Class<H> targetFocusClass;
private String labelValue ="";
private IModel<ObjectFilter> filterModel = null;
private ObjectFilter authorizedRolesFilter = null;
private ObjectQuery searchQuery = null;
private PrismObject<UserType> user;
private F filterObject = null;
private PrismObject<F> focus;
private H filterObject = null;

public MultipleAssignmentSelector(String id, IModel<List<AssignmentEditorDto>> selectorModel, BaseSortableDataProvider provider,
Class<F> targetFocusClass, Class type, PrismObject<UserType> user) {
Class<H> targetFocusClass, Class type, PrismObject<F> focus) {
super(id, selectorModel);
this.provider = provider == null ? getListDataProvider(user.asObjectable()) : provider;
this.provider = provider == null ? getListDataProvider(null) : provider;
this.type = type;
this.user=user;
this.focus=focus;
this.targetFocusClass = targetFocusClass;
filterModel = getFilterModel();
searchModel = new LoadableModel<Search>(false) {
Expand Down Expand Up @@ -155,21 +168,18 @@ public void onClick(AjaxRequestTarget target) {
add(filterButtonContainer);

initSearchPanel();
add(initTablePanel(provider));
add(initTablePanel());
}

private Component createRowLink(String id, final IModel<SelectableBean<AssignmentEditorDto>> rowModel) {
AjaxLink<SelectableBean<AssignmentEditorDto>> button = new AjaxLink<SelectableBean<AssignmentEditorDto>>(id, rowModel) {

@Override
public IModel<?> getBody() {
ObjectReferenceType obj = ((AssignmentEditorDto)rowModel.getObject()).getTargetRef();
if (obj != null && obj.getTargetName() == null){
obj.setTargetName(getAssignmentName(obj.getOid()));
}
AssignmentEditorDto dto =(AssignmentEditorDto) rowModel.getObject();
String str = dto.getNameForTargetObject();
return new Model<String>(str);
String name = StringUtils.isNotEmpty(dto.getNameForTargetObject()) ?
dto.getNameForTargetObject() : dto.getName();
return new Model<String>(name);
}

@Override
Expand All @@ -193,6 +203,12 @@ protected void onComponentTag(ComponentTag tag) {
}
}
};
button.add(new VisibleEnableBehaviour(){
@Override
public boolean isVisible(){
return ((AssignmentEditorDto)rowModel.getObject()).getStatus() != UserDtoStatus.DELETE;
}
});
button.setOutputMarkupId(true);
return button;
}
Expand Down Expand Up @@ -253,10 +269,13 @@ private void searchPerformed(ObjectQuery query, AjaxRequestTarget target) {

BoxedTablePanel panel = getTable();
panel.setCurrentPage(null);
// DataTable table = panel.getDataTable();
// BaseSortableDataProvider provider = (BaseSortableDataProvider) table.getDataProvider();
// provider.setQuery(query);
this.provider.setQuery(query);
provider.setQuery(query);
// Iterator it = provider.internalIterator(0, provider.size());

// if (provider instanceof ListDataProvider){
// applyQueryToListProvider();
// }
// replaceTable(target);

target.add(panel);
}
Expand All @@ -265,10 +284,10 @@ public BoxedTablePanel getTable() {
return (BoxedTablePanel) get(ID_TABLE);
}

private BoxedTablePanel initTablePanel(BaseSortableDataProvider tableProvider){
private BoxedTablePanel initTablePanel(){
List<IColumn<SelectableBean<AssignmentEditorDto>, String>> columns = initColumns();

BoxedTablePanel table = new BoxedTablePanel(ID_TABLE, tableProvider, columns,
BoxedTablePanel table = new BoxedTablePanel(ID_TABLE, provider, columns,
UserProfileStorage.TableId.TABLE_ROLES, ITEMS_PER_PAGE);
updateBoxedTablePanelStyles(table);
//hide footer menu
Expand All @@ -279,29 +298,15 @@ private BoxedTablePanel initTablePanel(BaseSortableDataProvider tableProvider){
return table;
}

private PolyStringType getAssignmentName(String oid){
ObjectDataProvider temporaryProvider = new ObjectDataProvider(MultipleAssignmentSelector.this, type);
Iterator it = temporaryProvider.internalIterator(0, temporaryProvider.size());
while (it.hasNext()) {
SelectableBean selectableBean = (SelectableBean) it.next();
F object = (F) selectableBean.getValue();
if (object.getOid().equals(oid)) {
return object.getName();
}
}
return new PolyStringType("");

}

private void initUserDialog(IModel<String> title, AjaxRequestTarget target) {

List<QName> supportedTypes = new ArrayList<>();
supportedTypes.add(getPageBase().getPrismContext().getSchemaRegistry()
.findObjectDefinitionByCompileTimeClass(targetFocusClass).getTypeName());
FocusBrowserPanel<F> focusBrowser = new FocusBrowserPanel<F>(getPageBase().getMainPopupBodyId(),
FocusBrowserPanel<H> focusBrowser = new FocusBrowserPanel<H>(getPageBase().getMainPopupBodyId(),
targetFocusClass, supportedTypes, false, getPageBase()) {
@Override
protected void onSelectPerformed(AjaxRequestTarget target, F filterUser) {
protected void onSelectPerformed(AjaxRequestTarget target, H filterUser) {
super.onSelectPerformed(target, filterUser);
filterObject = filterUser;
filterByUserPerformed();
Expand All @@ -316,7 +321,14 @@ protected void onSelectPerformed(AjaxRequestTarget target, F filterUser) {


private void filterByUserPerformed(){
provider = getListDataProvider(filterObject);
//we need to load filter object (e.g. user) totally because we
//need to know its assignments' tenantRef data (name)
//and orgRef data (name)
Task task = getPageBase().createSimpleTask(OPERATION_LOAD_FILTER_OBJECT);
OperationResult result = task.getResult();
PrismObject<H> loadedObject = WebModelServiceUtils.loadObject(targetFocusClass, filterObject.getOid(), null, getPageBase(), task,
result);
provider = getListDataProvider(loadedObject != null ? loadedObject.asObjectable() : filterObject);
}

private void deleteFilterPerformed(AjaxRequestTarget target){
Expand All @@ -327,7 +339,7 @@ private void deleteFilterPerformed(AjaxRequestTarget target){
}

private void replaceTable(AjaxRequestTarget target){
BoxedTablePanel table = initTablePanel(provider);
BoxedTablePanel table = initTablePanel();
MultipleAssignmentSelector.this.replace(table);
target.add(MultipleAssignmentSelector.this);
}
Expand Down Expand Up @@ -358,15 +370,15 @@ private Component getFilterButton(){
return get(createComponentPath(ID_FILTER_BUTTON_CONTAINER, ID_FILTER_BY_USER_BUTTON));
}

public <T extends FocusType> BaseSortableDataProvider getListDataProvider(final T filterUser) {
public <T extends FocusType> BaseSortableDataProvider getListDataProvider(final FocusType focus) {
BaseSortableDataProvider provider;
if (filterUser == null){
provider = getAvailableAssignmentsDataProvider();
} else {
// if (filterObject == null){
// provider = getAvailableAssignmentsDataProvider();
// } else {
provider = new ListDataProvider<AssignmentEditorDto>(this, new IModel<List<AssignmentEditorDto>>() {
@Override
public List<AssignmentEditorDto> getObject() {
return getAvailableAssignmentsDataList(filterUser);
return getAvailableAssignmentsDataList(focus);
}

@Override
Expand All @@ -378,33 +390,31 @@ public void detach() {

}
});
}
// }
return provider;
}

private <T extends FocusType> List<AssignmentEditorDto> getAvailableAssignmentsDataList(T filterUser){
private <T extends FocusType> List<AssignmentEditorDto> getAvailableAssignmentsDataList(FocusType focus){
ObjectQuery query = provider.getQuery() == null ? new ObjectQuery() : provider.getQuery();


List<AssignmentEditorDto> assignmentsList = getAssignmentEditorDtoList(filterUser.getAssignment());
List<AssignmentEditorDto> currentAssignments = getAssignmentsByType(assignmentsList);
if (filterUser != null) {
if (type.equals(RoleType.class)) {
for (AssignmentEditorDto dto : currentAssignments) {
dto.setTenantRef(null);
dto.setOrgRef(null);
}
List<AssignmentEditorDto> assignmentsList = getListProviderDataList();
if (assignmentsList == null) {
if (focus != null) {
assignmentsList = getAssignmentEditorDtoList(focus.getAssignment());
} else {
assignmentsList = getModelObject();
}
}
List<AssignmentEditorDto> currentAssignments = getAssignmentsByType(assignmentsList);

if (filterModel != null && filterModel.getObject() != null) {
query.addFilter(filterModel.getObject());
}
return applyQueryToListProvider(query, currentAssignments);
}


if (filterModel != null && filterModel.getObject() != null){
query.addFilter(filterModel.getObject());
}
return applyQueryToListProvider(query, currentAssignments);


protected List<AssignmentEditorDto> getListProviderDataList(){
return null;
}

private List<AssignmentEditorDto> getAssignmentsByType(List<AssignmentEditorDto> assignmentsList) {
Expand Down Expand Up @@ -463,7 +473,7 @@ private void initRolesFilter (){
try {
PageBase pb = getPageBase();
ModelInteractionService mis = pb.getModelInteractionService();
RoleSelectionSpecification roleSpec = mis.getAssignableRoleSpecification(user, result);
RoleSelectionSpecification roleSpec = mis.getAssignableRoleSpecification(focus, result);
authorizedRolesFilter = roleSpec.getFilter();
} catch (Exception ex) {
LoggingUtils.logException(LOGGER, "Couldn't load available roles", ex);
Expand Down
Expand Up @@ -59,7 +59,10 @@
* the list of assigned items of the same type with the
* possibility of editing the list of assignments.
*/
public class MultipleAssignmentSelectorPanel<F extends FocusType, H extends FocusType> extends BasePanel<List<AssignmentEditorDto>> {
public class MultipleAssignmentSelectorPanel<F extends FocusType, H extends FocusType, G extends FocusType>
extends BasePanel<List<AssignmentEditorDto>> { //G - type of the object which is to be assigned (a.g. assign a role (RoleType))
//F - type of the focus which is opened for editing (e.g. edit user - UserType)
//H - a type of filter object (e.g. Filter by user - UserType)
private LoadableModel<List<AssignmentEditorDto>> assignmentsModel;
private static final String ID_BUTTON_REMOVE = "remove";
private static final String ID_BUTTON_ADD = "add";
Expand All @@ -76,23 +79,23 @@ public class MultipleAssignmentSelectorPanel<F extends FocusType, H extends Focu

private static final String DOT_CLASS = MultipleAssignmentSelectorPanel.class.getName();
private static final String OPERATION_LOAD_AVAILABLE_ROLES = DOT_CLASS + "loadAvailableRoles";
private Class<F> type;
private Class<G> type;

private BaseSortableDataProvider dataProvider;
private List<OrgType> tenantEditorObject = new ArrayList<>();
private List<OrgType> orgEditorObject = new ArrayList<>();
private PrismObject<UserType> user;
private PrismObject<F> focus;
private ObjectQuery dataProviderQuery;
private ObjectFilter authorizedRolesFilter = null;
private IModel<ObjectFilter> filterModel = null;
private static final Trace LOGGER = TraceManager.getTrace(MultipleAssignmentSelectorPanel.class);

public MultipleAssignmentSelectorPanel(String id, LoadableModel<List<AssignmentEditorDto>> assignmentsModel,
PrismObject<UserType> user, Class<H> targetFocusClass, Class<F> type) {
PrismObject<F> focus, Class<H> targetFocusClass, Class<G> type) {
super(id, assignmentsModel);
this.assignmentsModel = assignmentsModel;
this.type = type;
this.user = user;
this.focus = focus;
filterModel = getFilterModel();
tenantEditorObject.add(new OrgType());
orgEditorObject.add(new OrgType());
Expand All @@ -104,15 +107,28 @@ private void initLayout(Class<H> targetFocusClass) {

IModel<List<AssignmentEditorDto>> availableAssignmentModel = createAvailableAssignmentModel();
dataProvider = getAvailableAssignmentsDataProvider();
final MultipleAssignmentSelector availableAssignmentsPanel = new MultipleAssignmentSelector<H>(ID_AVAILABLE_ASSIGNMENTS,
availableAssignmentModel, dataProvider, targetFocusClass, type, user);
final MultipleAssignmentSelector currentAssignmentsPanel = new MultipleAssignmentSelector<H>(ID_CURRENT_ASSIGNMENTS,
assignmentsModel, null, targetFocusClass, type, user);
final MultipleAssignmentSelector availableAssignmentsPanel = new MultipleAssignmentSelector<F, H>(ID_AVAILABLE_ASSIGNMENTS,
availableAssignmentModel, dataProvider, targetFocusClass, type, focus);
final MultipleAssignmentSelector currentAssignmentsPanel = new MultipleAssignmentSelector<F, H>(ID_CURRENT_ASSIGNMENTS,
assignmentsModel,
null, targetFocusClass, type, focus){
@Override
protected List<AssignmentEditorDto> getListProviderDataList(){
return assignmentsModel.getObject();
}
};
currentAssignmentsPanel.setFilterButtonVisibility(false);

AjaxButton add = new AjaxButton(ID_BUTTON_ADD) {
@Override
protected void onSubmit(AjaxRequestTarget target, org.apache.wicket.markup.html.form.Form form) {
List<AssignmentEditorDto> list = assignmentsModel.getObject();
for (AssignmentEditorDto dto : list){
String n = dto.getName();
if (n != null){
String f = "";
}
}
addToAssignmentsModel(target, availableAssignmentsPanel, currentAssignmentsPanel);
}
};
Expand Down Expand Up @@ -205,7 +221,9 @@ private void deleteFromAssignmentsModel(AjaxRequestTarget target, MultipleAssign
for (AssignmentEditorDto dto : fromProviderList) {
if (dto.isSelected()) {
for (AssignmentEditorDto assignmentDto : assignmentsList) {
if (assignmentDto.getTargetRef().getOid().equals(dto.getTargetRef().getOid())) {
if (assignmentDto.getTargetRef().getOid().equals(dto.getTargetRef().getOid()) &&
areEqualReferenceObjects(assignmentDto.getTenantRef(), dto.getTenantRef()) &&
areEqualReferenceObjects(assignmentDto.getOrgRef(), dto.getOrgRef())) {
if (assignmentDto.getStatus().equals(UserDtoStatus.ADD)) {
listToBeRemoved.add(assignmentDto);
} else {
Expand All @@ -222,10 +240,10 @@ private void deleteFromAssignmentsModel(AjaxRequestTarget target, MultipleAssign
}

public ObjectDataProvider getAvailableAssignmentsDataProvider() {
ObjectDataProvider<AssignmentEditorDto, F> provider = new ObjectDataProvider<AssignmentEditorDto, F>(this, type) {
ObjectDataProvider<AssignmentEditorDto, G> provider = new ObjectDataProvider<AssignmentEditorDto, G>(this, type) {

@Override
public AssignmentEditorDto createDataObjectWrapper(PrismObject<F> obj) {
public AssignmentEditorDto createDataObjectWrapper(PrismObject<G> obj) {
return AssignmentEditorDto.createDtoFromObject(obj.asObjectable(), UserDtoStatus.MODIFY, getPageBase());
}

Expand Down Expand Up @@ -277,7 +295,7 @@ private void initRolesFilter (){
try {
PageBase pb = getPageBase();
ModelInteractionService mis = pb.getModelInteractionService();
RoleSelectionSpecification roleSpec = mis.getAssignableRoleSpecification(user, result);
RoleSelectionSpecification roleSpec = mis.getAssignableRoleSpecification(focus, result);
authorizedRolesFilter = roleSpec.getFilter();
} catch (Exception ex) {
LoggingUtils.logException(LOGGER, "Couldn't load available roles", ex);
Expand Down

0 comments on commit dc92e6d

Please sign in to comment.