diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java index 7cdb145c6d4..53a8e112541 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageContentAccounts.java @@ -558,8 +558,10 @@ private ObjectQuery createQuery() { if (dto.isName()) { List secondaryIdentifiers = new ArrayList<>(); - if (def.getSecondaryIdentifiers() != null) { - secondaryIdentifiers.addAll(def.getSecondaryIdentifiers()); + if (def.getNamingAttribute() != null) { + secondaryIdentifiers.add(def.getNamingAttribute()); + } else if (def.getSecondaryIdentifiers() != null){ + secondaryIdentifiers.addAll(def.getSecondaryIdentifiers()); } for (ResourceAttributeDefinition attrDef : secondaryIdentifiers) { conditions.add(SubstringFilter.createSubstring( diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java index 3bc82d748fa..7945bdedc98 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ShadowUtil.java @@ -67,6 +67,18 @@ public static Collection> getSecondaryIdentifiers(PrismObje return attributesContainer.getSecondaryIdentifiers(); } + public static ResourceAttribute getNamingAttribute(ShadowType shadow){ + return getNamingAttribute(shadow.asPrismObject()); + } + + public static ResourceAttribute getNamingAttribute(PrismObject shadow) { + ResourceAttributeContainer attributesContainer = getAttributesContainer(shadow); + if (attributesContainer == null) { + return null; + } + return attributesContainer.getNamingAttribute(); + } + public static Collection> getAttributes(ShadowType shadowType) { return getAttributes(shadowType.asPrismObject()); } @@ -148,7 +160,7 @@ public static String getSingleStringAttributeValue(ShadowType shadow, QName attr } - private static String getSingleStringAttributeValue(PrismObject shadow, QName attrName) { + public static String getSingleStringAttributeValue(PrismObject shadow, QName attrName) { PrismContainer attributesContainer = shadow.findContainer(ShadowType.F_ATTRIBUTES); if (attributesContainer == null) { return null; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index 4632ce0ffb9..0aeab11ab51 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -445,7 +445,7 @@ public String modifyShadow(PrismObject shadow, ResourceType resource afterModifyOnResource(shadow, modifications, parentResult); - Collection> renameDeltas = distillRenameDeltas(modifications, shadow, objectClassDefinition); + Collection> renameDeltas = distillRenameDeltas(modifications, shadow, objectClassDefinition, task, parentResult); Collection sideEffectDelta = convertToPropertyDelta(sideEffectChanges); if (renameDeltas != null) { @@ -472,7 +472,7 @@ public String modifyShadow(PrismObject shadow, ResourceType resource } private Collection> distillRenameDeltas(Collection modifications, - PrismObject shadow, RefinedObjectClassDefinition objectClassDefinition) throws SchemaException { + PrismObject shadow, RefinedObjectClassDefinition objectClassDefinition, Task task, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { PropertyDelta nameDelta = (PropertyDelta) ItemDelta.findItemDelta(modifications, new ItemPath(ShadowType.F_ATTRIBUTES, ConnectorFactoryIcfImpl.ICFS_NAME), ItemDelta.class); if (nameDelta == null){ return null; @@ -493,8 +493,9 @@ private Collection> distillRenameDeltas(Collection fullShadow = getShadow(shadow.getOid(), shadow, null, task, parentResult); PropertyDelta shadowNameDelta = PropertyDelta.createModificationReplaceProperty(ShadowType.F_NAME, shadow.getDefinition(), - new PolyString(newName)); + ProvisioningUtil.determineShadowName(fullShadow)); deltas.add(shadowNameDelta); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java index 965eb635f92..ba5a463e04c 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.provisioning.util; import com.evolveum.midpoint.common.StaticExpressionUtil; +import com.evolveum.midpoint.common.Utils; import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.prism.*; @@ -129,7 +130,8 @@ public static PolyString determineShadowName(PrismObject< public static String determineShadowStringName(PrismObject shadow) throws SchemaException { ResourceAttributeContainer attributesContainer = ShadowUtil.getAttributesContainer(shadow); - if (attributesContainer.getNamingAttribute() == null) { + ResourceAttribute namingAttribute = attributesContainer.getNamingAttribute(); + if (namingAttribute == null || namingAttribute.isEmpty()) { // No naming attribute defined. Try to fall back to identifiers. Collection> identifiers = attributesContainer.getIdentifiers(); // We can use only single identifiers (not composite) @@ -153,7 +155,20 @@ public static String determineShadowStringName(PrismObjec throw new SchemaException("No naming attribute defined (and identifier not usable)"); } // TODO: Error handling - return attributesContainer.getNamingAttribute().getValue().getValue(); + List> possibleValues = namingAttribute.getValues(); + + if (possibleValues.size() > 1){ + throw new SchemaException("Cannot determine name of shadow. Found more than one value for naming attribute (attr: "+namingAttribute.getElementName()+", values: {}"+possibleValues+")" ); + } + + PrismPropertyValue value = possibleValues.iterator().next(); + + if (value == null){ + throw new SchemaException("Naming attribute has no value. Could not determine shadow name."); + } + + return value.getValue(); +// return attributesContainer.getNamingAttribute().getValue().getValue(); }