/*
* Copyright (c) 2016 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.web.component.assignment;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
/**
* @author semancik
*/
public class SimpleRoleSelector<F extends FocusType, R extends AbstractRoleType> extends BasePanel<List<AssignmentEditorDto>> {
private static final long serialVersionUID = 1L;
private static final Trace LOGGER = TraceManager.getTrace(SimpleRoleSelector.class);
private static final String ID_LIST = "list";
private static final String ID_ITEM = "item";
private static final String ID_BUTTON_RESET = "buttonReset";
List<PrismObject<R>> availableRoles;
public SimpleRoleSelector(String id, IModel<List<AssignmentEditorDto>> assignmentModel, List<PrismObject<R>> availableRoles) {
super(id, assignmentModel);
this.availableRoles = availableRoles;
initLayout();
}
public List<AssignmentType> getAssignmentTypeList() {
return null;
}
public String getExcludeOid() {
return null;
}
protected IModel<List<AssignmentEditorDto>> getAssignmentModel() {
return getModel();
}
private void initLayout() {
setOutputMarkupId(true);
ListView<PrismObject<R>> list = new ListView<PrismObject<R>>(ID_LIST, availableRoles) {
@Override
protected void populateItem(ListItem<PrismObject<R>> item) {
item.add(createRoleLink(ID_ITEM, item.getModel()));
}
};
list.setOutputMarkupId(true);
add(list);
AjaxLink<String> buttonReset = new AjaxLink<String>(ID_BUTTON_RESET) {
@Override
public void onClick(AjaxRequestTarget target) {
reset();
target.add(SimpleRoleSelector.this);
}
};
buttonReset.setBody(createStringResource("SimpleRoleSelector.reset"));
add(buttonReset);
}
private Component createRoleLink(String id, IModel<PrismObject<R>> model) {
AjaxLink<PrismObject<R>> button = new AjaxLink<PrismObject<R>>(id, model) {
@Override
public IModel<?> getBody() {
return new Model<String>(getModel().getObject().asObjectable().getName().getOrig());
}
@Override
public void onClick(AjaxRequestTarget target) {
LOGGER.trace("{} CLICK: {}", this, getModel().getObject());
toggleRole(getModel().getObject());
target.add(this);
}
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
PrismObject<R> role = getModel().getObject();
if (isSelected(role)) {
tag.put("class", "list-group-item active");
} else {
tag.put("class", "list-group-item");
}
String description = role.asObjectable().getDescription();
if (description != null) {
tag.put("title", description);
}
}
};
button.setOutputMarkupId(true);
return button;
}
private boolean isSelected(PrismObject<R> role) {
for (AssignmentEditorDto dto: getAssignmentModel().getObject()) {
if (willProcessAssignment(dto)) {
if (dto.getTargetRef() != null && role.getOid().equals(dto.getTargetRef().getOid())) {
if (dto.getStatus() != UserDtoStatus.DELETE) {
return true;
}
}
}
}
return false;
}
private void toggleRole(PrismObject<R> role) {
Iterator<AssignmentEditorDto> iterator = getAssignmentModel().getObject().iterator();
while (iterator.hasNext()) {
AssignmentEditorDto dto = iterator.next();
if (willProcessAssignment(dto)) {
if (dto.getTargetRef() != null && role.getOid().equals(dto.getTargetRef().getOid())) {
if (dto.getStatus() == UserDtoStatus.ADD) {
iterator.remove();
} else {
dto.setStatus(UserDtoStatus.DELETE);
}
return;
}
}
}
AssignmentEditorDto dto = createAddAssignmentDto(role, getPageBase());
getAssignmentModel().getObject().add(dto);
}
protected AssignmentEditorDto createAddAssignmentDto(PrismObject<R> role, PageBase pageBase) {
AssignmentEditorDto dto = AssignmentEditorDto.createDtoAddFromSelectedObject(role.asObjectable(), getPageBase());
dto.setMinimized(true);
return dto;
}
private void reset() {
Iterator<AssignmentEditorDto> iterator = getAssignmentModel().getObject().iterator();
while (iterator.hasNext()) {
AssignmentEditorDto dto = iterator.next();
if (isManagedRole(dto) && willProcessAssignment(dto)) {
if (dto.getStatus() == UserDtoStatus.ADD) {
iterator.remove();
} else if (dto.getStatus() == UserDtoStatus.DELETE) {
dto.setStatus(UserDtoStatus.MODIFY);
}
}
}
}
protected boolean willProcessAssignment(AssignmentEditorDto dto) {
return true;
}
protected boolean isManagedRole(AssignmentEditorDto dto) {
if (dto.getTargetRef() == null || dto.getTargetRef().getOid() == null) {
return false;
}
for (PrismObject<R> availableRole: availableRoles) {
if (availableRole.getOid().equals(dto.getTargetRef().getOid())) {
return true;
}
}
return false;
}
}