diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index 8d8caafc27b..8f10504981a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -71,6 +71,7 @@ import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.DateLabelComponent; import com.evolveum.midpoint.web.component.TabbedPanel; +import com.evolveum.midpoint.web.component.assignment.AssignmentsUtil; import com.evolveum.midpoint.web.component.breadcrumbs.Breadcrumb; import com.evolveum.midpoint.web.component.breadcrumbs.BreadcrumbPageClass; import com.evolveum.midpoint.web.component.breadcrumbs.BreadcrumbPageInstance; @@ -1249,10 +1250,8 @@ public static String getDisplayName(PrismContainerValu } } else if (prismContainerValue.canRepresent(AssignmentType.class)) { AssignmentType assignmentType = (AssignmentType) prismContainerValue.asContainerable(); - if (assignmentType.getTargetRef() != null) { - ObjectReferenceType assignmentTargetRef = assignmentType.getTargetRef(); - displayName = getName(assignmentTargetRef) + " - " + normalizeRelation(assignmentTargetRef.getRelation()).getLocalPart(); - } else { + displayName = AssignmentsUtil.getName(assignmentType, null); + if (StringUtils.isBlank(displayName)) { displayName = "AssignmentTypeDetailsPanel.containerTitle"; } } else if (prismContainerValue.canRepresent(ExclusionPolicyConstraintType.class)) { @@ -1331,10 +1330,36 @@ public static String getDisplayName(PrismContainerValu } } else if (prismContainerValue.canRepresent(MappingType.class)) { MappingType mapping = (MappingType) prismContainerValue.asContainerable(); - if (mapping.getName() != null && !mapping.getName().isEmpty()) { - String name = mapping.getName(); + String mappingName = mapping.getName(); + if (StringUtils.isNotBlank(mappingName)) { String description = mapping.getDescription(); - displayName = name + (StringUtils.isNotEmpty(description) ? (" - " + description) : ""); + displayName = mappingName + (StringUtils.isNotEmpty(description) ? (" - " + description) : ""); + } else { + List sources = mapping.getSource(); + String sourceDescription = ""; + if (CollectionUtils.isNotEmpty(sources)) { + Iterator iterator = sources.iterator(); + while (iterator.hasNext()) { + VariableBindingDefinitionType source = iterator.next(); + if (source == null || source.getPath() == null) { + continue; + } + String sourcePath = source.getPath().toString(); + sourceDescription +=sourcePath; + if (iterator.hasNext()) { + sourceDescription += ","; + } + } + } + VariableBindingDefinitionType target = mapping.getTarget(); + String targetDescription = target.getPath() != null ? target.getPath().toString() : null; + if (StringUtils.isBlank(sourceDescription)) { + sourceDescription = "(no sources)"; + } + if (StringUtils.isBlank(targetDescription)) { + targetDescription = "(no targets)"; + } + displayName = sourceDescription + " - " + targetDescription; } } else { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java index 694eaffa9cd..18e764aa785 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java @@ -490,10 +490,9 @@ public static void deleteObject(Class type, String oid subResult = new OperationResult(OPERATION_DELETE_OBJECT); } try { - Task task = createSimpleTask(result.getOperation(), principal, page.getTaskManager()); + Task task = createSimpleTask(subResult.getOperation(), principal, page.getTaskManager()); - ObjectDelta delta = page.getPrismContext().deltaFactory().object().create(type, ChangeType.DELETE); - delta.setOid(oid); + ObjectDelta delta = page.getPrismContext().deltaFactory().object().createDeleteDelta(type, oid); page.getModelService().executeChanges(MiscUtil.createCollection(delta), options, task, subResult); } catch (Exception ex) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/VariableBindingDefinitionTypePanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/VariableBindingDefinitionTypePanel.html new file mode 100644 index 00000000000..e0e39e7cd6d --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/VariableBindingDefinitionTypePanel.html @@ -0,0 +1,14 @@ + + + + +
+
+ + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/VariableBindingDefinitionTypePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/VariableBindingDefinitionTypePanel.java new file mode 100644 index 00000000000..0482f55c34c --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/VariableBindingDefinitionTypePanel.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.gui.impl.component; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.component.path.ItemPathDto; +import com.evolveum.midpoint.gui.api.component.path.ItemPathPanel; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.xml.ns._public.common.common_3.VariableBindingDefinitionType; + +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; + +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.model.IModel; + +public class VariableBindingDefinitionTypePanel extends BasePanel { + + private static final String ID_PATH_LABEL = "pathLabel"; + private static final String ID_PATH_PANEL = "pathPanel"; + + public VariableBindingDefinitionTypePanel(String id, IModel model) { + super(id, model); + } + + @Override + protected void onInitialize() { + super.onInitialize(); + initLayout(); + } + + private void initLayout() { + ItemPathPanel pathPanel = new ItemPathPanel(ID_PATH_PANEL, createPathModel()) { + + @Override + protected void onUpdate(ItemPathDto itemPathDto) { + ItemPath newPath = getModelObject().toItemPath(); + ItemPathType newPathtype = null; + if (newPath != null) { + newPathtype = new ItemPathType(newPath); + } + + VariableBindingDefinitionTypePanel.this.getModelObject().setPath(newPathtype); + } + }; + pathPanel.setOutputMarkupId(true); + add(pathPanel); + + } + + private ItemPathDto createPathModel() { + VariableBindingDefinitionType variable = getModelObject(); + if (variable == null) { + return new ItemPathDto(); + } + return new ItemPathDto(variable.getPath()); + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ConditionPanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ConditionPanelFactory.java index 527f86fd86e..88bf224a156 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ConditionPanelFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ConditionPanelFactory.java @@ -1,60 +1,50 @@ -/* - * Copyright (c) 2020 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.gui.impl.factory; - -import com.evolveum.midpoint.gui.api.factory.AbstractGuiComponentFactory; -import com.evolveum.midpoint.gui.api.prism.ItemWrapper; -import com.evolveum.midpoint.gui.impl.prism.PrismPropertyWrapper; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; -import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; -import com.evolveum.midpoint.web.page.admin.reports.component.AceEditorPanel; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -import org.apache.wicket.markup.html.panel.Panel; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.io.Serializable; - -@Component -public class ConditionPanelFactory extends AbstractGuiComponentFactory implements Serializable { - - @PostConstruct - public void register() { - getRegistry().addToRegistry(this); - } - - @Override - protected Panel getPanel(PrismPropertyPanelContext panelCtx) { - AceEditorPanel conditionPanel = new AceEditorPanel(panelCtx.getComponentId(), null, new ExpressionModel(panelCtx.getRealValueModel(), panelCtx.getPageBase()), 200){ - @Override - protected boolean isResizeToMaxHeight() { - return false; - } - }; -// conditionPanel.getEditor().add(new OnChangeAjaxBehavior() { -// @Override -// protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) { -// -// } -// }); - conditionPanel.getEditor().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); - conditionPanel.getEditor().add(new EmptyOnChangeAjaxFormUpdatingBehavior()); - return conditionPanel; - } - - @Override - public boolean match(IW wrapper) { - ItemPath assignmentConditionPath = ItemPath.create(AssignmentHolderType.F_ASSIGNMENT, AssignmentType.F_CONDITION, MappingType.F_EXPRESSION); - ItemPath inducementConditionPath = ItemPath.create(AbstractRoleType.F_INDUCEMENT, AssignmentType.F_CONDITION, MappingType.F_EXPRESSION); - - ItemPath wrapperPath = wrapper.getPath().namedSegmentsOnly(); - return wrapper instanceof PrismPropertyWrapper && (inducementConditionPath.isSubPathOrEquivalent(wrapperPath) || assignmentConditionPath.isSubPathOrEquivalent(wrapperPath) || QNameUtil.match(AssignmentType.F_CONDITION, wrapper.getItemName())); - } -} +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.gui.impl.factory; + +import com.evolveum.midpoint.gui.api.factory.AbstractGuiComponentFactory; +import com.evolveum.midpoint.gui.api.prism.ItemWrapper; +import com.evolveum.midpoint.gui.impl.prism.PrismPropertyWrapper; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; +import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; +import com.evolveum.midpoint.web.page.admin.reports.component.AceEditorPanel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; + +import org.apache.wicket.markup.html.panel.Panel; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.io.Serializable; + +@Component +public class ConditionPanelFactory extends AbstractGuiComponentFactory implements Serializable { + + @PostConstruct + public void register() { + getRegistry().addToRegistry(this); + } + + @Override + protected Panel getPanel(PrismPropertyPanelContext panelCtx) { + AceEditorPanel conditionPanel = new AceEditorPanel(panelCtx.getComponentId(), null, new ExpressionModel(panelCtx.getRealValueModel(), panelCtx.getPageBase()), 200){ + @Override + protected boolean isResizeToMaxHeight() { + return false; + } + }; + conditionPanel.getEditor().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); + conditionPanel.getEditor().add(new EmptyOnChangeAjaxFormUpdatingBehavior()); + return conditionPanel; + } + + @Override + public boolean match(IW wrapper) { + return QNameUtil.match(ExpressionType.COMPLEX_TYPE, wrapper.getTypeName()); + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ExpressionWrapperFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ExpressionWrapperFactory.java index 1c4f86f9660..b4272f8e8cd 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ExpressionWrapperFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ExpressionWrapperFactory.java @@ -49,7 +49,11 @@ protected PrismPropertyWrapper createWrapper(PrismContainerValue ItemStatus status, WrapperContext ctx) { ExpressionWrapper propertyWrapper = new ExpressionWrapper(parent, item, status); - getRegistry().registerWrapperPanel(item.getDefinition().getTypeName(), ExpressionPropertyPanel.class); + if (propertyWrapper.isConstructionExpression() || propertyWrapper.isAttributeExpression() || propertyWrapper.isAssociationExpression()) { + getRegistry().registerWrapperPanel(propertyWrapper.getTypeName(), ExpressionPropertyPanel.class); + } else { + return super.createWrapper(parent, item, status, ctx); + } return propertyWrapper; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ItemPathPanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ItemPathPanelFactory.java index 88c6e700fa9..70fabff70d7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ItemPathPanelFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ItemPathPanelFactory.java @@ -46,7 +46,7 @@ public boolean match(IW wrapper) { @Override protected Panel getPanel(PrismPropertyPanelContext panelCtx) { - return new ItemPathPanel(panelCtx.getComponentId(), (ItemPathType) panelCtx.getRealValueModel().getObject()) { + return new ItemPathPanel(panelCtx.getComponentId(), panelCtx.getRealValueModel().getObject()) { private static final long serialVersionUID = 1L; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/VariableBindingDefinitionTypePanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/VariableBindingDefinitionTypePanelFactory.java new file mode 100644 index 00000000000..a0122f3df85 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/VariableBindingDefinitionTypePanelFactory.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.gui.impl.factory; + +import com.evolveum.midpoint.gui.api.factory.AbstractGuiComponentFactory; +import com.evolveum.midpoint.gui.api.prism.ItemWrapper; +import com.evolveum.midpoint.gui.impl.component.VariableBindingDefinitionTypePanel; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.xml.ns._public.common.common_3.VariableBindingDefinitionType; + +import org.apache.wicket.markup.html.panel.Panel; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +@Component +public class VariableBindingDefinitionTypePanelFactory extends AbstractGuiComponentFactory { + + + @PostConstruct + public void register() { + getRegistry().addToRegistry(this); + } + + @Override + protected Panel getPanel(PrismPropertyPanelContext panelCtx) { + return new VariableBindingDefinitionTypePanel(panelCtx.getComponentId(), panelCtx.getRealValueModel()); + } + + @Override + public boolean match(IW wrapper) { + return QNameUtil.match(VariableBindingDefinitionType.COMPLEX_TYPE, wrapper.getTypeName()); + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ExpressionWrapper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ExpressionWrapper.java index 8eaa7a6374f..a12876ed20b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ExpressionWrapper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ExpressionWrapper.java @@ -14,11 +14,15 @@ import org.jetbrains.annotations.Nullable; +import javax.xml.namespace.QName; + /** * Created by honchar */ public class ExpressionWrapper extends PrismPropertyWrapperImpl { + private QName customQName = new QName("com.evolveum.midpoint.gui","customExtenstionType"); + private static final Trace LOGGER = TraceManager.getTrace(ExpressionWrapper.class); private ConstructionType construction; @@ -114,7 +118,13 @@ public Integer getDisplayOrder() { return super.getDisplayOrder(); } } -// @Override + + @Override + public QName getTypeName() { + return customQName; + } + + // @Override // public boolean hasChanged() { // for (ValueWrapperOld valueWrapper : getValues()) { // ExpressionType expression = (ExpressionType) ((PrismPropertyValue) valueWrapper.getValue()).getValue(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanel.java index 2b2d18a71b8..b14c067a9b5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemPanel.java @@ -110,14 +110,11 @@ protected void populateItem(ListItem item) { Component panel = createValuePanel(item, componentFactory, getVisibilityHandler(), getEditabilityHandler()); -// panel.add(getEnableBehaviourOfValuePanel(ItemPanel.this.getModelObject())); createButtons(item); } }; -// values.setReuseItems(true); -// customValuesPanel(values); return values; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/ExpressionPropertyPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/ExpressionPropertyPanel.html index 939c0f006a0..c6ffa918cec 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/ExpressionPropertyPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/ExpressionPropertyPanel.html @@ -1,22 +1,22 @@ - - - - - -
-
-
-
-
-
- -
-
-
- - + + + + + +
+
+
+
+
+
+ +
+
+
+ + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java index 46d50c46918..821bec4cb1e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java @@ -7,13 +7,14 @@ package com.evolveum.midpoint.web.component.assignment; import java.util.Date; +import java.util.Iterator; import java.util.List; import java.util.function.Function; - import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; + import org.apache.commons.lang.StringUtils; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -22,39 +23,29 @@ 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.impl.factory.ItemRealValueModel; import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; -import com.evolveum.midpoint.gui.impl.prism.PrismPropertyValueWrapper; -import com.evolveum.midpoint.gui.impl.prism.PrismPropertyWrapper; import com.evolveum.midpoint.model.api.authentication.CompiledGuiProfile; -import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.web.session.RoleCatalogStorage; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; /** * Created by honchar. */ public class AssignmentsUtil { - private static final long serialVersionUID = 1L; private static final Trace LOGGER = TraceManager.getTrace(AssignmentsUtil.class); public static String createActivationTitleModel(ActivationType activation, String defaultTitle, PageBase basePanel) { if (activation == null) { - return""; + return defaultTitle; } return createActivationTitleModel(activation.getAdministrativeStatus(), activation.getValidFrom(), activation.getValidTo(), basePanel); } @@ -88,13 +79,8 @@ public String getObject() { return label.getObject(); } - public static IModel createActivationTitleModelExperimental(IModel model, BasePanel basePanel) { - return createActivationTitleModelExperimental(model.getObject(), s -> s.value(), basePanel); - } - public static IModel createActivationTitleModelExperimental(AssignmentType assignmentType, Function transformStatusLambda, BasePanel basePanel) { -// AssignmentDto assignmentDto = model.getObject(); ActivationType activation = assignmentType.getActivation(); if (activation == null) { return basePanel.createStringResource("lower.ActivationStatusType.null"); @@ -139,15 +125,13 @@ public static IModel createConsentActivationTitleModel(IModel createTimeIntervalStatusMessage(TimeIntervalStatusType timeIntervalStatus, ActivationType activation, BasePanel basePanel) { switch (timeIntervalStatus) { case AFTER: return basePanel.createStringResource("ActivationType.validity.after", activation.getValidTo()); case BEFORE: return basePanel.createStringResource("ActivationType.validity.before", activation.getValidFrom()); - case IN: - return basePanel.createStringResource(activation.getEffectiveStatus()); - default: return basePanel.createStringResource(activation.getEffectiveStatus()); } @@ -187,17 +171,6 @@ public String getObject() { }; } - public static VisibleEnableBehaviour getEnableBehavior(IModel dtoModel){ - return new VisibleEnableBehaviour(){ - private static final long serialVersionUID = 1L; - - @Override - public boolean isEnabled(){ - return dtoModel.getObject().isEditable(); - } - }; - } - public static IModel createAssignmentIconTitleModel(BasePanel panel, AssignmentEditorDtoType type){ return new IModel() { private static final long serialVersionUID = 1L; @@ -230,37 +203,30 @@ public String getObject() { public static String getName(PrismContainerValueWrapper assignmentValueWrapper, PageBase pageBase) { AssignmentType assignment = assignmentValueWrapper.getRealValue(); + return getName(assignment, pageBase); + } + public static String getName(AssignmentType assignment, PageBase pageBase) { if (assignment == null) { return null; } if (assignment.getPolicyRule() != null){ - StringBuilder sbName = new StringBuilder(""); - PrismPropertyWrapper property; - try { - property = assignmentValueWrapper.findProperty(ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_NAME)); - } catch (SchemaException e) { - LOGGER.error("Cannot find name property for policy rules."); - pageBase.getSession().error("Cannot find name for the policy rule"); - return null; - } - if (property != null && !property.getValues().isEmpty()) { - for (PrismPropertyValueWrapper value : property.getValues()) { - ItemRealValueModel name = new ItemRealValueModel(Model.of(value)); - if (StringUtils.isNotEmpty(name.getObject())) { - sbName.append(name.getObject()).append("\n"); - } - } + StringBuilder sbName = new StringBuilder(); + String policyRuleName = assignment.getPolicyRule().getName(); + + if (StringUtils.isNotEmpty(policyRuleName)) { + sbName.append(policyRuleName).append("\n"); } + if (StringUtils.isNotEmpty(sbName.toString())){ return sbName.toString(); } else { PolicyRuleType policyRuleContainer = assignment.getPolicyRule(); - StringBuilder sb = new StringBuilder(""); + StringBuilder sb = new StringBuilder(); PolicyConstraintsType constraints = policyRuleContainer.getPolicyConstraints(); if (constraints != null && constraints.getExclusion() != null && constraints.getExclusion().size() > 0){ - sb.append(pageBase.createStringResource("PolicyConstraintsType.exclusion").getString() + ": "); + sb.append(pageBase.createStringResource("PolicyConstraintsType.exclusion").getString()).append(": "); constraints.getExclusion().forEach(exclusion -> { sb.append(WebComponentUtil.getName(exclusion.getTargetRef(), true)); sb.append("; "); @@ -297,23 +263,53 @@ public static String getName(PrismContainerValueWrapper assignme } } - if (isNotEmptyRef(assignment.getTargetRef())) { - sb.append(WebComponentUtil.getEffectiveName(assignment.getTargetRef(), OrgType.F_DISPLAY_NAME, pageBase, - "loadTargetName", true)); + ObjectReferenceType targetRef = assignment.getTargetRef(); + if (isNotEmptyRef(targetRef)) { + if (pageBase == null) { + PolyStringType targetName = targetRef.getTargetName(); + if (targetName != null) { + sb.append(WebComponentUtil.getOrigStringFromPoly(targetName)).append(" - "); + } + QName type = targetRef.getType(); + if (type != null) { + sb.append(type.getLocalPart()); + } + } else { + sb.append(WebComponentUtil.getEffectiveName(assignment.getTargetRef(), OrgType.F_DISPLAY_NAME, pageBase, + "loadTargetName", true)); + } } // appendTenantAndOrgName(assignment, pageBase); - if(sb.toString().isEmpty() && assignment.getFocusMappings() != null) { - for(MappingType mapping : assignment.getFocusMappings().getMapping()) { - String name = mapping.getName() == null ? "" : mapping.getName(); - String description = mapping.getDescription() == null ? "" : mapping.getDescription(); - if(name.isEmpty()) { - sb.append(!description.isEmpty() ? "Mapping - " + description + "\n": ""); - } else { - sb.append(name); - sb.append(!description.isEmpty() ? " - " + description + "\n" : "\n"); + if (sb.toString().isEmpty() && assignment.getFocusMappings() != null) { + sb.append("Focus mapping - "); + List mappings = assignment.getFocusMappings().getMapping(); + Iterator mappingsIterator = mappings.iterator(); + while (mappingsIterator.hasNext()) { + MappingType mapping = mappingsIterator.next(); + String name = mapping.getName(); + if (name == null) { + name = mapping.getDescription(); + } + + if (name == null) { + VariableBindingDefinitionType target = mapping.getTarget(); + if (target != null) { + name = target.getPath().toString(); + } + } + + //should no happened + if (name == null) { + sb.append("Unknown"); + } + + sb.append(name); + if (mappingsIterator.hasNext()) { + sb.append(", "); } + } } return sb.toString(); @@ -386,18 +382,6 @@ public static String getAssignmentSpecificInfoLabel(AssignmentType assignmentTyp return sb.toString(); } - private static void appendRelation(AssignmentType assignment, StringBuilder sb, PageBase pageBase) { - if (assignment.getTargetRef() == null) { - return; - } - - String labelKey = WebComponentUtil.getRelationHeaderLabelKeyIfKnown(assignment.getTargetRef().getRelation()); - if (StringUtils.isNotEmpty(labelKey)) { - sb.append(" - ").append(pageBase.createStringResource(labelKey).getString()); - } - - } - public static AssignmentEditorDtoType getType(AssignmentType assignment) { ObjectReferenceType targetRef = assignment.getTargetRef(); if (targetRef.asReferenceValue().getObject() != null) { @@ -423,11 +407,6 @@ public static boolean isAssignmentRelevant(AssignmentType assignment) { !UserType.COMPLEX_TYPE.equals(assignment.getTargetRef().getType()); } - public static boolean isPolicyRuleAssignment(AssignmentType assignment) { - return assignment.asPrismContainerValue() != null - && assignment.asPrismContainerValue().findContainer(AssignmentType.F_POLICY_RULE) != null; - } - public static boolean isArchetypeAssignment(AssignmentType assignment) { return assignment.getTargetRef() != null && ArchetypeType.COMPLEX_TYPE.equals(assignment.getTargetRef().getType()); @@ -441,28 +420,6 @@ public static boolean isConsentAssignment(AssignmentType assignment) { return QNameUtil.match(assignment.getTargetRef().getRelation(), SchemaConstants.ORG_CONSENT); } - /** - * - * @return true if this is an assignment of a RoleType, OrgType, ServiceType or Resource - * @return false if this is an assignment of a User(delegation, deputy) or PolicyRules - */ - public static boolean isAssignableObject(AssignmentType assignment){ - if (assignment.getPersonaConstruction() != null) { - return false; - } - - if (assignment.getPolicyRule() != null) { - return false; - } - - //TODO: uncomment when GDPR is in -// if (assignment.getTargetRef() != null && assignment.getTargetRef().getRelation().equals(SchemaConstants.ORG_CONSENT)) { -// return false; -// } - - return true; - } - public static QName getTargetType(AssignmentType assignment) { if (assignment.getConstruction() != null) { return ConstructionType.COMPLEX_TYPE; @@ -484,6 +441,7 @@ public static QName getTargetType(AssignmentType assignment) { if (assignment.getFocusMappings() != null){ return MappingType.COMPLEX_TYPE; } + // account assignment through account construction return ConstructionType.COMPLEX_TYPE; @@ -510,8 +468,8 @@ public static int loadAssignmentsLimit(OperationResult result, PageBase pageBase int assignmentsLimit = -1; try { CompiledGuiProfile adminGuiConfig = pageBase.getModelInteractionService().getCompiledGuiProfile( - pageBase.createSimpleTask(result.getOperation()), result);//pageBase.loadUserSelf().asObjectable().getAdminGuiConfiguration(); - if (adminGuiConfig != null && adminGuiConfig.getRoleManagement() != null){ + pageBase.createSimpleTask(result.getOperation()), result); + if (adminGuiConfig.getRoleManagement() != null){ assignmentsLimit = adminGuiConfig.getRoleManagement().getAssignmentApprovalRequestLimit(); } } catch (ObjectNotFoundException | SchemaException | CommunicationException | ConfigurationException | SecurityViolationException | ExpressionEvaluationException ex){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ConstructionAssignmentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ConstructionAssignmentPanel.java index b99910f58ef..f76a0aadec6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ConstructionAssignmentPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ConstructionAssignmentPanel.java @@ -1,131 +1,112 @@ -/* - * Copyright (c) 2010-2019 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.web.component.assignment; - -import java.util.ArrayList; -import java.util.List; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.gui.api.prism.ItemWrapper; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.web.component.prism.ItemVisibility; - -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; - -import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; -import com.evolveum.midpoint.gui.impl.component.data.column.AbstractItemWrapperColumn.ColumnType; -import com.evolveum.midpoint.gui.impl.component.data.column.PrismPropertyWrapperColumn; -import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.web.component.search.SearchFactory; -import com.evolveum.midpoint.web.component.search.SearchItemDefinition; -import com.evolveum.midpoint.web.model.PrismContainerWrapperModel; - -/** - * Created by honchar. - */ -public class ConstructionAssignmentPanel extends AssignmentPanel { - private static final long serialVersionUID = 1L; - - public ConstructionAssignmentPanel(String id, IModel> assignmentContainerWrapperModel){ - super(id, assignmentContainerWrapperModel); - } - - @Override - protected List createSearchableItems(PrismContainerDefinition containerDef) { - List defs = new ArrayList<>(); - - SearchFactory.addSearchRefDef(containerDef, ItemPath.create(AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF), defs, AreaCategoryType.ADMINISTRATION, getPageBase()); - SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS), defs); - SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_ACTIVATION, ActivationType.F_EFFECTIVE_STATUS), defs); - - defs.addAll(SearchFactory.createExtensionDefinitionList(containerDef)); - - return defs; - } - - @Override - protected QName getAssignmentType(){ - return ResourceType.COMPLEX_TYPE; - } - - @Override - protected List, String>> initColumns() { - List, String>> columns = new ArrayList<>(); - - columns.add(new PrismPropertyWrapperColumn(getModel(), ItemPath.create(AssignmentType.F_CONSTRUCTION, ConstructionType.F_KIND), ColumnType.STRING, getPageBase())); - columns.add(new PrismPropertyWrapperColumn<>(getModel(), ItemPath.create(AssignmentType.F_CONSTRUCTION, ConstructionType.F_INTENT), ColumnType.STRING, getPageBase())); - return columns; - } - - @Override - protected ObjectQuery createObjectQuery(){ - return getParentPage().getPrismContext().queryFor(AssignmentType.class) - .exists(AssignmentType.F_CONSTRUCTION) - .build(); - } -// -// @Override -// protected IModel getSpecificContainerModel(IModel> modelObject) { -// AssignmentType assignment = modelObject.getObject().getRealValue(); -// if (ConstructionType.COMPLEX_TYPE.equals(AssignmentsUtil.getTargetType(assignment))) { -// return (IModel) PrismContainerWrapperModel.fromContainerValueWrapper(modelObject, AssignmentType.F_CONSTRUCTION); -// } -// -// if (PersonaConstructionType.COMPLEX_TYPE.equals(AssignmentsUtil.getTargetType(assignment))) { -// return (IModel) PrismContainerWrapperModel.fromContainerValueWrapper(modelObject, AssignmentType.F_CONSTRUCTION); -// //TODO is it correct? findContainerWrapper by path F_PERSONA_CONSTRUCTION will return PersonaConstructionType -// //but not PolicyRuleType -// } -// return Model.of(); -// } - - @Override - protected ItemVisibility getTypedContainerVisibility(ItemWrapper wrapper) { - if (QNameUtil.match(AssignmentType.F_TARGET_REF, wrapper.getItemName())) { - return ItemVisibility.HIDDEN; - } - - if (QNameUtil.match(AssignmentType.F_TENANT_REF, wrapper.getItemName())) { - return ItemVisibility.HIDDEN; - } - - if (QNameUtil.match(AssignmentType.F_ORG_REF, wrapper.getItemName())) { - return ItemVisibility.HIDDEN; - } - - if (QNameUtil.match(PolicyRuleType.COMPLEX_TYPE, wrapper.getTypeName())){ - return ItemVisibility.HIDDEN; - } - - if (QNameUtil.match(PersonaConstructionType.COMPLEX_TYPE, wrapper.getTypeName())){ - return ItemVisibility.HIDDEN; - } - - return ItemVisibility.AUTO; - } - - @Override - protected boolean getContainerReadability(ItemWrapper wrapper) { - if (QNameUtil.match(ConstructionType.F_KIND, wrapper.getItemName())) { - return false; - } - - if (QNameUtil.match(ConstructionType.F_INTENT, wrapper.getItemName())) { - return false; - } - - return true; - } -} +/* + * Copyright (c) 2010-2019 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.component.assignment; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.namespace.QName; + +import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.model.IModel; + +import com.evolveum.midpoint.gui.api.prism.ItemWrapper; +import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; +import com.evolveum.midpoint.gui.impl.component.data.column.AbstractItemWrapperColumn.ColumnType; +import com.evolveum.midpoint.gui.impl.component.data.column.PrismPropertyWrapperColumn; +import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; +import com.evolveum.midpoint.prism.PrismContainerDefinition; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.web.component.prism.ItemVisibility; +import com.evolveum.midpoint.web.component.search.SearchFactory; +import com.evolveum.midpoint.web.component.search.SearchItemDefinition; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; + +/** + * Created by honchar. + */ +public class ConstructionAssignmentPanel extends AssignmentPanel { + private static final long serialVersionUID = 1L; + + public ConstructionAssignmentPanel(String id, IModel> assignmentContainerWrapperModel){ + super(id, assignmentContainerWrapperModel); + } + + @Override + protected List createSearchableItems(PrismContainerDefinition containerDef) { + List defs = new ArrayList<>(); + + SearchFactory.addSearchRefDef(containerDef, ItemPath.create(AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF), defs, AreaCategoryType.ADMINISTRATION, getPageBase()); + SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS), defs); + SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_ACTIVATION, ActivationType.F_EFFECTIVE_STATUS), defs); + + defs.addAll(SearchFactory.createExtensionDefinitionList(containerDef)); + + return defs; + } + + @Override + protected QName getAssignmentType(){ + return ResourceType.COMPLEX_TYPE; + } + + @Override + protected List, String>> initColumns() { + List, String>> columns = new ArrayList<>(); + + columns.add(new PrismPropertyWrapperColumn(getModel(), ItemPath.create(AssignmentType.F_CONSTRUCTION, ConstructionType.F_KIND), ColumnType.STRING, getPageBase())); + columns.add(new PrismPropertyWrapperColumn<>(getModel(), ItemPath.create(AssignmentType.F_CONSTRUCTION, ConstructionType.F_INTENT), ColumnType.STRING, getPageBase())); + return columns; + } + + @Override + protected ObjectQuery createObjectQuery(){ + return getParentPage().getPrismContext().queryFor(AssignmentType.class) + .exists(AssignmentType.F_CONSTRUCTION) + .build(); + } + + @Override + protected ItemVisibility getTypedContainerVisibility(ItemWrapper wrapper) { + if (QNameUtil.match(AssignmentType.F_TARGET_REF, wrapper.getItemName())) { + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(AssignmentType.F_TENANT_REF, wrapper.getItemName())) { + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(AssignmentType.F_ORG_REF, wrapper.getItemName())) { + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(PolicyRuleType.COMPLEX_TYPE, wrapper.getTypeName())){ + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(PersonaConstructionType.COMPLEX_TYPE, wrapper.getTypeName())){ + return ItemVisibility.HIDDEN; + } + + return ItemVisibility.AUTO; + } + + @Override + protected boolean getContainerReadability(ItemWrapper wrapper) { + + if (QNameUtil.match(ConstructionType.F_KIND, wrapper.getItemName())) { + return false; + } + + if (QNameUtil.match(ConstructionType.F_INTENT, wrapper.getItemName())) { + return false; + } + + return true; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/FocusMappingsAssignmentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/FocusMappingsAssignmentPanel.java new file mode 100644 index 00000000000..06fb24f601a --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/FocusMappingsAssignmentPanel.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.component.assignment; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.wicket.model.IModel; + +import com.evolveum.midpoint.gui.api.prism.ItemWrapper; +import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; +import com.evolveum.midpoint.prism.PrismContainerDefinition; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.web.component.prism.ItemVisibility; +import com.evolveum.midpoint.web.component.search.SearchFactory; +import com.evolveum.midpoint.web.component.search.SearchItemDefinition; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; + +public class FocusMappingsAssignmentPanel extends AssignmentPanel { + private static final long serialVersionUID = 1L; + + public FocusMappingsAssignmentPanel(String id, IModel> assignmentContainerWrapperModel){ + super(id, assignmentContainerWrapperModel); + } + + @Override + protected List createSearchableItems(PrismContainerDefinition containerDef) { + List defs = new ArrayList<>(); + + SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_FOCUS_MAPPINGS, MappingsType.F_DESCRIPTION), defs); + SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_FOCUS_MAPPINGS, MappingsType.F_MAPPING, MappingType.F_NAME), defs); + SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_FOCUS_MAPPINGS, MappingsType.F_MAPPING, MappingType.F_STRENGTH), defs); + + defs.addAll(SearchFactory.createExtensionDefinitionList(containerDef)); + + return defs; + } + + + @Override + protected ObjectQuery createObjectQuery(){ + return getParentPage().getPrismContext().queryFor(AssignmentType.class) + .exists(AssignmentType.F_FOCUS_MAPPINGS) + .build(); + } + + @Override + protected ItemVisibility getTypedContainerVisibility(ItemWrapper wrapper) { + if (QNameUtil.match(AssignmentType.F_TARGET_REF, wrapper.getItemName())) { + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(AssignmentType.F_TENANT_REF, wrapper.getItemName())) { + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(AssignmentType.F_ORG_REF, wrapper.getItemName())) { + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(PolicyRuleType.COMPLEX_TYPE, wrapper.getTypeName())){ + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(PersonaConstructionType.COMPLEX_TYPE, wrapper.getTypeName())){ + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(ConstructionType.COMPLEX_TYPE, wrapper.getTypeName())){ + return ItemVisibility.HIDDEN; + } + + return ItemVisibility.AUTO; + } + + @Override + protected boolean getContainerReadability(ItemWrapper wrapper) { + return false; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/PolicyRulesPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/PolicyRulesPanel.java index 523584a9382..83b821f460c 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/PolicyRulesPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/PolicyRulesPanel.java @@ -1,146 +1,147 @@ -/* - * Copyright (c) 2018 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.web.component.assignment; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import com.evolveum.midpoint.gui.api.prism.ItemWrapper; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.web.component.prism.ItemVisibility; - -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; -import org.apache.wicket.model.IModel; - -import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; -import com.evolveum.midpoint.gui.impl.component.data.column.AbstractItemWrapperColumn.ColumnType; -import com.evolveum.midpoint.gui.impl.component.data.column.PrismContainerWrapperColumn; -import com.evolveum.midpoint.gui.impl.component.data.column.PrismPropertyWrapperColumn; -import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; -import com.evolveum.midpoint.model.api.AssignmentObjectRelation; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.component.search.SearchFactory; -import com.evolveum.midpoint.web.component.search.SearchItemDefinition; -import com.evolveum.midpoint.web.session.UserProfileStorage; -import com.evolveum.midpoint.web.session.UserProfileStorage.TableId; - -/** - * Created by honchar. - * @author katkav - */ -public class PolicyRulesPanel extends AssignmentPanel { - - private static final long serialVersionUID = 1L; - - private static final Trace LOGGER = TraceManager.getTrace(PolicyRulesPanel.class); - - public PolicyRulesPanel(String id, IModel> assignmentContainerWrapperModel){ - super(id, assignmentContainerWrapperModel); - - } - - protected List, String>> initColumns() { - List, String>> columns = new ArrayList<>(); - - - columns.add(new PrismContainerWrapperColumn(getModel(), ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_POLICY_CONSTRAINTS), getPageBase())); - - columns.add(new PrismPropertyWrapperColumn(getModel(), ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_POLICY_SITUATION), ColumnType.STRING, getPageBase())); - - columns.add(new PrismContainerWrapperColumn(getModel(), ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_POLICY_ACTIONS), getPageBase())); - - columns.add(new PrismPropertyWrapperColumn(getModel(), AssignmentType.F_ORDER, ColumnType.STRING, getPageBase())); - - return columns; - } - - @Override - protected void initCustomPaging() { - getAssignmentsTabStorage().setPaging(getPrismContext().queryFactory() - .createPaging(0, ((int) getParentPage().getItemsPerPage(UserProfileStorage.TableId.POLICY_RULES_TAB_TABLE)))); - - } - - @Override - protected TableId getTableId() { - return UserProfileStorage.TableId.POLICY_RULES_TAB_TABLE; - } - - @Override - protected void newAssignmentClickPerformed(AjaxRequestTarget target, AssignmentObjectRelation assignmentTargetRelation) { - PrismContainerValue newAssignment = getModelObject().getItem().createNewValue(); - AssignmentType assignmentType = newAssignment.asContainerable(); - try { - newAssignment.findOrCreateContainer(AssignmentType.F_POLICY_RULE); - assignmentType.setPolicyRule(new PolicyRuleType()); - } catch (SchemaException e) { - LOGGER.error("Cannot create policy rule assignment: {}", e.getMessage(), e); - getSession().error("Cannot create policyRule assignment."); - target.add(getPageBase().getFeedbackPanel()); - return; - } - PrismContainerValueWrapper newAssignmentWrapper = getMultivalueContainerListPanel().createNewItemContainerValueWrapper(newAssignment, getModelObject(), target); - getMultivalueContainerListPanel().itemDetailsPerformed(target, Arrays.asList(newAssignmentWrapper)); - } - - @Override - protected ObjectQuery createObjectQuery() { - return getParentPage().getPrismContext().queryFor(AssignmentType.class) - .exists(AssignmentType.F_POLICY_RULE) - .build(); - } - - @Override - protected List createSearchableItems(PrismContainerDefinition containerDef) { - List defs = new ArrayList<>(); - - SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS), defs); - SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_ACTIVATION, ActivationType.F_EFFECTIVE_STATUS), defs); - SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_NAME), defs); - SearchFactory.addSearchRefDef(containerDef, - ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_POLICY_CONSTRAINTS, - PolicyConstraintsType.F_EXCLUSION, ExclusionPolicyConstraintType.F_TARGET_REF), defs, AreaCategoryType.POLICY, getPageBase()); - - defs.addAll(SearchFactory.createExtensionDefinitionList(containerDef)); - - return defs; - } - - @Override - protected ItemVisibility getTypedContainerVisibility(ItemWrapper wrapper) { - if (QNameUtil.match(ConstructionType.COMPLEX_TYPE, wrapper.getTypeName())){ - return ItemVisibility.HIDDEN; - } - - if (QNameUtil.match(PersonaConstructionType.COMPLEX_TYPE, wrapper.getTypeName())){ - return ItemVisibility.HIDDEN; - } - - if (QNameUtil.match(AssignmentType.F_ORG_REF, wrapper.getItemName())){ - return ItemVisibility.HIDDEN; - } - - if (QNameUtil.match(AssignmentType.F_TARGET_REF, wrapper.getItemName())){ - return ItemVisibility.HIDDEN; - } - - if (QNameUtil.match(AssignmentType.F_TENANT_REF, wrapper.getItemName())){ - return ItemVisibility.HIDDEN; - } - return ItemVisibility.AUTO; - } -} +/* + * Copyright (c) 2018 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.component.assignment; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import com.evolveum.midpoint.gui.api.prism.ItemWrapper; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.web.component.prism.ItemVisibility; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.model.IModel; + +import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; +import com.evolveum.midpoint.gui.impl.component.data.column.AbstractItemWrapperColumn.ColumnType; +import com.evolveum.midpoint.gui.impl.component.data.column.PrismContainerWrapperColumn; +import com.evolveum.midpoint.gui.impl.component.data.column.PrismPropertyWrapperColumn; +import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; +import com.evolveum.midpoint.model.api.AssignmentObjectRelation; +import com.evolveum.midpoint.prism.PrismContainerDefinition; +import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.component.search.SearchFactory; +import com.evolveum.midpoint.web.component.search.SearchItemDefinition; +import com.evolveum.midpoint.web.session.UserProfileStorage; +import com.evolveum.midpoint.web.session.UserProfileStorage.TableId; + +/** + * Created by honchar. + * @author katkav + */ +public class PolicyRulesPanel extends AssignmentPanel { + + private static final long serialVersionUID = 1L; + + private static final Trace LOGGER = TraceManager.getTrace(PolicyRulesPanel.class); + + public PolicyRulesPanel(String id, IModel> assignmentContainerWrapperModel){ + super(id, assignmentContainerWrapperModel); + + } + + protected List, String>> initColumns() { + List, String>> columns = new ArrayList<>(); + + + columns.add(new PrismContainerWrapperColumn<>(getModel(), ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_POLICY_CONSTRAINTS), getPageBase())); + + columns.add(new PrismPropertyWrapperColumn<>(getModel(), ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_POLICY_SITUATION), ColumnType.STRING, getPageBase())); + + columns.add(new PrismContainerWrapperColumn<>(getModel(), ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_POLICY_ACTIONS), getPageBase())); + + columns.add(new PrismPropertyWrapperColumn<>(getModel(), AssignmentType.F_ORDER, ColumnType.STRING, getPageBase())); + + return columns; + } + + @Override + protected void initCustomPaging() { + getAssignmentsTabStorage().setPaging(getPrismContext().queryFactory() + .createPaging(0, ((int) getParentPage().getItemsPerPage(UserProfileStorage.TableId.POLICY_RULES_TAB_TABLE)))); + + } + + @Override + protected TableId getTableId() { + return UserProfileStorage.TableId.POLICY_RULES_TAB_TABLE; + } + + @Override + protected void newAssignmentClickPerformed(AjaxRequestTarget target, AssignmentObjectRelation assignmentTargetRelation) { + PrismContainerValue newAssignment = getModelObject().getItem().createNewValue(); + AssignmentType assignmentType = newAssignment.asContainerable(); + try { + newAssignment.findOrCreateContainer(AssignmentType.F_POLICY_RULE); + assignmentType.setPolicyRule(new PolicyRuleType()); + } catch (SchemaException e) { + LOGGER.error("Cannot create policy rule assignment: {}", e.getMessage(), e); + getSession().error("Cannot create policyRule assignment."); + target.add(getPageBase().getFeedbackPanel()); + return; + } + PrismContainerValueWrapper newAssignmentWrapper = getMultivalueContainerListPanel().createNewItemContainerValueWrapper(newAssignment, getModelObject(), target); + getMultivalueContainerListPanel().itemDetailsPerformed(target, Collections.singletonList(newAssignmentWrapper)); + } + + @Override + protected ObjectQuery createObjectQuery() { + return getParentPage().getPrismContext().queryFor(AssignmentType.class) + .exists(AssignmentType.F_POLICY_RULE) + .build(); + } + + @Override + protected List createSearchableItems(PrismContainerDefinition containerDef) { + List defs = new ArrayList<>(); + + SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS), defs); + SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_ACTIVATION, ActivationType.F_EFFECTIVE_STATUS), defs); + SearchFactory.addSearchPropertyDef(containerDef, ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_NAME), defs); + SearchFactory.addSearchRefDef(containerDef, + ItemPath.create(AssignmentType.F_POLICY_RULE, PolicyRuleType.F_POLICY_CONSTRAINTS, + PolicyConstraintsType.F_EXCLUSION, ExclusionPolicyConstraintType.F_TARGET_REF), defs, AreaCategoryType.POLICY, getPageBase()); + + defs.addAll(SearchFactory.createExtensionDefinitionList(containerDef)); + + return defs; + } + + @Override + protected ItemVisibility getTypedContainerVisibility(ItemWrapper wrapper) { + if (QNameUtil.match(ConstructionType.COMPLEX_TYPE, wrapper.getTypeName())){ + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(PersonaConstructionType.COMPLEX_TYPE, wrapper.getTypeName())){ + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(AssignmentType.F_ORG_REF, wrapper.getItemName())){ + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(AssignmentType.F_TARGET_REF, wrapper.getItemName())){ + return ItemVisibility.HIDDEN; + } + + if (QNameUtil.match(AssignmentType.F_TENANT_REF, wrapper.getItemName())){ + return ItemVisibility.HIDDEN; + } + return ItemVisibility.AUTO; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SwitchAssignmentTypePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SwitchAssignmentTypePanel.java index 33c88a7c98c..12f9ac7102e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SwitchAssignmentTypePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SwitchAssignmentTypePanel.java @@ -376,65 +376,22 @@ protected void cancelAssignmentDetailsPerformed(AjaxRequestTarget target) { @Override public void onClick(AjaxRequestTarget target) { - AssignmentPanel assignmentPanel = - new AssignmentPanel(ID_ASSIGNMENTS, SwitchAssignmentTypePanel.this.getModel()) { - private static final long serialVersionUID = 1L; - - //TODO may be we will need FocusMappingsAssignmentsPanel later - @Override - protected List, String>> initBasicColumns() { - List, String>> columns = new ArrayList<>(); - - columns.add(new IconColumn>(Model.of("")) { - - private static final long serialVersionUID = 1L; - - @Override - protected DisplayType getIconDisplayType(IModel> rowModel) { - return WebComponentUtil.createDisplayType(WebComponentUtil.createDefaultBlackIcon( - AssignmentsUtil.getTargetType(rowModel.getObject().getRealValue()))); - } - - }); - - columns.add(new AbstractColumn, String>(createStringResource("PolicyRulesPanel.nameColumn")){ - private static final long serialVersionUID = 1L; - - @Override - public void populateItem(Item>> cellItem, - String componentId, final IModel> rowModel) { - String name = AssignmentsUtil.getName(rowModel.getObject(), getParentPage()); - if (StringUtils.isBlank(name)) { - name = createStringResource("AssignmentPanel.noName").getString(); - } - cellItem.add(new Label(componentId, Model.of(name))); - } - }); - return columns; - } - - @Override - protected ObjectQuery createObjectQuery(){ - ObjectQuery query = super.createObjectQuery(); - ObjectQuery focusMappingsQuery = SwitchAssignmentTypePanel.this.getPageBase().getPrismContext() - .queryFor(AssignmentType.class) - .exists(AssignmentType.F_FOCUS_MAPPINGS) - .build(); - query.addFilter(focusMappingsQuery.getFilter()); - return query; - } - - @Override - protected boolean isNewObjectButtonVisible(PrismObject focusObject){ - return false; - } + FocusMappingsAssignmentPanel assignmentPanel = new FocusMappingsAssignmentPanel(ID_ASSIGNMENTS, SwitchAssignmentTypePanel.this.getModel()) { + @Override + protected void assignmentDetailsPerformed(AjaxRequestTarget target) { + target.add(SwitchAssignmentTypePanel.this); + } - @Override - protected QName getAssignmentType() { - return AssignmentType.F_FOCUS_MAPPINGS; - } + @Override + protected void cancelAssignmentDetailsPerformed(AjaxRequestTarget target) { + target.add(SwitchAssignmentTypePanel.this); + } - }; + @Override + protected boolean isNewObjectButtonVisible(PrismObject focusObject){ + return false; + } + }; assignmentPanel.setOutputMarkupId(true); switchAssignmentTypePerformed(target, assignmentPanel, ID_FOCUS_MAPPING_ASSIGNMENTS); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java index ff956a31e0c..4faec67f84a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java @@ -64,7 +64,8 @@ protected void onInitialize(){ } private void initLayout() { - CaseWorkItemsPanel workItemsPanel = new CaseWorkItemsPanel(ID_CASE_WORK_ITEMS_TABLE, CaseWorkItemsPanel.View.FULL_LIST) { + CaseWorkItemsPanel workItemsPanel = new CaseWorkItemsPanel(ID_CASE_WORK_ITEMS_TABLE, CaseWorkItemsPanel.View.FULL_LIST, + pageParameters) { private static final long serialVersionUID = 1L; @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/WorkItemPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/WorkItemPanel.html deleted file mode 100644 index 0f4765efa54..00000000000 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/WorkItemPanel.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -
-
-
-
-

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- -
- -
-
- -
-
-

-
-
-
-
-
- -
- -
-
-

-
-
-
-
-
- -
-
-

-
-
-
-
-
- -
-
- -
-
-

-
-
-
-
-
- -

- - -

- - -
-
-

-
-
-
-
-
- - -

- -

- - - diff --git a/infra/prism-api/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java b/infra/prism-api/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java index 44ab534ed38..829362e2670 100644 --- a/infra/prism-api/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java +++ b/infra/prism-api/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java @@ -265,10 +265,16 @@ public PrismValue getAlreadyParsedValue() { public T getParsedRealValue(@NotNull Class clazz) throws SchemaException { if (parsed != null) { - if (clazz.isAssignableFrom(parsed.getRealValue().getClass())) { - return (T) parsed.getRealValue(); + Object realValue = parsed.getRealValue(); + if (realValue != null) { + if (clazz.isAssignableFrom(realValue.getClass())) { + //noinspection unchecked + return (T) realValue; + } else { + throw new IllegalArgumentException("Parsed value ("+realValue.getClass()+") is not assignable to "+clazz); + } } else { - throw new IllegalArgumentException("Parsed value ("+parsed.getClass()+") is not assignable to "+clazz); + return null; // strange but possible } } else if (xnode != null) { return prismContext.parserFor(xnode.toRootXNode()).parseRealValue(clazz); diff --git a/infra/prism-impl/pom.xml b/infra/prism-impl/pom.xml index a95723298bc..92482efd0f2 100644 --- a/infra/prism-impl/pom.xml +++ b/infra/prism-impl/pom.xml @@ -48,14 +48,8 @@ jaxb-xjc - org.apache.cxf - cxf-rt-wsdl - - - javax.xml.stream - stax-api - - + org.glassfish.jaxb + jaxb-runtime commons-lang diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/schema/SchemaDescriptionParser.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/schema/SchemaDescriptionParser.java index ebdbd8a070a..02cb1858576 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/schema/SchemaDescriptionParser.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/schema/SchemaDescriptionParser.java @@ -13,7 +13,7 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import org.apache.cxf.wsdl.WSDLConstants; + import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -29,6 +29,12 @@ class SchemaDescriptionParser { private static final Trace LOGGER = TraceManager.getTrace(SchemaDescription.class); + public static final String NS_WSDL11 = "http://schemas.xmlsoap.org/wsdl/"; + + public static final QName QNAME_DEFINITIONS = new QName(NS_WSDL11, "definitions"); + + public static final QName QNAME_TYPES = new QName(NS_WSDL11, "types"); + static SchemaDescriptionImpl parseResource(String resourcePath) throws SchemaException { SchemaDescriptionImpl desc = new SchemaDescriptionImpl("system resource " + resourcePath, resourcePath); desc.setStreamable(() -> { @@ -57,8 +63,8 @@ static List parseWsdlResource(String resourcePath) throws } Element rootElement = node instanceof Element ? (Element) node : DOMUtil.getFirstChildElement(node); QName rootElementQName = DOMUtil.getQName(rootElement); - if (WSDLConstants.QNAME_DEFINITIONS.equals(rootElementQName)) { - Element types = DOMUtil.getChildElement(rootElement, WSDLConstants.QNAME_TYPES); + if (QNAME_DEFINITIONS.equals(rootElementQName)) { + Element types = DOMUtil.getChildElement(rootElement, QNAME_TYPES); if (types == null) { LOGGER.warn("No section in WSDL document in system resource " + resourcePath); return schemaDescriptions; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java index ab98af98097..9c91af6cf58 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java @@ -10,6 +10,8 @@ import static com.evolveum.midpoint.schema.SelectorOptions.createCollection; import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.createObjectRef; import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionStatusType.RUNNABLE; + +import static java.util.Collections.emptyList; import static java.util.Collections.singleton; import java.util.ArrayList; @@ -41,6 +43,7 @@ import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.security.core.Authentication; import org.springframework.stereotype.Component; import com.evolveum.midpoint.common.ActivationComputer; @@ -200,9 +203,6 @@ public class ModelInteractionServiceImpl implements ModelInteractionService { private static final String OPERATION_VALIDATE_VALUE = ModelInteractionService.class.getName() + ".validateValue"; private static final String OPERATION_DETERMINE_VIRTUAL_CONTAINERS = ModelInteractionService.class.getName() + ".determineVirtualContainers"; - /* (non-Javadoc) - * @see com.evolveum.midpoint.model.api.ModelInteractionService#previewChanges(com.evolveum.midpoint.prism.delta.ObjectDelta, com.evolveum.midpoint.schema.result.OperationResult) - */ @Override public ModelContext previewChanges( Collection> deltas, ModelExecuteOptions options, Task task, OperationResult parentResult) @@ -216,20 +216,13 @@ public ModelContext previewChanges( Collection listeners, OperationResult parentResult) throws SchemaException, PolicyViolationException, ExpressionEvaluationException, ObjectNotFoundException, ObjectAlreadyExistsException, CommunicationException, ConfigurationException, SecurityViolationException { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Preview changes input:\n{}", DebugUtil.debugDump(deltas)); - } - int size = 0; - if (deltas != null) { - size = deltas.size(); - } - Collection> clonedDeltas = new ArrayList<>(size); - if (deltas != null) { - for (ObjectDelta delta : deltas){ - clonedDeltas.add(delta.clone()); - } + if (ModelExecuteOptions.isRaw(options)) { + throw new UnsupportedOperationException("previewChanges is not supported in raw mode"); } + LOGGER.debug("Preview changes input:\n{}", DebugUtil.debugDumpLazily(deltas)); + Collection> clonedDeltas = cloneDeltas(deltas); + OperationResult result = parentResult.createSubresult(PREVIEW_CHANGES); LensContext context = null; @@ -250,6 +243,20 @@ public ModelContext previewChanges( return context; } + @NotNull + private Collection> cloneDeltas(Collection> deltas) { + Collection> clonedDeltas; + if (deltas != null) { + clonedDeltas = new ArrayList<>(deltas.size()); + for (ObjectDelta delta : deltas) { + clonedDeltas.add(delta.clone()); + } + return clonedDeltas; + } else { + return emptyList(); + } + } + @Override public ModelContext unwrapModelContext(LensContextType wrappedContext, Task task, OperationResult result) throws SchemaException, ConfigurationException, ObjectNotFoundException, CommunicationException, ExpressionEvaluationException { return LensContext.fromLensContextType(wrappedContext, prismContext, provisioning, task, result); @@ -1505,8 +1512,14 @@ public MidPointPrincipal assumePowerOfAttorney(PrismObject donor, Task MidPointPrincipal donorPrincipal = securityEnforcer.createDonorPrincipal(attorneyPrincipal, ModelAuthorizationAction.ATTORNEY.getUrl(), donor, task, result); // TODO: audit switch - - securityContextManager.setupPreAuthenticatedSecurityContext(donorPrincipal); + Authentication authentication = securityContextManager.getAuthentication(); + if (authentication instanceof MidpointAuthentication) { + ((MidpointAuthentication) authentication).setPrincipal(donorPrincipal); + ((MidpointAuthentication) authentication).setCredential(null); + ((MidpointAuthentication) authentication).setAuthorities(donorPrincipal.getAuthorities()); + } else { + securityContextManager.setupPreAuthenticatedSecurityContext(donorPrincipal); + } return donorPrincipal; } @@ -1525,7 +1538,14 @@ public MidPointPrincipal dropPowerOfAttorney(Task task, OperationResult result) // TODO: audit switch // TODO: maybe refresh previous principal using userProfileService? - securityContextManager.setupPreAuthenticatedSecurityContext(previousPrincipal); + Authentication authentication = securityContextManager.getAuthentication(); + if (authentication instanceof MidpointAuthentication) { + ((MidpointAuthentication) authentication).setPrincipal(previousPrincipal); + ((MidpointAuthentication) authentication).setCredential(null); + ((MidpointAuthentication) authentication).setAuthorities(previousPrincipal.getAuthorities()); + } else { + securityContextManager.setupPreAuthenticatedSecurityContext(previousPrincipal); + } return previousPrincipal; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java index 3ee803bfe3f..3c135b35322 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ChangeExecutor.java @@ -23,6 +23,8 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.model.api.context.SynchronizationIntent; +import com.evolveum.midpoint.wf.api.WorkflowManager; + import org.apache.commons.lang.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -99,7 +101,8 @@ public class ChangeExecutor { private static final String OPERATION_UNLINK_ACCOUNT = ChangeExecutor.class.getName() + ".unlinkShadow"; private static final String OPERATION_UPDATE_SITUATION_IN_SHADOW = ChangeExecutor.class.getName() + ".updateSituationInShadow"; - @Autowired private transient TaskManager taskManager; + @Autowired private TaskManager taskManager; + @Autowired private WorkflowManager workflowManager; @Autowired @Qualifier("cacheRepositoryService") private transient RepositoryService cacheRepositoryService; @Autowired private ProvisioningService provisioning; @Autowired private PrismContext prismContext; @@ -1417,6 +1420,8 @@ private PrismObject executeDelet taskManager.deleteTask(oid, result); } else if (NodeType.class.isAssignableFrom(objectTypeClass)) { taskManager.deleteNode(oid, result); + } else if (CaseType.class.isAssignableFrom(objectTypeClass)) { + workflowManager.deleteCase(oid, task, result); } else if (ObjectTypes.isClassManagedByProvisioning(objectTypeClass)) { ProvisioningOperationOptions provisioningOptions = getProvisioningOptions(context, options, (PrismObject) objectContext.getObjectCurrent(), (ObjectDelta) change); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java index 896ef8a471f..8a7bd222731 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/AssignExecutor.java @@ -37,7 +37,7 @@ protected ObjectDelta createDelta(AssignmentHolderType obj Collection roles, Collection relationSpecifications) throws SchemaException { QName relationSpecification = MiscUtil.extractSingleton(relationSpecifications, - () -> new IllegalArgumentException("Couldn't use 'relation' as multivalue parameter")); + () -> new IllegalArgumentException("Using 'relation' as a multivalued parameter is not allowed")); if (PrismConstants.Q_ANY.matches(relationSpecification)) { throw new IllegalArgumentException("Using 'q:any' as relation specification is not allowed"); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java index c953495d997..58e56d53e8f 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/scripting/TestScriptingBasic.java @@ -8,6 +8,7 @@ import static java.util.Collections.singleton; import static org.apache.commons.collections4.CollectionUtils.emptyIfNull; +import static org.assertj.core.api.Assertions.assertThat; import static org.testng.AssertJUnit.*; import java.io.File; @@ -18,6 +19,8 @@ import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; +import com.evolveum.midpoint.model.api.ScriptExecutionException; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; @@ -86,6 +89,7 @@ public class TestScriptingBasic extends AbstractInitializedModelIntegrationTest private static final String MODIFY_JACK_PASSWORD_TASK_OID = "9de76345-0f02-48de-86bf-e7a887cb374a"; private static final File RECOMPUTE_JACK_FILE = new File(TEST_DIR, "recompute-jack.xml"); private static final File ASSIGN_TO_JACK_FILE = new File(TEST_DIR, "assign-to-jack.xml"); + private static final File ASSIGN_TO_JACK_DRY_AND_RAW_FILE = new File(TEST_DIR, "assign-to-jack-dry-and-raw.xml"); private static final File ASSIGN_TO_JACK_2_FILE = new File(TEST_DIR, "assign-to-jack-2.xml"); private static final File UNASSIGN_FROM_WILL_FILE = new File(TEST_DIR, "unassign-from-will.xml"); private static final File UNASSIGN_FROM_WILL_2_FILE = new File(TEST_DIR, "unassign-from-will-2.xml"); @@ -505,6 +509,26 @@ public void test360AssignToJack() throws Exception { assertAssignedRole(jack, "12345678-d34d-b33f-f00d-55555555cccc"); } + /** + * MID-6141 + */ + @Test + public void test365AssignToJackDryAndRaw() throws Exception { + given(); + Task task = getTestTask(); + OperationResult result = task.getResult(); + ScriptingExpressionType expression = parseScriptingExpression(ASSIGN_TO_JACK_DRY_AND_RAW_FILE); + + when(); + try { + scriptingExpressionEvaluator.evaluateExpression(expression, task, result); + fail("unexpected success"); + } catch (ScriptExecutionException e) { + displayExpectedException(e); + assertThat(e).hasMessageContaining("previewChanges is not supported in raw mode"); + } + } + @Test public void test370AssignToJackInBackground() throws Exception { // GIVEN diff --git a/model/model-intest/src/test/resources/scripting/assign-to-jack-dry-and-raw.xml b/model/model-intest/src/test/resources/scripting/assign-to-jack-dry-and-raw.xml new file mode 100644 index 00000000000..5a545c394df --- /dev/null +++ b/model/model-intest/src/test/resources/scripting/assign-to-jack-dry-and-raw.xml @@ -0,0 +1,37 @@ + + + + + c:UserType + + + c:name + jack + + + + assign + + role + 12345678-d34d-b33f-f00d-55555555cccc + + + dryRun + true + + + options + + true + + + + diff --git a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WorkflowManager.java b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WorkflowManager.java index 5eea81d20aa..ae9d1825b7e 100644 --- a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WorkflowManager.java +++ b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WorkflowManager.java @@ -22,16 +22,12 @@ /** * TODO specify and clean-up error handling - * - * @author mederly */ - public interface WorkflowManager { //region Work items /** * Approves or rejects a work item - * @param decision true = approve, false = reject */ void completeWorkItem(WorkItemId workItemId, AbstractWorkItemOutputType output, WorkItemEventCauseInformationType causeInformation, Task task, @@ -53,10 +49,21 @@ void delegateWorkItem(WorkItemId workItemId, WorkItemDelegationRequestType deleg //region Process instances (cases) + /** + * Cancels a case and its subcases. Carries out the authorization. + */ void cancelCase(String caseOid, Task task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, ObjectAlreadyExistsException, SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException; + /** + * Cancels and deletes a case and its subcases. Carries out authorization but only for + * subcases. For the root it is expected that this is done by the caller (usually the ChangeExecutor). + */ + void deleteCase(String caseOid, Task task, OperationResult parentResult) + throws SchemaException, ObjectNotFoundException, ObjectAlreadyExistsException, SecurityViolationException, + CommunicationException, ConfigurationException, ExpressionEvaluationException; + //endregion /* @@ -64,7 +71,7 @@ void cancelCase(String caseOid, Task task, OperationResult parentResult) * ==== */ - public boolean isEnabled(); + boolean isEnabled(); // TODO remove this PrismContext getPrismContext(); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/WorkflowManagerImpl.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/WorkflowManagerImpl.java index 89e5bee4092..a98b6d72f9a 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/WorkflowManagerImpl.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/WorkflowManagerImpl.java @@ -107,6 +107,14 @@ public void cancelCase(String caseOid, Task task, OperationResult parentResult) CommunicationException, ConfigurationException, ExpressionEvaluationException { caseManager.cancelCase(caseOid, task, parentResult); } + + @Override + public void deleteCase(String caseOid, Task task, OperationResult parentResult) + throws SchemaException, ObjectNotFoundException, ObjectAlreadyExistsException, SecurityViolationException, + CommunicationException, ConfigurationException, ExpressionEvaluationException { + caseManager.deleteCase(caseOid, task, parentResult); + } + //endregion /* diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/access/CaseManager.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/access/CaseManager.java index 3830b4b8a6c..3e11fbb3fa7 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/access/CaseManager.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/access/CaseManager.java @@ -21,9 +21,12 @@ import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.TreeNode; import com.evolveum.midpoint.util.exception.*; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.wf.api.WorkflowManager; import com.evolveum.midpoint.wf.api.request.CancelCaseRequest; import com.evolveum.midpoint.wf.impl.engine.WorkflowEngine; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AuthorizationPhaseType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType; @@ -38,6 +41,8 @@ @Component("wfCaseManager") public class CaseManager { + private static final Trace LOGGER = TraceManager.getTrace(CaseManager.class); + @Autowired private PrismContext prismContext; @Autowired private WorkflowEngine workflowEngine; @Autowired private SecurityEnforcer securityEnforcer; @@ -48,21 +53,20 @@ public class CaseManager { private static final String DOT_INTERFACE = WorkflowManager.class.getName() + "."; - private static final String OPERATION_STOP_PROCESS_INSTANCE = DOT_INTERFACE + "cancelCase"; - //private static final String OPERATION_DELETE_PROCESS_INSTANCE = DOT_INTERFACE + "deleteProcessInstance"; + private static final String OPERATION_CANCEL_CASE = DOT_INTERFACE + "cancelCase"; + private static final String OPERATION_DELETE_CASE = DOT_INTERFACE + "deleteCase"; public void cancelCase(String caseOid, Task task, OperationResult parentResult) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ConfigurationException, CommunicationException, SecurityViolationException, ExpressionEvaluationException { - OperationResult result = parentResult.createSubresult(OPERATION_STOP_PROCESS_INSTANCE); + OperationResult result = parentResult.createSubresult(OPERATION_CANCEL_CASE); result.addParam("caseOid", caseOid); try { TreeNode caseTree = getCaseTree(caseOid, result); - System.out.println(caseTree.debugDump()); cancelCaseTree(caseTree, task, result); } catch (RuntimeException | SchemaException | ObjectAlreadyExistsException | ObjectNotFoundException | SecurityViolationException | ExpressionEvaluationException | ConfigurationException | CommunicationException e) { - result.recordFatalError("Case couldn't be stopped: " + e.getMessage(), e); + result.recordFatalError("Case couldn't be cancelled: " + e.getMessage(), e); throw e; } finally { result.computeStatusIfUnknown(); @@ -130,19 +134,44 @@ private void addChildren(TreeNode tree, OperationResult result) throws } } - // TODO cleanup and delete cases - -// private void deleteCase(String caseOid, OperationResult parentResult) { -// OperationResult result = parentResult.createSubresult(OPERATION_DELETE_PROCESS_INSTANCE); -// result.addParam("caseOid", caseOid); -// try { -// repositoryService.deleteObject(CaseType.class, ) -// } catch (RuntimeException e) { -// result.recordFatalError("Case couldn't be deleted: " + e.getMessage(), e); -// throw e; -// } finally { -// result.computeStatusIfUnknown(); -// } -// } + public void deleteCase(String caseOid, Task task, OperationResult parentResult) + throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ConfigurationException, + CommunicationException, SecurityViolationException, ExpressionEvaluationException { + OperationResult result = parentResult.createSubresult(OPERATION_DELETE_CASE); + result.addParam("caseOid", caseOid); + try { + TreeNode caseTree = getCaseTree(caseOid, result); + cancelCaseTree(caseTree, task, result); // if this fails, deletion will not be tried + deleteCaseTree(caseTree, true, task, result); + } catch (RuntimeException | SchemaException | ObjectAlreadyExistsException | ObjectNotFoundException | + SecurityViolationException | ExpressionEvaluationException | ConfigurationException | CommunicationException e) { + result.recordFatalError("Case couldn't be cancelled/deleted: " + e.getMessage(), e); + throw e; + } finally { + result.computeStatusIfUnknown(); + } + } + + private void deleteCaseTree(TreeNode caseTree, boolean isRoot, Task task, OperationResult result) + throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, + ConfigurationException, ExpressionEvaluationException { + CaseType aCase = caseTree.getUserObject(); + if (!isRoot) { + securityEnforcer.authorize(ModelAuthorizationAction.DELETE.getUrl(), AuthorizationPhaseType.EXECUTION, + AuthorizationParameters.Builder.buildObjectDelete(aCase.asPrismObject()), null, task, result); + } + for (TreeNode child : caseTree.getChildren()) { + deleteCaseTree(child, false, task, result); + } + String caseOid = aCase.getOid(); + try { + repositoryService.deleteObject(CaseType.class, caseOid, result); + } catch (ObjectNotFoundException e) { + LOGGER.warn("Case {} has been already deleted", caseOid); + // no auditing needed + } catch (Throwable t) { + throw t; + } + } } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java index 0b50456aea4..49a0d5d4616 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java @@ -176,7 +176,6 @@ protected void removeAllAssignments(String oid, OperationResult result) throws E protected CaseWorkItemType getWorkItem(Task task, OperationResult result) throws SchemaException, SecurityViolationException, ConfigurationException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException { - //Collection> options = GetOperationOptions.resolveItemsNamed(CaseWorkItemType.F_TASK_REF); SearchResultList itemsAll = modelService.searchContainers(CaseWorkItemType.class, getOpenItemsQuery(), null, task, result); if (itemsAll.size() != 1) { System.out.println("Unexpected # of work items: " + itemsAll.size()); @@ -328,4 +327,33 @@ protected ObjectQuery getOpenItemsQuery() { .item(CaseWorkItemType.F_CLOSE_TIMESTAMP).isNull() .build(); } + + public class RelatedCases { + private CaseType approvalCase; + private CaseType requestCase; + + public CaseType getApprovalCase() { + return approvalCase; + } + + public CaseType getRequestCase() { + return requestCase; + } + + public RelatedCases find(Task task, OperationResult result) throws SchemaException, SecurityViolationException, ConfigurationException, ObjectNotFoundException, + ExpressionEvaluationException, CommunicationException { + CaseWorkItemType workItem = getWorkItem(task, result); + display("Work item", workItem); + approvalCase = getCase(CaseWorkItemUtil.getCaseRequired(workItem).getOid()); + display("Approval case", approvalCase); + assertHasArchetype(approvalCase.asPrismObject(), SystemObjectsType.ARCHETYPE_APPROVAL_CASE.value()); + ObjectReferenceType parentRef = approvalCase.getParentRef(); + assertNotNull(parentRef); + requestCase = modelObjectResolver.resolve(parentRef, CaseType.class, null, null, task, result); + display("Request case", requestCase); + assertNotNull(requestCase); + assertHasArchetype(requestCase.asPrismObject(), SystemObjectsType.ARCHETYPE_OPERATION_REQUEST.value()); + return this; + } + } } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestMiscellaneous.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestMiscellaneous.java index 763460786a7..7b98a4328e3 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestMiscellaneous.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestMiscellaneous.java @@ -34,9 +34,6 @@ import com.evolveum.midpoint.wf.util.ApprovalUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -/** - * @author mederly - */ @ContextConfiguration(locations = { "classpath:ctx-workflow-test-main.xml" }) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) public class TestMiscellaneous extends AbstractWfTestPolicy { @@ -366,4 +363,80 @@ public void test250SkippingApprovals() throws Exception { assertAssignedRole(userJackOid, ROLE_CAPTAIN_OID, result); } + + /** + * MID-6183 + */ + @Test + public void test300DeleteRequestCase() throws Exception { + given(); + + login(userAdministrator); + Task task = getTestTask(); + OperationResult result = getTestOperationResult(); + unassignAllRoles(userJackOid); + + when(); + + // @formatter:off + ObjectDelta delta = + prismContext.deltaFor(UserType.class) + .item(UserType.F_ASSIGNMENT) + .add(ObjectTypeUtil.createAssignmentTo(ROLE_CAPTAIN_OID, ObjectTypes.ROLE, prismContext)) + .asObjectDelta(userJackOid); + // @formatter:on + + executeChanges(delta, null, task, result); + + assertNotAssignedRole(userJackOid, ROLE_CAPTAIN_OID, result); + + RelatedCases relatedCases = new RelatedCases().find(task, result); + CaseType approvalCase = relatedCases.getApprovalCase(); + CaseType requestCase = relatedCases.getRequestCase(); + + deleteObject(CaseType.class, requestCase.getOid(), task, result); + + then(); + + assertObjectDoesntExist(CaseType.class, requestCase.getOid()); + assertObjectDoesntExist(CaseType.class, approvalCase.getOid()); + } + + /** + * MID-6183 + */ + @Test + public void test310DeleteRequestCaseRaw() throws Exception { + given(); + + login(userAdministrator); + Task task = getTestTask(); + OperationResult result = getTestOperationResult(); + unassignAllRoles(userJackOid); + + when(); + + // @formatter:off + ObjectDelta delta = + prismContext.deltaFor(UserType.class) + .item(UserType.F_ASSIGNMENT) + .add(ObjectTypeUtil.createAssignmentTo(ROLE_CAPTAIN_OID, ObjectTypes.ROLE, prismContext)) + .asObjectDelta(userJackOid); + // @formatter:on + + executeChanges(delta, null, task, result); + + assertNotAssignedRole(userJackOid, ROLE_CAPTAIN_OID, result); + + RelatedCases relatedCases = new RelatedCases().find(task, result); + CaseType approvalCase = relatedCases.getApprovalCase(); + CaseType requestCase = relatedCases.getRequestCase(); + + deleteObjectRaw(CaseType.class, requestCase.getOid(), task, result); + + then(); + + assertObjectDoesntExist(CaseType.class, requestCase.getOid()); + assertObjectExists(CaseType.class, approvalCase.getOid()); + } } diff --git a/pom.xml b/pom.xml index 6def157c324..c51883f79a8 100644 --- a/pom.xml +++ b/pom.xml @@ -1556,15 +1556,6 @@ - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - org.apache.maven.plugins maven-source-plugin diff --git a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AboutPageTest.java b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AboutPageTest.java index 82cecdf5a9f..d64e359a9b8 100644 --- a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AboutPageTest.java +++ b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AboutPageTest.java @@ -19,7 +19,7 @@ */ public class AboutPageTest extends AbstractSchrodingerTest { - private static final String VERSION_EXPECTED = "4.1-SNAPSHOT"; // Static value, should be changed each version change. + private static final String VERSION_EXPECTED = "4.2-SNAPSHOT"; // Static value, should be changed each version change. private static final String HIBERNATE_DIALECT_EXPECTED = "org.hibernate.dialect.H2Dialect"; private static final String CONNID_VERSION_EXPECTED = "1.5.0.10"; // Static value, should be changed each version change. private static final String REINDEX_REPO_TASK_CATEGORY_EXPECTED = "Utility";