Skip to content

Commit

Permalink
Merge branch 'master' into tmp/mid-5832
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Oct 9, 2019
2 parents 19db625 + 01efe6b commit c9f60aa
Show file tree
Hide file tree
Showing 32 changed files with 1,201 additions and 469 deletions.
Expand Up @@ -2927,13 +2927,29 @@ public static RelationRegistry getStaticallyProvidedRelationRegistry() {

public static ObjectFilter getAssignableRolesFilter(PrismObject<? extends FocusType> focusObject, Class<? extends AbstractRoleType> type, AssignmentOrder assignmentOrder,
OperationResult result, Task task, PageBase pageBase) {
return getAssignableRolesFilter(focusObject, type, null, assignmentOrder, result, task, pageBase);
}

public static ObjectFilter getAssignableRolesFilter(PrismObject<? extends FocusType> focusObject, Class<? extends AbstractRoleType> type,
QName relation, AssignmentOrder assignmentOrder,
OperationResult result, Task task, PageBase pageBase) {
ObjectFilter filter = null;
LOGGER.debug("Loading objects which can be assigned");
try {
ModelInteractionService mis = pageBase.getModelInteractionService();
RoleSelectionSpecification roleSpec =
mis.getAssignableRoleSpecification(focusObject, type, assignmentOrder.getOrder(), task, result);
filter = roleSpec.getFilter();
filter = roleSpec.getGlobalFilter();
if (relation != null){
ObjectFilter relationFilter = roleSpec.getRelationFilter(relation);
if (filter == null){
return relationFilter;
} else if (relationFilter == null){
return filter;
} else {
return pageBase.getPrismContext().queryFactory().createOr(filter, relationFilter);
}
}
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load available roles", ex);
result.recordFatalError(pageBase.createStringResource("WebComponentUtil.message.getAssignableRolesFilter.fatalError").getString(), ex);
Expand All @@ -2946,6 +2962,29 @@ public static ObjectFilter getAssignableRolesFilter(PrismObject<? extends FocusT
return filter;
}

public static List<QName> getAssignableRelationsList(PrismObject<? extends FocusType> focusObject, Class<? extends AbstractRoleType> type,
AssignmentOrder assignmentOrder,
OperationResult result, Task task, PageBase pageBase){
List<QName> relationsList = null;
LOGGER.debug("Loading assignable relations list");
try {
ModelInteractionService mis = pageBase.getModelInteractionService();
RoleSelectionSpecification roleSpec =
mis.getAssignableRoleSpecification(focusObject, type, assignmentOrder.getOrder(), task, result);
relationsList = roleSpec != null && roleSpec.getGlobalFilter() == null && roleSpec.getRelationMap() != null ?
new ArrayList<QName>(roleSpec.getRelationMap().keySet()) : null;
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load assignable relations list", ex);
result.recordFatalError(pageBase.createStringResource("WebComponentUtil.message.getAssignableRelationsList.fatalError").getString(), ex);
} finally {
result.recomputeStatus();
}
if (!result.isSuccess() && !result.isHandledError()) {
pageBase.showResult(result);
}
return relationsList;
}

public static String formatDurationWordsForLocal(long durationMillis, boolean suppressLeadingZeroElements,
boolean suppressTrailingZeroElements, PageBase pageBase){

Expand Down
Expand Up @@ -989,8 +989,12 @@ protected void onValueChanged(AjaxRequestTarget target){
protected IModel<String> getRelationLabelModel(){
return Model.of();
}

@Override
protected boolean isRelationDropDownEnabled(){
return isRelationEditable();
}
};
relationDropDown.setEnabled(getModel().getObject().isEditable());
relationDropDown.add(new VisibleEnableBehaviour() {

private static final long serialVersionUID = 1L;
Expand All @@ -1003,6 +1007,10 @@ public boolean isVisible() {
relationContainer.add(relationDropDown);

}

protected boolean isRelationEditable(){
return getModel().getObject().isEditable();
}

private List<QName> getSupportedRelations() {
OperationResult result = new OperationResult("Relations for self service area");
Expand Down
Expand Up @@ -8,11 +8,21 @@

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

import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.util.ItemPathTypeUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails;
import com.evolveum.midpoint.web.util.validation.MidpointFormValidator;
import com.evolveum.midpoint.web.util.validation.SimpleValidationError;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand Down Expand Up @@ -61,9 +71,81 @@ public class InducedEntitlementsPanel extends InducementsPanel{
private static final String OPERATION_LOAD_SHADOW_OBJECT = DOT_CLASS + "loadReferencedShadowObject";
private static final String OPERATION_LOAD_RESOURCE_OBJECT = DOT_CLASS + "loadResourceObject";

private MidpointFormValidator validator;

public InducedEntitlementsPanel(String id, IModel<PrismContainerWrapper<AssignmentType>> inducementContainerWrapperModel){
super(id, inducementContainerWrapperModel);

createValidator();
}

private void createValidator() {
validator = new MidpointFormValidator() {
@Override
public Collection<SimpleValidationError> validateObject(PrismObject<? extends ObjectType> object, Collection<ObjectDelta<? extends ObjectType>> deltas) {
List<SimpleValidationError> errors = new ArrayList<SimpleValidationError>();
for (ObjectDelta delta : deltas) {
if (AbstractRoleType.class.isAssignableFrom(delta.getObjectTypeClass())) {
switch (delta.getChangeType()) {
case MODIFY:
Collection<ItemDelta> itemDeltas = delta.getModifications();
for (ItemDelta itemDelta : itemDeltas) {
if (itemDelta.getPath().equivalent(AbstractRoleType.F_INDUCEMENT) && itemDelta.getValuesToAdd() != null) {
for (PrismValue value : (Collection<PrismValue>) itemDelta.getValuesToAdd()) {
errors.addAll(validateInducement((AssignmentType) value.getRealValue()));
}
}
}
break;
case ADD:
if (delta != null && delta.getObjectToAdd().asObjectable() != null) {
for (AssignmentType assignment : ((AbstractRoleType)object.asObjectable()).getInducement()) {
errors.addAll(validateInducement(assignment));
}
}
break;
}
}
}
return errors;
}

private Collection<SimpleValidationError> validateInducement(AssignmentType assignment) {
List<SimpleValidationError> errors = new ArrayList<SimpleValidationError>();
com.evolveum.midpoint.prism.Item association = assignment.asPrismContainerValue().findItem(ItemPath.create(AssignmentType.F_CONSTRUCTION, ConstructionType.F_ASSOCIATION));
if (association != null && !association.getValues().isEmpty()) {
for (PrismContainerValue associationValue : (List<PrismContainerValue>) association.getValues()){
com.evolveum.midpoint.prism.Item outbound = associationValue.findItem(ResourceObjectAssociationType.F_OUTBOUND);
if (outbound == null || outbound.getValues().isEmpty()){
SimpleValidationError error = new SimpleValidationError();
error.setMessage(getPageBase().createStringResource("InducedEntitlementsPanel.validator.message").getString());
ItemPathType path = new ItemPathType();
path.setItemPath(ItemPath.create(AbstractRoleType.F_INDUCEMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_ASSOCIATION, ResourceObjectAssociationType.F_OUTBOUND));
error.setAttribute(path);
errors.add(error);
}
}
}
return errors;
}

@Override
public Collection<SimpleValidationError> validateAssignment(AssignmentType assignment) {
return new ArrayList<SimpleValidationError>();
}
};
}

@Override
protected void onInitialize() {
super.onInitialize();

if (getPageBase() instanceof PageAdminObjectDetails) {
PageAdminObjectDetails page = (PageAdminObjectDetails) getPageBase();
if (!page.getFormValidatorRegistry().getValidators().contains(validator)) {
page.getFormValidatorRegistry().registerValidator(validator);
}
}
}

@Override
Expand All @@ -81,6 +163,7 @@ private ObjectTabStorage getInducedEntitlementsTabStorage(){
return getParentPage().getSessionStorage().getInducedEntitlementsTabStorage();
}


@Override
protected List<IColumn<PrismContainerValueWrapper<AssignmentType>, String>> initColumns() {
List<IColumn<PrismContainerValueWrapper<AssignmentType>, String>> columns = new ArrayList<>();
Expand Down
Expand Up @@ -100,4 +100,9 @@ public String getObject() {
}
};
}

@Override
protected boolean isRelationEditable(){
return false;
}
}
Expand Up @@ -10,6 +10,7 @@

import javax.xml.namespace.QName;

import com.evolveum.midpoint.web.component.util.EnableBehaviour;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
Expand Down Expand Up @@ -71,7 +72,7 @@ protected void onInitialize(){
DropDownFormGroup<QName> input = new DropDownFormGroup<QName>(ID_INPUT, Model.of(defaultRelation), new ListModel<>(supportedRelations), getRenderer(),
getRelationLabelModel(), "relationDropDownChoicePanel.tooltip.relation", true, "col-md-4",
getRelationLabelModel() == null || StringUtils.isEmpty(getRelationLabelModel().getObject()) ? "" : "col-md-8", !allowNull);

input.getInput().add(new EnableBehaviour(() -> isRelationDropDownEnabled()));
input.getInput().add(new EmptyOnChangeAjaxFormUpdatingBehavior());
input.getInput().add(new OnChangeAjaxBehavior() {
private static final long serialVersionUID = 1L;
Expand Down Expand Up @@ -122,6 +123,10 @@ public String getIdValue(QName object, int index) {
};
}

protected boolean isRelationDropDownEnabled(){
return true;
}

protected IModel<String> getRelationLabelModel(){
return createStringResource("relationDropDownChoicePanel.relation");
}
Expand Down
Expand Up @@ -69,41 +69,25 @@ protected void onInitialize(){
}

private void initLayout() {
CaseWorkItemsPanel workItemsPanel;
if (pageParameters != null) {
workItemsPanel = new CaseWorkItemsPanel(ID_CASE_WORK_ITEMS_TABLE, CaseWorkItemsPanel.View.FULL_LIST, pageParameters){
private static final long serialVersionUID = 1L;

@Override
protected ObjectFilter getCaseWorkItemsFilter(){
return QueryUtils.filterForNotClosedStateAndAssignees(getPrismContext().queryFor(CaseWorkItemType.class),
SecurityUtils.getPrincipalUser(),
OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry())
.desc(F_CREATE_TIMESTAMP)
.buildFilter();
}
};
} else {
workItemsPanel = new CaseWorkItemsPanel(ID_CASE_WORK_ITEMS_TABLE, CaseWorkItemsPanel.View.FULL_LIST){
private static final long serialVersionUID = 1L;

@Override
protected List<InlineMenuItem> createRowActions() {
List<InlineMenuItem> menu = super.createRowActions();

List<InlineMenuItem> additionalMenu = PageCaseWorkItems.this.createRowActions();
if (additionalMenu != null){
menu.addAll(additionalMenu);
}
return menu;
}
CaseWorkItemsPanel workItemsPanel = new CaseWorkItemsPanel(ID_CASE_WORK_ITEMS_TABLE, CaseWorkItemsPanel.View.FULL_LIST) {
private static final long serialVersionUID = 1L;

@Override
protected List<InlineMenuItem> createRowActions() {
List<InlineMenuItem> menu = super.createRowActions();

@Override
protected ObjectFilter getCaseWorkItemsFilter(){
return PageCaseWorkItems.this.getCaseWorkItemsFilter();
List<InlineMenuItem> additionalMenu = PageCaseWorkItems.this.createRowActions();
if (additionalMenu != null) {
menu.addAll(additionalMenu);
}
};
}
return menu;
}

@Override
protected ObjectFilter getCaseWorkItemsFilter() {
return PageCaseWorkItems.this.getCaseWorkItemsFilter();
}
};
workItemsPanel.setOutputMarkupId(true);
add(workItemsPanel);
}
Expand All @@ -120,4 +104,8 @@ protected CaseWorkItemsPanel getCaseWorkItemsTable() {
return (CaseWorkItemsPanel) get(createComponentPath(ID_CASE_WORK_ITEMS_TABLE));
}

protected PageParameters getWorkItemsPageParameters(){
return pageParameters;
}

}
Expand Up @@ -7,16 +7,26 @@

package com.evolveum.midpoint.web.page.admin.workflow;

import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.application.AuthorizationAction;
import com.evolveum.midpoint.web.application.PageDescriptor;
import com.evolveum.midpoint.web.application.Url;
import com.evolveum.midpoint.web.page.admin.cases.PageCaseWorkItems;
import com.evolveum.midpoint.web.security.SecurityUtils;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.wf.util.QueryUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OtherPrivilegesLimitationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.request.mapper.parameter.PageParameters;

import static com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkItemType.F_CREATE_TIMESTAMP;

/**
* Created by Viliam Repan (lazyman).
*/
Expand All @@ -40,4 +50,22 @@ public class PageWorkItemsAttorney extends PageCaseWorkItems {
public PageWorkItemsAttorney(PageParameters pageParameters) {
super(pageParameters);
}

@Override
protected ObjectFilter getCaseWorkItemsFilter(){
PageParameters parameters = getWorkItemsPageParameters();
String attorneyUserOid = parameters != null && parameters.get(PageAttorneySelection.PARAMETER_DONOR_OID) != null ?
parameters.get(PageAttorneySelection.PARAMETER_DONOR_OID).toString() : null;
if (StringUtils.isEmpty(attorneyUserOid) || attorneyUserOid.equals("null")){
return super.getCaseWorkItemsFilter();
}
return getPrismContext().queryFor(CaseWorkItemType.class)
.item(CaseWorkItemType.F_ASSIGNEE_REF)
.ref(attorneyUserOid, UserType.COMPLEX_TYPE)
.and()
.item(CaseWorkItemType.F_CLOSE_TIMESTAMP)
.isNull()
.desc(F_CREATE_TIMESTAMP)
.buildFilter();
}
}
Expand Up @@ -69,6 +69,8 @@

<div wicket:id="deltasToBeApproved"/>

<div style="margin-top:20px" wicket:id="additionalInformation"/>

<div class="box box-info" wicket:id="additionalAttributes">
<div class="box-header">
<h3 class="box-title">
Expand Down
Expand Up @@ -36,6 +36,7 @@
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.cases.PageCaseWorkItem;
import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour;
import com.evolveum.midpoint.web.page.admin.workflow.dto.WorkItemDto;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.ChangeTypeType;
import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType;
Expand All @@ -46,6 +47,7 @@
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
Expand Down Expand Up @@ -76,6 +78,7 @@ public class WorkItemDetailsPanel extends BasePanel<CaseWorkItemType>{
private static final String ID_REASON = "reason";
private static final String ID_COMMENT = "requesterCommentMessage";
private static final String ID_DELTAS_TO_APPROVE = "deltasToBeApproved";
private static final String ID_ADDITIONAL_INFORMATION = "additionalInformation";
private static final String ID_ADDITIONAL_ATTRIBUTES = "additionalAttributes";
private static final String ID_APPROVER_CONTAINER = "commentContainer";
private static final String ID_APPROVER_COMMENT = "approverComment";
Expand Down Expand Up @@ -176,6 +179,10 @@ public AssignmentHolderType getObject() {
add(new WebMarkupContainer(ID_DELTAS_TO_APPROVE));
}

InformationListPanel additionalInformation = new InformationListPanel(ID_ADDITIONAL_INFORMATION,
Model.ofList(getModelObject().getAdditionalInformation()));
additionalInformation.setOutputMarkupId(true);
add(additionalInformation);

ApprovalStageDefinitionType level = ApprovalContextUtil.getCurrentStageDefinition(parentCase);
WebMarkupContainer additionalAttributes = new WebMarkupContainer(ID_ADDITIONAL_ATTRIBUTES);
Expand Down

0 comments on commit c9f60aa

Please sign in to comment.