From e26f82085b1847232b050aba2d6b9be2b3a5454f Mon Sep 17 00:00:00 2001 From: kate Date: Wed, 15 Apr 2020 19:10:23 +0200 Subject: [PATCH 1/5] MID-6181 After forwarding approval work item it is not clear to whom it was forwarded to --- .../web/component/wf/DecisionsPanel.java | 4 ++-- .../page/admin/workflow/dto/DecisionDto.java | 21 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/DecisionsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/DecisionsPanel.java index b0eaf420dbd..64bedad806d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/DecisionsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/DecisionsPanel.java @@ -46,8 +46,8 @@ protected void initLayout(UserProfileStorage.TableId tableId, int pageSize) { List> columns = new ArrayList<>(); columns.add(new PropertyColumn<>(createStringResource("DecisionsPanel.user"), DecisionDto.F_USER)); columns.add(new PropertyColumn<>(createStringResource("DecisionsPanel.attorney"), DecisionDto.F_ATTORNEY)); - columns.add(new PropertyColumn<>(createStringResource("DecisionsPanel.originalActor"), DecisionDto.F_ORIGINAL_ACTOR)); columns.add(new PropertyColumn<>(createStringResource("DecisionsPanel.originalAssignee"), DecisionDto.F_ORIGINAL_ASSIGNEE)); + columns.add(new PropertyColumn<>(createStringResource("DecisionsPanel.assigneeChange"), DecisionDto.F_ASSIGNEE_CHANGE)); columns.add(new PropertyColumn<>(createStringResource("DecisionsPanel.stage"), DecisionDto.F_STAGE)); columns.add(createOutcomeColumn()); columns.add(new PropertyColumn<>(createStringResource("DecisionsPanel.comment"), DecisionDto.F_COMMENT)); @@ -84,7 +84,7 @@ public String getCssClass() { private String choose(IModel rowModel, String inProgress, String forwarded, String approved, String rejected) { DecisionDto dto = rowModel.getObject(); - if (StringUtils.isNotEmpty(dto.getOriginalAssignee())){ + if (StringUtils.isNotEmpty(dto.getAssigneeChange())){ return forwarded; } if (dto.getOutcome() == null) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/DecisionDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/DecisionDto.java index da57cc3c36d..568c9fb19e6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/DecisionDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/DecisionDto.java @@ -19,6 +19,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Date; +import java.util.List; /** * @author lazyman @@ -27,7 +28,7 @@ public class DecisionDto extends Selectable { public static final String F_USER = "user"; public static final String F_ATTORNEY = "attorney"; - public static final String F_ORIGINAL_ACTOR = "originalActor"; + public static final String F_ASSIGNEE_CHANGE = "assigneeChange"; public static final String F_ORIGINAL_ASSIGNEE = "originalAssignee"; public static final String F_STAGE = "stage"; public static final String F_OUTCOME = "outcome"; @@ -37,8 +38,8 @@ public class DecisionDto extends Selectable { private String user; private String attorney; - private String originalActor; private String originalAssignee; + private String assigneeChange; private String stage; private Boolean outcome; private String comment; @@ -57,14 +58,14 @@ public String getAttorney() { return attorney; } - public String getOriginalActor() { - return originalActor; - } - public String getOriginalAssignee() { return originalAssignee; } + public String getAssigneeChange() { + return assigneeChange; + } + public String getStage() { return stage; } @@ -115,16 +116,18 @@ public static DecisionDto create(CaseEventType e, @Nullable PageBase pageBase) { rv.escalationLevelNumber = ApprovalContextUtil.getEscalationLevelNumber(completionEvent); if (completionEvent.getOriginalAssigneeRef() != null && pageBase != null) { // TODO optimize repo access - rv.originalActor = WebModelServiceUtils.resolveReferenceName(completionEvent.getOriginalAssigneeRef(), pageBase); + rv.originalAssignee = WebModelServiceUtils.resolveReferenceName(completionEvent.getOriginalAssigneeRef(), pageBase); } return rv; } else if (e instanceof WorkItemDelegationEventType){ WorkItemDelegationEventType event = (WorkItemDelegationEventType) e; - ObjectReferenceType origAssigneeRef = CollectionUtils.isNotEmpty(event.getAssigneeBefore()) ? event.getAssigneeBefore().get(0) : null; if (event.getComment() != null){ rv.comment = event.getComment(); } - rv.originalAssignee = origAssigneeRef != null ? WebModelServiceUtils.resolveReferenceName(origAssigneeRef, pageBase) : null; + + String assigneeBeforeNamesList = WebComponentUtil.getReferencedObjectDisplayNamesAndNames(event.getAssigneeBefore(), false); + String assigneeAfterNamesList = WebComponentUtil.getReferencedObjectDisplayNamesAndNames(event.getDelegatedTo(), false); + rv.assigneeChange = assigneeBeforeNamesList + " -> " + assigneeAfterNamesList; return rv; } else if (e instanceof StageCompletionEventType) { StageCompletionEventType completion = (StageCompletionEventType) e; From 448bfd4b89761de175fc8f8c3585bfcec634a61d Mon Sep 17 00:00:00 2001 From: kate Date: Wed, 15 Apr 2020 19:11:07 +0200 Subject: [PATCH 2/5] View case menu item is added to the left sidebar menu --- .../main/java/com/evolveum/midpoint/gui/api/page/PageBase.java | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index 933c4bc0fc6..5073cf5730b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -1923,6 +1923,7 @@ public String getBubbleLabel() { AuthorizationConstants.AUTZ_UI_CASES_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL)) { addMenuItem(item, "PageWorkItemsClaimable.title", PageWorkItemsClaimable.class); } + createFocusPageViewMenu(item.getItems(), "PageAdmin.menu.top.case.view", PageCase.class); createFocusPageViewMenu(item.getItems(), "PageAdmin.menu.top.caseWorkItems.view", PageCaseWorkItem.class); return item; From ef1902e9e4f52db3228954c11f3acb9cdd2c96cb Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Wed, 15 Apr 2020 21:03:42 +0200 Subject: [PATCH 3/5] fixing MID-6222 - inducement panel NPE, association ref attribute improvements,... --- .../factory/ConstructionWrapperFactory.java | 3 +- .../ResourceAttributeRefPanelFactory.java | 58 +- .../impl/prism/ConstructionValueWrapper.java | 4 +- .../prism/PrismContainerValueWrapperImpl.java | 955 +++++++++--------- .../component/assignment/AssignmentPanel.java | 11 +- 5 files changed, 530 insertions(+), 501 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ConstructionWrapperFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ConstructionWrapperFactory.java index 3cfab3c4e78..b537fedcfbd 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ConstructionWrapperFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ConstructionWrapperFactory.java @@ -51,8 +51,9 @@ public PrismContainerValueWrapper createContainerValueWrapper( PrismObject resource = constructionType.getResourceRef().asReferenceValue().getObject(); if (resource != null) { constructionValueWrapper.setResource(resource); + return constructionValueWrapper; } - return constructionValueWrapper; + } ObjectReferenceType resourceRef = constructionType.getResourceRef(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ResourceAttributeRefPanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ResourceAttributeRefPanelFactory.java index 1e30f3adb83..1c7fcb10209 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ResourceAttributeRefPanelFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ResourceAttributeRefPanelFactory.java @@ -7,6 +7,8 @@ package com.evolveum.midpoint.gui.impl.factory; +import com.evolveum.midpoint.common.refinery.RefinedAssociationDefinition; +import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteQNamePanel; import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel; @@ -28,6 +30,8 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; 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.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; @@ -46,7 +50,7 @@ @Component public class ResourceAttributeRefPanelFactory extends AbstractGuiComponentFactory implements Serializable { - private static final String DOT_CLASS = ResourceAttributeRefPanelFactory.class.getName() + "."; + private static final transient Trace LOGGER = TraceManager.getTrace(ResourceAttributeRefPanelFactory.class); @PostConstruct public void register() { @@ -72,10 +76,22 @@ public Collection loadChoices() { @Override public boolean match(IW wrapper) { - ItemPath assignmetnPath = ItemPath.create(AssignmentHolderType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_ATTRIBUTE, ResourceAttributeDefinitionType.F_REF); - ItemPath inducementPath = ItemPath.create(AbstractRoleType.F_INDUCEMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_ATTRIBUTE, ResourceAttributeDefinitionType.F_REF); + ItemPath wrapperPath = wrapper.getPath().removeIds(); + return isAssignmentAttributeOrAssociation(wrapperPath) || isInducementAttributeOrAssociation(wrapperPath); + } + + private boolean isAssignmentAttributeOrAssociation(ItemPath wrapperPath) { + ItemPath assignmentAttributePath = ItemPath.create(AssignmentHolderType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_ATTRIBUTE, ResourceAttributeDefinitionType.F_REF); + ItemPath assignmetnAssociationPath = ItemPath.create(AssignmentHolderType.F_ASSIGNMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_ASSOCIATION, ResourceAttributeDefinitionType.F_REF); + + return assignmentAttributePath.equivalent(wrapperPath) || assignmetnAssociationPath.equivalent(wrapperPath); + } + + private boolean isInducementAttributeOrAssociation(ItemPath wrapperPath) { + ItemPath inducementAttributePath = ItemPath.create(AbstractRoleType.F_INDUCEMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_ATTRIBUTE, ResourceAttributeDefinitionType.F_REF); + ItemPath inducementAssociationPath = ItemPath.create(AbstractRoleType.F_INDUCEMENT, AssignmentType.F_CONSTRUCTION, ConstructionType.F_ASSOCIATION, ResourceAttributeDefinitionType.F_REF); - return assignmetnPath.equivalent(wrapper.getPath().removeIds()) || inducementPath.equivalent(wrapper.getPath().removeIds()); + return inducementAttributePath.equivalent(wrapperPath) || inducementAssociationPath.equivalent(wrapperPath); } private List getChoicesList(PrismPropertyPanelContext ctx) { @@ -84,28 +100,28 @@ private List getChoicesList(PrismPropertyPanelContext ct PrismPropertyWrapper wrapper = ctx.unwrapWrapperModel(); //attribute/ref if (wrapper == null) { - return new ArrayList<>(); + return Collections.emptyList(); } //attribute value if (wrapper.getParent() == null) { - return new ArrayList<>(); + return Collections.emptyList(); } //attribute ItemWrapper attributeWrapper = wrapper.getParent().getParent(); if (attributeWrapper == null) { - return new ArrayList<>(); + return Collections.emptyList(); } PrismContainerValueWrapper itemWrapper = attributeWrapper.getParent(); if (itemWrapper == null) { - return new ArrayList<>(); + return Collections.emptyList(); } if (!(itemWrapper instanceof ConstructionValueWrapper)) { - return new ArrayList<>(); + return Collections.emptyList(); } ConstructionValueWrapper constructionWrapper = (ConstructionValueWrapper) itemWrapper; @@ -113,19 +129,27 @@ private List getChoicesList(PrismPropertyPanelContext ct try { RefinedResourceSchema schema = constructionWrapper.getResourceSchema(); - ObjectClassComplexTypeDefinition ocd = schema.findObjectClassDefinition(constructionWrapper.getKind(), constructionWrapper.getIntent()); - Collection attrDefs = ocd.getAttributeDefinitions(); + if (schema == null) { + return new ArrayList<>(); + } + RefinedObjectClassDefinition rOcd = schema.getRefinedDefinition(constructionWrapper.getKind(), constructionWrapper.getIntent()); + if (rOcd == null) { + return Collections.emptyList(); + } + + if (ConstructionType.F_ASSOCIATION.equivalent(attributeWrapper.getItemName())) { + Collection associationDefs = rOcd.getAssociationDefinitions(); + return associationDefs.stream().map(association -> association.getName()).collect(Collectors.toList()); + } - List attributes = attrDefs.stream().map(a -> a.getItemName()).collect(Collectors.toList()); - return attributes; + Collection attrDefs = rOcd.getAttributeDefinitions(); + return attrDefs.stream().map(a -> a.getItemName()).collect(Collectors.toList()); } catch (SchemaException e) { - e.printStackTrace(); + LOGGER.warn("Cannot get resource attribute definitions"); } - - return new ArrayList<>(); - + return Collections.emptyList(); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ConstructionValueWrapper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ConstructionValueWrapper.java index 0a4b8648399..80a6f62e865 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ConstructionValueWrapper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ConstructionValueWrapper.java @@ -36,7 +36,9 @@ public void setResource(PrismObject resource) { public RefinedResourceSchema getResourceSchema() throws SchemaException { if (resourceSchema == null) { - resourceSchema = RefinedResourceSchema.getRefinedSchema(resource); + if (resource != null) { + resourceSchema = RefinedResourceSchema.getRefinedSchema(resource); + } } return resourceSchema; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValueWrapperImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValueWrapperImpl.java index 296d9040358..7f5423162d1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValueWrapperImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValueWrapperImpl.java @@ -1,480 +1,475 @@ -/* - * Copyright (c) 2010-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.gui.impl.prism; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import javax.xml.namespace.QName; - -import com.evolveum.midpoint.gui.api.prism.PrismObjectWrapper; -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; - -import com.evolveum.midpoint.gui.api.prism.ItemWrapper; -import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; -import com.evolveum.midpoint.gui.api.util.WebComponentUtil; -import com.evolveum.midpoint.gui.api.util.WebPrismUtil; -import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.path.ItemName; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.QNameUtil; -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.prism.ContainerStatus; -import com.evolveum.midpoint.web.component.prism.ValueStatus; - -/** - * @author katka - * - */ -public class PrismContainerValueWrapperImpl extends PrismValueWrapperImpl> implements PrismContainerValueWrapper { - - private static final long serialVersionUID = 1L; - - private static final Trace LOGGER = TraceManager.getTrace(PrismContainerValueWrapperImpl.class); - - private boolean expanded; - private boolean showMetadata; - private boolean sorted; - private boolean showEmpty; - private boolean readOnly; - private boolean selected; - private boolean heterogenous; - - private List virtualItems; - private List> items = new ArrayList<>(); - - public PrismContainerValueWrapperImpl(PrismContainerWrapper parent, PrismContainerValue pcv, ValueStatus status) { - super(parent, pcv, status); - } - - @Override - public PrismContainerValue getValueToAdd() throws SchemaException { - Collection modifications = new ArrayList<>(); - for (ItemWrapper itemWrapper : items) { - Collection subDelta = itemWrapper.getDelta(); - - if (subDelta != null && !subDelta.isEmpty()) { - modifications.addAll(subDelta); - } - } - - - PrismContainerValue valueToAdd = getOldValue().clone(); - if (!modifications.isEmpty()) { - for (ItemDelta delta : modifications) { - delta.applyTo(valueToAdd); - } - } - - if (!valueToAdd.isEmpty()) { - return valueToAdd; - } - - return null; - } - - @Override - public void applyDelta(ID delta) throws SchemaException { - if (delta == null) { - return; - } - - LOGGER.trace("Applying {} to {}", delta, getNewValue()); - delta.applyTo(getNewValue()); - } - - @Override - public void setRealValue(C realValue) { - LOGGER.info("######$$$$$$Nothing to do"); - } - - @Override - public String getDisplayName() { - if (isVirtual()) { - return getContainerDefinition().getDisplayName(); - } - - if (getParent().isSingleValue()) { - return getParent().getDisplayName(); - } - - if (getParent().isMultiValue() && ValueStatus.ADDED.equals(getStatus())) { - String name; - Class cvalClass = getNewValue().getCompileTimeClass(); - if (cvalClass != null) { - name = cvalClass.getSimpleName() + ".details.newValue"; - } else { - name = "ContainerPanel.containerProperties"; - } - return name; - } - - return WebComponentUtil.getDisplayName(getNewValue()); - } - - @Override - public String getHelpText() { - return WebPrismUtil.getHelpText(getContainerDefinition()); - - - - - - } - - @Override - public boolean isExpanded() { - return expanded; - } - - @Override - public void setExpanded(boolean expanded) { - this.expanded = expanded; - } - - @Override - public boolean hasMetadata() { - for (ItemWrapper container : items) { - if (container.getTypeName().equals(MetadataType.COMPLEX_TYPE)) { - return true; - } - } - - return false; - } - - - @Override - public List> getItems() { - return items; - } - - - @Override - public boolean isShowMetadata() { - return showMetadata; - } - - @Override - public void setShowMetadata(boolean showMetadata) { - this.showMetadata = showMetadata; - } - - @Override - public boolean isSorted() { - return sorted; - } - - @Override - public void setSorted(boolean sorted) { - this.sorted = sorted; - } - - @Override - public boolean isHeterogenous() { - return heterogenous; - } - - @Override - public void setHeterogenous(boolean heterogenous) { - this.heterogenous = heterogenous; - } - - @Override - public List> getChildContainers() throws SchemaException { - List> childContainers = new ArrayList<>(); - for (ItemDefinition def : getContainerDefinition().getDefinitions()) { - if (!(def instanceof PrismContainerDefinition)) { - continue; - } - - ContainerStatus objectStatus = findObjectStatus(); - - boolean allowed = false; - switch (objectStatus) { - case ADDING: - allowed = def.canAdd(); - break; - case MODIFYING: - case DELETING: - allowed = def.canModify(); - } - - //do not allow to add already existing singel value container - if (def.isSingleValue() && findContainer(def.getItemName()) != null) { - allowed = false; - } - - - if (allowed) { - childContainers.add((PrismContainerDefinition)def); - } - } - - return childContainers; - } - - @Override - public List> getContainers() { - List> containers = new ArrayList<>(); - for (ItemWrapper container : items) { - - collectExtensionItems(container, true, containers); - - if (container instanceof PrismContainerWrapper) { - containers.add((PrismContainerWrapper) container); - } - } - return containers; - } - - @Override - public List> getNonContainers() { - List> nonContainers = new ArrayList<>(); - for (ItemWrapper item : items) { - - collectExtensionItems(item, false, nonContainers); - - if (!(item instanceof PrismContainerWrapper)) { - ((List)nonContainers).add(item); - } - } - - if (getVirtualItems() == null) { - return nonContainers; - } - - if (getParent() == null) { - LOGGER.trace("Parent null, skipping virtual items"); - return nonContainers; - } - - PrismObjectWrapper objectWrapper = getParent().findObjectWrapper(); - if (objectWrapper == null) { - LOGGER.trace("No object wrapper found. Skipping virtual items."); - return nonContainers; - } - - for (VirtualContainerItemSpecificationType virtualItem : getVirtualItems()) { - try { - ItemPath virtualItemPath = getVirtualItemPath(virtualItem); - ItemWrapper itemWrapper = objectWrapper.findItem(virtualItemPath, ItemWrapper.class); - if (itemWrapper == null) { - LOGGER.warn("No wrapper found for {}", virtualItemPath); - continue; - } - - if (itemWrapper instanceof PrismContainerWrapper) { - continue; - } - - if (checkContainerInclusion(itemWrapper)) { - ((List)nonContainers).add(itemWrapper); - } - } catch (SchemaException e) { - LOGGER.error("Cannot find wrapper with path {}, error occured {}", virtualItem, e.getMessage(), e); - } - } - return nonContainers; - } - - public boolean checkContainerInclusion(ItemWrapper itemWrapper) { - return true; - } - - private ItemPath getVirtualItemPath(VirtualContainerItemSpecificationType virtualItem) throws SchemaException { - ItemPathType itemPathType = virtualItem.getPath(); - if (itemPathType == null) { - throw new SchemaException("Item path in virtual item definition cannot be null"); - } - - return itemPathType.getItemPath(); - } - - protected > void collectExtensionItems(ItemWrapper item, boolean containers, List itemWrappers) { - if (!ObjectType.F_EXTENSION.equals(item.getItemName())) { - return; - } - - try { - PrismContainerValueWrapper extenstion = (PrismContainerValueWrapper) item.getValue(); - List extensionItems = (List) extenstion.getItems(); - for (IW extensionItem : extensionItems) { - if (extensionItem instanceof PrismContainerWrapper) { - if (containers) { - itemWrappers.add(extensionItem); - } - continue; - } - - if (!containers) { - itemWrappers.add(extensionItem); - } - } - } catch (SchemaException e) { - //in this case we could ignore the error. extension is single value container so this error should not happened - // but just to be sure we won't miss if something strange happened just throw runtime error - LOGGER.error("Something unexpected happened. Please, check your schema"); - throw new IllegalStateException(e.getMessage(), e); - } - - - } - - private PrismContainerDefinition getContainerDefinition() { - return getNewValue().getDefinition(); - } - - private ContainerStatus findObjectStatus() { - return ContainerStatus.ADDING; - } - - - /* (non-Javadoc) - * @see com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper#findContainer(com.evolveum.midpoint.prism.path.ItemPath) - */ - @Override - public PrismContainerWrapper findContainer(ItemPath path) throws SchemaException { - PrismContainerWrapper container = findItem(path, PrismContainerWrapper.class); - return container; - } - - @Override - public IW findItem(ItemPath path, Class type) throws SchemaException { - Object first = path.first(); - if (!ItemPath.isName(first)) { - throw new IllegalArgumentException("Attempt to lookup item using a non-name path "+path+" in "+this); - } - ItemName subName = ItemPath.toName(first); - ItemPath rest = path.rest(); - IW item = findItemByQName(subName); - if (item != null) { - if (rest.isEmpty()) { - if (type.isAssignableFrom(item.getClass())) { - return (IW) item; - } - } else { - // Go deeper - if (item instanceof PrismContainerWrapper) { - return ((PrismContainerWrapper)item).findItem(rest, type); - } - } - } - - return null; - } - - private IW findItemByQName(QName subName) throws SchemaException { - if (items == null) { - return null; - } - IW matching = null; - for (ItemWrapper item : items) { - if (QNameUtil.match(subName, item.getItemName())) { - if (matching != null) { - String containerName = getParent() != null ? DebugUtil.formatElementName(getParent().getItemName()) : ""; - throw new SchemaException("More than one items matching " + subName + " in container " + containerName); - } else { - matching = (IW) item; - } - } - } - return matching; - } - - @Override - public PrismPropertyWrapper findProperty(ItemPath propertyPath) throws SchemaException { - return findItem(propertyPath, PrismPropertyWrapper.class); - } - - @Override - public PrismReferenceWrapper findReference(ItemPath path) throws SchemaException { - return findItem(path, PrismReferenceWrapper.class); - } - - @Override - public ItemPath getPath() { - return getNewValue().getPath(); - } - - @Override - public boolean isSelected() { - return selected; - } - - @Override - public boolean setSelected(boolean selected) { - return this.selected = selected; - } - - - - /* (non-Javadoc) - * @see com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper#hasChanged() - */ - @Override - public boolean hasChanged() { - // TODO Auto-generated method stub - return false; - } - - @Override - public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(super.debugDump(indent)); - sb.append("Items:\n"); - for (ItemWrapper item: items) { - sb.append(item.debugDump(indent + 1)).append("\n"); - } - - return sb.toString(); - } - - - @Override - public boolean isReadOnly() { - return readOnly; - } - - - @Override - public void setReadOnly(boolean readOnly, boolean recursive) { - this.readOnly = readOnly; - } - - - @Override - public boolean isShowEmpty() { - return showEmpty; - } - - - @Override - public void setShowEmpty(boolean showEmpty) { - this.showEmpty = showEmpty; - //computeStripes(); - } - - @Override - public void setVirtualContainerItems(List virtualItems) { - this.virtualItems = virtualItems; - } - - public List getVirtualItems() { - return virtualItems; - } - - @Override - public boolean isVirtual() { - return virtualItems != null; - } -} +/* + * Copyright (c) 2010-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.gui.impl.prism; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.gui.api.prism.PrismObjectWrapper; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; + +import com.evolveum.midpoint.gui.api.prism.ItemWrapper; +import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.gui.api.util.WebPrismUtil; +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.path.ItemName; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.QNameUtil; +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.prism.ContainerStatus; +import com.evolveum.midpoint.web.component.prism.ValueStatus; + +/** + * @author katka + * + */ +public class PrismContainerValueWrapperImpl extends PrismValueWrapperImpl> implements PrismContainerValueWrapper { + + private static final long serialVersionUID = 1L; + + private static final Trace LOGGER = TraceManager.getTrace(PrismContainerValueWrapperImpl.class); + + private boolean expanded; + private boolean showMetadata; + private boolean sorted; + private boolean showEmpty; + private boolean readOnly; + private boolean selected; + private boolean heterogenous; + + private List virtualItems; + private List> items = new ArrayList<>(); + + public PrismContainerValueWrapperImpl(PrismContainerWrapper parent, PrismContainerValue pcv, ValueStatus status) { + super(parent, pcv, status); + } + + @Override + public PrismContainerValue getValueToAdd() throws SchemaException { + Collection modifications = new ArrayList<>(); + for (ItemWrapper itemWrapper : items) { + Collection subDelta = itemWrapper.getDelta(); + + if (subDelta != null && !subDelta.isEmpty()) { + modifications.addAll(subDelta); + } + } + + + PrismContainerValue valueToAdd = getOldValue().clone(); + if (!modifications.isEmpty()) { + for (ItemDelta delta : modifications) { + delta.applyTo(valueToAdd); + } + } + + if (!valueToAdd.isEmpty()) { + return valueToAdd; + } + + return null; + } + + @Override + public void applyDelta(ID delta) throws SchemaException { + if (delta == null) { + return; + } + + LOGGER.trace("Applying {} to {}", delta, getNewValue()); + delta.applyTo(getNewValue()); + } + + @Override + public void setRealValue(C realValue) { + LOGGER.info("######$$$$$$Nothing to do"); + } + + @Override + public String getDisplayName() { + if (isVirtual()) { + return getContainerDefinition().getDisplayName(); + } + + if (getParent().isSingleValue()) { + return getParent().getDisplayName(); + } + + if (getParent().isMultiValue() && ValueStatus.ADDED.equals(getStatus())) { + String name; + Class cvalClass = getNewValue().getCompileTimeClass(); + if (cvalClass != null) { + name = cvalClass.getSimpleName() + ".details.newValue"; + } else { + name = "ContainerPanel.containerProperties"; + } + return name; + } + + return WebComponentUtil.getDisplayName(getNewValue()); + } + + @Override + public String getHelpText() { + return WebPrismUtil.getHelpText(getContainerDefinition()); + } + + @Override + public boolean isExpanded() { + return expanded; + } + + @Override + public void setExpanded(boolean expanded) { + this.expanded = expanded; + } + + @Override + public boolean hasMetadata() { + for (ItemWrapper container : items) { + if (container.getTypeName().equals(MetadataType.COMPLEX_TYPE)) { + return true; + } + } + + return false; + } + + + @Override + public List> getItems() { + return items; + } + + + @Override + public boolean isShowMetadata() { + return showMetadata; + } + + @Override + public void setShowMetadata(boolean showMetadata) { + this.showMetadata = showMetadata; + } + + @Override + public boolean isSorted() { + return sorted; + } + + @Override + public void setSorted(boolean sorted) { + this.sorted = sorted; + } + + @Override + public boolean isHeterogenous() { + return heterogenous; + } + + @Override + public void setHeterogenous(boolean heterogenous) { + this.heterogenous = heterogenous; + } + + @Override + public List> getChildContainers() throws SchemaException { + List> childContainers = new ArrayList<>(); + for (ItemDefinition def : getContainerDefinition().getDefinitions()) { + if (!(def instanceof PrismContainerDefinition)) { + continue; + } + + ContainerStatus objectStatus = findObjectStatus(); + + boolean allowed = false; + switch (objectStatus) { + case ADDING: + allowed = def.canAdd(); + break; + case MODIFYING: + case DELETING: + allowed = def.canModify(); + } + + //do not allow to add already existing singel value container + if (def.isSingleValue() && findContainer(def.getItemName()) != null) { + allowed = false; + } + + + if (allowed) { + childContainers.add((PrismContainerDefinition)def); + } + } + + return childContainers; + } + + @Override + public List> getContainers() { + List> containers = new ArrayList<>(); + for (ItemWrapper container : items) { + + collectExtensionItems(container, true, containers); + + if (container instanceof PrismContainerWrapper) { + containers.add((PrismContainerWrapper) container); + } + } + return containers; + } + + @Override + public List> getNonContainers() { + List> nonContainers = new ArrayList<>(); + for (ItemWrapper item : items) { + + collectExtensionItems(item, false, nonContainers); + + if (!(item instanceof PrismContainerWrapper)) { + ((List)nonContainers).add(item); + } + } + + if (getVirtualItems() == null) { + return nonContainers; + } + + if (getParent() == null) { + LOGGER.trace("Parent null, skipping virtual items"); + return nonContainers; + } + + PrismObjectWrapper objectWrapper = getParent().findObjectWrapper(); + if (objectWrapper == null) { + LOGGER.trace("No object wrapper found. Skipping virtual items."); + return nonContainers; + } + + for (VirtualContainerItemSpecificationType virtualItem : getVirtualItems()) { + try { + ItemPath virtualItemPath = getVirtualItemPath(virtualItem); + ItemWrapper itemWrapper = objectWrapper.findItem(virtualItemPath, ItemWrapper.class); + if (itemWrapper == null) { + LOGGER.warn("No wrapper found for {}", virtualItemPath); + continue; + } + + if (itemWrapper instanceof PrismContainerWrapper) { + continue; + } + + if (checkContainerInclusion(itemWrapper)) { + ((List)nonContainers).add(itemWrapper); + } + } catch (SchemaException e) { + LOGGER.error("Cannot find wrapper with path {}, error occured {}", virtualItem, e.getMessage(), e); + } + } + return nonContainers; + } + + public boolean checkContainerInclusion(ItemWrapper itemWrapper) { + return true; + } + + private ItemPath getVirtualItemPath(VirtualContainerItemSpecificationType virtualItem) throws SchemaException { + ItemPathType itemPathType = virtualItem.getPath(); + if (itemPathType == null) { + throw new SchemaException("Item path in virtual item definition cannot be null"); + } + + return itemPathType.getItemPath(); + } + + protected > void collectExtensionItems(ItemWrapper item, boolean containers, List itemWrappers) { + if (!ObjectType.F_EXTENSION.equals(item.getItemName())) { + return; + } + + try { + PrismContainerValueWrapper extenstion = (PrismContainerValueWrapper) item.getValue(); + List extensionItems = (List) extenstion.getItems(); + for (IW extensionItem : extensionItems) { + if (extensionItem instanceof PrismContainerWrapper) { + if (containers) { + itemWrappers.add(extensionItem); + } + continue; + } + + if (!containers) { + itemWrappers.add(extensionItem); + } + } + } catch (SchemaException e) { + //in this case we could ignore the error. extension is single value container so this error should not happened + // but just to be sure we won't miss if something strange happened just throw runtime error + LOGGER.error("Something unexpected happened. Please, check your schema"); + throw new IllegalStateException(e.getMessage(), e); + } + + + } + + private PrismContainerDefinition getContainerDefinition() { + return getNewValue().getDefinition(); + } + + private ContainerStatus findObjectStatus() { + return ContainerStatus.ADDING; + } + + + /* (non-Javadoc) + * @see com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper#findContainer(com.evolveum.midpoint.prism.path.ItemPath) + */ + @Override + public PrismContainerWrapper findContainer(ItemPath path) throws SchemaException { + PrismContainerWrapper container = findItem(path, PrismContainerWrapper.class); + return container; + } + + @Override + public IW findItem(ItemPath path, Class type) throws SchemaException { + Object first = path.first(); + if (!ItemPath.isName(first)) { + throw new IllegalArgumentException("Attempt to lookup item using a non-name path "+path+" in "+this); + } + ItemName subName = ItemPath.toName(first); + ItemPath rest = path.rest(); + IW item = findItemByQName(subName); + if (item != null) { + if (rest.isEmpty()) { + if (type.isAssignableFrom(item.getClass())) { + return (IW) item; + } + } else { + // Go deeper + if (item instanceof PrismContainerWrapper) { + return ((PrismContainerWrapper)item).findItem(rest, type); + } + } + } + + return null; + } + + private IW findItemByQName(QName subName) throws SchemaException { + if (items == null) { + return null; + } + IW matching = null; + for (ItemWrapper item : items) { + if (QNameUtil.match(subName, item.getItemName())) { + if (matching != null) { + String containerName = getParent() != null ? DebugUtil.formatElementName(getParent().getItemName()) : ""; + throw new SchemaException("More than one items matching " + subName + " in container " + containerName); + } else { + matching = (IW) item; + } + } + } + return matching; + } + + @Override + public PrismPropertyWrapper findProperty(ItemPath propertyPath) throws SchemaException { + return findItem(propertyPath, PrismPropertyWrapper.class); + } + + @Override + public PrismReferenceWrapper findReference(ItemPath path) throws SchemaException { + return findItem(path, PrismReferenceWrapper.class); + } + + @Override + public ItemPath getPath() { + return getNewValue().getPath(); + } + + @Override + public boolean isSelected() { + return selected; + } + + @Override + public boolean setSelected(boolean selected) { + return this.selected = selected; + } + + + + /* (non-Javadoc) + * @see com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper#hasChanged() + */ + @Override + public boolean hasChanged() { + // TODO Auto-generated method stub + return false; + } + + @Override + public String debugDump(int indent) { + StringBuilder sb = new StringBuilder(super.debugDump(indent)); + sb.append("Items:\n"); + for (ItemWrapper item: items) { + sb.append(item.debugDump(indent + 1)).append("\n"); + } + + return sb.toString(); + } + + + @Override + public boolean isReadOnly() { + return readOnly; + } + + + @Override + public void setReadOnly(boolean readOnly, boolean recursive) { + this.readOnly = readOnly; + } + + + @Override + public boolean isShowEmpty() { + return showEmpty; + } + + + @Override + public void setShowEmpty(boolean showEmpty) { + this.showEmpty = showEmpty; + //computeStripes(); + } + + @Override + public void setVirtualContainerItems(List virtualItems) { + this.virtualItems = virtualItems; + } + + public List getVirtualItems() { + return virtualItems; + } + + @Override + public boolean isVirtual() { + return virtualItems != null; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.java index 092d2a4f5e8..428262b55f0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.java @@ -759,8 +759,15 @@ private QName getRelationForDisplayNamePanel(PrismContainerValueWrapper getKindIntentLabelModelForDisplayNamePanel(PrismContainerValueWrapper modelObject) { AssignmentType assignment = modelObject.getRealValue(); if (assignment.getConstruction() != null){ - return createStringResource("DisplayNamePanel.kindIntentLabel", assignment.getConstruction().getKind(), - assignment.getConstruction().getIntent()); + ShadowKindType kind = assignment.getConstruction().getKind(); + if (kind == null) { + kind = ShadowKindType.ACCOUNT; + } + String intent = assignment.getConstruction().getIntent(); + if (StringUtils.isEmpty(intent)) { + intent = "default"; + } + return createStringResource("DisplayNamePanel.kindIntentLabel", kind, intent); } return Model.of(); } From 8da57558f921e6e8e5b9ec06bb1b94d35c49021e Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Wed, 15 Apr 2020 21:04:09 +0200 Subject: [PATCH 4/5] NPE fix for mapping attribute def. --- .../component/VariableBindingDefinitionTypePanel.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 index 0482f55c34c..eb5b2d52c26 100644 --- 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 @@ -6,17 +6,15 @@ */ package com.evolveum.midpoint.gui.impl.component; +import org.apache.wicket.model.IModel; + 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"; @@ -43,6 +41,11 @@ protected void onUpdate(ItemPathDto itemPathDto) { newPathtype = new ItemPathType(newPath); } + VariableBindingDefinitionType var = VariableBindingDefinitionTypePanel.this.getModelObject(); + if (var == null) { + var = new VariableBindingDefinitionType(); + VariableBindingDefinitionTypePanel.this.getModel().setObject(var); + } VariableBindingDefinitionTypePanel.this.getModelObject().setPath(newPathtype); } }; From 87cf8b64dfb6df3fe39562700af4ac508c660ac1 Mon Sep 17 00:00:00 2001 From: kate Date: Thu, 16 Apr 2020 13:34:16 +0200 Subject: [PATCH 5/5] polystring translate fix --- .../evolveum/midpoint/common/LocalizationServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/LocalizationServiceImpl.java b/infra/common/src/main/java/com/evolveum/midpoint/common/LocalizationServiceImpl.java index dd232bbd877..2f6da999421 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/LocalizationServiceImpl.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/LocalizationServiceImpl.java @@ -235,7 +235,10 @@ public String translate(PolyString polyString, Locale locale, boolean allowOrig) } } if (polyString.getTranslation() != null) { - return translate(polyString.getTranslation(), locale); + String value = translate(polyString.getTranslation(), locale); + if (value != null){ + return value; + } } if (allowOrig) { return polyString.getOrig();